From 30254a8e253b50854a4c9df522df9dc19d7b3aa8 Mon Sep 17 00:00:00 2001 From: atompkins Date: Wed, 8 Aug 2018 15:43:49 -0700 Subject: [PATCH 0001/1449] Use npm view to populate info box --- .../src/features/packageJSONContribution.ts | 55 ++++++++++--------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/extensions/npm/src/features/packageJSONContribution.ts b/extensions/npm/src/features/packageJSONContribution.ts index 1576ded6a4d..bc673e80fa8 100644 --- a/extensions/npm/src/features/packageJSONContribution.ts +++ b/extensions/npm/src/features/packageJSONContribution.ts @@ -10,6 +10,7 @@ import { XHRRequest } from 'request-light'; import { Location } from 'jsonc-parser'; import { textToMarkedString } from './markedTextUtil'; +import * as cp from 'child_process'; import * as nls from 'vscode-nls'; const localize = nls.loadMessageBundle(); @@ -281,34 +282,34 @@ export class PackageJSONContribution implements IJSONContribution { } private getInfo(pack: string): Thenable { - - const queryUrl = 'https://registry.npmjs.org/' + encodeURIComponent(pack).replace('%40', '@'); - return this.xhr({ - url: queryUrl, - agent: USER_AGENT - }).then((success) => { - try { - const obj = JSON.parse(success.responseText); - if (obj) { - const result: string[] = []; - if (obj.description) { - result.push(obj.description); - } - const latest = obj && obj['dist-tags'] && obj['dist-tags']['latest']; - if (latest) { - result.push(localize('json.npm.version.hover', 'Latest version: {0}', latest)); - } - if (obj.homepage) { - result.push(obj.homepage); - } - return result; + return new Promise((resolve, reject) => { + const command = 'npm view ' + pack + ' description dist-tags.latest homepage'; + cp.exec(command, (error: object, stdout: string, stderr: string) => { + if (error) { + return resolve([]); } - } catch (e) { - // ignore - } - return []; - }, () => { - return []; + const lines = stdout.split('\n'); + if (lines.length) { + const info: any = {}; + lines.forEach((line) => { + const nameval = line.split(' = '); + if (nameval.length === 2) { + /* tslint:disable:no-unexternalized-strings */ + const fq = nameval[1].indexOf("'"); + const lq = nameval[1].lastIndexOf("'"); + const val = nameval[1].slice(fq + 1, lq).replace("\'", "'"); + /* tslint:enable:no-unexternalized-strings */ + info[nameval[0]] = val; + } + }); + const result: string[] = []; + result.push(info.description || ''); + result.push(info['dist-tags.latest'] ? localize('json.npm.version.hover', 'Latest version: {0}', info['dist-tags.latest']) : ''); + result.push(info.homepage || ''); + return resolve(result); + } + return resolve([]); + }); }); } From 608035ad4951b851bb7a5497c8ab3beb22fd6570 Mon Sep 17 00:00:00 2001 From: Abby Date: Mon, 4 Mar 2019 14:29:38 +0900 Subject: [PATCH 0002/1449] Add an option to allow to open in new window after - git initializing or cloning --- extensions/git/src/commands.ts | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 8344525db3d..69ffef0af67 100755 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Uri, commands, Disposable, window, workspace, QuickPickItem, OutputChannel, Range, WorkspaceEdit, Position, LineChange, SourceControlResourceState, TextDocumentShowOptions, ViewColumn, ProgressLocation, TextEditor, MessageOptions, WorkspaceFolder } from 'vscode'; +import { Uri, commands, Disposable, window, workspace, QuickPickItem, OutputChannel, Range, WorkspaceEdit, Position, LineChange, SourceControlResourceState, TextDocumentShowOptions, ViewColumn, ProgressLocation, TextEditor, MessageOptions, WorkspaceFolder, CommentThreadCollapsibleState } from 'vscode'; import { Git, CommitOptions, Stash, ForcePushMode } from './git'; import { Repository, Resource, ResourceGroupType } from './repository'; import { Model } from './model'; @@ -468,13 +468,15 @@ export class CommandCenter { ); const choices = []; - let message = localize('proposeopen', "Would you like to open the cloned repository?"); - const open = localize('openrepo', "Open Repository"); + let message = localize('proposeopen', "Where would you to open the cloned repository?"); + const open = localize('openrepo', "Current Window"); + const openNewWindow = localize('openreponew', "New Window"); choices.push(open); + choices.push(openNewWindow); const addToWorkspace = localize('add', "Add to Workspace"); if (workspace.workspaceFolders) { - message = localize('proposeopen2', "Would you like to open the cloned repository, or add it to the current workspace?"); + message = localize('proposeopen2', "Where would you like to open the cloned repository, or add it to the current workspace?"); choices.push(addToWorkspace); } @@ -495,6 +497,8 @@ export class CommandCenter { commands.executeCommand('vscode.openFolder', uri); } else if (result === addToWorkspace) { workspace.updateWorkspaceFolders(workspace.workspaceFolders!.length, 0, { uri }); + } else if (result === openNewWindow) { + commands.executeCommand('vscode.openFolder', uri, true); } } catch (err) { if (/already exists and is not an empty directory/.test(err && err.stderr || '')) { @@ -580,9 +584,11 @@ export class CommandCenter { await this.git.init(repositoryPath); const choices = []; - let message = localize('proposeopen init', "Would you like to open the initialized repository?"); - const open = localize('openrepo', "Open Repository"); + let message = localize('proposeopen init', "Where would you like to open the initialized repository?"); + const open = localize('openrepo', "Current Window"); + const openNewWindow = localize('openreponew', "New Window"); choices.push(open); + choices.push(openNewWindow); if (!askToOpen) { return; @@ -590,7 +596,7 @@ export class CommandCenter { const addToWorkspace = localize('add', "Add to Workspace"); if (workspace.workspaceFolders) { - message = localize('proposeopen2 init', "Would you like to open the initialized repository, or add it to the current workspace?"); + message = localize('proposeopen2 init', "Where would you like to open the initialized repository, or add it to the current workspace?"); choices.push(addToWorkspace); } @@ -601,6 +607,8 @@ export class CommandCenter { commands.executeCommand('vscode.openFolder', uri); } else if (result === addToWorkspace) { workspace.updateWorkspaceFolders(workspace.workspaceFolders!.length, 0, { uri }); + } else if (result === openNewWindow) { + commands.executeCommand('vscode.openFolder', uri, true); } else { await this.model.openRepository(repositoryPath); } From 455cdf3955614cfdde2a652bc867282bdeba7a7f Mon Sep 17 00:00:00 2001 From: Abby Date: Mon, 4 Mar 2019 14:50:27 +0900 Subject: [PATCH 0003/1449] remove unused dependency (to fix CI) --- extensions/git/src/commands.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 69ffef0af67..e93d41ccc73 100755 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Uri, commands, Disposable, window, workspace, QuickPickItem, OutputChannel, Range, WorkspaceEdit, Position, LineChange, SourceControlResourceState, TextDocumentShowOptions, ViewColumn, ProgressLocation, TextEditor, MessageOptions, WorkspaceFolder, CommentThreadCollapsibleState } from 'vscode'; +import { Uri, commands, Disposable, window, workspace, QuickPickItem, OutputChannel, Range, WorkspaceEdit, Position, LineChange, SourceControlResourceState, TextDocumentShowOptions, ViewColumn, ProgressLocation, TextEditor, MessageOptions, WorkspaceFolder } from 'vscode'; import { Git, CommitOptions, Stash, ForcePushMode } from './git'; import { Repository, Resource, ResourceGroupType } from './repository'; import { Model } from './model'; From ce9076ffcd767147271ec69d220d855c7ddcaf16 Mon Sep 17 00:00:00 2001 From: khoitd1997 Date: Sat, 13 Apr 2019 23:24:16 -0700 Subject: [PATCH 0004/1449] fix #45346 --- .../contrib/terminal/browser/terminalTab.ts | 91 ++++++++++--------- 1 file changed, 48 insertions(+), 43 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalTab.ts b/src/vs/workbench/contrib/terminal/browser/terminalTab.ts index a1feac0545c..f1f4aea08f0 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalTab.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalTab.ts @@ -9,7 +9,7 @@ import { IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { Event, Emitter } from 'vs/base/common/event'; import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; import { SplitView, Orientation, IView, Sizing } from 'vs/base/browser/ui/splitview/splitview'; -import { IWorkbenchLayoutService, Position } from 'vs/workbench/services/layout/browser/layoutService'; +import { IWorkbenchLayoutService, Parts, Position } from 'vs/workbench/services/layout/browser/layoutService'; const SPLIT_PANE_MIN_SIZE = 120; const TERMINAL_MIN_USEFUL_SIZE = 250; @@ -27,7 +27,8 @@ class SplitPaneContainer { constructor( private _container: HTMLElement, - public orientation: Orientation + public orientation: Orientation, + @IWorkbenchLayoutService private readonly _layoutService: IWorkbenchLayoutService ) { this._width = this._container.offsetWidth; this._height = this._container.offsetHeight; @@ -46,51 +47,55 @@ class SplitPaneContainer { } public resizePane(index: number, direction: Direction, amount: number): void { - // TODO: Should resize pane up/down resize the panel? + const isHorizontal = (direction === Direction.Left) || (direction === Direction.Right); - // Only resize the correct dimension - const isHorizontal = direction === Direction.Left || direction === Direction.Right; - if (isHorizontal && this.orientation !== Orientation.HORIZONTAL || - !isHorizontal && this.orientation !== Orientation.VERTICAL) { - return; - } + if ((isHorizontal && this.orientation !== Orientation.HORIZONTAL) || + (!isHorizontal && this.orientation !== Orientation.VERTICAL)) { + // Resize the entire pane as a whole + if ((this.orientation === Orientation.HORIZONTAL && direction === Direction.Down) || + (this.orientation === Orientation.VERTICAL && direction === Direction.Right)) { + amount *= -1; + } + this._layoutService.resizePart(Parts.PANEL_PART, amount); + } else { + // Resize left/right in horizontal or up/down in vertical + // Only resize when there is more than one pane + if (this._children.length <= 1) { + return; + } - // Only resize when there is mor ethan one pane - if (this._children.length <= 1) { - return; - } + // Get sizes + const sizes: number[] = []; + for (let i = 0; i < this._splitView.length; i++) { + sizes.push(this._splitView.getViewSize(i)); + } - // Get sizes - const sizes: number[] = []; - for (let i = 0; i < this._splitView.length; i++) { - sizes.push(this._splitView.getViewSize(i)); - } + // Remove size from right pane, unless index is the last pane in which case use left pane + const isSizingEndPane = index !== this._children.length - 1; + const indexToChange = isSizingEndPane ? index + 1 : index - 1; + if (isSizingEndPane && direction === Direction.Left) { + amount *= -1; + } else if (!isSizingEndPane && direction === Direction.Right) { + amount *= -1; + } else if (isSizingEndPane && direction === Direction.Up) { + amount *= -1; + } else if (!isSizingEndPane && direction === Direction.Down) { + amount *= -1; + } - // Remove size from right pane, unless index is the last pane in which case use left pane - const isSizingEndPane = index !== this._children.length - 1; - const indexToChange = isSizingEndPane ? index + 1 : index - 1; - if (isSizingEndPane && direction === Direction.Left) { - amount *= -1; - } else if (!isSizingEndPane && direction === Direction.Right) { - amount *= -1; - } else if (isSizingEndPane && direction === Direction.Up) { - amount *= -1; - } else if (!isSizingEndPane && direction === Direction.Down) { - amount *= -1; - } + // Ensure the size is not reduced beyond the minimum, otherwise weird things can happen + if (sizes[index] + amount < SPLIT_PANE_MIN_SIZE) { + amount = SPLIT_PANE_MIN_SIZE - sizes[index]; + } else if (sizes[indexToChange] - amount < SPLIT_PANE_MIN_SIZE) { + amount = sizes[indexToChange] - SPLIT_PANE_MIN_SIZE; + } - // Ensure the size is not reduced beyond the minimum, otherwise weird things can happen - if (sizes[index] + amount < SPLIT_PANE_MIN_SIZE) { - amount = SPLIT_PANE_MIN_SIZE - sizes[index]; - } else if (sizes[indexToChange] - amount < SPLIT_PANE_MIN_SIZE) { - amount = sizes[indexToChange] - SPLIT_PANE_MIN_SIZE; - } - - // Apply the size change - sizes[index] += amount; - sizes[indexToChange] -= amount; - for (let i = 0; i < this._splitView.length - 1; i++) { - this._splitView.resizeView(i, sizes[i]); + // Apply the size change + sizes[index] += amount; + sizes[indexToChange] -= amount; + for (let i = 0; i < this._splitView.length - 1; i++) { + this._splitView.resizeView(i, sizes[i]); + } } } @@ -343,7 +348,7 @@ export class TerminalTab extends Disposable implements ITerminalTab { if (!this._splitPaneContainer) { this._panelPosition = this._layoutService.getPanelPosition(); const orientation = this._panelPosition === Position.BOTTOM ? Orientation.HORIZONTAL : Orientation.VERTICAL; - const newLocal = new SplitPaneContainer(this._tabElement, orientation); + const newLocal = new SplitPaneContainer(this._tabElement, orientation, this._layoutService); this._splitPaneContainer = newLocal; this.terminalInstances.forEach(instance => this._splitPaneContainer!.split(instance)); } From 12e287dc3d44d96557b69e76467d6dc151ac00be Mon Sep 17 00:00:00 2001 From: Jonas Kemper Date: Tue, 23 Apr 2019 16:34:35 +0200 Subject: [PATCH 0005/1449] implement npm view for version completions and hover suggestions --- .../src/features/packageJSONContribution.ts | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/extensions/npm/src/features/packageJSONContribution.ts b/extensions/npm/src/features/packageJSONContribution.ts index 4134a7eb8ad..2ccdcf3ec57 100644 --- a/extensions/npm/src/features/packageJSONContribution.ts +++ b/extensions/npm/src/features/packageJSONContribution.ts @@ -173,6 +173,7 @@ export class PackageJSONContribution implements IJSONContribution { url: queryUrl, agent: USER_AGENT }).then((success) => { + console.log(success.responseText); if (success.status === 200) { try { const obj = JSON.parse(success.responseText); @@ -230,14 +231,9 @@ export class PackageJSONContribution implements IJSONContribution { if ((location.matches(['dependencies', '*']) || location.matches(['devDependencies', '*']) || location.matches(['optionalDependencies', '*']) || location.matches(['peerDependencies', '*']))) { const currentKey = location.path[location.path.length - 1]; if (typeof currentKey === 'string') { - const queryUrl = 'https://registry.npmjs.org/' + encodeURIComponent(currentKey).replace(/%40/g, '@'); - return this.xhr({ - url: queryUrl, - agent: USER_AGENT - }).then((success) => { + return this.npmView(currentKey).then(info => { try { - const obj = JSON.parse(success.responseText); - const latest = obj && obj['dist-tags'] && obj['dist-tags']['latest']; + const latest = info && info['dist-tags.latest']; if (latest) { let name = JSON.stringify(latest); let proposal = new CompletionItem(name); @@ -289,11 +285,26 @@ export class PackageJSONContribution implements IJSONContribution { } private getInfo(pack: string): Thenable { - return new Promise((resolve, reject) => { + return new Promise((resolve) => { + return this.npmView(pack).then(info => { + console.log(info); + const result: string[] = []; + result.push(info.description || ''); + result.push(info['dist-tags.latest'] ? localize('json.npm.version.hover', 'Latest version: {0}', info['dist-tags.latest']) : ''); + result.push(info.homepage || ''); + return resolve(result); + }).catch(() => { + return resolve([]); + }); + }); + } + + private npmView(pack: string): Promise { + return new Promise((resolve) => { const command = 'npm view ' + pack + ' description dist-tags.latest homepage'; - cp.exec(command, (error: object, stdout: string, stderr: string) => { + cp.exec(command, (error, stdout) => { if (error) { - return resolve([]); + return resolve(); } const lines = stdout.split('\n'); if (lines.length) { @@ -309,13 +320,8 @@ export class PackageJSONContribution implements IJSONContribution { info[nameval[0]] = val; } }); - const result: string[] = []; - result.push(info.description || ''); - result.push(info['dist-tags.latest'] ? localize('json.npm.version.hover', 'Latest version: {0}', info['dist-tags.latest']) : ''); - result.push(info.homepage || ''); - return resolve(result); + return resolve(info); } - return resolve([]); }); }); } From d78e970375202dffa6700cee3a5f21bb831ac60e Mon Sep 17 00:00:00 2001 From: Jonas Kemper Date: Tue, 23 Apr 2019 16:58:00 +0200 Subject: [PATCH 0006/1449] remove logs --- extensions/npm/src/features/packageJSONContribution.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/extensions/npm/src/features/packageJSONContribution.ts b/extensions/npm/src/features/packageJSONContribution.ts index 2ccdcf3ec57..cbdbce27454 100644 --- a/extensions/npm/src/features/packageJSONContribution.ts +++ b/extensions/npm/src/features/packageJSONContribution.ts @@ -173,7 +173,6 @@ export class PackageJSONContribution implements IJSONContribution { url: queryUrl, agent: USER_AGENT }).then((success) => { - console.log(success.responseText); if (success.status === 200) { try { const obj = JSON.parse(success.responseText); @@ -287,7 +286,6 @@ export class PackageJSONContribution implements IJSONContribution { private getInfo(pack: string): Thenable { return new Promise((resolve) => { return this.npmView(pack).then(info => { - console.log(info); const result: string[] = []; result.push(info.description || ''); result.push(info['dist-tags.latest'] ? localize('json.npm.version.hover', 'Latest version: {0}', info['dist-tags.latest']) : ''); From af6b11577a58ef1be5f59328f48dfc1ae0fac40f Mon Sep 17 00:00:00 2001 From: Justin Grant Date: Wed, 1 May 2019 13:30:05 -0700 Subject: [PATCH 0007/1449] Fix JSDoc typo: "beginPattern" -> "beginsPattern" The docs for `BackgroundMatcher.activeOnStart` have a significant typo: they refer to another property "beginPattern" which doesn't actually exist. The actual name is `beginsPattern` (with an "s"). This PR fixes this typo. --- src/vs/workbench/contrib/tasks/common/problemMatcher.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/tasks/common/problemMatcher.ts b/src/vs/workbench/contrib/tasks/common/problemMatcher.ts index 8d9c2184962..9cfb575af66 100644 --- a/src/vs/workbench/contrib/tasks/common/problemMatcher.ts +++ b/src/vs/workbench/contrib/tasks/common/problemMatcher.ts @@ -688,7 +688,7 @@ export namespace Config { /** * If set to true the watcher is in active mode when the task * starts. This is equals of issuing a line that matches the - * beginPattern. + * beginsPattern. */ activeOnStart?: boolean; @@ -1591,7 +1591,7 @@ export namespace Schemas { properties: { activeOnStart: { type: 'boolean', - description: localize('ProblemMatcherSchema.background.activeOnStart', 'If set to true the background monitor is in active mode when the task starts. This is equals of issuing a line that matches the beginPattern') + description: localize('ProblemMatcherSchema.background.activeOnStart', 'If set to true the background monitor is in active mode when the task starts. This is equals of issuing a line that matches the beginsPattern') }, beginsPattern: { oneOf: [ From 7162bd579459b89f09ba50db92589d82b6beb5ac Mon Sep 17 00:00:00 2001 From: Urange Date: Mon, 13 May 2019 01:21:07 -0500 Subject: [PATCH 0008/1449] Fixed terminal search widget bug were actions buttons were not being disabled with invalid input. --- .../editor/contrib/find/simpleFindWidget.css | 2 +- .../editor/contrib/find/simpleFindWidget.ts | 26 ++++++++++++++----- .../terminal/browser/terminalFindWidget.ts | 3 ++- .../webview/browser/webviewFindWidget.ts | 1 + 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/vs/editor/contrib/find/simpleFindWidget.css b/src/vs/editor/contrib/find/simpleFindWidget.css index 136970945a4..39f5f0d3e6b 100644 --- a/src/vs/editor/contrib/find/simpleFindWidget.css +++ b/src/vs/editor/contrib/find/simpleFindWidget.css @@ -78,7 +78,7 @@ background-image: url('images/close-dark.svg'); } -monaco-workbench .simple-find-part .button.disabled { +.monaco-workbench .simple-find-part .button.disabled { opacity: 0.3; cursor: default; } \ No newline at end of file diff --git a/src/vs/editor/contrib/find/simpleFindWidget.ts b/src/vs/editor/contrib/find/simpleFindWidget.ts index c7833dcc253..f97cf3bdb13 100644 --- a/src/vs/editor/contrib/find/simpleFindWidget.ts +++ b/src/vs/editor/contrib/find/simpleFindWidget.ts @@ -33,6 +33,9 @@ export abstract class SimpleFindWidget extends Widget { private readonly _focusTracker: dom.IFocusTracker; private readonly _findInputFocusTracker: dom.IFocusTracker; private readonly _updateHistoryDelayer: Delayer; + private prevBtn: SimpleButton; + private nextBtn: SimpleButton; + private foundMatch: boolean; constructor( @IContextViewService private readonly _contextViewService: IContextViewService, @@ -54,6 +57,8 @@ export abstract class SimpleFindWidget extends Widget { new RegExp(value); return null; } catch (e) { + this.foundMatch = false; + this.updateBtns(); return { content: e.message }; } } @@ -63,7 +68,8 @@ export abstract class SimpleFindWidget extends Widget { this._updateHistoryDelayer = new Delayer(500); this.oninput(this._findInput.domNode, (e) => { - this.onInputChanged(); + this.foundMatch = this.onInputChanged(); + this.updateBtns(); this._delayedUpdateHistory(); }); @@ -99,7 +105,7 @@ export abstract class SimpleFindWidget extends Widget { } })); - const prevBtn = new SimpleButton({ + this.prevBtn = new SimpleButton({ label: NLS_PREVIOUS_MATCH_BTN_LABEL, className: 'previous', onTrigger: () => { @@ -107,7 +113,7 @@ export abstract class SimpleFindWidget extends Widget { } }); - const nextBtn = new SimpleButton({ + this.nextBtn = new SimpleButton({ label: NLS_NEXT_MATCH_BTN_LABEL, className: 'next', onTrigger: () => { @@ -126,8 +132,8 @@ export abstract class SimpleFindWidget extends Widget { this._innerDomNode = document.createElement('div'); this._innerDomNode.classList.add('simple-find-part'); this._innerDomNode.appendChild(this._findInput.domNode); - this._innerDomNode.appendChild(prevBtn.domNode); - this._innerDomNode.appendChild(nextBtn.domNode); + this._innerDomNode.appendChild(this.prevBtn.domNode); + this._innerDomNode.appendChild(this.nextBtn.domNode); this._innerDomNode.appendChild(closeBtn.domNode); // _domNode wraps _innerDomNode, ensuring that @@ -156,7 +162,7 @@ export abstract class SimpleFindWidget extends Widget { })); } - protected abstract onInputChanged(): void; + protected abstract onInputChanged(): boolean; protected abstract find(previous: boolean): void; protected abstract onFocusTrackerFocus(): void; protected abstract onFocusTrackerBlur(): void; @@ -213,6 +219,7 @@ export abstract class SimpleFindWidget extends Widget { } this._isVisible = true; + this.updateBtns(); setTimeout(() => { dom.addClass(this._innerDomNode, 'visible'); @@ -243,6 +250,7 @@ export abstract class SimpleFindWidget extends Widget { // Need to delay toggling visibility until after Transition, then visibility hidden - removes from tabIndex list setTimeout(() => { this._isVisible = false; + this.updateBtns(); dom.removeClass(this._innerDomNode, 'visible'); }, 200); } @@ -267,6 +275,12 @@ export abstract class SimpleFindWidget extends Widget { protected _getCaseSensitiveValue(): boolean { return this._findInput.getCaseSensitive(); } + + private updateBtns() { + let hasInput = this.inputValue.length > 0; + this.prevBtn.setEnabled(this._isVisible && hasInput && this.foundMatch); + this.nextBtn.setEnabled(this._isVisible && hasInput && this.foundMatch); + } } // theming diff --git a/src/vs/workbench/contrib/terminal/browser/terminalFindWidget.ts b/src/vs/workbench/contrib/terminal/browser/terminalFindWidget.ts index db30d122c39..75e51bcfa22 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalFindWidget.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalFindWidget.ts @@ -50,8 +50,9 @@ export class TerminalFindWidget extends SimpleFindWidget { // Ignore input changes for now const instance = this._terminalService.getActiveInstance(); if (instance !== null) { - instance.findNext(this.inputValue, { regex: this._getRegexValue(), wholeWord: this._getWholeWordValue(), caseSensitive: this._getCaseSensitiveValue(), incremental: true }); + return instance.findNext(this.inputValue, { regex: this._getRegexValue(), wholeWord: this._getWholeWordValue(), caseSensitive: this._getCaseSensitiveValue(), incremental: true }); } + return false; } protected onFocusTrackerFocus() { diff --git a/src/vs/workbench/contrib/webview/browser/webviewFindWidget.ts b/src/vs/workbench/contrib/webview/browser/webviewFindWidget.ts index e33b782bfa8..1f337cbc8e3 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewFindWidget.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewFindWidget.ts @@ -44,6 +44,7 @@ export class WebviewFindWidget extends SimpleFindWidget { } else { this._delegate.stopFind(false); } + return false; } protected onFocusTrackerFocus() { } From 420bcbe901757fbe4e45c326329d597e41a5cccd Mon Sep 17 00:00:00 2001 From: Urange Date: Mon, 13 May 2019 14:48:53 -0500 Subject: [PATCH 0009/1449] function name change --- src/vs/editor/contrib/find/simpleFindWidget.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/editor/contrib/find/simpleFindWidget.ts b/src/vs/editor/contrib/find/simpleFindWidget.ts index f97cf3bdb13..dad7cc9b3e5 100644 --- a/src/vs/editor/contrib/find/simpleFindWidget.ts +++ b/src/vs/editor/contrib/find/simpleFindWidget.ts @@ -58,7 +58,7 @@ export abstract class SimpleFindWidget extends Widget { return null; } catch (e) { this.foundMatch = false; - this.updateBtns(); + this.updateButtons(); return { content: e.message }; } } @@ -69,7 +69,7 @@ export abstract class SimpleFindWidget extends Widget { this.oninput(this._findInput.domNode, (e) => { this.foundMatch = this.onInputChanged(); - this.updateBtns(); + this.updateButtons(); this._delayedUpdateHistory(); }); @@ -219,7 +219,7 @@ export abstract class SimpleFindWidget extends Widget { } this._isVisible = true; - this.updateBtns(); + this.updateButtons(); setTimeout(() => { dom.addClass(this._innerDomNode, 'visible'); @@ -250,7 +250,7 @@ export abstract class SimpleFindWidget extends Widget { // Need to delay toggling visibility until after Transition, then visibility hidden - removes from tabIndex list setTimeout(() => { this._isVisible = false; - this.updateBtns(); + this.updateButtons(); dom.removeClass(this._innerDomNode, 'visible'); }, 200); } @@ -276,7 +276,7 @@ export abstract class SimpleFindWidget extends Widget { return this._findInput.getCaseSensitive(); } - private updateBtns() { + private updateButtons() { let hasInput = this.inputValue.length > 0; this.prevBtn.setEnabled(this._isVisible && hasInput && this.foundMatch); this.nextBtn.setEnabled(this._isVisible && hasInput && this.foundMatch); From a9268a7d25350668fa53424c51d8d2069ce0adc5 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 21 May 2019 21:41:30 -0700 Subject: [PATCH 0010/1449] wip: tree indent guides --- src/vs/base/browser/ui/tree/abstractTree.ts | 124 ++++++++++++++++++-- src/vs/base/browser/ui/tree/media/tree.css | 6 + 2 files changed, 120 insertions(+), 10 deletions(-) diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index 19feab47a05..6bc85c35a43 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -188,6 +188,7 @@ export class ComposedTreeDelegate implements IListV interface ITreeListTemplateData { readonly container: HTMLElement; + readonly indent: HTMLElement; readonly twistie: HTMLElement; readonly templateData: T; } @@ -196,13 +197,47 @@ interface ITreeRendererOptions { readonly indent?: number; } +enum IndentGuide { + None, + First, + Middle, + Last +} + +function getLastVisibleChild(node: ITreeNode): ITreeNode | undefined { + for (let i = 0; i < node.children.length; i++) { + const child = node.children[node.children.length - i - 1]; + + if (child.visible) { + return child; + } + } + + return undefined; +} + +function hasVisibleChildren(node: ITreeNode): boolean { + for (let i = 0; i < node.children.length; i++) { + if (node.children[i].visible) { + return true; + } + } + + return false; +} + +interface IRenderData { + templateData: ITreeListTemplateData; + height: number; +} + class TreeRenderer implements IListRenderer, ITreeListTemplateData> { private static DefaultIndent = 8; readonly templateId: string; private renderedElements = new Map>(); - private renderedNodes = new Map, ITreeListTemplateData>(); + private renderedNodes = new Map, IRenderData>(); private indent: number = TreeRenderer.DefaultIndent; private disposables: IDisposable[] = []; @@ -226,29 +261,38 @@ class TreeRenderer implements IListRenderer { - templateData.twistie.style.marginLeft = `${node.depth * this.indent}px`; + // TODO + this.renderedNodes.forEach((data, node) => { + data.templateData.indent.style.width = `${node.depth * this.indent}px`; }); } renderTemplate(container: HTMLElement): ITreeListTemplateData { const el = append(container, $('.monaco-tl-row')); + const indent = append(el, $('.monaco-tl-indent')); const twistie = append(el, $('.monaco-tl-twistie')); const contents = append(el, $('.monaco-tl-contents')); const templateData = this.renderer.renderTemplate(contents); - return { container, twistie, templateData }; + return { container, indent, twistie, templateData }; } renderElement(node: ITreeNode, index: number, templateData: ITreeListTemplateData, height: number | undefined): void { if (typeof height === 'number') { - this.renderedNodes.set(node, templateData); + this.renderedNodes.set(node, { templateData, height }); this.renderedElements.set(node.element, node); } const indent = TreeRenderer.DefaultIndent + (node.depth - 1) * this.indent; templateData.twistie.style.marginLeft = `${indent}px`; - this.update(node, templateData); + templateData.indent.style.width = `${indent + this.indent}px`; + templateData.indent.style.left = `${Math.floor(this.indent * 1.5)}px`; + + this.renderTwistie(node, templateData); + + if (typeof height === 'number') { + this.renderIndentGuides(node, templateData, height); + } this.renderer.renderElement(node, index, templateData.templateData, height); } @@ -279,16 +323,17 @@ class TreeRenderer implements IListRenderer): void { - const templateData = this.renderedNodes.get(node); + const data = this.renderedNodes.get(node); - if (!templateData) { + if (!data) { return; } - this.update(node, templateData); + this.renderTwistie(node, data.templateData); + this.renderIndentGuides(node, data.templateData, data.height); } - private update(node: ITreeNode, templateData: ITreeListTemplateData) { + private renderTwistie(node: ITreeNode, templateData: ITreeListTemplateData) { if (this.renderer.renderTwistie) { this.renderer.renderTwistie(node.element, templateData.twistie); } @@ -303,6 +348,65 @@ class TreeRenderer implements IListRenderer, templateData: ITreeListTemplateData, height: number): void { + let node: ITreeNode | undefined = _node; + let parent: ITreeNode | undefined; + const guides: IndentGuide[] = []; + + if (node && node.collapsible && !node.collapsed && hasVisibleChildren(node)) { + guides.push(IndentGuide.First); + } else { + guides.push(IndentGuide.None); + } + + while (node) { + parent = node.parent; + + if (!parent || !parent.parent) { + break; + } + + const isLastChild = parent && getLastVisibleChild(parent) === node; + + if (isLastChild) { + if (node === _node) { + guides.push(IndentGuide.Last); + } else { + guides.push(IndentGuide.None); + } + } else { + guides.push(IndentGuide.Middle); + } + + node = parent; + } + + const lines: string[] = []; + const halfHeight = Math.floor(height / 2); + + for (let i = 0; i < guides.length; i++) { + const halfX = Math.floor((guides.length - i - 0.5) * this.indent); + const fullX = (guides.length - i) * this.indent; + + switch (guides[i]) { + case IndentGuide.First: + lines.push(``); + lines.push(``); + break; + case IndentGuide.Middle: + lines.push(``); + break; + case IndentGuide.Last: + lines.push(``); + lines.push(``); + break; + } + } + + const rawSvg = `${lines.join('')}`; + templateData.indent.style.background = `url("data:image/svg+xml,${encodeURIComponent(rawSvg)}") no-repeat 0 0`; + } + dispose(): void { this.renderedNodes.clear(); this.renderedElements.clear(); diff --git a/src/vs/base/browser/ui/tree/media/tree.css b/src/vs/base/browser/ui/tree/media/tree.css index 4f86f971f97..059f7ae0e02 100644 --- a/src/vs/base/browser/ui/tree/media/tree.css +++ b/src/vs/base/browser/ui/tree/media/tree.css @@ -9,6 +9,12 @@ align-items: center; } +.monaco-tl-indent { + height: 100%; + position: absolute; + top: 0; +} + .monaco-tl-twistie, .monaco-tl-contents { height: 100%; From 2ec93640df0a12c60ec3b04439e7b319b4982c5c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 22 May 2019 13:57:20 +0200 Subject: [PATCH 0011/1449] tree indent: dynamic indent --- src/vs/base/browser/ui/tree/abstractTree.ts | 15 +++++++-------- src/vs/base/browser/ui/tree/media/tree.css | 1 + 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index 6bc85c35a43..834bc499c2b 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -286,7 +286,6 @@ class TreeRenderer implements IListRenderer implements IListRenderer`); - lines.push(``); + lines.push(``); + lines.push(``); break; case IndentGuide.Middle: - lines.push(``); + lines.push(``); break; case IndentGuide.Last: - lines.push(``); - lines.push(``); + lines.push(``); + lines.push(``); break; } } diff --git a/src/vs/base/browser/ui/tree/media/tree.css b/src/vs/base/browser/ui/tree/media/tree.css index 059f7ae0e02..a0592211ef2 100644 --- a/src/vs/base/browser/ui/tree/media/tree.css +++ b/src/vs/base/browser/ui/tree/media/tree.css @@ -13,6 +13,7 @@ height: 100%; position: absolute; top: 0; + left: 16px; } .monaco-tl-twistie, From 2a0d966fb2face8d119d9b1ec59d6b79d8fdde21 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 22 May 2019 14:04:54 +0200 Subject: [PATCH 0012/1449] tree indent guides: fix missing first indent guide on async trees --- src/vs/base/browser/ui/tree/abstractTree.ts | 9 ++++++++- src/vs/base/browser/ui/tree/indexTreeModel.ts | 2 +- src/vs/base/browser/ui/tree/tree.ts | 1 + 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index 834bc499c2b..bbfc2132f99 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -243,6 +243,7 @@ class TreeRenderer implements IListRenderer, + onDidSplice: Event>, onDidChangeCollapseState: Event>, options: ITreeRendererOptions = {} ) { @@ -251,6 +252,9 @@ class TreeRenderer implements IListRenderer e.node)(this.onDidChangeNodeTwistieState, this, this.disposables); + // TODO: only do iff indent guides are enabled + Event.map(onDidSplice, e => e.parentNode)(this.onDidChangeNodeTwistieState, this, this.disposables); + if (renderer.onDidChangeTwistieState) { renderer.onDidChangeTwistieState(this.onDidChangeTwistieState, this, this.disposables); } @@ -347,6 +351,7 @@ class TreeRenderer implements IListRenderer, templateData: ITreeListTemplateData, height: number): void { let node: ITreeNode | undefined = _node; let parent: ITreeNode | undefined; @@ -1147,8 +1152,9 @@ export abstract class AbstractTree implements IDisposable ) { const treeDelegate = new ComposedTreeDelegate>(delegate); + const onDidSplice = new Relay>(); const onDidChangeCollapseStateRelay = new Relay>(); - this.renderers = renderers.map(r => new TreeRenderer(r, onDidChangeCollapseStateRelay.event, _options)); + this.renderers = renderers.map(r => new TreeRenderer(r, onDidSplice.event, onDidChangeCollapseStateRelay.event, _options)); this.disposables.push(...this.renderers); let filter: TypeFilter | undefined; @@ -1164,6 +1170,7 @@ export abstract class AbstractTree implements IDisposable this.view = new TreeNodeList(container, treeDelegate, this.renderers, this.focus, this.selection, { ...asListOptions(() => this.model, _options), tree: this }); this.model = this.createModel(this.view, _options); + onDidSplice.input = this.model.onDidSplice; onDidChangeCollapseStateRelay.input = this.model.onDidChangeCollapseState; this.model.onDidSplice(e => { diff --git a/src/vs/base/browser/ui/tree/indexTreeModel.ts b/src/vs/base/browser/ui/tree/indexTreeModel.ts index a568881e7c2..33e5e8c31d6 100644 --- a/src/vs/base/browser/ui/tree/indexTreeModel.ts +++ b/src/vs/base/browser/ui/tree/indexTreeModel.ts @@ -171,7 +171,7 @@ export class IndexTreeModel, TFilterData = voi } const result = Iterator.map(Iterator.fromArray(deletedNodes), treeNodeToElement); - this._onDidSplice.fire({ insertedNodes: nodesToInsert, deletedNodes }); + this._onDidSplice.fire({ parentNode, insertedNodes: nodesToInsert, deletedNodes }); return result; } diff --git a/src/vs/base/browser/ui/tree/tree.ts b/src/vs/base/browser/ui/tree/tree.ts index cedb6fbd423..e19d1720319 100644 --- a/src/vs/base/browser/ui/tree/tree.ts +++ b/src/vs/base/browser/ui/tree/tree.ts @@ -98,6 +98,7 @@ export interface ICollapseStateChangeEvent { } export interface ITreeModelSpliceEvent { + parentNode: ITreeNode; insertedNodes: ITreeNode[]; deletedNodes: ITreeNode[]; } From b14e8a74572a13214d65196c0b11da8a7c9a2780 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 22 May 2019 14:41:20 +0200 Subject: [PATCH 0013/1449] tree indent guides: styling --- src/vs/base/browser/ui/list/listWidget.ts | 5 ++- src/vs/base/browser/ui/tree/abstractTree.ts | 33 ++++++++++++++----- src/vs/base/browser/ui/tree/media/tree.css | 4 +++ src/vs/platform/theme/common/colorRegistry.ts | 1 + src/vs/platform/theme/common/styler.ts | 6 ++-- 5 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/vs/base/browser/ui/list/listWidget.ts b/src/vs/base/browser/ui/list/listWidget.ts index b3cc40b3eee..4c005afeea7 100644 --- a/src/vs/base/browser/ui/list/listWidget.ts +++ b/src/vs/base/browser/ui/list/listWidget.ts @@ -857,6 +857,7 @@ export interface IListStyles { listFilterWidgetOutline?: Color; listFilterWidgetNoMatchesOutline?: Color; listMatchesShadow?: Color; + treeIndentGuidesStroke?: Color; } const defaultStyles: IListStyles = { @@ -867,7 +868,8 @@ const defaultStyles: IListStyles = { listFocusAndSelectionForeground: Color.fromHex('#FFFFFF'), listInactiveSelectionBackground: Color.fromHex('#3F3F46'), listHoverBackground: Color.fromHex('#2A2D2E'), - listDropBackground: Color.fromHex('#383B3D') + listDropBackground: Color.fromHex('#383B3D'), + treeIndentGuidesStroke: Color.fromHex('#a9a9a9') }; const DefaultOptions = { @@ -1112,6 +1114,7 @@ export class List implements ISpliceable, IDisposable { return Event.map(this._onPin.event, indexes => this.toListEvent({ indexes })); } + get domId(): string { return this.view.domId; } get onDidScroll(): Event { return this.view.onDidScroll; } get onMouseClick(): Event> { return this.view.onMouseClick; } get onMouseDblClick(): Event> { return this.view.onMouseDblClick; } diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index bbfc2132f99..b9f558f343e 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -7,7 +7,7 @@ import 'vs/css!./media/tree'; import { IDisposable, dispose, Disposable, toDisposable } from 'vs/base/common/lifecycle'; import { IListOptions, List, IListStyles, mightProducePrintableCharacter, MouseController } from 'vs/base/browser/ui/list/listWidget'; import { IListVirtualDelegate, IListRenderer, IListMouseEvent, IListEvent, IListContextMenuEvent, IListDragAndDrop, IListDragOverReaction, IKeyboardNavigationLabelProvider, IIdentityProvider } from 'vs/base/browser/ui/list/list'; -import { append, $, toggleClass, getDomNodePagePosition, removeClass, addClass, hasClass } from 'vs/base/browser/dom'; +import { append, $, toggleClass, getDomNodePagePosition, removeClass, addClass, hasClass, createStyleSheet } from 'vs/base/browser/dom'; import { Event, Relay, Emitter, EventBufferer } from 'vs/base/common/event'; import { StandardKeyboardEvent, IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { KeyCode } from 'vs/base/common/keyCodes'; @@ -394,21 +394,23 @@ class TreeRenderer implements IListRenderer`); - lines.push(``); + lines.push(``); + lines.push(``); break; case IndentGuide.Middle: - lines.push(``); + lines.push(``); break; case IndentGuide.Last: - lines.push(``); - lines.push(``); + lines.push(``); + lines.push(``); break; } } - const rawSvg = `${lines.join('')}`; - templateData.indent.style.background = `url("data:image/svg+xml,${encodeURIComponent(rawSvg)}") no-repeat 0 0`; + const width = this.indent * guides.length; + const svg = `${lines.join('')}`; + + templateData.indent.innerHTML = svg; } dispose(): void { @@ -1107,6 +1109,7 @@ export abstract class AbstractTree implements IDisposable private eventBufferer = new EventBufferer(); private typeFilterController?: TypeFilterController; private focusNavigationFilter: ((node: ITreeNode) => boolean) | undefined; + private styleElement: HTMLStyleElement; protected disposables: IDisposable[] = []; get onDidScroll(): Event { return this.view.onDidScroll; } @@ -1193,6 +1196,8 @@ export abstract class AbstractTree implements IDisposable this.focusNavigationFilter = node => this.typeFilterController!.shouldAllowFocus(node); this.disposables.push(this.typeFilterController!); } + + this.styleElement = createStyleSheet(this.view.getHTMLElement()); } updateOptions(optionsUpdate: IAbstractTreeOptionsUpdate = {}): void { @@ -1293,6 +1298,18 @@ export abstract class AbstractTree implements IDisposable } style(styles: IListStyles): void { + const suffix = `.${this.view.domId}`; + const content: string[] = []; + + if (styles.treeIndentGuidesStroke) { + content.push(`.monaco-list${suffix} .monaco-tl-indent > svg > line { stroke: ${styles.treeIndentGuidesStroke}; }`); + } + + const newStyles = content.join('\n'); + if (newStyles !== this.styleElement.innerHTML) { + this.styleElement.innerHTML = newStyles; + } + this.view.style(styles); } diff --git a/src/vs/base/browser/ui/tree/media/tree.css b/src/vs/base/browser/ui/tree/media/tree.css index a0592211ef2..d0b202c0b0a 100644 --- a/src/vs/base/browser/ui/tree/media/tree.css +++ b/src/vs/base/browser/ui/tree/media/tree.css @@ -16,6 +16,10 @@ left: 16px; } +.monaco-tl-indent > svg { + overflow: visible; +} + .monaco-tl-twistie, .monaco-tl-contents { height: 100%; diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index 433b4704b66..218a9a7057a 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -238,6 +238,7 @@ export const listWarningForeground = registerColor('list.warningForeground', { d export const listFilterWidgetBackground = registerColor('listFilterWidget.background', { light: '#efc1ad', dark: '#653723', hc: Color.black }, nls.localize('listFilterWidgetBackground', 'Background color of the type filter widget in lists and trees.')); export const listFilterWidgetOutline = registerColor('listFilterWidget.outline', { dark: Color.transparent, light: Color.transparent, hc: '#f38518' }, nls.localize('listFilterWidgetOutline', 'Outline color of the type filter widget in lists and trees.')); export const listFilterWidgetNoMatchesOutline = registerColor('listFilterWidget.noMatchesOutline', { dark: '#BE1100', light: '#BE1100', hc: contrastBorder }, nls.localize('listFilterWidgetNoMatchesOutline', 'Outline color of the type filter widget in lists and trees, when there are no matches.')); +export const treeIndentGuidesStroke = registerColor('tree.indentGuidesStroke', { dark: '#585858', light: '#a9a9a9', hc: '#a9a9a9' }, nls.localize('treeIndentGuidesStroke', "Tree stroke color for the indentation guides.")); export const pickerGroupForeground = registerColor('pickerGroup.foreground', { dark: '#3794FF', light: '#0066BF', hc: Color.white }, nls.localize('pickerGroupForeground', "Quick picker color for grouping labels.")); export const pickerGroupBorder = registerColor('pickerGroup.border', { dark: '#3F3F46', light: '#CCCEDB', hc: Color.white }, nls.localize('pickerGroupBorder', "Quick picker color for grouping borders.")); diff --git a/src/vs/platform/theme/common/styler.ts b/src/vs/platform/theme/common/styler.ts index beb70d39512..c6ae9c25e9b 100644 --- a/src/vs/platform/theme/common/styler.ts +++ b/src/vs/platform/theme/common/styler.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { ITheme, IThemeService } from 'vs/platform/theme/common/themeService'; -import { focusBorder, inputBackground, inputForeground, ColorIdentifier, selectForeground, selectBackground, selectListBackground, selectBorder, inputBorder, foreground, editorBackground, contrastBorder, inputActiveOptionBorder, listFocusBackground, listFocusForeground, listActiveSelectionBackground, listActiveSelectionForeground, listInactiveSelectionForeground, listInactiveSelectionBackground, listInactiveFocusBackground, listHoverBackground, listHoverForeground, listDropBackground, pickerGroupBorder, pickerGroupForeground, widgetShadow, inputValidationInfoBorder, inputValidationInfoBackground, inputValidationWarningBorder, inputValidationWarningBackground, inputValidationErrorBorder, inputValidationErrorBackground, activeContrastBorder, buttonForeground, buttonBackground, buttonHoverBackground, ColorFunction, badgeBackground, badgeForeground, progressBarBackground, breadcrumbsForeground, breadcrumbsFocusForeground, breadcrumbsActiveSelectionForeground, breadcrumbsBackground, editorWidgetBorder, inputValidationInfoForeground, inputValidationWarningForeground, inputValidationErrorForeground, menuForeground, menuBackground, menuSelectionForeground, menuSelectionBackground, menuSelectionBorder, menuBorder, menuSeparatorBackground, darken, listFilterWidgetOutline, listFilterWidgetNoMatchesOutline, listFilterWidgetBackground, editorWidgetBackground } from 'vs/platform/theme/common/colorRegistry'; +import { focusBorder, inputBackground, inputForeground, ColorIdentifier, selectForeground, selectBackground, selectListBackground, selectBorder, inputBorder, foreground, editorBackground, contrastBorder, inputActiveOptionBorder, listFocusBackground, listFocusForeground, listActiveSelectionBackground, listActiveSelectionForeground, listInactiveSelectionForeground, listInactiveSelectionBackground, listInactiveFocusBackground, listHoverBackground, listHoverForeground, listDropBackground, pickerGroupBorder, pickerGroupForeground, widgetShadow, inputValidationInfoBorder, inputValidationInfoBackground, inputValidationWarningBorder, inputValidationWarningBackground, inputValidationErrorBorder, inputValidationErrorBackground, activeContrastBorder, buttonForeground, buttonBackground, buttonHoverBackground, ColorFunction, badgeBackground, badgeForeground, progressBarBackground, breadcrumbsForeground, breadcrumbsFocusForeground, breadcrumbsActiveSelectionForeground, breadcrumbsBackground, editorWidgetBorder, inputValidationInfoForeground, inputValidationWarningForeground, inputValidationErrorForeground, menuForeground, menuBackground, menuSelectionForeground, menuSelectionBackground, menuSelectionBorder, menuBorder, menuSeparatorBackground, darken, listFilterWidgetOutline, listFilterWidgetNoMatchesOutline, listFilterWidgetBackground, editorWidgetBackground, treeIndentGuidesStroke } from 'vs/platform/theme/common/colorRegistry'; import { IDisposable } from 'vs/base/common/lifecycle'; import { Color } from 'vs/base/common/color'; import { mixin } from 'vs/base/common/objects'; @@ -227,6 +227,7 @@ export interface IListStyleOverrides extends IStyleOverrides { listFilterWidgetOutline?: ColorIdentifier; listFilterWidgetNoMatchesOutline?: ColorIdentifier; listMatchesShadow?: ColorIdentifier; + treeIndentGuidesStroke?: ColorIdentifier; } export function attachListStyler(widget: IThemable, themeService: IThemeService, overrides?: IListStyleOverrides): IDisposable { @@ -252,7 +253,8 @@ export const defaultListStyles: IColorMapping = { listFilterWidgetBackground: listFilterWidgetBackground, listFilterWidgetOutline: listFilterWidgetOutline, listFilterWidgetNoMatchesOutline: listFilterWidgetNoMatchesOutline, - listMatchesShadow: widgetShadow + listMatchesShadow: widgetShadow, + treeIndentGuidesStroke }; export interface IButtonStyleOverrides extends IStyleOverrides { From 3ae076453222e28b805bf62ca394961f8e2c2965 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 28 May 2019 16:27:16 +0200 Subject: [PATCH 0014/1449] object tree: preverve collapse state by id --- .../base/browser/ui/tree/objectTreeModel.ts | 31 +++++++++++++++++-- .../contrib/preferences/browser/tocTree.ts | 9 ++---- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/vs/base/browser/ui/tree/objectTreeModel.ts b/src/vs/base/browser/ui/tree/objectTreeModel.ts index 9fc7e00898b..d836e39f116 100644 --- a/src/vs/base/browser/ui/tree/objectTreeModel.ts +++ b/src/vs/base/browser/ui/tree/objectTreeModel.ts @@ -8,9 +8,11 @@ import { Iterator, ISequence, getSequenceIterator } from 'vs/base/common/iterato import { IndexTreeModel, IIndexTreeModelOptions } from 'vs/base/browser/ui/tree/indexTreeModel'; import { Event } from 'vs/base/common/event'; import { ITreeModel, ITreeNode, ITreeElement, ITreeSorter, ICollapseStateChangeEvent, ITreeModelSpliceEvent } from 'vs/base/browser/ui/tree/tree'; +import { IIdentityProvider } from 'vs/base/browser/ui/list/list'; export interface IObjectTreeModelOptions extends IIndexTreeModelOptions { readonly sorter?: ITreeSorter; + readonly identityProvider?: IIdentityProvider; } export class ObjectTreeModel, TFilterData extends NonNullable = void> implements ITreeModel { @@ -19,6 +21,8 @@ export class ObjectTreeModel, TFilterData extends Non private model: IndexTreeModel; private nodes = new Map>(); + private readonly nodesByIdentity = new Map>(); + private readonly identityProvider?: IIdentityProvider; private sorter?: ITreeSorter<{ element: T; }>; readonly onDidSplice: Event>; @@ -40,6 +44,8 @@ export class ObjectTreeModel, TFilterData extends Non } }; } + + this.identityProvider = options.identityProvider; } setChildren( @@ -59,11 +65,18 @@ export class ObjectTreeModel, TFilterData extends Non onDidDeleteNode?: (node: ITreeNode) => void ): Iterator> { const insertedElements = new Set(); + const insertedElementIds = new Set(); const _onDidCreateNode = (node: ITreeNode) => { insertedElements.add(node.element); this.nodes.set(node.element, node); + if (this.identityProvider) { + const id = this.identityProvider.getId(node.element).toString(); + insertedElementIds.add(id); + this.nodesByIdentity.set(id, node); + } + if (onDidCreateNode) { onDidCreateNode(node); } @@ -74,18 +87,27 @@ export class ObjectTreeModel, TFilterData extends Non this.nodes.delete(node.element); } + if (this.identityProvider) { + const id = this.identityProvider.getId(node.element).toString(); + if (!insertedElementIds.has(id)) { + this.nodesByIdentity.delete(id); + } + } + if (onDidDeleteNode) { onDidDeleteNode(node); } }; - return this.model.splice( + const result = this.model.splice( [...location, 0], Number.MAX_VALUE, children, _onDidCreateNode, _onDidDeleteNode ); + + return result; } private preserveCollapseState(elements: ISequence> | undefined): ISequence> { @@ -96,7 +118,12 @@ export class ObjectTreeModel, TFilterData extends Non } return Iterator.map(iterator, treeElement => { - const node = this.nodes.get(treeElement.element); + let node = this.nodes.get(treeElement.element); + + if (!node && this.identityProvider) { + const id = this.identityProvider.getId(treeElement.element).toString(); + node = this.nodesByIdentity.get(id); + } if (!node) { return { diff --git a/src/vs/workbench/contrib/preferences/browser/tocTree.ts b/src/vs/workbench/contrib/preferences/browser/tocTree.ts index b36090c5f0d..617302f7837 100644 --- a/src/vs/workbench/contrib/preferences/browser/tocTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/tocTree.ts @@ -136,16 +136,12 @@ export function createTOCIterator(model: TOCTreeModel | SettingsTreeGroupElement const groupChildren = model.children.filter(c => c instanceof SettingsTreeGroupElement); const groupsIt = Iterator.fromArray(groupChildren); - return Iterator.map(groupsIt, g => { - let nodeExists = true; - try { tree.getNode(g); } catch (e) { nodeExists = false; } - const hasGroupChildren = g.children.some(c => c instanceof SettingsTreeGroupElement); return { element: g, - collapsed: nodeExists ? undefined : true, + collapsed: undefined, collapsible: hasGroupChildren, children: g instanceof SettingsTreeGroupElement ? createTOCIterator(g, tree) : @@ -198,7 +194,8 @@ export class TOCTree extends ObjectTree { } }, styleController: new DefaultStyleController(DOM.createStyleSheet(container), treeClass), - accessibilityProvider: instantiationService.createInstance(SettingsAccessibilityProvider) + accessibilityProvider: instantiationService.createInstance(SettingsAccessibilityProvider), + collapseByDefault: true }; super(container, From d3f7e90524f16307921aa95734cea30d07378da9 Mon Sep 17 00:00:00 2001 From: skprabhanjan Date: Mon, 3 Jun 2019 21:00:23 +0530 Subject: [PATCH 0015/1449] fix-73341 Removed notificationService prompt --- .../node/extensionsWorkbenchService.ts | 24 ++----------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts index 1362c838196..f97909e2c71 100644 --- a/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts @@ -1001,29 +1001,9 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension if (extension) { return this.windowService.focusWindow() .then(() => this.open(extension)); + } else { + return Promise.resolve(null); } - - return this.queryGallery({ names: [extensionId], source: 'uri' }, CancellationToken.None).then(result => { - if (result.total < 1) { - return Promise.resolve(null); - } - - const extension = result.firstPage[0]; - - return this.windowService.focusWindow().then(() => { - return this.open(extension).then(() => { - this.notificationService.prompt( - Severity.Info, - nls.localize('installConfirmation', "Would you like to install the '{0}' extension?", extension.displayName, extension.publisher), - [{ - label: nls.localize('install', "Install"), - run: () => this.install(extension).then(undefined, error => this.onError(error)) - }], - { sticky: true } - ); - }); - }); - }); }).then(undefined, error => this.onError(error)); } From 95a799c2bb8eb681b16e4dbd95a837663bace78c Mon Sep 17 00:00:00 2001 From: skprabhanjan Date: Tue, 4 Jun 2019 00:13:56 +0530 Subject: [PATCH 0016/1449] fix-73341 Review #1 Changes --- .../extensions/node/extensionsWorkbenchService.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts index f97909e2c71..0f2437de9da 100644 --- a/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts @@ -1001,9 +1001,18 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension if (extension) { return this.windowService.focusWindow() .then(() => this.open(extension)); - } else { - return Promise.resolve(null); } + return this.queryGallery({ names: [extensionId], source: 'uri' }, CancellationToken.None).then(result => { + if (result.total < 1) { + return Promise.resolve(null); + } + + const extension = result.firstPage[0]; + + return this.windowService.focusWindow().then(() => { + return this.open(extension); + }); + }); }).then(undefined, error => this.onError(error)); } From 9f1040860b9e833ae60c1cf88818cca4c0ed3783 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Wed, 5 Jun 2019 15:28:47 +0200 Subject: [PATCH 0017/1449] Terminal race between prcoess exit and on ready listeners Fixes #69403 --- .../browser/terminalProcessManager.ts | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts index 33079c36940..2592c33cfd4 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts @@ -52,6 +52,7 @@ export class TerminalProcessManager implements ITerminalProcessManager { private _latency: number = -1; private _latencyRequest: Promise; private _latencyLastMeasured: number = 0; + private _initialCwd: string; private readonly _onProcessReady = new Emitter(); public get onProcessReady(): Event { return this._onProcessReady.event; } @@ -148,13 +149,16 @@ export class TerminalProcessManager implements ITerminalProcessManager { this._process.onProcessIdReady(pid => { this.shellProcessId = pid; - this._onProcessReady.fire(); + return this._process!.getInitialCwd().then(cwd => { + this._initialCwd = cwd; + this._onProcessReady.fire(); - // Send any queued data that's waiting - if (this._preLaunchInputQueue.length > 0 && this._process) { - this._process.input(this._preLaunchInputQueue.join('')); - this._preLaunchInputQueue.length = 0; - } + // Send any queued data that's waiting + if (this._preLaunchInputQueue.length > 0 && this._process) { + this._process.input(this._preLaunchInputQueue.join('')); + this._preLaunchInputQueue.length = 0; + } + }); }); this._process.onProcessTitleChanged(title => this._onProcessTitle.fire(title)); @@ -214,10 +218,7 @@ export class TerminalProcessManager implements ITerminalProcessManager { } public getInitialCwd(): Promise { - if (!this._process) { - return Promise.resolve(''); - } - return this._process.getInitialCwd(); + return Promise.resolve(this._initialCwd); } public getCwd(): Promise { From 2e89762237379e897fe07a6eb53f0e8d097233c6 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Thu, 6 Jun 2019 09:35:27 +0200 Subject: [PATCH 0018/1449] Add initial cwd to onProcessReady event --- .../api/node/extHostTerminalService.ts | 2 +- .../browser/terminalProcessManager.ts | 20 +++++++++---------- .../contrib/terminal/common/terminal.ts | 2 +- .../common/terminalProcessExtHostProxy.ts | 6 +++--- .../contrib/terminal/node/terminalProcess.ts | 10 +++++----- 5 files changed, 19 insertions(+), 21 deletions(-) diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index a258d464745..7bbd04d90fa 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -506,7 +506,7 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { // Fork the process and listen for messages this._logService.debug(`Terminal process launching on ext host`, shellLaunchConfig, initialCwd, cols, rows, env); const p = new TerminalProcess(shellLaunchConfig, initialCwd, cols, rows, env, terminalConfig.get('windowsEnableConpty') as boolean, this._logService); - p.onProcessIdReady(pid => this._proxy.$sendProcessPid(id, pid)); + p.onProcessReady((e: { pid: number, cwd: string }) => this._proxy.$sendProcessPid(id, e.pid)); p.onProcessTitleChanged(title => this._proxy.$sendProcessTitle(id, title)); p.onProcessData(data => this._proxy.$sendProcessData(id, data)); p.onProcessExit(exitCode => this._onProcessExit(id, exitCode)); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts index 2592c33cfd4..b70d3a28732 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts @@ -147,18 +147,16 @@ export class TerminalProcessManager implements ITerminalProcessManager { } }); - this._process.onProcessIdReady(pid => { - this.shellProcessId = pid; - return this._process!.getInitialCwd().then(cwd => { - this._initialCwd = cwd; - this._onProcessReady.fire(); + this._process.onProcessReady((e: { pid: number, cwd: string }) => { + this.shellProcessId = e.pid; + this._initialCwd = e.cwd; + this._onProcessReady.fire(); - // Send any queued data that's waiting - if (this._preLaunchInputQueue.length > 0 && this._process) { - this._process.input(this._preLaunchInputQueue.join('')); - this._preLaunchInputQueue.length = 0; - } - }); + // Send any queued data that's waiting + if (this._preLaunchInputQueue.length > 0 && this._process) { + this._process.input(this._preLaunchInputQueue.join('')); + this._preLaunchInputQueue.length = 0; + } }); this._process.onProcessTitleChanged(title => this._onProcessTitle.fire(title)); diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index 424faa24985..b5ba60c4369 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -747,7 +747,7 @@ export interface IWindowsShellHelper extends IDisposable { export interface ITerminalChildProcess { onProcessData: Event; onProcessExit: Event; - onProcessIdReady: Event; + onProcessReady: Event<{ pid: number, cwd: string }>; onProcessTitleChanged: Event; /** diff --git a/src/vs/workbench/contrib/terminal/common/terminalProcessExtHostProxy.ts b/src/vs/workbench/contrib/terminal/common/terminalProcessExtHostProxy.ts index dc61c51298d..0c12352b58c 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalProcessExtHostProxy.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalProcessExtHostProxy.ts @@ -19,8 +19,8 @@ export class TerminalProcessExtHostProxy implements ITerminalChildProcess, ITerm public get onProcessData(): Event { return this._onProcessData.event; } private readonly _onProcessExit = new Emitter(); public get onProcessExit(): Event { return this._onProcessExit.event; } - private readonly _onProcessIdReady = new Emitter(); - public get onProcessIdReady(): Event { return this._onProcessIdReady.event; } + private readonly _onProcessReady = new Emitter<{ pid: number, cwd: string }>(); + public get onProcessReady(): Event<{ pid: number, cwd: string }> { return this._onProcessReady.event; } private readonly _onProcessTitleChanged = new Emitter(); public get onProcessTitleChanged(): Event { return this._onProcessTitleChanged.event; } @@ -77,7 +77,7 @@ export class TerminalProcessExtHostProxy implements ITerminalChildProcess, ITerm } public emitPid(pid: number): void { - this._onProcessIdReady.fire(pid); + this._onProcessReady.fire({ pid, cwd: '' }); } public emitExit(exitCode: number): void { diff --git a/src/vs/workbench/contrib/terminal/node/terminalProcess.ts b/src/vs/workbench/contrib/terminal/node/terminalProcess.ts index 3005784b6e9..4e35926b4f2 100644 --- a/src/vs/workbench/contrib/terminal/node/terminalProcess.ts +++ b/src/vs/workbench/contrib/terminal/node/terminalProcess.ts @@ -29,8 +29,8 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable { public get onProcessData(): Event { return this._onProcessData.event; } private readonly _onProcessExit = new Emitter(); public get onProcessExit(): Event { return this._onProcessExit.event; } - private readonly _onProcessIdReady = new Emitter(); - public get onProcessIdReady(): Event { return this._onProcessIdReady.event; } + private readonly _onProcessReady = new Emitter<{ pid: number, cwd: string }>(); + public get onProcessReady(): Event<{ pid: number, cwd: string }> { return this._onProcessReady.event; } private readonly _onProcessTitleChanged = new Emitter(); public get onProcessTitleChanged(): Event { return this._onProcessTitleChanged.event; } @@ -90,7 +90,7 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable { const ptyProcess = pty.spawn(shellLaunchConfig.executable!, args, options); this._ptyProcess = ptyProcess; this._processStartupComplete = new Promise(c => { - this.onProcessIdReady(() => c()); + this.onProcessReady(() => c()); }); ptyProcess.on('data', data => { this._onProcessData.fire(data); @@ -118,7 +118,7 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable { this._titleInterval = null; this._onProcessData.dispose(); this._onProcessExit.dispose(); - this._onProcessIdReady.dispose(); + this._onProcessReady.dispose(); this._onProcessTitleChanged.dispose(); } @@ -169,7 +169,7 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable { } private _sendProcessId(ptyProcess: pty.IPty) { - this._onProcessIdReady.fire(ptyProcess.pid); + this._onProcessReady.fire({ pid: ptyProcess.pid, cwd: this._initialCwd }); } private _sendProcessTitle(ptyProcess: pty.IPty): void { From 8448512143e43c7c6e4789e11bd52893fd2afd73 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 7 Jun 2019 11:41:33 -0700 Subject: [PATCH 0019/1449] Use readonly arrays for the vscode.DiagnosticCollection api ## Problem The diagnostic collection object is set up so that it does not mutate the arrays of diagnostics you pass to it. It also does not expect or allow mutation of diagnostics that it returns. However it it currently typed using normal arrays. This means that if an extension (such as JS/TS) wishes to use readonly diagnostics intnernally, it cannot do so without casting. ## Proposed Fix Use `ReadonlyArray` in diagnostic collection. This should be a safe change for the `set` type methods. The changes to `get` and `forEach` have the risk of breaking the typing of some extensions, but `get` already returned a frozen array of diagnostic so trying to mutate the array itself would have resulted in runtime error. --- .../src/features/diagnostics.ts | 4 ++-- src/vs/vscode.d.ts | 8 +++---- .../api/common/extHostDiagnostics.ts | 22 +++++++++---------- .../api/extHostDiagnostics.test.ts | 6 ++--- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/extensions/typescript-language-features/src/features/diagnostics.ts b/extensions/typescript-language-features/src/features/diagnostics.ts index d3d40ac97f4..327573e8c18 100644 --- a/extensions/typescript-language-features/src/features/diagnostics.ts +++ b/extensions/typescript-language-features/src/features/diagnostics.ts @@ -208,7 +208,7 @@ export class DiagnosticsManager extends Disposable { public configFileDiagnosticsReceived( file: vscode.Uri, - diagnostics: vscode.Diagnostic[] + diagnostics: ReadonlyArray ): void { this._currentDiagnostics.set(file, diagnostics); } @@ -218,7 +218,7 @@ export class DiagnosticsManager extends Disposable { this._diagnostics.delete(resource); } - public getDiagnostics(file: vscode.Uri): vscode.Diagnostic[] { + public getDiagnostics(file: vscode.Uri): ReadonlyArray { return this._currentDiagnostics.get(file) || []; } diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index d03f3edf9a2..5668c4f1381 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -4354,7 +4354,7 @@ declare module 'vscode' { * @param uri A resource identifier. * @param diagnostics Array of diagnostics or `undefined` */ - set(uri: Uri, diagnostics: Diagnostic[] | undefined): void; + set(uri: Uri, diagnostics: ReadonlyArray | undefined): void; /** * Replace all entries in this collection. @@ -4366,7 +4366,7 @@ declare module 'vscode' { * * @param entries An array of tuples, like `[[file1, [d1, d2]], [file2, [d3, d4, d5]]]`, or `undefined`. */ - set(entries: [Uri, Diagnostic[] | undefined][]): void; + set(entries: ReadonlyArray<[Uri, ReadonlyArray | undefined]>): void; /** * Remove all diagnostics from this collection that belong @@ -4388,7 +4388,7 @@ declare module 'vscode' { * @param callback Function to execute for each entry. * @param thisArg The `this` context used when invoking the handler function. */ - forEach(callback: (uri: Uri, diagnostics: Diagnostic[], collection: DiagnosticCollection) => any, thisArg?: any): void; + forEach(callback: (uri: Uri, diagnostics: ReadonlyArray, collection: DiagnosticCollection) => any, thisArg?: any): void; /** * Get the diagnostics for a given resource. *Note* that you cannot @@ -4397,7 +4397,7 @@ declare module 'vscode' { * @param uri A resource identifier. * @returns An immutable array of [diagnostics](#Diagnostic) or `undefined`. */ - get(uri: Uri): Diagnostic[] | undefined; + get(uri: Uri): ReadonlyArray | undefined; /** * Check if this collection contains diagnostics for a diff --git a/src/vs/workbench/api/common/extHostDiagnostics.ts b/src/vs/workbench/api/common/extHostDiagnostics.ts index 8a54b7e405c..60dae259b05 100644 --- a/src/vs/workbench/api/common/extHostDiagnostics.ts +++ b/src/vs/workbench/api/common/extHostDiagnostics.ts @@ -47,9 +47,9 @@ export class DiagnosticCollection implements vscode.DiagnosticCollection { return this._name; } - set(uri: vscode.Uri, diagnostics: vscode.Diagnostic[]): void; - set(entries: [vscode.Uri, vscode.Diagnostic[]][]): void; - set(first: vscode.Uri | [vscode.Uri, vscode.Diagnostic[]][], diagnostics?: vscode.Diagnostic[]) { + set(uri: vscode.Uri, diagnostics: ReadonlyArray): void; + set(entries: ReadonlyArray<[vscode.Uri, ReadonlyArray]>): void; + set(first: vscode.Uri | ReadonlyArray<[vscode.Uri, ReadonlyArray]>, diagnostics?: ReadonlyArray) { if (!first) { // this set-call is a clear-call @@ -167,7 +167,7 @@ export class DiagnosticCollection implements vscode.DiagnosticCollection { this._proxy.$clear(this._owner); } - forEach(callback: (uri: URI, diagnostics: vscode.Diagnostic[], collection: DiagnosticCollection) => any, thisArg?: any): void { + forEach(callback: (uri: URI, diagnostics: ReadonlyArray, collection: DiagnosticCollection) => any, thisArg?: any): void { this._checkDisposed(); this._data.forEach((value, key) => { const uri = URI.parse(key); @@ -175,11 +175,11 @@ export class DiagnosticCollection implements vscode.DiagnosticCollection { }); } - get(uri: URI): vscode.Diagnostic[] { + get(uri: URI): ReadonlyArray { this._checkDisposed(); const result = this._data.get(uri.toString()); if (Array.isArray(result)) { - return Object.freeze(result.slice(0)); + return >Object.freeze(result.slice(0)); } return []; } @@ -278,10 +278,10 @@ export class ExtHostDiagnostics implements ExtHostDiagnosticsShape { return result; } - getDiagnostics(resource: vscode.Uri): vscode.Diagnostic[]; - getDiagnostics(): [vscode.Uri, vscode.Diagnostic[]][]; - getDiagnostics(resource?: vscode.Uri): vscode.Diagnostic[] | [vscode.Uri, vscode.Diagnostic[]][]; - getDiagnostics(resource?: vscode.Uri): vscode.Diagnostic[] | [vscode.Uri, vscode.Diagnostic[]][] { + getDiagnostics(resource: vscode.Uri): ReadonlyArray; + getDiagnostics(): ReadonlyArray<[vscode.Uri, ReadonlyArray]>; + getDiagnostics(resource?: vscode.Uri): ReadonlyArray | ReadonlyArray<[vscode.Uri, ReadonlyArray]>; + getDiagnostics(resource?: vscode.Uri): ReadonlyArray | ReadonlyArray<[vscode.Uri, ReadonlyArray]> { if (resource) { return this._getDiagnostics(resource); } else { @@ -302,7 +302,7 @@ export class ExtHostDiagnostics implements ExtHostDiagnosticsShape { } } - private _getDiagnostics(resource: vscode.Uri): vscode.Diagnostic[] { + private _getDiagnostics(resource: vscode.Uri): ReadonlyArray { let res: vscode.Diagnostic[] = []; this._collections.forEach(collection => { if (collection.has(resource)) { diff --git a/src/vs/workbench/test/electron-browser/api/extHostDiagnostics.test.ts b/src/vs/workbench/test/electron-browser/api/extHostDiagnostics.test.ts index 38c627a64c5..4eca9307e09 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostDiagnostics.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostDiagnostics.test.ts @@ -91,18 +91,18 @@ suite('ExtHostDiagnostics', () => { new Diagnostic(new Range(0, 0, 1, 1), 'message-2') ]); - let array = collection.get(URI.parse('foo:bar')); + let array = collection.get(URI.parse('foo:bar')) as Diagnostic[]; assert.throws(() => array.length = 0); assert.throws(() => array.pop()); assert.throws(() => array[0] = new Diagnostic(new Range(0, 0, 0, 0), 'evil')); - collection.forEach((uri, array) => { + collection.forEach((uri, array: Diagnostic[]) => { assert.throws(() => array.length = 0); assert.throws(() => array.pop()); assert.throws(() => array[0] = new Diagnostic(new Range(0, 0, 0, 0), 'evil')); }); - array = collection.get(URI.parse('foo:bar')); + array = collection.get(URI.parse('foo:bar')) as Diagnostic[]; assert.equal(array.length, 2); collection.dispose(); From 9b9b519a48133fcae9e19ea3cc4205a8d5ab06a5 Mon Sep 17 00:00:00 2001 From: skprabhanjan Date: Mon, 10 Jun 2019 11:56:30 +0530 Subject: [PATCH 0020/1449] removed unused Severity import statement --- .../contrib/extensions/node/extensionsWorkbenchService.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts index 0f2437de9da..ada50332ae4 100644 --- a/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts @@ -20,7 +20,6 @@ import { getGalleryExtensionTelemetryData, getLocalExtensionTelemetryData, areSa import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IWindowService } from 'vs/platform/windows/common/windows'; -import Severity from 'vs/base/common/severity'; import { URI } from 'vs/base/common/uri'; import { IExtension, ExtensionState, IExtensionsWorkbenchService, AutoUpdateConfigurationKey, AutoCheckUpdatesConfigurationKey } from 'vs/workbench/contrib/extensions/common/extensions'; import { IEditorService, SIDE_GROUP, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; From 0e6822b2cf52d06a6abb80adf3aefc22563731e9 Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 11 Jun 2019 16:09:52 +0200 Subject: [PATCH 0021/1449] Do not allow workspace folders with scheme different than the current remote scheme --- .../workspace/electron-browser/workspaceEditingService.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts b/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts index f7324b042a1..9cd6dc21ffc 100644 --- a/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts +++ b/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts @@ -216,6 +216,11 @@ export class WorkspaceEditingService implements IWorkspaceEditingService { private async doAddFolders(foldersToAdd: IWorkspaceFolderCreationData[], index?: number, donotNotifyError: boolean = false): Promise { const state = this.contextService.getWorkbenchState(); + if (this.environmentService.configuration.remoteAuthority) { + // Do not allow workspace folders with scheme different than the current remote scheme + const schemas = this.contextService.getWorkspace().folders.map(f => f.uri.scheme); + foldersToAdd = foldersToAdd.filter(f => schemas.indexOf(f.uri.scheme) >= 0); + } // If we are in no-workspace or single-folder workspace, adding folders has to // enter a workspace. From 6150587c12db3d69c2055ba5ca04e52d8d966c10 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 11 Jun 2019 19:13:43 +0200 Subject: [PATCH 0022/1449] Use menu registry for global activity actions --- src/vs/platform/actions/common/actions.ts | 3 +- .../parts/activitybar/activitybarActions.ts | 44 ++++++++------- .../parts/activitybar/activitybarPart.ts | 54 ++++++++----------- .../activitybar/media/activitybarpart.css | 4 ++ .../parts/activitybar}/media/update.svg | 0 src/vs/workbench/common/activity.ts | 26 +++++---- .../extensions.contribution.ts | 9 ++++ .../browser/preferences.contribution.ts | 18 +++++++ .../browser/quickopen.contribution.ts | 9 ++++ .../snippets/browser/configureSnippets.ts | 9 ++++ .../themes/browser/themes.contribution.ts | 18 +++++++ .../media/update.contribution.css | 8 --- .../electron-browser/update.contribution.ts | 4 +- .../contrib/update/electron-browser/update.ts | 46 +++------------- 14 files changed, 136 insertions(+), 116 deletions(-) rename src/vs/workbench/{contrib/update/electron-browser => browser/parts/activitybar}/media/update.svg (100%) delete mode 100644 src/vs/workbench/contrib/update/electron-browser/media/update.contribution.css diff --git a/src/vs/platform/actions/common/actions.ts b/src/vs/platform/actions/common/actions.ts index d0290c179fd..650d568f001 100644 --- a/src/vs/platform/actions/common/actions.ts +++ b/src/vs/platform/actions/common/actions.ts @@ -98,7 +98,8 @@ export const enum MenuId { CommentThreadTitle, CommentThreadActions, CommentTitle, - CommentActions + CommentActions, + GlobalActivity } export interface IMenuActionOptions { diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts index 7c8381be369..3caf51631f8 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts @@ -8,11 +8,11 @@ import * as nls from 'vs/nls'; import * as DOM from 'vs/base/browser/dom'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { EventType as TouchEventType, GestureEvent } from 'vs/base/browser/touch'; -import { Action } from 'vs/base/common/actions'; +import { Action, IAction } from 'vs/base/common/actions'; import { KeyCode } from 'vs/base/common/keyCodes'; import { dispose } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; -import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; +import { SyncActionDescriptor, IMenuService, MenuId } from 'vs/platform/actions/common/actions'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { Registry } from 'vs/platform/registry/common/platform'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -21,11 +21,14 @@ import { ICssStyleCollector, ITheme, IThemeService, registerThemingParticipant } import { ActivityAction, ActivityActionViewItem, ICompositeBar, ICompositeBarColors, ToggleCompositePinnedAction } from 'vs/workbench/browser/parts/compositeBarActions'; import { ViewletDescriptor } from 'vs/workbench/browser/viewlet'; import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; -import { IActivity, IGlobalActivity } from 'vs/workbench/common/activity'; +import { IActivity, IGlobalActivityRegistry, GlobalActivityActionsExtensions } from 'vs/workbench/common/activity'; import { ACTIVITY_BAR_FOREGROUND } from 'vs/workbench/common/theme'; import { IActivityBarService } from 'vs/workbench/services/activityBar/browser/activityBarService'; import { IWorkbenchLayoutService, Parts } from 'vs/workbench/services/layout/browser/layoutService'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; +import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { fillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; export class ViewletActivityAction extends ActivityAction { @@ -104,20 +107,15 @@ export class ToggleViewletAction extends Action { } } -export class GlobalActivityAction extends ActivityAction { - - constructor(activity: IGlobalActivity) { - super(activity); - } -} - export class GlobalActivityActionViewItem extends ActivityActionViewItem { constructor( - action: GlobalActivityAction, + action: ActivityAction, colors: (theme: ITheme) => ICompositeBarColors, @IThemeService themeService: IThemeService, - @IContextMenuService protected contextMenuService: IContextMenuService + @IMenuService private readonly menuService: IMenuService, + @IContextMenuService protected contextMenuService: IContextMenuService, + @IContextKeyService private readonly contextKeyService: IContextKeyService, ) { super(action, { draggable: false, colors, icon: true }, themeService); } @@ -148,16 +146,26 @@ export class GlobalActivityActionViewItem extends ActivityActionViewItem { } private showContextMenu(): void { - const globalAction = this._action as GlobalActivityAction; - const activity = globalAction.activity as IGlobalActivity; - const actions = activity.getActions(); + const globalActivityActions: IAction[] = []; + const globalActivityMenu = this.menuService.createMenu(MenuId.GlobalActivity, this.contextKeyService); + fillInActionBarActions(globalActivityMenu, undefined, { primary: [], secondary: globalActivityActions }); + + for (const activity of Registry.as(GlobalActivityActionsExtensions).getActivities()) { + const actions = activity.getActions(); + if (actions.length) { + globalActivityActions.push(new Separator(), ...actions); + } + } + const containerPosition = DOM.getDomNodePagePosition(this.container); const location = { x: containerPosition.left + containerPosition.width / 2, y: containerPosition.top }; - this.contextMenuService.showContextMenu({ getAnchor: () => location, - getActions: () => actions, - onHide: () => dispose(actions) + getActions: () => globalActivityActions, + onHide: () => { + globalActivityMenu.dispose(); + dispose(globalActivityActions); + } }); } } diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index ea64f843572..175a5a6c935 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -7,10 +7,10 @@ import 'vs/css!./media/activitybarpart'; import * as nls from 'vs/nls'; import { illegalArgument } from 'vs/base/common/errors'; import { ActionsOrientation, ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; -import { GlobalActivityExtensions, IGlobalActivityRegistry } from 'vs/workbench/common/activity'; +import { GLOBAL_ACTIVITY_ID } from 'vs/workbench/common/activity'; import { Registry } from 'vs/platform/registry/common/platform'; import { Part } from 'vs/workbench/browser/part'; -import { GlobalActivityActionViewItem, GlobalActivityAction, ViewletActivityAction, ToggleViewletAction, PlaceHolderToggleCompositePinnedAction, PlaceHolderViewletActivityAction } from 'vs/workbench/browser/parts/activitybar/activitybarActions'; +import { GlobalActivityActionViewItem, ViewletActivityAction, ToggleViewletAction, PlaceHolderToggleCompositePinnedAction, PlaceHolderViewletActivityAction } from 'vs/workbench/browser/parts/activitybar/activitybarActions'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IBadge } from 'vs/workbench/services/activity/common/activity'; import { IWorkbenchLayoutService, Parts, Position as SideBarPosition } from 'vs/workbench/services/layout/browser/layoutService'; @@ -25,7 +25,7 @@ import { Dimension, addClass } from 'vs/base/browser/dom'; import { IStorageService, StorageScope, IWorkspaceStorageChangeEvent } from 'vs/platform/storage/common/storage'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { URI, UriComponents } from 'vs/base/common/uri'; -import { ToggleCompositePinnedAction, ICompositeBarColors } from 'vs/workbench/browser/parts/compositeBarActions'; +import { ToggleCompositePinnedAction, ICompositeBarColors, ActivityAction } from 'vs/workbench/browser/parts/compositeBarActions'; import { ViewletDescriptor } from 'vs/workbench/browser/viewlet'; import { IViewsService, IViewContainersRegistry, Extensions as ViewContainerExtensions, ViewContainer, TEST_VIEW_CONTAINER_ID, IViewDescriptorCollection } from 'vs/workbench/common/views'; import { IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; @@ -60,8 +60,8 @@ export class ActivitybarPart extends Part implements IActivityBarService { //#endregion - private globalActionBar: ActionBar; - private globalActivityIdToActions: Map = new Map(); + private globalActivityAction: ActivityAction; + private globalActivityActionBar: ActionBar; private cachedViewlets: ICachedViewlet[] = []; @@ -163,22 +163,16 @@ export class ActivitybarPart extends Part implements IActivityBarService { return this.compositeBar.showActivity(viewletOrActionId, badge, clazz, priority); } - return this.showGlobalActivity(viewletOrActionId, badge, clazz); + if (viewletOrActionId === GLOBAL_ACTIVITY_ID) { + return this.showGlobalActivity(badge, clazz); + } + + throw illegalArgument('globalActivityId'); } - private showGlobalActivity(globalActivityId: string, badge: IBadge, clazz?: string): IDisposable { - if (!badge) { - throw illegalArgument('badge'); - } - - const action = this.globalActivityIdToActions.get(globalActivityId); - if (!action) { - throw illegalArgument('globalActivityId'); - } - - action.setBadge(badge, clazz); - - return toDisposable(() => action.setBadge(undefined)); + private showGlobalActivity(badge: IBadge, clazz?: string): IDisposable { + this.globalActivityAction.setBadge(badge, clazz); + return toDisposable(() => this.globalActivityAction.setBadge(undefined)); } createContentArea(parent: HTMLElement): HTMLElement { @@ -232,23 +226,19 @@ export class ActivitybarPart extends Part implements IActivityBarService { } private createGlobalActivityActionBar(container: HTMLElement): void { - const activityRegistry = Registry.as(GlobalActivityExtensions); - const descriptors = activityRegistry.getActivities(); - const actions = descriptors - .map(d => this.instantiationService.createInstance(d)) - .map(a => new GlobalActivityAction(a)); - - this.globalActionBar = this._register(new ActionBar(container, { + this.globalActivityActionBar = this._register(new ActionBar(container, { actionViewItemProvider: a => this.instantiationService.createInstance(GlobalActivityActionViewItem, a, (theme: ITheme) => this.getActivitybarItemColors(theme)), orientation: ActionsOrientation.VERTICAL, - ariaLabel: nls.localize('globalActions', "Global Actions"), + ariaLabel: nls.localize('manage', "Manage"), animated: false })); - actions.forEach(a => { - this.globalActivityIdToActions.set(a.id, a); - this.globalActionBar.push(a); + this.globalActivityAction = new ActivityAction({ + id: 'workbench.actions.manage', + name: nls.localize('manage', "Manage"), + cssClass: 'update-activity' }); + this.globalActivityActionBar.push(this.globalActivityAction); } private getCompositeActions(compositeId: string): { activityAction: ViewletActivityAction, pinnedAction: ToggleCompositePinnedAction } { @@ -382,8 +372,8 @@ export class ActivitybarPart extends Part implements IActivityBarService { // Layout composite bar let availableHeight = contentAreaSize.height; - if (this.globalActionBar) { - availableHeight -= (this.globalActionBar.viewItems.length * ActivitybarPart.ACTION_HEIGHT); // adjust height for global actions showing + if (this.globalActivityActionBar) { + availableHeight -= (this.globalActivityActionBar.viewItems.length * ActivitybarPart.ACTION_HEIGHT); // adjust height for global actions showing } this.compositeBar.layout(new Dimension(width, availableHeight)); } diff --git a/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css b/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css index 3b72852b0fc..11efa0fb551 100644 --- a/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css +++ b/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css @@ -25,4 +25,8 @@ .monaco-workbench .activitybar > .content > .composite-bar > .monaco-action-bar .action-label.toggle-more { -webkit-mask: url('ellipsis-global.svg') no-repeat 50% 50%; +} + +.monaco-workbench .activitybar .global-activity .monaco-action-bar .action-label.update-activity { + -webkit-mask: url('update.svg') no-repeat 50% 50%; } \ No newline at end of file diff --git a/src/vs/workbench/contrib/update/electron-browser/media/update.svg b/src/vs/workbench/browser/parts/activitybar/media/update.svg similarity index 100% rename from src/vs/workbench/contrib/update/electron-browser/media/update.svg rename to src/vs/workbench/browser/parts/activitybar/media/update.svg diff --git a/src/vs/workbench/common/activity.ts b/src/vs/workbench/common/activity.ts index 275c200a2f0..2f5cd6c9957 100644 --- a/src/vs/workbench/common/activity.ts +++ b/src/vs/workbench/common/activity.ts @@ -5,7 +5,6 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IAction } from 'vs/base/common/actions'; -import { IConstructorSignature0 } from 'vs/platform/instantiation/common/instantiation'; export interface IActivity { id: string; @@ -14,31 +13,30 @@ export interface IActivity { cssClass?: string; } -export interface IGlobalActivity extends IActivity { +export interface IGlobalActivity { getActions(): IAction[]; } -export const GlobalActivityExtensions = 'workbench.contributions.globalActivities'; +export const GLOBAL_ACTIVITY_ID = 'workbench.action.globalActivity'; + +export const GlobalActivityActionsExtensions = 'workbench.contributions.globalActivityActions'; export interface IGlobalActivityRegistry { - registerActivity(descriptor: IConstructorSignature0): void; - getActivities(): IConstructorSignature0[]; + registerActivity(activity: IGlobalActivity): void; + getActivities(): IGlobalActivity[]; } export class GlobalActivityRegistry implements IGlobalActivityRegistry { - private readonly activityDescriptors = new Set>(); + private readonly activities: IGlobalActivity[] = []; - registerActivity(descriptor: IConstructorSignature0): void { - this.activityDescriptors.add(descriptor); + registerActivity(activity: IGlobalActivity): void { + this.activities.push(activity); } - getActivities(): IConstructorSignature0[] { - const result: IConstructorSignature0[] = []; - this.activityDescriptors.forEach(d => result.push(d)); - - return result; + getActivities(): IGlobalActivity[] { + return [...this.activities]; } } -Registry.add(GlobalActivityExtensions, new GlobalActivityRegistry()); \ No newline at end of file +Registry.add(GlobalActivityActionsExtensions, new GlobalActivityRegistry()); \ No newline at end of file diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts index 2b5a8714886..91cfd75655e 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts @@ -439,4 +439,13 @@ CommandsRegistry.registerCommand({ onUnexpectedError(e); } } +}); + +MenuRegistry.appendMenuItem(MenuId.GlobalActivity, { + group: '2_configuration', + command: { + id: VIEWLET_ID, + title: localize('showExtensions', "Extensions") + }, + order: 2 }); \ No newline at end of file diff --git a/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts b/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts index dc99b95f369..7015ee8f1e8 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts @@ -755,6 +755,15 @@ MenuRegistry.appendMenuItem(MenuId.MenubarPreferencesMenu, { order: 1 }); +MenuRegistry.appendMenuItem(MenuId.GlobalActivity, { + group: '2_configuration', + command: { + id: SETTINGS_COMMAND_OPEN_SETTINGS, + title: nls.localize('settings', "Settings") + }, + order: 1 +}); + MenuRegistry.appendMenuItem(MenuId.MenubarPreferencesMenu, { group: '2_keybindings', command: { @@ -764,6 +773,15 @@ MenuRegistry.appendMenuItem(MenuId.MenubarPreferencesMenu, { order: 1 }); +MenuRegistry.appendMenuItem(MenuId.GlobalActivity, { + group: '2_configuration', + command: { + id: OpenGlobalKeybindingsAction.ID, + title: nls.localize('keyboardShortcuts', "Keyboard Shortcuts") + }, + order: 3 +}); + // Editor tool items MenuRegistry.appendMenuItem(MenuId.EditorTitle, { diff --git a/src/vs/workbench/contrib/quickopen/browser/quickopen.contribution.ts b/src/vs/workbench/contrib/quickopen/browser/quickopen.contribution.ts index 92f9b7cd868..8f89d9f3444 100644 --- a/src/vs/workbench/contrib/quickopen/browser/quickopen.contribution.ts +++ b/src/vs/workbench/contrib/quickopen/browser/quickopen.contribution.ts @@ -182,4 +182,13 @@ MenuRegistry.appendMenuItem(MenuId.MenubarGoMenu, { title: nls.localize({ key: 'miGotoLine', comment: ['&& denotes a mnemonic'] }, "Go to &&Line/Column...") }, order: 1 +}); + +MenuRegistry.appendMenuItem(MenuId.GlobalActivity, { + group: '1_command', + command: { + id: ShowAllCommandsAction.ID, + title: nls.localize('commandPalette', "Command Palette...") + }, + order: 1 }); \ No newline at end of file diff --git a/src/vs/workbench/contrib/snippets/browser/configureSnippets.ts b/src/vs/workbench/contrib/snippets/browser/configureSnippets.ts index 1cc176a9ed5..fe901ee2d71 100644 --- a/src/vs/workbench/contrib/snippets/browser/configureSnippets.ts +++ b/src/vs/workbench/contrib/snippets/browser/configureSnippets.ts @@ -272,3 +272,12 @@ MenuRegistry.appendMenuItem(MenuId.MenubarPreferencesMenu, { }, order: 1 }); + +MenuRegistry.appendMenuItem(MenuId.GlobalActivity, { + group: '3_snippets', + command: { + id, + title: nls.localize('userSnippets', "User Snippets") + }, + order: 1 +}); diff --git a/src/vs/workbench/contrib/themes/browser/themes.contribution.ts b/src/vs/workbench/contrib/themes/browser/themes.contribution.ts index 7c65d7b8956..afb4012f4f3 100644 --- a/src/vs/workbench/contrib/themes/browser/themes.contribution.ts +++ b/src/vs/workbench/contrib/themes/browser/themes.contribution.ts @@ -271,3 +271,21 @@ MenuRegistry.appendMenuItem(MenuId.MenubarPreferencesMenu, { }, order: 2 }); + +MenuRegistry.appendMenuItem(MenuId.GlobalActivity, { + group: '4_themes', + command: { + id: SelectColorThemeAction.ID, + title: localize('selectTheme.label', "Color Theme") + }, + order: 1 +}); + +MenuRegistry.appendMenuItem(MenuId.GlobalActivity, { + group: '4_themes', + command: { + id: SelectIconThemeAction.ID, + title: localize('themes.selectIconTheme.label', "File Icon Theme") + }, + order: 2 +}); \ No newline at end of file diff --git a/src/vs/workbench/contrib/update/electron-browser/media/update.contribution.css b/src/vs/workbench/contrib/update/electron-browser/media/update.contribution.css deleted file mode 100644 index 486837877ef..00000000000 --- a/src/vs/workbench/contrib/update/electron-browser/media/update.contribution.css +++ /dev/null @@ -1,8 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -.update-activity { - -webkit-mask: url('update.svg') no-repeat 50% 50%; -} diff --git a/src/vs/workbench/contrib/update/electron-browser/update.contribution.ts b/src/vs/workbench/contrib/update/electron-browser/update.contribution.ts index b7a6f3d7989..c06cfea72f9 100644 --- a/src/vs/workbench/contrib/update/electron-browser/update.contribution.ts +++ b/src/vs/workbench/contrib/update/electron-browser/update.contribution.ts @@ -8,7 +8,6 @@ import 'vs/platform/update/node/update.config.contribution'; import * as platform from 'vs/base/common/platform'; import { Registry } from 'vs/platform/registry/common/platform'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; -import { IGlobalActivityRegistry, GlobalActivityExtensions } from 'vs/workbench/common/activity'; import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { ShowCurrentReleaseNotesAction, ProductContribution, UpdateContribution, Win3264BitContribution } from './update'; @@ -24,8 +23,7 @@ if (platform.isWindows) { } } -Registry.as(GlobalActivityExtensions) - .registerActivity(UpdateContribution); +workbench.registerWorkbenchContribution(UpdateContribution, LifecyclePhase.Restored); // Editor Registry.as(ActionExtensions.WorkbenchActions) diff --git a/src/vs/workbench/contrib/update/electron-browser/update.ts b/src/vs/workbench/contrib/update/electron-browser/update.ts index 47de95dcafa..e398545df58 100644 --- a/src/vs/workbench/contrib/update/electron-browser/update.ts +++ b/src/vs/workbench/contrib/update/electron-browser/update.ts @@ -13,9 +13,8 @@ import product from 'vs/platform/product/node/product'; import { URI } from 'vs/base/common/uri'; import { IActivityService, NumberBadge, IBadge, ProgressBadge } from 'vs/workbench/services/activity/common/activity'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IGlobalActivity } from 'vs/workbench/common/activity'; +import { IGlobalActivity, GLOBAL_ACTIVITY_ID, IGlobalActivityRegistry, GlobalActivityActionsExtensions as GlobalActivityExtensions } from 'vs/workbench/common/activity'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { ICommandService } from 'vs/platform/commands/common/commands'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IUpdateService, State as UpdateState, StateType, IUpdate } from 'vs/platform/update/common/update'; @@ -27,6 +26,7 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/ import { ReleaseNotesManager } from './releaseNotesEditor'; import { isWindows } from 'vs/base/common/platform'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { Registry } from 'vs/platform/registry/common/platform'; let releaseNotesManager: ReleaseNotesManager | undefined = undefined; @@ -212,37 +212,13 @@ export class Win3264BitContribution implements IWorkbenchContribution { } } -class CommandAction extends Action { - - constructor( - commandId: string, - label: string, - @ICommandService commandService: ICommandService - ) { - super(`command-action:${commandId}`, label, undefined, true, () => commandService.executeCommand(commandId)); - } -} - export class UpdateContribution extends Disposable implements IGlobalActivity { - private static readonly showCommandsId = 'workbench.action.showCommands'; - private static readonly openSettingsId = 'workbench.action.openSettings'; - private static readonly openKeybindingsId = 'workbench.action.openGlobalKeybindings'; - private static readonly openUserSnippets = 'workbench.action.openSnippets'; - private static readonly selectColorThemeId = 'workbench.action.selectTheme'; - private static readonly selectIconThemeId = 'workbench.action.selectIconTheme'; - private static readonly showExtensionsId = 'workbench.view.extensions'; - - get id() { return 'vs.update'; } - get name() { return nls.localize('manage', "Manage"); } - get cssClass() { return 'update-activity'; } - private state: UpdateState; private badgeDisposable: IDisposable = Disposable.None; constructor( @IStorageService private readonly storageService: IStorageService, - @ICommandService private readonly commandService: ICommandService, @IInstantiationService private readonly instantiationService: IInstantiationService, @INotificationService private readonly notificationService: INotificationService, @IDialogService private readonly dialogService: IDialogService, @@ -272,6 +248,8 @@ export class UpdateContribution extends Disposable implements IGlobalActivity { this.storageService.remove('update/lastKnownVersion', StorageScope.GLOBAL); this.storageService.remove('update/updateNotificationTime', StorageScope.GLOBAL); } + + Registry.as(GlobalActivityExtensions).registerActivity(this); } private onUpdateStateChange(state: UpdateState): void { @@ -314,7 +292,7 @@ export class UpdateContribution extends Disposable implements IGlobalActivity { this.badgeDisposable.dispose(); if (badge) { - this.badgeDisposable = this.activityService.showActivity(this.id, badge, clazz); + this.badgeDisposable = this.activityService.showActivity(GLOBAL_ACTIVITY_ID, badge, clazz); } this.state = state; @@ -472,19 +450,7 @@ export class UpdateContribution extends Disposable implements IGlobalActivity { } getActions(): IAction[] { - const result: IAction[] = [ - new CommandAction(UpdateContribution.showCommandsId, nls.localize('commandPalette', "Command Palette..."), this.commandService), - new Separator(), - new CommandAction(UpdateContribution.openSettingsId, nls.localize('settings', "Settings"), this.commandService), - new CommandAction(UpdateContribution.showExtensionsId, nls.localize('showExtensions', "Extensions"), this.commandService), - new CommandAction(UpdateContribution.openKeybindingsId, nls.localize('keyboardShortcuts', "Keyboard Shortcuts"), this.commandService), - new Separator(), - new CommandAction(UpdateContribution.openUserSnippets, nls.localize('userSnippets', "User Snippets"), this.commandService), - new Separator(), - new CommandAction(UpdateContribution.selectColorThemeId, nls.localize('selectTheme.label', "Color Theme"), this.commandService), - new CommandAction(UpdateContribution.selectIconThemeId, nls.localize('themes.selectIconTheme.label', "File Icon Theme"), this.commandService) - ]; - + const result: IAction[] = []; const updateAction = this.getUpdateAction(); if (updateAction) { From 15f6609e3f971932ea941feb5d602c5f44dc711a Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 11 Jun 2019 10:26:53 -0700 Subject: [PATCH 0023/1449] Use MutableDisposable in codeLensController The `MutableDisposable` class represents a disposable value that can be changed. The class automatically disposeds of the old value when a new one is set, which can prevent a common programming mistake. `MutableDisposable` is useful in places we are currently using `private property?: IDisposable`. This change uses a `MutableDisposable` to manage the code lens model. --- src/vs/editor/contrib/codelens/codelensController.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/vs/editor/contrib/codelens/codelensController.ts b/src/vs/editor/contrib/codelens/codelensController.ts index 6859b18a275..0eb026aef3d 100644 --- a/src/vs/editor/contrib/codelens/codelensController.ts +++ b/src/vs/editor/contrib/codelens/codelensController.ts @@ -5,7 +5,7 @@ import { CancelablePromise, RunOnceScheduler, createCancelablePromise, disposableTimeout } from 'vs/base/common/async'; import { onUnexpectedError, onUnexpectedExternalError } from 'vs/base/common/errors'; -import { dispose, toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { toDisposable, DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle'; import { StableEditorScrollState } from 'vs/editor/browser/core/editorState'; import * as editorBrowser from 'vs/editor/browser/editorBrowser'; import { registerEditorContribution } from 'vs/editor/browser/editorExtensions'; @@ -29,7 +29,7 @@ export class CodeLensContribution implements editorCommon.IEditorContribution { private readonly _localToDispose = new DisposableStore(); private _lenses: CodeLensWidget[] = []; private _currentFindCodeLensSymbolsPromise: CancelablePromise | undefined; - private _currentCodeLensModel: CodeLensModel | undefined; + private readonly _currentCodeLensModel = new MutableDisposable(); private _modelChangeCounter: number = 0; private _currentResolveCodeLensSymbolsPromise: CancelablePromise | undefined; private _detectVisibleLenses: RunOnceScheduler; @@ -58,6 +58,7 @@ export class CodeLensContribution implements editorCommon.IEditorContribution { dispose(): void { this._localDispose(); this._globalToDispose.dispose(); + this._currentCodeLensModel.dispose(); } private _localDispose(): void { @@ -71,7 +72,7 @@ export class CodeLensContribution implements editorCommon.IEditorContribution { this._currentResolveCodeLensSymbolsPromise = undefined; } this._localToDispose.clear(); - dispose(this._currentCodeLensModel); + this._currentCodeLensModel.clear(); } getId(): string { @@ -132,9 +133,7 @@ export class CodeLensContribution implements editorCommon.IEditorContribution { this._currentFindCodeLensSymbolsPromise.then(result => { if (counterValue === this._modelChangeCounter) { // only the last one wins - // lifecycle -> dispose old model - dispose(this._currentCodeLensModel); - this._currentCodeLensModel = result; + this._currentCodeLensModel.value = result; // cache model to reduce flicker this._codeLensCache.put(model, result); From 298b40cd8c4b7b487fac9040d3b31a051b9487f7 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 11 Jun 2019 19:34:18 +0200 Subject: [PATCH 0024/1449] remove ref to css --- .../contrib/update/electron-browser/update.contribution.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/workbench/contrib/update/electron-browser/update.contribution.ts b/src/vs/workbench/contrib/update/electron-browser/update.contribution.ts index c06cfea72f9..e39fa57979e 100644 --- a/src/vs/workbench/contrib/update/electron-browser/update.contribution.ts +++ b/src/vs/workbench/contrib/update/electron-browser/update.contribution.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import 'vs/css!./media/update.contribution'; import 'vs/platform/update/node/update.config.contribution'; import * as platform from 'vs/base/common/platform'; import { Registry } from 'vs/platform/registry/common/platform'; From a004864bda711f2495119e346ec69591478f292b Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 11 Jun 2019 11:21:02 -0700 Subject: [PATCH 0025/1449] Finalize TerminalOptions.runInBackground API Fixes #75278 --- src/vs/vscode.d.ts | 9 +++++++++ src/vs/vscode.proposed.d.ts | 11 ----------- src/vs/workbench/api/node/extHost.api.impl.ts | 1 - 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 498d0761462..3be68c79d01 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -6988,6 +6988,15 @@ declare module 'vscode' { * must be provided as nothing will be inherited from the process or any configuration. */ strictEnv?: boolean; + + /** + * When enabled the terminal will run the process as normal but not be surfaced to the user + * until `Terminal.show` is called. The typical usage for this is when you need to run + * something that may need interactivity but only want to tell the user about it when + * interaction is needed. Note that the terminals will still be exposed to all extensions + * as normal. + */ + runInBackground?: boolean; } /** diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 317a06d6a5b..6ed53097424 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1084,17 +1084,6 @@ declare module 'vscode' { //#region Terminal - export interface TerminalOptions { - /** - * When enabled the terminal will run the process as normal but not be surfaced to the user - * until `Terminal.show` is called. The typical usage for this is when you need to run - * something that may need interactivity but only want to tell the user about it when - * interaction is needed. Note that the terminals will still be exposed to all extensions - * as normal. - */ - runInBackground?: boolean; - } - /** * An [event](#Event) which fires when a [Terminal](#Terminal)'s dimensions change. */ diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 6f3dcbb327b..9612b41ee3d 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -493,7 +493,6 @@ export function createApiFactory( }, createTerminal(nameOrOptions?: vscode.TerminalOptions | string, shellPath?: string, shellArgs?: string[] | string): vscode.Terminal { if (typeof nameOrOptions === 'object') { - nameOrOptions.runInBackground = nameOrOptions.runInBackground && extension.enableProposedApi; return extHostTerminalService.createTerminalFromOptions(nameOrOptions); } return extHostTerminalService.createTerminal(nameOrOptions, shellPath, shellArgs); From af39a4d4fbfdc9864cddddfd8101c0f90b46448a Mon Sep 17 00:00:00 2001 From: Rachel Macfarlane Date: Mon, 10 Jun 2019 15:17:32 -0700 Subject: [PATCH 0026/1449] Expose command to open settings page with online services query from gear menu and preferences menu, fixes #75215 --- .../electron-browser/extensions.contribution.ts | 2 +- .../preferences/browser/preferences.contribution.ts | 11 +++++++++++ .../contrib/update/electron-browser/update.ts | 2 ++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts index 2b5a8714886..f4153238a94 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts @@ -307,7 +307,7 @@ MenuRegistry.appendMenuItem(MenuId.MenubarPreferencesMenu, { id: VIEWLET_ID, title: localize({ key: 'miPreferencesExtensions', comment: ['&& denotes a mnemonic'] }, "&&Extensions") }, - order: 2 + order: 3 }); // View menu diff --git a/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts b/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts index dc99b95f369..4fddbe5a398 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts @@ -741,6 +741,8 @@ CommandsRegistry.registerCommand(SETTINGS_EDITOR_COMMAND_FILTER_ONLINE, serviceA const control = serviceAccessor.get(IEditorService).activeControl as SettingsEditor2; if (control instanceof SettingsEditor2) { control.focusSearch(`@tag:usesOnlineServices`); + } else { + serviceAccessor.get(IPreferencesService).openSettings(undefined, '@tag:usesOnlineServices'); } }); @@ -755,6 +757,15 @@ MenuRegistry.appendMenuItem(MenuId.MenubarPreferencesMenu, { order: 1 }); +MenuRegistry.appendMenuItem(MenuId.MenubarPreferencesMenu, { + group: '1_settings', + command: { + id: SETTINGS_EDITOR_COMMAND_FILTER_ONLINE, + title: nls.localize({ key: 'miOpenOnlineSettings', comment: ['&& denotes a mnemonic'] }, "&&Online Services Settings") + }, + order: 2 +}); + MenuRegistry.appendMenuItem(MenuId.MenubarPreferencesMenu, { group: '2_keybindings', command: { diff --git a/src/vs/workbench/contrib/update/electron-browser/update.ts b/src/vs/workbench/contrib/update/electron-browser/update.ts index 47de95dcafa..15e442322a3 100644 --- a/src/vs/workbench/contrib/update/electron-browser/update.ts +++ b/src/vs/workbench/contrib/update/electron-browser/update.ts @@ -232,6 +232,7 @@ export class UpdateContribution extends Disposable implements IGlobalActivity { private static readonly selectColorThemeId = 'workbench.action.selectTheme'; private static readonly selectIconThemeId = 'workbench.action.selectIconTheme'; private static readonly showExtensionsId = 'workbench.view.extensions'; + private static readonly showOnlineSettingsId = 'settings.filterByOnline'; get id() { return 'vs.update'; } get name() { return nls.localize('manage', "Manage"); } @@ -476,6 +477,7 @@ export class UpdateContribution extends Disposable implements IGlobalActivity { new CommandAction(UpdateContribution.showCommandsId, nls.localize('commandPalette', "Command Palette..."), this.commandService), new Separator(), new CommandAction(UpdateContribution.openSettingsId, nls.localize('settings', "Settings"), this.commandService), + new CommandAction(UpdateContribution.showOnlineSettingsId, nls.localize('onlineServices', "Online Services Settings"), this.commandService), new CommandAction(UpdateContribution.showExtensionsId, nls.localize('showExtensions', "Extensions"), this.commandService), new CommandAction(UpdateContribution.openKeybindingsId, nls.localize('keyboardShortcuts', "Keyboard Shortcuts"), this.commandService), new Separator(), From 0e38ce807c4249798d47a80216faae4e6f9cc4ef Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 11 Jun 2019 22:45:45 +0200 Subject: [PATCH 0027/1449] adopt online services settings entry --- .../electron-browser/extensions.contribution.ts | 2 +- .../preferences/browser/preferences.contribution.ts | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts index 2fd792e067e..bd10a6f004d 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts @@ -447,5 +447,5 @@ MenuRegistry.appendMenuItem(MenuId.GlobalActivity, { id: VIEWLET_ID, title: localize('showExtensions', "Extensions") }, - order: 2 + order: 3 }); \ No newline at end of file diff --git a/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts b/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts index 56cdd4a6790..145a65a6dac 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts @@ -775,6 +775,15 @@ MenuRegistry.appendMenuItem(MenuId.MenubarPreferencesMenu, { order: 2 }); +MenuRegistry.appendMenuItem(MenuId.GlobalActivity, { + group: '2_configuration', + command: { + id: SETTINGS_EDITOR_COMMAND_FILTER_ONLINE, + title: nls.localize('onlineServices', "Online Services Settings") + }, + order: 2 +}); + MenuRegistry.appendMenuItem(MenuId.MenubarPreferencesMenu, { group: '2_keybindings', command: { @@ -790,7 +799,7 @@ MenuRegistry.appendMenuItem(MenuId.GlobalActivity, { id: OpenGlobalKeybindingsAction.ID, title: nls.localize('keyboardShortcuts', "Keyboard Shortcuts") }, - order: 3 + order: 4 }); // Editor tool items From 9c14fecc877a6b6a4d9a14640ee73820c5a01076 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 11 Jun 2019 16:48:55 -0700 Subject: [PATCH 0028/1449] Prevent dispose cycles For #75304 Make sure we do not get into a loop of tyring to dispose of an object by checking `isDisposed` before calling into dispose again Also log if you try to register a disposeable on itself --- src/vs/base/common/lifecycle.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/vs/base/common/lifecycle.ts b/src/vs/base/common/lifecycle.ts index 426f0ddeb8e..0d13f5179aa 100644 --- a/src/vs/base/common/lifecycle.ts +++ b/src/vs/base/common/lifecycle.ts @@ -93,6 +93,10 @@ export class DisposableStore implements IDisposable { * Any future disposables added to this object will be disposed of on `add`. */ public dispose(): void { + if (this._isDisposed) { + return; + } + markTracked(this); this._isDisposed = true; this.clear(); @@ -110,6 +114,9 @@ export class DisposableStore implements IDisposable { if (!t) { return t; } + if ((t as any as DisposableStore) === this) { + throw new Error('Cannot register a disposable on itself!'); + } markTracked(t); if (this._isDisposed) { @@ -140,6 +147,9 @@ export abstract class Disposable implements IDisposable { } protected _register(t: T): T { + if ((t as any as Disposable) === this) { + throw new Error('Cannot register a disposable on itself!'); + } return this._store.add(t); } } From 1b95baa48b8f8c7655e84ad74aa4457601ef178b Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 11 Jun 2019 17:03:44 -0700 Subject: [PATCH 0029/1449] Use MutableDisposable for tracking current code actions --- .../contrib/codeAction/codeActionCommands.ts | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/vs/editor/contrib/codeAction/codeActionCommands.ts b/src/vs/editor/contrib/codeAction/codeActionCommands.ts index 520d3140b43..fbf4917b135 100644 --- a/src/vs/editor/contrib/codeAction/codeActionCommands.ts +++ b/src/vs/editor/contrib/codeAction/codeActionCommands.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; -import { Disposable, dispose } from 'vs/base/common/lifecycle'; +import { Disposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { escapeRegExpCharacters } from 'vs/base/common/strings'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorAction, EditorCommand, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; @@ -46,7 +46,7 @@ export class QuickFixController extends Disposable implements IEditorContributio private readonly _model: CodeActionModel; private readonly _codeActionWidget: CodeActionWidget; private readonly _lightBulbWidget: LightBulbWidget; - private _currentCodeActions: CodeActionSet | undefined; + private readonly _currentCodeActions = this._register(new MutableDisposable()); constructor( editor: ICodeEditor, @@ -81,16 +81,11 @@ export class QuickFixController extends Disposable implements IEditorContributio this._register(this._keybindingService.onDidUpdateKeybindings(this._updateLightBulbTitle, this)); } - dipose() { - super.dispose(); - dispose(this._currentCodeActions); - } private _onDidChangeCodeActionsState(newState: CodeActionsState.State): void { if (newState.type === CodeActionsState.Type.Triggered) { newState.actions.then(actions => { - dispose(this._currentCodeActions); - this._currentCodeActions = actions; + this._currentCodeActions.value = actions; if (!actions.actions.length && newState.trigger.context) { MessageController.get(this._editor).showMessage(newState.trigger.context.notAvailableMessage, newState.trigger.context.position); @@ -123,8 +118,7 @@ export class QuickFixController extends Disposable implements IEditorContributio } } } else { - dispose(this._currentCodeActions); - this._currentCodeActions = undefined; + this._currentCodeActions.clear(); this._lightBulbWidget.hide(); } } From f291714906cdcb02830b8cfe2485a3c23415b5fe Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 11 Jun 2019 17:14:21 -0700 Subject: [PATCH 0030/1449] Use undefined instead of null for IStatusbarEntryAccessor --- .../browser/parts/editor/editorStatus.ts | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/editorStatus.ts b/src/vs/workbench/browser/parts/editor/editorStatus.ts index e29c290ee0f..7050cd72b57 100644 --- a/src/vs/workbench/browser/parts/editor/editorStatus.ts +++ b/src/vs/workbench/browser/parts/editor/editorStatus.ts @@ -276,14 +276,14 @@ const nlsEOLLF = nls.localize('endOfLineLineFeed', "LF"); const nlsEOLCRLF = nls.localize('endOfLineCarriageReturnLineFeed', "CRLF"); export class EditorStatus extends Disposable implements IWorkbenchContribution { - private tabFocusModeElement: IStatusbarEntryAccessor | null = null; - private screenRedearModeElement: IStatusbarEntryAccessor | null = null; - private indentationElement: IStatusbarEntryAccessor | null = null; - private selectionElement: IStatusbarEntryAccessor | null = null; - private encodingElement: IStatusbarEntryAccessor | null = null; - private eolElement: IStatusbarEntryAccessor | null = null; - private modeElement: IStatusbarEntryAccessor | null = null; - private metadataElement: IStatusbarEntryAccessor | null = null; + private tabFocusModeElement?: IStatusbarEntryAccessor; + private screenRedearModeElement?: IStatusbarEntryAccessor; + private indentationElement?: IStatusbarEntryAccessor; + private selectionElement?: IStatusbarEntryAccessor; + private encodingElement?: IStatusbarEntryAccessor; + private eolElement?: IStatusbarEntryAccessor; + private modeElement?: IStatusbarEntryAccessor; + private metadataElement?: IStatusbarEntryAccessor; private readonly state = new State(); private readonly activeEditorListeners: IDisposable[] = []; @@ -392,7 +392,7 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution { } else { if (this.tabFocusModeElement) { this.tabFocusModeElement.dispose(); - this.tabFocusModeElement = null; + this.tabFocusModeElement = undefined; } } } @@ -409,7 +409,7 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution { } else { if (this.screenRedearModeElement) { this.screenRedearModeElement.dispose(); - this.screenRedearModeElement = null; + this.screenRedearModeElement = undefined; } } } @@ -418,7 +418,7 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution { if (!text) { if (this.selectionElement) { dispose(this.selectionElement); - this.selectionElement = null; + this.selectionElement = undefined; } return; @@ -437,7 +437,7 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution { if (!text) { if (this.indentationElement) { dispose(this.indentationElement); - this.indentationElement = null; + this.indentationElement = undefined; } return; @@ -456,7 +456,7 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution { if (!text) { if (this.encodingElement) { dispose(this.encodingElement); - this.encodingElement = null; + this.encodingElement = undefined; } return; @@ -475,7 +475,7 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution { if (!text) { if (this.eolElement) { dispose(this.eolElement); - this.eolElement = null; + this.eolElement = undefined; } return; @@ -494,7 +494,7 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution { if (!text) { if (this.modeElement) { dispose(this.modeElement); - this.modeElement = null; + this.modeElement = undefined; } return; @@ -513,7 +513,7 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution { if (!text) { if (this.metadataElement) { dispose(this.metadataElement); - this.metadataElement = null; + this.metadataElement = undefined; } return; @@ -527,7 +527,7 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution { this.metadataElement = this.updateElement(this.metadataElement, props, 'status.editor.info', nls.localize('status.editor.info', "File Information"), StatusbarAlignment.RIGHT, 100); } - private updateElement(element: IStatusbarEntryAccessor | null, props: IStatusbarEntry, id: string, name: string, alignment: StatusbarAlignment, priority: number): IStatusbarEntryAccessor | null { + private updateElement(element: IStatusbarEntryAccessor | undefined, props: IStatusbarEntry, id: string, name: string, alignment: StatusbarAlignment, priority: number): IStatusbarEntryAccessor | undefined { if (!element) { element = this.statusbarService.addEntry(props, id, name, alignment, priority); } else { From 39947c72507deb8a44de785825243b9da30a7a19 Mon Sep 17 00:00:00 2001 From: malingyan2017 <33071878+malingyan2017@users.noreply.github.com> Date: Tue, 11 Jun 2019 22:29:27 -0700 Subject: [PATCH 0031/1449] Fix Recent list in dock does not show recent files/folders #74788 (#75108) * Fix Recent list in dock does not show recent files/folders #74788 macOS only shows recent list with max number based on sytem config. It takes bottom n entries from the list added through Electron app.addRecentDocument. To match macOS dock recent list with VSCode internal recent list, this change add items into macOS recent document list in reverse order of internal recent list. * remove dock recent entries limit * add entry of folder (5) back to allow show some files * fix showsing wrong folders in recentlist * simplify adding platform RecentDocument in macOS * update based on bpasero suggestion * set max entries * rename macro --- .../electron-main/historyMainService.ts | 48 ++++++++++++++----- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/src/vs/platform/history/electron-main/historyMainService.ts b/src/vs/platform/history/electron-main/historyMainService.ts index 5116c3387d0..34c4d47857b 100644 --- a/src/vs/platform/history/electron-main/historyMainService.ts +++ b/src/vs/platform/history/electron-main/historyMainService.ts @@ -28,8 +28,9 @@ import { ILifecycleService, LifecycleMainPhase } from 'vs/platform/lifecycle/ele export class HistoryMainService implements IHistoryMainService { private static readonly MAX_TOTAL_RECENT_ENTRIES = 100; - private static readonly MAX_MACOS_DOCK_RECENT_FOLDERS = 10; - private static readonly MAX_MACOS_DOCK_RECENT_FILES = 5; + + private static readonly MAX_MACOS_DOCK_RECENT_WORKSPACES = 7; // prefer more workspaces... + private static readonly MAX_MACOS_DOCK_RECENT_ENTRIES_TOTAL = 10; // ...compared to files // Exclude some very common files from the dock/taskbar private static readonly COMMON_FILES_FILTER = [ @@ -153,37 +154,58 @@ export class HistoryMainService implements IHistoryMainService { return; } - // macOS recent documents in the dock are behaving strangely. the entries seem to get - // out of sync quickly over time. the attempted fix is to always set the list fresh - // from our MRU history data. So we clear the documents first and then set the documents - // again. + // We clear all documents first to ensure an up-to-date view on the set. Since entries + // can get deleted on disk, this ensures that the list is always valid app.clearRecentDocuments(); const mru = this.getRecentlyOpened(); - // Fill in workspaces - for (let i = 0, entries = 0; i < mru.workspaces.length && entries < HistoryMainService.MAX_MACOS_DOCK_RECENT_FOLDERS; i++) { + // Collect max-N recent workspaces that are known to exist + const workspaceEntries: string[] = []; + let entries = 0; + for (let i = 0; i < mru.workspaces.length && entries < HistoryMainService.MAX_MACOS_DOCK_RECENT_WORKSPACES; i++) { const loc = location(mru.workspaces[i]); if (loc.scheme === Schemas.file) { const workspacePath = originalFSPath(loc); if (await exists(workspacePath)) { - app.addRecentDocument(workspacePath); + workspaceEntries.push(workspacePath); entries++; } } } - // Fill in files - for (let i = 0, entries = 0; i < mru.files.length && entries < HistoryMainService.MAX_MACOS_DOCK_RECENT_FILES; i++) { + // Collect max-N recent files that are known to exist + const fileEntries: string[] = []; + for (let i = 0; i < mru.files.length && entries < HistoryMainService.MAX_MACOS_DOCK_RECENT_ENTRIES_TOTAL; i++) { const loc = location(mru.files[i]); - if (loc.scheme === Schemas.file && HistoryMainService.COMMON_FILES_FILTER.indexOf(basename(loc)) === -1) { + if (loc.scheme === Schemas.file) { const filePath = originalFSPath(loc); + if ( + HistoryMainService.COMMON_FILES_FILTER.indexOf(basename(loc)) !== -1 || // skip some well known file entries + workspaceEntries.indexOf(filePath) !== -1 // prefer a workspace entry over a file entry (e.g. for .code-workspace) + ) { + continue; + } + if (await exists(filePath)) { - app.addRecentDocument(filePath); + fileEntries.push(filePath); entries++; } } } + + // The apple guidelines (https://developer.apple.com/design/human-interface-guidelines/macos/menus/menu-anatomy/) + // explain that most recent entries should appear close to the interaction by the user (e.g. close to the + // mouse click). Most native macOS applications that add recent documents to the dock, show the most recent document + // to the bottom (because the dock menu is not appearing from top to bottom, but from the bottom to the top). As such + // we fill in the entries in reverse order so that the most recent shows up at the bottom of the menu. + // + // On top of that, the maximum number of documents can be configured by the user (defaults to 10). To ensure that + // we are not failing to show the most recent entries, we start by adding files first (in reverse order of recency) + // and then add folders (in reverse order of recency). Given that strategy, we can ensure that the most recent + // N folders are always appearing, even if the limit is low (https://github.com/microsoft/vscode/issues/74788) + fileEntries.reverse().forEach(fileEntry => app.addRecentDocument(fileEntry)); + workspaceEntries.reverse().forEach(workspaceEntry => app.addRecentDocument(workspaceEntry)); } clearRecentlyOpened(): void { From 8de74d9255924d999e22963c1c57befe25366776 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 11 Jun 2019 22:37:58 -0700 Subject: [PATCH 0032/1449] Extracting common webview elements Minimizing diff with the iframe based webview branch --- .../src/features/previewContentProvider.ts | 6 +- .../contrib/webview/browser/pre/main.js | 34 +++++++--- .../contrib/webview/common/mimeTypes.ts | 26 ++++++++ .../contrib/webview/common/themeing.ts | 63 +++++++++++++++++++ .../contrib/webview/common/webview.ts | 6 +- .../electron-browser/pre/electron-index.js | 3 +- .../electron-browser/webviewElement.ts | 55 ++-------------- .../electron-browser/webviewProtocols.ts | 29 ++------- 8 files changed, 134 insertions(+), 88 deletions(-) create mode 100644 src/vs/workbench/contrib/webview/common/mimeTypes.ts create mode 100644 src/vs/workbench/contrib/webview/common/themeing.ts diff --git a/extensions/markdown-language-features/src/features/previewContentProvider.ts b/extensions/markdown-language-features/src/features/previewContentProvider.ts index ced0a148f27..486ce5d9db7 100644 --- a/extensions/markdown-language-features/src/features/previewContentProvider.ts +++ b/extensions/markdown-language-features/src/features/previewContentProvider.ts @@ -197,17 +197,17 @@ export class MarkdownContentProvider { private getCspForResource(resource: vscode.Uri, nonce: string): string { switch (this.cspArbiter.getSecurityLevelForResource(resource)) { case MarkdownPreviewSecurityLevel.AllowInsecureContent: - return ``; + return ``; case MarkdownPreviewSecurityLevel.AllowInsecureLocalContent: - return ``; + return ``; case MarkdownPreviewSecurityLevel.AllowScriptsAndAllContent: return ''; case MarkdownPreviewSecurityLevel.Strict: default: - return ``; + return ``; } } } diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index 2afb9ea3125..85dd7a6dbc4 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -94,13 +94,19 @@ const defaultCssRules = ` }`; /** - * @typedef {{ postMessage: (channel: string, data?: any) => void, onMessage: (channel: string, handler: any) => void }} HostCommunications + * @typedef {{ + * postMessage: (channel: string, data?: any) => void, + * onMessage: (channel: string, handler: any) => void, + * injectHtml?: (document: HTMLDocument) => void, + * preProcessHtml?: (text: string) => void, + * focusIframeOnCreate?: boolean + * }} HostCommunications */ /** * @param {HostCommunications} host */ -module.exports = function createWebviewManager(host) { +function createWebviewManager(host) { // state let firstLoad = true; let loadTimeout; @@ -212,9 +218,9 @@ module.exports = function createWebviewManager(host) { return; } - host.onMessage('styles', (_event, variables, activeTheme) => { - initData.styles = variables; - initData.activeTheme = activeTheme; + host.onMessage('styles', (_event, data) => { + initData.styles = data.styles; + initData.activeTheme = data.activeTheme; const target = getActiveFrame(); if (!target) { @@ -238,7 +244,7 @@ module.exports = function createWebviewManager(host) { host.onMessage('content', (_event, data) => { const options = data.options; - const text = data.contents; + const text = host.preProcessHtml ? host.preProcessHtml(data.contents) : data.contents; const newDocument = new DOMParser().parseFromString(text, 'text/html'); newDocument.querySelectorAll('a').forEach(a => { @@ -293,6 +299,10 @@ module.exports = function createWebviewManager(host) { applyStyles(newDocument, newDocument.body); + if (host.injectHtml) { + host.injectHtml(newDocument); + } + const frame = getActiveFrame(); const wasFirstLoad = firstLoad; // keep current scrollY around and use later @@ -372,7 +382,9 @@ module.exports = function createWebviewManager(host) { applyStyles(newFrame.contentDocument, newFrame.contentDocument.body); newFrame.setAttribute('id', 'active-frame'); newFrame.style.visibility = 'visible'; - newFrame.contentWindow.focus(); + if (host.focusIframeOnCreate) { + newFrame.contentWindow.focus(); + } contentWindow.addEventListener('scroll', handleInnerScroll); @@ -441,6 +453,10 @@ module.exports = function createWebviewManager(host) { window.onmessage = onMessage; // signal ready - host.postMessage('webview-ready', process.pid); + host.postMessage('webview-ready', {}); }); -}; +} + +if (typeof module !== 'undefined') { + module.exports = createWebviewManager; +} \ No newline at end of file diff --git a/src/vs/workbench/contrib/webview/common/mimeTypes.ts b/src/vs/workbench/contrib/webview/common/mimeTypes.ts new file mode 100644 index 00000000000..a34d61f10b3 --- /dev/null +++ b/src/vs/workbench/contrib/webview/common/mimeTypes.ts @@ -0,0 +1,26 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { getMediaMime, MIME_UNKNOWN } from 'vs/base/common/mime'; +import { extname } from 'vs/base/common/path'; +import { URI } from 'vs/base/common/uri'; + +const webviewMimeTypes = { + '.svg': 'image/svg+xml', + '.txt': 'text/plain', + '.css': 'text/css', + '.js': 'application/javascript', + '.json': 'application/json', + '.html': 'text/html', + '.htm': 'text/html', + '.xhtml': 'application/xhtml+xml', + '.oft': 'font/otf', + '.xml': 'application/xml', +}; + +export function getWebviewContentMimeType(normalizedPath: URI): string { + const ext = extname(normalizedPath.fsPath).toLowerCase(); + return webviewMimeTypes[ext] || getMediaMime(normalizedPath.fsPath) || MIME_UNKNOWN; +} diff --git a/src/vs/workbench/contrib/webview/common/themeing.ts b/src/vs/workbench/contrib/webview/common/themeing.ts new file mode 100644 index 00000000000..5f0649247a8 --- /dev/null +++ b/src/vs/workbench/contrib/webview/common/themeing.ts @@ -0,0 +1,63 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { EDITOR_FONT_DEFAULTS, IEditorOptions } from 'vs/editor/common/config/editorOptions'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import * as colorRegistry from 'vs/platform/theme/common/colorRegistry'; +import { ITheme, LIGHT, DARK } from 'vs/platform/theme/common/themeService'; + +interface WebviewThemeData { + readonly activeTheme: string; + readonly styles: { readonly [key: string]: string | number }; +} + +export function getWebviewThemeData( + theme: ITheme, + configurationService: IConfigurationService +): WebviewThemeData { + const configuration = configurationService.getValue('editor'); + const editorFontFamily = configuration.fontFamily || EDITOR_FONT_DEFAULTS.fontFamily; + const editorFontWeight = configuration.fontWeight || EDITOR_FONT_DEFAULTS.fontWeight; + const editorFontSize = configuration.fontSize || EDITOR_FONT_DEFAULTS.fontSize; + + const exportedColors = colorRegistry.getColorRegistry().getColors().reduce((colors, entry) => { + const color = theme.getColor(entry.id); + if (color) { + colors['vscode-' + entry.id.replace('.', '-')] = color.toString(); + } + return colors; + }, {} as { [key: string]: string }); + + const styles = { + 'vscode-font-family': '-apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", ans-serif', + 'vscode-font-weight': 'normal', + 'vscode-font-size': '13px', + 'vscode-editor-font-family': editorFontFamily, + 'vscode-editor-font-weight': editorFontWeight, + 'vscode-editor-font-size': editorFontSize, + ...exportedColors + }; + + const activeTheme = ApiThemeClassName.fromTheme(theme); + return { styles, activeTheme }; +} + +enum ApiThemeClassName { + light = 'vscode-light', + dark = 'vscode-dark', + highContrast = 'vscode-high-contrast' +} + +namespace ApiThemeClassName { + export function fromTheme(theme: ITheme): ApiThemeClassName { + if (theme.type === LIGHT) { + return ApiThemeClassName.light; + } else if (theme.type === DARK) { + return ApiThemeClassName.dark; + } else { + return ApiThemeClassName.highContrast; + } + } +} \ No newline at end of file diff --git a/src/vs/workbench/contrib/webview/common/webview.ts b/src/vs/workbench/contrib/webview/common/webview.ts index 7aecb55b0af..dd99355dcb4 100644 --- a/src/vs/workbench/contrib/webview/common/webview.ts +++ b/src/vs/workbench/contrib/webview/common/webview.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { Event } from 'vs/base/common/event'; +import { IDisposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; +import * as modes from 'vs/editor/common/modes'; +import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; -import * as modes from 'vs/editor/common/modes'; -import { IDisposable } from 'vs/base/common/lifecycle'; /** * Set when the find widget in a webview is visible. diff --git a/src/vs/workbench/contrib/webview/electron-browser/pre/electron-index.js b/src/vs/workbench/contrib/webview/electron-browser/pre/electron-index.js index 21e15e0eedd..4762aa24c4b 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/pre/electron-index.js +++ b/src/vs/workbench/contrib/webview/electron-browser/pre/electron-index.js @@ -34,7 +34,8 @@ }, onMessage: (channel, handler) => { ipcRenderer.on(channel, handler); - } + }, + focusIframeOnCreate: true }); document.addEventListener('DOMContentLoaded', () => { diff --git a/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts index 148b2cb8300..b7838d14377 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts @@ -11,7 +11,6 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { isMacintosh } from 'vs/base/common/platform'; import { endsWith } from 'vs/base/common/strings'; import { URI } from 'vs/base/common/uri'; -import { EDITOR_FONT_DEFAULTS, IEditorOptions } from 'vs/editor/common/config/editorOptions'; import * as modes from 'vs/editor/common/modes'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -21,12 +20,12 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; import { ITunnelService, RemoteTunnel } from 'vs/platform/remote/common/tunnel'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import * as colorRegistry from 'vs/platform/theme/common/colorRegistry'; -import { DARK, ITheme, IThemeService, LIGHT } from 'vs/platform/theme/common/themeService'; +import { ITheme, IThemeService } from 'vs/platform/theme/common/themeService'; import { Webview, WebviewContentOptions, WebviewOptions } from 'vs/workbench/contrib/webview/common/webview'; import { registerFileProtocol, WebviewProtocol } from 'vs/workbench/contrib/webview/electron-browser/webviewProtocols'; import { areWebviewInputOptionsEqual } from '../browser/webviewEditorService'; import { WebviewFindWidget } from '../browser/webviewFindWidget'; +import { getWebviewThemeData } from 'vs/workbench/contrib/webview/common/themeing'; export interface WebviewPortMapping { readonly port: number; @@ -554,11 +553,11 @@ export class WebviewElement extends Disposable implements Webview { private readonly _onMessage = this._register(new Emitter()); public readonly onMessage = this._onMessage.event; - private _send(channel: string, ...args: any[]): void { + private _send(channel: string, data?: any): void { this._ready .then(() => { if (this._webview) { - this._webview.send(channel, ...args); + this._webview.send(channel, data); } }) .catch(err => console.error(err)); @@ -647,31 +646,8 @@ export class WebviewElement extends Disposable implements Webview { } private style(theme: ITheme): void { - const configuration = this._configurationService.getValue('editor'); - const editorFontFamily = configuration.fontFamily || EDITOR_FONT_DEFAULTS.fontFamily; - const editorFontWeight = configuration.fontWeight || EDITOR_FONT_DEFAULTS.fontWeight; - const editorFontSize = configuration.fontSize || EDITOR_FONT_DEFAULTS.fontSize; - - const exportedColors = colorRegistry.getColorRegistry().getColors().reduce((colors, entry) => { - const color = theme.getColor(entry.id); - if (color) { - colors['vscode-' + entry.id.replace('.', '-')] = color.toString(); - } - return colors; - }, {} as { [key: string]: string }); - - const styles = { - 'vscode-font-family': '-apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif', - 'vscode-font-weight': 'normal', - 'vscode-font-size': '13px', - 'vscode-editor-font-family': editorFontFamily, - 'vscode-editor-font-weight': editorFontWeight, - 'vscode-editor-font-size': editorFontSize, - ...exportedColors - }; - - const activeTheme = ApiThemeClassName.fromTheme(theme); - this._send('styles', styles, activeTheme); + const { styles, activeTheme } = getWebviewThemeData(theme, this._configurationService); + this._send('styles', { styles, activeTheme }); if (this._webviewFindWidget) { this._webviewFindWidget.updateTheme(theme); @@ -805,22 +781,3 @@ export class WebviewElement extends Disposable implements Webview { } } } - - -enum ApiThemeClassName { - light = 'vscode-light', - dark = 'vscode-dark', - highContrast = 'vscode-high-contrast' -} - -namespace ApiThemeClassName { - export function fromTheme(theme: ITheme): ApiThemeClassName { - if (theme.type === LIGHT) { - return ApiThemeClassName.light; - } else if (theme.type === DARK) { - return ApiThemeClassName.dark; - } else { - return ApiThemeClassName.highContrast; - } - } -} diff --git a/src/vs/workbench/contrib/webview/electron-browser/webviewProtocols.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewProtocols.ts index bacc9da1e70..2d54b962046 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webviewProtocols.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewProtocols.ts @@ -2,13 +2,13 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { getMediaMime, MIME_UNKNOWN } from 'vs/base/common/mime'; -import { extname, sep } from 'vs/base/common/path'; +import * as electron from 'electron'; +import { sep } from 'vs/base/common/path'; import { startsWith } from 'vs/base/common/strings'; import { URI } from 'vs/base/common/uri'; -import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; import { IFileService } from 'vs/platform/files/common/files'; -import * as electron from 'electron'; +import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; +import { getWebviewContentMimeType } from 'vs/workbench/contrib/webview/common/mimeTypes'; type BufferProtocolCallback = (buffer?: Buffer | electron.MimeTypedBuffer | { error: number }) => void; @@ -54,10 +54,10 @@ export function registerFileProtocol( requestResourcePath: requestUri.path }) }); - resolveContent(fileService, redirectedUri, getMimeType(requestUri), callback); + resolveContent(fileService, redirectedUri, getWebviewContentMimeType(requestUri), callback); return; } else { - resolveContent(fileService, normalizedPath, getMimeType(normalizedPath), callback); + resolveContent(fileService, normalizedPath, getWebviewContentMimeType(normalizedPath), callback); return; } } @@ -70,20 +70,3 @@ export function registerFileProtocol( }); } -const webviewMimeTypes = { - '.svg': 'image/svg+xml', - '.txt': 'text/plain', - '.css': 'text/css', - '.js': 'application/javascript', - '.json': 'application/json', - '.html': 'text/html', - '.htm': 'text/html', - '.xhtml': 'application/xhtml+xml', - '.oft': 'font/otf', - '.xml': 'application/xml', -}; - -function getMimeType(normalizedPath: URI): string { - const ext = extname(normalizedPath.fsPath).toLowerCase(); - return webviewMimeTypes[ext] || getMediaMime(normalizedPath.fsPath) || MIME_UNKNOWN; -} From 2241c0f849cb6bf5e4a0f3615198b1a5c7c20718 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 12 Jun 2019 08:35:44 +0200 Subject: [PATCH 0033/1449] Adopt update actions to use globalActivity menuId --- .../parts/activitybar/activitybarActions.ts | 10 +- src/vs/workbench/common/activity.ts | 31 +---- .../contrib/update/electron-browser/update.ts | 126 +++++++++++------- 3 files changed, 83 insertions(+), 84 deletions(-) diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts index 3caf51631f8..6565a5e0df3 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts @@ -21,14 +21,13 @@ import { ICssStyleCollector, ITheme, IThemeService, registerThemingParticipant } import { ActivityAction, ActivityActionViewItem, ICompositeBar, ICompositeBarColors, ToggleCompositePinnedAction } from 'vs/workbench/browser/parts/compositeBarActions'; import { ViewletDescriptor } from 'vs/workbench/browser/viewlet'; import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; -import { IActivity, IGlobalActivityRegistry, GlobalActivityActionsExtensions } from 'vs/workbench/common/activity'; +import { IActivity } from 'vs/workbench/common/activity'; import { ACTIVITY_BAR_FOREGROUND } from 'vs/workbench/common/theme'; import { IActivityBarService } from 'vs/workbench/services/activityBar/browser/activityBarService'; import { IWorkbenchLayoutService, Parts } from 'vs/workbench/services/layout/browser/layoutService'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { fillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; -import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; export class ViewletActivityAction extends ActivityAction { @@ -150,13 +149,6 @@ export class GlobalActivityActionViewItem extends ActivityActionViewItem { const globalActivityMenu = this.menuService.createMenu(MenuId.GlobalActivity, this.contextKeyService); fillInActionBarActions(globalActivityMenu, undefined, { primary: [], secondary: globalActivityActions }); - for (const activity of Registry.as(GlobalActivityActionsExtensions).getActivities()) { - const actions = activity.getActions(); - if (actions.length) { - globalActivityActions.push(new Separator(), ...actions); - } - } - const containerPosition = DOM.getDomNodePagePosition(this.container); const location = { x: containerPosition.left + containerPosition.width / 2, y: containerPosition.top }; this.contextMenuService.showContextMenu({ diff --git a/src/vs/workbench/common/activity.ts b/src/vs/workbench/common/activity.ts index 2f5cd6c9957..513894f2cea 100644 --- a/src/vs/workbench/common/activity.ts +++ b/src/vs/workbench/common/activity.ts @@ -3,9 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Registry } from 'vs/platform/registry/common/platform'; -import { IAction } from 'vs/base/common/actions'; - export interface IActivity { id: string; name: string; @@ -13,30 +10,4 @@ export interface IActivity { cssClass?: string; } -export interface IGlobalActivity { - getActions(): IAction[]; -} - -export const GLOBAL_ACTIVITY_ID = 'workbench.action.globalActivity'; - -export const GlobalActivityActionsExtensions = 'workbench.contributions.globalActivityActions'; - -export interface IGlobalActivityRegistry { - registerActivity(activity: IGlobalActivity): void; - getActivities(): IGlobalActivity[]; -} - -export class GlobalActivityRegistry implements IGlobalActivityRegistry { - - private readonly activities: IGlobalActivity[] = []; - - registerActivity(activity: IGlobalActivity): void { - this.activities.push(activity); - } - - getActivities(): IGlobalActivity[] { - return [...this.activities]; - } -} - -Registry.add(GlobalActivityActionsExtensions, new GlobalActivityRegistry()); \ No newline at end of file +export const GLOBAL_ACTIVITY_ID = 'workbench.action.globalActivity'; \ No newline at end of file diff --git a/src/vs/workbench/contrib/update/electron-browser/update.ts b/src/vs/workbench/contrib/update/electron-browser/update.ts index e398545df58..c2b715f6042 100644 --- a/src/vs/workbench/contrib/update/electron-browser/update.ts +++ b/src/vs/workbench/contrib/update/electron-browser/update.ts @@ -5,15 +5,14 @@ import * as nls from 'vs/nls'; import severity from 'vs/base/common/severity'; -import { IAction, Action } from 'vs/base/common/actions'; +import { Action } from 'vs/base/common/actions'; import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; -import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; import pkg from 'vs/platform/product/node/package'; import product from 'vs/platform/product/node/product'; import { URI } from 'vs/base/common/uri'; import { IActivityService, NumberBadge, IBadge, ProgressBadge } from 'vs/workbench/services/activity/common/activity'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IGlobalActivity, GLOBAL_ACTIVITY_ID, IGlobalActivityRegistry, GlobalActivityActionsExtensions as GlobalActivityExtensions } from 'vs/workbench/common/activity'; +import { GLOBAL_ACTIVITY_ID } from 'vs/workbench/common/activity'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; @@ -26,7 +25,11 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/ import { ReleaseNotesManager } from './releaseNotesEditor'; import { isWindows } from 'vs/base/common/platform'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { Registry } from 'vs/platform/registry/common/platform'; +import { RawContextKey, IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; +import { CommandsRegistry } from 'vs/platform/commands/common/commands'; + +export const CONTEXT_UPDATE_STATE = new RawContextKey('updateStateContext', ''); let releaseNotesManager: ReleaseNotesManager | undefined = undefined; @@ -212,10 +215,11 @@ export class Win3264BitContribution implements IWorkbenchContribution { } } -export class UpdateContribution extends Disposable implements IGlobalActivity { +export class UpdateContribution extends Disposable { private state: UpdateState; private badgeDisposable: IDisposable = Disposable.None; + private updateStateContextKey: IContextKey; constructor( @IStorageService private readonly storageService: IStorageService, @@ -224,10 +228,12 @@ export class UpdateContribution extends Disposable implements IGlobalActivity { @IDialogService private readonly dialogService: IDialogService, @IUpdateService private readonly updateService: IUpdateService, @IActivityService private readonly activityService: IActivityService, - @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService + @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, + @IContextKeyService private readonly contextKeyService: IContextKeyService ) { super(); this.state = updateService.state; + this.updateStateContextKey = CONTEXT_UPDATE_STATE.bindTo(this.contextKeyService); this._register(updateService.onStateChange(this.onUpdateStateChange, this)); this.onUpdateStateChange(this.updateService.state); @@ -249,10 +255,11 @@ export class UpdateContribution extends Disposable implements IGlobalActivity { this.storageService.remove('update/updateNotificationTime', StorageScope.GLOBAL); } - Registry.as(GlobalActivityExtensions).registerActivity(this); + this.registerGlobalActivityActions(); } private onUpdateStateChange(state: UpdateState): void { + this.updateStateContextKey.set(state.type); switch (state.type) { case StateType.Idle: if (state.error) { @@ -449,49 +456,78 @@ export class UpdateContribution extends Disposable implements IGlobalActivity { return diffDays > 5; } - getActions(): IAction[] { - const result: IAction[] = []; - const updateAction = this.getUpdateAction(); + private registerGlobalActivityActions(): void { + CommandsRegistry.registerCommand('update.check', () => this.updateService.checkForUpdates({ windowId: this.environmentService.configuration.windowId })); + MenuRegistry.appendMenuItem(MenuId.GlobalActivity, { + group: '5_update', + command: { + id: 'update.check', + title: nls.localize('checkForUpdates', "Check for Updates...") + }, + when: CONTEXT_UPDATE_STATE.isEqualTo(StateType.Idle), + }); - if (updateAction) { - result.push(new Separator(), updateAction); - } + CommandsRegistry.registerCommand('update.checking', () => { }); + MenuRegistry.appendMenuItem(MenuId.GlobalActivity, { + group: '5_update', + command: { + id: 'update.checking', + title: nls.localize('checkingForUpdates', "Checking For Updates..."), + precondition: CONTEXT_UPDATE_STATE.isEqualTo('') + }, + when: CONTEXT_UPDATE_STATE.isEqualTo(StateType.CheckingForUpdates), + }); - return result; - } + CommandsRegistry.registerCommand('update.downloadNow', () => this.updateService.downloadUpdate()); + MenuRegistry.appendMenuItem(MenuId.GlobalActivity, { + group: '5_update', + command: { + id: 'update.downloadNow', + title: nls.localize('download now', "Download Now") + }, + when: CONTEXT_UPDATE_STATE.isEqualTo(StateType.AvailableForDownload), + }); - private getUpdateAction(): IAction | null { - const state = this.updateService.state; + CommandsRegistry.registerCommand('update.downloading', () => { }); + MenuRegistry.appendMenuItem(MenuId.GlobalActivity, { + group: '5_update', + command: { + id: 'update.downloading', + title: nls.localize('DownloadingUpdate', "Downloading Update..."), + precondition: CONTEXT_UPDATE_STATE.isEqualTo('') + }, + when: CONTEXT_UPDATE_STATE.isEqualTo(StateType.Downloading), + }); - switch (state.type) { - case StateType.Uninitialized: - return null; + CommandsRegistry.registerCommand('update.install', () => this.updateService.applyUpdate()); + MenuRegistry.appendMenuItem(MenuId.GlobalActivity, { + group: '5_update', + command: { + id: 'update.install', + title: nls.localize('installUpdate...', "Install Update...") + }, + when: CONTEXT_UPDATE_STATE.isEqualTo(StateType.Downloaded), + }); - case StateType.Idle: - const windowId = this.environmentService.configuration.windowId; - return new Action('update.check', nls.localize('checkForUpdates', "Check for Updates..."), undefined, true, () => - this.updateService.checkForUpdates({ windowId })); + CommandsRegistry.registerCommand('update.updating', () => { }); + MenuRegistry.appendMenuItem(MenuId.GlobalActivity, { + group: '5_update', + command: { + id: 'update.updating', + title: nls.localize('installingUpdate', "Installing Update..."), + precondition: CONTEXT_UPDATE_STATE.isEqualTo('') + }, + when: CONTEXT_UPDATE_STATE.isEqualTo(StateType.Updating), + }); - case StateType.CheckingForUpdates: - return new Action('update.checking', nls.localize('checkingForUpdates', "Checking For Updates..."), undefined, false); - - case StateType.AvailableForDownload: - return new Action('update.downloadNow', nls.localize('download now', "Download Now"), undefined, true, () => - this.updateService.downloadUpdate()); - - case StateType.Downloading: - return new Action('update.downloading', nls.localize('DownloadingUpdate', "Downloading Update..."), undefined, false); - - case StateType.Downloaded: - return new Action('update.install', nls.localize('installUpdate...', "Install Update..."), undefined, true, () => - this.updateService.applyUpdate()); - - case StateType.Updating: - return new Action('update.updating', nls.localize('installingUpdate', "Installing Update..."), undefined, false); - - case StateType.Ready: - return new Action('update.restart', nls.localize('restartToUpdate', "Restart to Update"), undefined, true, () => - this.updateService.quitAndInstall()); - } + CommandsRegistry.registerCommand('update.restart', () => this.updateService.quitAndInstall()); + MenuRegistry.appendMenuItem(MenuId.GlobalActivity, { + group: '5_update', + command: { + id: 'update.restart', + title: nls.localize('restartToUpdate', "Restart to Update") + }, + when: CONTEXT_UPDATE_STATE.isEqualTo(StateType.Ready), + }); } } From 8a71ad8a105a8905f18bf3470308297de3bfdd7f Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 12 Jun 2019 08:38:14 +0200 Subject: [PATCH 0034/1449] add implements IWorkbenchContribution --- src/vs/workbench/contrib/update/electron-browser/update.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/update/electron-browser/update.ts b/src/vs/workbench/contrib/update/electron-browser/update.ts index c2b715f6042..3d4c0c225d8 100644 --- a/src/vs/workbench/contrib/update/electron-browser/update.ts +++ b/src/vs/workbench/contrib/update/electron-browser/update.ts @@ -215,7 +215,7 @@ export class Win3264BitContribution implements IWorkbenchContribution { } } -export class UpdateContribution extends Disposable { +export class UpdateContribution extends Disposable implements IWorkbenchContribution { private state: UpdateState; private badgeDisposable: IDisposable = Disposable.None; From 13d0dad699bfc4e4529ece16dd577be98945fce1 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 6 Jun 2019 15:57:21 +0200 Subject: [PATCH 0035/1449] fix #41085 --- extensions/git/src/git.ts | 12 ++++++++--- extensions/git/src/model.ts | 5 +++-- extensions/git/src/repository.ts | 37 ++++++++++++++++---------------- 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index ea3e22eec82..17bd42125ce 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -329,8 +329,8 @@ export class Git { this.env = options.env || {}; } - open(repository: string): Repository { - return new Repository(this, repository); + open(repository: string, dotGit: string): Repository { + return new Repository(this, repository, dotGit); } async init(repository: string): Promise { @@ -370,6 +370,11 @@ export class Git { return path.normalize(result.stdout.trim()); } + async getRepositoryDotGit(repositoryPath: string): Promise { + const result = await this.exec(repositoryPath, ['rev-parse', '--absolute-git-dir']); + return path.normalize(result.stdout.trim()); + } + async exec(cwd: string, args: string[], options: SpawnOptions = {}): Promise> { options = assign({ cwd }, options || {}); return await this._exec(args, options); @@ -649,7 +654,8 @@ export class Repository { constructor( private _git: Git, - private repositoryRoot: string + private repositoryRoot: string, + readonly dotGit: string ) { } get git(): Git { diff --git a/extensions/git/src/model.ts b/extensions/git/src/model.ts index 22c690a5dfd..2c9085b6820 100644 --- a/extensions/git/src/model.ts +++ b/extensions/git/src/model.ts @@ -78,7 +78,7 @@ export class Model { this.disposables.push(fsWatcher); const onWorkspaceChange = anyEvent(fsWatcher.onDidChange, fsWatcher.onDidCreate, fsWatcher.onDidDelete); - const onGitRepositoryChange = filterEvent(onWorkspaceChange, uri => /\/\.git\//.test(uri.path)); + const onGitRepositoryChange = filterEvent(onWorkspaceChange, uri => /\/\.git/.test(uri.path)); const onPossibleGitRepositoryChange = filterEvent(onGitRepositoryChange, uri => !this.getRepository(uri)); onPossibleGitRepositoryChange(this.onPossibleGitRepositoryChange, this, this.disposables); @@ -232,7 +232,8 @@ export class Model { return; } - const repository = new Repository(this.git.open(repositoryRoot), this.globalState); + const dotGit = await this.git.getRepositoryDotGit(repositoryRoot); + const repository = new Repository(this.git.open(repositoryRoot, dotGit), this.globalState); this.open(repository); } catch (err) { diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index 33106400301..d0536c607f8 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -5,7 +5,7 @@ import { commands, Uri, Command, EventEmitter, Event, scm, SourceControl, SourceControlInputBox, SourceControlResourceGroup, SourceControlResourceState, SourceControlResourceDecorations, SourceControlInputBoxValidation, Disposable, ProgressLocation, window, workspace, WorkspaceEdit, ThemeColor, DecorationData, Memento, SourceControlInputBoxValidationType } from 'vscode'; import { Repository as BaseRepository, Commit, Stash, GitError, Submodule, CommitOptions, ForcePushMode } from './git'; -import { anyEvent, filterEvent, eventToPromise, dispose, find, isDescendant, IDisposable, onceEvent, EmptyDisposable, debounceEvent } from './util'; +import { anyEvent, filterEvent, eventToPromise, dispose, find, isDescendant, IDisposable, onceEvent, EmptyDisposable, debounceEvent, toDisposable } from './util'; import { memoize, throttle, debounce } from './decorators'; import { toGitUri } from './uri'; import { AutoFetcher } from './autofetch'; @@ -553,27 +553,28 @@ export class Repository implements Disposable { private readonly repository: BaseRepository, globalState: Memento ) { - const fsWatcher = workspace.createFileSystemWatcher('**'); - this.disposables.push(fsWatcher); + const workspaceWatcher = workspace.createFileSystemWatcher('**'); + this.disposables.push(workspaceWatcher); - const workspaceFilter = (uri: Uri) => isDescendant(repository.root, uri.fsPath); - const onWorkspaceDelete = filterEvent(fsWatcher.onDidDelete, workspaceFilter); - const onWorkspaceChange = filterEvent(anyEvent(fsWatcher.onDidChange, fsWatcher.onDidCreate), workspaceFilter); - const onRepositoryDotGitDelete = filterEvent(onWorkspaceDelete, uri => /\/\.git$/.test(uri.path)); - const onRepositoryChange = anyEvent(onWorkspaceDelete, onWorkspaceChange); + const onWorkspaceFileChanges = anyEvent(workspaceWatcher.onDidChange, workspaceWatcher.onDidCreate, workspaceWatcher.onDidDelete); + const onWorkspaceRepositoryFileChanges = filterEvent(onWorkspaceFileChanges, uri => isDescendant(repository.root, uri.fsPath)); + const onWorkspaceWorkingTreeFileChanges = filterEvent(onWorkspaceRepositoryFileChanges, uri => !/\/\.git($|\/)/.test(uri.path)); - // relevant repository changes are: - // - DELETE .git folder - // - ANY CHANGE within .git folder except .git itself and .git/index.lock - const onRelevantRepositoryChange = anyEvent( - onRepositoryDotGitDelete, - filterEvent(onRepositoryChange, uri => !/\/\.git(\/index\.lock)?$/.test(uri.path)) - ); + const dotGitWatcher = fs.watch(repository.dotGit); + const onRepositoryFileEmitter = new EventEmitter(); + dotGitWatcher.on('change', (_, e) => onRepositoryFileEmitter.fire(Uri.file(path.join(repository.dotGit, e as string)))); + dotGitWatcher.on('error', err => console.error(err)); + this.disposables.push(toDisposable(() => dotGitWatcher.close())); + const onRelevantRepositoryChanges = filterEvent(onRepositoryFileEmitter.event, uri => !/\/\.git(\/index\.lock)?$/.test(uri.path)); - onRelevantRepositoryChange(this.onFSChange, this, this.disposables); + // FS changes should trigger `git status`: + // - any change inside the repository working tree + // - any change whithin the first level of the `.git` folder, except the folder itself and `index.lock` + const onFSChange = anyEvent(onWorkspaceWorkingTreeFileChanges, onRelevantRepositoryChanges); + onFSChange(this.onFSChange, this, this.disposables); - const onRelevantGitChange = filterEvent(onRelevantRepositoryChange, uri => /\/\.git\//.test(uri.path)); - onRelevantGitChange(this._onDidChangeRepository.fire, this._onDidChangeRepository, this.disposables); + // Relevate repository changes should trigger virtual document change events + onRelevantRepositoryChanges(this._onDidChangeRepository.fire, this._onDidChangeRepository, this.disposables); const root = Uri.file(repository.root); this._sourceControl = scm.createSourceControl('git', 'Git', root); From 8af1f7ebe87f9782acff32cb2ccd6fc1a93abe80 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 12 Jun 2019 10:42:30 +0200 Subject: [PATCH 0036/1449] no breadcrumbs for untitled files, #74924 --- src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts index d58ac5af289..21cae306f4e 100644 --- a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts +++ b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts @@ -11,7 +11,6 @@ import { tail } from 'vs/base/common/arrays'; import { timeout } from 'vs/base/common/async'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { combinedDisposable, dispose, IDisposable } from 'vs/base/common/lifecycle'; -import { Schemas } from 'vs/base/common/network'; import { isEqual } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import 'vs/css!./media/breadcrumbscontrol'; @@ -224,7 +223,7 @@ export class BreadcrumbsControl { input = input.master; } - if (!input || !input.getResource() || (input.getResource()!.scheme !== Schemas.untitled && !this._fileService.canHandleResource(input.getResource()!))) { + if (!input || !input.getResource() || !this._fileService.canHandleResource(input.getResource()!)) { // cleanup and return when there is no input or when // we cannot handle this input this._ckBreadcrumbsPossible.set(false); From 4a3c056e9a56e45bee19cff400f4891e2fb89774 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 12 Jun 2019 11:06:54 +0200 Subject: [PATCH 0037/1449] use --follow-tags instead of --tags when pushing fixes #70081 fixes #75240 --- extensions/git/package.json | 4 ++-- extensions/git/package.nls.json | 4 ++-- extensions/git/src/commands.ts | 16 +++++++--------- extensions/git/src/git.ts | 2 +- extensions/git/src/repository.ts | 2 +- 5 files changed, 13 insertions(+), 15 deletions(-) diff --git a/extensions/git/package.json b/extensions/git/package.json index 2debe889d38..f85fd49c1d7 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -319,12 +319,12 @@ }, { "command": "git.pushWithTags", - "title": "%command.pushWithTags%", + "title": "%command.pushFollowTags%", "category": "Git" }, { "command": "git.pushWithTagsForce", - "title": "%command.pushWithTagsForce%", + "title": "%command.pushFollowTagsForce%", "category": "Git" }, { diff --git a/extensions/git/package.nls.json b/extensions/git/package.nls.json index 90f3d824999..302be3844d5 100644 --- a/extensions/git/package.nls.json +++ b/extensions/git/package.nls.json @@ -47,8 +47,8 @@ "command.pushForce": "Push (Force)", "command.pushTo": "Push to...", "command.pushToForce": "Push to... (Force)", - "command.pushWithTags": "Push With Tags", - "command.pushWithTagsForce": "Push With Tags (Force)", + "command.pushWithTags": "Push (Follow Tags)", + "command.pushWithTagsForce": "Push (Follow Tags, Force)", "command.addRemote": "Add Remote", "command.removeRemote": "Remove Remote", "command.sync": "Sync", diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 336c45589ea..ca401ecdc5d 100755 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -202,7 +202,7 @@ function createCheckoutItems(repository: Repository): CheckoutItem[] { enum PushType { Push, PushTo, - PushTags, + PushFollowTags, } interface PushOptions { @@ -1759,10 +1759,8 @@ export class CommandCenter { } } - if (pushOptions.pushType === PushType.PushTags) { - await repository.pushTags(undefined, forcePushMode); - - window.showInformationMessage(localize('push with tags success', "Successfully pushed with tags.")); + if (pushOptions.pushType === PushType.PushFollowTags) { + await repository.pushFollowTags(undefined, forcePushMode); return; } @@ -1819,13 +1817,13 @@ export class CommandCenter { } @command('git.pushWithTags', { repository: true }) - async pushWithTags(repository: Repository): Promise { - await this._push(repository, { pushType: PushType.PushTags }); + async pushFollowTags(repository: Repository): Promise { + await this._push(repository, { pushType: PushType.PushFollowTags }); } @command('git.pushWithTagsForce', { repository: true }) - async pushWithTagsForce(repository: Repository): Promise { - await this._push(repository, { pushType: PushType.PushTags, forcePush: true }); + async pushFollowTagsForce(repository: Repository): Promise { + await this._push(repository, { pushType: PushType.PushFollowTags, forcePush: true }); } @command('git.pushTo', { repository: true }) diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index 17bd42125ce..bf5188b41be 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -1425,7 +1425,7 @@ export class Repository { } if (tags) { - args.push('--tags'); + args.push('--follow-tags'); } if (remote) { diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index d0536c607f8..a6ac57bc691 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -1013,7 +1013,7 @@ export class Repository implements Disposable { await this.run(Operation.Push, () => this.repository.push(remote, name, setUpstream, undefined, forcePushMode)); } - async pushTags(remote?: string, forcePushMode?: ForcePushMode): Promise { + async pushFollowTags(remote?: string, forcePushMode?: ForcePushMode): Promise { await this.run(Operation.Push, () => this.repository.push(remote, undefined, false, true, forcePushMode)); } From 99a599ecbb8ad485818fc70a9fbccff541d3e0b1 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 12 Jun 2019 11:58:44 +0200 Subject: [PATCH 0038/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 299f9cd814d..b1396e380ec 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "f582c39004c7c694d7e1461345e456afedd81d67", + "distro": "4da7d921ea061416d741434fb2a9b31aff8bd7bb", "author": { "name": "Microsoft Corporation" }, From 0403d69e754014c57d1fa296a71494e3387b221d Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 12 Jun 2019 12:02:22 +0200 Subject: [PATCH 0039/1449] use FalseContext, change Download Update label --- .../platform/contextkey/common/contextkeys.ts | 4 ++- .../contrib/update/electron-browser/update.ts | 28 ++++++++++--------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/vs/platform/contextkey/common/contextkeys.ts b/src/vs/platform/contextkey/common/contextkeys.ts index 86eeb57780e..c3206a24d9a 100644 --- a/src/vs/platform/contextkey/common/contextkeys.ts +++ b/src/vs/platform/contextkey/common/contextkeys.ts @@ -3,7 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; +import { RawContextKey, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; export const InputFocusedContextKey = 'inputFocus'; export const InputFocusedContext = new RawContextKey(InputFocusedContextKey, false); + +export const FalseContext: ContextKeyExpr = new RawContextKey('__false', false); \ No newline at end of file diff --git a/src/vs/workbench/contrib/update/electron-browser/update.ts b/src/vs/workbench/contrib/update/electron-browser/update.ts index 3d4c0c225d8..7078a1bb2fd 100644 --- a/src/vs/workbench/contrib/update/electron-browser/update.ts +++ b/src/vs/workbench/contrib/update/electron-browser/update.ts @@ -28,8 +28,9 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { RawContextKey, IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; +import { FalseContext } from 'vs/platform/contextkey/common/contextkeys'; -export const CONTEXT_UPDATE_STATE = new RawContextKey('updateStateContext', ''); +const CONTEXT_UPDATE_STATE = new RawContextKey('updateState', StateType.Uninitialized); let releaseNotesManager: ReleaseNotesManager | undefined = undefined; @@ -260,6 +261,7 @@ export class UpdateContribution extends Disposable implements IWorkbenchContribu private onUpdateStateChange(state: UpdateState): void { this.updateStateContextKey.set(state.type); + switch (state.type) { case StateType.Idle: if (state.error) { @@ -333,7 +335,7 @@ export class UpdateContribution extends Disposable implements IWorkbenchContribu severity.Info, nls.localize('thereIsUpdateAvailable', "There is an available update."), [{ - label: nls.localize('download now', "Download Now"), + label: nls.localize('download update', "Download Update"), run: () => this.updateService.downloadUpdate() }, { label: nls.localize('later', "Later"), @@ -464,7 +466,7 @@ export class UpdateContribution extends Disposable implements IWorkbenchContribu id: 'update.check', title: nls.localize('checkForUpdates', "Check for Updates...") }, - when: CONTEXT_UPDATE_STATE.isEqualTo(StateType.Idle), + when: CONTEXT_UPDATE_STATE.isEqualTo(StateType.Idle) }); CommandsRegistry.registerCommand('update.checking', () => { }); @@ -473,9 +475,9 @@ export class UpdateContribution extends Disposable implements IWorkbenchContribu command: { id: 'update.checking', title: nls.localize('checkingForUpdates', "Checking For Updates..."), - precondition: CONTEXT_UPDATE_STATE.isEqualTo('') + precondition: FalseContext }, - when: CONTEXT_UPDATE_STATE.isEqualTo(StateType.CheckingForUpdates), + when: CONTEXT_UPDATE_STATE.isEqualTo(StateType.CheckingForUpdates) }); CommandsRegistry.registerCommand('update.downloadNow', () => this.updateService.downloadUpdate()); @@ -483,9 +485,9 @@ export class UpdateContribution extends Disposable implements IWorkbenchContribu group: '5_update', command: { id: 'update.downloadNow', - title: nls.localize('download now', "Download Now") + title: nls.localize('download update', "Download Update") }, - when: CONTEXT_UPDATE_STATE.isEqualTo(StateType.AvailableForDownload), + when: CONTEXT_UPDATE_STATE.isEqualTo(StateType.AvailableForDownload) }); CommandsRegistry.registerCommand('update.downloading', () => { }); @@ -494,9 +496,9 @@ export class UpdateContribution extends Disposable implements IWorkbenchContribu command: { id: 'update.downloading', title: nls.localize('DownloadingUpdate', "Downloading Update..."), - precondition: CONTEXT_UPDATE_STATE.isEqualTo('') + precondition: FalseContext }, - when: CONTEXT_UPDATE_STATE.isEqualTo(StateType.Downloading), + when: CONTEXT_UPDATE_STATE.isEqualTo(StateType.Downloading) }); CommandsRegistry.registerCommand('update.install', () => this.updateService.applyUpdate()); @@ -506,7 +508,7 @@ export class UpdateContribution extends Disposable implements IWorkbenchContribu id: 'update.install', title: nls.localize('installUpdate...', "Install Update...") }, - when: CONTEXT_UPDATE_STATE.isEqualTo(StateType.Downloaded), + when: CONTEXT_UPDATE_STATE.isEqualTo(StateType.Downloaded) }); CommandsRegistry.registerCommand('update.updating', () => { }); @@ -515,9 +517,9 @@ export class UpdateContribution extends Disposable implements IWorkbenchContribu command: { id: 'update.updating', title: nls.localize('installingUpdate', "Installing Update..."), - precondition: CONTEXT_UPDATE_STATE.isEqualTo('') + precondition: FalseContext }, - when: CONTEXT_UPDATE_STATE.isEqualTo(StateType.Updating), + when: CONTEXT_UPDATE_STATE.isEqualTo(StateType.Updating) }); CommandsRegistry.registerCommand('update.restart', () => this.updateService.quitAndInstall()); @@ -527,7 +529,7 @@ export class UpdateContribution extends Disposable implements IWorkbenchContribu id: 'update.restart', title: nls.localize('restartToUpdate', "Restart to Update") }, - when: CONTEXT_UPDATE_STATE.isEqualTo(StateType.Ready), + when: CONTEXT_UPDATE_STATE.isEqualTo(StateType.Ready) }); } } From b485ffb756a87251f1c6d6046a150d7c453a5420 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 12 Jun 2019 12:02:58 +0200 Subject: [PATCH 0040/1449] fix git nls --- extensions/git/package.nls.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/git/package.nls.json b/extensions/git/package.nls.json index 302be3844d5..adff0134ed9 100644 --- a/extensions/git/package.nls.json +++ b/extensions/git/package.nls.json @@ -47,8 +47,8 @@ "command.pushForce": "Push (Force)", "command.pushTo": "Push to...", "command.pushToForce": "Push to... (Force)", - "command.pushWithTags": "Push (Follow Tags)", - "command.pushWithTagsForce": "Push (Follow Tags, Force)", + "command.pushFollowTags": "Push (Follow Tags)", + "command.pushFollowTagsForce": "Push (Follow Tags, Force)", "command.addRemote": "Add Remote", "command.removeRemote": "Remove Remote", "command.sync": "Sync", From 175580a76d3df50f85464af6c5bb8e9772ec4d11 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 12 Jun 2019 12:16:29 +0200 Subject: [PATCH 0041/1449] better error handling --- .../contrib/files/browser/views/explorerViewer.ts | 8 +++----- .../workspace/electron-browser/workspaceEditingService.ts | 4 +++- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts index 1e91f54e043..9303383869c 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts @@ -46,7 +46,6 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { IWorkspaceFolderCreationData } from 'vs/platform/workspaces/common/workspaces'; import { findValidPasteFileTarget } from 'vs/workbench/contrib/files/browser/fileActions'; import { FuzzyScore, createMatches } from 'vs/base/common/filters'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; export class ExplorerDelegate implements IListVirtualDelegate { @@ -442,8 +441,7 @@ export class FileDragAndDrop implements ITreeDragAndDrop { @IInstantiationService private instantiationService: IInstantiationService, @ITextFileService private textFileService: ITextFileService, @IWindowService private windowService: IWindowService, - @IWorkspaceEditingService private workspaceEditingService: IWorkspaceEditingService, - @IWorkbenchEnvironmentService private environmentService: IWorkbenchEnvironmentService + @IWorkspaceEditingService private workspaceEditingService: IWorkspaceEditingService ) { this.toDispose = []; @@ -595,11 +593,11 @@ export class FileDragAndDrop implements ITreeDragAndDrop { // Desktop DND (Import file) if (data instanceof DesktopDragAndDropData) { - this.handleExternalDrop(data, target, originalEvent); + this.handleExternalDrop(data, target, originalEvent).then(undefined, e => this.notificationService.warn(e)); } // In-Explorer DND (Move/Copy file) else { - this.handleExplorerDrop(data, target, originalEvent); + this.handleExplorerDrop(data, target, originalEvent).then(undefined, e => this.notificationService.warn(e)); } } diff --git a/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts b/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts index 9cd6dc21ffc..d0c60e71c6a 100644 --- a/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts +++ b/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts @@ -219,7 +219,9 @@ export class WorkspaceEditingService implements IWorkspaceEditingService { if (this.environmentService.configuration.remoteAuthority) { // Do not allow workspace folders with scheme different than the current remote scheme const schemas = this.contextService.getWorkspace().folders.map(f => f.uri.scheme); - foldersToAdd = foldersToAdd.filter(f => schemas.indexOf(f.uri.scheme) >= 0); + if (schemas.length && foldersToAdd.some(f => schemas.indexOf(f.uri.scheme) === -1)) { + return Promise.reject(new Error(nls.localize('differentSchemeRoots', "Workspace folders from different providers are not allowed in the same workspace."))); + } } // If we are in no-workspace or single-folder workspace, adding folders has to From 632564ba5eef901617d92c923aef9ceeedd7f9c2 Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Wed, 12 Jun 2019 12:22:40 +0200 Subject: [PATCH 0042/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b1396e380ec..76bf7dd129d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "4da7d921ea061416d741434fb2a9b31aff8bd7bb", + "distro": "6baa3808683d4e0c086466c281b5b02ae4809f8f", "author": { "name": "Microsoft Corporation" }, From 718f19e8abb45982e874329eff03b304e6892818 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 12 Jun 2019 12:40:16 +0200 Subject: [PATCH 0043/1449] :lipstick: --- extensions/git/src/commands.ts | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index f46576cd791..85ec8ce866a 100755 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -487,16 +487,14 @@ export class CommandCenter { (_, token) => this.git.clone(url!, parentPath, token) ); - const choices = []; - let message = localize('proposeopen', "Where would you to open the cloned repository?"); - const open = localize('openrepo', "Current Window"); - const openNewWindow = localize('openreponew', "New Window"); - choices.push(open); - choices.push(openNewWindow); + let message = localize('proposeopen', "Would you like to open the cloned repository?"); + const open = localize('openrepo', "Open"); + const openNewWindow = localize('openreponew', "Open in New Window"); + const choices = [open, openNewWindow]; const addToWorkspace = localize('add', "Add to Workspace"); if (workspace.workspaceFolders) { - message = localize('proposeopen2', "Where would you like to open the cloned repository, or add it to the current workspace?"); + message = localize('proposeopen2', "Would you like to open the cloned repository, or add it to the current workspace?"); choices.push(addToWorkspace); } @@ -603,12 +601,10 @@ export class CommandCenter { await this.git.init(repositoryPath); - const choices = []; - let message = localize('proposeopen init', "Where would you like to open the initialized repository?"); - const open = localize('openrepo', "Current Window"); - const openNewWindow = localize('openreponew', "New Window"); - choices.push(open); - choices.push(openNewWindow); + let message = localize('proposeopen init', "Would you like to open the initialized repository?"); + const open = localize('openrepo', "Open"); + const openNewWindow = localize('openreponew', "Open in New Window"); + const choices = [open, openNewWindow]; if (!askToOpen) { return; @@ -616,7 +612,7 @@ export class CommandCenter { const addToWorkspace = localize('add', "Add to Workspace"); if (workspace.workspaceFolders) { - message = localize('proposeopen2 init', "Where would you like to open the initialized repository, or add it to the current workspace?"); + message = localize('proposeopen2 init', "Would you like to open the initialized repository, or add it to the current workspace?"); choices.push(addToWorkspace); } From 24b61e19cd17087489619a7c52f5b3018b731ea8 Mon Sep 17 00:00:00 2001 From: Remco Haszing Date: Wed, 12 Jun 2019 13:21:34 +0200 Subject: [PATCH 0044/1449] Add syntax highlighting for .gitmodules --- extensions/ini/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/ini/package.json b/extensions/ini/package.json index c99133f3efc..cc5ca5da606 100644 --- a/extensions/ini/package.json +++ b/extensions/ini/package.json @@ -19,7 +19,7 @@ { "id": "properties", "extensions": [ ".properties", ".cfg", ".conf", ".directory" ], - "filenames": [ ".gitattributes", ".gitconfig", "gitconfig", ".editorconfig" ], + "filenames": [ ".gitattributes", ".gitconfig", "gitconfig", ".gitmodules", ".editorconfig" ], "filenamePatterns": [ "**/.config/git/config", "**/.git/config" ], "aliases": [ "Properties", "properties" ], "configuration": "./properties.language-configuration.json" From 08bb5a13c093a2adddadb30d4e02eeb976d7fe16 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 12 Jun 2019 15:19:44 +0200 Subject: [PATCH 0045/1449] use toInternal2 related to #74846 --- src/vs/workbench/api/common/extHostSCM.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/api/common/extHostSCM.ts b/src/vs/workbench/api/common/extHostSCM.ts index 18696bdbb34..5ae57de0204 100644 --- a/src/vs/workbench/api/common/extHostSCM.ts +++ b/src/vs/workbench/api/common/extHostSCM.ts @@ -6,7 +6,7 @@ import { URI, UriComponents } from 'vs/base/common/uri'; import { Event, Emitter } from 'vs/base/common/event'; import { debounce } from 'vs/base/common/decorators'; -import { dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { dispose, IDisposable, DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle'; import { asPromise } from 'vs/base/common/async'; import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; import { MainContext, MainThreadSCMShape, SCMRawResource, SCMRawResourceSplice, SCMRawResourceSplices, IMainContext, ExtHostSCMShape, CommandDto } from './extHost.protocol'; @@ -415,6 +415,7 @@ class ExtHostSourceControl implements vscode.SourceControl { this._proxy.$updateSourceControl(this.handle, { commitTemplate }); } + private _acceptInputDisposables = new MutableDisposable(); private _acceptInputCommand: vscode.Command | undefined = undefined; get acceptInputCommand(): vscode.Command | undefined { @@ -422,12 +423,15 @@ class ExtHostSourceControl implements vscode.SourceControl { } set acceptInputCommand(acceptInputCommand: vscode.Command | undefined) { + this._acceptInputDisposables.value = new DisposableStore(); + this._acceptInputCommand = acceptInputCommand; - const internal = this._commands.converter.toInternal(acceptInputCommand); + const internal = this._commands.converter.toInternal2(acceptInputCommand, this._acceptInputDisposables.value); this._proxy.$updateSourceControl(this.handle, { acceptInputCommand: internal }); } + private _statusBarDisposables = new MutableDisposable(); private _statusBarCommands: vscode.Command[] | undefined = undefined; get statusBarCommands(): vscode.Command[] | undefined { @@ -439,9 +443,11 @@ class ExtHostSourceControl implements vscode.SourceControl { return; } + this._statusBarDisposables.value = new DisposableStore(); + this._statusBarCommands = statusBarCommands; - const internal = (statusBarCommands || []).map(c => this._commands.converter.toInternal(c)) as CommandDto[]; + const internal = (statusBarCommands || []).map(c => this._commands.converter.toInternal2(c, this._statusBarDisposables.value!)) as CommandDto[]; this._proxy.$updateSourceControl(this.handle, { statusBarCommands: internal }); } @@ -519,6 +525,9 @@ class ExtHostSourceControl implements vscode.SourceControl { } dispose(): void { + this._acceptInputDisposables.dispose(); + this._statusBarDisposables.dispose(); + this._groups.forEach(group => group.dispose()); this._proxy.$unregisterSourceControl(this.handle); } From 45c4f5bbbb884da8bfc8ac1fc305ee21612ec132 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 12 Jun 2019 15:37:21 +0200 Subject: [PATCH 0046/1449] :lipstick: --- src/vs/base/browser/ui/tree/abstractTree.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index b9f558f343e..0e2c8573e9d 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -352,17 +352,18 @@ class TreeRenderer implements IListRenderer, templateData: ITreeListTemplateData, height: number): void { - let node: ITreeNode | undefined = _node; + private renderIndentGuides(target: ITreeNode, templateData: ITreeListTemplateData, height: number): void { let parent: ITreeNode | undefined; const guides: IndentGuide[] = []; - if (node && node.collapsible && !node.collapsed && hasVisibleChildren(node)) { + if (target && target.collapsible && !target.collapsed && hasVisibleChildren(target)) { guides.push(IndentGuide.First); } else { guides.push(IndentGuide.None); } + let node: ITreeNode | undefined = target; + while (node) { parent = node.parent; @@ -370,10 +371,8 @@ class TreeRenderer implements IListRenderer Date: Wed, 12 Jun 2019 15:57:59 +0200 Subject: [PATCH 0047/1449] properly quote empty arguments; fixes #25098 --- src/vs/workbench/contrib/debug/node/terminals.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/debug/node/terminals.ts b/src/vs/workbench/contrib/debug/node/terminals.ts index 073e0d1e028..300c738f0eb 100644 --- a/src/vs/workbench/contrib/debug/node/terminals.ts +++ b/src/vs/workbench/contrib/debug/node/terminals.ts @@ -380,7 +380,7 @@ export function prepareCommand(args: DebugProtocol.RunInTerminalRequestArguments quote = (s: string) => { s = s.replace(/\"/g, '""'); - return (s.indexOf(' ') >= 0 || s.indexOf('"') >= 0) ? `"${s}"` : s; + return (s.indexOf(' ') >= 0 || s.indexOf('"') >= 0 || s.length === 0) ? `"${s}"` : s; }; if (args.cwd) { @@ -410,7 +410,7 @@ export function prepareCommand(args: DebugProtocol.RunInTerminalRequestArguments quote = (s: string) => { s = s.replace(/([\"\\])/g, '\\$1'); - return s.indexOf(' ') >= 0 ? `"${s}"` : s; + return (s.indexOf(' ') >= 0 || s.length === 0) ? `"${s}"` : s; }; const hardQuote = (s: string) => { From a3baa1e2ee2abd14ded2407ad517fdd1806a0ce9 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 12 Jun 2019 16:04:46 +0200 Subject: [PATCH 0048/1449] explorer: polish drag n drop --- .../files/browser/views/explorerViewer.ts | 66 ++++++++++--------- 1 file changed, 36 insertions(+), 30 deletions(-) diff --git a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts index 9303383869c..0975ff3077f 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts @@ -8,7 +8,7 @@ import * as DOM from 'vs/base/browser/dom'; import * as glob from 'vs/base/common/glob'; import { IListVirtualDelegate, ListDragOverEffect } from 'vs/base/browser/ui/list/list'; import { IProgressService, ProgressLocation } from 'vs/platform/progress/common/progress'; -import { INotificationService } from 'vs/platform/notification/common/notification'; +import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { IFileService, FileKind, FileOperationError, FileOperationResult } from 'vs/platform/files/common/files'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; @@ -602,44 +602,50 @@ export class FileDragAndDrop implements ITreeDragAndDrop { } - private handleExternalDrop(data: DesktopDragAndDropData, target: ExplorerItem, originalEvent: DragEvent): Promise { + private async handleExternalDrop(data: DesktopDragAndDropData, target: ExplorerItem, originalEvent: DragEvent): Promise { const droppedResources = extractResources(originalEvent, true); // Check for dropped external files to be folders - return this.fileService.resolveAll(droppedResources).then(result => { + const result = await this.fileService.resolveAll(droppedResources); - // Pass focus to window - this.windowService.focusWindow(); + // Pass focus to window + this.windowService.focusWindow(); - // Handle folders by adding to workspace if we are in workspace context - const folders = result.filter(r => r.success && r.stat && r.stat.isDirectory).map(result => ({ uri: result.stat!.resource })); - if (folders.length > 0) { + // Handle folders by adding to workspace if we are in workspace context + const folders = result.filter(r => r.success && r.stat && r.stat.isDirectory).map(result => ({ uri: result.stat!.resource })); + if (folders.length > 0) { - // If we are in no-workspace context, ask for confirmation to create a workspace - let confirmedPromise: Promise = Promise.resolve({ confirmed: true }); - if (this.contextService.getWorkbenchState() !== WorkbenchState.WORKSPACE) { - confirmedPromise = this.dialogService.confirm({ - message: folders.length > 1 ? localize('dropFolders', "Do you want to add the folders to the workspace?") : localize('dropFolder', "Do you want to add the folder to the workspace?"), - type: 'question', - primaryButton: folders.length > 1 ? localize('addFolders', "&&Add Folders") : localize('addFolder', "&&Add Folder") - }); - } - - return confirmedPromise.then(res => { - if (res.confirmed) { - return this.workspaceEditingService.addFolders(folders); - } - - return undefined; - }); + // If we are in no-workspace context, ask for confirmation to create a workspace + const workspaceFolderSchemas = this.contextService.getWorkspace().folders.map(f => f.uri.scheme); + let choice: number; + if (folders.some(f => workspaceFolderSchemas.indexOf(f.uri.scheme) === -1)) { + // We do not allow to add folders + choice = 1; + } else { + choice = await this.dialogService.show(Severity.Info, folders.length > 1 ? localize('dropFolders', "Do you want to copy the folders or add the folders to the workspace?") + : localize('dropFolder', "Do you want to copy the folder or add the folder to the workspace?"), + [ + folders.length > 1 ? localize('addFolders', "&&Add Folders to Workspace") : localize('addFolder', "&&Add Folder to Workspace"), + folders.length > 1 ? localize('copyFolders', "&&Copy Folders") : localize('copyFolder', "&&Copy Folder"), + localize('cancel', "Cancel") + ] + ); } - - // Handle dropped files (only support FileStat as target) - else if (target instanceof ExplorerItem) { + if (choice === 0) { + return this.workspaceEditingService.addFolders(folders); + } + if (choice === 1) { return this.addResources(target, droppedResources.map(res => res.resource)); } return undefined; - }); + } + + // Handle dropped files (only support FileStat as target) + else if (target instanceof ExplorerItem) { + return this.addResources(target, droppedResources.map(res => res.resource)); + } + + return undefined; } private addResources(target: ExplorerItem, resources: URI[]): Promise { @@ -695,7 +701,7 @@ export class FileDragAndDrop implements ITreeDragAndDrop { return this.fileService.copy(sourceFile, copyTarget, true).then(stat => { // if we only add one file, just open it directly - if (resources.length === 1) { + if (resources.length === 1 && !stat.isDirectory) { this.editorService.openEditor({ resource: stat.resource, options: { pinned: true } }); } }); From 238a8521bca14ae3a8df1098a710b1694333d067 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 12 Jun 2019 16:11:01 +0200 Subject: [PATCH 0049/1449] only dispose completion model when dispose suggest logic or when re-triggering, #75106 --- src/vs/editor/contrib/suggest/suggestModel.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/vs/editor/contrib/suggest/suggestModel.ts b/src/vs/editor/contrib/suggest/suggestModel.ts index 42991e0a2f8..d9742b95f03 100644 --- a/src/vs/editor/contrib/suggest/suggestModel.ts +++ b/src/vs/editor/contrib/suggest/suggestModel.ts @@ -226,8 +226,6 @@ export class SuggestModel implements IDisposable { this._requestToken = undefined; } this._state = State.Idle; - dispose(this._completionModel); - this._completionModel = undefined; this._context = undefined; this._onDidCancel.fire({ retrigger }); } From 6dd15c088a162a8550ab7a9048b5182e4ae13e35 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 12 Jun 2019 16:13:33 +0200 Subject: [PATCH 0050/1449] demo modes --- src/vs/base/browser/ui/tree/abstractTree.ts | 73 ++++++++++++++++----- src/vs/base/browser/ui/tree/media/tree.css | 1 + 2 files changed, 57 insertions(+), 17 deletions(-) diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index 0e2c8573e9d..4046352c17f 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -216,6 +216,22 @@ function getLastVisibleChild(node: ITreeNode): I return undefined; } +function getLastVisibleDescendant(node: ITreeNode): ITreeNode | undefined { + if (node.collapsed) { + return node; + } + + for (let i = 0; i < node.children.length; i++) { + const child = node.children[node.children.length - i - 1]; + + if (child.visible) { + return getLastVisibleDescendant(child); + } + } + + return undefined; +} + function hasVisibleChildren(node: ITreeNode): boolean { for (let i = 0; i < node.children.length; i++) { if (node.children[i].visible) { @@ -231,6 +247,16 @@ interface IRenderData { height: number; } +//********************************************* DEMO ************************* +enum Mode { + Brackets, + SubtreeBrackets, + Editor +} + +const mode: Mode = Mode.Editor; +//********************************************* DEMO ************************* + class TreeRenderer implements IListRenderer, ITreeListTemplateData> { private static DefaultIndent = 8; @@ -264,11 +290,6 @@ class TreeRenderer implements IListRenderer { - data.templateData.indent.style.width = `${node.depth * this.indent}px`; - }); } renderTemplate(container: HTMLElement): ITreeListTemplateData { @@ -289,7 +310,7 @@ class TreeRenderer implements IListRenderer implements IListRenderer implements IListRenderer`); - lines.push(``); + if (mode === Mode.Editor) { + lines.push(``); + } else { + lines.push(``); + lines.push(``); + } break; case IndentGuide.Middle: lines.push(``); diff --git a/src/vs/base/browser/ui/tree/media/tree.css b/src/vs/base/browser/ui/tree/media/tree.css index d0b202c0b0a..1fcd3853819 100644 --- a/src/vs/base/browser/ui/tree/media/tree.css +++ b/src/vs/base/browser/ui/tree/media/tree.css @@ -14,6 +14,7 @@ position: absolute; top: 0; left: 16px; + pointer-events: none; } .monaco-tl-indent > svg { From 34c1f859cf443d29825f5317327ab1c6c6f92589 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 12 Jun 2019 16:20:49 +0200 Subject: [PATCH 0051/1449] remove gc-signals, heapservice, and mainThreadHeapService, #74846 --- build/.nativeignore | 10 +-- package.json | 1 - src/typings/gc-signals.d.ts | 19 ----- .../api/browser/extensionHost.contribution.ts | 1 - .../api/browser/mainThreadHeapService.ts | 25 ------ src/vs/workbench/services/heap/common/heap.ts | 33 -------- src/vs/workbench/services/heap/node/heap.ts | 80 ------------------- .../api/extHostApiCommands.test.ts | 2 - .../api/extHostLanguageFeatures.test.ts | 2 - src/vs/workbench/workbench.web.main.ts | 2 - yarn.lock | 5 -- 11 files changed, 1 insertion(+), 179 deletions(-) delete mode 100644 src/typings/gc-signals.d.ts delete mode 100644 src/vs/workbench/api/browser/mainThreadHeapService.ts delete mode 100644 src/vs/workbench/services/heap/common/heap.ts delete mode 100644 src/vs/workbench/services/heap/node/heap.ts diff --git a/build/.nativeignore b/build/.nativeignore index 132cb1baeb8..64286dae790 100644 --- a/build/.nativeignore +++ b/build/.nativeignore @@ -67,14 +67,6 @@ windows-process-tree/build/** windows-process-tree/src/** !windows-process-tree/**/*.node -gc-signals/binding.gyp -gc-signals/build/** -gc-signals/src/** -gc-signals/deps/** - -!gc-signals/build/Release/*.node -!gc-signals/src/index.js - keytar/binding.gyp keytar/build/** keytar/src/** @@ -112,4 +104,4 @@ vscode-windows-ca-certs/**/* !vscode-windows-ca-certs/package.json !vscode-windows-ca-certs/**/*.node -node-addon-api/**/* \ No newline at end of file +node-addon-api/**/* diff --git a/package.json b/package.json index 76bf7dd129d..2a3f24d0e01 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,6 @@ }, "dependencies": { "applicationinsights": "1.0.8", - "gc-signals": "^0.0.2", "getmac": "1.4.1", "graceful-fs": "4.1.11", "http-proxy-agent": "^2.1.0", diff --git a/src/typings/gc-signals.d.ts b/src/typings/gc-signals.d.ts deleted file mode 100644 index 15af0411773..00000000000 --- a/src/typings/gc-signals.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -declare module 'gc-signals' { - export interface GCSignal { - } - /** - * Create a new GC signal. When being garbage collected the passed - * value is stored for later consumption. - */ - export const GCSignal: { - new(id: number): GCSignal; - }; - /** - * Consume ids of garbage collected signals. - */ - export function consumeSignals(): number[]; - export function onDidGarbageCollectSignals(callback: (ids: number[]) => any): { - dispose(): void; - }; - export function trackGarbageCollection(obj: any, id: number): number; -} \ No newline at end of file diff --git a/src/vs/workbench/api/browser/extensionHost.contribution.ts b/src/vs/workbench/api/browser/extensionHost.contribution.ts index b4eca4746c9..2f07210ca5b 100644 --- a/src/vs/workbench/api/browser/extensionHost.contribution.ts +++ b/src/vs/workbench/api/browser/extensionHost.contribution.ts @@ -32,7 +32,6 @@ import './mainThreadErrors'; import './mainThreadExtensionService'; import './mainThreadFileSystem'; import './mainThreadFileSystemEventService'; -import './mainThreadHeapService'; import './mainThreadKeytar'; import './mainThreadLanguageFeatures'; import './mainThreadLanguages'; diff --git a/src/vs/workbench/api/browser/mainThreadHeapService.ts b/src/vs/workbench/api/browser/mainThreadHeapService.ts deleted file mode 100644 index 73719e58d57..00000000000 --- a/src/vs/workbench/api/browser/mainThreadHeapService.ts +++ /dev/null @@ -1,25 +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 { ExtHostContext, IExtHostContext } from '../common/extHost.protocol'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { extHostCustomer } from 'vs/workbench/api/common/extHostCustomers'; -import { IHeapService } from 'vs/workbench/services/heap/common/heap'; - -@extHostCustomer -export class MainThreadHeapService extends Disposable { - - constructor( - extHostContext: IExtHostContext, - @IHeapService heapService: IHeapService, - ) { - super(); - const proxy = extHostContext.getProxy(ExtHostContext.ExtHostHeapService); - this._register(heapService.onGarbageCollection((ids) => { - // send to ext host - proxy.$onGarbageCollection(ids); - })); - } -} diff --git a/src/vs/workbench/services/heap/common/heap.ts b/src/vs/workbench/services/heap/common/heap.ts deleted file mode 100644 index 4aa4cc0ec78..00000000000 --- a/src/vs/workbench/services/heap/common/heap.ts +++ /dev/null @@ -1,33 +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 { Event } from 'vs/base/common/event'; -import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; - -export const IHeapService = createDecorator('heapService'); - -export interface ObjectIdentifier { - $ident?: number; -} - -export interface IHeapService { - _serviceBrand: any; - - readonly onGarbageCollection: Event; - - /** - * Track gc-collection for the given object - */ - trackObject(obj: ObjectIdentifier | undefined): void; -} - - - -export class NullHeapService implements IHeapService { - _serviceBrand: any; - onGarbageCollection = Event.None; - trackObject() { } -} diff --git a/src/vs/workbench/services/heap/node/heap.ts b/src/vs/workbench/services/heap/node/heap.ts deleted file mode 100644 index 8f627bacea1..00000000000 --- a/src/vs/workbench/services/heap/node/heap.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 { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { Event, Emitter } from 'vs/base/common/event'; -import { GCSignal } from 'gc-signals'; -import { IHeapService, ObjectIdentifier } from 'vs/workbench/services/heap/common/heap'; - -export class HeapService implements IHeapService { - - _serviceBrand: any; - - private readonly _onGarbageCollection: Emitter = new Emitter(); - public readonly onGarbageCollection: Event = this._onGarbageCollection.event; - - private _activeSignals = new WeakMap(); - private _activeIds = new Set(); - - private _consumeHandle: any; - private _ctor: { new(id: number): GCSignal }; - private _ctorInit: Promise; - - constructor() { - // - } - - dispose() { - clearInterval(this._consumeHandle); - } - - trackObject(obj: ObjectIdentifier | undefined | null): void { - if (!obj) { - return; - } - - const ident = obj.$ident; - if (typeof ident !== 'number') { - return; - } - - if (this._activeIds.has(ident)) { - return; - } - - if (this._ctor) { - // track and leave - this._activeIds.add(ident); - this._activeSignals.set(obj, new this._ctor(ident)); - - } else { - // make sure to load gc-signals, then track and leave - if (!this._ctorInit) { - this._ctorInit = import('gc-signals').then(({ GCSignal, consumeSignals }) => { - this._ctor = GCSignal; - this._consumeHandle = setInterval(() => { - const ids = consumeSignals(); - - if (ids.length > 0) { - // local book-keeping - for (const id of ids) { - this._activeIds.delete(id); - } - // fire event - this._onGarbageCollection.fire(ids); - } - }, 15 * 1000); - }); - } - - this._ctorInit.then(() => { - this._activeIds.add(ident); - this._activeSignals.set(obj, new this._ctor(ident)); - }); - } - } -} - -registerSingleton(IHeapService, HeapService, true); diff --git a/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts b/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts index 2f39779eb3a..abc74538e76 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts @@ -16,7 +16,6 @@ import { ICommandService, CommandsRegistry } from 'vs/platform/commands/common/c import { IModelService } from 'vs/editor/common/services/modelService'; import { ExtHostLanguageFeatures } from 'vs/workbench/api/common/extHostLanguageFeatures'; import { MainThreadLanguageFeatures } from 'vs/workbench/api/browser/mainThreadLanguageFeatures'; -import { IHeapService, NullHeapService } from 'vs/workbench/services/heap/common/heap'; import { ExtHostApiCommands } from 'vs/workbench/api/common/extHostApiCommands'; import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; import { ExtHostHeapService } from 'vs/workbench/api/common/extHostHeapService'; @@ -67,7 +66,6 @@ suite('ExtHostLanguageFeatureCommands', function () { { let instantiationService = new TestInstantiationService(); rpcProtocol = new TestRPCProtocol(); - instantiationService.stub(IHeapService, NullHeapService); instantiationService.stub(ICommandService, { _serviceBrand: undefined, executeCommand(id: string, args: any): any { diff --git a/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts b/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts index ff72eb8df42..19afeb70609 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts @@ -18,7 +18,6 @@ import { ExtHostLanguageFeatures } from 'vs/workbench/api/common/extHostLanguage import { MainThreadLanguageFeatures } from 'vs/workbench/api/browser/mainThreadLanguageFeatures'; import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; import { MainThreadCommands } from 'vs/workbench/api/browser/mainThreadCommands'; -import { IHeapService, NullHeapService } from 'vs/workbench/services/heap/common/heap'; import { ExtHostDocuments } from 'vs/workbench/api/common/extHostDocuments'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; import { getDocumentSymbols } from 'vs/editor/contrib/quickOpen/quickOpen'; @@ -81,7 +80,6 @@ suite('ExtHostLanguageFeatures', function () { { let instantiationService = new TestInstantiationService(); instantiationService.stub(IMarkerService, MarkerService); - instantiationService.stub(IHeapService, NullHeapService); inst = instantiationService; } diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index a2216b4db2f..fd02f6dfc48 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -89,7 +89,6 @@ import { ContextViewService } from 'vs/platform/contextview/browser/contextViewS // import { RelayURLService } from 'vs/platform/url/electron-browser/urlService'; // import { ITunnelService } from 'vs/platform/remote/common/tunnel'; // import { TunnelService } from 'vs/workbench/services/remote/node/tunnelService'; -import { IHeapService, NullHeapService } from 'vs/workbench/services/heap/common/heap'; import { ConfigurationResolverService } from 'vs/workbench/services/configurationResolver/browser/configurationResolverService'; import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; import { ISearchService } from 'vs/workbench/services/search/common/search'; @@ -164,7 +163,6 @@ registerSingleton(IContextViewService, ContextViewService, true); // registerSingleton(IMenubarService, MenubarService); // registerSingleton(IURLService, RelayURLService); registerSingleton(ISearchService, RemoteSearchService, true); -registerSingleton(IHeapService, NullHeapService); registerSingleton(IContextMenuService, ContextMenuService); registerSingleton(IConfigurationResolverService, ConfigurationResolverService, true); diff --git a/yarn.lock b/yarn.lock index d2629586c09..bf8ee7c0050 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3555,11 +3555,6 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -gc-signals@^0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/gc-signals/-/gc-signals-0.0.2.tgz#1cfa8a00adecaeeb93ea0dda72dad9e9f333e62f" - integrity sha512-Ghj4Co6x5bd3dvbAFuiDc6gN+BVK8ic8CBn70dXjzrtbC5hq4a+s4S6acEvftMP7LcQuHKN5v+30PGXhkCLoCQ== - generate-function@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" From 5b450a45b32f33e5ac3bdada7e767a8c40b68852 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 12 Jun 2019 16:23:22 +0200 Subject: [PATCH 0052/1449] Revert "only dispose completion model when dispose suggest logic or when re-triggering, #75106" This reverts commit 238a8521bca14ae3a8df1098a710b1694333d067. --- src/vs/editor/contrib/suggest/suggestModel.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vs/editor/contrib/suggest/suggestModel.ts b/src/vs/editor/contrib/suggest/suggestModel.ts index d9742b95f03..42991e0a2f8 100644 --- a/src/vs/editor/contrib/suggest/suggestModel.ts +++ b/src/vs/editor/contrib/suggest/suggestModel.ts @@ -226,6 +226,8 @@ export class SuggestModel implements IDisposable { this._requestToken = undefined; } this._state = State.Idle; + dispose(this._completionModel); + this._completionModel = undefined; this._context = undefined; this._onDidCancel.fire({ retrigger }); } From a7d510160d432dd9aa70f499b914dc7c76ef69c6 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 12 Jun 2019 16:30:28 +0200 Subject: [PATCH 0053/1449] better workaround for #75106 --- src/vs/editor/contrib/suggest/suggestModel.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/contrib/suggest/suggestModel.ts b/src/vs/editor/contrib/suggest/suggestModel.ts index 42991e0a2f8..c3b279eb075 100644 --- a/src/vs/editor/contrib/suggest/suggestModel.ts +++ b/src/vs/editor/contrib/suggest/suggestModel.ts @@ -226,8 +226,10 @@ export class SuggestModel implements IDisposable { this._requestToken = undefined; } this._state = State.Idle; - dispose(this._completionModel); - this._completionModel = undefined; + if (retrigger) { + dispose(this._completionModel); + this._completionModel = undefined; + } this._context = undefined; this._onDidCancel.fire({ retrigger }); } From d6555ce5fdea2d29d89349d363d3b7d67fbf1bb3 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 12 Jun 2019 16:32:57 +0200 Subject: [PATCH 0054/1449] remove heap import no longer needed since it is removed --- src/vs/workbench/workbench.main.ts | 1 - src/vs/workbench/workbench.web.main.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index 58189180c39..1863b0c8277 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -131,7 +131,6 @@ import 'vs/workbench/services/label/common/labelService'; import 'vs/workbench/services/extensions/electron-browser/extensionManagementServerService'; import 'vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl'; import 'vs/workbench/services/notification/common/notificationService'; -import 'vs/workbench/services/heap/node/heap'; import 'vs/workbench/services/window/electron-browser/windowService'; import 'vs/workbench/services/telemetry/electron-browser/telemetryService'; diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index fd02f6dfc48..392a1fb655b 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -131,7 +131,6 @@ import 'vs/workbench/services/label/common/labelService'; // import 'vs/workbench/services/extensions/electron-browser/extensionManagementServerService'; // import 'vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl'; import 'vs/workbench/services/notification/common/notificationService'; -// import 'vs/workbench/services/heap/node/heap'; // import 'vs/workbench/services/window/electron-browser/windowService'; // import 'vs/workbench/services/telemetry/electron-browser/telemetryService'; From 1bf2cab7724c4f1138eb2e1e1308701e678a4a40 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 12 Jun 2019 16:47:58 +0200 Subject: [PATCH 0055/1449] Move extension actions to browser namespace --- .../node/extensionGalleryService.ts | 4 +- src/vs/platform/product/common/product.ts | 6 +++ src/vs/platform/product/node/product.ts | 2 +- .../platform/product/node/productService.ts | 2 + .../extensionsActions.ts | 39 +++++++++++-------- .../electron-browser/extensionEditor.ts | 2 +- .../electron-browser/extensionTipsService.ts | 2 +- .../extensions.contribution.ts | 2 +- .../electron-browser/extensionsList.ts | 2 +- .../electron-browser/extensionsViewlet.ts | 2 +- .../electron-browser/extensionsViews.ts | 2 +- .../electron-browser/extensionsWidgets.ts | 2 +- .../extensionsActions.test.ts | 2 +- 13 files changed, 41 insertions(+), 28 deletions(-) rename src/vs/workbench/contrib/extensions/{electron-browser => browser}/extensionsActions.ts (99%) diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts index 37d39c2f83a..c51ec5cdf63 100644 --- a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts @@ -324,8 +324,8 @@ export class ExtensionGalleryService implements IExtensionGalleryService { _serviceBrand: any; - private extensionsGalleryUrl: string; - private extensionsControlUrl: string; + private extensionsGalleryUrl: string | undefined; + private extensionsControlUrl: string | undefined; private readonly commonHeadersPromise: Promise<{ [key: string]: string; }>; diff --git a/src/vs/platform/product/common/product.ts b/src/vs/platform/product/common/product.ts index 42ee6e548ff..2a35190f8ae 100644 --- a/src/vs/platform/product/common/product.ts +++ b/src/vs/platform/product/common/product.ts @@ -19,6 +19,12 @@ export interface IProductService { uiExtensions?: string[]; enableTelemetry: boolean; + extensionsGallery?: { + serviceUrl: string; + itemUrl: string; + controlUrl: string; + recommendationsUrl: string; + }; sendASmile?: { reportIssueUrl: string; diff --git a/src/vs/platform/product/node/product.ts b/src/vs/platform/product/node/product.ts index 3ad86dbcf1b..6a5cf7880e8 100644 --- a/src/vs/platform/product/node/product.ts +++ b/src/vs/platform/product/node/product.ts @@ -28,7 +28,7 @@ export interface IProductConfiguration { settingsSearchUrl?: string; experimentsUrl?: string; date: string; - extensionsGallery: { + extensionsGallery?: { serviceUrl: string; itemUrl: string; controlUrl: string; diff --git a/src/vs/platform/product/node/productService.ts b/src/vs/platform/product/node/productService.ts index a26cd8831f7..b30475440d2 100644 --- a/src/vs/platform/product/node/productService.ts +++ b/src/vs/platform/product/node/productService.ts @@ -27,4 +27,6 @@ export class ProductService implements IProductService { get enableTelemetry(): boolean { return product.enableTelemetry; } get sendASmile(): { reportIssueUrl: string, requestFeatureUrl: string } { return product.sendASmile; } + + get extensionsGallery() { return product.extensionsGallery; } } \ No newline at end of file diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts similarity index 99% rename from src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts rename to src/vs/workbench/contrib/extensions/browser/extensionsActions.ts index 81b11ad1ec7..e89bb57eeaf 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts @@ -47,10 +47,8 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { ExtensionsInput } from 'vs/workbench/contrib/extensions/common/extensionsInput'; -import product from 'vs/platform/product/node/product'; import { IQuickPickItem, IQuickInputService, IQuickPickSeparator } from 'vs/platform/quickinput/common/quickInput'; import { CancellationToken } from 'vs/base/common/cancellation'; -import { clipboard } from 'electron'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; import { alert } from 'vs/base/browser/ui/aria/aria'; import { coalesce } from 'vs/base/common/arrays'; @@ -62,6 +60,7 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/ import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IProductService } from 'vs/platform/product/common/product'; +import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; function toExtensionDescription(local: ILocalExtension): IExtensionDescription { return { @@ -73,11 +72,11 @@ function toExtensionDescription(local: ILocalExtension): IExtensionDescription { }; } -const promptDownloadManually = (extension: IGalleryExtension | undefined, message: string, error: Error, instantiationService: IInstantiationService, notificationService: INotificationService, openerService: IOpenerService) => { - if (!extension || error.name === INSTALL_ERROR_INCOMPATIBLE || error.name === INSTALL_ERROR_MALICIOUS) { +const promptDownloadManually = (extension: IGalleryExtension | undefined, message: string, error: Error, instantiationService: IInstantiationService, notificationService: INotificationService, openerService: IOpenerService, productService: IProductService) => { + if (!extension || error.name === INSTALL_ERROR_INCOMPATIBLE || error.name === INSTALL_ERROR_MALICIOUS || !productService.extensionsGallery) { return Promise.reject(error); } else { - const downloadUrl = `${product.extensionsGallery.serviceUrl}/publishers/${extension.publisher}/vsextensions/${extension.name}/${extension.version}/vspackage`; + const downloadUrl = `${productService.extensionsGallery.serviceUrl}/publishers/${extension.publisher}/vsextensions/${extension.name}/${extension.version}/vspackage`; notificationService.prompt(Severity.Error, message, [{ label: localize('download', "Download Manually"), run: () => openerService.open(URI.parse(downloadUrl)).then(() => { @@ -247,7 +246,7 @@ export class InstallAction extends ExtensionAction { console.error(err); - return promptDownloadManually(extension.gallery, localize('failedToInstall', "Failed to install \'{0}\'.", extension.identifier.id), err, this.instantiationService, this.notificationService, this.openerService); + return promptDownloadManually(extension.gallery, localize('failedToInstall', "Failed to install \'{0}\'.", extension.identifier.id), err, this.instantiationService, this.notificationService, this.openerService, this.productService); }); } @@ -556,7 +555,8 @@ export class UpdateAction extends ExtensionAction { @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, @IInstantiationService private readonly instantiationService: IInstantiationService, @INotificationService private readonly notificationService: INotificationService, - @IOpenerService private readonly openerService: IOpenerService + @IOpenerService private readonly openerService: IOpenerService, + @IProductService private readonly productService: IProductService ) { super(`extensions.update`, '', UpdateAction.DisabledClass, false); this.update(); @@ -600,7 +600,7 @@ export class UpdateAction extends ExtensionAction { console.error(err); - return promptDownloadManually(extension.gallery, localize('failedToUpdate', "Failed to update \'{0}\'.", extension.identifier.id), err, this.instantiationService, this.notificationService, this.openerService); + return promptDownloadManually(extension.gallery, localize('failedToUpdate', "Failed to update \'{0}\'.", extension.identifier.id), err, this.instantiationService, this.notificationService, this.openerService, this.productService); }); } @@ -786,7 +786,8 @@ export class InstallAnotherVersionAction extends ExtensionAction { @IQuickInputService private readonly quickInputService: IQuickInputService, @IInstantiationService private readonly instantiationService: IInstantiationService, @INotificationService private readonly notificationService: INotificationService, - @IOpenerService private readonly openerService: IOpenerService + @IOpenerService private readonly openerService: IOpenerService, + @IProductService private readonly productService: IProductService ) { super(InstallAnotherVersionAction.ID, InstallAnotherVersionAction.LABEL); this.update(); @@ -815,7 +816,7 @@ export class InstallAnotherVersionAction extends ExtensionAction { console.error(err); - return promptDownloadManually(this.extension.gallery, localize('failedToInstall', "Failed to install \'{0}\'.", this.extension.identifier.id), err, this.instantiationService, this.notificationService, this.openerService); + return promptDownloadManually(this.extension.gallery, localize('failedToInstall', "Failed to install \'{0}\'.", this.extension.identifier.id), err, this.instantiationService, this.notificationService, this.openerService, this.productService); }); } return null; @@ -833,7 +834,9 @@ export class ExtensionInfoAction extends ExtensionAction { static readonly ID = 'extensions.extensionInfo'; static readonly LABEL = localize('extensionInfoAction', "Copy Extension Information"); - constructor() { + constructor( + @IClipboardService private readonly clipboardService: IClipboardService + ) { super(ExtensionInfoAction.ID, ExtensionInfoAction.LABEL); this.update(); } @@ -853,7 +856,7 @@ export class ExtensionInfoAction extends ExtensionAction { const clipboardStr = `${name}\n${id}\n${description}\n${verision}\n${publisher}${link ? '\n' + link : ''}`; - clipboard.writeText(clipboardStr); + this.clipboardService.writeText(clipboardStr); return Promise.resolve(); } } @@ -1159,7 +1162,8 @@ export class UpdateAllAction extends Action { @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, @INotificationService private readonly notificationService: INotificationService, @IInstantiationService private readonly instantiationService: IInstantiationService, - @IOpenerService private readonly openerService: IOpenerService + @IOpenerService private readonly openerService: IOpenerService, + @IProductService private readonly productService: IProductService ) { super(id, label, '', false); @@ -1183,7 +1187,7 @@ export class UpdateAllAction extends Action { console.error(err); - return promptDownloadManually(extension.gallery, localize('failedToUpdate', "Failed to update \'{0}\'.", extension.identifier.id), err, this.instantiationService, this.notificationService, this.openerService); + return promptDownloadManually(extension.gallery, localize('failedToUpdate', "Failed to update \'{0}\'.", extension.identifier.id), err, this.instantiationService, this.notificationService, this.openerService, this.productService); }); } } @@ -1722,7 +1726,7 @@ export class InstallWorkspaceRecommendedExtensionsAction extends Action { await this.extensionWorkbenchService.install(extension); } catch (err) { console.error(err); - return promptDownloadManually(extension.gallery, localize('failedToInstall', "Failed to install \'{0}\'.", extension.identifier.id), err, this.instantiationService, this.notificationService, this.openerService); + return promptDownloadManually(extension.gallery, localize('failedToInstall', "Failed to install \'{0}\'.", extension.identifier.id), err, this.instantiationService, this.notificationService, this.openerService, this.productService); } } } @@ -1740,7 +1744,8 @@ export class InstallRecommendedExtensionAction extends Action { @INotificationService private readonly notificationService: INotificationService, @IInstantiationService private readonly instantiationService: IInstantiationService, @IOpenerService private readonly openerService: IOpenerService, - @IExtensionsWorkbenchService private readonly extensionWorkbenchService: IExtensionsWorkbenchService + @IExtensionsWorkbenchService private readonly extensionWorkbenchService: IExtensionsWorkbenchService, + @IProductService private readonly productService: IProductService ) { super(InstallRecommendedExtensionAction.ID, InstallRecommendedExtensionAction.LABEL, undefined, false); this.extensionId = extensionId; @@ -1759,7 +1764,7 @@ export class InstallRecommendedExtensionAction extends Action { return this.extensionWorkbenchService.install(extension) .then(() => null, err => { console.error(err); - return promptDownloadManually(extension.gallery, localize('failedToInstall', "Failed to install \'{0}\'.", extension.identifier.id), err, this.instantiationService, this.notificationService, this.openerService); + return promptDownloadManually(extension.gallery, localize('failedToInstall', "Failed to install \'{0}\'.", extension.identifier.id), err, this.instantiationService, this.notificationService, this.openerService, this.productService); }); } return null; diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts index abd20f5b63a..edfaa46c0c4 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts @@ -28,7 +28,7 @@ import { IExtensionsWorkbenchService, IExtensionsViewlet, VIEWLET_ID, IExtension import { RatingsWidget, InstallCountWidget, RemoteBadgeWidget } from 'vs/workbench/contrib/extensions/electron-browser/extensionsWidgets'; import { EditorOptions } from 'vs/workbench/common/editor'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; -import { CombinedInstallAction, UpdateAction, ExtensionEditorDropDownAction, ReloadAction, MaliciousStatusLabelAction, IgnoreExtensionRecommendationAction, UndoIgnoreExtensionRecommendationAction, EnableDropDownAction, DisableDropDownAction, StatusLabelAction, SetFileIconThemeAction, SetColorThemeAction, RemoteInstallAction, DisabledLabelAction, SystemDisabledWarningAction, LocalInstallAction } from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; +import { CombinedInstallAction, UpdateAction, ExtensionEditorDropDownAction, ReloadAction, MaliciousStatusLabelAction, IgnoreExtensionRecommendationAction, UndoIgnoreExtensionRecommendationAction, EnableDropDownAction, DisableDropDownAction, StatusLabelAction, SetFileIconThemeAction, SetColorThemeAction, RemoteInstallAction, DisabledLabelAction, SystemDisabledWarningAction, LocalInstallAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; import { WebviewElement } from 'vs/workbench/contrib/webview/electron-browser/webviewElement'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { DomScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement'; diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionTipsService.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionTipsService.ts index e16509f850d..8c07feef6f4 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionTipsService.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionTipsService.ts @@ -18,7 +18,7 @@ import { ITextModel } from 'vs/editor/common/model'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import product from 'vs/platform/product/node/product'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ShowRecommendedExtensionsAction, InstallWorkspaceRecommendedExtensionsAction, InstallRecommendedExtensionAction } from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; +import { ShowRecommendedExtensionsAction, InstallWorkspaceRecommendedExtensionsAction, InstallRecommendedExtensionAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; import Severity from 'vs/base/common/severity'; import { IWorkspaceContextService, IWorkspaceFolder, IWorkspace, IWorkspaceFoldersChangeEvent, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IFileService } from 'vs/platform/files/common/files'; diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts index bd10a6f004d..358f9ac3b2e 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts @@ -22,7 +22,7 @@ import { OpenExtensionsViewletAction, InstallExtensionsAction, ShowOutdatedExtensionsAction, ShowRecommendedExtensionsAction, ShowRecommendedKeymapExtensionsAction, ShowPopularExtensionsAction, ShowEnabledExtensionsAction, ShowInstalledExtensionsAction, ShowDisabledExtensionsAction, ShowBuiltInExtensionsAction, UpdateAllAction, EnableAllAction, EnableAllWorkpsaceAction, DisableAllAction, DisableAllWorkpsaceAction, CheckForUpdatesAction, ShowLanguageExtensionsAction, ShowAzureExtensionsAction, EnableAutoUpdateAction, DisableAutoUpdateAction, ConfigureRecommendedExtensionsCommandsContributor, OpenExtensionsFolderAction, InstallVSIXAction, ReinstallAction, InstallSpecificVersionOfExtensionAction -} from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; +} from 'vs/workbench/contrib/extensions/browser/extensionsActions'; import { ExtensionsInput } from 'vs/workbench/contrib/extensions/common/extensionsInput'; import { ViewletRegistry, Extensions as ViewletExtensions, ViewletDescriptor } from 'vs/workbench/browser/viewlet'; import { ExtensionEditor } from 'vs/workbench/contrib/extensions/electron-browser/extensionEditor'; diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionsList.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsList.ts index 585a81141ec..a99934bf9de 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionsList.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsList.ts @@ -13,7 +13,7 @@ import { IPagedRenderer } from 'vs/base/browser/ui/list/listPaging'; import { Event } from 'vs/base/common/event'; import { domEvent } from 'vs/base/browser/event'; import { IExtension, ExtensionContainers, ExtensionState, IExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/common/extensions'; -import { InstallAction, UpdateAction, ManageExtensionAction, ReloadAction, MaliciousStatusLabelAction, ExtensionActionViewItem, StatusLabelAction, RemoteInstallAction, SystemDisabledWarningAction, DisabledLabelAction, LocalInstallAction } from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; +import { InstallAction, UpdateAction, ManageExtensionAction, ReloadAction, MaliciousStatusLabelAction, ExtensionActionViewItem, StatusLabelAction, RemoteInstallAction, SystemDisabledWarningAction, DisabledLabelAction, LocalInstallAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { Label, RatingsWidget, InstallCountWidget, RecommendationWidget, RemoteBadgeWidget, TooltipWidget } from 'vs/workbench/contrib/extensions/electron-browser/extensionsWidgets'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionsViewlet.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsViewlet.ts index 3523014aa0b..8e976829540 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionsViewlet.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsViewlet.ts @@ -23,7 +23,7 @@ import { ShowEnabledExtensionsAction, ShowInstalledExtensionsAction, ShowRecommendedExtensionsAction, ShowPopularExtensionsAction, ShowDisabledExtensionsAction, ShowOutdatedExtensionsAction, ClearExtensionsInputAction, ChangeSortAction, UpdateAllAction, CheckForUpdatesAction, DisableAllAction, EnableAllAction, EnableAutoUpdateAction, DisableAutoUpdateAction, ShowBuiltInExtensionsAction, InstallVSIXAction -} from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; +} from 'vs/workbench/contrib/extensions/browser/extensionsActions'; import { IExtensionManagementService, IExtensionManagementServerService, IExtensionManagementServer, IExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { ExtensionsInput } from 'vs/workbench/contrib/extensions/common/extensionsInput'; import { ExtensionsListView, EnabledExtensionsView, DisabledExtensionsView, RecommendedExtensionsView, WorkspaceRecommendedExtensionsView, BuiltInExtensionsView, BuiltInThemesExtensionsView, BuiltInBasicsExtensionsView, ServerExtensionsView, DefaultRecommendedExtensionsView } from './extensionsViews'; diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionsViews.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsViews.ts index e5f177c88b1..c697be98b96 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionsViews.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsViews.ts @@ -27,7 +27,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; import { ActionBar, Separator } from 'vs/base/browser/ui/actionbar/actionbar'; -import { InstallWorkspaceRecommendedExtensionsAction, ConfigureWorkspaceFolderRecommendedExtensionsAction, ManageExtensionAction } from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; +import { InstallWorkspaceRecommendedExtensionsAction, ConfigureWorkspaceFolderRecommendedExtensionsAction, ManageExtensionAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; import { WorkbenchPagedList } from 'vs/platform/list/browser/listService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionsWidgets.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsWidgets.ts index c34a342320f..6780ef4a5cc 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionsWidgets.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsWidgets.ts @@ -11,7 +11,7 @@ import * as platform from 'vs/base/common/platform'; import { localize } from 'vs/nls'; import { IExtensionManagementServerService, IExtensionTipsService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { ILabelService } from 'vs/platform/label/common/label'; -import { extensionButtonProminentBackground, extensionButtonProminentForeground, DisabledLabelAction, ReloadAction } from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; +import { extensionButtonProminentBackground, extensionButtonProminentForeground, DisabledLabelAction, ReloadAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; import { IThemeService, ITheme } from 'vs/platform/theme/common/themeService'; import { EXTENSION_BADGE_REMOTE_BACKGROUND, EXTENSION_BADGE_REMOTE_FOREGROUND } from 'vs/workbench/common/theme'; import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; 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 59758c4c6c3..9d3c58037cb 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 @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { assign } from 'vs/base/common/objects'; import { generateUuid } from 'vs/base/common/uuid'; import { IExtensionsWorkbenchService, ExtensionContainers } from 'vs/workbench/contrib/extensions/common/extensions'; -import * as ExtensionsActions from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; +import * as ExtensionsActions from 'vs/workbench/contrib/extensions/browser/extensionsActions'; import { ExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/node/extensionsWorkbenchService'; import { IExtensionManagementService, IExtensionGalleryService, IExtensionEnablementService, IExtensionTipsService, ILocalExtension, IGalleryExtension, From 92fed79878a71dc89b955e07fcb39dd13acb353f Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 12 Jun 2019 16:48:57 +0200 Subject: [PATCH 0056/1449] #74846 Dispose internal commands --- .../workbench/api/common/extHostTreeViews.ts | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/api/common/extHostTreeViews.ts b/src/vs/workbench/api/common/extHostTreeViews.ts index 5ce7b6017b1..e70b95021c4 100644 --- a/src/vs/workbench/api/common/extHostTreeViews.ts +++ b/src/vs/workbench/api/common/extHostTreeViews.ts @@ -8,7 +8,7 @@ import * as vscode from 'vscode'; import { basename } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { Emitter, Event } from 'vs/base/common/event'; -import { Disposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; import { ExtHostTreeViewsShape, MainThreadTreeViewsShape } from './extHost.protocol'; import { ITreeItem, TreeViewItemHandleArg, ITreeItemLabel, IRevealOptions } from 'vs/workbench/common/views'; import { ExtHostCommands, CommandsConverter } from 'vs/workbench/api/common/extHostCommands'; @@ -139,7 +139,7 @@ export class ExtHostTreeViews implements ExtHostTreeViewsShape { type Root = null | undefined; type TreeData = { message: boolean, element: T | Root | false }; -interface TreeNode { +interface TreeNode extends IDisposable { item: ITreeItem; parent: TreeNode | Root; children?: TreeNode[]; @@ -421,6 +421,7 @@ class ExtHostTreeView extends Disposable { if (extTreeItem) { const newNode = this.createTreeNode(extElement, extTreeItem, existing.parent); this.updateNodeCache(extElement, newNode, existing, existing.parent); + existing.dispose(); return newNode; } return null; @@ -441,15 +442,7 @@ class ExtHostTreeView extends Disposable { } private createTreeNode(element: T, extensionTreeItem: vscode.TreeItem, parent: TreeNode | Root): TreeNode { - return { - item: this.createTreeItem(element, extensionTreeItem, parent), - parent, - children: undefined - }; - } - - private createTreeItem(element: T, extensionTreeItem: vscode.TreeItem, parent: TreeNode | Root): ITreeItem { - + const disposable: DisposableStore = new DisposableStore(); const handle = this.createHandle(element, extensionTreeItem, parent); const icon = this.getLightIconPath(extensionTreeItem); const item = { @@ -459,7 +452,7 @@ class ExtHostTreeView extends Disposable { description: extensionTreeItem.description, resourceUri: extensionTreeItem.resourceUri, tooltip: typeof extensionTreeItem.tooltip === 'string' ? extensionTreeItem.tooltip : undefined, - command: extensionTreeItem.command ? this.commands.toInternal(extensionTreeItem.command) : undefined, + command: extensionTreeItem.command ? this.commands.toInternal2(extensionTreeItem.command, disposable) : undefined, contextValue: extensionTreeItem.contextValue, icon, iconDark: this.getDarkIconPath(extensionTreeItem) || icon, @@ -467,7 +460,12 @@ class ExtHostTreeView extends Disposable { collapsibleState: isUndefinedOrNull(extensionTreeItem.collapsibleState) ? TreeItemCollapsibleState.None : extensionTreeItem.collapsibleState }; - return item; + return { + item, + parent, + children: undefined, + dispose() { disposable.dispose(); } + }; } private createHandle(element: T, { id, label, resourceUri }: vscode.TreeItem, parent: TreeNode | Root, returnFirst?: boolean): TreeItemHandle { @@ -593,12 +591,14 @@ class ExtHostTreeView extends Disposable { } this.nodes.delete(element); this.elements.delete(node.item.handle); + node.dispose(); } } private clearAll(): void { this.roots = null; this.elements.clear(); + this.nodes.forEach(node => node.dispose()); this.nodes.clear(); } From 9f3bb89b857a0ceb37ce1eee17a860a7b54ab62d Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 12 Jun 2019 16:52:47 +0200 Subject: [PATCH 0057/1449] Move to browser namespace --- .../extensionsActivationProgress.ts | 0 .../extensions/electron-browser/extensions.contribution.ts | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename src/vs/workbench/contrib/extensions/{electron-browser => browser}/extensionsActivationProgress.ts (100%) diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionsActivationProgress.ts b/src/vs/workbench/contrib/extensions/browser/extensionsActivationProgress.ts similarity index 100% rename from src/vs/workbench/contrib/extensions/electron-browser/extensionsActivationProgress.ts rename to src/vs/workbench/contrib/extensions/browser/extensionsActivationProgress.ts diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts index 358f9ac3b2e..75486b87b29 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts @@ -44,7 +44,7 @@ import { ExtensionHostProfileService } from 'vs/workbench/contrib/extensions/ele import { RuntimeExtensionsInput } from 'vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsInput'; import { URI, UriComponents } from 'vs/base/common/uri'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { ExtensionActivationProgress } from 'vs/workbench/contrib/extensions/electron-browser/extensionsActivationProgress'; +import { ExtensionActivationProgress } from 'vs/workbench/contrib/extensions/browser/extensionsActivationProgress'; import { ExtensionsAutoProfiler } from 'vs/workbench/contrib/extensions/electron-browser/extensionsAutoProfiler'; import { onUnexpectedError } from 'vs/base/common/errors'; import { ExtensionDependencyChecker } from 'vs/workbench/contrib/extensions/electron-browser/extensionsDependencyChecker'; From aded4e0310e07ce55a28491caf845087e4f653d9 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 12 Jun 2019 17:01:37 +0200 Subject: [PATCH 0058/1449] revert moving to browser --- .../contrib/extensions/electron-browser/extensionEditor.ts | 2 +- .../contrib/extensions/electron-browser/extensionTipsService.ts | 2 +- .../extensions/electron-browser/extensions.contribution.ts | 2 +- .../{browser => electron-browser}/extensionsActions.ts | 0 .../contrib/extensions/electron-browser/extensionsList.ts | 2 +- .../contrib/extensions/electron-browser/extensionsViewlet.ts | 2 +- .../contrib/extensions/electron-browser/extensionsViews.ts | 2 +- .../contrib/extensions/electron-browser/extensionsWidgets.ts | 2 +- .../extensions/test/electron-browser/extensionsActions.test.ts | 2 +- 9 files changed, 8 insertions(+), 8 deletions(-) rename src/vs/workbench/contrib/extensions/{browser => electron-browser}/extensionsActions.ts (100%) diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts index edfaa46c0c4..abd20f5b63a 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts @@ -28,7 +28,7 @@ import { IExtensionsWorkbenchService, IExtensionsViewlet, VIEWLET_ID, IExtension import { RatingsWidget, InstallCountWidget, RemoteBadgeWidget } from 'vs/workbench/contrib/extensions/electron-browser/extensionsWidgets'; import { EditorOptions } from 'vs/workbench/common/editor'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; -import { CombinedInstallAction, UpdateAction, ExtensionEditorDropDownAction, ReloadAction, MaliciousStatusLabelAction, IgnoreExtensionRecommendationAction, UndoIgnoreExtensionRecommendationAction, EnableDropDownAction, DisableDropDownAction, StatusLabelAction, SetFileIconThemeAction, SetColorThemeAction, RemoteInstallAction, DisabledLabelAction, SystemDisabledWarningAction, LocalInstallAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; +import { CombinedInstallAction, UpdateAction, ExtensionEditorDropDownAction, ReloadAction, MaliciousStatusLabelAction, IgnoreExtensionRecommendationAction, UndoIgnoreExtensionRecommendationAction, EnableDropDownAction, DisableDropDownAction, StatusLabelAction, SetFileIconThemeAction, SetColorThemeAction, RemoteInstallAction, DisabledLabelAction, SystemDisabledWarningAction, LocalInstallAction } from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; import { WebviewElement } from 'vs/workbench/contrib/webview/electron-browser/webviewElement'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { DomScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement'; diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionTipsService.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionTipsService.ts index 8c07feef6f4..e16509f850d 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionTipsService.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionTipsService.ts @@ -18,7 +18,7 @@ import { ITextModel } from 'vs/editor/common/model'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import product from 'vs/platform/product/node/product'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ShowRecommendedExtensionsAction, InstallWorkspaceRecommendedExtensionsAction, InstallRecommendedExtensionAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; +import { ShowRecommendedExtensionsAction, InstallWorkspaceRecommendedExtensionsAction, InstallRecommendedExtensionAction } from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; import Severity from 'vs/base/common/severity'; import { IWorkspaceContextService, IWorkspaceFolder, IWorkspace, IWorkspaceFoldersChangeEvent, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IFileService } from 'vs/platform/files/common/files'; diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts index 75486b87b29..2daeb24e399 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts @@ -22,7 +22,7 @@ import { OpenExtensionsViewletAction, InstallExtensionsAction, ShowOutdatedExtensionsAction, ShowRecommendedExtensionsAction, ShowRecommendedKeymapExtensionsAction, ShowPopularExtensionsAction, ShowEnabledExtensionsAction, ShowInstalledExtensionsAction, ShowDisabledExtensionsAction, ShowBuiltInExtensionsAction, UpdateAllAction, EnableAllAction, EnableAllWorkpsaceAction, DisableAllAction, DisableAllWorkpsaceAction, CheckForUpdatesAction, ShowLanguageExtensionsAction, ShowAzureExtensionsAction, EnableAutoUpdateAction, DisableAutoUpdateAction, ConfigureRecommendedExtensionsCommandsContributor, OpenExtensionsFolderAction, InstallVSIXAction, ReinstallAction, InstallSpecificVersionOfExtensionAction -} from 'vs/workbench/contrib/extensions/browser/extensionsActions'; +} from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; import { ExtensionsInput } from 'vs/workbench/contrib/extensions/common/extensionsInput'; import { ViewletRegistry, Extensions as ViewletExtensions, ViewletDescriptor } from 'vs/workbench/browser/viewlet'; import { ExtensionEditor } from 'vs/workbench/contrib/extensions/electron-browser/extensionEditor'; diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts similarity index 100% rename from src/vs/workbench/contrib/extensions/browser/extensionsActions.ts rename to src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionsList.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsList.ts index a99934bf9de..585a81141ec 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionsList.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsList.ts @@ -13,7 +13,7 @@ import { IPagedRenderer } from 'vs/base/browser/ui/list/listPaging'; import { Event } from 'vs/base/common/event'; import { domEvent } from 'vs/base/browser/event'; import { IExtension, ExtensionContainers, ExtensionState, IExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/common/extensions'; -import { InstallAction, UpdateAction, ManageExtensionAction, ReloadAction, MaliciousStatusLabelAction, ExtensionActionViewItem, StatusLabelAction, RemoteInstallAction, SystemDisabledWarningAction, DisabledLabelAction, LocalInstallAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; +import { InstallAction, UpdateAction, ManageExtensionAction, ReloadAction, MaliciousStatusLabelAction, ExtensionActionViewItem, StatusLabelAction, RemoteInstallAction, SystemDisabledWarningAction, DisabledLabelAction, LocalInstallAction } from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { Label, RatingsWidget, InstallCountWidget, RecommendationWidget, RemoteBadgeWidget, TooltipWidget } from 'vs/workbench/contrib/extensions/electron-browser/extensionsWidgets'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionsViewlet.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsViewlet.ts index 8e976829540..3523014aa0b 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionsViewlet.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsViewlet.ts @@ -23,7 +23,7 @@ import { ShowEnabledExtensionsAction, ShowInstalledExtensionsAction, ShowRecommendedExtensionsAction, ShowPopularExtensionsAction, ShowDisabledExtensionsAction, ShowOutdatedExtensionsAction, ClearExtensionsInputAction, ChangeSortAction, UpdateAllAction, CheckForUpdatesAction, DisableAllAction, EnableAllAction, EnableAutoUpdateAction, DisableAutoUpdateAction, ShowBuiltInExtensionsAction, InstallVSIXAction -} from 'vs/workbench/contrib/extensions/browser/extensionsActions'; +} from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; import { IExtensionManagementService, IExtensionManagementServerService, IExtensionManagementServer, IExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { ExtensionsInput } from 'vs/workbench/contrib/extensions/common/extensionsInput'; import { ExtensionsListView, EnabledExtensionsView, DisabledExtensionsView, RecommendedExtensionsView, WorkspaceRecommendedExtensionsView, BuiltInExtensionsView, BuiltInThemesExtensionsView, BuiltInBasicsExtensionsView, ServerExtensionsView, DefaultRecommendedExtensionsView } from './extensionsViews'; diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionsViews.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsViews.ts index c697be98b96..e5f177c88b1 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionsViews.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsViews.ts @@ -27,7 +27,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; import { ActionBar, Separator } from 'vs/base/browser/ui/actionbar/actionbar'; -import { InstallWorkspaceRecommendedExtensionsAction, ConfigureWorkspaceFolderRecommendedExtensionsAction, ManageExtensionAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; +import { InstallWorkspaceRecommendedExtensionsAction, ConfigureWorkspaceFolderRecommendedExtensionsAction, ManageExtensionAction } from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; import { WorkbenchPagedList } from 'vs/platform/list/browser/listService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionsWidgets.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsWidgets.ts index 6780ef4a5cc..c34a342320f 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionsWidgets.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsWidgets.ts @@ -11,7 +11,7 @@ import * as platform from 'vs/base/common/platform'; import { localize } from 'vs/nls'; import { IExtensionManagementServerService, IExtensionTipsService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { ILabelService } from 'vs/platform/label/common/label'; -import { extensionButtonProminentBackground, extensionButtonProminentForeground, DisabledLabelAction, ReloadAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; +import { extensionButtonProminentBackground, extensionButtonProminentForeground, DisabledLabelAction, ReloadAction } from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; import { IThemeService, ITheme } from 'vs/platform/theme/common/themeService'; import { EXTENSION_BADGE_REMOTE_BACKGROUND, EXTENSION_BADGE_REMOTE_FOREGROUND } from 'vs/workbench/common/theme'; import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; 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 9d3c58037cb..59758c4c6c3 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 @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { assign } from 'vs/base/common/objects'; import { generateUuid } from 'vs/base/common/uuid'; import { IExtensionsWorkbenchService, ExtensionContainers } from 'vs/workbench/contrib/extensions/common/extensions'; -import * as ExtensionsActions from 'vs/workbench/contrib/extensions/browser/extensionsActions'; +import * as ExtensionsActions from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; import { ExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/node/extensionsWorkbenchService'; import { IExtensionManagementService, IExtensionGalleryService, IExtensionEnablementService, IExtensionTipsService, ILocalExtension, IGalleryExtension, From c5bddfa5c2a6c3154e29d887297d52d34d535d7d Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 12 Jun 2019 17:03:19 +0200 Subject: [PATCH 0059/1449] fix #75344 --- src/vs/base/common/uri.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/vs/base/common/uri.ts b/src/vs/base/common/uri.ts index 90a7537b3e7..df6998eafe4 100644 --- a/src/vs/base/common/uri.ts +++ b/src/vs/base/common/uri.ts @@ -96,7 +96,10 @@ const _empty = ''; const _slash = '/'; const _regexp = /^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/; -function _isQueryStringScheme(scheme: string) { +function _isQueryStringScheme(scheme: string): boolean { + if (!scheme) { + return false; + } switch (scheme.toLowerCase()) { case 'http': case 'https': From c7fd9d611026fc2edfdc1631f55aef3594ac6565 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 12 Jun 2019 16:51:13 +0200 Subject: [PATCH 0060/1449] rawDebugSession: remove public keyword - it is just noise --- .../debug/electron-browser/rawDebugSession.ts | 88 +++++++++---------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/src/vs/workbench/contrib/debug/electron-browser/rawDebugSession.ts b/src/vs/workbench/contrib/debug/electron-browser/rawDebugSession.ts index 7640fb94946..6923684537d 100644 --- a/src/vs/workbench/contrib/debug/electron-browser/rawDebugSession.ts +++ b/src/vs/workbench/contrib/debug/electron-browser/rawDebugSession.ts @@ -160,11 +160,11 @@ export class RawDebugSession { this.debugAdapter.onRequest(request => this.dispatchRequest(request, dbgr)); } - public get onDidExitAdapter(): Event { + get onDidExitAdapter(): Event { return this._onDidExitAdapter.event; } - public get capabilities(): DebugProtocol.Capabilities { + get capabilities(): DebugProtocol.Capabilities { return this._capabilities; } @@ -172,53 +172,53 @@ export class RawDebugSession { * DA is ready to accepts setBreakpoint requests. * Becomes true after "initialized" events has been received. */ - public get readyForBreakpoints(): boolean { + get readyForBreakpoints(): boolean { return this._readyForBreakpoints; } //---- DAP events - public get onDidInitialize(): Event { + get onDidInitialize(): Event { return this._onDidInitialize.event; } - public get onDidStop(): Event { + get onDidStop(): Event { return this._onDidStop.event; } - public get onDidContinued(): Event { + get onDidContinued(): Event { return this._onDidContinued.event; } - public get onDidTerminateDebugee(): Event { + get onDidTerminateDebugee(): Event { return this._onDidTerminateDebugee.event; } - public get onDidExitDebugee(): Event { + get onDidExitDebugee(): Event { return this._onDidExitDebugee.event; } - public get onDidThread(): Event { + get onDidThread(): Event { return this._onDidThread.event; } - public get onDidOutput(): Event { + get onDidOutput(): Event { return this._onDidOutput.event; } - public get onDidBreakpoint(): Event { + get onDidBreakpoint(): Event { return this._onDidBreakpoint.event; } - public get onDidLoadedSource(): Event { + get onDidLoadedSource(): Event { return this._onDidLoadedSource.event; } - public get onDidCustomEvent(): Event { + get onDidCustomEvent(): Event { return this._onDidCustomEvent.event; } - public get onDidEvent(): Event { + get onDidEvent(): Event { return this._onDidEvent.event; } @@ -227,7 +227,7 @@ export class RawDebugSession { /** * Starts the underlying debug adapter and tracks the session time for telemetry. */ - public start(): Promise { + start(): Promise { if (!this.debugAdapter) { return Promise.reject(new Error('no debug adapter')); } @@ -241,7 +241,7 @@ export class RawDebugSession { /** * Send client capabilities to the debug adapter and receive DA capabilities in return. */ - public initialize(args: DebugProtocol.InitializeRequestArguments): Promise { + initialize(args: DebugProtocol.InitializeRequestArguments): Promise { return this.send('initialize', args).then((response: DebugProtocol.InitializeResponse) => { this.mergeCapabilities(response.body); return response; @@ -251,13 +251,13 @@ export class RawDebugSession { /** * Terminate the debuggee and shutdown the adapter */ - public disconnect(restart = false): Promise { + disconnect(restart = false): Promise { return this.shutdown(undefined, restart); } //---- DAP requests - public launchOrAttach(config: IConfig): Promise { + launchOrAttach(config: IConfig): Promise { return this.send(config.request, config).then(response => { this.mergeCapabilities(response.body); return response; @@ -267,7 +267,7 @@ export class RawDebugSession { /** * Try killing the debuggee softly... */ - public terminate(restart = false): Promise { + terminate(restart = false): Promise { if (this.capabilities.supportsTerminateRequest) { if (!this.terminated) { this.terminated = true; @@ -278,35 +278,35 @@ export class RawDebugSession { return Promise.reject(new Error('terminated not supported')); } - public restart(): Promise { + restart(): Promise { if (this.capabilities.supportsRestartRequest) { return this.send('restart', null); } return Promise.reject(new Error('restart not supported')); } - public next(args: DebugProtocol.NextArguments): Promise { + next(args: DebugProtocol.NextArguments): Promise { return this.send('next', args).then(response => { this.fireSimulatedContinuedEvent(args.threadId); return response; }); } - public stepIn(args: DebugProtocol.StepInArguments): Promise { + stepIn(args: DebugProtocol.StepInArguments): Promise { return this.send('stepIn', args).then(response => { this.fireSimulatedContinuedEvent(args.threadId); return response; }); } - public stepOut(args: DebugProtocol.StepOutArguments): Promise { + stepOut(args: DebugProtocol.StepOutArguments): Promise { return this.send('stepOut', args).then(response => { this.fireSimulatedContinuedEvent(args.threadId); return response; }); } - public continue(args: DebugProtocol.ContinueArguments): Promise { + continue(args: DebugProtocol.ContinueArguments): Promise { return this.send('continue', args).then(response => { if (response && response.body && response.body.allThreadsContinued !== undefined) { this.allThreadsContinued = response.body.allThreadsContinued; @@ -316,25 +316,25 @@ export class RawDebugSession { }); } - public pause(args: DebugProtocol.PauseArguments): Promise { + pause(args: DebugProtocol.PauseArguments): Promise { return this.send('pause', args); } - public terminateThreads(args: DebugProtocol.TerminateThreadsArguments): Promise { + terminateThreads(args: DebugProtocol.TerminateThreadsArguments): Promise { if (this.capabilities.supportsTerminateThreadsRequest) { return this.send('terminateThreads', args); } return Promise.reject(new Error('terminateThreads not supported')); } - public setVariable(args: DebugProtocol.SetVariableArguments): Promise { + setVariable(args: DebugProtocol.SetVariableArguments): Promise { if (this.capabilities.supportsSetVariable) { return this.send('setVariable', args); } return Promise.reject(new Error('setVariable not supported')); } - public restartFrame(args: DebugProtocol.RestartFrameArguments, threadId: number): Promise { + restartFrame(args: DebugProtocol.RestartFrameArguments, threadId: number): Promise { if (this.capabilities.supportsRestartFrame) { return this.send('restartFrame', args).then(response => { this.fireSimulatedContinuedEvent(threadId); @@ -344,74 +344,74 @@ export class RawDebugSession { return Promise.reject(new Error('restartFrame not supported')); } - public completions(args: DebugProtocol.CompletionsArguments): Promise { + completions(args: DebugProtocol.CompletionsArguments): Promise { if (this.capabilities.supportsCompletionsRequest) { return this.send('completions', args); } return Promise.reject(new Error('completions not supported')); } - public setBreakpoints(args: DebugProtocol.SetBreakpointsArguments): Promise { + setBreakpoints(args: DebugProtocol.SetBreakpointsArguments): Promise { return this.send('setBreakpoints', args); } - public setFunctionBreakpoints(args: DebugProtocol.SetFunctionBreakpointsArguments): Promise { + setFunctionBreakpoints(args: DebugProtocol.SetFunctionBreakpointsArguments): Promise { if (this.capabilities.supportsFunctionBreakpoints) { return this.send('setFunctionBreakpoints', args); } return Promise.reject(new Error('setFunctionBreakpoints not supported')); } - public setExceptionBreakpoints(args: DebugProtocol.SetExceptionBreakpointsArguments): Promise { + setExceptionBreakpoints(args: DebugProtocol.SetExceptionBreakpointsArguments): Promise { return this.send('setExceptionBreakpoints', args); } - public configurationDone(): Promise { + configurationDone(): Promise { if (this.capabilities.supportsConfigurationDoneRequest) { return this.send('configurationDone', null); } return Promise.reject(new Error('configurationDone not supported')); } - public stackTrace(args: DebugProtocol.StackTraceArguments): Promise { + stackTrace(args: DebugProtocol.StackTraceArguments): Promise { return this.send('stackTrace', args); } - public exceptionInfo(args: DebugProtocol.ExceptionInfoArguments): Promise { + exceptionInfo(args: DebugProtocol.ExceptionInfoArguments): Promise { if (this.capabilities.supportsExceptionInfoRequest) { return this.send('exceptionInfo', args); } return Promise.reject(new Error('exceptionInfo not supported')); } - public scopes(args: DebugProtocol.ScopesArguments): Promise { + scopes(args: DebugProtocol.ScopesArguments): Promise { return this.send('scopes', args); } - public variables(args: DebugProtocol.VariablesArguments): Promise { + variables(args: DebugProtocol.VariablesArguments): Promise { return this.send('variables', args); } - public source(args: DebugProtocol.SourceArguments): Promise { + source(args: DebugProtocol.SourceArguments): Promise { return this.send('source', args); } - public loadedSources(args: DebugProtocol.LoadedSourcesArguments): Promise { + loadedSources(args: DebugProtocol.LoadedSourcesArguments): Promise { if (this.capabilities.supportsLoadedSourcesRequest) { return this.send('loadedSources', args); } return Promise.reject(new Error('loadedSources not supported')); } - public threads(): Promise { + threads(): Promise { return this.send('threads', null); } - public evaluate(args: DebugProtocol.EvaluateArguments): Promise { + evaluate(args: DebugProtocol.EvaluateArguments): Promise { return this.send('evaluate', args); } - public stepBack(args: DebugProtocol.StepBackArguments): Promise { + stepBack(args: DebugProtocol.StepBackArguments): Promise { if (this.capabilities.supportsStepBack) { return this.send('stepBack', args).then(response => { if (response.body === undefined) { // TODO@AW why this check? @@ -423,7 +423,7 @@ export class RawDebugSession { return Promise.reject(new Error('stepBack not supported')); } - public reverseContinue(args: DebugProtocol.ReverseContinueArguments): Promise { + reverseContinue(args: DebugProtocol.ReverseContinueArguments): Promise { if (this.capabilities.supportsStepBack) { return this.send('reverseContinue', args).then(response => { if (response.body === undefined) { // TODO@AW why this check? @@ -435,7 +435,7 @@ export class RawDebugSession { return Promise.reject(new Error('reverseContinue not supported')); } - public custom(request: string, args: any): Promise { + custom(request: string, args: any): Promise { return this.send(request, args); } From 38078685b2dab1cfa9f62adedc4755e3101ded1d Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 12 Jun 2019 16:55:05 +0200 Subject: [PATCH 0061/1449] rawDebugSession: goto and gotoTargets request --- .../debug/electron-browser/rawDebugSession.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/vs/workbench/contrib/debug/electron-browser/rawDebugSession.ts b/src/vs/workbench/contrib/debug/electron-browser/rawDebugSession.ts index 6923684537d..1609ee2e67b 100644 --- a/src/vs/workbench/contrib/debug/electron-browser/rawDebugSession.ts +++ b/src/vs/workbench/contrib/debug/electron-browser/rawDebugSession.ts @@ -435,6 +435,20 @@ export class RawDebugSession { return Promise.reject(new Error('reverseContinue not supported')); } + gotoTargets(args: DebugProtocol.GotoTargetsArguments): Promise { + if (this.capabilities.supportsGotoTargetsRequest) { + return this.send('gotoTargets', args); + } + return Promise.reject(new Error('gotoTargets is not supported')); + } + + goto(args: DebugProtocol.GotoArguments): Promise { + if (this.capabilities.supportsGotoTargetsRequest) { + return this.send('goto', args); + } + return Promise.reject(new Error('goto is not supported')); + } + custom(request: string, args: any): Promise { return this.send(request, args); } From 854ec90db07208fb306fd6b632b411ac609ac0b7 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 12 Jun 2019 17:16:44 +0200 Subject: [PATCH 0062/1449] debug: introduce jumpToCursorSupported context key --- src/vs/workbench/contrib/debug/common/debug.ts | 1 + src/vs/workbench/contrib/debug/common/debugViewModel.ts | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/debug/common/debug.ts b/src/vs/workbench/contrib/debug/common/debug.ts index 887c4274ed5..7565be2d46b 100644 --- a/src/vs/workbench/contrib/debug/common/debug.ts +++ b/src/vs/workbench/contrib/debug/common/debug.ts @@ -54,6 +54,7 @@ export const CONTEXT_LOADED_SCRIPTS_ITEM_TYPE = new RawContextKey('loade export const CONTEXT_FOCUSED_SESSION_IS_ATTACH = new RawContextKey('focusedSessionIsAttach', false); export const CONTEXT_STEP_BACK_SUPPORTED = new RawContextKey('stepBackSupported', false); export const CONTEXT_RESTART_FRAME_SUPPORTED = new RawContextKey('restartFrameSupported', false); +export const CONTEXT_JUMP_TO_CURSOR_SUPPORTED = new RawContextKey('jumpToCursorSupported', false); export const EDITOR_CONTRIBUTION_ID = 'editor.contrib.debug'; export const DEBUG_SCHEME = 'debug'; diff --git a/src/vs/workbench/contrib/debug/common/debugViewModel.ts b/src/vs/workbench/contrib/debug/common/debugViewModel.ts index 977d6e78afc..2f31cde6142 100644 --- a/src/vs/workbench/contrib/debug/common/debugViewModel.ts +++ b/src/vs/workbench/contrib/debug/common/debugViewModel.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Event, Emitter } from 'vs/base/common/event'; -import { CONTEXT_EXPRESSION_SELECTED, IViewModel, IStackFrame, IDebugSession, IThread, IExpression, IFunctionBreakpoint, CONTEXT_BREAKPOINT_SELECTED, CONTEXT_LOADED_SCRIPTS_SUPPORTED, CONTEXT_STEP_BACK_SUPPORTED, CONTEXT_FOCUSED_SESSION_IS_ATTACH, CONTEXT_RESTART_FRAME_SUPPORTED } from 'vs/workbench/contrib/debug/common/debug'; +import { CONTEXT_EXPRESSION_SELECTED, IViewModel, IStackFrame, IDebugSession, IThread, IExpression, IFunctionBreakpoint, CONTEXT_BREAKPOINT_SELECTED, CONTEXT_LOADED_SCRIPTS_SUPPORTED, CONTEXT_STEP_BACK_SUPPORTED, CONTEXT_FOCUSED_SESSION_IS_ATTACH, CONTEXT_RESTART_FRAME_SUPPORTED, CONTEXT_JUMP_TO_CURSOR_SUPPORTED } from 'vs/workbench/contrib/debug/common/debug'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { isExtensionHostDebugging } from 'vs/workbench/contrib/debug/common/debugUtils'; @@ -27,6 +27,7 @@ export class ViewModel implements IViewModel { private stepBackSupportedContextKey: IContextKey; private focusedSessionIsAttach: IContextKey; private restartFrameSupportedContextKey: IContextKey; + private jumpToCursorSupported: IContextKey; constructor(contextKeyService: IContextKeyService) { this._onDidFocusSession = new Emitter(); @@ -39,6 +40,7 @@ export class ViewModel implements IViewModel { this.stepBackSupportedContextKey = CONTEXT_STEP_BACK_SUPPORTED.bindTo(contextKeyService); this.focusedSessionIsAttach = CONTEXT_FOCUSED_SESSION_IS_ATTACH.bindTo(contextKeyService); this.restartFrameSupportedContextKey = CONTEXT_RESTART_FRAME_SUPPORTED.bindTo(contextKeyService); + this.jumpToCursorSupported = CONTEXT_JUMP_TO_CURSOR_SUPPORTED.bindTo(contextKeyService); } getId(): string { @@ -68,6 +70,7 @@ export class ViewModel implements IViewModel { this.loadedScriptsSupportedContextKey.set(session ? !!session.capabilities.supportsLoadedSourcesRequest : false); this.stepBackSupportedContextKey.set(session ? !!session.capabilities.supportsStepBack : false); this.restartFrameSupportedContextKey.set(session ? !!session.capabilities.supportsRestartFrame : false); + this.jumpToCursorSupported.set(session ? !!session.capabilities.supportsGotoTargetsRequest : false); const attach = !!session && !session.parentSession && session.configuration.request === 'attach' && !isExtensionHostDebugging(session.configuration); this.focusedSessionIsAttach.set(attach); From b88396d673228250c94121c659280fe57ba74699 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 12 Jun 2019 17:17:05 +0200 Subject: [PATCH 0063/1449] debugSessionL expose goto methods --- src/vs/workbench/contrib/debug/common/debug.ts | 3 +++ .../contrib/debug/electron-browser/debugSession.ts | 14 ++++++++++++++ .../contrib/debug/test/common/mockDebug.ts | 7 +++++++ 3 files changed, 24 insertions(+) diff --git a/src/vs/workbench/contrib/debug/common/debug.ts b/src/vs/workbench/contrib/debug/common/debug.ts index 7565be2d46b..1bff71b9e9c 100644 --- a/src/vs/workbench/contrib/debug/common/debug.ts +++ b/src/vs/workbench/contrib/debug/common/debug.ts @@ -223,6 +223,9 @@ export interface IDebugSession extends ITreeElement { setVariable(variablesReference: number | undefined, name: string, value: string): Promise; loadSource(resource: uri): Promise; getLoadedSources(): Promise; + + gotoTargets(source: DebugProtocol.Source, line: number, column?: number): Promise; + goto(threadId: number, targetId: number): Promise; } export interface IThread extends ITreeElement { diff --git a/src/vs/workbench/contrib/debug/electron-browser/debugSession.ts b/src/vs/workbench/contrib/debug/electron-browser/debugSession.ts index 0704d389289..3652a5d81e6 100644 --- a/src/vs/workbench/contrib/debug/electron-browser/debugSession.ts +++ b/src/vs/workbench/contrib/debug/electron-browser/debugSession.ts @@ -451,6 +451,20 @@ export class DebugSession implements IDebugSession { return Promise.reject(new Error('no debug adapter')); } + gotoTargets(source: DebugProtocol.Source, line: number, column?: number): Promise { + if (this.raw) { + return this.raw.gotoTargets({ source, line, column }); + } + return Promise.reject(new Error('no debug adapter')); + } + + goto(threadId: number, targetId: number): Promise { + if (this.raw) { + return this.raw.goto({ threadId, targetId }); + } + return Promise.reject(new Error('no debug adapter')); + } + loadSource(resource: URI): Promise { if (!this.raw) { diff --git a/src/vs/workbench/contrib/debug/test/common/mockDebug.ts b/src/vs/workbench/contrib/debug/test/common/mockDebug.ts index 90fb2d4f711..e901017e024 100644 --- a/src/vs/workbench/contrib/debug/test/common/mockDebug.ts +++ b/src/vs/workbench/contrib/debug/test/common/mockDebug.ts @@ -287,6 +287,13 @@ export class MockSession implements IDebugSession { throw new Error('Method not implemented.'); } + gotoTargets(source: DebugProtocol.Source, line: number, column?: number | undefined): Promise { + throw new Error('Method not implemented.'); + } + goto(threadId: number, targetId: number): Promise { + throw new Error('Method not implemented.'); + } + shutdown(): void { } } From 50bd5fe811a809b0530169c6724dc6f34f69f48c Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 12 Jun 2019 17:55:06 +0200 Subject: [PATCH 0064/1449] debt - use DisposableStore and MutableDisposable in suggestModel --- src/vs/editor/contrib/suggest/suggestModel.ts | 56 +++++++++---------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/src/vs/editor/contrib/suggest/suggestModel.ts b/src/vs/editor/contrib/suggest/suggestModel.ts index c3b279eb075..082440db213 100644 --- a/src/vs/editor/contrib/suggest/suggestModel.ts +++ b/src/vs/editor/contrib/suggest/suggestModel.ts @@ -7,7 +7,7 @@ import { isNonEmptyArray } from 'vs/base/common/arrays'; import { TimeoutTimer } from 'vs/base/common/async'; import { onUnexpectedError } from 'vs/base/common/errors'; import { Emitter, Event } from 'vs/base/common/event'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose, DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { CursorChangeReason, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import { Position } from 'vs/editor/common/core/position'; @@ -91,7 +91,7 @@ export const enum State { export class SuggestModel implements IDisposable { - private _toDispose: IDisposable[] = []; + private readonly _toDispose = new DisposableStore(); private _quickSuggestDelay: number; private _triggerCharacterListener: IDisposable; private readonly _triggerQuickSuggest = new TimeoutTimer(); @@ -101,7 +101,7 @@ export class SuggestModel implements IDisposable { private _context?: LineContext; private _currentSelection: Selection; - private _completionModel?: CompletionModel; + private readonly _completionModel = new MutableDisposable(); private readonly _onDidCancel = new Emitter(); private readonly _onDidTrigger = new Emitter(); private readonly _onDidSuggest = new Emitter(); @@ -117,36 +117,36 @@ export class SuggestModel implements IDisposable { this._currentSelection = this._editor.getSelection() || new Selection(1, 1, 1, 1); // wire up various listeners - this._toDispose.push(this._editor.onDidChangeModel(() => { + this._toDispose.add(this._editor.onDidChangeModel(() => { this._updateTriggerCharacters(); this.cancel(); })); - this._toDispose.push(this._editor.onDidChangeModelLanguage(() => { + this._toDispose.add(this._editor.onDidChangeModelLanguage(() => { this._updateTriggerCharacters(); this.cancel(); })); - this._toDispose.push(this._editor.onDidChangeConfiguration(() => { + this._toDispose.add(this._editor.onDidChangeConfiguration(() => { this._updateTriggerCharacters(); this._updateQuickSuggest(); })); - this._toDispose.push(CompletionProviderRegistry.onDidChange(() => { + this._toDispose.add(CompletionProviderRegistry.onDidChange(() => { this._updateTriggerCharacters(); this._updateActiveSuggestSession(); })); - this._toDispose.push(this._editor.onDidChangeCursorSelection(e => { + this._toDispose.add(this._editor.onDidChangeCursorSelection(e => { this._onCursorChange(e); })); let editorIsComposing = false; - this._toDispose.push(this._editor.onCompositionStart(() => { + this._toDispose.add(this._editor.onCompositionStart(() => { editorIsComposing = true; })); - this._toDispose.push(this._editor.onCompositionEnd(() => { + this._toDispose.add(this._editor.onCompositionEnd(() => { // refilter when composition ends editorIsComposing = false; this._refilterCompletionItems(); })); - this._toDispose.push(this._editor.onDidChangeModelContent(() => { + this._toDispose.add(this._editor.onDidChangeModelContent(() => { // only filter completions when the editor isn't // composing a character, e.g. ¨ + u makes ü but just // ¨ cannot be used for filtering @@ -161,8 +161,8 @@ export class SuggestModel implements IDisposable { dispose(): void { dispose([this._onDidCancel, this._onDidSuggest, this._onDidTrigger, this._triggerCharacterListener, this._triggerQuickSuggest]); - this._toDispose = dispose(this._toDispose); - dispose(this._completionModel); + this._toDispose.dispose(); + this._completionModel.dispose(); this.cancel(); } @@ -206,8 +206,8 @@ export class SuggestModel implements IDisposable { if (supports) { // keep existing items that where not computed by the // supports/providers that want to trigger now - const items: CompletionItem[] | undefined = this._completionModel ? this._completionModel.adopt(supports) : undefined; - this.trigger({ auto: true, shy: false, triggerCharacter: lastChar }, Boolean(this._completionModel), supports, items); + const items: CompletionItem[] | undefined = this._completionModel.value ? this._completionModel.value.adopt(supports) : undefined; + this.trigger({ auto: true, shy: false, triggerCharacter: lastChar }, Boolean(this._completionModel.value), supports, items); } }); } @@ -227,8 +227,7 @@ export class SuggestModel implements IDisposable { } this._state = State.Idle; if (retrigger) { - dispose(this._completionModel); - this._completionModel = undefined; + this._completionModel.value = undefined; } this._context = undefined; this._onDidCancel.fire({ retrigger }); @@ -437,8 +436,7 @@ export class SuggestModel implements IDisposable { } const ctx = new LineContext(model, this._editor.getPosition(), auto, context.shy); - dispose(this._completionModel); - this._completionModel = new CompletionModel(items, this._context!.column, { + this._completionModel.value = new CompletionModel(items, this._context!.column, { leadingLineContent: ctx.leadingLineContent, characterCountDelta: ctx.column - this._context!.column }, @@ -479,28 +477,28 @@ export class SuggestModel implements IDisposable { return; } - if (!this._completionModel) { + if (!this._completionModel.value) { // happens when IntelliSense is not yet computed return; } - if (ctx.column > this._context.column && this._completionModel.incomplete.size > 0 && ctx.leadingWord.word.length !== 0) { + if (ctx.column > this._context.column && this._completionModel.value.incomplete.size > 0 && ctx.leadingWord.word.length !== 0) { // typed -> moved cursor RIGHT & incomple model & still on a word -> retrigger - const { incomplete } = this._completionModel; - const adopted = this._completionModel.adopt(incomplete); + const { incomplete } = this._completionModel.value; + const adopted = this._completionModel.value.adopt(incomplete); this.trigger({ auto: this._state === State.Auto, shy: false }, true, incomplete, adopted); } else { // typed -> moved cursor RIGHT -> update UI - let oldLineContext = this._completionModel.lineContext; + let oldLineContext = this._completionModel.value.lineContext; let isFrozen = false; - this._completionModel.lineContext = { + this._completionModel.value.lineContext = { leadingLineContent: ctx.leadingLineContent, characterCountDelta: ctx.column - this._context.column }; - if (this._completionModel.items.length === 0) { + if (this._completionModel.value.items.length === 0) { if (LineContext.shouldAutoTrigger(this._editor) && this._context.leadingWord.endColumn < ctx.leadingWord.startColumn) { // retrigger when heading into a new word @@ -510,8 +508,8 @@ export class SuggestModel implements IDisposable { if (!this._context.auto) { // freeze when IntelliSense was manually requested - this._completionModel.lineContext = oldLineContext; - isFrozen = this._completionModel.items.length > 0; + this._completionModel.value.lineContext = oldLineContext; + isFrozen = this._completionModel.value.items.length > 0; if (isFrozen && ctx.leadingWord.word.length === 0) { // there were results before but now there aren't @@ -528,7 +526,7 @@ export class SuggestModel implements IDisposable { } this._onDidSuggest.fire({ - completionModel: this._completionModel, + completionModel: this._completionModel.value, auto: this._context.auto, shy: this._context.shy, isFrozen, From f9913041c65d35c320724489fb76fe0e65b97597 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 12 Jun 2019 17:58:32 +0200 Subject: [PATCH 0065/1449] web - update scripts --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 2a3f24d0e01..8aa8557baf4 100644 --- a/package.json +++ b/package.json @@ -25,8 +25,8 @@ "download-builtin-extensions": "node build/lib/builtInExtensions.js", "monaco-compile-check": "tsc -p src/tsconfig.monaco.json --noEmit", "strict-initialization-watch": "tsc --watch -p src/tsconfig.json --noEmit --strictPropertyInitialization", - "web": "node resources/server/bin-dev/code-web.js", - "web-selfhost": "node resources/server/bin-dev/code-web.js --selfhost --folder .", + "web": "node resources/server/bin-dev/code-web.js --port=9888", + "web-selfhost": "node resources/server/bin-dev/code-web.js --port=9777 --selfhost --folder .", "install-server": "git fetch distro && git checkout distro/distro -- src/vs/server resources/server && git reset HEAD src/vs/server resources/server" }, "dependencies": { From 1ad12b24a6e8543e5e177b78c97c7788fc30be16 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 12 Jun 2019 18:09:19 +0200 Subject: [PATCH 0066/1449] allow extension resources in editor insets --- src/vs/workbench/api/browser/mainThreadCodeInsets.ts | 5 +++-- src/vs/workbench/api/common/extHost.protocol.ts | 2 +- src/vs/workbench/api/common/extHostCodeInsets.ts | 5 +++-- src/vs/workbench/api/node/extHost.api.impl.ts | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadCodeInsets.ts b/src/vs/workbench/api/browser/mainThreadCodeInsets.ts index 49a1abd1c12..e0cbafd3463 100644 --- a/src/vs/workbench/api/browser/mainThreadCodeInsets.ts +++ b/src/vs/workbench/api/browser/mainThreadCodeInsets.ts @@ -12,6 +12,7 @@ import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService import { IWebviewService, Webview } from 'vs/workbench/contrib/webview/common/webview'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { IActiveCodeEditor, IViewZone } from 'vs/editor/browser/editorBrowser'; +import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; // todo@joh move these things back into something like contrib/insets class EditorWebviewZone implements IViewZone { @@ -67,7 +68,7 @@ export class MainThreadEditorInsets implements MainThreadEditorInsetsShape { this._disposables.dispose(); } - async $createEditorInset(handle: number, id: string, uri: UriComponents, range: IRange, options: modes.IWebviewOptions): Promise { + async $createEditorInset(handle: number, id: string, uri: UriComponents, range: IRange, options: modes.IWebviewOptions, extensionId: ExtensionIdentifier, extensionLocation: UriComponents): Promise { let editor: IActiveCodeEditor | undefined; id = id.substr(0, id.indexOf(',')); //todo@joh HACK @@ -89,7 +90,7 @@ export class MainThreadEditorInsets implements MainThreadEditorInsetsShape { const webview = this._webviewService.createWebview({ enableFindWidget: false, allowSvgs: false, - extension: undefined + extension: { id: extensionId, location: URI.revive(extensionLocation) } }, { allowScripts: options.enableScripts }); diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 876d67ea636..e04436a235a 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -510,7 +510,7 @@ export interface MainThreadTelemetryShape extends IDisposable { } export interface MainThreadEditorInsetsShape extends IDisposable { - $createEditorInset(handle: number, editorId: string, document: UriComponents, range: IRange, options: modes.IWebviewOptions): Promise; + $createEditorInset(handle: number, id: string, uri: UriComponents, range: IRange, options: modes.IWebviewOptions, extensionId: ExtensionIdentifier, extensionLocation: UriComponents): Promise; $disposeEditorInset(handle: number): void; $setHtml(handle: number, value: string): void; diff --git a/src/vs/workbench/api/common/extHostCodeInsets.ts b/src/vs/workbench/api/common/extHostCodeInsets.ts index c2a6e2de298..975f4ec205d 100644 --- a/src/vs/workbench/api/common/extHostCodeInsets.ts +++ b/src/vs/workbench/api/common/extHostCodeInsets.ts @@ -10,6 +10,7 @@ import { MainThreadEditorInsetsShape } from './extHost.protocol'; import { ExtHostEditors } from 'vs/workbench/api/common/extHostTextEditors'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ExtHostTextEditor } from 'vs/workbench/api/common/extHostTextEditor'; +import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; export class ExtHostEditorInsets implements ExtHostEditorInsets { @@ -38,7 +39,7 @@ export class ExtHostEditorInsets implements ExtHostEditorInsets { this._disposables.dispose(); } - createWebviewEditorInset(editor: vscode.TextEditor, range: vscode.Range, options?: vscode.WebviewOptions): vscode.WebviewEditorInset { + createWebviewEditorInset(editor: vscode.TextEditor, range: vscode.Range, options: vscode.WebviewOptions | undefined, extension: IExtensionDescription): vscode.WebviewEditorInset { let apiEditor: ExtHostTextEditor | undefined; for (const candidate of this._editors.getVisibleTextEditors()) { @@ -108,7 +109,7 @@ export class ExtHostEditorInsets implements ExtHostEditorInsets { } }; - this._proxy.$createEditorInset(handle, apiEditor.id, apiEditor.document.uri, typeConverters.Range.from(range), options || {}); + this._proxy.$createEditorInset(handle, apiEditor.id, apiEditor.document.uri, typeConverters.Range.from(range), options || {}, extension.identifier, extension.extensionLocation); this._insets.set(handle, { editor, inset, onDidReceiveMessage }); return inset; diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 6f3dcbb327b..dc6f2cd2e16 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -489,7 +489,7 @@ export function createApiFactory( }, createWebviewTextEditorInset(editor: vscode.TextEditor, range: vscode.Range, options: vscode.WebviewOptions): vscode.WebviewEditorInset { checkProposedApiEnabled(extension); - return extHostEditorInsets.createWebviewEditorInset(editor, range, options); + return extHostEditorInsets.createWebviewEditorInset(editor, range, options, extension); }, createTerminal(nameOrOptions?: vscode.TerminalOptions | string, shellPath?: string, shellArgs?: string[] | string): vscode.Terminal { if (typeof nameOrOptions === 'object') { From 9557b28aee86b183e72a9d2b6f8572e8393cdcd2 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 12 Jun 2019 19:30:20 +0200 Subject: [PATCH 0067/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8aa8557baf4..99db23062ff 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "6baa3808683d4e0c086466c281b5b02ae4809f8f", + "distro": "060a874751adc68d68777085e88c99a8f04ba5da", "author": { "name": "Microsoft Corporation" }, From e7a5f9a5e2e9a06d3265d42e599499f4116a8bb9 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 12 Jun 2019 11:17:42 -0700 Subject: [PATCH 0068/1449] Remove the vscode-core-resource scheme This is no longer required and complicates loading of resources. Use the standard `vscode-resource` scheme instead --- src/vs/workbench/api/browser/mainThreadWebview.ts | 2 +- .../extensions/electron-browser/extensionEditor.ts | 10 +++++++--- .../update/electron-browser/releaseNotesEditor.ts | 12 +++++++++--- src/vs/workbench/contrib/webview/common/webview.ts | 2 ++ .../webview/electron-browser/webviewElement.ts | 14 +++----------- .../webview/electron-browser/webviewProtocols.ts | 6 +----- 6 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadWebview.ts b/src/vs/workbench/api/browser/mainThreadWebview.ts index c7b1f6462c5..f41c0327ae3 100644 --- a/src/vs/workbench/api/browser/mainThreadWebview.ts +++ b/src/vs/workbench/api/browser/mainThreadWebview.ts @@ -339,7 +339,7 @@ export class MainThreadWebviews extends Disposable implements MainThreadWebviews - + ${localize('errorMessage', "An error occurred while restoring view:{0}", viewType)} `; diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts index abd20f5b63a..8dd0f511fb4 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts @@ -51,14 +51,15 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten import { getDefaultValue } from 'vs/platform/configuration/common/configurationRegistry'; import { isUndefined } from 'vs/base/common/types'; import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; +import { URI } from 'vs/base/common/uri'; function renderBody(body: string): string { - const styleSheetPath = require.toUrl('./media/markdown.css').replace('file://', 'vscode-core-resource://'); + const styleSheetPath = require.toUrl('./media/markdown.css').replace('file://', 'vscode-resource://'); return ` - + @@ -538,7 +539,10 @@ export class ExtensionEditor extends BaseEditor { enableFindWidget: true, }, { - svgWhiteList: this.extensionsWorkbenchService.allowedBadgeProviders + svgWhiteList: this.extensionsWorkbenchService.allowedBadgeProviders, + localResourceRoots: [ + URI.parse(require.toUrl('./media')) + ] }); webviewElement.mountTo(this.content); this.contentDisposables.push(webviewElement.onDidFocus(() => this.fireOnDidFocus())); diff --git a/src/vs/workbench/contrib/update/electron-browser/releaseNotesEditor.ts b/src/vs/workbench/contrib/update/electron-browser/releaseNotesEditor.ts index 0fa86467f43..95c3f16b960 100644 --- a/src/vs/workbench/contrib/update/electron-browser/releaseNotesEditor.ts +++ b/src/vs/workbench/contrib/update/electron-browser/releaseNotesEditor.ts @@ -32,13 +32,13 @@ function renderBody( body: string, css: string ): string { - const styleSheetPath = require.toUrl('./media/markdown.css').replace('file://', 'vscode-core-resource://'); + const styleSheetPath = require.toUrl('./media/markdown.css').replace('file://', 'vscode-resource://'); return ` - + @@ -95,7 +95,13 @@ export class ReleaseNotesManager { 'releaseNotes', title, { group: ACTIVE_GROUP, preserveFocus: false }, - { tryRestoreScrollPosition: true, enableFindWidget: true }, + { + tryRestoreScrollPosition: true, + enableFindWidget: true, + localResourceRoots: [ + URI.parse(require.toUrl('./media')) + ] + }, undefined, { onDidClickLink: uri => this.onDidClickLink(uri), onDispose: () => { this._currentReleaseNotes = undefined; } diff --git a/src/vs/workbench/contrib/webview/common/webview.ts b/src/vs/workbench/contrib/webview/common/webview.ts index dd99355dcb4..0117b141c77 100644 --- a/src/vs/workbench/contrib/webview/common/webview.ts +++ b/src/vs/workbench/contrib/webview/common/webview.ts @@ -30,6 +30,8 @@ export interface IWebviewService { ): Webview; } +export const WebviewResourceScheme = 'vscode-resource'; + export interface WebviewOptions { readonly allowSvgs?: boolean; readonly extension?: { diff --git a/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts index b7838d14377..b86e3120d00 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts @@ -21,8 +21,8 @@ import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; import { ITunnelService, RemoteTunnel } from 'vs/platform/remote/common/tunnel'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ITheme, IThemeService } from 'vs/platform/theme/common/themeService'; -import { Webview, WebviewContentOptions, WebviewOptions } from 'vs/workbench/contrib/webview/common/webview'; -import { registerFileProtocol, WebviewProtocol } from 'vs/workbench/contrib/webview/electron-browser/webviewProtocols'; +import { Webview, WebviewContentOptions, WebviewOptions, WebviewResourceScheme } from 'vs/workbench/contrib/webview/common/webview'; +import { registerFileProtocol } from 'vs/workbench/contrib/webview/electron-browser/webviewProtocols'; import { areWebviewInputOptionsEqual } from '../browser/webviewEditorService'; import { WebviewFindWidget } from '../browser/webviewFindWidget'; import { getWebviewThemeData } from 'vs/workbench/contrib/webview/common/themeing'; @@ -116,7 +116,6 @@ class WebviewProtocolProvider extends Disposable { webview: Electron.WebviewTag, private readonly _extensionLocation: URI | undefined, private readonly _getLocalResourceRoots: () => ReadonlyArray, - private readonly _environmentService: IEnvironmentService, private readonly _fileService: IFileService, ) { super(); @@ -134,13 +133,7 @@ class WebviewProtocolProvider extends Disposable { return; } - const appRootUri = URI.file(this._environmentService.appRoot); - - registerFileProtocol(contents, WebviewProtocol.CoreResource, this._fileService, undefined, () => [ - appRootUri - ]); - - registerFileProtocol(contents, WebviewProtocol.VsCodeResource, this._fileService, this._extensionLocation, () => + registerFileProtocol(contents, WebviewResourceScheme, this._fileService, this._extensionLocation, () => this._getLocalResourceRoots() ); } @@ -420,7 +413,6 @@ export class WebviewElement extends Disposable implements Webview { this._webview, this._options.extension ? this._options.extension.location : undefined, () => (this.content.options.localResourceRoots || []), - environmentService, fileService)); this._register(new WebviewPortMappingProvider( diff --git a/src/vs/workbench/contrib/webview/electron-browser/webviewProtocols.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewProtocols.ts index 2d54b962046..b10b22c053b 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webviewProtocols.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewProtocols.ts @@ -12,10 +12,6 @@ import { getWebviewContentMimeType } from 'vs/workbench/contrib/webview/common/m type BufferProtocolCallback = (buffer?: Buffer | electron.MimeTypedBuffer | { error: number }) => void; -export const enum WebviewProtocol { - CoreResource = 'vscode-core-resource', - VsCodeResource = 'vscode-resource', -} function resolveContent(fileService: IFileService, resource: URI, mime: string, callback: BufferProtocolCallback): void { fileService.readFile(resource).then(contents => { @@ -31,7 +27,7 @@ function resolveContent(fileService: IFileService, resource: URI, mime: string, export function registerFileProtocol( contents: electron.WebContents, - protocol: WebviewProtocol, + protocol: string, fileService: IFileService, extensionLocation: URI | undefined, getRoots: () => ReadonlyArray From 01f7276b7eb02fe07802e66bc44ba9a3d8ab35ce Mon Sep 17 00:00:00 2001 From: Micah Smith Date: Wed, 12 Jun 2019 14:30:54 -0400 Subject: [PATCH 0069/1449] Fix for issue #35245 --- .../src/features/documentLinkProvider.ts | 6 +++--- .../src/test/documentLinkProvider.test.ts | 8 ++++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/extensions/markdown-language-features/src/features/documentLinkProvider.ts b/extensions/markdown-language-features/src/features/documentLinkProvider.ts index 548205566af..9ae4bcfed29 100644 --- a/extensions/markdown-language-features/src/features/documentLinkProvider.ts +++ b/extensions/markdown-language-features/src/features/documentLinkProvider.ts @@ -79,9 +79,9 @@ function extractDocumentLink( } export default class LinkProvider implements vscode.DocumentLinkProvider { - private readonly linkPattern = /(\[((!\[[^\]]*?\]\(\s*)([^\s\(\)]+?)\s*\)\]|[^\]]*\])\(\s*)(([^\s\(\)]|\(\S*?\))+)\s*(".*?")?\)/g; - private readonly referenceLinkPattern = /(\[([^\]]+)\]\[\s*?)([^\s\]]*?)\]/g; - private readonly definitionPattern = /^([\t ]*\[([^\]]+)\]:\s*)(\S+)/gm; + private readonly linkPattern = /(\[((!\[[^\]]*?\]\(\s*)([^\s\(\)]+?)\s*\)\]|(?:\\\]|[^\]])*\])\(\s*)(([^\s\(\)]|\(\S*?\))+)\s*(".*?")?\)/g; + private readonly referenceLinkPattern = /(\[((?:\\\]|[^\]])+)\]\[\s*?)([^\s\]]*?)\]/g; + private readonly definitionPattern = /^([\t ]*\[((?:\\\]|[^\]])+)\]:\s*)(\S+)/gm; public provideDocumentLinks( document: vscode.TextDocument, diff --git a/extensions/markdown-language-features/src/test/documentLinkProvider.test.ts b/extensions/markdown-language-features/src/test/documentLinkProvider.test.ts index f6309a027d3..ba6cfa2567f 100644 --- a/extensions/markdown-language-features/src/test/documentLinkProvider.test.ts +++ b/extensions/markdown-language-features/src/test/documentLinkProvider.test.ts @@ -72,6 +72,14 @@ suite('markdown.DocumentLinkProvider', () => { assertRangeEqual(link.range, new vscode.Range(0, 6, 0, 25)); }); + // #35245 + test('Should handle links with escaped characters in name', () => { + const links = getLinksForFile('a [b\\]](./file)'); + assert.strictEqual(links.length, 1); + const [link] = links; + assertRangeEqual(link.range, new vscode.Range(0, 8, 0, 14)); + }); + test('Should handle links with balanced parens', () => { { From 33ba72fef9099c4b58ad812585babc3fbacb9427 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 12 Jun 2019 20:49:56 +0200 Subject: [PATCH 0070/1449] Fix #75343 --- .../services/keybinding/electron-browser/keybindingService.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts b/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts index 99d5f9cad60..973bf52e9c4 100644 --- a/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts @@ -46,6 +46,7 @@ import { IFileService, FileChangesEvent, FileChangeType } from 'vs/platform/file import { dirname, isEqual } from 'vs/base/common/resources'; import { parse } from 'vs/base/common/json'; import * as objects from 'vs/base/common/objects'; +import { isArray } from 'vs/base/common/types'; export class KeyboardMapperFactory { public static readonly INSTANCE = new KeyboardMapperFactory(); @@ -632,7 +633,8 @@ class UserKeybindings extends Disposable { const existing = this._keybindings; try { const content = await this.fileService.readFile(this.keybindingsResource); - this._keybindings = parse(content.value.toString()); + const value = parse(content.value.toString()); + this._keybindings = isArray(value) ? value : []; } catch (e) { this._keybindings = []; } From b799118b3935e0a9c7d6e58161b6c10fe7c12860 Mon Sep 17 00:00:00 2001 From: Rob DeLine Date: Wed, 12 Jun 2019 12:49:58 -0700 Subject: [PATCH 0071/1449] fix --- src/vs/workbench/api/browser/mainThreadCodeInsets.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/api/browser/mainThreadCodeInsets.ts b/src/vs/workbench/api/browser/mainThreadCodeInsets.ts index e0cbafd3463..e0c2afc675d 100644 --- a/src/vs/workbench/api/browser/mainThreadCodeInsets.ts +++ b/src/vs/workbench/api/browser/mainThreadCodeInsets.ts @@ -92,7 +92,8 @@ export class MainThreadEditorInsets implements MainThreadEditorInsetsShape { allowSvgs: false, extension: { id: extensionId, location: URI.revive(extensionLocation) } }, { - allowScripts: options.enableScripts + allowScripts: options.enableScripts, + localResourceRoots: options.localResourceRoots ? options.localResourceRoots.map(uri => URI.revive(uri)) : undefined }); const webviewZone = new EditorWebviewZone(editor, range, webview); From b6919c804ca8ab4282268db1014d47a96ec09194 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 12 Jun 2019 11:28:52 -0700 Subject: [PATCH 0072/1449] MarkdownRenderer is disposable It registers an emitter so it should be disposed of --- src/vs/editor/contrib/markdown/markdownRenderer.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/contrib/markdown/markdownRenderer.ts b/src/vs/editor/contrib/markdown/markdownRenderer.ts index bd3a38b421c..5825a919bf5 100644 --- a/src/vs/editor/contrib/markdown/markdownRenderer.ts +++ b/src/vs/editor/contrib/markdown/markdownRenderer.ts @@ -13,16 +13,16 @@ import { tokenizeToString } from 'vs/editor/common/modes/textToHtmlTokenizer'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { optional } from 'vs/platform/instantiation/common/instantiation'; import { Event, Emitter } from 'vs/base/common/event'; -import { IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { IDisposable, DisposableStore, Disposable } from 'vs/base/common/lifecycle'; import { TokenizationRegistry } from 'vs/editor/common/modes'; export interface IMarkdownRenderResult extends IDisposable { element: HTMLElement; } -export class MarkdownRenderer { +export class MarkdownRenderer extends Disposable { - private _onDidRenderCodeBlock = new Emitter(); + private _onDidRenderCodeBlock = this._register(new Emitter()); readonly onDidRenderCodeBlock: Event = this._onDidRenderCodeBlock.event; constructor( @@ -30,6 +30,7 @@ export class MarkdownRenderer { @IModeService private readonly _modeService: IModeService, @optional(IOpenerService) private readonly _openerService: IOpenerService | null = NullOpenerService, ) { + super(); } private getOptions(disposeables: DisposableStore): RenderOptions { From 89d258cd2843d9a9dc5c8f3e1823e5f975ea50b0 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 12 Jun 2019 11:29:06 -0700 Subject: [PATCH 0073/1449] Use MutableDisposable for parameterHintsWidget --- .../parameterHints/parameterHintsWidget.ts | 35 +++++++------------ 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts b/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts index f7eae70292e..53bf31abcc5 100644 --- a/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts +++ b/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts @@ -8,7 +8,7 @@ import { domEvent, stop } from 'vs/base/browser/event'; import * as aria from 'vs/base/browser/ui/aria/aria'; import { DomScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement'; import { Event } from 'vs/base/common/event'; -import { IDisposable, Disposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { IDisposable, Disposable, DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle'; import 'vs/css!./parameterHints'; import { ContentWidgetPositionPreference, ICodeEditor, IContentWidget, IContentWidgetPosition } from 'vs/editor/browser/editorBrowser'; import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; @@ -31,7 +31,7 @@ export class ParameterHintsWidget extends Disposable implements IContentWidget, private readonly markdownRenderer: MarkdownRenderer; private readonly renderDisposeables = this._register(new DisposableStore()); - private model: ParameterHintsModel | null; + private readonly model = this._register(new MutableDisposable()); private readonly keyVisible: IContextKey; private readonly keyMultipleSignatures: IContextKey; private element: HTMLElement; @@ -52,13 +52,13 @@ export class ParameterHintsWidget extends Disposable implements IContentWidget, @IModeService modeService: IModeService, ) { super(); - this.markdownRenderer = new MarkdownRenderer(editor, modeService, openerService); - this.model = new ParameterHintsModel(editor); + this.markdownRenderer = this._register(new MarkdownRenderer(editor, modeService, openerService)); + this.model.value = new ParameterHintsModel(editor); this.keyVisible = Context.Visible.bindTo(contextKeyService); this.keyMultipleSignatures = Context.MultipleSignatures.bindTo(contextKeyService); this.visible = false; - this._register(this.model.onChangedHints(newParameterHints => { + this._register(this.model.value.onChangedHints(newParameterHints => { if (newParameterHints) { this.show(); this.render(newParameterHints); @@ -282,22 +282,22 @@ export class ParameterHintsWidget extends Disposable implements IContentWidget, } next(): void { - if (this.model) { + if (this.model.value) { this.editor.focus(); - this.model.next(); + this.model.value.next(); } } previous(): void { - if (this.model) { + if (this.model.value) { this.editor.focus(); - this.model.previous(); + this.model.value.previous(); } } cancel(): void { - if (this.model) { - this.model.cancel(); + if (this.model.value) { + this.model.value.cancel(); } } @@ -310,8 +310,8 @@ export class ParameterHintsWidget extends Disposable implements IContentWidget, } trigger(context: TriggerContext): void { - if (this.model) { - this.model.trigger(context, 0); + if (this.model.value) { + this.model.value.trigger(context, 0); } } @@ -319,15 +319,6 @@ export class ParameterHintsWidget extends Disposable implements IContentWidget, const height = Math.max(this.editor.getLayoutInfo().height / 4, 250); this.element.style.maxHeight = `${height}px`; } - - dispose(): void { - super.dispose(); - - if (this.model) { - this.model.dispose(); - this.model = null; - } - } } registerThemingParticipant((theme, collector) => { From ac364bb726cf88a905fa2cbcd33614be37c41224 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 12 Jun 2019 11:39:29 -0700 Subject: [PATCH 0074/1449] Also track disposables created from `toDisposable` and `combinedDisposable` --- src/vs/base/common/lifecycle.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/vs/base/common/lifecycle.ts b/src/vs/base/common/lifecycle.ts index 0d13f5179aa..3a3f196619d 100644 --- a/src/vs/base/common/lifecycle.ts +++ b/src/vs/base/common/lifecycle.ts @@ -30,9 +30,9 @@ function markTracked(x: T): void { } } -function trackDisposable(x: T): void { +function trackDisposable(x: T): T { if (!TRACK_DISPOSABLES) { - return; + return x; } const stack = new Error().stack!; @@ -41,6 +41,7 @@ function trackDisposable(x: T): void { console.log(stack); } }, 3000); + return x; } export interface IDisposable { @@ -76,11 +77,11 @@ export function dispose(disposables: T | T[] | undefined) export function combinedDisposable(...disposables: IDisposable[]): IDisposable { disposables.forEach(markTracked); - return { dispose: () => dispose(disposables) }; + return trackDisposable({ dispose: () => dispose(disposables) }); } export function toDisposable(fn: () => void): IDisposable { - return { dispose: fn }; + return trackDisposable({ dispose: fn }); } export class DisposableStore implements IDisposable { From 4f59729b87a16cf5ddfda6dd7cd71f6d8c0cde1f Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 12 Jun 2019 11:49:11 -0700 Subject: [PATCH 0075/1449] Use DisposableStore in extensionEditor --- .../electron-browser/extensionEditor.ts | 65 +++++++++---------- 1 file changed, 30 insertions(+), 35 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts index 8dd0f511fb4..86949eb39a1 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts @@ -13,7 +13,7 @@ import { Event, Emitter } from 'vs/base/common/event'; import { Cache, CacheResult } from 'vs/base/common/cache'; import { Action } from 'vs/base/common/actions'; import { isPromiseCanceledError } from 'vs/base/common/errors'; -import { IDisposable, dispose, toDisposable, Disposable } from 'vs/base/common/lifecycle'; +import { dispose, toDisposable, Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { domEvent } from 'vs/base/browser/event'; import { append, $, addClass, removeClass, finalHandler, join, toggleClass, hide, show } from 'vs/base/browser/dom'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; @@ -177,9 +177,8 @@ export class ExtensionEditor extends BaseEditor { private extensionManifest: Cache | null; private layoutParticipants: ILayoutParticipant[] = []; - private contentDisposables: IDisposable[] = []; - private transientDisposables: IDisposable[] = []; - private disposables: IDisposable[]; + private readonly contentDisposables = this._register(new DisposableStore()); + private readonly transientDisposables = this._register(new DisposableStore()); private activeElement: IActiveElement | null; private editorLoadComplete: boolean = false; @@ -199,7 +198,6 @@ export class ExtensionEditor extends BaseEditor { ) { super(ExtensionEditor.ID, telemetryService, themeService, storageService); - this.disposables = []; this.extensionReadme = null; this.extensionChangelog = null; this.extensionManifest = null; @@ -257,18 +255,18 @@ export class ExtensionEditor extends BaseEditor { this.subtext = append(this.subtextContainer, $('.subtext')); this.ignoreActionbar = new ActionBar(this.subtextContainer, { animated: false }); - this.disposables.push(this.extensionActionBar); - this.disposables.push(this.ignoreActionbar); + this._register(this.extensionActionBar); + this._register(this.ignoreActionbar); - Event.chain(this.extensionActionBar.onDidRun) + this._register(Event.chain(this.extensionActionBar.onDidRun) .map(({ error }) => error) .filter(error => !!error) - .on(this.onError, this, this.disposables); + .on(this.onError, this)); - Event.chain(this.ignoreActionbar.onDidRun) + this._register(Event.chain(this.ignoreActionbar.onDidRun) .map(({ error }) => error) .filter(error => !!error) - .on(this.onError, this, this.disposables); + .on(this.onError, this)); const body = append(root, $('.body')); this.navbar = new NavBar(body); @@ -285,7 +283,7 @@ export class ExtensionEditor extends BaseEditor { this.editorLoadComplete = false; const extension = input.extension; - this.transientDisposables = dispose(this.transientDisposables); + this.transientDisposables.clear(); this.extensionReadme = new Cache(() => createCancelablePromise(token => extension.getReadme(token))); this.extensionChangelog = new Cache(() => createCancelablePromise(token => extension.getChangelog(token))); @@ -384,7 +382,9 @@ export class ExtensionEditor extends BaseEditor { this.extensionActionBar.clear(); this.extensionActionBar.push(actions, { icon: true, label: true }); - this.transientDisposables.push(...[...actions, ...widgets, extensionContainers]); + for (const disposable of [...actions, ...widgets, extensionContainers]) { + this.transientDisposables.add(disposable); + } this.setSubText(extension, reloadAction); this.content.innerHTML = ''; // Clear content before setting navbar actions. @@ -431,7 +431,8 @@ export class ExtensionEditor extends BaseEditor { this.ignoreActionbar.clear(); this.ignoreActionbar.push([ignoreAction, undoIgnoreAction], { icon: true, label: true }); - this.transientDisposables.push(ignoreAction, undoIgnoreAction); + this.transientDisposables.add(ignoreAction); + this.transientDisposables.add(undoIgnoreAction); const extRecommendations = this.extensionTipsService.getAllRecommendationsWithReason(); if (extRecommendations[extension.identifier.id.toLowerCase()]) { @@ -464,7 +465,7 @@ export class ExtensionEditor extends BaseEditor { } }); - this.transientDisposables.push(reloadAction.onDidChange(e => { + this.transientDisposables.add(reloadAction.onDidChange(e => { if (e.tooltip) { this.subtext.textContent = reloadAction.tooltip; show(this.subtextContainer); @@ -505,7 +506,7 @@ export class ExtensionEditor extends BaseEditor { this.telemetryService.publicLog('extensionEditor:navbarChange', assign(extension.telemetryData, { navItem: id })); } - this.contentDisposables = dispose(this.contentDisposables); + this.contentDisposables.clear(); this.content.innerHTML = ''; this.activeElement = null; this.open(id, extension) @@ -545,12 +546,12 @@ export class ExtensionEditor extends BaseEditor { ] }); webviewElement.mountTo(this.content); - this.contentDisposables.push(webviewElement.onDidFocus(() => this.fireOnDidFocus())); + this.contentDisposables.add(webviewElement.onDidFocus(() => this.fireOnDidFocus())); const removeLayoutParticipant = arrays.insert(this.layoutParticipants, webviewElement); - this.contentDisposables.push(toDisposable(removeLayoutParticipant)); + this.contentDisposables.add(toDisposable(removeLayoutParticipant)); webviewElement.html = body; - this.contentDisposables.push(webviewElement.onDidClickLink(link => { + this.contentDisposables.add(webviewElement.onDidClickLink(link => { if (!link) { return; } @@ -559,7 +560,7 @@ export class ExtensionEditor extends BaseEditor { this.openerService.open(link); } }, null, this.contentDisposables)); - this.contentDisposables.push(webviewElement); + this.contentDisposables.add(webviewElement); return webviewElement; }) .then(undefined, () => { @@ -589,7 +590,7 @@ export class ExtensionEditor extends BaseEditor { const layout = () => scrollableContent.scanDomNode(); const removeLayoutParticipant = arrays.insert(this.layoutParticipants, { layout }); - this.contentDisposables.push(toDisposable(removeLayoutParticipant)); + this.contentDisposables.add(toDisposable(removeLayoutParticipant)); const renders = [ this.renderSettings(content, manifest, layout), @@ -613,7 +614,7 @@ export class ExtensionEditor extends BaseEditor { append(this.content, content); } else { append(this.content, scrollableContent.getDomNode()); - this.contentDisposables.push(scrollableContent); + this.contentDisposables.add(scrollableContent); } return content; }, () => { @@ -632,7 +633,7 @@ export class ExtensionEditor extends BaseEditor { const content = $('div', { class: 'subcontent' }); const scrollableContent = new DomScrollableElement(content, {}); append(this.content, scrollableContent.getDomNode()); - this.contentDisposables.push(scrollableContent); + this.contentDisposables.add(scrollableContent); const dependenciesTree = this.instantiationService.createInstance(ExtensionsTree, new ExtensionData(extension, null, extension => extension.dependencies || [], this.extensionsWorkbenchService), content); const layout = () => { @@ -641,9 +642,9 @@ export class ExtensionEditor extends BaseEditor { dependenciesTree.layout(scrollDimensions.height); }; const removeLayoutParticipant = arrays.insert(this.layoutParticipants, { layout }); - this.contentDisposables.push(toDisposable(removeLayoutParticipant)); + this.contentDisposables.add(toDisposable(removeLayoutParticipant)); - this.contentDisposables.push(dependenciesTree); + this.contentDisposables.add(dependenciesTree); scrollableContent.scanDomNode(); return Promise.resolve({ focus() { dependenciesTree.domFocus(); } }); } @@ -652,7 +653,7 @@ export class ExtensionEditor extends BaseEditor { const content = $('div', { class: 'subcontent' }); const scrollableContent = new DomScrollableElement(content, {}); append(this.content, scrollableContent.getDomNode()); - this.contentDisposables.push(scrollableContent); + this.contentDisposables.add(scrollableContent); const extensionsPackTree = this.instantiationService.createInstance(ExtensionsTree, new ExtensionData(extension, null, extension => extension.extensionPack || [], this.extensionsWorkbenchService), content); const layout = () => { @@ -661,9 +662,9 @@ export class ExtensionEditor extends BaseEditor { extensionsPackTree.layout(scrollDimensions.height); }; const removeLayoutParticipant = arrays.insert(this.layoutParticipants, { layout }); - this.contentDisposables.push(toDisposable(removeLayoutParticipant)); + this.contentDisposables.add(toDisposable(removeLayoutParticipant)); - this.contentDisposables.push(extensionsPackTree); + this.contentDisposables.add(extensionsPackTree); scrollableContent.scanDomNode(); return Promise.resolve({ focus() { extensionsPackTree.domFocus(); } }); } @@ -1078,7 +1079,7 @@ export class ExtensionEditor extends BaseEditor { const onDone = () => removeClass(this.content, 'loading'); result.promise.then(onDone, onDone); - this.contentDisposables.push(toDisposable(() => result.dispose())); + this.contentDisposables.add(toDisposable(() => result.dispose())); return result.promise; } @@ -1094,12 +1095,6 @@ export class ExtensionEditor extends BaseEditor { this.notificationService.error(err); } - - dispose(): void { - this.transientDisposables = dispose(this.transientDisposables); - this.disposables = dispose(this.disposables); - super.dispose(); - } } class ShowExtensionEditorFindCommand extends Command { From e6f9ffe8f31b025e1e537ceadec41a62c2fd0925 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 12 Jun 2019 11:52:01 -0700 Subject: [PATCH 0076/1449] Extend disposable This helps with lifecycle tracking --- .../browser/controller/pointerHandler.ts | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/src/vs/editor/browser/controller/pointerHandler.ts b/src/vs/editor/browser/controller/pointerHandler.ts index f744847b48f..e4a4a03146f 100644 --- a/src/vs/editor/browser/controller/pointerHandler.ts +++ b/src/vs/editor/browser/controller/pointerHandler.ts @@ -5,7 +5,7 @@ import * as dom from 'vs/base/browser/dom'; import { EventType, Gesture, GestureEvent } from 'vs/base/browser/touch'; -import { IDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; import { IPointerHandlerHelper, MouseHandler } from 'vs/editor/browser/controller/mouseHandler'; import { IMouseTarget } from 'vs/editor/browser/editorBrowser'; import { EditorMouseEvent } from 'vs/editor/browser/editorDom'; @@ -195,11 +195,6 @@ class TouchHandler extends MouseHandler { this._register(dom.addDisposableListener(this.viewHelper.linesContentDomNode, EventType.Tap, (e) => this.onTap(e))); this._register(dom.addDisposableListener(this.viewHelper.linesContentDomNode, EventType.Change, (e) => this.onChange(e))); this._register(dom.addDisposableListener(this.viewHelper.linesContentDomNode, EventType.Contextmenu, (e: MouseEvent) => this._onContextMenu(new EditorMouseEvent(e, this.viewHelper.viewDomNode), false))); - - } - - public dispose(): void { - super.dispose(); } private onTap(event: GestureEvent): void { @@ -219,26 +214,23 @@ class TouchHandler extends MouseHandler { } } -export class PointerHandler implements IDisposable { +export class PointerHandler extends Disposable { private readonly handler: MouseHandler; constructor(context: ViewContext, viewController: ViewController, viewHelper: IPointerHandlerHelper) { + super(); if (window.navigator.msPointerEnabled) { - this.handler = new MsPointerHandler(context, viewController, viewHelper); + this.handler = this._register(new MsPointerHandler(context, viewController, viewHelper)); } else if ((window).TouchEvent) { - this.handler = new TouchHandler(context, viewController, viewHelper); + this.handler = this._register(new TouchHandler(context, viewController, viewHelper)); } else if (window.navigator.pointerEnabled || (window).PointerEvent) { - this.handler = new StandardPointerHandler(context, viewController, viewHelper); + this.handler = this._register(new StandardPointerHandler(context, viewController, viewHelper)); } else { - this.handler = new MouseHandler(context, viewController, viewHelper); + this.handler = this._register(new MouseHandler(context, viewController, viewHelper)); } } public getTargetAtClientPoint(clientX: number, clientY: number): IMouseTarget | null { return this.handler.getTargetAtClientPoint(clientX, clientY); } - - public dispose(): void { - this.handler.dispose(); - } } From c244a40e5a0316367e03ad5bc7370a4022cd6011 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 12 Jun 2019 14:00:32 -0700 Subject: [PATCH 0077/1449] Use MutableDisposable for managing listeners --- .../browser/parts/statusbar/statusbarPart.ts | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts index 654c846e5b7..0286df6d404 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts @@ -6,7 +6,7 @@ import 'vs/css!./media/statusbarpart'; import * as nls from 'vs/nls'; import { toErrorMessage } from 'vs/base/common/errorMessage'; -import { dispose, IDisposable, Disposable, toDisposable } from 'vs/base/common/lifecycle'; +import { dispose, IDisposable, Disposable, toDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { OcticonLabel } from 'vs/base/browser/ui/octiconLabel/octiconLabel'; import { Registry } from 'vs/platform/registry/common/platform'; import { ICommandService } from 'vs/platform/commands/common/commands'; @@ -636,10 +636,10 @@ class StatusbarEntryItem extends Disposable { private labelContainer: HTMLElement; private label: OcticonLabel; - private foregroundListener: IDisposable | undefined; - private backgroundListener: IDisposable | undefined; + private readonly foregroundListener = this._register(new MutableDisposable()); + private readonly backgroundListener = this._register(new MutableDisposable()); - private commandListener: IDisposable | undefined; + private readonly commandListener = this._register(new MutableDisposable()); constructor( private container: HTMLElement, @@ -692,11 +692,10 @@ class StatusbarEntryItem extends Disposable { // Update: Command if (!this.entry || entry.command !== this.entry.command) { - dispose(this.commandListener); - this.commandListener = undefined; + this.commandListener.clear(); if (entry.command) { - this.commandListener = addDisposableListener(this.labelContainer, EventType.CLICK, () => this.executeCommand(entry.command!, entry.arguments)); + this.commandListener.value = addDisposableListener(this.labelContainer, EventType.CLICK, () => this.executeCommand(entry.command!, entry.arguments)); removeClass(this.labelContainer, 'disabled'); } else { @@ -759,11 +758,9 @@ class StatusbarEntryItem extends Disposable { let colorResult: string | null = null; if (isBackground) { - dispose(this.backgroundListener); - this.backgroundListener = undefined; + this.backgroundListener.clear(); } else { - dispose(this.foregroundListener); - this.foregroundListener = undefined; + this.foregroundListener.clear(); } if (color) { @@ -781,9 +778,9 @@ class StatusbarEntryItem extends Disposable { }); if (isBackground) { - this.backgroundListener = listener; + this.backgroundListener.value = listener; } else { - this.foregroundListener = listener; + this.foregroundListener.value = listener; } } else { colorResult = color; From e9b80da4b7bee05cb084866e8b25f6719a4b45ce Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Wed, 12 Jun 2019 14:42:20 -0700 Subject: [PATCH 0078/1449] Update warning colors to pass color contrast ratio --- src/vs/platform/theme/common/colorRegistry.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index f48faaa47b5..fdcb656205d 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -234,7 +234,7 @@ export const listDropBackground = registerColor('list.dropBackground', { dark: l export const listHighlightForeground = registerColor('list.highlightForeground', { dark: '#0097fb', light: '#0066BF', hc: focusBorder }, nls.localize('highlight', 'List/Tree foreground color of the match highlights when searching inside the list/tree.')); export const listInvalidItemForeground = registerColor('list.invalidItemForeground', { dark: '#B89500', light: '#B89500', hc: '#B89500' }, nls.localize('invalidItemForeground', 'List/Tree foreground color for invalid items, for example an unresolved root in explorer.')); export const listErrorForeground = registerColor('list.errorForeground', { dark: '#F88070', light: '#B01011', hc: null }, nls.localize('listErrorForeground', 'Foreground color of list items containing errors.')); -export const listWarningForeground = registerColor('list.warningForeground', { dark: '#4d9e4d', light: '#117711', hc: null }, nls.localize('listWarningForeground', 'Foreground color of list items containing warnings.')); +export const listWarningForeground = registerColor('list.warningForeground', { dark: '#CCA700', light: '#855F00', hc: null }, nls.localize('listWarningForeground', 'Foreground color of list items containing warnings.')); export const listFilterWidgetBackground = registerColor('listFilterWidget.background', { light: '#efc1ad', dark: '#653723', hc: Color.black }, nls.localize('listFilterWidgetBackground', 'Background color of the type filter widget in lists and trees.')); export const listFilterWidgetOutline = registerColor('listFilterWidget.outline', { dark: Color.transparent, light: Color.transparent, hc: '#f38518' }, nls.localize('listFilterWidgetOutline', 'Outline color of the type filter widget in lists and trees.')); export const listFilterWidgetNoMatchesOutline = registerColor('listFilterWidget.noMatchesOutline', { dark: '#BE1100', light: '#BE1100', hc: contrastBorder }, nls.localize('listFilterWidgetNoMatchesOutline', 'Outline color of the type filter widget in lists and trees, when there are no matches.')); @@ -267,7 +267,7 @@ export const menuSeparatorBackground = registerColor('menu.separatorBackground', export const editorErrorForeground = registerColor('editorError.foreground', { dark: '#F48771', light: '#E51400', hc: null }, nls.localize('editorError.foreground', 'Foreground color of error squigglies in the editor.')); export const editorErrorBorder = registerColor('editorError.border', { dark: null, light: null, hc: Color.fromHex('#E47777').transparent(0.8) }, nls.localize('errorBorder', 'Border color of error boxes in the editor.')); -export const editorWarningForeground = registerColor('editorWarning.foreground', { dark: '#FFCC00', light: '#E9A700', hc: null }, nls.localize('editorWarning.foreground', 'Foreground color of warning squigglies in the editor.')); +export const editorWarningForeground = registerColor('editorWarning.foreground', { dark: '#CCA700', light: '#E9A700', hc: null }, nls.localize('editorWarning.foreground', 'Foreground color of warning squigglies in the editor.')); export const editorWarningBorder = registerColor('editorWarning.border', { dark: null, light: null, hc: Color.fromHex('#FFCC00').transparent(0.8) }, nls.localize('warningBorder', 'Border color of warning boxes in the editor.')); export const editorInfoForeground = registerColor('editorInfo.foreground', { dark: '#008000', light: '#008000', hc: null }, nls.localize('editorInfo.foreground', 'Foreground color of info squigglies in the editor.')); @@ -384,8 +384,7 @@ export const overviewRulerCurrentContentForeground = registerColor('editorOvervi export const overviewRulerIncomingContentForeground = registerColor('editorOverviewRuler.incomingContentForeground', { dark: transparent(mergeIncomingHeaderBackground, rulerTransparency), light: transparent(mergeIncomingHeaderBackground, rulerTransparency), hc: mergeBorder }, nls.localize('overviewRulerIncomingContentForeground', 'Incoming overview ruler foreground for inline merge-conflicts.')); export const overviewRulerCommonContentForeground = registerColor('editorOverviewRuler.commonContentForeground', { dark: transparent(mergeCommonHeaderBackground, rulerTransparency), light: transparent(mergeCommonHeaderBackground, rulerTransparency), hc: mergeBorder }, nls.localize('overviewRulerCommonContentForeground', 'Common ancestor overview ruler foreground for inline merge-conflicts.')); -const findMatchColorDefault = new Color(new RGBA(246, 185, 77, 0.7)); -export const overviewRulerFindMatchForeground = registerColor('editorOverviewRuler.findMatchForeground', { dark: findMatchColorDefault, light: findMatchColorDefault, hc: findMatchColorDefault }, nls.localize('overviewRulerFindMatchForeground', 'Overview ruler marker color for find matches. The color must not be opaque so as not to hide underlying decorations.'), true); +export const overviewRulerFindMatchForeground = registerColor('editorOverviewRuler.findMatchForeground', { dark: '#ea5e00d0', light: '#ea5e00d0', hc: '#ea5e00' }, nls.localize('overviewRulerFindMatchForeground', 'Overview ruler marker color for find matches. The color must not be opaque so as not to hide underlying decorations.'), true); export const overviewRulerSelectionHighlightForeground = registerColor('editorOverviewRuler.selectionHighlightForeground', { dark: '#A0A0A0CC', light: '#A0A0A0CC', hc: '#A0A0A0CC' }, nls.localize('overviewRulerSelectionHighlightForeground', 'Overview ruler marker color for selection highlights. The color must not be opaque so as not to hide underlying decorations.'), true); From e26d5ac79feefaa3286afe8c057f6d03e6f87d52 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Wed, 12 Jun 2019 15:07:01 -0700 Subject: [PATCH 0079/1449] browser keybinding service --- .../workbench/browser/web.simpleservices.ts | 23 +-- src/vs/workbench/electron-browser/main.ts | 2 +- src/vs/workbench/electron-browser/window.ts | 2 +- .../browser/browserKeymapService.ts | 48 ++++++ .../keybindingService.ts | 162 ++---------------- .../keybinding/common/dispatchConfig.ts | 17 ++ .../keybinding/common/keymapService.ts | 97 +++++++++++ .../keybinding.contribution.ts | 36 ++++ .../electron-browser/nativeKeymapService.ts | 160 +++++++++++++++++ src/vs/workbench/workbench.main.ts | 4 +- src/vs/workbench/workbench.web.main.ts | 3 +- 11 files changed, 381 insertions(+), 173 deletions(-) create mode 100644 src/vs/workbench/services/keybinding/browser/browserKeymapService.ts rename src/vs/workbench/services/keybinding/{electron-browser => browser}/keybindingService.ts (79%) create mode 100644 src/vs/workbench/services/keybinding/common/dispatchConfig.ts create mode 100644 src/vs/workbench/services/keybinding/common/keymapService.ts create mode 100644 src/vs/workbench/services/keybinding/electron-browser/keybinding.contribution.ts create mode 100644 src/vs/workbench/services/keybinding/electron-browser/nativeKeymapService.ts diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index b69b8e72f45..568651178d8 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -13,7 +13,7 @@ import { Event } from 'vs/base/common/event'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; // tslint:disable-next-line: import-patterns no-standalone-editor -import { StandaloneKeybindingService, SimpleResourcePropertiesService } from 'vs/editor/standalone/browser/simpleServices'; +import { SimpleResourcePropertiesService } from 'vs/editor/standalone/browser/simpleServices'; import { IDownloadService } from 'vs/platform/download/common/download'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IExtensionHostDebugParams, IDebugParams } from 'vs/platform/environment/common/environment'; @@ -21,10 +21,7 @@ import { IExtensionGalleryService, IQueryOptions, IGalleryExtension, InstallOper import { IPager } from 'vs/base/common/paging'; import { IExtensionManifest, ExtensionType, ExtensionIdentifier, IExtension } from 'vs/platform/extensions/common/extensions'; import { IURLHandler, IURLService } from 'vs/platform/url/common/url'; -import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { ICommandService } from 'vs/platform/commands/common/commands'; import { ITelemetryService, ITelemetryData, ITelemetryInfo } from 'vs/platform/telemetry/common/telemetry'; -import { INotificationService } from 'vs/platform/notification/common/notification'; import { AbstractLifecycleService } from 'vs/platform/lifecycle/common/lifecycleService'; import { ILogService, LogLevel, ConsoleLogService } from 'vs/platform/log/common/log'; import { ShutdownReason, ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; @@ -40,7 +37,6 @@ import { IRecentlyOpened, IRecent } from 'vs/platform/history/common/history'; import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common/workspaceEditing'; import { ITextResourcePropertiesService } from 'vs/editor/common/services/resourceConfiguration'; -import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ITunnelService } from 'vs/platform/remote/common/tunnel'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IReloadSessionEvent, IExtensionHostDebugService, ICloseSessionEvent, IAttachSessionEvent, ILogToSessionEvent, ITerminateSessionEvent } from 'vs/workbench/services/extensions/common/extensionHostDebug'; @@ -638,23 +634,6 @@ registerSingleton(IExtensionUrlHandler, SimpleExtensionURLHandler, true); //#endregion -//#region Keybinding - -export class SimpleKeybindingService extends StandaloneKeybindingService { - constructor( - @IContextKeyService contextKeyService: IContextKeyService, - @ICommandService commandService: ICommandService, - @ITelemetryService telemetryService: ITelemetryService, - @INotificationService notificationService: INotificationService, - ) { - super(contextKeyService, commandService, telemetryService, notificationService, window.document.body); - } -} - -registerSingleton(IKeybindingService, SimpleKeybindingService); - -//#endregion - //#region Lifecycle export class SimpleLifecycleService extends AbstractLifecycleService { diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index 39a00efc7eb..921b9642456 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -19,7 +19,7 @@ import { WorkbenchEnvironmentService } from 'vs/workbench/services/environment/n import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { stat } from 'vs/base/node/pfs'; -import { KeyboardMapperFactory } from 'vs/workbench/services/keybinding/electron-browser/keybindingService'; +import { KeyboardMapperFactory } from 'vs/workbench/services/keybinding/electron-browser/nativeKeymapService'; import { IWindowConfiguration } from 'vs/platform/windows/common/windows'; import { webFrame } from 'electron'; import { ISingleFolderWorkspaceIdentifier, IWorkspaceInitializationPayload, ISingleFolderWorkspaceInitializationPayload, reviveWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; diff --git a/src/vs/workbench/electron-browser/window.ts b/src/vs/workbench/electron-browser/window.ts index 6b58a8de754..7d9aafccda7 100644 --- a/src/vs/workbench/electron-browser/window.ts +++ b/src/vs/workbench/electron-browser/window.ts @@ -21,7 +21,7 @@ import { IWorkbenchThemeService, VS_HC_THEME } from 'vs/workbench/services/theme import * as browser from 'vs/base/browser/browser'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IResourceInput } from 'vs/platform/editor/common/editor'; -import { KeyboardMapperFactory } from 'vs/workbench/services/keybinding/electron-browser/keybindingService'; +import { KeyboardMapperFactory } from 'vs/workbench/services/keybinding/electron-browser/nativeKeymapService'; import { ipcRenderer as ipc, webFrame, crashReporter, Event } from 'electron'; import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common/workspaceEditing'; import { IMenuService, MenuId, IMenu, MenuItemAction, ICommandAction } from 'vs/platform/actions/common/actions'; diff --git a/src/vs/workbench/services/keybinding/browser/browserKeymapService.ts b/src/vs/workbench/services/keybinding/browser/browserKeymapService.ts new file mode 100644 index 00000000000..d6d6d4147bd --- /dev/null +++ b/src/vs/workbench/services/keybinding/browser/browserKeymapService.ts @@ -0,0 +1,48 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Emitter, Event } from 'vs/base/common/event'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { IKeymapService, IKeyboardLayoutInfo, IKeyboardMapping } from 'vs/workbench/services/keybinding/common/keymapService'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { DispatchConfig } from 'vs/workbench/services/keybinding/common/dispatchConfig'; +import { IKeyboardMapper } from 'vs/workbench/services/keybinding/common/keyboardMapper'; +import { OS, OperatingSystem } from 'vs/base/common/platform'; +import { WindowsKeyboardMapper } from 'vs/workbench/services/keybinding/common/windowsKeyboardMapper'; +import { MacLinuxFallbackKeyboardMapper } from 'vs/workbench/services/keybinding/common/macLinuxFallbackKeyboardMapper'; + +class BrowserKeymapService extends Disposable implements IKeymapService { + public _serviceBrand: any; + + private readonly _onDidChangeKeyboardMapper = new Emitter(); + public readonly onDidChangeKeyboardMapper: Event = this._onDidChangeKeyboardMapper.event; + + constructor() { + super(); + } + + getKeyboardMapper(dispatchConfig: DispatchConfig): IKeyboardMapper { + return this._createKeyboardMapper(dispatchConfig); + } + + private _createKeyboardMapper(dispatchConfig: DispatchConfig): IKeyboardMapper { + if (OS === OperatingSystem.Windows) { + return new WindowsKeyboardMapper(true, {}); + } + + // Looks like reading the mappings failed (most likely Mac + Japanese/Chinese keyboard layouts) + return new MacLinuxFallbackKeyboardMapper(OS); + } + + public getCurrentKeyboardLayout(): IKeyboardLayoutInfo | null { + return null; + } + + public getRawKeyboardMapping(): IKeyboardMapping | null { + return null; + } +} + +registerSingleton(IKeymapService, BrowserKeymapService, true); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts b/src/vs/workbench/services/keybinding/browser/keybindingService.ts similarity index 79% rename from src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts rename to src/vs/workbench/services/keybinding/browser/keybindingService.ts index 99d5f9cad60..1ab23b603cc 100644 --- a/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/browser/keybindingService.ts @@ -4,8 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import * as nls from 'vs/nls'; -import * as nativeKeymap from 'native-keymap'; -import { release } from 'os'; import * as dom from 'vs/base/browser/dom'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { Emitter, Event } from 'vs/base/common/event'; @@ -30,14 +28,12 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { keybindingsTelemetry } from 'vs/platform/telemetry/common/telemetryUtils'; import { ExtensionMessageCollector, ExtensionsRegistry } from 'vs/workbench/services/extensions/common/extensionsRegistry'; import { IUserKeybindingItem, KeybindingIO, OutputBuilder } from 'vs/workbench/services/keybinding/common/keybindingIO'; -import { CachedKeyboardMapper, IKeyboardMapper } from 'vs/workbench/services/keybinding/common/keyboardMapper'; -import { MacLinuxFallbackKeyboardMapper } from 'vs/workbench/services/keybinding/common/macLinuxFallbackKeyboardMapper'; -import { IMacLinuxKeyboardMapping, MacLinuxKeyboardMapper, macLinuxKeyboardMappingEquals } from 'vs/workbench/services/keybinding/common/macLinuxKeyboardMapper'; -import { IWindowsKeyboardMapping, WindowsKeyboardMapper, windowsKeyboardMappingEquals } from 'vs/workbench/services/keybinding/common/windowsKeyboardMapper'; +import { IKeyboardMapper } from 'vs/workbench/services/keybinding/common/keyboardMapper'; import { IWindowService } from 'vs/platform/windows/common/windows'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { MenuRegistry } from 'vs/platform/actions/common/actions'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +// tslint:disable-next-line: import-patterns import { commandsExtensionPoint } from 'vs/workbench/api/common/menusExtensionPoint'; import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { RunOnceScheduler } from 'vs/base/common/async'; @@ -46,121 +42,8 @@ import { IFileService, FileChangesEvent, FileChangeType } from 'vs/platform/file import { dirname, isEqual } from 'vs/base/common/resources'; import { parse } from 'vs/base/common/json'; import * as objects from 'vs/base/common/objects'; - -export class KeyboardMapperFactory { - public static readonly INSTANCE = new KeyboardMapperFactory(); - - private _layoutInfo: nativeKeymap.IKeyboardLayoutInfo | null; - private _rawMapping: nativeKeymap.IKeyboardMapping | null; - private _keyboardMapper: IKeyboardMapper | null; - private _initialized: boolean; - - private readonly _onDidChangeKeyboardMapper = new Emitter(); - public readonly onDidChangeKeyboardMapper: Event = this._onDidChangeKeyboardMapper.event; - - private constructor() { - this._layoutInfo = null; - this._rawMapping = null; - this._keyboardMapper = null; - this._initialized = false; - } - - public _onKeyboardLayoutChanged(): void { - if (this._initialized) { - this._setKeyboardData(nativeKeymap.getCurrentKeyboardLayout(), nativeKeymap.getKeyMap()); - } - } - - public getKeyboardMapper(dispatchConfig: DispatchConfig): IKeyboardMapper { - if (!this._initialized) { - this._setKeyboardData(nativeKeymap.getCurrentKeyboardLayout(), nativeKeymap.getKeyMap()); - } - if (dispatchConfig === DispatchConfig.KeyCode) { - // Forcefully set to use keyCode - return new MacLinuxFallbackKeyboardMapper(OS); - } - return this._keyboardMapper!; - } - - public getCurrentKeyboardLayout(): nativeKeymap.IKeyboardLayoutInfo | null { - if (!this._initialized) { - this._setKeyboardData(nativeKeymap.getCurrentKeyboardLayout(), nativeKeymap.getKeyMap()); - } - return this._layoutInfo; - } - - private static _isUSStandard(_kbInfo: nativeKeymap.IKeyboardLayoutInfo): boolean { - if (OS === OperatingSystem.Linux) { - const kbInfo = _kbInfo; - return (kbInfo && kbInfo.layout === 'us'); - } - - if (OS === OperatingSystem.Macintosh) { - const kbInfo = _kbInfo; - return (kbInfo && kbInfo.id === 'com.apple.keylayout.US'); - } - - if (OS === OperatingSystem.Windows) { - const kbInfo = _kbInfo; - return (kbInfo && kbInfo.name === '00000409'); - } - - return false; - } - - public getRawKeyboardMapping(): nativeKeymap.IKeyboardMapping | null { - if (!this._initialized) { - this._setKeyboardData(nativeKeymap.getCurrentKeyboardLayout(), nativeKeymap.getKeyMap()); - } - return this._rawMapping; - } - - private _setKeyboardData(layoutInfo: nativeKeymap.IKeyboardLayoutInfo, rawMapping: nativeKeymap.IKeyboardMapping): void { - this._layoutInfo = layoutInfo; - - if (this._initialized && KeyboardMapperFactory._equals(this._rawMapping, rawMapping)) { - // nothing to do... - return; - } - - this._initialized = true; - this._rawMapping = rawMapping; - this._keyboardMapper = new CachedKeyboardMapper( - KeyboardMapperFactory._createKeyboardMapper(this._layoutInfo, this._rawMapping) - ); - this._onDidChangeKeyboardMapper.fire(); - } - - private static _createKeyboardMapper(layoutInfo: nativeKeymap.IKeyboardLayoutInfo, rawMapping: nativeKeymap.IKeyboardMapping): IKeyboardMapper { - const isUSStandard = KeyboardMapperFactory._isUSStandard(layoutInfo); - if (OS === OperatingSystem.Windows) { - return new WindowsKeyboardMapper(isUSStandard, rawMapping); - } - - if (Object.keys(rawMapping).length === 0) { - // Looks like reading the mappings failed (most likely Mac + Japanese/Chinese keyboard layouts) - return new MacLinuxFallbackKeyboardMapper(OS); - } - - if (OS === OperatingSystem.Macintosh) { - const kbInfo = layoutInfo; - if (kbInfo.id === 'com.apple.keylayout.DVORAK-QWERTYCMD') { - // Use keyCode based dispatching for DVORAK - QWERTY ⌘ - return new MacLinuxFallbackKeyboardMapper(OS); - } - } - - return new MacLinuxKeyboardMapper(isUSStandard, rawMapping, OS); - } - - private static _equals(a: nativeKeymap.IKeyboardMapping | null, b: nativeKeymap.IKeyboardMapping | null): boolean { - if (OS === OperatingSystem.Windows) { - return windowsKeyboardMappingEquals(a, b); - } - - return macLinuxKeyboardMappingEquals(a, b); - } -} +import { IKeymapService } from 'vs/workbench/services/keybinding/common/keymapService'; +import { getDispatchConfig } from 'vs/workbench/services/keybinding/common/dispatchConfig'; interface ContributedKeyBinding { command: string; @@ -257,17 +140,6 @@ const keybindingsExtPoint = ExtensionsRegistry.registerExtensionPointkeyboard).dispatch : null); - return (r === 'keyCode' ? DispatchConfig.KeyCode : DispatchConfig.Code); -} - export class WorkbenchKeybindingService extends AbstractKeybindingService { private _keyboardMapper: IKeyboardMapper; @@ -283,7 +155,8 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { @IConfigurationService configurationService: IConfigurationService, @IWindowService private readonly windowService: IWindowService, @IExtensionService extensionService: IExtensionService, - @IFileService fileService: IFileService + @IFileService fileService: IFileService, + @IKeymapService private readonly keymapService: IKeymapService ) { super(contextKeyService, commandService, telemetryService, notificationService); @@ -297,13 +170,13 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { } dispatchConfig = newDispatchConfig; - this._keyboardMapper = KeyboardMapperFactory.INSTANCE.getKeyboardMapper(dispatchConfig); + this._keyboardMapper = this.keymapService.getKeyboardMapper(dispatchConfig); this.updateResolver({ source: KeybindingSource.Default }); }); - this._keyboardMapper = KeyboardMapperFactory.INSTANCE.getKeyboardMapper(dispatchConfig); - KeyboardMapperFactory.INSTANCE.onDidChangeKeyboardMapper(() => { - this._keyboardMapper = KeyboardMapperFactory.INSTANCE.getKeyboardMapper(dispatchConfig); + this._keyboardMapper = this.keymapService.getKeyboardMapper(dispatchConfig); + this.keymapService.onDidChangeKeyboardMapper(() => { + this._keyboardMapper = this.keymapService.getKeyboardMapper(dispatchConfig); this.updateResolver({ source: KeybindingSource.Default }); }); @@ -353,7 +226,7 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { })); keybindingsTelemetry(telemetryService, this); - let data = KeyboardMapperFactory.INSTANCE.getCurrentKeyboardLayout(); + let data = this.keymapService.getCurrentKeyboardLayout(); /* __GDPR__ "keyboardLayout" : { "currentKeyboardLayout": { "${inline}": [ "${IKeyboardLayoutInfo}" ] } @@ -365,9 +238,9 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { } public _dumpDebugInfo(): string { - const layoutInfo = JSON.stringify(KeyboardMapperFactory.INSTANCE.getCurrentKeyboardLayout(), null, '\t'); + const layoutInfo = JSON.stringify(this.keymapService.getCurrentKeyboardLayout(), null, '\t'); const mapperInfo = this._keyboardMapper.dumpDebugInfo(); - const rawMapping = JSON.stringify(KeyboardMapperFactory.INSTANCE.getRawKeyboardMapping(), null, '\t'); + const rawMapping = JSON.stringify(this.keymapService.getRawKeyboardMapping(), null, '\t'); return `Layout info:\n${layoutInfo}\n${mapperInfo}\n\nRaw mapping:\n${rawMapping}`; } @@ -559,7 +432,7 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { } // consult the KeyboardMapperFactory to check the given event for // a printable value. - const mapping = KeyboardMapperFactory.INSTANCE.getRawKeyboardMapping(); + const mapping = this.keymapService.getRawKeyboardMapping(); if (!mapping) { return false; } @@ -799,13 +672,8 @@ const keyboardConfiguration: IConfigurationNode = { 'default': 'code', 'markdownDescription': nls.localize('dispatch', "Controls the dispatching logic for key presses to use either `code` (recommended) or `keyCode`."), 'included': OS === OperatingSystem.Macintosh || OS === OperatingSystem.Linux - }, - 'keyboard.touchbar.enabled': { - 'type': 'boolean', - 'default': true, - 'description': nls.localize('touchbar.enabled', "Enables the macOS touchbar buttons on the keyboard if available."), - 'included': OS === OperatingSystem.Macintosh && parseFloat(release()) >= 16 // Minimum: macOS Sierra (10.12.x = darwin 16.x) } + // no touch bar support } }; diff --git a/src/vs/workbench/services/keybinding/common/dispatchConfig.ts b/src/vs/workbench/services/keybinding/common/dispatchConfig.ts new file mode 100644 index 00000000000..a92871c7e96 --- /dev/null +++ b/src/vs/workbench/services/keybinding/common/dispatchConfig.ts @@ -0,0 +1,17 @@ +/*--------------------------------------------------------------------------------------------- + * 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'; + +export const enum DispatchConfig { + Code, + KeyCode +} + +export function getDispatchConfig(configurationService: IConfigurationService): DispatchConfig { + const keyboard = configurationService.getValue('keyboard'); + const r = (keyboard ? (keyboard).dispatch : null); + return (r === 'keyCode' ? DispatchConfig.KeyCode : DispatchConfig.Code); +} \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/common/keymapService.ts b/src/vs/workbench/services/keybinding/common/keymapService.ts new file mode 100644 index 00000000000..260a961c511 --- /dev/null +++ b/src/vs/workbench/services/keybinding/common/keymapService.ts @@ -0,0 +1,97 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Event } from 'vs/base/common/event'; +import { createDecorator, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; +import { DispatchConfig } from 'vs/workbench/services/keybinding/common/dispatchConfig'; +import { IKeyboardMapper } from 'vs/workbench/services/keybinding/common/keyboardMapper'; + +export interface IWindowsKeyMapping { + vkey: string; + value: string; + withShift: string; + withAltGr: string; + withShiftAltGr: string; +} +export interface IWindowsKeyboardMapping { + [code: string]: IWindowsKeyMapping; +} +export interface ILinuxKeyMapping { + value: string; + withShift: string; + withAltGr: string; + withShiftAltGr: string; +} +export interface ILinuxKeyboardMapping { + [code: string]: ILinuxKeyMapping; +} +export interface IMacKeyMapping { + value: string; + withShift: string; + withAltGr: string; + withShiftAltGr: string; + valueIsDeadKey: boolean; + withShiftIsDeadKey: boolean; + withAltGrIsDeadKey: boolean; + withShiftAltGrIsDeadKey: boolean; +} +export interface IMacKeyboardMapping { + [code: string]: IMacKeyMapping; +} + +export type IKeyboardMapping = IWindowsKeyboardMapping | ILinuxKeyboardMapping | IMacKeyboardMapping; + +/* __GDPR__FRAGMENT__ + "IKeyboardLayoutInfo" : { + "name" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "id": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "text": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } + } +*/ +export interface IWindowsKeyboardLayoutInfo { + name: string; + id: string; + text: string; +} + +/* __GDPR__FRAGMENT__ + "IKeyboardLayoutInfo" : { + "model" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "layout": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "variant": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "options": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "rules": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } + } +*/ +export interface ILinuxKeyboardLayoutInfo { + model: string; + layout: string; + variant: string; + options: string; + rules: string; +} + +/* __GDPR__FRAGMENT__ + "IKeyboardLayoutInfo" : { + "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "lang": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } + } +*/ +export interface IMacKeyboardLayoutInfo { + id: string; + lang: string; +} + +export type IKeyboardLayoutInfo = IWindowsKeyboardLayoutInfo | ILinuxKeyboardLayoutInfo | IMacKeyboardLayoutInfo; + +export const IKeymapService = createDecorator('keymapService'); + +export interface IKeymapService { + _serviceBrand: ServiceIdentifier; + onDidChangeKeyboardMapper: Event; + getKeyboardMapper(dispatchConfig: DispatchConfig): IKeyboardMapper; + getCurrentKeyboardLayout(): IKeyboardLayoutInfo | null; + getRawKeyboardMapping(): IKeyboardMapping | null; +} diff --git a/src/vs/workbench/services/keybinding/electron-browser/keybinding.contribution.ts b/src/vs/workbench/services/keybinding/electron-browser/keybinding.contribution.ts new file mode 100644 index 00000000000..1264211e1e3 --- /dev/null +++ b/src/vs/workbench/services/keybinding/electron-browser/keybinding.contribution.ts @@ -0,0 +1,36 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as nls from 'vs/nls'; +import { release } from 'os'; +import { OS, OperatingSystem } from 'vs/base/common/platform'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { Extensions as ConfigExtensions, IConfigurationNode, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; + +const configurationRegistry = Registry.as(ConfigExtensions.Configuration); +const keyboardConfiguration: IConfigurationNode = { + 'id': 'keyboard', + 'order': 15, + 'type': 'object', + 'title': nls.localize('keyboardConfigurationTitle', "Keyboard"), + 'overridable': true, + 'properties': { + 'keyboard.dispatch': { + 'type': 'string', + 'enum': ['code', 'keyCode'], + 'default': 'code', + 'markdownDescription': nls.localize('dispatch', "Controls the dispatching logic for key presses to use either `code` (recommended) or `keyCode`."), + 'included': OS === OperatingSystem.Macintosh || OS === OperatingSystem.Linux + }, + 'keyboard.touchbar.enabled': { + 'type': 'boolean', + 'default': true, + 'description': nls.localize('touchbar.enabled', "Enables the macOS touchbar buttons on the keyboard if available."), + 'included': OS === OperatingSystem.Macintosh && parseFloat(release()) >= 16 // Minimum: macOS Sierra (10.12.x = darwin 16.x) + } + } +}; + +configurationRegistry.registerConfiguration(keyboardConfiguration); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/electron-browser/nativeKeymapService.ts b/src/vs/workbench/services/keybinding/electron-browser/nativeKeymapService.ts new file mode 100644 index 00000000000..6870722e2a6 --- /dev/null +++ b/src/vs/workbench/services/keybinding/electron-browser/nativeKeymapService.ts @@ -0,0 +1,160 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as nativeKeymap from 'native-keymap'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { IKeymapService, IKeyboardLayoutInfo, IKeyboardMapping } from 'vs/workbench/services/keybinding/common/keymapService'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { IKeyboardMapper, CachedKeyboardMapper } from 'vs/workbench/services/keybinding/common/keyboardMapper'; +import { Emitter, Event } from 'vs/base/common/event'; +import { DispatchConfig } from 'vs/workbench/services/keybinding/common/dispatchConfig'; +import { MacLinuxFallbackKeyboardMapper } from 'vs/workbench/services/keybinding/common/macLinuxFallbackKeyboardMapper'; +import { OS, OperatingSystem } from 'vs/base/common/platform'; +import { WindowsKeyboardMapper, windowsKeyboardMappingEquals } from 'vs/workbench/services/keybinding/common/windowsKeyboardMapper'; +import { MacLinuxKeyboardMapper, macLinuxKeyboardMappingEquals, IMacLinuxKeyboardMapping } from 'vs/workbench/services/keybinding/common/macLinuxKeyboardMapper'; + +export class KeyboardMapperFactory { + public static readonly INSTANCE = new KeyboardMapperFactory(); + + private _layoutInfo: nativeKeymap.IKeyboardLayoutInfo | null; + private _rawMapping: nativeKeymap.IKeyboardMapping | null; + private _keyboardMapper: IKeyboardMapper | null; + private _initialized: boolean; + + private readonly _onDidChangeKeyboardMapper = new Emitter(); + public readonly onDidChangeKeyboardMapper: Event = this._onDidChangeKeyboardMapper.event; + + private constructor() { + this._layoutInfo = null; + this._rawMapping = null; + this._keyboardMapper = null; + this._initialized = false; + } + + public _onKeyboardLayoutChanged(): void { + if (this._initialized) { + this._setKeyboardData(nativeKeymap.getCurrentKeyboardLayout(), nativeKeymap.getKeyMap()); + } + } + + public getKeyboardMapper(dispatchConfig: DispatchConfig): IKeyboardMapper { + if (!this._initialized) { + this._setKeyboardData(nativeKeymap.getCurrentKeyboardLayout(), nativeKeymap.getKeyMap()); + } + if (dispatchConfig === DispatchConfig.KeyCode) { + // Forcefully set to use keyCode + return new MacLinuxFallbackKeyboardMapper(OS); + } + return this._keyboardMapper!; + } + + public getCurrentKeyboardLayout(): nativeKeymap.IKeyboardLayoutInfo | null { + if (!this._initialized) { + this._setKeyboardData(nativeKeymap.getCurrentKeyboardLayout(), nativeKeymap.getKeyMap()); + } + return this._layoutInfo; + } + + private static _isUSStandard(_kbInfo: nativeKeymap.IKeyboardLayoutInfo): boolean { + if (OS === OperatingSystem.Linux) { + const kbInfo = _kbInfo; + return (kbInfo && kbInfo.layout === 'us'); + } + + if (OS === OperatingSystem.Macintosh) { + const kbInfo = _kbInfo; + return (kbInfo && kbInfo.id === 'com.apple.keylayout.US'); + } + + if (OS === OperatingSystem.Windows) { + const kbInfo = _kbInfo; + return (kbInfo && kbInfo.name === '00000409'); + } + + return false; + } + + public getRawKeyboardMapping(): nativeKeymap.IKeyboardMapping | null { + if (!this._initialized) { + this._setKeyboardData(nativeKeymap.getCurrentKeyboardLayout(), nativeKeymap.getKeyMap()); + } + return this._rawMapping; + } + + private _setKeyboardData(layoutInfo: nativeKeymap.IKeyboardLayoutInfo, rawMapping: nativeKeymap.IKeyboardMapping): void { + this._layoutInfo = layoutInfo; + + if (this._initialized && KeyboardMapperFactory._equals(this._rawMapping, rawMapping)) { + // nothing to do... + return; + } + + this._initialized = true; + this._rawMapping = rawMapping; + this._keyboardMapper = new CachedKeyboardMapper( + KeyboardMapperFactory._createKeyboardMapper(this._layoutInfo, this._rawMapping) + ); + this._onDidChangeKeyboardMapper.fire(); + } + + private static _createKeyboardMapper(layoutInfo: nativeKeymap.IKeyboardLayoutInfo, rawMapping: nativeKeymap.IKeyboardMapping): IKeyboardMapper { + const isUSStandard = KeyboardMapperFactory._isUSStandard(layoutInfo); + if (OS === OperatingSystem.Windows) { + return new WindowsKeyboardMapper(isUSStandard, rawMapping); + } + + if (Object.keys(rawMapping).length === 0) { + // Looks like reading the mappings failed (most likely Mac + Japanese/Chinese keyboard layouts) + return new MacLinuxFallbackKeyboardMapper(OS); + } + + if (OS === OperatingSystem.Macintosh) { + const kbInfo = layoutInfo; + if (kbInfo.id === 'com.apple.keylayout.DVORAK-QWERTYCMD') { + // Use keyCode based dispatching for DVORAK - QWERTY ⌘ + return new MacLinuxFallbackKeyboardMapper(OS); + } + } + + return new MacLinuxKeyboardMapper(isUSStandard, rawMapping, OS); + } + + private static _equals(a: nativeKeymap.IKeyboardMapping | null, b: nativeKeymap.IKeyboardMapping | null): boolean { + if (OS === OperatingSystem.Windows) { + return windowsKeyboardMappingEquals(a, b); + } + + return macLinuxKeyboardMappingEquals(a, b); + } +} + +class NativeKeymapService extends Disposable implements IKeymapService { + public _serviceBrand: any; + + private readonly _onDidChangeKeyboardMapper = new Emitter(); + public readonly onDidChangeKeyboardMapper: Event = this._onDidChangeKeyboardMapper.event; + + constructor() { + super(); + + this._register(KeyboardMapperFactory.INSTANCE.onDidChangeKeyboardMapper(() => { + this._onDidChangeKeyboardMapper.fire(); + })); + } + + getKeyboardMapper(dispatchConfig: DispatchConfig): IKeyboardMapper { + return KeyboardMapperFactory.INSTANCE.getKeyboardMapper(dispatchConfig); + } + + public getCurrentKeyboardLayout(): IKeyboardLayoutInfo | null { + return KeyboardMapperFactory.INSTANCE.getCurrentKeyboardLayout(); + } + + public getRawKeyboardMapping(): IKeyboardMapping | null { + return KeyboardMapperFactory.INSTANCE.getRawKeyboardMapping(); + } +} + +registerSingleton(IKeymapService, NativeKeymapService, true); diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index 1863b0c8277..1ac2dcb301e 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -117,7 +117,9 @@ import 'vs/workbench/services/editor/browser/editorService'; import 'vs/workbench/services/history/browser/history'; import 'vs/workbench/services/activity/browser/activityService'; import 'vs/workbench/browser/parts/views/views'; -import 'vs/workbench/services/keybinding/electron-browser/keybindingService'; +import 'vs/workbench/services/keybinding/electron-browser/nativeKeymapService'; +import 'vs/workbench/services/keybinding/electron-browser/keybinding.contribution'; +import 'vs/workbench/services/keybinding/browser/keybindingService'; import 'vs/workbench/services/untitled/common/untitledEditorService'; import 'vs/workbench/services/textfile/node/textResourcePropertiesService'; import 'vs/workbench/services/mode/common/workbenchModeService'; diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index 392a1fb655b..751c13c4ff2 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -117,7 +117,8 @@ import 'vs/workbench/services/editor/browser/editorService'; import 'vs/workbench/services/history/browser/history'; import 'vs/workbench/services/activity/browser/activityService'; import 'vs/workbench/browser/parts/views/views'; -// import 'vs/workbench/services/keybinding/electron-browser/keybindingService'; +import 'vs/workbench/services/keybinding/browser/browserKeymapService'; +import 'vs/workbench/services/keybinding/browser/keybindingService'; import 'vs/workbench/services/untitled/common/untitledEditorService'; // import 'vs/workbench/services/textfile/node/textResourcePropertiesService'; import 'vs/workbench/services/mode/common/workbenchModeService'; From ba9266d1da6a44483621f25c20f9f4c1493457b3 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 12 Jun 2019 16:04:20 -0700 Subject: [PATCH 0080/1449] `isNonEmptyArray` should return readonly arrays for readonly array input --- src/vs/base/common/arrays.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/base/common/arrays.ts b/src/vs/base/common/arrays.ts index 8a3bb5bdbc0..c4db37f2134 100644 --- a/src/vs/base/common/arrays.ts +++ b/src/vs/base/common/arrays.ts @@ -336,7 +336,9 @@ export function isFalsyOrEmpty(obj: any): boolean { /** * @returns True if the provided object is an array and has at least one element. */ -export function isNonEmptyArray(obj: ReadonlyArray | undefined | null): obj is Array { +export function isNonEmptyArray(obj: T[] | undefined | null): obj is T[]; +export function isNonEmptyArray(obj: readonly T[] | undefined | null): obj is readonly T[]; +export function isNonEmptyArray(obj: T[] | readonly T[] | undefined | null): obj is T[] | readonly T[] { return Array.isArray(obj) && obj.length > 0; } From 86aa7aef36650fabe45dc551478c3e2a0acf3ea1 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 12 Jun 2019 16:29:02 -0700 Subject: [PATCH 0081/1449] Allow terminals to launch using clean env on Mac and Linux Fixes #70248 --- .../api/node/extHostTerminalService.ts | 5 +- .../terminal/browser/terminal.contribution.ts | 5 ++ .../contrib/terminal/browser/terminal.ts | 1 + .../browser/terminalInstanceService.ts | 5 ++ .../browser/terminalProcessManager.ts | 3 +- .../contrib/terminal/common/terminal.ts | 1 + .../terminal/common/terminalEnvironment.ts | 5 +- .../terminalInstanceService.ts | 55 ++++++++++++++++++- 8 files changed, 75 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 59caecef265..a1de46cfdf5 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -500,7 +500,10 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { variableResolver, isWorkspaceShellAllowed, pkg.version, - terminalConfig.get('setLocaleVariables', false) + terminalConfig.get('setLocaleVariables', false), + // Always inherit the environment as we need to be running in a login shell, this may + // change when macOS servers are supported + true ); // Fork the process and listen for messages diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts index 25b79bc85a6..0904438ef80 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts @@ -228,6 +228,11 @@ configurationRegistry.registerConfiguration({ }, default: [] }, + 'terminal.integrated.inheritEnv': { + markdownDescription: nls.localize('terminal.integrated.inheritEnv', "TODO"), + type: 'boolean', + default: true + }, 'terminal.integrated.env.osx': { markdownDescription: nls.localize('terminal.integrated.env.osx', "Object with environment variables that will be added to the VS Code process to be used by the terminal on macOS. Set to `null` to delete the environment variable."), type: 'object', diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.ts b/src/vs/workbench/contrib/terminal/browser/terminal.ts index 06295c9666a..59c773a8f7b 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -26,6 +26,7 @@ export interface ITerminalInstanceService { createWindowsShellHelper(shellProcessId: number, instance: ITerminalInstance, xterm: XTermTerminal): IWindowsShellHelper; createTerminalProcess(shellLaunchConfig: IShellLaunchConfig, cwd: string, cols: number, rows: number, env: IProcessEnvironment, windowsEnableConpty: boolean): ITerminalChildProcess; getDefaultShell(p: Platform): string; + getMainProcessParentEnv(): Promise; } export interface IBrowserTerminalConfigHelper extends ITerminalConfigHelper { diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts index b9bd8954a3c..eb28c172632 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts @@ -8,6 +8,7 @@ import { IWindowsShellHelper, ITerminalChildProcess } from 'vs/workbench/contrib import { Terminal as XTermTerminal } from 'xterm'; import { WebLinksAddon as XTermWebLinksAddon } from 'xterm-addon-web-links'; import { SearchAddon as XTermSearchAddon } from 'xterm-addon-search'; +import { IProcessEnvironment } from 'vs/base/common/platform'; let Terminal: typeof XTermTerminal; let WebLinksAddon: typeof XTermWebLinksAddon; @@ -50,4 +51,8 @@ export class TerminalInstanceService implements ITerminalInstanceService { public getDefaultShell(): string { throw new Error('Not implemented'); } + + public async getMainProcessParentEnv(): Promise { + return {}; + } } \ No newline at end of file diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts index 0a3d373f178..51ed69c3793 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts @@ -171,7 +171,8 @@ export class TerminalProcessManager implements ITerminalProcessManager { const lastActiveWorkspace = activeWorkspaceRootUri ? this._workspaceContextService.getWorkspaceFolder(activeWorkspaceRootUri) : null; const envFromConfigValue = this._workspaceConfigurationService.inspect(`terminal.integrated.env.${platformKey}`); const isWorkspaceShellAllowed = this._configHelper.checkWorkspaceShellPermissions(); - const env = terminalEnvironment.createTerminalEnvironment(shellLaunchConfig, lastActiveWorkspace, envFromConfigValue, this._configurationResolverService, isWorkspaceShellAllowed, this._productService.version, this._configHelper.config.setLocaleVariables); + this._terminalInstanceService.getMainProcessParentEnv(); + const env = terminalEnvironment.createTerminalEnvironment(shellLaunchConfig, lastActiveWorkspace, envFromConfigValue, this._configurationResolverService, isWorkspaceShellAllowed, this._productService.version, this._configHelper.config.setLocaleVariables, this._configHelper.config.inheritEnv); const useConpty = this._configHelper.config.windowsEnableConpty; return this._terminalInstanceService.createTerminalProcess(shellLaunchConfig, initialCwd, cols, rows, env, useConpty); diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index 5fd9248c115..bce06565e11 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -94,6 +94,7 @@ export interface ITerminalConfiguration { cwd: string; confirmOnExit: boolean; enableBell: boolean; + inheritEnv: boolean; env: { linux: { [key: string]: string }; osx: { [key: string]: string }; diff --git a/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts b/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts index 813bd746af3..7d260cd9418 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts @@ -198,7 +198,8 @@ export function createTerminalEnvironment( configurationResolverService: IConfigurationResolverService | undefined, isWorkspaceShellAllowed: boolean, version: string | undefined, - setLocaleVariables: boolean + setLocaleVariables: boolean, + inheritEnv: boolean ): platform.IProcessEnvironment { // Create a terminal environment based on settings, launch config and permissions let env: platform.IProcessEnvironment = {}; @@ -207,7 +208,7 @@ export function createTerminalEnvironment( mergeNonNullKeys(env, shellLaunchConfig.env); } else { // Merge process env with the env from config and from shellLaunchConfig - mergeNonNullKeys(env, process.env); + mergeNonNullKeys(env, inheritEnv ? process.env : {}); // const platformKey = platform.isWindows ? 'windows' : (platform.isMacintosh ? 'osx' : 'linux'); // const envFromConfigValue = this._workspaceConfigurationService.inspect(`terminal.integrated.env.${platformKey}`); diff --git a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts index e0e69912cbc..45a5971aad9 100644 --- a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts @@ -7,12 +7,14 @@ import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/ import { ITerminalInstance, IWindowsShellHelper, IShellLaunchConfig, ITerminalChildProcess } from 'vs/workbench/contrib/terminal/common/terminal'; import { WindowsShellHelper } from 'vs/workbench/contrib/terminal/node/windowsShellHelper'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IProcessEnvironment, Platform } from 'vs/base/common/platform'; +import { IProcessEnvironment, Platform, isLinux, isMacintosh, isWindows } from 'vs/base/common/platform'; import { TerminalProcess } from 'vs/workbench/contrib/terminal/node/terminalProcess'; import { getDefaultShell } from 'vs/workbench/contrib/terminal/node/terminal'; import { Terminal as XTermTerminal } from 'xterm'; import { WebLinksAddon as XTermWebLinksAddon } from 'xterm-addon-web-links'; import { SearchAddon as XTermSearchAddon } from 'xterm-addon-search'; +import { readFile } from 'vs/base/node/pfs'; +import { basename } from 'vs/base/common/path'; let Terminal: typeof XTermTerminal; let WebLinksAddon: typeof XTermWebLinksAddon; @@ -21,6 +23,8 @@ let SearchAddon: typeof XTermSearchAddon; export class TerminalInstanceService implements ITerminalInstanceService { public _serviceBrand: any; + private _mainProcessParentEnv: IProcessEnvironment | undefined; + constructor( @IInstantiationService private readonly _instantiationService: IInstantiationService ) { @@ -58,4 +62,53 @@ export class TerminalInstanceService implements ITerminalInstanceService { public getDefaultShell(p: Platform): string { return getDefaultShell(p); } + + public async getMainProcessParentEnv(): Promise { + if (this._mainProcessParentEnv) { + return this._mainProcessParentEnv; + } + + // For Linux use /proc//status to get the parent of the main process and then fetch its + // env using /proc//environ. + if (isLinux) { + const mainProcessId = process.ppid; + const codeProcessName = basename(process.argv[0]); + let pid: number = 0; + let ppid: number = mainProcessId; + let name: string = codeProcessName; + do { + pid = ppid; + const status = await readFile(`/proc/${pid}/status`, 'utf8'); + const splitByLine = status.split('\n'); + splitByLine.forEach(line => { + if (line.indexOf('Name:') === 0) { + name = line.replace(/^Name:\s+/, ''); + } + if (line.indexOf('PPid:') === 0) { + ppid = parseInt(line.replace(/^PPid:\s+/, '')); + } + }); + } while (name === codeProcessName); + const rawEnv = await readFile(`/proc/${pid}/environ`, 'utf8'); + const env = {}; + rawEnv.split('\0').forEach(e => { + const i = e.indexOf('='); + env[e.substr(0, i)] = e.substr(i + 1); + }); + this._mainProcessParentEnv = env; + } + + // For macOS just return the root environment which seems to always be {}, this is the + // parent of the main process when code is launched from the dock. + if (isMacintosh) { + this._mainProcessParentEnv = {}; + } + + // TODO: Windows should return a fresh environment block, might need native code? + if (isWindows) { + this._mainProcessParentEnv = process.env as IProcessEnvironment; + } + + return this._mainProcessParentEnv!; + } } \ No newline at end of file From e3609a9576b74b9d5b79763a11b7e5b65ce53992 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 12 Jun 2019 16:35:29 -0700 Subject: [PATCH 0082/1449] Hook up new method --- src/vs/workbench/api/node/extHostTerminalService.ts | 2 +- .../contrib/terminal/browser/terminalProcessManager.ts | 4 ++-- .../workbench/contrib/terminal/common/terminalEnvironment.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index a1de46cfdf5..2aad0a4c38f 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -503,7 +503,7 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { terminalConfig.get('setLocaleVariables', false), // Always inherit the environment as we need to be running in a login shell, this may // change when macOS servers are supported - true + process.env as platform.IProcessEnvironment ); // Fork the process and listen for messages diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts index 51ed69c3793..8a3b9b1e9e1 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts @@ -171,8 +171,8 @@ export class TerminalProcessManager implements ITerminalProcessManager { const lastActiveWorkspace = activeWorkspaceRootUri ? this._workspaceContextService.getWorkspaceFolder(activeWorkspaceRootUri) : null; const envFromConfigValue = this._workspaceConfigurationService.inspect(`terminal.integrated.env.${platformKey}`); const isWorkspaceShellAllowed = this._configHelper.checkWorkspaceShellPermissions(); - this._terminalInstanceService.getMainProcessParentEnv(); - const env = terminalEnvironment.createTerminalEnvironment(shellLaunchConfig, lastActiveWorkspace, envFromConfigValue, this._configurationResolverService, isWorkspaceShellAllowed, this._productService.version, this._configHelper.config.setLocaleVariables, this._configHelper.config.inheritEnv); + const baseEnv = this._configHelper.config.inheritEnv ? process.env as platform.IProcessEnvironment : this._terminalInstanceService.getMainProcessParentEnv(); + const env = terminalEnvironment.createTerminalEnvironment(shellLaunchConfig, lastActiveWorkspace, envFromConfigValue, this._configurationResolverService, isWorkspaceShellAllowed, this._productService.version, this._configHelper.config.setLocaleVariables, baseEnv); const useConpty = this._configHelper.config.windowsEnableConpty; return this._terminalInstanceService.createTerminalProcess(shellLaunchConfig, initialCwd, cols, rows, env, useConpty); diff --git a/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts b/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts index 7d260cd9418..0e49495815a 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts @@ -199,7 +199,7 @@ export function createTerminalEnvironment( isWorkspaceShellAllowed: boolean, version: string | undefined, setLocaleVariables: boolean, - inheritEnv: boolean + baseEnv: platform.IProcessEnvironment ): platform.IProcessEnvironment { // Create a terminal environment based on settings, launch config and permissions let env: platform.IProcessEnvironment = {}; @@ -208,7 +208,7 @@ export function createTerminalEnvironment( mergeNonNullKeys(env, shellLaunchConfig.env); } else { // Merge process env with the env from config and from shellLaunchConfig - mergeNonNullKeys(env, inheritEnv ? process.env : {}); + mergeNonNullKeys(env, baseEnv); // const platformKey = platform.isWindows ? 'windows' : (platform.isMacintosh ? 'osx' : 'linux'); // const envFromConfigValue = this._workspaceConfigurationService.inspect(`terminal.integrated.env.${platformKey}`); From 941b5ac526e890eeb53862714f032d794591fe12 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 12 Jun 2019 16:37:56 -0700 Subject: [PATCH 0083/1449] Make parts of terminal process launching async --- .../contrib/terminal/browser/terminalProcessManager.ts | 10 +++++----- src/vs/workbench/contrib/terminal/common/terminal.ts | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts index 8a3b9b1e9e1..f5c58368380 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts @@ -96,11 +96,11 @@ export class TerminalProcessManager implements ITerminalProcessManager { } } - public createProcess( + public async createProcess( shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number - ): void { + ): Promise { const forceExtHostProcess = (this._configHelper.config as any).extHostProcess; if (shellLaunchConfig.cwd && typeof shellLaunchConfig.cwd === 'object') { this.remoteAuthority = getRemoteAuthority(shellLaunchConfig.cwd); @@ -126,7 +126,7 @@ export class TerminalProcessManager implements ITerminalProcessManager { const activeWorkspaceRootUri = this._historyService.getLastActiveWorkspaceRoot(); this._process = this._instantiationService.createInstance(TerminalProcessExtHostProxy, this._terminalId, shellLaunchConfig, activeWorkspaceRootUri, cols, rows, this._configHelper); } else { - this._process = this._launchProcess(shellLaunchConfig, cols, rows); + this._process = await this._launchProcess(shellLaunchConfig, cols, rows); } this.processState = ProcessState.LAUNCHING; @@ -159,7 +159,7 @@ export class TerminalProcessManager implements ITerminalProcessManager { }, LAUNCHING_DURATION); } - private _launchProcess(shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number): ITerminalChildProcess { + private async _launchProcess(shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number): Promise { if (!shellLaunchConfig.executable) { this._configHelper.mergeDefaultShellPathAndArgs(shellLaunchConfig, this._terminalInstanceService.getDefaultShell(platform.platform)); } @@ -171,7 +171,7 @@ export class TerminalProcessManager implements ITerminalProcessManager { const lastActiveWorkspace = activeWorkspaceRootUri ? this._workspaceContextService.getWorkspaceFolder(activeWorkspaceRootUri) : null; const envFromConfigValue = this._workspaceConfigurationService.inspect(`terminal.integrated.env.${platformKey}`); const isWorkspaceShellAllowed = this._configHelper.checkWorkspaceShellPermissions(); - const baseEnv = this._configHelper.config.inheritEnv ? process.env as platform.IProcessEnvironment : this._terminalInstanceService.getMainProcessParentEnv(); + const baseEnv = this._configHelper.config.inheritEnv ? process.env as platform.IProcessEnvironment : await this._terminalInstanceService.getMainProcessParentEnv(); const env = terminalEnvironment.createTerminalEnvironment(shellLaunchConfig, lastActiveWorkspace, envFromConfigValue, this._configurationResolverService, isWorkspaceShellAllowed, this._productService.version, this._configHelper.config.setLocaleVariables, baseEnv); const useConpty = this._configHelper.config.windowsEnableConpty; diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index bce06565e11..f1091ed5d1c 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -690,7 +690,7 @@ export interface ITerminalProcessManager extends IDisposable { readonly onProcessExit: Event; dispose(immediate?: boolean): void; - createProcess(shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number): void; + createProcess(shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number): Promise; write(data: string): void; setDimensions(cols: number, rows: number): void; From bc2758f7663cd9d6fa8b7ca1ab8982727acb1136 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 12 Jun 2019 16:39:31 -0700 Subject: [PATCH 0084/1449] Fix tests --- .../test/electron-browser/terminalLinkHandler.test.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts b/src/vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts index b5fc5e78e8a..2ed2188c6d0 100644 --- a/src/vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts +++ b/src/vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts @@ -49,8 +49,9 @@ class MockTerminalInstanceService implements ITerminalInstanceService { getDefaultShell(p: Platform): string { throw new Error('Method not implemented.'); } - - + getMainProcessParentEnv(): any { + throw new Error('Method not implemented.'); + } } interface LinkFormatInfo { From 0284f052c4e3947ec2b04397c9d68057bedf9a0e Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 12 Jun 2019 16:40:48 -0700 Subject: [PATCH 0085/1449] Mark events as readonly in VS Code api Event data should generally not be mutate as any mutations can leak to other listeners. This change marks most event type members as readonly --- src/vs/vscode.d.ts | 60 ++++++++++++++++++------------------- src/vs/vscode.proposed.d.ts | 6 ++-- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index cf6178032ce..ad87b94df19 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -531,16 +531,16 @@ declare module 'vscode' { /** * The [text editor](#TextEditor) for which the selections have changed. */ - textEditor: TextEditor; + readonly textEditor: TextEditor; /** * The new value for the [text editor's selections](#TextEditor.selections). */ - selections: Selection[]; + readonly selections: ReadonlyArray; /** * The [change kind](#TextEditorSelectionChangeKind) which has triggered this * event. Can be `undefined`. */ - kind?: TextEditorSelectionChangeKind; + readonly kind?: TextEditorSelectionChangeKind; } /** @@ -550,11 +550,11 @@ declare module 'vscode' { /** * The [text editor](#TextEditor) for which the visible ranges have changed. */ - textEditor: TextEditor; + readonly textEditor: TextEditor; /** * The new value for the [text editor's visible ranges](#TextEditor.visibleRanges). */ - visibleRanges: Range[]; + readonly visibleRanges: ReadonlyArray; } /** @@ -564,11 +564,11 @@ declare module 'vscode' { /** * The [text editor](#TextEditor) for which the options have changed. */ - textEditor: TextEditor; + readonly textEditor: TextEditor; /** * The new value for the [text editor's options](#TextEditor.options). */ - options: TextEditorOptions; + readonly options: TextEditorOptions; } /** @@ -578,11 +578,11 @@ declare module 'vscode' { /** * The [text editor](#TextEditor) for which the view column has changed. */ - textEditor: TextEditor; + readonly textEditor: TextEditor; /** * The new value for the [text editor's view column](#TextEditor.viewColumn). */ - viewColumn: ViewColumn; + readonly viewColumn: ViewColumn; } /** @@ -4203,7 +4203,7 @@ declare module 'vscode' { /** * An array of resources for which diagnostics have changed. */ - readonly uris: Uri[]; + readonly uris: ReadonlyArray; } /** @@ -5331,7 +5331,7 @@ declare module 'vscode' { /** * The task item representing the task that got started. */ - execution: TaskExecution; + readonly execution: TaskExecution; } /** @@ -5343,7 +5343,7 @@ declare module 'vscode' { /** * The task item representing the task that finished. */ - execution: TaskExecution; + readonly execution: TaskExecution; } /** @@ -5355,12 +5355,12 @@ declare module 'vscode' { /** * The task execution for which the process got started. */ - execution: TaskExecution; + readonly execution: TaskExecution; /** * The underlying process id. */ - processId: number; + readonly processId: number; } /** @@ -5372,12 +5372,12 @@ declare module 'vscode' { /** * The task execution for which the process got started. */ - execution: TaskExecution; + readonly execution: TaskExecution; /** * The process's exit code. */ - exitCode: number; + readonly exitCode: number; } export interface TaskFilter { @@ -5584,12 +5584,12 @@ declare module 'vscode' { /** * The type of change. */ - type: FileChangeType; + readonly type: FileChangeType; /** * The uri of the file that has changed. */ - uri: Uri; + readonly uri: Uri; } /** @@ -7331,12 +7331,12 @@ declare module 'vscode' { /** * The affected document. */ - document: TextDocument; + readonly document: TextDocument; /** * An array of content changes. */ - contentChanges: TextDocumentContentChangeEvent[]; + readonly contentChanges: ReadonlyArray; } /** @@ -7373,12 +7373,12 @@ declare module 'vscode' { /** * The document that will be saved. */ - document: TextDocument; + readonly document: TextDocument; /** * The reason why save was triggered. */ - reason: TextDocumentSaveReason; + readonly reason: TextDocumentSaveReason; /** * Allows to pause the event loop and to apply [pre-save-edits](#TextEdit). @@ -7419,12 +7419,12 @@ declare module 'vscode' { /** * Added workspace folders. */ - readonly added: WorkspaceFolder[]; + readonly added: ReadonlyArray; /** * Removed workspace folders. */ - readonly removed: WorkspaceFolder[]; + readonly removed: ReadonlyArray; } /** @@ -8500,17 +8500,17 @@ declare module 'vscode' { /** * The [debug session](#DebugSession) for which the custom event was received. */ - session: DebugSession; + readonly session: DebugSession; /** * Type of event. */ - event: string; + readonly event: string; /** * Event specific information. */ - body?: any; + readonly body?: any; } /** @@ -8707,17 +8707,17 @@ declare module 'vscode' { /** * Added breakpoints. */ - readonly added: Breakpoint[]; + readonly added: ReadonlyArray; /** * Removed breakpoints. */ - readonly removed: Breakpoint[]; + readonly removed: ReadonlyArray; /** * Changed breakpoints. */ - readonly changed: Breakpoint[]; + readonly changed: ReadonlyArray; } /** diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 317a06d6a5b..7b2bd2526a1 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -816,17 +816,17 @@ declare module 'vscode' { /** * Added comment threads. */ - readonly added: CommentThread[]; + readonly added: ReadonlyArray; /** * Removed comment threads. */ - readonly removed: CommentThread[]; + readonly removed: ReadonlyArray; /** * Changed comment threads. */ - readonly changed: CommentThread[]; + readonly changed: ReadonlyArray; /** * Changed draft mode From f6fbe764655ff2a38a00772de46c3a02540694a6 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 12 Jun 2019 16:41:46 -0700 Subject: [PATCH 0086/1449] Add docs --- .../workbench/contrib/terminal/browser/terminal.contribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts index 0904438ef80..866494f1d8b 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts @@ -229,7 +229,7 @@ configurationRegistry.registerConfiguration({ default: [] }, 'terminal.integrated.inheritEnv': { - markdownDescription: nls.localize('terminal.integrated.inheritEnv', "TODO"), + markdownDescription: nls.localize('terminal.integrated.inheritEnv', "Whether new shells should inherit their environment from VS Code."), type: 'boolean', default: true }, From b4f6130fe4e7a8a68c9a5f91971e488d714d3579 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 12 Jun 2019 16:54:16 -0700 Subject: [PATCH 0087/1449] Fix some compile errors resutling from readonly change --- extensions/grunt/src/main.ts | 2 +- extensions/gulp/src/main.ts | 2 +- extensions/html-language-features/client/src/tagClosing.ts | 2 +- extensions/jake/src/main.ts | 2 +- .../src/features/bufferSyncSupport.ts | 4 ++-- .../typescript-language-features/src/features/tagClosing.ts | 2 +- .../api/extHostDocumentSaveParticipant.test.ts | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/extensions/grunt/src/main.ts b/extensions/grunt/src/main.ts index 09a812ac06f..60dd60839a9 100644 --- a/extensions/grunt/src/main.ts +++ b/extensions/grunt/src/main.ts @@ -230,7 +230,7 @@ class TaskDetector { this.detectors.clear(); } - private updateWorkspaceFolders(added: vscode.WorkspaceFolder[], removed: vscode.WorkspaceFolder[]): void { + private updateWorkspaceFolders(added: readonly vscode.WorkspaceFolder[], removed: readonly vscode.WorkspaceFolder[]): void { for (let remove of removed) { let detector = this.detectors.get(remove.uri.toString()); if (detector) { diff --git a/extensions/gulp/src/main.ts b/extensions/gulp/src/main.ts index 19beae3499a..49011bf7d68 100644 --- a/extensions/gulp/src/main.ts +++ b/extensions/gulp/src/main.ts @@ -209,7 +209,7 @@ class TaskDetector { this.detectors.clear(); } - private updateWorkspaceFolders(added: vscode.WorkspaceFolder[], removed: vscode.WorkspaceFolder[]): void { + private updateWorkspaceFolders(added: readonly vscode.WorkspaceFolder[], removed: readonly vscode.WorkspaceFolder[]): void { for (let remove of removed) { let detector = this.detectors.get(remove.uri.toString()); if (detector) { diff --git a/extensions/html-language-features/client/src/tagClosing.ts b/extensions/html-language-features/client/src/tagClosing.ts index 35511e63f43..298edcdaa0a 100644 --- a/extensions/html-language-features/client/src/tagClosing.ts +++ b/extensions/html-language-features/client/src/tagClosing.ts @@ -32,7 +32,7 @@ export function activateTagClosing(tagProvider: (document: TextDocument, positio isEnabled = true; } - function onDidChangeTextDocument(document: TextDocument, changes: TextDocumentContentChangeEvent[]) { + function onDidChangeTextDocument(document: TextDocument, changes: readonly TextDocumentContentChangeEvent[]) { if (!isEnabled) { return; } diff --git a/extensions/jake/src/main.ts b/extensions/jake/src/main.ts index d778dcedab7..c1fcc6b1d36 100644 --- a/extensions/jake/src/main.ts +++ b/extensions/jake/src/main.ts @@ -208,7 +208,7 @@ class TaskDetector { this.detectors.clear(); } - private updateWorkspaceFolders(added: vscode.WorkspaceFolder[], removed: vscode.WorkspaceFolder[]): void { + private updateWorkspaceFolders(added: readonly vscode.WorkspaceFolder[], removed: readonly vscode.WorkspaceFolder[]): void { for (let remove of removed) { let detector = this.detectors.get(remove.uri.toString()); if (detector) { diff --git a/extensions/typescript-language-features/src/features/bufferSyncSupport.ts b/extensions/typescript-language-features/src/features/bufferSyncSupport.ts index 887aec2fa74..e730f8e8be6 100644 --- a/extensions/typescript-language-features/src/features/bufferSyncSupport.ts +++ b/extensions/typescript-language-features/src/features/bufferSyncSupport.ts @@ -75,7 +75,7 @@ class BufferSynchronizer { } } - public change(filepath: string, events: vscode.TextDocumentContentChangeEvent[]) { + public change(filepath: string, events: readonly vscode.TextDocumentContentChangeEvent[]) { if (!events.length) { return; } @@ -210,7 +210,7 @@ class SyncedBuffer { this.state = BufferState.Closed; } - public onContentChanged(events: vscode.TextDocumentContentChangeEvent[]): void { + public onContentChanged(events: readonly vscode.TextDocumentContentChangeEvent[]): void { if (this.state !== BufferState.Open) { console.error(`Unexpected buffer state: ${this.state}`); } diff --git a/extensions/typescript-language-features/src/features/tagClosing.ts b/extensions/typescript-language-features/src/features/tagClosing.ts index c8db74597e5..1123b175531 100644 --- a/extensions/typescript-language-features/src/features/tagClosing.ts +++ b/extensions/typescript-language-features/src/features/tagClosing.ts @@ -46,7 +46,7 @@ class TagClosing extends Disposable { private onDidChangeTextDocument( document: vscode.TextDocument, - changes: vscode.TextDocumentContentChangeEvent[] + changes: readonly vscode.TextDocumentContentChangeEvent[] ) { const activeDocument = vscode.window.activeTextEditor && vscode.window.activeTextEditor.document; if (document !== activeDocument || changes.length === 0) { diff --git a/src/vs/workbench/test/electron-browser/api/extHostDocumentSaveParticipant.test.ts b/src/vs/workbench/test/electron-browser/api/extHostDocumentSaveParticipant.test.ts index 0096e76b934..99724c53a21 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostDocumentSaveParticipant.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostDocumentSaveParticipant.test.ts @@ -85,7 +85,7 @@ suite('ExtHostDocumentSaveParticipant', () => { sub.dispose(); assert.ok(event); - assert.throws(() => { event.document = null!; }); + assert.throws(() => { (event.document as any) = null!; }); }); }); From 732988462dcc3bbcca299536b02d963b8754bead Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 12 Jun 2019 17:02:50 -0700 Subject: [PATCH 0088/1449] Use MutableDisposable for managing editorStatus items The `MutableDisposable` class helps manage a disposable value that may change over time. I noticed that editorStatus was currently manually managing its `IStatusbarEntryAccessor` elements and think `MutableDisposable` can help simplify the code and prevent mistakes, such as forgetting to dispose of a property before re-assigning it --- .../browser/parts/editor/editorStatus.ts | 94 ++++++------------- 1 file changed, 31 insertions(+), 63 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/editorStatus.ts b/src/vs/workbench/browser/parts/editor/editorStatus.ts index 7050cd72b57..f05599325a6 100644 --- a/src/vs/workbench/browser/parts/editor/editorStatus.ts +++ b/src/vs/workbench/browser/parts/editor/editorStatus.ts @@ -14,7 +14,7 @@ import { Action } from 'vs/base/common/actions'; import { Language } from 'vs/base/common/platform'; import { UntitledEditorInput } from 'vs/workbench/common/editor/untitledEditorInput'; import { IFileEditorInput, EncodingMode, IEncodingSupport, toResource, SideBySideEditorInput, IEditor as IBaseEditor, IEditorInput, SideBySideEditor, IModeSupport } from 'vs/workbench/common/editor'; -import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose, Disposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; import { IEditorAction } from 'vs/editor/common/editorCommon'; import { EndOfLineSequence } from 'vs/editor/common/model'; @@ -276,14 +276,14 @@ const nlsEOLLF = nls.localize('endOfLineLineFeed', "LF"); const nlsEOLCRLF = nls.localize('endOfLineCarriageReturnLineFeed', "CRLF"); export class EditorStatus extends Disposable implements IWorkbenchContribution { - private tabFocusModeElement?: IStatusbarEntryAccessor; - private screenRedearModeElement?: IStatusbarEntryAccessor; - private indentationElement?: IStatusbarEntryAccessor; - private selectionElement?: IStatusbarEntryAccessor; - private encodingElement?: IStatusbarEntryAccessor; - private eolElement?: IStatusbarEntryAccessor; - private modeElement?: IStatusbarEntryAccessor; - private metadataElement?: IStatusbarEntryAccessor; + private readonly tabFocusModeElement = this._register(new MutableDisposable()); + private readonly screenRedearModeElement = this._register(new MutableDisposable()); + private readonly indentationElement = this._register(new MutableDisposable()); + private readonly selectionElement = this._register(new MutableDisposable()); + private readonly encodingElement = this._register(new MutableDisposable()); + private readonly eolElement = this._register(new MutableDisposable()); + private readonly modeElement = this._register(new MutableDisposable()); + private readonly metadataElement = this._register(new MutableDisposable()); private readonly state = new State(); private readonly activeEditorListeners: IDisposable[] = []; @@ -382,45 +382,35 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution { private updateTabFocusModeElement(visible: boolean): void { if (visible) { - if (!this.tabFocusModeElement) { - this.tabFocusModeElement = this.statusbarService.addEntry({ + if (!this.tabFocusModeElement.value) { + this.tabFocusModeElement.value = this.statusbarService.addEntry({ text: nls.localize('tabFocusModeEnabled', "Tab Moves Focus"), tooltip: nls.localize('disableTabMode', "Disable Accessibility Mode"), command: 'editor.action.toggleTabFocusMode' }, 'status.editor.tabFocusMode', nls.localize('status.editor.tabFocusMode', "Accessibility Mode"), StatusbarAlignment.RIGHT, 100.7); } } else { - if (this.tabFocusModeElement) { - this.tabFocusModeElement.dispose(); - this.tabFocusModeElement = undefined; - } + this.tabFocusModeElement.clear(); } } private updateScreenReaderModeElement(visible: boolean): void { if (visible) { - if (!this.screenRedearModeElement) { - this.screenRedearModeElement = this.statusbarService.addEntry({ + if (!this.screenRedearModeElement.value) { + this.screenRedearModeElement.value = this.statusbarService.addEntry({ text: nls.localize('screenReaderDetected', "Screen Reader Optimized"), tooltip: nls.localize('screenReaderDetectedExtra', "If you are not using a Screen Reader, please change the setting `editor.accessibilitySupport` to \"off\"."), command: 'showEditorScreenReaderNotification' }, 'status.editor.screenReaderMode', nls.localize('status.editor.screenReaderMode', "Screen Reader Mode"), StatusbarAlignment.RIGHT, 100.6); } } else { - if (this.screenRedearModeElement) { - this.screenRedearModeElement.dispose(); - this.screenRedearModeElement = undefined; - } + this.screenRedearModeElement.clear(); } } private updateSelectionElement(text: string | undefined): void { if (!text) { - if (this.selectionElement) { - dispose(this.selectionElement); - this.selectionElement = undefined; - } - + this.selectionElement.clear(); return; } @@ -430,16 +420,12 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution { command: 'workbench.action.gotoLine' }; - this.selectionElement = this.updateElement(this.selectionElement, props, 'status.editor.selection', nls.localize('status.editor.selection', "Editor Selection"), StatusbarAlignment.RIGHT, 100.5); + this.updateElement(this.selectionElement, props, 'status.editor.selection', nls.localize('status.editor.selection', "Editor Selection"), StatusbarAlignment.RIGHT, 100.5); } private updateIndentationElement(text: string | undefined): void { if (!text) { - if (this.indentationElement) { - dispose(this.indentationElement); - this.indentationElement = undefined; - } - + this.indentationElement.clear(); return; } @@ -449,16 +435,12 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution { command: 'changeEditorIndentation' }; - this.indentationElement = this.updateElement(this.indentationElement, props, 'status.editor.indentation', nls.localize('status.editor.indentation', "Editor Indentation"), StatusbarAlignment.RIGHT, 100.4); + this.updateElement(this.indentationElement, props, 'status.editor.indentation', nls.localize('status.editor.indentation', "Editor Indentation"), StatusbarAlignment.RIGHT, 100.4); } private updateEncodingElement(text: string | undefined): void { if (!text) { - if (this.encodingElement) { - dispose(this.encodingElement); - this.encodingElement = undefined; - } - + this.encodingElement.clear(); return; } @@ -468,16 +450,12 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution { command: 'workbench.action.editor.changeEncoding' }; - this.encodingElement = this.updateElement(this.encodingElement, props, 'status.editor.encoding', nls.localize('status.editor.encoding', "Editor Encoding"), StatusbarAlignment.RIGHT, 100.3); + this.updateElement(this.encodingElement, props, 'status.editor.encoding', nls.localize('status.editor.encoding', "Editor Encoding"), StatusbarAlignment.RIGHT, 100.3); } private updateEOLElement(text: string | undefined): void { if (!text) { - if (this.eolElement) { - dispose(this.eolElement); - this.eolElement = undefined; - } - + this.eolElement.clear(); return; } @@ -487,16 +465,12 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution { command: 'workbench.action.editor.changeEOL' }; - this.eolElement = this.updateElement(this.eolElement, props, 'status.editor.eol', nls.localize('status.editor.eol', "Editor End of Line"), StatusbarAlignment.RIGHT, 100.2); + this.updateElement(this.eolElement, props, 'status.editor.eol', nls.localize('status.editor.eol', "Editor End of Line"), StatusbarAlignment.RIGHT, 100.2); } private updateModeElement(text: string | undefined): void { if (!text) { - if (this.modeElement) { - dispose(this.modeElement); - this.modeElement = undefined; - } - + this.modeElement.clear(); return; } @@ -506,16 +480,12 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution { command: 'workbench.action.editor.changeLanguageMode' }; - this.modeElement = this.updateElement(this.modeElement, props, 'status.editor.mode', nls.localize('status.editor.mode', "Editor Language"), StatusbarAlignment.RIGHT, 100.1); + this.updateElement(this.modeElement, props, 'status.editor.mode', nls.localize('status.editor.mode', "Editor Language"), StatusbarAlignment.RIGHT, 100.1); } private updateMetadataElement(text: string | undefined): void { if (!text) { - if (this.metadataElement) { - dispose(this.metadataElement); - this.metadataElement = undefined; - } - + this.metadataElement.clear(); return; } @@ -524,17 +494,15 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution { tooltip: nls.localize('fileInfo', "File Information") }; - this.metadataElement = this.updateElement(this.metadataElement, props, 'status.editor.info', nls.localize('status.editor.info', "File Information"), StatusbarAlignment.RIGHT, 100); + this.updateElement(this.metadataElement, props, 'status.editor.info', nls.localize('status.editor.info', "File Information"), StatusbarAlignment.RIGHT, 100); } - private updateElement(element: IStatusbarEntryAccessor | undefined, props: IStatusbarEntry, id: string, name: string, alignment: StatusbarAlignment, priority: number): IStatusbarEntryAccessor | undefined { - if (!element) { - element = this.statusbarService.addEntry(props, id, name, alignment, priority); + private updateElement(element: MutableDisposable, props: IStatusbarEntry, id: string, name: string, alignment: StatusbarAlignment, priority: number) { + if (!element.value) { + element.value = this.statusbarService.addEntry(props, id, name, alignment, priority); } else { - element.update(props); + element.value.update(props); } - - return element; } private updateState(update: StateDelta): void { From fa4071952433e1af764b18aac445df8a8a7d1499 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 12 Jun 2019 17:06:20 -0700 Subject: [PATCH 0089/1449] Typos --- src/vs/code/node/shellEnv.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/code/node/shellEnv.ts b/src/vs/code/node/shellEnv.ts index eea6922afbe..fee0648ea13 100644 --- a/src/vs/code/node/shellEnv.ts +++ b/src/vs/code/node/shellEnv.ts @@ -96,10 +96,10 @@ export function getShellEnvironment(logService: ILogService, environmentService: logService.trace('getShellEnvironment: disable-user-env-probe set, skipping'); _shellEnv = Promise.resolve({}); } else if (isWindows) { - logService.trace('getShellEnvironment: runing on windows, skipping'); + logService.trace('getShellEnvironment: running on Windows, skipping'); _shellEnv = Promise.resolve({}); } else if (process.env['VSCODE_CLI'] === '1') { - logService.trace('getShellEnvironment: runing on CLI, skipping'); + logService.trace('getShellEnvironment: running on CLI, skipping'); _shellEnv = Promise.resolve({}); } else { logService.trace('getShellEnvironment: running on Unix'); From 224399eadcb6848d4a3855c31939b6b39302e746 Mon Sep 17 00:00:00 2001 From: SteVen Batten Date: Wed, 12 Jun 2019 17:56:54 -0700 Subject: [PATCH 0090/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 99db23062ff..567cab0694f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "060a874751adc68d68777085e88c99a8f04ba5da", + "distro": "fa58edd879968b01e012f8cd56860787765aff8a", "author": { "name": "Microsoft Corporation" }, From ce84b4afab9671a96bfb58ddf81b07ceb3ceddfc Mon Sep 17 00:00:00 2001 From: SteVen Batten Date: Wed, 12 Jun 2019 17:57:37 -0700 Subject: [PATCH 0091/1449] remove equal sign params from web scripts --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 567cab0694f..64210383cec 100644 --- a/package.json +++ b/package.json @@ -25,8 +25,8 @@ "download-builtin-extensions": "node build/lib/builtInExtensions.js", "monaco-compile-check": "tsc -p src/tsconfig.monaco.json --noEmit", "strict-initialization-watch": "tsc --watch -p src/tsconfig.json --noEmit --strictPropertyInitialization", - "web": "node resources/server/bin-dev/code-web.js --port=9888", - "web-selfhost": "node resources/server/bin-dev/code-web.js --port=9777 --selfhost --folder .", + "web": "node resources/server/bin-dev/code-web.js --port 9888", + "web-selfhost": "node resources/server/bin-dev/code-web.js --port 9777 --selfhost --folder .", "install-server": "git fetch distro && git checkout distro/distro -- src/vs/server resources/server && git reset HEAD src/vs/server resources/server" }, "dependencies": { From 78dfd041de4b4ec052a9cdbcea8b11a46c0201c7 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 12 Jun 2019 18:07:41 -0700 Subject: [PATCH 0092/1449] Get mac launching with mostly root env Part of #70248 --- .../terminalInstanceService.ts | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts index 45a5971aad9..e22c8b92540 100644 --- a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts @@ -98,10 +98,29 @@ export class TerminalInstanceService implements ITerminalInstanceService { this._mainProcessParentEnv = env; } - // For macOS just return the root environment which seems to always be {}, this is the - // parent of the main process when code is launched from the dock. + // For macOS it doesn't appear to be possible to get the "root" environment as + // `ps eww -o command` for PID 1 (the parent of the main process when launched from the + // dock/finder) returns no environment, because of this we will fill in the root environment + // using a whitelist of environment variables that we have. if (isMacintosh) { this._mainProcessParentEnv = {}; + // This list was generated by diffing launching a terminal with {} and the system + // terminal launched from finder. + const rootEnvVars = [ + 'SHELL', + 'SSH_AUTH_SOCK', + 'Apple_PubSub_Socket_Render', + 'XPC_FLAGS', + 'XPC_SERVICE_NAME', + 'HOME', + 'LOGNAME', + 'TMPDIR' + ]; + rootEnvVars.forEach(k => { + if (process.env[k]) { + this._mainProcessParentEnv![k] = process.env[k]!; + } + }); } // TODO: Windows should return a fresh environment block, might need native code? From 1988f12757c03ee032fcb0cc07eecc546ad35c55 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 12 Jun 2019 18:15:08 -0700 Subject: [PATCH 0093/1449] Clarify issue in comment --- .../terminal/electron-browser/terminalInstanceService.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts index e22c8b92540..885f01b4e4f 100644 --- a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts @@ -98,10 +98,11 @@ export class TerminalInstanceService implements ITerminalInstanceService { this._mainProcessParentEnv = env; } - // For macOS it doesn't appear to be possible to get the "root" environment as - // `ps eww -o command` for PID 1 (the parent of the main process when launched from the - // dock/finder) returns no environment, because of this we will fill in the root environment - // using a whitelist of environment variables that we have. + // For macOS we want the "root" environment as shells by default run as login shells. It + // doesn't appear to be possible to get the "root" environment as `ps eww -o command` for + // PID 1 (the parent of the main process when launched from the dock/finder) returns no + // environment, because of this we will fill in the root environment using a whitelist of + // environment variables that we have. if (isMacintosh) { this._mainProcessParentEnv = {}; // This list was generated by diffing launching a terminal with {} and the system From 246a1f52ede1a2055a78da80c0262cedf94df365 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 12 Jun 2019 19:28:26 -0700 Subject: [PATCH 0094/1449] Not lack of Windows support for inheritEnv --- .../workbench/contrib/terminal/browser/terminal.contribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts index 866494f1d8b..2ab913b9cfc 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts @@ -229,7 +229,7 @@ configurationRegistry.registerConfiguration({ default: [] }, 'terminal.integrated.inheritEnv': { - markdownDescription: nls.localize('terminal.integrated.inheritEnv', "Whether new shells should inherit their environment from VS Code."), + markdownDescription: nls.localize('terminal.integrated.inheritEnv', "Whether new shells should inherit their environment from VS Code. This is not supported on Windows."), type: 'boolean', default: true }, From d04b5d2eb16c156e24dbf44010c315d968694bd6 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Wed, 12 Jun 2019 20:23:23 -0700 Subject: [PATCH 0095/1449] remove duplicated keyboard dispatch registration. --- .../keybinding/electron-browser/keybinding.contribution.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/vs/workbench/services/keybinding/electron-browser/keybinding.contribution.ts b/src/vs/workbench/services/keybinding/electron-browser/keybinding.contribution.ts index 1264211e1e3..eec3ac01744 100644 --- a/src/vs/workbench/services/keybinding/electron-browser/keybinding.contribution.ts +++ b/src/vs/workbench/services/keybinding/electron-browser/keybinding.contribution.ts @@ -17,13 +17,6 @@ const keyboardConfiguration: IConfigurationNode = { 'title': nls.localize('keyboardConfigurationTitle', "Keyboard"), 'overridable': true, 'properties': { - 'keyboard.dispatch': { - 'type': 'string', - 'enum': ['code', 'keyCode'], - 'default': 'code', - 'markdownDescription': nls.localize('dispatch', "Controls the dispatching logic for key presses to use either `code` (recommended) or `keyCode`."), - 'included': OS === OperatingSystem.Macintosh || OS === OperatingSystem.Linux - }, 'keyboard.touchbar.enabled': { 'type': 'boolean', 'default': true, From d48076b2a5633f4df7a6ea64c5c2e936f65a2dad Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 13 Jun 2019 07:33:19 +0200 Subject: [PATCH 0096/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 64210383cec..3596535413f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "fa58edd879968b01e012f8cd56860787765aff8a", + "distro": "2929fc6d1ae80ff1907babd7b66a8951a270cf5b", "author": { "name": "Microsoft Corporation" }, From 7b80b25ddf361f6bc94eb32b76f91062b2336d15 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 13 Jun 2019 08:03:41 +0200 Subject: [PATCH 0097/1449] bump electron@3.2.4 --- .yarnrc | 2 +- cgmanifest.json | 2 +- src/typings/electron.d.ts | 62 +++++++++++++++++---------------------- test/smoke/package.json | 2 +- test/smoke/yarn.lock | 8 ++--- 5 files changed, 34 insertions(+), 42 deletions(-) diff --git a/.yarnrc b/.yarnrc index 7e63643de04..e3807c54e51 100644 --- a/.yarnrc +++ b/.yarnrc @@ -1,3 +1,3 @@ disturl "https://atom.io/download/electron" -target "4.2.3" +target "4.2.4" runtime "electron" diff --git a/cgmanifest.json b/cgmanifest.json index 6cebbffd6b9..42a65648e59 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -65,7 +65,7 @@ }, "isOnlyProductionDependency": true, "license": "MIT", - "version": "4.2.3" + "version": "4.2.4" }, { "component": { diff --git a/src/typings/electron.d.ts b/src/typings/electron.d.ts index 59163a017cc..df64e7a0b28 100644 --- a/src/typings/electron.d.ts +++ b/src/typings/electron.d.ts @@ -1,4 +1,4 @@ -// Type definitions for Electron 4.2.3 +// Type definitions for Electron 4.2.4 // Project: http://electronjs.org/ // Definitions by: The Electron Team // Definitions: https://github.com/electron/electron-typescript-definitions @@ -1338,16 +1338,21 @@ declare namespace Electron { removeListener(event: 'new-window-for-tab', listener: Function): this; /** * Emitted when the document changed its title, calling event.preventDefault() will - * prevent the native window's title from changing. + * prevent the native window's title from changing. explicitSet is false when title + * is synthesized from file url. */ on(event: 'page-title-updated', listener: (event: Event, - title: string, explicitSet: boolean) => void): this; + title: string, + explicitSet: boolean) => void): this; once(event: 'page-title-updated', listener: (event: Event, - title: string, explicitSet: boolean) => void): this; + title: string, + explicitSet: boolean) => void): this; addListener(event: 'page-title-updated', listener: (event: Event, - title: string, explicitSet: boolean) => void): this; + title: string, + explicitSet: boolean) => void): this; removeListener(event: 'page-title-updated', listener: (event: Event, - title: string, explicitSet: boolean) => void): this; + title: string, + explicitSet: boolean) => void): this; /** * Emitted when the web page has been rendered (while not being shown) and window * can be displayed without a visual flash. @@ -3355,35 +3360,6 @@ declare namespace Electron { type?: ('task' | 'separator' | 'file'); } - interface MemoryInfo { - - // Docs: http://electronjs.org/docs/api/structures/memory-info - - /** - * The maximum amount of memory that has ever been pinned to actual physical RAM. - * On macOS its value will always be 0. - */ - peakWorkingSetSize: number; - /** - * Process id of the process. - */ - pid: number; - /** - * The amount of memory not shared by other processes, such as JS heap or HTML - * content. - */ - privateBytes: number; - /** - * The amount of memory shared between processes, typically memory consumed by the - * Electron code itself - */ - sharedBytes: number; - /** - * The amount of memory currently pinned to actual physical RAM. - */ - workingSetSize: number; - } - interface MemoryUsageDetails { // Docs: http://electronjs.org/docs/api/structures/memory-usage-details @@ -5919,6 +5895,22 @@ declare namespace Electron { * Array of URLs. */ favicons: string[]) => void): this; + /** + * Fired when page title is set during navigation. explicitSet is false when title + * is synthesized from file url. + */ + on(event: 'page-title-updated', listener: (event: Event, + title: string, + explicitSet: boolean) => void): this; + once(event: 'page-title-updated', listener: (event: Event, + title: string, + explicitSet: boolean) => void): this; + addListener(event: 'page-title-updated', listener: (event: Event, + title: string, + explicitSet: boolean) => void): this; + removeListener(event: 'page-title-updated', listener: (event: Event, + title: string, + explicitSet: boolean) => void): this; /** * Emitted when a new frame is generated. Only the dirty area is passed in the * buffer. diff --git a/test/smoke/package.json b/test/smoke/package.json index e19de8f9de2..2aff1bced09 100644 --- a/test/smoke/package.json +++ b/test/smoke/package.json @@ -22,7 +22,7 @@ "@types/webdriverio": "4.6.1", "concurrently": "^3.5.1", "cpx": "^1.5.0", - "electron": "4.2.3", + "electron": "4.2.4", "htmlparser2": "^3.9.2", "mkdirp": "^0.5.1", "mocha": "^5.2.0", diff --git a/test/smoke/yarn.lock b/test/smoke/yarn.lock index cdcb6f7dada..da2b5b77ed5 100644 --- a/test/smoke/yarn.lock +++ b/test/smoke/yarn.lock @@ -596,10 +596,10 @@ electron-download@^4.1.0: semver "^5.4.1" sumchecker "^2.0.2" -electron@4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/electron/-/electron-4.2.3.tgz#5d45da9dd5ae97269dbee2623840da808c72d29d" - integrity sha512-nx+jHxj2eNhaYHXFGdzr7zgSphpVHEU9WAu6qqEUsQ936X3c6bQ5Bdg08KbHZj+cyRRQ06JMu6/ILh5pWrDZaA== +electron@4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/electron/-/electron-4.2.4.tgz#68ca7bd4ff2c16b9205549322f0f1cda4ebc9ff9" + integrity sha512-d4wEwJluMsRyRgbukLmFVTb6l1J+mc3RLB1ctbpMlSWDFvs+zknPWa+cHBzTWwrdgwINLddr69qsAW1ku6FqYw== dependencies: "@types/node" "^10.12.18" electron-download "^4.1.0" From dc4a864ab2ae22b1898f5ddf7627d90e8afcad6a Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 13 Jun 2019 08:38:05 +0200 Subject: [PATCH 0098/1449] errors - fix stack printing --- src/vs/base/common/errorMessage.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/vs/base/common/errorMessage.ts b/src/vs/base/common/errorMessage.ts index ddd6976f666..e3fc44bacd3 100644 --- a/src/vs/base/common/errorMessage.ts +++ b/src/vs/base/common/errorMessage.ts @@ -10,7 +10,7 @@ import * as arrays from 'vs/base/common/arrays'; function exceptionToErrorMessage(exception: any, verbose: boolean): string { if (exception.message) { if (verbose && (exception.stack || exception.stacktrace)) { - return nls.localize('stackTrace.format', "{0}: {1}", detectSystemErrorMessage(exception), exception.stack || exception.stacktrace); + return nls.localize('stackTrace.format', "{0}: {1}", detectSystemErrorMessage(exception), stackToString(exception.stack) || stackToString(exception.stacktrace)); } return detectSystemErrorMessage(exception); @@ -19,6 +19,14 @@ function exceptionToErrorMessage(exception: any, verbose: boolean): string { return nls.localize('error.defaultMessage', "An unknown error occurred. Please consult the log for more details."); } +function stackToString(stack: string[] | string | undefined): string | undefined { + if (Array.isArray(stack)) { + return stack.join('\n'); + } + + return stack; +} + function detectSystemErrorMessage(exception: any): string { // See https://nodejs.org/api/errors.html#errors_class_system_error From 2e85ce75ad58bc2bd646e2e5c4ad62b26e0c9ac2 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 13 Jun 2019 08:51:26 +0200 Subject: [PATCH 0099/1449] web - wire in userDataPath properly --- src/vs/code/browser/workbench/workbench.html | 1 + src/vs/workbench/browser/web.main.ts | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/vs/code/browser/workbench/workbench.html b/src/vs/code/browser/workbench/workbench.html index 30598e4a566..378b7f594bd 100644 --- a/src/vs/code/browser/workbench/workbench.html +++ b/src/vs/code/browser/workbench/workbench.html @@ -19,6 +19,7 @@ keybindingsPath: '{{KEYBINDINGS}}', folderPath: '{{FOLDER}}', workspacePath: '{{WORKSPACE}}', + userDataPath: '{{USER_DATA}}' } diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index 0264fc6cadd..8823bca3d5f 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -33,8 +33,10 @@ import { WebResources } from 'vs/workbench/browser/web.resources'; import { ISignService } from 'vs/platform/sign/common/sign'; import { SignService } from 'vs/platform/sign/browser/signService'; import { hash } from 'vs/base/common/hash'; +import { joinPath } from 'vs/base/common/resources'; interface IWindowConfiguration { + userDataUri: URI; settingsUri: URI; keybindingsUri: URI; remoteAuthority: string; @@ -140,7 +142,7 @@ class CodeRendererMain extends Disposable { const environmentService = new SimpleWorkbenchEnvironmentService(); environmentService.appRoot = '/web/'; environmentService.args = { _: [] }; - environmentService.appSettingsHome = toResource('/web/settings'); + environmentService.appSettingsHome = joinPath(this.configuration.userDataUri, 'User'); environmentService.settingsResource = this.configuration.settingsUri; environmentService.keybindingsResource = this.configuration.keybindingsUri; environmentService.logsPath = '/web/logs'; @@ -148,11 +150,11 @@ class CodeRendererMain extends Disposable { port: null, break: false }; + return environmentService; } private async createWorkspaceService(payload: IWorkspaceInitializationPayload, fileService: FileService, remoteAgentService: IRemoteAgentService, logService: ILogService): Promise { - const workspaceService = new WorkspaceService({ userSettingsResource: this.configuration.settingsUri, remoteAuthority: this.configuration.remoteAuthority, configurationCache: new ConfigurationCache() }, new ConfigurationFileService(fileService), remoteAgentService); try { @@ -184,6 +186,7 @@ class CodeRendererMain extends Disposable { } export interface IWindowConfigurationContents { + userDataPath: string; settingsPath: string; keybindingsPath: string; folderPath?: string; @@ -192,12 +195,14 @@ export interface IWindowConfigurationContents { export function main(windowConfigurationContents: IWindowConfigurationContents): Promise { const windowConfiguration: IWindowConfiguration = { + userDataUri: toResource(windowConfigurationContents.userDataPath), settingsUri: toResource(windowConfigurationContents.settingsPath), keybindingsUri: toResource(windowConfigurationContents.keybindingsPath), folderUri: windowConfigurationContents.folderPath ? toResource(windowConfigurationContents.folderPath) : undefined, workspaceUri: windowConfigurationContents.workspacePath ? toResource(windowConfigurationContents.workspacePath) : undefined, remoteAuthority: document.location.host }; + const renderer = new CodeRendererMain(windowConfiguration); return renderer.open(); } From 635d845b4a151f09617f8daa6fe55aca37d21d6b Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 13 Jun 2019 08:51:55 +0200 Subject: [PATCH 0100/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3596535413f..debe89e2873 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "2929fc6d1ae80ff1907babd7b66a8951a270cf5b", + "distro": "be34acfbfe7d49f9ee235274cab19afac7488751", "author": { "name": "Microsoft Corporation" }, From 07ea8c2ced5775ca12fce0b78016839271116cf2 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 13 Jun 2019 09:54:53 +0200 Subject: [PATCH 0101/1449] fix snap build --- build/azure-pipelines/linux/snap-build-linux.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/build/azure-pipelines/linux/snap-build-linux.yml b/build/azure-pipelines/linux/snap-build-linux.yml index 9d98e9fa472..4ecdc6ef85a 100644 --- a/build/azure-pipelines/linux/snap-build-linux.yml +++ b/build/azure-pipelines/linux/snap-build-linux.yml @@ -28,6 +28,7 @@ steps: # Make sure we get latest packages sudo apt-get update sudo apt-get upgrade -y + sudo apt-get install -y python3 # Define variables REPO="$(pwd)" From ff38c0fee5246dd3aeb16f7aaa4b7ad329f4bb37 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 13 Jun 2019 09:55:35 +0200 Subject: [PATCH 0102/1449] Derive configuration resources --- src/vs/code/browser/workbench/workbench.html | 2 -- src/vs/workbench/browser/web.main.ts | 14 +++++--------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/vs/code/browser/workbench/workbench.html b/src/vs/code/browser/workbench/workbench.html index 378b7f594bd..ef812e5f344 100644 --- a/src/vs/code/browser/workbench/workbench.html +++ b/src/vs/code/browser/workbench/workbench.html @@ -15,8 +15,6 @@ self.CONNECTION_AUTH_TOKEN = '{{CONNECTION_AUTH_TOKEN}}'; self.SERVER_APP_ROOT = '{{SERVER_APP_ROOT}}'; self.WINDOW_CONFIGURATION = { - settingsPath: '{{SETTINGS}}', - keybindingsPath: '{{KEYBINDINGS}}', folderPath: '{{FOLDER}}', workspacePath: '{{WORKSPACE}}', userDataPath: '{{USER_DATA}}' diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index 8823bca3d5f..bcc32718f39 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -37,8 +37,6 @@ import { joinPath } from 'vs/base/common/resources'; interface IWindowConfiguration { userDataUri: URI; - settingsUri: URI; - keybindingsUri: URI; remoteAuthority: string; folderUri?: URI; workspaceUri?: URI; @@ -123,7 +121,7 @@ class CodeRendererMain extends Disposable { const payload = await this.resolveWorkspaceInitializationPayload(); await Promise.all([ - this.createWorkspaceService(payload, fileService, remoteAgentService, logService).then(service => { + this.createWorkspaceService(payload, environmentService, fileService, remoteAgentService, logService).then(service => { // Workspace serviceCollection.set(IWorkspaceContextService, service); @@ -143,8 +141,8 @@ class CodeRendererMain extends Disposable { environmentService.appRoot = '/web/'; environmentService.args = { _: [] }; environmentService.appSettingsHome = joinPath(this.configuration.userDataUri, 'User'); - environmentService.settingsResource = this.configuration.settingsUri; - environmentService.keybindingsResource = this.configuration.keybindingsUri; + environmentService.settingsResource = joinPath(environmentService.appSettingsHome, 'settings.json'); + environmentService.keybindingsResource = joinPath(environmentService.appSettingsHome, 'keybindings.json'); environmentService.logsPath = '/web/logs'; environmentService.debugExtensionHost = { port: null, @@ -154,8 +152,8 @@ class CodeRendererMain extends Disposable { return environmentService; } - private async createWorkspaceService(payload: IWorkspaceInitializationPayload, fileService: FileService, remoteAgentService: IRemoteAgentService, logService: ILogService): Promise { - const workspaceService = new WorkspaceService({ userSettingsResource: this.configuration.settingsUri, remoteAuthority: this.configuration.remoteAuthority, configurationCache: new ConfigurationCache() }, new ConfigurationFileService(fileService), remoteAgentService); + private async createWorkspaceService(payload: IWorkspaceInitializationPayload, environmentService: IWorkbenchEnvironmentService, fileService: FileService, remoteAgentService: IRemoteAgentService, logService: ILogService): Promise { + const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, remoteAuthority: this.configuration.remoteAuthority, configurationCache: new ConfigurationCache() }, new ConfigurationFileService(fileService), remoteAgentService); try { await workspaceService.initialize(payload); @@ -196,8 +194,6 @@ export interface IWindowConfigurationContents { export function main(windowConfigurationContents: IWindowConfigurationContents): Promise { const windowConfiguration: IWindowConfiguration = { userDataUri: toResource(windowConfigurationContents.userDataPath), - settingsUri: toResource(windowConfigurationContents.settingsPath), - keybindingsUri: toResource(windowConfigurationContents.keybindingsPath), folderUri: windowConfigurationContents.folderPath ? toResource(windowConfigurationContents.folderPath) : undefined, workspaceUri: windowConfigurationContents.workspacePath ? toResource(windowConfigurationContents.workspacePath) : undefined, remoteAuthority: document.location.host From 5f70390f0d77ae95604434daaff16afa231e4f29 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 13 Jun 2019 10:02:17 +0200 Subject: [PATCH 0103/1449] fixes microsoft/vscode-remote-release#671 --- extensions/git/src/git.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index bf5188b41be..df9de2ad974 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -371,8 +371,14 @@ export class Git { } async getRepositoryDotGit(repositoryPath: string): Promise { - const result = await this.exec(repositoryPath, ['rev-parse', '--absolute-git-dir']); - return path.normalize(result.stdout.trim()); + const result = await this.exec(repositoryPath, ['rev-parse', '--git-dir']); + let dotGitPath = result.stdout.trim(); + + if (!path.isAbsolute(dotGitPath)) { + dotGitPath = path.join(repositoryPath, dotGitPath); + } + + return path.normalize(dotGitPath); } async exec(cwd: string, args: string[], options: SpawnOptions = {}): Promise> { From 8d1205c9e33989b3ea4fe99996717d6308296ac5 Mon Sep 17 00:00:00 2001 From: jeanp413 Date: Thu, 13 Jun 2019 03:07:10 -0500 Subject: [PATCH 0104/1449] Simplify incrementFileName. Fixes #55128 --- .../contrib/files/browser/fileActions.ts | 82 ++----- .../test/electron-browser/fileActions.test.ts | 218 ++++++++---------- 2 files changed, 116 insertions(+), 184 deletions(-) diff --git a/src/vs/workbench/contrib/files/browser/fileActions.ts b/src/vs/workbench/contrib/files/browser/fileActions.ts index 4b0a0547dc9..1c4d6c4757e 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.ts @@ -344,70 +344,32 @@ export function findValidPasteFileTarget(targetFolder: ExplorerItem, fileToPaste } export function incrementFileName(name: string, isFolder: boolean): string { - const separators = '[\\.\\-_]'; - const maxNumber = Constants.MAX_SAFE_SMALL_INTEGER; - - // file.1.txt=>file.2.txt - let suffixFileRegex = RegExp('(.*' + separators + ')(\\d+)(\\..*)$'); - if (!isFolder && name.match(suffixFileRegex)) { - return name.replace(suffixFileRegex, (match, g1?, g2?, g3?) => { - let number = parseInt(g2); - return number < maxNumber - ? g1 + strings.pad(number + 1, g2.length) + g3 - : strings.format('{0}{1}.1{2}', g1, g2, g3); - }); + let namePrefix = name; + let extSuffix = ''; + if (!isFolder) { + let index = name.lastIndexOf('.'); + if (index > 0 && index < name.length - 1) { + namePrefix = name.substring(0, index); + extSuffix = name.substring(index); + } } - // 1.file.txt=>2.file.txt - let prefixFileRegex = RegExp('(\\d+)(' + separators + '.*)(\\..*)$'); - if (!isFolder && name.match(prefixFileRegex)) { - return name.replace(prefixFileRegex, (match, g1?, g2?, g3?) => { - let number = parseInt(g1); - return number < maxNumber - ? strings.pad(number + 1, g1.length) + g2 + g3 - : strings.format('{0}{1}.1{2}', g1, g2, g3); - }); + // name copy 5(.txt) => name copy 6(.txt) + // name copy(.txt) => name copy 2(.txt) + let suffixRegex = /^(.+ copy)( \d+)?$/; + if (namePrefix.match(suffixRegex)) { + return namePrefix.replace(suffixRegex, (match, g1?, g2?) => { + let number = (g2 ? parseInt(g2) : 1); + return number === 0 + ? `${g1}` + : (number < Constants.MAX_SAFE_SMALL_INTEGER + ? `${g1} ${number + 1}` + : `${g1}${g2} copy`); + }) + extSuffix; } - // 1.txt=>2.txt - let prefixFileNoNameRegex = RegExp('(\\d+)(\\..*)$'); - if (!isFolder && name.match(prefixFileNoNameRegex)) { - return name.replace(prefixFileNoNameRegex, (match, g1?, g2?) => { - let number = parseInt(g1); - return number < maxNumber - ? strings.pad(number + 1, g1.length) + g2 - : strings.format('{0}.1{1}', g1, g2); - }); - } - - // file.txt=>file.1.txt - const lastIndexOfDot = name.lastIndexOf('.'); - if (!isFolder && lastIndexOfDot >= 0) { - return strings.format('{0}.1{1}', name.substr(0, lastIndexOfDot), name.substr(lastIndexOfDot)); - } - - // folder.1=>folder.2 - if (isFolder && name.match(/(\d+)$/)) { - return name.replace(/(\d+)$/, (match: string, ...groups: any[]) => { - let number = parseInt(groups[0]); - return number < maxNumber - ? strings.pad(number + 1, groups[0].length) - : strings.format('{0}.1', groups[0]); - }); - } - - // 1.folder=>2.folder - if (isFolder && name.match(/^(\d+)/)) { - return name.replace(/^(\d+)(.*)$/, (match: string, ...groups: any[]) => { - let number = parseInt(groups[0]); - return number < maxNumber - ? strings.pad(number + 1, groups[0].length) + groups[1] - : strings.format('{0}{1}.1', groups[0], groups[1]); - }); - } - - // file/folder=>file.1/folder.1 - return strings.format('{0}.1', name); + // name(.txt) => name copy(.txt) + return `${namePrefix} copy${extSuffix}`; } // Global Compare with diff --git a/src/vs/workbench/contrib/files/test/electron-browser/fileActions.test.ts b/src/vs/workbench/contrib/files/test/electron-browser/fileActions.test.ts index dde3743e766..a511fa508c5 100644 --- a/src/vs/workbench/contrib/files/test/electron-browser/fileActions.test.ts +++ b/src/vs/workbench/contrib/files/test/electron-browser/fileActions.test.ts @@ -11,157 +11,127 @@ suite('Files - Increment file name', () => { test('Increment file name without any version', function () { const name = 'test.js'; const result = incrementFileName(name, false); - assert.strictEqual(result, 'test.1.js'); + assert.strictEqual(result, 'test copy.js'); + }); + + test('Increment file name with suffix version', function () { + const name = 'test copy.js'; + const result = incrementFileName(name, false); + assert.strictEqual(result, 'test copy 2.js'); + }); + + test('Increment file name with suffix version with leading zeros', function () { + const name = 'test copy 005.js'; + const result = incrementFileName(name, false); + assert.strictEqual(result, 'test copy 6.js'); + }); + + test('Increment file name with suffix version, too big number', function () { + const name = 'test copy 9007199254740992.js'; + const result = incrementFileName(name, false); + assert.strictEqual(result, 'test copy 9007199254740992 copy.js'); + }); + + test('Increment file name with just version in name', function () { + const name = 'copy.js'; + const result = incrementFileName(name, false); + assert.strictEqual(result, 'copy copy.js'); + }); + + test('Increment file name with just version in name, v2', function () { + const name = 'copy 2.js'; + const result = incrementFileName(name, false); + assert.strictEqual(result, 'copy 2 copy.js'); + }); + + test('Increment file name without any extension or version', function () { + const name = 'test'; + const result = incrementFileName(name, false); + assert.strictEqual(result, 'test copy'); + }); + + test('Increment file name without any extension or version, trailing dot', function () { + const name = 'test.'; + const result = incrementFileName(name, false); + assert.strictEqual(result, 'test. copy'); + }); + + test('Increment file name without any extension or version, leading dot', function () { + const name = '.test'; + const result = incrementFileName(name, false); + assert.strictEqual(result, '.test copy'); + }); + + test('Increment file name without any extension or version, leading dot v2', function () { + const name = '..test'; + const result = incrementFileName(name, false); + assert.strictEqual(result, '. copy.test'); + }); + + test('Increment file name without any extension but with suffix version', function () { + const name = 'test copy 5'; + const result = incrementFileName(name, false); + assert.strictEqual(result, 'test copy 6'); }); test('Increment folder name without any version', function () { const name = 'test'; const result = incrementFileName(name, true); - assert.strictEqual(result, 'test.1'); - }); - - test('Increment file name with suffix version', function () { - const name = 'test.1.js'; - const result = incrementFileName(name, false); - assert.strictEqual(result, 'test.2.js'); - }); - - test('Increment file name with suffix version with trailing zeros', function () { - const name = 'test.001.js'; - const result = incrementFileName(name, false); - assert.strictEqual(result, 'test.002.js'); - }); - - test('Increment file name with suffix version with trailing zeros, changing length', function () { - const name = 'test.009.js'; - const result = incrementFileName(name, false); - assert.strictEqual(result, 'test.010.js'); - }); - - test('Increment file name with suffix version with `-` as separator', function () { - const name = 'test-1.js'; - const result = incrementFileName(name, false); - assert.strictEqual(result, 'test-2.js'); - }); - - test('Increment file name with suffix version with `-` as separator, trailing zeros', function () { - const name = 'test-001.js'; - const result = incrementFileName(name, false); - assert.strictEqual(result, 'test-002.js'); - }); - - test('Increment file name with suffix version with `-` as separator, trailing zeros, changnig length', function () { - const name = 'test-099.js'; - const result = incrementFileName(name, false); - assert.strictEqual(result, 'test-100.js'); - }); - - test('Increment file name with suffix version with `_` as separator', function () { - const name = 'test_1.js'; - const result = incrementFileName(name, false); - assert.strictEqual(result, 'test_2.js'); + assert.strictEqual(result, 'test copy'); }); test('Increment folder name with suffix version', function () { - const name = 'test.1'; + const name = 'test copy'; const result = incrementFileName(name, true); - assert.strictEqual(result, 'test.2'); + assert.strictEqual(result, 'test copy 2'); }); - test('Increment folder name with suffix version, trailing zeros', function () { - const name = 'test.001'; + test('Increment folder name with suffix version, leading zeros', function () { + const name = 'test copy 005'; const result = incrementFileName(name, true); - assert.strictEqual(result, 'test.002'); - }); - - test('Increment folder name with suffix version with `-` as separator', function () { - const name = 'test-1'; - const result = incrementFileName(name, true); - assert.strictEqual(result, 'test-2'); - }); - - test('Increment folder name with suffix version with `_` as separator', function () { - const name = 'test_1'; - const result = incrementFileName(name, true); - assert.strictEqual(result, 'test_2'); - }); - - test('Increment file name with suffix version, too big number', function () { - const name = 'test.9007199254740992.js'; - const result = incrementFileName(name, false); - assert.strictEqual(result, 'test.9007199254740992.1.js'); + assert.strictEqual(result, 'test copy 6'); }); test('Increment folder name with suffix version, too big number', function () { - const name = 'test.9007199254740992'; + const name = 'test copy 9007199254740992'; const result = incrementFileName(name, true); - assert.strictEqual(result, 'test.9007199254740992.1'); + assert.strictEqual(result, 'test copy 9007199254740992 copy'); }); - test('Increment file name with prefix version', function () { - const name = '1.test.js'; - const result = incrementFileName(name, false); - assert.strictEqual(result, '2.test.js'); - }); - - test('Increment file name with just version in name', function () { - const name = '1.js'; - const result = incrementFileName(name, false); - assert.strictEqual(result, '2.js'); - }); - - test('Increment file name with just version in name, too big number', function () { - const name = '9007199254740992.js'; - const result = incrementFileName(name, false); - assert.strictEqual(result, '9007199254740992.1.js'); - }); - - test('Increment file name with prefix version, trailing zeros', function () { - const name = '001.test.js'; - const result = incrementFileName(name, false); - assert.strictEqual(result, '002.test.js'); - }); - - test('Increment file name with prefix version with `-` as separator', function () { - const name = '1-test.js'; - const result = incrementFileName(name, false); - assert.strictEqual(result, '2-test.js'); - }); - - test('Increment file name with prefix version with `-` as separator', function () { - const name = '1_test.js'; - const result = incrementFileName(name, false); - assert.strictEqual(result, '2_test.js'); - }); - - test('Increment file name with prefix version, too big number', function () { - const name = '9007199254740992.test.js'; - const result = incrementFileName(name, false); - assert.strictEqual(result, '9007199254740992.test.1.js'); - }); - - test('Increment folder name with prefix version', function () { - const name = '1.test'; + test('Increment folder name with just version in name', function () { + const name = 'copy'; const result = incrementFileName(name, true); - assert.strictEqual(result, '2.test'); + assert.strictEqual(result, 'copy copy'); }); - test('Increment folder name with prefix version, too big number', function () { - const name = '9007199254740992.test'; + test('Increment folder name with just version in name, v2', function () { + const name = 'copy 2'; const result = incrementFileName(name, true); - assert.strictEqual(result, '9007199254740992.test.1'); + assert.strictEqual(result, 'copy 2 copy'); }); - test('Increment folder name with prefix version, trailing zeros', function () { - const name = '001.test'; + test('Increment folder name "with extension" but without any version', function () { + const name = 'test.js'; const result = incrementFileName(name, true); - assert.strictEqual(result, '002.test'); + assert.strictEqual(result, 'test.js copy'); }); - test('Increment folder name with prefix version with `-` as separator', function () { - const name = '1-test'; + test('Increment folder name "with extension" and with suffix version', function () { + const name = 'test.js copy 5'; const result = incrementFileName(name, true); - assert.strictEqual(result, '2-test'); + assert.strictEqual(result, 'test.js copy 6'); }); -}); \ No newline at end of file + test('Increment file/folder name with suffix version, special case 1', function () { + const name = 'test copy 0'; + const result = incrementFileName(name, true); + assert.strictEqual(result, 'test copy'); + }); + + test('Increment file/folder name with suffix version, special case 2', function () { + const name = 'test copy 1'; + const result = incrementFileName(name, true); + assert.strictEqual(result, 'test copy 2'); + }); + +}); From a280393c6b713edcc0d3ccffc9db5b10c6dcce01 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 13 Jun 2019 10:08:56 +0200 Subject: [PATCH 0105/1449] clarify names and return disposable, #74922 --- .../browser/menuEntryActionViewItem.ts | 23 ++++++++++++++----- src/vs/platform/actions/common/actions.ts | 7 ++++++ .../parts/activitybar/activitybarActions.ts | 4 ++-- .../browser/parts/editor/editorGroupView.ts | 4 ++-- .../browser/parts/editor/titleControl.ts | 6 ++--- .../browser/parts/views/customView.ts | 6 ++--- .../contrib/comments/browser/commentMenus.ts | 4 ++-- .../contrib/debug/browser/callStackView.ts | 4 ++-- .../contrib/debug/browser/debugToolBar.ts | 4 ++-- .../files/browser/views/explorerView.ts | 4 ++-- .../files/browser/views/openEditorsView.ts | 4 ++-- .../contrib/scm/browser/dirtydiffDecorator.ts | 4 ++-- .../workbench/contrib/scm/browser/scmMenus.ts | 6 ++--- .../contrib/scm/browser/scmViewlet.ts | 6 ++--- .../contrib/search/browser/searchView.ts | 4 ++-- src/vs/workbench/electron-browser/window.ts | 4 ++-- 16 files changed, 56 insertions(+), 38 deletions(-) diff --git a/src/vs/platform/actions/browser/menuEntryActionViewItem.ts b/src/vs/platform/actions/browser/menuEntryActionViewItem.ts index 331fa1156f1..2dae1433858 100644 --- a/src/vs/platform/actions/browser/menuEntryActionViewItem.ts +++ b/src/vs/platform/actions/browser/menuEntryActionViewItem.ts @@ -9,7 +9,7 @@ import { ActionViewItem, Separator } from 'vs/base/browser/ui/actionbar/actionba import { IAction } from 'vs/base/common/actions'; import { Emitter } from 'vs/base/common/event'; import { IdGenerator } from 'vs/base/common/idGenerator'; -import { dispose, IDisposable, toDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; +import { dispose, IDisposable, toDisposable, MutableDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { isLinux, isWindows } from 'vs/base/common/platform'; import { localize } from 'vs/nls'; import { ICommandAction, IMenu, IMenuActionOptions, MenuItemAction, SubmenuItemAction } from 'vs/platform/actions/common/actions'; @@ -76,17 +76,28 @@ class AlternativeKeyEmitter extends Emitter { } } -export function fillInContextMenuActions(menu: IMenu, options: IMenuActionOptions | undefined, target: IAction[] | { primary: IAction[]; secondary: IAction[]; }, contextMenuService: IContextMenuService, isPrimaryGroup?: (group: string) => boolean): void { +export function createAndFillInContextMenuActions(menu: IMenu, options: IMenuActionOptions | undefined, target: IAction[] | { primary: IAction[]; secondary: IAction[]; }, contextMenuService: IContextMenuService, isPrimaryGroup?: (group: string) => boolean): IDisposable { const groups = menu.getActions(options); - const getAlternativeActions = AlternativeKeyEmitter.getInstance(contextMenuService).isPressed; - - fillInActions(groups, target, getAlternativeActions, isPrimaryGroup); + const useAlternativeActions = AlternativeKeyEmitter.getInstance(contextMenuService).isPressed; + fillInActions(groups, target, useAlternativeActions, isPrimaryGroup); + return asDisposable(groups); } -export function fillInActionBarActions(menu: IMenu, options: IMenuActionOptions | undefined, target: IAction[] | { primary: IAction[]; secondary: IAction[]; }, isPrimaryGroup?: (group: string) => boolean): void { +export function createAndFillInActionBarActions(menu: IMenu, options: IMenuActionOptions | undefined, target: IAction[] | { primary: IAction[]; secondary: IAction[]; }, isPrimaryGroup?: (group: string) => boolean): IDisposable { const groups = menu.getActions(options); // Action bars handle alternative actions on their own so the alternative actions should be ignored fillInActions(groups, target, false, isPrimaryGroup); + return asDisposable(groups); +} + +function asDisposable(groups: [string, Array][]): IDisposable { + const disposables = new DisposableStore(); + for (const [, actions] of groups) { + for (const action of actions) { + disposables.add(action); + } + } + return disposables; } function fillInActions(groups: [string, Array][], target: IAction[] | { primary: IAction[]; secondary: IAction[]; }, useAlternativeActions: boolean, isPrimaryGroup: (group: string) => boolean = group => group === 'navigation'): void { diff --git a/src/vs/platform/actions/common/actions.ts b/src/vs/platform/actions/common/actions.ts index 650d568f001..5cf2b340070 100644 --- a/src/vs/platform/actions/common/actions.ts +++ b/src/vs/platform/actions/common/actions.ts @@ -264,6 +264,13 @@ export class MenuItemAction extends ExecuteCommandAction { this.alt = alt ? new MenuItemAction(alt, undefined, this._options, contextKeyService, commandService) : undefined; } + dispose(): void { + if (this.alt) { + this.alt.dispose(); + } + super.dispose(); + } + run(...args: any[]): Promise { let runArgs: any[] = []; diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts index 6565a5e0df3..79d64736026 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts @@ -27,7 +27,7 @@ import { IActivityBarService } from 'vs/workbench/services/activityBar/browser/a import { IWorkbenchLayoutService, Parts } from 'vs/workbench/services/layout/browser/layoutService'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { fillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { createAndFillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; export class ViewletActivityAction extends ActivityAction { @@ -147,7 +147,7 @@ export class GlobalActivityActionViewItem extends ActivityActionViewItem { private showContextMenu(): void { const globalActivityActions: IAction[] = []; const globalActivityMenu = this.menuService.createMenu(MenuId.GlobalActivity, this.contextKeyService); - fillInActionBarActions(globalActivityMenu, undefined, { primary: [], secondary: globalActivityActions }); + createAndFillInActionBarActions(globalActivityMenu, undefined, { primary: [], secondary: globalActivityActions }); const containerPosition = DOM.getDomNodePagePosition(this.container); const location = { x: containerPosition.left + containerPosition.width / 2, y: containerPosition.top }; diff --git a/src/vs/workbench/browser/parts/editor/editorGroupView.ts b/src/vs/workbench/browser/parts/editor/editorGroupView.ts index 9502f0a6eb8..fb988c60942 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupView.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupView.ts @@ -40,7 +40,7 @@ import { CLOSE_EDITOR_GROUP_COMMAND_ID } from 'vs/workbench/browser/parts/editor import { NoTabsTitleControl } from 'vs/workbench/browser/parts/editor/noTabsTitleControl'; import { IMenuService, MenuId, IMenu } from 'vs/platform/actions/common/actions'; import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; -import { fillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { isErrorWithActions, IErrorWithActions } from 'vs/base/common/errorsWithActions'; import { IVisibleEditor } from 'vs/workbench/services/editor/common/editorService'; @@ -321,7 +321,7 @@ export class EditorGroupView extends Themable implements IEditorGroupView { // Fill in contributed actions const actions: IAction[] = []; - fillInContextMenuActions(menu, undefined, actions, this.contextMenuService); + createAndFillInContextMenuActions(menu, undefined, actions, this.contextMenuService); // Show it this.contextMenuService.showContextMenu({ diff --git a/src/vs/workbench/browser/parts/editor/titleControl.ts b/src/vs/workbench/browser/parts/editor/titleControl.ts index 5f2adfb21ca..c0934ae5f06 100644 --- a/src/vs/workbench/browser/parts/editor/titleControl.ts +++ b/src/vs/workbench/browser/parts/editor/titleControl.ts @@ -15,7 +15,7 @@ import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import 'vs/css!./media/titlecontrol'; import { getCodeEditor } from 'vs/editor/browser/editorBrowser'; import { localize } from 'vs/nls'; -import { createActionViewItem, fillInActionBarActions, fillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { createActionViewItem, createAndFillInActionBarActions, createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { ExecuteCommandAction, IMenu, IMenuService, MenuId } from 'vs/platform/actions/common/actions'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; @@ -239,7 +239,7 @@ export abstract class TitleControl extends Themable { this.updateEditorActionsToolbar(); // Update editor toolbar whenever contributed actions change })); - fillInActionBarActions(titleBarMenu, { arg: this.resourceContext.get(), shouldForwardArgs: true }, { primary, secondary }); + createAndFillInActionBarActions(titleBarMenu, { arg: this.resourceContext.get(), shouldForwardArgs: true }, { primary, secondary }); } return { primary, secondary }; @@ -306,7 +306,7 @@ export abstract class TitleControl extends Themable { // Fill in contributed actions const actions: IAction[] = []; - fillInContextMenuActions(this.contextMenu, { shouldForwardArgs: true, arg: this.resourceContext.get() }, actions, this.contextMenuService); + createAndFillInContextMenuActions(this.contextMenu, { shouldForwardArgs: true, arg: this.resourceContext.get() }, actions, this.contextMenuService); // Show it this.contextMenuService.showContextMenu({ diff --git a/src/vs/workbench/browser/parts/views/customView.ts b/src/vs/workbench/browser/parts/views/customView.ts index a64bade3e71..ce0f5ee31b7 100644 --- a/src/vs/workbench/browser/parts/views/customView.ts +++ b/src/vs/workbench/browser/parts/views/customView.ts @@ -11,7 +11,7 @@ import { IAction, IActionViewItem, ActionRunner, Action } from 'vs/base/common/a import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IMenuService, MenuId, MenuItemAction } from 'vs/platform/actions/common/actions'; -import { ContextAwareMenuEntryActionViewItem, fillInActionBarActions, fillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { ContextAwareMenuEntryActionViewItem, createAndFillInActionBarActions, createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IViewsService, ITreeView, ITreeItem, TreeItemCollapsibleState, ITreeViewDataProvider, TreeViewItemHandleArg, ITreeViewDescriptor, IViewsRegistry, ViewContainer, ITreeItemLabel, Extensions } from 'vs/workbench/common/views'; import { IViewletViewOptions, FileIconThemableWorkbenchTree } from 'vs/workbench/browser/parts/views/viewsViewlet'; @@ -127,7 +127,7 @@ class TitleMenus implements IDisposable { const updateActions = () => { this.titleActions = []; this.titleSecondaryActions = []; - fillInActionBarActions(titleMenu, undefined, { primary: this.titleActions, secondary: this.titleSecondaryActions }); + createAndFillInActionBarActions(titleMenu, undefined, { primary: this.titleActions, secondary: this.titleSecondaryActions }); this._onDidChangeTitle.fire(); }; @@ -872,7 +872,7 @@ class TreeMenus extends Disposable implements IDisposable { const primary: IAction[] = []; const secondary: IAction[] = []; const result = { primary, secondary }; - fillInContextMenuActions(menu, { shouldForwardArgs: true }, result, this.contextMenuService, g => /^inline/.test(g)); + createAndFillInContextMenuActions(menu, { shouldForwardArgs: true }, result, this.contextMenuService, g => /^inline/.test(g)); menu.dispose(); contextKeyService.dispose(); diff --git a/src/vs/workbench/contrib/comments/browser/commentMenus.ts b/src/vs/workbench/contrib/comments/browser/commentMenus.ts index 3d83ab86f0c..e5ba3f06f5b 100644 --- a/src/vs/workbench/contrib/comments/browser/commentMenus.ts +++ b/src/vs/workbench/contrib/comments/browser/commentMenus.ts @@ -10,7 +10,7 @@ import { IAction } from 'vs/base/common/actions'; import { MainThreadCommentController } from 'vs/workbench/api/browser/mainThreadComments'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { Comment, CommentThread2 } from 'vs/editor/common/modes'; -import { fillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; export class CommentMenus implements IDisposable { constructor( @@ -47,7 +47,7 @@ export class CommentMenus implements IDisposable { const secondary: IAction[] = []; const result = { primary, secondary }; - fillInContextMenuActions(menu, { shouldForwardArgs: true }, result, this.contextMenuService, g => true); + createAndFillInContextMenuActions(menu, { shouldForwardArgs: true }, result, this.contextMenuService, g => true); return menu; } diff --git a/src/vs/workbench/contrib/debug/browser/callStackView.ts b/src/vs/workbench/contrib/debug/browser/callStackView.ts index fe3f3b88d50..3fffff2d139 100644 --- a/src/vs/workbench/contrib/debug/browser/callStackView.ts +++ b/src/vs/workbench/contrib/debug/browser/callStackView.ts @@ -21,7 +21,7 @@ import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/c import { IViewletPanelOptions, ViewletPanel } from 'vs/workbench/browser/parts/views/panelViewlet'; import { ILabelService } from 'vs/platform/label/common/label'; import { IAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; -import { fillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { ITreeRenderer, ITreeNode, ITreeContextMenuEvent, IAsyncDataSource } from 'vs/base/browser/ui/tree/tree'; import { TreeResourceNavigator2, WorkbenchAsyncDataTree } from 'vs/platform/list/browser/listService'; @@ -300,7 +300,7 @@ export class CallStackView extends ViewletPanel { getAnchor: () => e.anchor, getActions: () => { const actions: IAction[] = []; - fillInContextMenuActions(this.contributedContextMenu, { arg: this.getContextForContributedActions(element), shouldForwardArgs: true }, actions, this.contextMenuService); + createAndFillInContextMenuActions(this.contributedContextMenu, { arg: this.getContextForContributedActions(element), shouldForwardArgs: true }, actions, this.contextMenuService); return actions; }, getActionsContext: () => element diff --git a/src/vs/workbench/contrib/debug/browser/debugToolBar.ts b/src/vs/workbench/contrib/debug/browser/debugToolBar.ts index 74ab3b5584b..90bff5a0b30 100644 --- a/src/vs/workbench/contrib/debug/browser/debugToolBar.ts +++ b/src/vs/workbench/contrib/debug/browser/debugToolBar.ts @@ -27,7 +27,7 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView import { INotificationService } from 'vs/platform/notification/common/notification'; import { RunOnceScheduler } from 'vs/base/common/async'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { fillInActionBarActions, MenuEntryActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { createAndFillInActionBarActions, MenuEntryActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { IMenu, IMenuService, MenuId, MenuItemAction } from 'vs/platform/actions/common/actions'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { FocusSessionAction } from 'vs/workbench/contrib/debug/browser/debugActions'; @@ -265,7 +265,7 @@ export class DebugToolBar extends Themable implements IWorkbenchContribution { public static getActions(menu: IMenu, debugService: IDebugService, instantiationService: IInstantiationService): IAction[] { const actions: IAction[] = []; - fillInActionBarActions(menu, undefined, actions, () => false); + createAndFillInActionBarActions(menu, undefined, actions, () => false); if (debugService.getViewModel().isMultiSessionView()) { actions.push(instantiationService.createInstance(FocusSessionAction, FocusSessionAction.ID, FocusSessionAction.LABEL)); } diff --git a/src/vs/workbench/contrib/files/browser/views/explorerView.ts b/src/vs/workbench/contrib/files/browser/views/explorerView.ts index 9c673a6ec5f..957c1bae15c 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerView.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerView.ts @@ -34,7 +34,7 @@ import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; import { ITreeContextMenuEvent } from 'vs/base/browser/ui/tree/tree'; import { IMenuService, MenuId, IMenu } from 'vs/platform/actions/common/actions'; -import { fillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ExplorerItem, NewExplorerItem } from 'vs/workbench/contrib/files/common/explorerModel'; import { onUnexpectedError } from 'vs/base/common/errors'; @@ -391,7 +391,7 @@ export class ExplorerView extends ViewletPanel { // If the click is outside of the elements pass the root resource if there is only one root. If there are multiple roots pass empty object. const roots = this.explorerService.roots; const arg = stat instanceof ExplorerItem ? stat.resource : roots.length === 1 ? roots[0].resource : {}; - fillInContextMenuActions(this.contributedContextMenu, { arg, shouldForwardArgs: true }, actions, this.contextMenuService); + createAndFillInContextMenuActions(this.contributedContextMenu, { arg, shouldForwardArgs: true }, actions, this.contextMenuService); return actions; }, onHide: (wasCancelled?: boolean) => { diff --git a/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts b/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts index 3232960d880..239e8f0ceb2 100644 --- a/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts +++ b/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts @@ -30,7 +30,7 @@ import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IEditorService, SIDE_GROUP, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { fillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { IMenuService, MenuId, IMenu } from 'vs/platform/actions/common/actions'; import { DirtyEditorContext, OpenEditorsGroupContext } from 'vs/workbench/contrib/files/browser/fileCommands'; import { ResourceContextKey } from 'vs/workbench/common/resources'; @@ -375,7 +375,7 @@ export class OpenEditorsView extends ViewletPanel { getAnchor: () => e.anchor, getActions: () => { const actions: IAction[] = []; - fillInContextMenuActions(this.contributedContextMenu, { shouldForwardArgs: true, arg: element instanceof OpenEditor ? element.editor.getResource() : {} }, actions, this.contextMenuService); + createAndFillInContextMenuActions(this.contributedContextMenu, { shouldForwardArgs: true, arg: element instanceof OpenEditor ? element.editor.getResource() : {} }, actions, this.contextMenuService); return actions; }, getActionsContext: () => element instanceof OpenEditor ? { groupId: element.groupId, editorIndex: element.editorIndex } : { groupId: element.id } diff --git a/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator.ts b/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator.ts index 027282343b1..3d2ca1bdcdf 100644 --- a/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator.ts +++ b/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator.ts @@ -39,7 +39,7 @@ import { IActionBarOptions, ActionsOrientation, IActionViewItem } from 'vs/base/ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { basename } from 'vs/base/common/resources'; import { MenuId, IMenuService, IMenu, MenuItemAction, MenuRegistry } from 'vs/platform/actions/common/actions'; -import { fillInActionBarActions, ContextAwareMenuEntryActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { createAndFillInActionBarActions, ContextAwareMenuEntryActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { IChange, IEditorModel, ScrollType, IEditorContribution, IDiffEditorModel } from 'vs/editor/common/editorCommon'; import { OverviewRulerLane, ITextModel, IModelDecorationOptions } from 'vs/editor/common/model'; import { sortedDiff, firstIndex } from 'vs/base/common/arrays'; @@ -258,7 +258,7 @@ class DirtyDiffWidget extends PeekViewWidget { this._actionbarWidget.push([previous, next], { label: false, icon: true }); const actions: IAction[] = []; - fillInActionBarActions(this.menu, { shouldForwardArgs: true }, actions); + createAndFillInActionBarActions(this.menu, { shouldForwardArgs: true }, actions); this._actionbarWidget.push(actions, { label: false, icon: true }); } diff --git a/src/vs/workbench/contrib/scm/browser/scmMenus.ts b/src/vs/workbench/contrib/scm/browser/scmMenus.ts index 6234e5b1eff..739872f8f65 100644 --- a/src/vs/workbench/contrib/scm/browser/scmMenus.ts +++ b/src/vs/workbench/contrib/scm/browser/scmMenus.ts @@ -9,7 +9,7 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IMenuService, MenuId, IMenu } from 'vs/platform/actions/common/actions'; import { IAction } from 'vs/base/common/actions'; -import { fillInContextMenuActions, fillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { createAndFillInContextMenuActions, createAndFillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { ISCMProvider, ISCMResource, ISCMResourceGroup } from 'vs/workbench/contrib/scm/common/scm'; import { isSCMResource } from './scmUtil'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; @@ -76,7 +76,7 @@ export class SCMMenus implements IDisposable { const primary: IAction[] = []; const secondary: IAction[] = []; - fillInActionBarActions(this.titleMenu, { shouldForwardArgs: true }, { primary, secondary }); + createAndFillInActionBarActions(this.titleMenu, { shouldForwardArgs: true }, { primary, secondary }); if (equals(primary, this.titleActions, actionEquals) && equals(secondary, this.titleSecondaryActions, actionEquals)) { return; @@ -112,7 +112,7 @@ export class SCMMenus implements IDisposable { const primary: IAction[] = []; const secondary: IAction[] = []; const result = { primary, secondary }; - fillInContextMenuActions(menu, { shouldForwardArgs: true }, result, this.contextMenuService, g => /^inline/.test(g)); + createAndFillInContextMenuActions(menu, { shouldForwardArgs: true }, result, this.contextMenuService, g => /^inline/.test(g)); menu.dispose(); contextKeyService.dispose(); diff --git a/src/vs/workbench/contrib/scm/browser/scmViewlet.ts b/src/vs/workbench/contrib/scm/browser/scmViewlet.ts index c8ce3149021..4d8a5d69079 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewlet.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewlet.ts @@ -25,7 +25,7 @@ import { ICommandService } from 'vs/platform/commands/common/commands'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { MenuItemAction, IMenuService, MenuId, IMenu } from 'vs/platform/actions/common/actions'; import { IAction, Action, IActionViewItem, ActionRunner } from 'vs/base/common/actions'; -import { fillInContextMenuActions, ContextAwareMenuEntryActionViewItem, fillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { createAndFillInContextMenuActions, ContextAwareMenuEntryActionViewItem, createAndFillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { SCMMenus } from './scmMenus'; import { ActionBar, IActionViewItemProvider, ActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { IThemeService, LIGHT } from 'vs/platform/theme/common/themeService'; @@ -115,7 +115,7 @@ function connectPrimaryMenuToInlineActionBar(menu: IMenu, actionBar: ActionBar): const secondary: IAction[] = []; const result = { primary, secondary }; - fillInActionBarActions(menu, { shouldForwardArgs: true }, result, g => /^inline/.test(g)); + createAndFillInActionBarActions(menu, { shouldForwardArgs: true }, result, g => /^inline/.test(g)); if (equals(cachedPrimary, primary, (a, b) => a.id === b.id)) { return; @@ -299,7 +299,7 @@ export class MainPanel extends ViewletPanel { const secondary: IAction[] = []; const result = { primary, secondary }; - fillInContextMenuActions(menu, { shouldForwardArgs: true }, result, this.contextMenuService, g => g === 'inline'); + createAndFillInContextMenuActions(menu, { shouldForwardArgs: true }, result, this.contextMenuService, g => g === 'inline'); menu.dispose(); contextKeyService.dispose(); diff --git a/src/vs/workbench/contrib/search/browser/searchView.ts b/src/vs/workbench/contrib/search/browser/searchView.ts index e106a6fb6eb..4f26edf3d17 100644 --- a/src/vs/workbench/contrib/search/browser/searchView.ts +++ b/src/vs/workbench/contrib/search/browser/searchView.ts @@ -23,7 +23,7 @@ import 'vs/css!./media/searchview'; import { ICodeEditor, isCodeEditor, isDiffEditor } from 'vs/editor/browser/editorBrowser'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import * as nls from 'vs/nls'; -import { fillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { IMenu, IMenuService, MenuId } from 'vs/platform/actions/common/actions'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; @@ -698,7 +698,7 @@ export class SearchView extends ViewletPanel { getAnchor: () => e.anchor, getActions: () => { const actions: IAction[] = []; - fillInContextMenuActions(this.contextMenu, { shouldForwardArgs: true }, actions, this.contextMenuService); + createAndFillInContextMenuActions(this.contextMenu, { shouldForwardArgs: true }, actions, this.contextMenuService); return actions; }, getActionsContext: () => e.element diff --git a/src/vs/workbench/electron-browser/window.ts b/src/vs/workbench/electron-browser/window.ts index 7d9aafccda7..8eaf6da6275 100644 --- a/src/vs/workbench/electron-browser/window.ts +++ b/src/vs/workbench/electron-browser/window.ts @@ -26,7 +26,7 @@ import { ipcRenderer as ipc, webFrame, crashReporter, Event } from 'electron'; import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common/workspaceEditing'; import { IMenuService, MenuId, IMenu, MenuItemAction, ICommandAction } from 'vs/platform/actions/common/actions'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { fillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { createAndFillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { RunOnceScheduler } from 'vs/base/common/async'; import { IDisposable, Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { LifecyclePhase, ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; @@ -369,7 +369,7 @@ export class ElectronWindow extends Disposable { const actions: Array = []; // Fill actions into groups respecting order - fillInActionBarActions(this.touchBarMenu, undefined, actions); + createAndFillInActionBarActions(this.touchBarMenu, undefined, actions); // Convert into command action multi array const items: ICommandAction[][] = []; From ddd555c5cab55f2f4fb47bb1a3fd64d5547b2825 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 13 Jun 2019 10:24:37 +0200 Subject: [PATCH 0106/1449] add svg/woff mime types to mime.ts, #75061 --- src/vs/base/common/mime.ts | 62 ++++++++++++----------- src/vs/workbench/browser/web.resources.ts | 10 ++-- 2 files changed, 38 insertions(+), 34 deletions(-) diff --git a/src/vs/base/common/mime.ts b/src/vs/base/common/mime.ts index 83234f40ac5..d9451a64def 100644 --- a/src/vs/base/common/mime.ts +++ b/src/vs/base/common/mime.ts @@ -274,52 +274,54 @@ interface MapExtToMediaMimes { // Known media mimes that we can handle const mapExtToMediaMimes: MapExtToMediaMimes = { + '.aac': 'audio/x-aac', + '.avi': 'video/x-msvideo', '.bmp': 'image/bmp', + '.flv': 'video/x-flv', '.gif': 'image/gif', - '.jpg': 'image/jpg', - '.jpeg': 'image/jpg', - '.jpe': 'image/jpg', - '.png': 'image/png', - '.tiff': 'image/tiff', - '.tif': 'image/tiff', '.ico': 'image/x-icon', - '.tga': 'image/x-tga', - '.psd': 'image/vnd.adobe.photoshop', - '.webp': 'image/webp', + '.jpe': 'image/jpg', + '.jpeg': 'image/jpg', + '.jpg': 'image/jpg', + '.m1v': 'video/mpeg', + '.m2a': 'audio/mpeg', + '.m2v': 'video/mpeg', + '.m3a': 'audio/mpeg', '.mid': 'audio/midi', '.midi': 'audio/midi', - '.mp4a': 'audio/mp4', - '.mpga': 'audio/mpeg', + '.mk3d': 'video/x-matroska', + '.mks': 'video/x-matroska', + '.mkv': 'video/x-matroska', + '.mov': 'video/quicktime', + '.movie': 'video/x-sgi-movie', '.mp2': 'audio/mpeg', '.mp2a': 'audio/mpeg', '.mp3': 'audio/mpeg', - '.m2a': 'audio/mpeg', - '.m3a': 'audio/mpeg', - '.oga': 'audio/ogg', - '.ogg': 'audio/ogg', - '.spx': 'audio/ogg', - '.aac': 'audio/x-aac', - '.wav': 'audio/x-wav', - '.wma': 'audio/x-ms-wma', '.mp4': 'video/mp4', + '.mp4a': 'audio/mp4', '.mp4v': 'video/mp4', - '.mpg4': 'video/mp4', + '.mpe': 'video/mpeg', '.mpeg': 'video/mpeg', '.mpg': 'video/mpeg', - '.mpe': 'video/mpeg', - '.m1v': 'video/mpeg', - '.m2v': 'video/mpeg', + '.mpg4': 'video/mp4', + '.mpga': 'audio/mpeg', + '.oga': 'audio/ogg', + '.ogg': 'audio/ogg', '.ogv': 'video/ogg', + '.png': 'image/png', + '.psd': 'image/vnd.adobe.photoshop', '.qt': 'video/quicktime', - '.mov': 'video/quicktime', + '.spx': 'audio/ogg', + '.svg': 'image/svg+xml', + '.tga': 'image/x-tga', + '.tif': 'image/tiff', + '.tiff': 'image/tiff', + '.wav': 'audio/x-wav', '.webm': 'video/webm', - '.mkv': 'video/x-matroska', - '.mk3d': 'video/x-matroska', - '.mks': 'video/x-matroska', + '.webp': 'image/webp', + '.wma': 'audio/x-ms-wma', '.wmv': 'video/x-ms-wmv', - '.flv': 'video/x-flv', - '.avi': 'video/x-msvideo', - '.movie': 'video/x-sgi-movie' + '.woff': 'application/font-woff', }; export function getMediaMime(path: string): string | undefined { diff --git a/src/vs/workbench/browser/web.resources.ts b/src/vs/workbench/browser/web.resources.ts index cb4fdfb20ab..3fb3daab88a 100644 --- a/src/vs/workbench/browser/web.resources.ts +++ b/src/vs/workbench/browser/web.resources.ts @@ -5,6 +5,7 @@ import { IFileService } from 'vs/platform/files/common/files'; import { URI } from 'vs/base/common/uri'; +import { getMediaMime } from 'vs/base/common/mime'; export class WebResources { @@ -62,10 +63,11 @@ export class WebResources { promises.push(Promise.resolve()); } else { - promises.push(this._fileService.readFile(URI.parse(remoteUrl, true)).then(file => { - // todo@joh hack - const type = /\.woff$/.test(remoteUrl) ? 'application/font-woff' : 'image/svg+xml'; - this._cache.set(remoteUrl, URL.createObjectURL(new Blob([file.value.buffer], { type }))); + const uri = URI.parse(remoteUrl, true); + promises.push(this._fileService.readFile(uri).then(file => { + this._cache.set(remoteUrl, URL.createObjectURL(new Blob( + [file.value.buffer], { type: getMediaMime(uri.path) } + ))); })); } } From 51e5a1985d2ac72f333a58381bbe36fdd8396d67 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 13 Jun 2019 09:36:24 +0200 Subject: [PATCH 0107/1449] update remote node version to 10.11 (matching electron 4.2.3) --- remote/.yarnrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/remote/.yarnrc b/remote/.yarnrc index 29c22bc4be4..b28191e6bae 100644 --- a/remote/.yarnrc +++ b/remote/.yarnrc @@ -1,3 +1,3 @@ disturl "http://nodejs.org/dist" -target "10.2.1" +target "10.11.0" runtime "node" From a84c30184c82010f3a06eae1cbcdae0fb864b371 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 13 Jun 2019 10:27:39 +0200 Subject: [PATCH 0108/1449] [css/json/html] update lsp, services & dependencies --- extensions/css-language-features/package.json | 4 +- .../css-language-features/server/package.json | 10 +- .../server/src/cssServerMain.ts | 7 +- .../css-language-features/server/yarn.lock | 790 ++++++++++++++++-- extensions/css-language-features/yarn.lock | 46 +- .../html-language-features/package.json | 4 +- .../server/package.json | 12 +- .../server/src/htmlServerMain.ts | 11 +- .../server/src/modes/htmlMode.ts | 2 +- .../server/src/modes/languageModes.ts | 2 +- .../server/src/modes/pathCompletion.ts | 2 +- .../server/src/test/completions.test.ts | 12 +- .../html-language-features/server/yarn.lock | 93 ++- extensions/html-language-features/yarn.lock | 46 +- .../json-language-features/package.json | 6 +- .../server/package.json | 10 +- .../server/src/jsonServerMain.ts | 10 +- .../json-language-features/server/yarn.lock | 78 +- extensions/json-language-features/yarn.lock | 43 +- 19 files changed, 938 insertions(+), 250 deletions(-) diff --git a/extensions/css-language-features/package.json b/extensions/css-language-features/package.json index ae3e28751a8..a435a4e16b8 100644 --- a/extensions/css-language-features/package.json +++ b/extensions/css-language-features/package.json @@ -733,8 +733,8 @@ ] }, "dependencies": { - "vscode-languageclient": "^5.2.1", - "vscode-nls": "^4.0.0" + "vscode-languageclient": "^5.3.0-next.6", + "vscode-nls": "^4.1.1" }, "devDependencies": { "@types/node": "^10.14.8", diff --git a/extensions/css-language-features/server/package.json b/extensions/css-language-features/server/package.json index 05d800740ed..6f2e734a109 100644 --- a/extensions/css-language-features/server/package.json +++ b/extensions/css-language-features/server/package.json @@ -9,15 +9,15 @@ }, "main": "./out/cssServerMain", "dependencies": { - "vscode-css-languageservice": "^4.0.2-next.4", - "vscode-languageserver": "^5.3.0-next.2" + "vscode-css-languageservice": "^4.0.2", + "vscode-languageserver": "^5.3.0-next.8" }, "devDependencies": { "@types/mocha": "2.2.33", "@types/node": "^10.14.8", - "glob": "^7.1.2", - "mocha": "^5.2.0", - "mocha-junit-reporter": "^1.17.0", + "glob": "^7.1.4", + "mocha": "^6.1.4", + "mocha-junit-reporter": "^1.23.0", "mocha-multi-reporters": "^1.1.7" }, "scripts": { diff --git a/extensions/css-language-features/server/src/cssServerMain.ts b/extensions/css-language-features/server/src/cssServerMain.ts index e1c78b158c1..3eee352d7f2 100644 --- a/extensions/css-language-features/server/src/cssServerMain.ts +++ b/extensions/css-language-features/server/src/cssServerMain.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { - createConnection, IConnection, TextDocuments, InitializeParams, InitializeResult, ServerCapabilities, ConfigurationRequest, WorkspaceFolder + createConnection, IConnection, TextDocuments, InitializeParams, InitializeResult, ServerCapabilities, ConfigurationRequest, WorkspaceFolder, TextDocumentSyncKind } from 'vscode-languageserver'; import URI from 'vscode-uri'; import { TextDocument, CompletionList, Position } from 'vscode-languageserver-types'; @@ -32,9 +32,8 @@ process.on('unhandledRejection', (e: any) => { connection.console.error(formatError(`Unhandled exception`, e)); }); -// Create a simple text document manager. The text document manager -// supports full document sync only -const documents: TextDocuments = new TextDocuments(); +// Create a text document manager. +const documents: TextDocuments = new TextDocuments(TextDocumentSyncKind.Incremental); // Make the text document manager listen on the connection // for open, change and close text document events documents.listen(connection); diff --git a/extensions/css-language-features/server/yarn.lock b/extensions/css-language-features/server/yarn.lock index d8f2b53b982..c5bfa63c869 100644 --- a/extensions/css-language-features/server/yarn.lock +++ b/extensions/css-language-features/server/yarn.lock @@ -12,11 +12,40 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.14.8.tgz#fe444203ecef1162348cd6deb76c62477b2cc6e9" integrity sha512-I4+DbJEhLEg4/vIy/2gkWDvXBOOtPKV9EnLhYjMoqxcRW+TTZtUftkHktz/a8suoD5mUL7m6ReLrkPvSsCQQmw== +ansi-colors@3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" + integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + 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= +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -35,32 +64,78 @@ browser-stdout@1.3.1: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +chalk@^2.0.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + charenc@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= -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== +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + crypt@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= -debug@3.1.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== +debug@3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== dependencies: - ms "2.0.0" + ms "^2.1.1" debug@^2.2.0: version "2.6.9" @@ -69,25 +144,143 @@ debug@^2.2.0: 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" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +define-properties@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + 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== -escape-string-regexp@1.0.5: +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + dependencies: + once "^1.4.0" + +es-abstract@^1.5.1: + version "1.13.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" + integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== + dependencies: + es-to-primitive "^1.2.0" + function-bind "^1.1.1" + has "^1.0.3" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-keys "^1.0.12" + +es-to-primitive@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escape-string-regexp@1.0.5, 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= +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +find-up@3.0.0, find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +flat@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" + integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== + dependencies: + is-buffer "~2.0.3" + 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= -glob@7.1.2, 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== +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +glob@7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + 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.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -106,10 +299,22 @@ has-flag@^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= +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= + +has@^1.0.1, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== inflight@^1.0.4: version "1.0.6" @@ -124,16 +329,114 @@ inherits@2: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + 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-buffer@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" + integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw== + +is-callable@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= + dependencies: + has "^1.0.1" + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + dependencies: + has-symbols "^1.0.0" + +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= + +js-yaml@3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + lodash@^4.16.4: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== +lodash@^4.17.11: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + +log-symbols@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + md5@^2.1.0: version "2.2.1" resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" @@ -143,6 +446,20 @@ md5@^2.1.0: crypt "~0.0.1" is-buffer "~1.1.1" +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + +mimic-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + minimatch@3.0.4, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -162,10 +479,10 @@ mkdirp@0.5.1, mkdirp@~0.5.1: dependencies: minimist "0.0.8" -mocha-junit-reporter@^1.17.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/mocha-junit-reporter/-/mocha-junit-reporter-1.17.0.tgz#2e5149ed40fc5d2e3ca71e42db5ab1fec9c6d85c" - integrity sha1-LlFJ7UD8XS48px5C21qx/snG2Fw= +mocha-junit-reporter@^1.23.0: + version "1.23.0" + resolved "https://registry.yarnpkg.com/mocha-junit-reporter/-/mocha-junit-reporter-1.23.0.tgz#c5ad7f10b5aa9a7cc6e169b6bf15baf2700266ca" + integrity sha512-pmpnEO4iDTmLfrT2RKqPsc5relG4crnDSGmXPuGogdda27A7kLujDNJV4EbTbXlVBCZXggN9rQYPEWMkOv4AAA== dependencies: debug "^2.2.0" md5 "^2.1.0" @@ -181,40 +498,251 @@ mocha-multi-reporters@^1.1.7: debug "^3.1.0" lodash "^4.16.4" -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== +mocha@^6.1.4: + version "6.1.4" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.1.4.tgz#e35fada242d5434a7e163d555c705f6875951640" + integrity sha512-PN8CIy4RXsIoxoFJzS4QNnCH4psUCPWc4/rPrst/ecSJJbLBkubMiyGCP2Kj/9YnWbotFqAoeXyXMucj7gwCFg== dependencies: + ansi-colors "3.2.3" browser-stdout "1.3.1" - commander "2.15.1" - debug "3.1.0" + debug "3.2.6" diff "3.5.0" escape-string-regexp "1.0.5" - glob "7.1.2" + find-up "3.0.0" + glob "7.1.3" growl "1.10.5" - he "1.1.1" + he "1.2.0" + js-yaml "3.13.1" + log-symbols "2.2.0" minimatch "3.0.4" mkdirp "0.5.1" - supports-color "5.4.0" + ms "2.1.1" + node-environment-flags "1.0.5" + object.assign "4.1.0" + strip-json-comments "2.0.1" + supports-color "6.0.0" + which "1.3.1" + wide-align "1.1.3" + yargs "13.2.2" + yargs-parser "13.0.0" + yargs-unparser "1.5.0" ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -once@^1.3.0: +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +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== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-environment-flags@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.5.tgz#fa930275f5bf5dae188d6192b24b4c8bbac3d76a" + integrity sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ== + dependencies: + object.getownpropertydescriptors "^2.0.3" + semver "^5.7.0" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +object-keys@^1.0.11, object-keys@^1.0.12: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" +os-locale@^3.0.0, os-locale@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +p-limit@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" + integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +semver@^5.5.0, semver@^5.7.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" @@ -222,57 +750,114 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.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== +strip-ansi@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-json-comments@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +supports-color@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" + integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== dependencies: has-flag "^3.0.0" -vscode-css-languageservice@^4.0.2-next.4: - version "4.0.2-next.4" - resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-4.0.2-next.4.tgz#84930967c4b3f63206491ededb18112227eb64a3" - integrity sha512-k8sRcmzu58Muusx0IkIYWuFaG4VBQsxy6nM+Cken0sY/bemS5cvX2l4g5zRIJTzUHr85sxqkLmUk0n6Ef/asFA== +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: - vscode-languageserver-types "^3.14.0" - vscode-nls "^4.0.0" + has-flag "^3.0.0" -vscode-jsonrpc@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz#a7bf74ef3254d0a0c272fab15c82128e378b3be9" - integrity sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg== - -vscode-languageserver-protocol@3.15.0-next.1: - version "3.15.0-next.1" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.15.0-next.1.tgz#1e45e224d7eef8c79b4bed75b9dcb1930d2ab8ed" - integrity sha512-LXF0d9s3vxFBxVQ4aKl/XghdEMAncGt3dh4urIYa9Is43g3MfIQL9fC44YZtP+XXOrI2rpZU8lRNN01U1V6CDg== +vscode-css-languageservice@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-4.0.2.tgz#7496e538b0c151feac16d5888cc0b1b104f4c736" + integrity sha512-pTnfXbsME3pl+yDfhUp/mtvPyIJk0Le4zqJxDn56s9GY9LqY0RmkSEh0oHH6D0HXR3Ni6wKosIaqu8a2G0+jdw== dependencies: - vscode-jsonrpc "^4.0.0" - vscode-languageserver-types "3.14.0" + vscode-languageserver-types "^3.15.0-next.2" + vscode-nls "^4.1.1" -vscode-languageserver-types@3.14.0, vscode-languageserver-types@^3.14.0: - version "3.14.0" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz#d3b5952246d30e5241592b6dde8280e03942e743" - integrity sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A== +vscode-jsonrpc@^4.1.0-next.2: + version "4.1.0-next.2" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-4.1.0-next.2.tgz#3bd318910a48e631742b290975386e3dae685be3" + integrity sha512-GsBLjP9DxQ42yl1mW9GEIlnSc0+R8mfzhaebwmmTPEJjezD5SPoAo3DFrIAFZha9yvQ1nzZfZlhtVpGQmgxtXg== -vscode-languageserver@^5.3.0-next.2: - version "5.3.0-next.2" - resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-5.3.0-next.2.tgz#31ce4c34d68b517b400ca9e211e43f8d868b8dcc" - integrity sha512-n5onRw9naMrRHp2jnOn+ZwN1n+tTfzftWLPonjp1FWf/iCZWIlnw2TyF/Hn+SDGhLoVtoghmxhwEQaxEAfLHvw== +vscode-languageserver-protocol@^3.15.0-next.6: + version "3.15.0-next.6" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.15.0-next.6.tgz#a8aeb7e7dd65da8216b386db59494cdfd3215d92" + integrity sha512-/yDpYlWyNs26mM23mT73xmOFsh1iRfgZfBdHmfAxwDKwpQKLoOSqVidtYfxlK/pD3IEKGcAVnT4WXTsguxxAMQ== dependencies: - vscode-languageserver-protocol "3.15.0-next.1" + vscode-jsonrpc "^4.1.0-next.2" + vscode-languageserver-types "^3.15.0-next.2" + +vscode-languageserver-types@^3.15.0-next.2: + version "3.15.0-next.2" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.15.0-next.2.tgz#a0601332cdaafac21931f497bb080cfb8d73f254" + integrity sha512-2JkrMWWUi2rlVLSo9OFR2PIGUzdiowEM8NgNYiwLKnXTjpwpjjIrJbNNxDik7Rv4oo9KtikcFQZKXbrKilL/MQ== + +vscode-languageserver@^5.3.0-next.8: + version "5.3.0-next.8" + resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-5.3.0-next.8.tgz#12a4adf60374dbb93e153e08bdca5525f9b2029f" + integrity sha512-6vUb96wsRfrFqndril3gct/FBCSc24OxFZ2iz7kuEuXvLaIcEVOcSZIqQK8oFN7PdbAIaa9nnIpKSy4Yd15cIw== + dependencies: + vscode-languageserver-protocol "^3.15.0-next.6" + vscode-textbuffer "^1.0.0" vscode-uri "^1.0.6" -vscode-nls@^4.0.0: - version "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-nls@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-4.1.1.tgz#f9916b64e4947b20322defb1e676a495861f133c" + integrity sha512-4R+2UoUUU/LdnMnFjePxfLqNhBS8lrAFyX7pjb2ud/lqDkrUavFUTcG7wR0HBZFakae0Q6KLBFjMS6W93F403A== + +vscode-textbuffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/vscode-textbuffer/-/vscode-textbuffer-1.0.0.tgz#1faee638c8e0e4131c8d5c353993a1874acda086" + integrity sha512-zPaHo4urgpwsm+PrJWfNakolRpryNja18SUip/qIIsfhuEqEIPEXMxHOlFPjvDC4JgTaimkncNW7UMXRJTY6ow== vscode-uri@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-1.0.6.tgz#6b8f141b0bbc44ad7b07e94f82f168ac7608ad4d" integrity sha512-sLI2L0uGov3wKVb9EB+vIQBl9tVP90nqRvxSoJ35vI3NjxE8jfsE5DSOhWgSunHSZmKS4OCi2jrtfxK7uyp2ww== +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@1.3.1, which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +wide-align@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -282,3 +867,76 @@ xml@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5" integrity sha1-eLpyAgApxbyHuKgaPPzXS0ovweU= + +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yargs-parser@13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.0.0.tgz#3fc44f3e76a8bdb1cc3602e860108602e5ccde8b" + integrity sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^13.0.0: + version "13.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-unparser@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.5.0.tgz#f2bb2a7e83cbc87bb95c8e572828a06c9add6e0d" + integrity sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw== + dependencies: + flat "^4.1.0" + lodash "^4.17.11" + yargs "^12.0.5" + +yargs@13.2.2: + version "13.2.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.2.tgz#0c101f580ae95cea7f39d927e7770e3fdc97f993" + integrity sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA== + dependencies: + cliui "^4.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + os-locale "^3.1.0" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.0.0" + +yargs@^12.0.5: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== + dependencies: + cliui "^4.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" diff --git a/extensions/css-language-features/yarn.lock b/extensions/css-language-features/yarn.lock index 6c3b551509a..48f16a42fe5 100644 --- a/extensions/css-language-features/yarn.lock +++ b/extensions/css-language-features/yarn.lock @@ -162,36 +162,36 @@ supports-color@5.4.0: dependencies: has-flag "^3.0.0" -vscode-jsonrpc@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz#a7bf74ef3254d0a0c272fab15c82128e378b3be9" - integrity sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg== +vscode-jsonrpc@^4.1.0-next.2: + version "4.1.0-next.2" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-4.1.0-next.2.tgz#3bd318910a48e631742b290975386e3dae685be3" + integrity sha512-GsBLjP9DxQ42yl1mW9GEIlnSc0+R8mfzhaebwmmTPEJjezD5SPoAo3DFrIAFZha9yvQ1nzZfZlhtVpGQmgxtXg== -vscode-languageclient@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-5.2.1.tgz#7cfc83a294c409f58cfa2b910a8cfeaad0397193" - integrity sha512-7jrS/9WnV0ruqPamN1nE7qCxn0phkH5LjSgSp9h6qoJGoeAKzwKz/PF6M+iGA/aklx4GLZg1prddhEPQtuXI1Q== +vscode-languageclient@^5.3.0-next.6: + version "5.3.0-next.6" + resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-5.3.0-next.6.tgz#35e74882781158e8b111911c0953869d3df08777" + integrity sha512-DxT8+gkenjCjJV6ArcP75/AQfx6HP6m6kHIbacPCpffMeoE1YMLKj6ZixA9J87yr0fMtBmqumLmDeGe7MIF2bw== dependencies: semver "^5.5.0" - vscode-languageserver-protocol "3.14.1" + vscode-languageserver-protocol "^3.15.0-next.6" -vscode-languageserver-protocol@3.14.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.14.1.tgz#b8aab6afae2849c84a8983d39a1cf742417afe2f" - integrity sha512-IL66BLb2g20uIKog5Y2dQ0IiigW0XKrvmWiOvc0yXw80z3tMEzEnHjaGAb3ENuU7MnQqgnYJ1Cl2l9RvNgDi4g== +vscode-languageserver-protocol@^3.15.0-next.6: + version "3.15.0-next.6" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.15.0-next.6.tgz#a8aeb7e7dd65da8216b386db59494cdfd3215d92" + integrity sha512-/yDpYlWyNs26mM23mT73xmOFsh1iRfgZfBdHmfAxwDKwpQKLoOSqVidtYfxlK/pD3IEKGcAVnT4WXTsguxxAMQ== dependencies: - vscode-jsonrpc "^4.0.0" - vscode-languageserver-types "3.14.0" + vscode-jsonrpc "^4.1.0-next.2" + vscode-languageserver-types "^3.15.0-next.2" -vscode-languageserver-types@3.14.0: - version "3.14.0" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz#d3b5952246d30e5241592b6dde8280e03942e743" - integrity sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A== +vscode-languageserver-types@^3.15.0-next.2: + version "3.15.0-next.2" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.15.0-next.2.tgz#a0601332cdaafac21931f497bb080cfb8d73f254" + integrity sha512-2JkrMWWUi2rlVLSo9OFR2PIGUzdiowEM8NgNYiwLKnXTjpwpjjIrJbNNxDik7Rv4oo9KtikcFQZKXbrKilL/MQ== -vscode-nls@^4.0.0: - version "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-nls@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-4.1.1.tgz#f9916b64e4947b20322defb1e676a495861f133c" + integrity sha512-4R+2UoUUU/LdnMnFjePxfLqNhBS8lrAFyX7pjb2ud/lqDkrUavFUTcG7wR0HBZFakae0Q6KLBFjMS6W93F403A== wrappy@1: version "1.0.2" diff --git a/extensions/html-language-features/package.json b/extensions/html-language-features/package.json index 6689bb75a5e..e2d06c20860 100644 --- a/extensions/html-language-features/package.json +++ b/extensions/html-language-features/package.json @@ -177,8 +177,8 @@ }, "dependencies": { "vscode-extension-telemetry": "0.1.1", - "vscode-languageclient": "^5.2.1", - "vscode-nls": "^4.0.0" + "vscode-languageclient": "^5.3.0-next.6", + "vscode-nls": "^4.1.1" }, "devDependencies": { "@types/node": "^10.14.8" diff --git a/extensions/html-language-features/server/package.json b/extensions/html-language-features/server/package.json index dd930a80bb2..e97a42ab0a6 100644 --- a/extensions/html-language-features/server/package.json +++ b/extensions/html-language-features/server/package.json @@ -9,12 +9,12 @@ }, "main": "./out/htmlServerMain", "dependencies": { - "vscode-css-languageservice": "^4.0.2-next.3", - "vscode-html-languageservice": "^3.0.0-next.7", - "vscode-languageserver": "^5.3.0-next.2", - "vscode-languageserver-types": "^3.14.0", - "vscode-nls": "^4.0.0", - "vscode-uri": "^1.0.6" + "vscode-css-languageservice": "^4.0.2", + "vscode-html-languageservice": "^3.0.0", + "vscode-languageserver": "^5.3.0-next.8", + "vscode-languageserver-types": "3.15.0-next.2", + "vscode-nls": "^4.1.1", + "vscode-uri": "^2.0.1" }, "devDependencies": { "@types/mocha": "2.2.33", diff --git a/extensions/html-language-features/server/src/htmlServerMain.ts b/extensions/html-language-features/server/src/htmlServerMain.ts index 7974284bd77..46bd6e8d090 100644 --- a/extensions/html-language-features/server/src/htmlServerMain.ts +++ b/extensions/html-language-features/server/src/htmlServerMain.ts @@ -7,7 +7,7 @@ import { createConnection, IConnection, TextDocuments, InitializeParams, InitializeResult, RequestType, DocumentRangeFormattingRequest, Disposable, DocumentSelector, TextDocumentPositionParams, ServerCapabilities, Position, ConfigurationRequest, ConfigurationParams, DidChangeWorkspaceFoldersNotification, - WorkspaceFolder, DocumentColorRequest, ColorInformation, ColorPresentationRequest + WorkspaceFolder, DocumentColorRequest, ColorInformation, ColorPresentationRequest, TextDocumentSyncKind } from 'vscode-languageserver'; import { TextDocument, Diagnostic, DocumentLink, SymbolInformation } from 'vscode-languageserver-types'; import { getLanguageModes, LanguageModes, Settings } from './modes/languageModes'; @@ -15,7 +15,7 @@ import { getLanguageModes, LanguageModes, Settings } from './modes/languageModes import { format } from './modes/formatting'; import { pushAll } from './utils/arrays'; import { getDocumentContext } from './utils/documentContext'; -import uri from 'vscode-uri'; +import { URI } from 'vscode-uri'; import { formatError, runSafe, runSafeAsync } from './utils/runner'; import { getFoldingRanges } from './modes/htmlFolding'; @@ -38,9 +38,8 @@ process.on('uncaughtException', (e: any) => { console.error(formatError(`Unhandled exception`, e)); }); -// Create a simple text document manager. The text document manager -// supports full document sync only -const documents: TextDocuments = new TextDocuments(); +// Create a text document manager. +const documents: TextDocuments = new TextDocuments(TextDocumentSyncKind.Incremental); // Make the text document manager listen on the connection // for open, change and close text document events documents.listen(connection); @@ -85,7 +84,7 @@ connection.onInitialize((params: InitializeParams): InitializeResult => { if (!Array.isArray(workspaceFolders)) { workspaceFolders = []; if (params.rootPath) { - workspaceFolders.push({ name: '', uri: uri.file(params.rootPath).toString() }); + workspaceFolders.push({ name: '', uri: URI.file(params.rootPath).toString() }); } } diff --git a/extensions/html-language-features/server/src/modes/htmlMode.ts b/extensions/html-language-features/server/src/modes/htmlMode.ts index 09efb996f6e..57249a65b8a 100644 --- a/extensions/html-language-features/server/src/modes/htmlMode.ts +++ b/extensions/html-language-features/server/src/modes/htmlMode.ts @@ -15,7 +15,7 @@ export function getHTMLMode(htmlLanguageService: HTMLLanguageService, workspace: getId() { return 'html'; }, - getSelectionRanges(document: TextDocument, positions: Position[]): SelectionRange[][] { + getSelectionRanges(document: TextDocument, positions: Position[]): SelectionRange[] { return htmlLanguageService.getSelectionRanges(document, positions); }, doComplete(document: TextDocument, position: Position, settings = workspace.settings) { diff --git a/extensions/html-language-features/server/src/modes/languageModes.ts b/extensions/html-language-features/server/src/modes/languageModes.ts index 94c0b04a293..b44b2442420 100644 --- a/extensions/html-language-features/server/src/modes/languageModes.ts +++ b/extensions/html-language-features/server/src/modes/languageModes.ts @@ -31,7 +31,7 @@ export interface Workspace { export interface LanguageMode { getId(): string; - getSelectionRanges?: (document: TextDocument, positions: Position[]) => SelectionRange[][]; + getSelectionRanges?: (document: TextDocument, positions: Position[]) => SelectionRange[]; doValidation?: (document: TextDocument, settings?: Settings) => Diagnostic[]; doComplete?: (document: TextDocument, position: Position, settings?: Settings) => CompletionList; doResolve?: (document: TextDocument, item: CompletionItem) => CompletionItem; diff --git a/extensions/html-language-features/server/src/modes/pathCompletion.ts b/extensions/html-language-features/server/src/modes/pathCompletion.ts index f73acdcbcc8..7451fee1d93 100644 --- a/extensions/html-language-features/server/src/modes/pathCompletion.ts +++ b/extensions/html-language-features/server/src/modes/pathCompletion.ts @@ -7,7 +7,7 @@ import { TextDocument, CompletionItemKind, CompletionItem, TextEdit, Range, Posi import { WorkspaceFolder } from 'vscode-languageserver'; import * as path from 'path'; import * as fs from 'fs'; -import URI from 'vscode-uri'; +import { URI } from 'vscode-uri'; import { ICompletionParticipant } from 'vscode-html-languageservice'; import { startsWith } from '../utils/strings'; import { contains } from '../utils/arrays'; diff --git a/extensions/html-language-features/server/src/test/completions.test.ts b/extensions/html-language-features/server/src/test/completions.test.ts index c28daf9f0c2..de056ed3c1e 100644 --- a/extensions/html-language-features/server/src/test/completions.test.ts +++ b/extensions/html-language-features/server/src/test/completions.test.ts @@ -5,7 +5,7 @@ import 'mocha'; import * as assert from 'assert'; import * as path from 'path'; -import Uri from 'vscode-uri'; +import { URI } from 'vscode-uri'; import { TextDocument, CompletionList, CompletionItemKind } from 'vscode-languageserver-types'; import { getLanguageModes } from '../modes/languageModes'; import { WorkspaceFolder } from 'vscode-languageserver'; @@ -58,8 +58,8 @@ export function testCompletionFor(value: string, expected: { count?: number, ite let document = TextDocument.create(uri, 'html', 0, value); let position = document.positionAt(offset); - var languageModes = getLanguageModes({ css: true, javascript: true }, workspace); - var mode = languageModes.getModeAtPosition(document, position)!; + const languageModes = getLanguageModes({ css: true, javascript: true }, workspace); + const mode = languageModes.getModeAtPosition(document, position)!; let list = mode.doComplete!(document, position); @@ -95,9 +95,9 @@ suite('HTML Path Completion', () => { }; const fixtureRoot = path.resolve(__dirname, '../../src/test/pathCompletionFixtures'); - const fixtureWorkspace = { name: 'fixture', uri: Uri.file(fixtureRoot).toString() }; - const indexHtmlUri = Uri.file(path.resolve(fixtureRoot, 'index.html')).toString(); - const aboutHtmlUri = Uri.file(path.resolve(fixtureRoot, 'about/about.html')).toString(); + const fixtureWorkspace = { name: 'fixture', uri: URI.file(fixtureRoot).toString() }; + const indexHtmlUri = URI.file(path.resolve(fixtureRoot, 'index.html')).toString(); + const aboutHtmlUri = URI.file(path.resolve(fixtureRoot, 'about/about.html')).toString(); test('Basics - Correct label/kind/result/command', () => { testCompletionFor(' diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index bcc32718f39..0732bd22a90 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -36,8 +36,9 @@ import { hash } from 'vs/base/common/hash'; import { joinPath } from 'vs/base/common/resources'; interface IWindowConfiguration { - userDataUri: URI; remoteAuthority: string; + + userDataUri: URI; folderUri?: URI; workspaceUri?: URI; } @@ -184,18 +185,16 @@ class CodeRendererMain extends Disposable { } export interface IWindowConfigurationContents { - userDataPath: string; - settingsPath: string; - keybindingsPath: string; - folderPath?: string; - workspacePath?: string; + userDataUri: string; + folderUri?: string; + workspaceUri?: string; } export function main(windowConfigurationContents: IWindowConfigurationContents): Promise { const windowConfiguration: IWindowConfiguration = { - userDataUri: toResource(windowConfigurationContents.userDataPath), - folderUri: windowConfigurationContents.folderPath ? toResource(windowConfigurationContents.folderPath) : undefined, - workspaceUri: windowConfigurationContents.workspacePath ? toResource(windowConfigurationContents.workspacePath) : undefined, + userDataUri: toResource(windowConfigurationContents.userDataUri), + folderUri: windowConfigurationContents.folderUri ? toResource(windowConfigurationContents.folderUri) : undefined, + workspaceUri: windowConfigurationContents.workspaceUri ? toResource(windowConfigurationContents.workspaceUri) : undefined, remoteAuthority: document.location.host }; @@ -203,10 +202,9 @@ export function main(windowConfigurationContents: IWindowConfigurationContents): return renderer.open(); } -function toResource(path: string): URI { - return URI.from({ +function toResource(uri: string): URI { + return URI.parse(uri).with({ scheme: Schemas.vscodeRemote, - authority: document.location.host, - path + authority: document.location.host }); } From a5109d2491be6119ccf0a330a6da8544d804ab6b Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 14 Jun 2019 08:00:29 +0200 Subject: [PATCH 0159/1449] fix #75354 --- .../browser/parts/statusbar/statusbarPart.ts | 34 +++++++++---------- .../contrib/scm/browser/scmActivity.ts | 10 +++++- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts index 0286df6d404..e4117106882 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts @@ -543,20 +543,9 @@ export class StatusbarPart extends Part implements IStatusbarService { private getContextMenuActions(event: StandardMouseEvent): IAction[] { const actions: Action[] = []; - // Figure out if mouse is over an entry - let statusEntryUnderMouse: IStatusbarViewModelEntry | undefined = undefined; - for (let element: HTMLElement | null = event.target; element; element = element.parentElement) { - const entry = this.viewModel.findEntry(element); - if (entry) { - statusEntryUnderMouse = entry; - break; - } - } - - if (statusEntryUnderMouse) { - actions.push(new HideStatusbarEntryAction(statusEntryUnderMouse.id, this.viewModel)); - actions.push(new Separator()); - } + // Provide an action to hide the status bar at last + actions.push(this.instantiationService.createInstance(ToggleStatusbarVisibilityAction, ToggleStatusbarVisibilityAction.ID, nls.localize('hideStatusBar', "Hide Status Bar"))); + actions.push(new Separator()); // Show an entry per known status entry // Note: even though entries have an identifier, there can be multiple entries @@ -570,9 +559,20 @@ export class StatusbarPart extends Part implements IStatusbarService { } }); - // Provide an action to hide the status bar at last - actions.push(new Separator()); - actions.push(this.instantiationService.createInstance(ToggleStatusbarVisibilityAction, ToggleStatusbarVisibilityAction.ID, nls.localize('hideStatusBar', "Hide Status Bar"))); + // Figure out if mouse is over an entry + let statusEntryUnderMouse: IStatusbarViewModelEntry | undefined = undefined; + for (let element: HTMLElement | null = event.target; element; element = element.parentElement) { + const entry = this.viewModel.findEntry(element); + if (entry) { + statusEntryUnderMouse = entry; + break; + } + } + + if (statusEntryUnderMouse) { + actions.push(new Separator()); + actions.push(new HideStatusbarEntryAction(statusEntryUnderMouse.id, this.viewModel)); + } return actions; } diff --git a/src/vs/workbench/contrib/scm/browser/scmActivity.ts b/src/vs/workbench/contrib/scm/browser/scmActivity.ts index de8d68429cf..2bcd79a66f8 100644 --- a/src/vs/workbench/contrib/scm/browser/scmActivity.ts +++ b/src/vs/workbench/contrib/scm/browser/scmActivity.ts @@ -189,12 +189,20 @@ export class StatusBarController implements IWorkbenchContribution { const disposables = new DisposableStore(); for (const c of commands) { + const statusId = `status.scm.${repository.provider.id}.${c.tooltip}`; // needs to be unique, but c.id is too random + let statusLabel: string; + if (c.tooltip) { + statusLabel = localize('status.scm', "Source Control ({0}): {1}", repository.provider.label, c.tooltip.replace('...', '')); + } else { + statusLabel = localize('status.scm.short', "Source Control ({0})", repository.provider.label); + } + disposables.add(this.statusbarService.addEntry({ text: c.title, tooltip: `${label} - ${c.tooltip}`, command: c.id, arguments: c.arguments - }, 'status.scm', localize('status.scm', "Source Control"), MainThreadStatusBarAlignment.LEFT, 10000)); + }, statusId, statusLabel, MainThreadStatusBarAlignment.LEFT, 10000)); } this.statusBarDisposable = disposables; From c79157851d73f6c1c5d33ff677b9772128adf261 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Fri, 14 Jun 2019 09:50:51 +0200 Subject: [PATCH 0160/1449] Remove use of win32 from terminal task system Part of #69113 --- .../electron-browser/terminalTaskSystem.ts | 51 ++++++++++++++++++- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/tasks/electron-browser/terminalTaskSystem.ts b/src/vs/workbench/contrib/tasks/electron-browser/terminalTaskSystem.ts index b9d9d32f4cc..1dcb783fec7 100644 --- a/src/vs/workbench/contrib/tasks/electron-browser/terminalTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/electron-browser/terminalTaskSystem.ts @@ -9,6 +9,7 @@ import * as Objects from 'vs/base/common/objects'; import * as Types from 'vs/base/common/types'; import * as Platform from 'vs/base/common/platform'; import * as Async from 'vs/base/common/async'; +import * as resources from 'vs/base/common/resources'; import { IStringDictionary, values } from 'vs/base/common/collections'; import { LinkedMap, Touch } from 'vs/base/common/map'; import Severity from 'vs/base/common/severity'; @@ -16,7 +17,6 @@ import { Event, Emitter } from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { isUNC } from 'vs/base/common/extpath'; -import { win32 } from 'vs/base/node/processes'; import { IFileService } from 'vs/platform/files/common/files'; import { IMarkerService, MarkerSeverity } from 'vs/platform/markers/common/markers'; import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; @@ -434,7 +434,7 @@ export class TerminalTaskSystem implements ITaskSystem { if (isProcess) { let processVarValue: string; if (Platform.isWindows) { - processVarValue = await win32.findExecutable( + processVarValue = await this.findExecutable( this.configurationResolverService.resolve(workspaceFolder, CommandString.value(task.command.name!)), cwd ? this.configurationResolverService.resolve(workspaceFolder, cwd) : undefined, envPath ? envPath.split(path.delimiter).map(p => this.configurationResolverService.resolve(workspaceFolder, p)) : undefined @@ -1362,4 +1362,51 @@ export class TerminalTaskSystem implements ITaskSystem { outputChannel.append(output); } } + + private async findExecutable(command: string, cwd?: string, paths?: string[]): Promise { + // If we have an absolute path then we take it. + if (path.isAbsolute(command)) { + return command; + } + if (cwd === undefined) { + cwd = process.cwd(); + } + const dir = path.dirname(command); + if (dir !== '.') { + // We have a directory and the directory is relative (see above). Make the path absolute + // to the current working directory. + return path.join(cwd, command); + } + if (paths === undefined && Types.isString(process.env.PATH)) { + paths = process.env.PATH.split(path.delimiter); + } + // No PATH environment. Make path absolute to the cwd. + if (paths === undefined || paths.length === 0) { + return path.join(cwd, command); + } + // We have a simple file name. We get the path variable from the env + // and try to find the executable on the path. + for (let pathEntry of paths) { + // The path entry is absolute. + let fullPath: string; + if (path.isAbsolute(pathEntry)) { + fullPath = path.join(pathEntry, command); + } else { + fullPath = path.join(cwd, pathEntry, command); + } + + if (await this.fileService.exists(resources.toLocalResource(URI.from({ scheme: Schemas.file, path: fullPath }), this.environmentService.configuration.remoteAuthority))) { + return fullPath; + } + let withExtension = fullPath + '.com'; + if (await this.fileService.exists(resources.toLocalResource(URI.from({ scheme: Schemas.file, path: withExtension }), this.environmentService.configuration.remoteAuthority))) { + return withExtension; + } + withExtension = fullPath + '.exe'; + if (await this.fileService.exists(resources.toLocalResource(URI.from({ scheme: Schemas.file, path: withExtension }), this.environmentService.configuration.remoteAuthority))) { + return withExtension; + } + } + return path.join(cwd, command); + } } From 6a0545723d171934375caf00cd70ced507f69c75 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 14 Jun 2019 09:54:19 +0200 Subject: [PATCH 0161/1449] revert changes for #75106, fixes #75402 --- src/vs/editor/contrib/suggest/suggestModel.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/vs/editor/contrib/suggest/suggestModel.ts b/src/vs/editor/contrib/suggest/suggestModel.ts index 082440db213..6309571b9c4 100644 --- a/src/vs/editor/contrib/suggest/suggestModel.ts +++ b/src/vs/editor/contrib/suggest/suggestModel.ts @@ -226,9 +226,7 @@ export class SuggestModel implements IDisposable { this._requestToken = undefined; } this._state = State.Idle; - if (retrigger) { - this._completionModel.value = undefined; - } + this._completionModel.clear(); this._context = undefined; this._onDidCancel.fire({ retrigger }); } From 03394ab58358fef58fa1bb42cf8e332e381b3943 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Fri, 14 Jun 2019 09:57:21 +0200 Subject: [PATCH 0162/1449] Remove getWindowsBuildNumber from terminal task system Per discussion in #67855, using the build number didn't solve the issue. For web we need to remove this dependency anyway. Part of #69113 --- .../contrib/tasks/electron-browser/terminalTaskSystem.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/tasks/electron-browser/terminalTaskSystem.ts b/src/vs/workbench/contrib/tasks/electron-browser/terminalTaskSystem.ts index 1dcb783fec7..6355149f0c3 100644 --- a/src/vs/workbench/contrib/tasks/electron-browser/terminalTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/electron-browser/terminalTaskSystem.ts @@ -42,7 +42,7 @@ import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; import { URI } from 'vs/base/common/uri'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { Schemas } from 'vs/base/common/network'; -import { getWindowsBuildNumber, getDefaultShell } from 'vs/workbench/contrib/terminal/node/terminal'; +import { getDefaultShell } from 'vs/workbench/contrib/terminal/node/terminal'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; interface TerminalData { @@ -802,7 +802,7 @@ export class TerminalTaskSystem implements ITaskSystem { toAdd.push('-c'); } } else if (basename === 'wsl.exe') { - if (!shellSpecified && (getWindowsBuildNumber() >= 17763)) { // See https://github.com/Microsoft/vscode/issues/67855 + if (!shellSpecified) { toAdd.push('-e'); } } else { From c43b97e6a25cdabfa72a63aef47bf3c402173d5a Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Fri, 14 Jun 2019 10:21:39 +0200 Subject: [PATCH 0163/1449] Remove terminal task dependency on getDefaultShell Part of #69113 --- .../electron-browser/task.contribution.ts | 6 +++-- .../electron-browser/terminalTaskSystem.ts | 24 +++++++++++++++++-- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/tasks/electron-browser/task.contribution.ts b/src/vs/workbench/contrib/tasks/electron-browser/task.contribution.ts index 9ce3b7df426..c7302065496 100644 --- a/src/vs/workbench/contrib/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/contrib/tasks/electron-browser/task.contribution.ts @@ -91,6 +91,7 @@ import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/wor import { RunAutomaticTasks, AllowAutomaticTaskRunning, DisallowAutomaticTaskRunning } from 'vs/workbench/contrib/tasks/electron-browser/runAutomaticTasks'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal'; let tasksCategory = nls.localize('tasksCategory', "Tasks"); @@ -355,7 +356,8 @@ class TaskService extends Disposable implements ITaskService { @INotificationService private readonly notificationService: INotificationService, @IContextKeyService contextKeyService: IContextKeyService, @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, - @IWorkbenchLayoutService private readonly layoutService: IWorkbenchLayoutService + @IWorkbenchLayoutService private readonly layoutService: IWorkbenchLayoutService, + @ITerminalInstanceService private readonly terminalInstanceService: ITerminalInstanceService, ) { super(); @@ -1235,7 +1237,7 @@ class TaskService extends Disposable implements ITaskService { this.terminalService, this.outputService, this.panelService, this.markerService, this.modelService, this.configurationResolverService, this.telemetryService, this.contextService, this.environmentService, - TaskService.OutputChannelId, this.fileService, + TaskService.OutputChannelId, this.fileService, this.terminalInstanceService, (workspaceFolder: IWorkspaceFolder) => { if (!workspaceFolder) { return undefined; diff --git a/src/vs/workbench/contrib/tasks/electron-browser/terminalTaskSystem.ts b/src/vs/workbench/contrib/tasks/electron-browser/terminalTaskSystem.ts index 6355149f0c3..b009cbea51e 100644 --- a/src/vs/workbench/contrib/tasks/electron-browser/terminalTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/electron-browser/terminalTaskSystem.ts @@ -42,8 +42,8 @@ import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; import { URI } from 'vs/base/common/uri'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { Schemas } from 'vs/base/common/network'; -import { getDefaultShell } from 'vs/workbench/contrib/terminal/node/terminal'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; +import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal'; interface TerminalData { terminal: ITerminalInstance; @@ -172,6 +172,7 @@ export class TerminalTaskSystem implements ITaskSystem { private environmentService: IWorkbenchEnvironmentService, private outputChannelId: string, private fileService: IFileService, + private terminalInstanceService: ITerminalInstanceService, taskSystemInfoResolver: TaskSystemInfoResolver, ) { @@ -751,6 +752,25 @@ export class TerminalTaskSystem implements ITaskSystem { return nls.localize('TerminalTaskSystem.terminalName', 'Task - {0}', needsFolderQualification ? task.getQualifiedLabel() : task.configurationProperties.name); } + private getDefaultShell(platform: Platform.Platform): string { + let defaultShell: string | undefined = undefined; + try { + defaultShell = this.terminalInstanceService.getDefaultShell(platform); + } catch { + // Do nothing + } + if (!defaultShell) { + // Make up a guess for the default shell. + if (platform === Platform.Platform.Windows) { + defaultShell = 'cmd.exe'; + } else { + defaultShell = 'bash.exe'; + } + console.warn('Cannot get the default shell.'); + } + return defaultShell; + } + private createShellLaunchConfig(task: CustomTask | ContributedTask, variableResolver: VariableResolver, platform: Platform.Platform, options: CommandOptions, command: CommandString, args: CommandString[], waitOnExit: boolean | string): IShellLaunchConfig | undefined { let shellLaunchConfig: IShellLaunchConfig; let isShellCommand = task.command.runtime === RuntimeType.Shell; @@ -759,7 +779,7 @@ export class TerminalTaskSystem implements ITaskSystem { let originalCommand = task.command.name; if (isShellCommand) { shellLaunchConfig = { name: terminalName, executable: undefined, args: undefined, waitOnExit }; - this.terminalService.configHelper.mergeDefaultShellPathAndArgs(shellLaunchConfig, getDefaultShell(platform), platform); + this.terminalService.configHelper.mergeDefaultShellPathAndArgs(shellLaunchConfig, this.getDefaultShell(platform), platform); let shellSpecified: boolean = false; let shellOptions: ShellConfiguration | undefined = task.command.options && task.command.options.shell; if (shellOptions) { From 5ece1f176face5cb3fc4e302602567298ee42761 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 14 Jun 2019 10:32:12 +0200 Subject: [PATCH 0164/1449] fixes #71142 --- src/vs/base/browser/dom.ts | 4 ++++ src/vs/base/browser/ui/tree/abstractTree.ts | 15 ++++++++++++--- src/vs/base/browser/ui/tree/asyncDataTree.ts | 3 ++- src/vs/base/browser/ui/tree/tree.ts | 7 +++++++ .../callHierarchy/browser/callHierarchyPeek.ts | 5 +++++ 5 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index 90183d71270..c5f49f198e5 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -768,6 +768,10 @@ export function findParentWithClass(node: HTMLElement, clazz: string, stopAtClaz return null; } +export function hasParentWithClass(node: HTMLElement, clazz: string, stopAtClazzOrNode?: string | HTMLElement): boolean { + return !!findParentWithClass(node, clazz, stopAtClazzOrNode); +} + export function createStyleSheet(container: HTMLElement = document.getElementsByTagName('head')[0]): HTMLStyleElement { let style = document.createElement('style'); style.type = 'text/css'; diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index 19feab47a05..0bda3de3426 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -7,11 +7,11 @@ import 'vs/css!./media/tree'; import { IDisposable, dispose, Disposable, toDisposable } from 'vs/base/common/lifecycle'; import { IListOptions, List, IListStyles, mightProducePrintableCharacter, MouseController } from 'vs/base/browser/ui/list/listWidget'; import { IListVirtualDelegate, IListRenderer, IListMouseEvent, IListEvent, IListContextMenuEvent, IListDragAndDrop, IListDragOverReaction, IKeyboardNavigationLabelProvider, IIdentityProvider } from 'vs/base/browser/ui/list/list'; -import { append, $, toggleClass, getDomNodePagePosition, removeClass, addClass, hasClass } from 'vs/base/browser/dom'; +import { append, $, toggleClass, getDomNodePagePosition, removeClass, addClass, hasClass, hasParentWithClass } from 'vs/base/browser/dom'; import { Event, Relay, Emitter, EventBufferer } from 'vs/base/common/event'; import { StandardKeyboardEvent, IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { KeyCode } from 'vs/base/common/keyCodes'; -import { ITreeModel, ITreeNode, ITreeRenderer, ITreeEvent, ITreeMouseEvent, ITreeContextMenuEvent, ITreeFilter, ITreeNavigator, ICollapseStateChangeEvent, ITreeDragAndDrop, TreeDragOverBubble, TreeVisibility, TreeFilterResult, ITreeModelSpliceEvent } from 'vs/base/browser/ui/tree/tree'; +import { ITreeModel, ITreeNode, ITreeRenderer, ITreeEvent, ITreeMouseEvent, ITreeContextMenuEvent, ITreeFilter, ITreeNavigator, ICollapseStateChangeEvent, ITreeDragAndDrop, TreeDragOverBubble, TreeVisibility, TreeFilterResult, ITreeModelSpliceEvent, TreeMouseEventTarget } from 'vs/base/browser/ui/tree/tree'; import { ISpliceable } from 'vs/base/common/sequence'; import { IDragAndDropData, StaticDND, DragAndDropData } from 'vs/base/browser/dnd'; import { range, equals, distinctES6 } from 'vs/base/common/arrays'; @@ -722,9 +722,18 @@ function asTreeEvent(event: IListEvent>): ITreeEvent { } function asTreeMouseEvent(event: IListMouseEvent>): ITreeMouseEvent { + let target: TreeMouseEventTarget = TreeMouseEventTarget.Unknown; + + if (hasParentWithClass(event.browserEvent.target as HTMLElement, 'monaco-tl-twistie', 'monaco-tl-row')) { + target = TreeMouseEventTarget.Twistie; + } else if (hasParentWithClass(event.browserEvent.target as HTMLElement, 'monaco-tl-contents', 'monaco-tl-row')) { + target = TreeMouseEventTarget.Element; + } + return { browserEvent: event.browserEvent, - element: event.element ? event.element.element : null + element: event.element ? event.element.element : null, + target }; } diff --git a/src/vs/base/browser/ui/tree/asyncDataTree.ts b/src/vs/base/browser/ui/tree/asyncDataTree.ts index d5a9fc72915..70beeb2145d 100644 --- a/src/vs/base/browser/ui/tree/asyncDataTree.ts +++ b/src/vs/base/browser/ui/tree/asyncDataTree.ts @@ -133,7 +133,8 @@ function asTreeEvent(e: ITreeEvent>): I function asTreeMouseEvent(e: ITreeMouseEvent>): ITreeMouseEvent { return { browserEvent: e.browserEvent, - element: e.element && e.element.element as T + element: e.element && e.element.element as T, + target: e.target }; } diff --git a/src/vs/base/browser/ui/tree/tree.ts b/src/vs/base/browser/ui/tree/tree.ts index cedb6fbd423..80b30fa4c55 100644 --- a/src/vs/base/browser/ui/tree/tree.ts +++ b/src/vs/base/browser/ui/tree/tree.ts @@ -137,9 +137,16 @@ export interface ITreeEvent { browserEvent?: UIEvent; } +export enum TreeMouseEventTarget { + Unknown, + Twistie, + Element +} + export interface ITreeMouseEvent { browserEvent: MouseEvent; element: T | null; + target: TreeMouseEventTarget; } export interface ITreeContextMenuEvent { diff --git a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts index a244ae259cf..677ee37a697 100644 --- a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts +++ b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts @@ -33,6 +33,7 @@ import { IActionBarOptions, ActionsOrientation } from 'vs/base/browser/ui/action import { ILabelService } from 'vs/platform/label/common/label'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { Color } from 'vs/base/common/color'; +import { TreeMouseEventTarget } from 'vs/base/browser/ui/tree/tree'; const enum State { Loading = 'loading', @@ -307,6 +308,10 @@ export class CallHierarchyTreePeekWidget extends PeekViewWidget { })); this._disposables.add(this._tree.onMouseDblClick(e => { + if (e.target === TreeMouseEventTarget.Twistie) { + return; + } + if (e.element && isNonEmptyArray(e.element.locations)) { this.dispose(); this._editorService.openEditor({ From 466b29a0ae3ca7013be2acecb1a8dade2555c970 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Fri, 14 Jun 2019 10:47:34 +0200 Subject: [PATCH 0165/1449] install server: use distro commit --- build/npm/install-server.js | 15 +++++++++++++++ package.json | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 build/npm/install-server.js diff --git a/build/npm/install-server.js b/build/npm/install-server.js new file mode 100644 index 00000000000..ffeec1fa30a --- /dev/null +++ b/build/npm/install-server.js @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +const cp = require('child_process'); + +function exec(cmdLine) { + console.log(cmdLine); + cp.execSync(cmdLine, {stdio: "inherit"}); +} + +exec('git fetch distro'); +exec(`git checkout ${process.env['npm_package_distro']} -- src/vs/server resources/server`); +exec('git reset HEAD src/vs/server resources/server'); \ No newline at end of file diff --git a/package.json b/package.json index a6b3246edf2..4f1e1fe316b 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "strict-initialization-watch": "tsc --watch -p src/tsconfig.json --noEmit --strictPropertyInitialization", "web": "node resources/server/bin-dev/code-web.js --port 9888", "web-selfhost": "node resources/server/bin-dev/code-web.js --port 9777 --selfhost --folder .", - "install-server": "git fetch distro && git checkout distro/distro -- src/vs/server resources/server && git reset HEAD src/vs/server resources/server" + "install-server": "node build/npm/install-server.js" }, "dependencies": { "applicationinsights": "1.0.8", From ef88842d3fe1a4cfd1010313123c1bbb5b24b042 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 14 Jun 2019 10:47:33 +0200 Subject: [PATCH 0166/1449] completion model isn't dispoable but the suggest model that requests items, #75106 --- .../editor/contrib/suggest/completionModel.ts | 15 +----- .../contrib/suggest/suggestController.ts | 8 +++- src/vs/editor/contrib/suggest/suggestModel.ts | 47 ++++++++++++------- .../contrib/suggest/test/suggestModel.test.ts | 9 +++- 4 files changed, 45 insertions(+), 34 deletions(-) diff --git a/src/vs/editor/contrib/suggest/completionModel.ts b/src/vs/editor/contrib/suggest/completionModel.ts index 63836d21286..29673ee6473 100644 --- a/src/vs/editor/contrib/suggest/completionModel.ts +++ b/src/vs/editor/contrib/suggest/completionModel.ts @@ -4,8 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { fuzzyScore, fuzzyScoreGracefulAggressive, FuzzyScorer, FuzzyScore, anyScore } from 'vs/base/common/filters'; -import { isDisposable } from 'vs/base/common/lifecycle'; -import { CompletionList, CompletionItemProvider, CompletionItemKind } from 'vs/editor/common/modes'; +import { CompletionItemProvider, CompletionItemKind } from 'vs/editor/common/modes'; import { CompletionItem } from './suggest'; import { InternalSuggestOptions, EDITOR_DEFAULTS } from 'vs/editor/common/config/editorOptions'; import { WordDistance } from 'vs/editor/contrib/suggest/wordDistance'; @@ -75,18 +74,6 @@ export class CompletionModel { } } - dispose(): void { - const seen = new Set(); - for (const { container } of this._items) { - if (!seen.has(container)) { - seen.add(container); - if (isDisposable(container)) { - container.dispose(); - } - } - } - } - get lineContext(): LineContext { return this._lineContext; } diff --git a/src/vs/editor/contrib/suggest/suggestController.ts b/src/vs/editor/contrib/suggest/suggestController.ts index d267a41ca4e..0e56a54c170 100644 --- a/src/vs/editor/contrib/suggest/suggestController.ts +++ b/src/vs/editor/contrib/suggest/suggestController.ts @@ -135,6 +135,7 @@ export class SuggestController implements IEditorContribution { this._toDispose.push(this._editor.onDidBlurEditorWidget(() => { if (!this._sticky) { this._model.cancel(); + this._model.clear(); } })); @@ -165,6 +166,7 @@ export class SuggestController implements IEditorContribution { if (!event || !event.item) { this._alternatives.getValue().reset(); this._model.cancel(); + this._model.clear(); return; } if (!this._editor.hasModel()) { @@ -213,6 +215,7 @@ export class SuggestController implements IEditorContribution { if (!suggestion.command) { // done this._model.cancel(); + this._model.clear(); } else if (suggestion.command.id === TriggerSuggestAction.id) { // retigger @@ -220,7 +223,9 @@ export class SuggestController implements IEditorContribution { } else { // exec command, done - this._commandService.executeCommand(suggestion.command.id, ...(suggestion.command.arguments ? [...suggestion.command.arguments] : [])).catch(onUnexpectedError); + this._commandService.executeCommand(suggestion.command.id, ...(suggestion.command.arguments ? [...suggestion.command.arguments] : [])) + .catch(onUnexpectedError) + .finally(() => this._model.clear()); // <- clear only now, keep commands alive this._model.cancel(); } @@ -340,6 +345,7 @@ export class SuggestController implements IEditorContribution { cancelSuggestWidget(): void { this._model.cancel(); + this._model.clear(); this._widget.getValue().hideWidget(); } diff --git a/src/vs/editor/contrib/suggest/suggestModel.ts b/src/vs/editor/contrib/suggest/suggestModel.ts index 6309571b9c4..97eaa3dafda 100644 --- a/src/vs/editor/contrib/suggest/suggestModel.ts +++ b/src/vs/editor/contrib/suggest/suggestModel.ts @@ -7,7 +7,7 @@ import { isNonEmptyArray } from 'vs/base/common/arrays'; import { TimeoutTimer } from 'vs/base/common/async'; import { onUnexpectedError } from 'vs/base/common/errors'; import { Emitter, Event } from 'vs/base/common/event'; -import { IDisposable, dispose, DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose, DisposableStore, isDisposable } from 'vs/base/common/lifecycle'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { CursorChangeReason, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import { Position } from 'vs/editor/common/core/position'; @@ -101,7 +101,8 @@ export class SuggestModel implements IDisposable { private _context?: LineContext; private _currentSelection: Selection; - private readonly _completionModel = new MutableDisposable(); + private _completionModel: CompletionModel | undefined; + private readonly _completionDisposables = new DisposableStore(); private readonly _onDidCancel = new Emitter(); private readonly _onDidTrigger = new Emitter(); private readonly _onDidSuggest = new Emitter(); @@ -162,7 +163,7 @@ export class SuggestModel implements IDisposable { dispose(): void { dispose([this._onDidCancel, this._onDidSuggest, this._onDidTrigger, this._triggerCharacterListener, this._triggerQuickSuggest]); this._toDispose.dispose(); - this._completionModel.dispose(); + this._completionDisposables.dispose(); this.cancel(); } @@ -206,8 +207,8 @@ export class SuggestModel implements IDisposable { if (supports) { // keep existing items that where not computed by the // supports/providers that want to trigger now - const items: CompletionItem[] | undefined = this._completionModel.value ? this._completionModel.value.adopt(supports) : undefined; - this.trigger({ auto: true, shy: false, triggerCharacter: lastChar }, Boolean(this._completionModel.value), supports, items); + const items: CompletionItem[] | undefined = this._completionModel ? this._completionModel.adopt(supports) : undefined; + this.trigger({ auto: true, shy: false, triggerCharacter: lastChar }, Boolean(this._completionModel), supports, items); } }); } @@ -226,12 +227,16 @@ export class SuggestModel implements IDisposable { this._requestToken = undefined; } this._state = State.Idle; - this._completionModel.clear(); + this._completionModel = undefined; this._context = undefined; this._onDidCancel.fire({ retrigger }); } } + clear() { + this._completionDisposables.clear(); + } + private _updateActiveSuggestSession(): void { if (this._state !== State.Idle) { if (!this._editor.hasModel() || !CompletionProviderRegistry.has(this._editor.getModel())) { @@ -434,13 +439,21 @@ export class SuggestModel implements IDisposable { } const ctx = new LineContext(model, this._editor.getPosition(), auto, context.shy); - this._completionModel.value = new CompletionModel(items, this._context!.column, { + this._completionModel = new CompletionModel(items, this._context!.column, { leadingLineContent: ctx.leadingLineContent, characterCountDelta: ctx.column - this._context!.column }, wordDistance, this._editor.getConfiguration().contribInfo.suggest ); + + // store containers so that they can be disposed later + for (const item of items) { + if (isDisposable(item.container)) { + this._completionDisposables.add(item.container); + } + } + this._onNewContext(ctx); }).catch(onUnexpectedError); @@ -475,28 +488,28 @@ export class SuggestModel implements IDisposable { return; } - if (!this._completionModel.value) { + if (!this._completionModel) { // happens when IntelliSense is not yet computed return; } - if (ctx.column > this._context.column && this._completionModel.value.incomplete.size > 0 && ctx.leadingWord.word.length !== 0) { + if (ctx.column > this._context.column && this._completionModel.incomplete.size > 0 && ctx.leadingWord.word.length !== 0) { // typed -> moved cursor RIGHT & incomple model & still on a word -> retrigger - const { incomplete } = this._completionModel.value; - const adopted = this._completionModel.value.adopt(incomplete); + const { incomplete } = this._completionModel; + const adopted = this._completionModel.adopt(incomplete); this.trigger({ auto: this._state === State.Auto, shy: false }, true, incomplete, adopted); } else { // typed -> moved cursor RIGHT -> update UI - let oldLineContext = this._completionModel.value.lineContext; + let oldLineContext = this._completionModel.lineContext; let isFrozen = false; - this._completionModel.value.lineContext = { + this._completionModel.lineContext = { leadingLineContent: ctx.leadingLineContent, characterCountDelta: ctx.column - this._context.column }; - if (this._completionModel.value.items.length === 0) { + if (this._completionModel.items.length === 0) { if (LineContext.shouldAutoTrigger(this._editor) && this._context.leadingWord.endColumn < ctx.leadingWord.startColumn) { // retrigger when heading into a new word @@ -506,8 +519,8 @@ export class SuggestModel implements IDisposable { if (!this._context.auto) { // freeze when IntelliSense was manually requested - this._completionModel.value.lineContext = oldLineContext; - isFrozen = this._completionModel.value.items.length > 0; + this._completionModel.lineContext = oldLineContext; + isFrozen = this._completionModel.items.length > 0; if (isFrozen && ctx.leadingWord.word.length === 0) { // there were results before but now there aren't @@ -524,7 +537,7 @@ export class SuggestModel implements IDisposable { } this._onDidSuggest.fire({ - completionModel: this._completionModel.value, + completionModel: this._completionModel, auto: this._context.auto, shy: this._context.shy, isFrozen, diff --git a/src/vs/editor/contrib/suggest/test/suggestModel.test.ts b/src/vs/editor/contrib/suggest/test/suggestModel.test.ts index 8be498a8cc8..e18839ed6ad 100644 --- a/src/vs/editor/contrib/suggest/test/suggestModel.test.ts +++ b/src/vs/editor/contrib/suggest/test/suggestModel.test.ts @@ -221,6 +221,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { try { action(); } catch (err) { + sub.dispose(); reject(err); } }); @@ -776,9 +777,13 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { }, event => { assert.equal(event.auto, true); assert.equal(event.completionModel.items.length, 2); - assert.equal(disposeA, 1); - assert.equal(disposeB, 0); + + // clean up + model.clear(); + assert.equal(disposeA, 2); // provide got called two times! + assert.equal(disposeB, 1); }); + }); }); }); From bfc5fb4fd29fb67d17568f8d5d1733c4b4f1d601 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 14 Jun 2019 11:19:24 +0200 Subject: [PATCH 0167/1449] update inno_updater --- build/win32/Cargo.lock | 4 +++- build/win32/inno_updater.exe | Bin 386560 -> 396800 bytes 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/build/win32/Cargo.lock b/build/win32/Cargo.lock index dcc1440b35e..3c95fb34cdf 100644 --- a/build/win32/Cargo.lock +++ b/build/win32/Cargo.lock @@ -1,3 +1,5 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. [[package]] name = "build_const" version = "0.2.0" @@ -27,7 +29,7 @@ dependencies = [ [[package]] name = "inno_updater" -version = "0.7.1" +version = "0.8.0" dependencies = [ "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "crc 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/build/win32/inno_updater.exe b/build/win32/inno_updater.exe index 140065f673c7e9ffd238fbf52c445e4417fd2208..baca28361d147d072e1c1144eddd5065877d40ec 100644 GIT binary patch literal 396800 zcmeFa349b)wm)8-RFV!fR0B~Oji%K?6N#8;)I@?bkc6NiG_sC^ii$BHYF_9D#zE{* z-I7YtBjYkUGtL{_M#pi9;;;mlG=U@tB8#$!N&tmw8a3!h7MA{h&#mfCXG3K0{eN$s z`FzrK>n`V>d+yopT4Qcm!bNi&$KyX3o*+geikz&)jR+-JS(j{EO_z+t`fZfmLYe(Q|;tvO@ITkm^d`rU(j_39z&pjH3$ zPhTzXA&357Z2Y6V6z@-M?^*sjd&ZZ)!k$9;`|R1f{8>DGpY$w$5zkl4d&*z1XAhb3 z-?04$`87N**lsMR=gl+jDkj(+TVl`UxB^2Qw{%+ct)a9A?qWkvLvM~N2Q?NNSoGHw z2%8aHN))nb;V6!aWvOjXZW>~cW#-edToh+3V;QL&6=u)ygOz;d${4PZLM1U=!EzSW z{wFP#b6tw4K{4Ef_9^V`ZNys;nu4b-G97p}XsAcVhQos$ch7U+ZQvrkUDQ@;TEw4~ zcOS6OYcHHMmx}uG49|_`D}wr@1FGlGBR3% zrd%=#9q5#A1l9R}@oy!+;o8krF;Z=D%|`lDazs98POsM9Hf|h0d6IN^+DhuxMFvl` z;2s9%lA5Cg_q8lw5Ih+OR18o1UU*>}AA4lSP`4inrYG(|$m&ad!Oe-J$ukhnS(v7c(aX`%7zi>0zF8Tqr$kG|n}uZ&0a#QGE%|;GE-B{y7AtwbO39 z{ns_CUP#I1s)!$pjW6bKYM=OMB=JJeRa3-VPTiLu#R)yBKNL>M=YtN>7)%R}OO)0c zL!E>EiU_j)n<#%pUG`-|+2LwHRt%tAqSS0~--q)Y z=%1(giXoM@T?cyBM6l&aKUustIH9s#A6^PFC^!P zX+m;=XhjF~5zN0b3w`2+KEut*xHQ1BfTM;dgQLJA6tuFSQ7*J8lkz=V9akuG3bM9W z*fVEe?%t}PZs+B4X+fLg5kpzBsgQDWj(lSV zI@u}%wIX80X+p|W(XPI79nT5L2o(|QOry+gFqfde2*DiDh~EO8iRTG@o)OE@Jb7d) z*l9B`zKLXFBzgt}ut5w)$t{7A%2ZT5zPpOk+gB`q>VFR)+v?WZ^O3v@{BBggKM@QD zVwb4*7NB>jL1DtLM=3`50O}19UOp-B`7y#1m~M!FqfNOb-?Q71s@zcPy$Ba zKaUtkZf0B=$%^F4XsqaY1jO*ajQ0rs9g#|msXUm#82Cmrajz#-#Ib+`&+8E9d8ZiL zNL;i;J|cgrPUfSz3b*(Ia`P?OQKczuIpiaw)aDy`j^(=&`Gn=+jE1>;89kb-P|yWb z$DvY30>jbyw?I!_9_3b$CoGTdlHu}WyBU&s}F|K=TiDwp5Y!waT5B) zD9wYCH7jXqVJPoS2;4@xaPlOm5R>bMsM1l&0$xGY*9Fahf)FcZRfb9Pm~!rmB9oz< zd*B(I%an5rg326TZF)dQ@m~nsc6+3brTR^%!lj;96kh9G02fcy$Xf^pma~uWqDZ z2{O#&W*Uln@aWb)mr=qhBtY*P#|NE8^(|_WLo~xeB@6=EgXW7S^?5{&M^$$9aY}}o zf;c9~^*%MpP%j_x`IELZ8;)#gNvW5&;Ki^-ZuK2X+R|cZ-O`$}WhMtAI}^s)X9mZs zw*i21YrG*ZyM688->b3lhXvu!R1D^{}Ka?a&N)Y z8>Re23iM({UaGrV@Q}}^N!i!Gr?0p^YYMeFeconiCPF47*U)Mp@;K5|8XR=+0Q&MADYVe7wV^nTqg&feC&S zsEM^OT%0;)R}`^J_N4J@1!yD97j2xQw|ZcfE)e?>NUzp4${I7LZbZb)1fu1~2oWtm z2i|pT7*K07b8?NGEuyEXE$UyxnP1W~SGLQn=aZ+38S+SzTw9SN_JG$HE35$CML?QY zr=nmn2ZX80J9H=qsK+OuP@U8;Y_$zlrPMU-l;aFHU+2L16_fW|6!&=}Ek>DhRAQi5QK& zPGGNkrx33f6YB1(jWH<=;lTOgz)lhSL5O5X|{mn}7% zl$v=*AL2CR&s3vFf!z`C79`m`TLt%Osw_by309wifrR=YQAt8QVTp#rNx6{4TWC~= zFV>{m{ZB;t$-FBIEa}yY@+@F(cNPlD^TX<3Y=k;6vVwx(3Bq&&A)|WjSMXnt;LSN2 zT}%$1O({uG=2_(Y1levOq@)9}0B4d;@(%Ltjp~RzhUELy?0^lZs|}-B43n?G;3}eF zThj%P0rtz^i;Nh+K^?I%f>EvdGMY;dB4dU!F@Xe-(UGi3lyW1_dJQ_?fG&#yhZ{j* zljC|)pyx9Mnu%&ycP;ua&^&r}fuFPsX}xEs03DP7wkG6vKI|vzX&R}FxQ#g$j$cD> zISZ9HiRnPSGJ2AR?E}DQcy^fjOrK^GN^(RfgeoNN*Wj}z>q4F|Vf&+4v5N|g;iY80zm=m`vWQvCuVi|eVH`qog( z+ZyPi2EGwaSe*=7okt~hBBcJIi-eaiMZ!bjgkmaTp%NvRAz^wbA>`=jPns?;p_?r5 zoq3G%jj%iS3h!kJ7+LBLIem zq0Z6r5!JneoK+K?u~6*Qh%NlQW9$WpRd;ucjYI6daNbCi+5AQ-nLNV>pg0&l0qTpF z_mO#oA;vHBQeYlo?FMg!d4wk=XTTxui_BJeA7qH{GP41hh2=R=HB&{amv{9tqkHY+ zG4-Hce-E>*A}80vx|ZLqd(9pMU~(;Fa%UsVW+_S#D3nh2m}{(fglu^rD!p1-n@TeX zXo%+TR^;*7(R1Unqa4vhp#{cMIlco3G92GNcVaC zZbFcJ-85;fxr47ubnP~O#%bgyxS7&gV+7o8;bnINPdaP?ha^MIi|AF@ZL^K03FtrH zsPw@YOKyO!MR(#C{E6QL(S9>(wt>IoMro}j(t# zIr4we|z3xCZdD`G$p;lJlA zPP6h*f-;7@c+#w}CpOn_&fy%_L;saO0DdPucoAe@eey27cmEp!@|va~b@C)gO153y zTuK8Uliz@xuHPhZjyo}=lMe*bC&?cL?N$&7qLPhCocEDIiBrb%b-cI|tN~_aZjQ#f zjCsvVA+2~PoyEZgv`n(!tTh!av&bz3=0$+19iCv251<~s77?|$vPGo2LY1I&HpUee zR94c90c}?q#Kr>8&5X(t8+r|Am6EALvE*>2uK8jzVD=^3L1VK?L3?VrrsPmfsG<5a znls5hUTX@VS^)Li2&fqI>G*G@Se-~up8?cAMnFvtL!BRn3Nq%r1lo5)l`beU$?nAr zmpzO-DB?a0N-uBj)^fx^1g zq}*g4a+AqUc|v^xYaDZ( z>rKItW{5~_bWETCvc(4msUCt(kblP@JO3u{(oAk58X)vUVO|WJkIaekO}rc(AaIC@ z)t~|x#5h{s8Jg-)e@LKW>Ngi-uCAxtQbn{>H?zn{?cZ+v{Zr)kliPLq{Q`lG@@vMd z!7uXrvACuox)YPT?4()rkcMHq!R17oD zKz^@b#niz`k@9P1k=@F#9rm{(*Ai)hb6|q=F@q4-W`-B)X81}N8?`sEWlmOqhPL3o zH)Mu$?CR)yH8B>DlbPWnm`Av^#z;e)BO1wsei$}gh|o!fK2j-hbFnn z-rR1h*axXKGj|)#HcF*Z1$b)S^cy|8lG-!zrk|V`VU1tKOLtOxM&9&w1fBGOjX`d+ z#+%~L$Qr-Iim6NcN6PF%7I}v9`Xu%XF?s!O1jv7ml-JD|6aONwKiz-+Um&lQqkd+2 zr3%9G8jL+#^7_@d2zfn@m$NFbiwHW&>ks0AS|zc z4I0kU?6LZP)&*0^(%IjqWo$PBGgWP6c-#ckI6Z`rUE2b_nMapX_i#$Vl^$D9&v%FFTVR`-b*x8cTPx2z<^)Oz}s=Ur6=p?T$2DwdM zd!qqo;13^crDAG>F;ZUFu*fr%*H3bFdHn)`j`C{8sQVXr{g0H_l8ryJyix^Wc^!rc z^s}>iJ8)!#yk_I&tjcTM2wh$`BM|8i-_~?S@_HRBrl!S2%4=U1d4}>j5Qs7RI+$VD z-XETZQTH$M`X4E;);E7Oe7oP>Sb*J)*k0IO9i7%=sfMupCSk?vZ1~4EH6~M&U$%=P z5ie&|eqX}LT_(Sk2t@kFHyl1A`R&h&spi&5`TY*Zd4-;5MSh#E)#aCC__mkdt1u@2 zMSg#}^@Vy3Z?bCJP4P4DPX3AVYkTYGmS3tNEWfw=&zAh=W<<#ERJ@#3`8{~GF29Wk zM9S|1^^D|qGApLqk4DPxRV=cd{5t8>LKiz4X}6Y`*^TkN9yqe0?ns7ggz#qCRVRkO zzX|$eA6QKLj4ruOErXr_qngmj__uv4)D*_f-B?bC(W=W zhI8HUN!gY!-u#OJIrD*AK7bcYva7Y1X<9--Enb|#nT!jO)D?Q0&c*orW^2Tgca4OnJ22) zC#zFY!Afef)Tv~uoRaah0m^`ppZ_R>wsX4neiO!_VsHR>59a4uN zzjv{bD;+uzg;WF36^rQ76uH@_Mhovfy>mql z=i47$w!b+Ekvp4qdUN6$hweNV`J@+-uMBsH1RuXjQ2$p~qjPen? zDz>3@0(}m4o+|Ia{4O2ED$&n{If#w%J`WFivSAUP8TxxBJ%Nq6D&v(L5_V05;kO}d z1xPD0i?&B>oa`1|lozleDQ*M_v|SyX!tM)jmWSbo@$KxCAk{W-pXlutv|ygCVa(2clN!>-y92KmycaiDt! zGGzj<5-Nl~a3DO7!rDPLyrt>Q&!AYmvt|M;-J3w?sBvPE<)v26N1RD-9fEXzTWcTU z7Na=grXol}tT+A%1Sh=&_uMT$jbLB=BS^Q$vg40#aVdiI2k2&$VQ1CTiaf4g$_t-e29i!9&XF`_l z39-tHMHj#j%T|f+v&`bO-{bOwHZD+qg#-P7edwb0ursvmrw2Q`8`vjsx(N+@ni>dE z<M-3CbI-pBs(eH{Hvh*@ z=uJO%8)0vW$I)Tw>%C8i4OBP&x!a{ogLew=EivKZ4N=J5h1>QFLW-N^5OR-r^Ai+X zf~Oix^8&I9IrShRaR*3fQ424}2|Zlq5a*0bulC^q8b+% zJ+aof*0`_y1@RwLdbmaMC6-SR=c4;e#9B}U`ke#dQ99q~7Rel;-ko@W!L@fK^p12g zPDo#g2i@98ulZ7Q%-lf=?^*eh!2hq6;v8i7IWB>*k6VpRGf&Z0{sI~$63DJ*INpD#2LPQVs-qvKD z_C!I!Qw?+ApNk)1`C{=+fT611!c%^S2{tU$QoNPB#dq-V4iBOq>7c6A+*eriycs0m zJ!Y4UTP2s5mlNgCZ|+NhvT`+y@5v-zb1%^PRg}Q}h11~^T}66qOVu-Eg=(7i-P`g^ z%BO}M(OMqDiCse6r^y#gG92skk^eYU3*kh#p__!cV^QN~y_=}AHRqtR=v8FGE~+1T zkf^n20Dfhk&mT>;e{~M$O{n)Bioa26h0E6uX*K~bqC`s zqya`I!T2X&fSKoVg6BE{qiI2r$Xh)ZHz=<(@DnB7sQ~qIcYuP?(URkS3t&`>vX4`$=pmobx>k^y18Q%e< zFTfW{`;*|~pxa183yY>w-d4CZ!Ct;Yywng!_WFIo3oyZNhRriJKQ1Cqjqi{-Wt*^K z_m+TRn=cUMO`rphT*|hpb<3Xny`hHi#MP09dO{zXnhw&9kuiun2*1{%;h*9YR@A`C zC3yLD(_e!nh46SyKM;|?jAUjk5Gz6pywC2AL6jBzJ^}9{o#;XdCI=)tNTajYCZuK1 z=@GnV;+@1Wo8^Ta0k~=nT#g=WT)w^+P5A-A%@_YNSzN9W<6p))_U(+t3fNsz9=5T}1ebf|?;1I5q+U#rXN!Mzw z!N6jIIDvJ1(;<1gVG|P!5``E_uSM_r4c}3I_Pz%Fo>Hrm1x=i)lVchkNQIdv9XDMk zL$OYVS%fcz5kFNCSUWARzRud27!90|ZnbIeBE16!BP)gdf9XT+h~QQrS7kR;zl^Ko zN6-pOU0RdjCmXd)PoyC0h1Dx_o}VY%i0m`Wf|1uGaYc z=9CYF6yrxgk4P43xhBd;9HM*z-W|J0bCUttoaNdT<1qM;qRsxRRwf9rk z&ccr{!iTmKt51W&$yg`Ur_54mRw~@~ZY6^XmcF!$` zqC*uv}>Tt9QlX3R8h zQ4O1YD*VHBXfl_w*-&33H3O%S1bsz)dT=%A&6P|lKxoC}o$9i2(Tmw|BDi-od0PHU z@k=$%pc>Cl53VHN1kEjDE%nFg$)Cp~85R+fOK2{QAnfDRG|Z4;Vr++0GhN!j;nLyJ zJB87$;h}^719%?<`x`2(b?OHBBdt@9^$OGWTb;HCSu>l^dHbXw+A$lHxrue^`>a!U zqEmOB4t*Eig_8c0sFiBJxUKe|!cs#4W5Rapxg z96d4#8Pj+BpVvG6H!LfAy(1(Oo&N- zDFred5GiF7rO?<#lk6ChY;Ej8*-~osM)>Q2HRW$be&sfP6%DM?gYr&tQ&0dC#N?)E zWmbY>oc|A00=-7F$^TB{Fj0)pO)-gNs2et*)?-nm4r(+4@4>*ix6Gwj~q|EgWn@PcFb$>fAeJ;9R(dKB~SUicS>K(3amvn0I-xE>0Zn@jHlV>*;g<<4@+Q$S{L8fXP;|ma(5e>-2Lc% zHv7CsSl9@JV1O+EMiT}!zng;ruRiU(6{%(Kuxhv`u9>@YnFl;06 z0S3NC7`02n5;9yeXF>O*}3&r~a@%}6%b&u@m0 zumfxO`KEw20wgqJ3@w@`Q2S3Hk+Q|t9OY|`GWZNwSj37C(-W{{tbIhS=w}$`!>pCn zxK_+6mv$VHYk}7Ucuv$Ph}8tlTFl2nz`X2ehmj^K{)qUpW9G{sD0|>pRN$57@@V3M zuK0J4B?@bkd5SifN8bSO_z+EAYaTUQA0TFLlcQsK>aDVNG$NT|^Ms4dzxQL-&m;Ln)>ITm3>P1fx zEYy3KR&S^#2{i@o>NuQ-w8VypayrsN!}(B^{+Mqc~4(DevZ8bV7#OeY2^nK%Xh&MbT2IaEx#i3>c#oXo)Qt1$H(Ts0M4 zJJX~}YYk*zuq2{Kl!hX-Yz11jsiD~Ss4#}#H1|h;tEw@HAb$r)S)nYes{fJ06_Z|4 z2ZrN1EXaHY3DK%;TeMQyy{Fn|05*O~i!nt@8mJCHq9^SkzaQnsVZCG#p7AihTe;v==h#LT>+yJddAH=a>L?%E#7Q=x%59RN|$a^XNFT||I2BbZM zXC3~V@c%KUcSd6XI}%e{Tk*_6zA1=%9QjJ|oQUUhcvd0(ANZe%Y38RB5QqO)@xL7Z z*P~2#X~WP4eW{5(pn!M?k5MsVEzqRiSHifz?fZn<_o~35m|sp*(#npxK#zOE0oml8C`DyAxWr*57cQnXpk$QBe(657uc?vcq7r&~=OR&znNcnp z-yVP`bjt%eNx(MjTUlymjJ_FdI09&m=PIyf=$O|AxEomR`Ps5G*_@ZMU`a;59yE+#4Axdkl5!d0f??(cd5#KDtjrqKK z7&kTmv2YgYFj)-~K*F2=NL2xrF3BH!{BdG@V|bxaX99fR0NIr^WgcHgw1@ldu&R@I ze09i39d;W+SQC)uLXT%p}!kf|Q|bIR}yx4rz_X>fe} zytFq7i%ghB;$f!Q2QffJc`x*jnN8GTr4k7|-YraN;+AuSt<1*eTNFFJiPN!Ujb}3X zF?goV$9v$mpAWtY_~?AH_Gwfnnw^1n5$~Dwj`>d`V?1eXcDQ$Oe=GZ-27T9W%DXfm zQ!H$x{ZZ3b@^&`c<@+Y)-rDSxI-0$~Zk8=gUwLPVi5RT;{5`Se0V-vr)TUR%(a2PA z)%$*UeCshJdy~8N?zO^G)k5A8Lo;@sOhpD8aLNWw8F(h*nF-t&)$lIjJsa=IjG~|y z!fA}6V=c<$L`d>GK}JwsC#W$~vqdJ>*jd`X1PYH=i{n^B-PMk`N`s%qtzg1mGd~eC zJ{UKKCOB&y1#Eg-iw#X~);dan3?bXrtsx}z`E4HhiF(yYQ-^`yVD0-+L=YI1#3~xO zpy9$09E;K&05-3g*;bOw@#&S+Z85uuS=QT6XrcYMg%C0E36J^7*X_m~V ziV$Pc>ov29c$CoVwdnOQy6g3r!u2HUQ|_rcsKsb@q`#**7!@pJ8sI&mSue zqpyu%Je*{5xz<^>h#{}*f%BsYjt$4e2uiUU%a@MRo6JIXm0pTz;om{0X-oRc^aO`pa&il_c*oFfRL zq`IGy$l^3m1mIK}vthFI_NY7uO6p28{cLLwYpSE6gxDUJ_i)h=u>_VD4tq|MjPIhlz20-ic?|B4`S)bA;YIO=y4 z(G5pM`e(#XKgmCP13O!#_WoH!f0-ft8h`zq-1QF}QYHdCkEc$6|3;7qu!NF`0A7md zio3}FBCiAA^G_=Qr@eo=6fy1n z(<@((z(mt0APc{ea#j(5&i<+9Z;_8`m$zf9{WTTXW#YzHu+es-Ra@LW<+m05+d%^q znnLDSD8M#nwu{BR6$G?8&SgHE+{}DA0!hXzkkB!fHkn|%ODj!n>DyhJN&`rfyEjoHI`i zPqS`76LbSgOZ17l0X53s+0~a%urUZ6)z1D48$ZgMvySAcb*yf!&Ac!>p^a3ZizQXUScVq9(!p`Z>fyEYibJZQ+ z54eX=X%P&*8NN5KkK$6+HSP3#?R_SiUWCz~)AFCZS^hL-4fc|(@f|Xj9eZa8QWnwt z@r*T884a^I8-B;n0*!X7XRq-c=au_swCpHR?RhPB04f2nz z!M<_pns~pke2x5pqz_kD)niM&e5jakQF|>5&AMbGR*P$SD->4`Hq+)$z6!^!4CmVt ziqj-V`_<$lQ+m+E$seg`3wJA+E!A<8Qfd^I_Z}^^#0ZNHLJvfzdL1v=xXM`hP;j4e zn-OaR<#cU+Uy8Y4)rQc38)^sVxT@&@li2IQ1SfgVLm z%Gc7~Zr7JdSxt`d!tyZ&X7;^hSHm|esB~B%bi>Gqz0|PbtpT7OEfqwE2=|^=av#WgjO#l?X zi*~4chvT#BF~UOnNUhXj72Ll=psdA3H7tCCg@>gfyy$s^Y2#0kJ8=qi%I6EYi z3@ek6vf0r$Ym4y6o5-Q%eTnkU5>vgV{_-(-3@7LEwXsnZIpTTrX#5!mL@7B%9?m;|TN@V}cw1xp(lKQ% z#PV}U*x9O6^PZ*PDe8QOg3m}gV z6=SN96u{~v&V}0E1(4&|i4OiYUDqx9H9IbtkE<#{_TsQC5ra;z{=0 zb`UMmWwuGkZ3)S2wkESpgaGPx^!9&<+N73&f_p6jS>NDG?syKu*QY9SIr&@a0>dHJ z#CaAf6p~Tk=0-;U?U2**wWRoda10cdk2OejQSu3<`2Gd-1UF zK)If;5u_am1ZWDH>G=Mj2x$r$XF^lpzNnD4*ouj7S9U+}O+7+PTTEsA)P=T?!g+r~ zc_H{-Q$M-4oX6M3ac!z%6ja4ngM2$LPd56qu_%&$l=cH0jP>p9i}PtsG9AGRbN?II zfayO0&L_c+a`XmR2=;;~sWw^@YS*!b(iBKFNY6vEuM(CI&Xc|xMl$xT>sVvyl@Kz= z2u;8O*+jV(*5w+T%)TWsJN;|yF4wcq-U2PhGZ~D`l@S;d!ct3Tn3iE8ybr$f%R1V< z5=cgrDLtRfEI?K|Jx!rmFTTxlf4s+nVw+wh11AWuCW;Nqm*Ki~5WR|9>8rkAK}goTL2UNee+W#-$V(O-Ek$e6B;RhSWuov%UkH!?kN8otMQ<*F z%@UU98oUohfu*26iPGs{HY(@1LRfy~D57&iY`jWz9)uL4^DuNvARCg)3e5fp6c3yW zi0NO4vd;b_L}MSJ!VuGY<7%eB_r|dd4U8k|LknbE#}p`ffl?+u1Ld^S2UCHsj(q z8HQL5i^NdyW9pYs?cvAm?iA?d|3M2x`Edysx6I7YDkISJLG)z?_Wob=j+Hus>~3pZ zB@J&_>+#X`-N27!&Y{e&F{u8h*<)F}|4|l5-~FbcV>8a7>H?lFG!XFPWxsrd=u#8B;>gj=c0&~zS=D?lHcox-!9t_-ts6K(Q%X+Y=FDc57 zsNVj60;kHDWicTD>nZ7)WxZIwcjzSs zZ#M7jT^q-j-)<jr{zITpO-gb2<0{;6E1(?RbE2!^d zjrTf8M_ix>a>NA6@hiL;6+-!3!g68yR_UZc{s>wghROS2l(76}gS2m$)IhpNShx_V zXMH5N7vULFKl@_i4?+D13tf65zTl2T(n9_t2zs-xOJ7e=j{#}{p#BO_M;l;q32JLY z=`~r$1a}U)Ls&j&Bq=ml2*0Zp5Q)7gaT9~s4~Y2JAqX`V7=RzYh;-PFk9;}~vt7Oh zQ~YMu`$Gwx(gDl_3}qIe7qnQL0U!k@f5((R>893@rXu|`BqnSG(h!7ECL_?CNqScv zB#-AG#&Ni-9a&QIway2#P73ZgEXxruR#NA;U-L$5g5L!DT&hWKzzO|BLt296eZ; z&&%4Rbtb)d7oe->7~oik80dQHQ83U_JVOk0AU6IR#z2436G=A;%LQ-<(~e=V{gK`^ z*j{=`XIEfL^+cSR4uPdvzA#v3k-NmU0dyg3Z|n*zjiV_szYXj#1mPv&RL;IwUqj#c zHSw)vEX!aEU_Lhs?sNYIU+Px!xVBO*-LFPYU;GwrOd;0`?#Azt>qc~4`cdpN&_qwF zWnCE?-`Libf)ooJ{O92(GUxYQ<(x=4XLQJEg*7LipdHL-Dd#^aCrMVQbELa;R%(~` z5fI4#C;YU}`@634Zlk;hJLO%~Ro)8-hjhYWJ<;g^qh@XVrm~Zal8u7qeSU| z?wJ}r3loq)tPC%Njl@zua3lzi5J`v$T-m+B*wmf$w#?|?M@V*8apJ#U@n?YFRxxb} zVHL*(W_4TZ-*9B%-)XLC&dgAa3#PH!;tiWLDJ~)zPM62=Z^kD3WRpl73+6d_`e1|RZ2v?1b0gWtQ~qd3HiQ6cnQ*Fgs(!GXYo((ui$woqD)8J_8|Rv zrw$cNZAJJjr0OG+5YFY`E9}^@q*xrT?{xc2TEni9Eq4@9=#aC%4Y1(@ycF zAIdr*H)7Zz{G~enJ7+xB=5Zu{y~D&+pRCUg3T`^DmvTb>U?t_3zTlcZO{w>_CK*2I zvmJSJd_lOu@Eu{J;LMQN^YH%?Md4{5CRYEt#`=M<`~$;>(ss-Xm#txUhcuP#V0VYK zvb#g}XcwGRq8ho*yM$`N)@}J%$_5M>0b=xK?DBfL8gprX^;v!1g|vCZyX(?!!|;n}0{p1@$!tksJWvFJW-Lr#2*1Yb(i?4P=?8Z}$`-K@fLV3; z7nq%FNk5c+Bx{}AIG~xjXp3`*!W2d_sQ=&8Q`c!d<-AgEW``i!AAm@yGkikCZ}v}y z)`y}=*0MXcKxNRX8kh<@fOPyozwMt#W1%qtKCy{&UQ2W|)TMt7W7kvuEid0|lxLfe z%;w)Z-aw&z8PXq9L|i>__)XF^Z5+FD`csu9RlA-r_tDnJu|9{f$1Lq$4j!uw9QKgS ze;?}tJmRoUchi0Fk=pi=b-jP=+%H1wa~C4S*5{T2M*H=-C5UOiKKJNj?U4hTXe+;x za#j(5&g*lX))Om{jn)&NpVbb}P>Z|9w+Qsr_PgDW5X1Llz-f=~TEw)+chB#;#+Pzd z5rEG4uC!iXvcKw@g!2Yz^j>LLCOuxY@WicmXz!~IVhOcs0O$^`G^!_BnJv-Ms0}N> zB-klP*W!p5swi$|irTQPLuTZs>nMy$9v{3mh)a=qgrs>q=P)bR;^GkF+#c$^pJCh- z=y6+(dIv(mImby#rXqM7s{r((iTq9gtjY}xfKk01d1(RqVk$nD6~6#MX+Z+#=%dUr ztMPbaBePfpK)_H}u%~o5O>O|kTl973MA#}C6?U}y-aS&coZ6>zv z40(kGrS}AD(8jJYAd8CkRDz=phASP(?Vu8Q0}+XC9O4) z()H)v17^D@TvLi()1cF9P&X-8-qq?Jjti}2qkE=s!@Lf%`Egx-wKSMTqD);@)5Nb15voXWcI3v z(^b!665LfUq(B)aBcgccKnR$C=>_Hsx2X_q{n>=6iDXon3S}i?)qp20p$t|Q@T#%{ zR7xNzd>kRj_YF{)shD7$$IDZUa=xhozI=JU8IS1l{C>2EXeg5N`^d3?XRXWQ&DA+v zEf*6)e-$>^>qs^z9kokHzZij!i1OtBS>bpA9bQA{_;#RUCUkfWofM#xNUmZSCA&$E zMZH$4*MO^DU~M(aZVuO66t4Nl+fNm0?MDdhABxJt?MLNS*>0+}nYoGyAb=eNm_P)u zg8)Dxtqlpr=`|6}-&@hS`TG9kQ?&n+5IVeu&S0RB9ElRTM7En5`4fSGEku5u2yNuQ zqxkUk_XwQm zr)%~97=JG5wszm5POblO{qWh=aQhKL`+uzdrQOy){8aT9wCN`rpUOBdLOSXOoZ42W zgmIYGhJ(m-RHi(Im-CHK8FFzO2UK>8!@G}kpuvy!{}#00Li+JbgwXzLm|g@E(%qwJ z3<=af&m>PV%l3q@nyBu80**OxRkUKFUf&LdAFF?Axc=!sss7E~)?ej`B*Bl>|Jmkn z`w>F>Gtl%z>~bdK7P1o9bZ#?-2ml?~K$W*M6>ZHQ(ysa+)z4F@er7JFYxVya|21}K zc$X_?hi;M_%ih|YBZMOMBd5{#5}YPDWVFqn4l+cXLt}><=o&{1pYV%x z^&&t69ww#~Krm_y-Kt0*S}?0uZwfVP2tw$nEM<&Y*7bujCV|X&i5b^QGTx=b6Sf4| zKo^h>4>c>avp=FeUN#jP(Si{ExPQ74tyUhQ+i#(~FvOcj^u}|3B8G=()jaPL;>(n0 zl&LrsQR5~D=NfT}fu=@q`2r=y2%dGAw8J0{`OTmLEyz#PDM8131$IBuINNg_ zIur|$)6^Zf9%yC?QEU%F)TBw6ZUs%wIgXhQJbV2MPq}uf3CahrF+6+rnS^HbDJ0H5 z=dhlUrbf#1K+isTR{Tt&j_s|^p$gd0e1TrUUyP_b4a0JpT9NCpYD@ujOgQ62J)?s% zW+G$pdMF;7(J0qqN73cwc|C;{Xi$-y7q9lGQtbF-l3wa1Dplv+U566`2$k@HCmF2` z57%EttX;iA&;1tVsbzBy`6wvW^3n~Uj~~&}0vfK<=pN*oR%_!8e%ioBG=ie%u<-Ah z6A73$w%OH>KhVf{9B(>c+Q1M3OoZ0})4F8sC;&}IAbmGmLDpI4QQY(p6nc{Sp~;Ss z*nehMf2#rZ6w*-JiWiNl$$EXGP)Yj%X>Dl2qc&o~qiG`>0B4{SHPqc7&|ubpELTTM zd#tUBQQb3{1x4>-jYV;0)n;5ulS5e0MsIyPE($jsp`3=|Qh>FqJJ++edw2kqkEy@K ztA?bcCAgo9?TlodHY*c}#=6aeDXosetW&=gK`<6P?tBC^GG2cj6 z)=#4Z+NB2`Tr4)QfLROB4ZcgX2uclInv4895vwF2PE*VfAmt{L`p=1B=Aj9zf7MeP z9YgiL?S~d=ee0Y@_rw(P6(h~q^Xzs5m_HS%8i5|(Km=OB3Oj4$J?d=;YQ!mGkzgvU z`=3S+UIR#&!YD;4`51`fC{JJCjx=E$Jg)(w>$f(};RIpO9Q>kbjMErh${86z0v7_F z_0IWWAt^#9+f}2ESqa|s_Fe*zT6+c08;B-ecI4EKG#iLke+R9kV3Z@rkGXG7`E9B) zJ0t6)Ge@gfLn1xcRoxCZm7k%N7d*6p4yhCCfEegVdvB%RW|Du48f3)n-yyIc6&+ z#t39yqO!m$e_xl!W=EywC|F?Hua}A`NJ4^?=bw?$vmTK~!Sgbdj83)CY}ym+iFO-n zH9bIZblM%H$xThcxF;jpe;a-@_L#=XJgt@SECILE)QXyg2#raG>)@t!n%C@7%*}uY zCK-cL@R^uSbC2sJL!fxmc-CXs1CLZ8S+h)NS~8;>==Fr?LJyEkWaDkINIXNQGeJwZ zE(JtFaRN>*PKkBU1XQZ}$(Sgu>$G`SO<#ok4`pPcGTvG@Ql~C$R5sH35dKY$43JxJ zZ-(xRn2maR4HjU_4(hW}Y;O%#emt9y%RdG`kzMK`*3yhQdQEWm1hKkil084hB)VJB ziAnB5mk~wL|Ck38JaopSWB-F`(f@0;{@)9Fh5DZuNbi4IR`g$jAJ)&~kXh^JU+Klj z<2nsxkc_&}&v&Dg-p`n0B$4b#B8fT8b~+RN9d~nhj&ZEX*$=*^ktP|Jex*$^_6+o; zD4J!|rW3Eb8tnx!Vf8#dGzH;QOg0Lh+pzPM`rE%2vFehVPy?Puh)m=PM0ad}FGAJ# zg=;xYWB$8p0T*xhZpSky4V@Nl#Hh}V7;92Tj0-p7Can?4)QH_*Mm8cj)QDuY6pL#> z+z7pGgarGaqdn?yw^>7;#0wf?QVWpFzX)#;lcU9R$>|4=>1GCA7pV&|S$+Kgndntk zG*cTN3}so>JWn)AsKH4z^BOwFa1l#el|q@(v7BnwBH(f8rGs!K*i7wunyIZZ$-C6V zo@}Ppih)U$6&Z_d2&r?zi;OQrGO98t;WLtvTf+%$Q@MvJAt#(*Cjb*MDbE&aXna_9 z7^aq!KU791sv8T#tn9ehuJ&BR3|*?e6mYOFm{(hwxl0+#2kz7Q?j>|Td`D~_!=lQ^ zYB>TLBQIf5g1Zjo+Ver3T&wXxkG!I7f@Bq^BbsFwGdUwb?@$6OUsGnQ+O<#y9Xj}a&RI!!O}zI&m~Yh9x@t*MYJ_Z z-BFDtH9wg<3{UWZJFzYo*V2Psa?_-fQShZ-#S8jBm-=11+S54>B9cf-=sk0oVuG7) zX|t=J03Nab4!r4V=3TgEeg! zG^cqdnt;t>#KNX~VV!hbgFinnFDvtpHA>>mei5TnuJ4-LKv~nBhy9F!^~5 z0i@Bpnw1vKy?Y$=52=i&&^Z5L93fHfN4@%*cXHV@zp7K^j};(38fSN})-$ z6@)1pGOI(^P-~qGee{*dag|QrF@U7e7rHdnc^`(Hfw}Fl=tEc(5fWfbWXN|RgE z*RMx`TD9q2G?*=d1Q8;*15sQv${1MzDuzf#Y-p#FavdAEUW**)KpQm_Dzi7bnOOsy z>d(Q2Zu7NUC#V21r;=y!RC{f_kb@Swcgse(&?0z-0kUovab+#C+SMu@0kRCbMSQF` z(A9@r-yxbz7u71bamoU#q-KMk)>Dhv`My;|8THy~f_1+J%j1XFqV@~7@qE3C;ecDm zQGT=$0MIfh9eM|G*y=BXb?AN8sh6P?tvhmux&zR>(IU`@2E@1PWM0~^%z?lks7)7yB2E&42h`YKNLtHVZO9t8lJ^27b$7;IOsWmr2hbyn&N zFU)twt$b zfE?aa3Xl6UI{H?Nqb%F7Y$@Q@51}VT;+t2$JI-q+wbI!<;lQA?87topuPG zd!WvBP7JA%@7|?0U9LCaV4G+~p)DFc1kc4Nr>W|J2r*tHueGfjRFcmsu_=YAFbD31 zC@nWBb28GmDx=b9U~)vBo1u)NjrI9n)6KrUe8mJ~s_Zb5cZsIBT4@N9W3<-h7*k^f z&lmtuMkOi_Sml#-qau9d1ZZ>%NDWRVAK5dM@WgHeVkOL%q5(7;A%N98wA9F2YOB(C z^-<^-z2_}G+gggb0KKJ{G}BtT76HBg-(mf~ib3$CU~{JWJYF;&_=gtl-iK+h)8K&z z0Si2^0;NEbM3Oo8H#j9x7isGK#qrb}wAdzi+?_k`8ivq)dd*;qP?K_jM5yyv z`=P6{q3LNaC2V&;IWJpR^593NhwcP$yZR>`BW!I6HR;bFh1R4~srni?fl&1(Y8zAa z2|A?fQT)`Z{wCz0_F&wLAurRE3#^RAOu&|yst9E3z*Nhs2;IO6jerd#KI_;FS`F-v zv<{9I2W5Ibbpc#1jYpG0-9U#u)jLpDLv@A@G6KB` zB%5bER|h$Ufo#78s0+{Yt5po-#V8f-SzlK@yAd8r+xCp>kl99~j=M2!grNpCQ@4`Q zm*Vsk?n=OvFWuE)p>xoWg0}wWAXQW>l>O7dN9v^IA-r!xh&b{|_=u+=Ojl@l&qS#( z-q%89cH+nc;9Y5078ikz+X75zG+#*?r4_w(4I*gT>Iy;;d&J1Kb4TOFe?ETH%72Ei zT!|22`7M~cJ(lZ2e*HSl#Im`|MVN#`hpj~^h9$9v`zs=EE;Gz^xokd>s7KOMJQB{m9i39aQ?#L~;u!2hU9npzL1=MR-N9o9-i$Wrm1iV99q90fnV;O8O zhs%c6dy)_Vr??*nzmU=vq{`nbbJBu0WzblHoOf@YA$@C8Q&y8aK23PUgcvrHFo&j_ z%-SRqCfUs9+8lFgoZ>JilcT-_)ng_BUMmcS8Iw(#+0brm7FIaSI9NHsd?o14(nXtZ zADs`?O<4SQL^&83%w$r3VXnj~crt*W|7pCc32%q`CJ`a(oAH>WYu`6rn&bfP)Ii@P zqg0rKzJ@Gy9(!rzaqp$Xt-ypf6PaL@e{-D1lFQ;cB1dD64oYJIDzmH0ml1}JB;5+p zl$+KW&Rf`4tUE|m2Y#*EkWZ85d{#nmW24sTw5h+=rU@vex5@FhP7)C{oVZ`>mr6r~ zTzFInP>B6?@o-)c>O%GMi`%3oR3826JQstmR8soT_On0?=bh|iA;kc=l_m^q%;Gx$ zdp=E3*{KuJ#l`Yw#tYNRr;4*&`(uj`f1gh^yN=OKVGlTZk%z4=#N8+i7^)#h<3-{p z8oLRe$2(Ix;h#k5g16dHIvG-|Q+g7k^sTicc|%~by8X=%rN2OkxaS;XJq_-84Xae( zouS!F9;R;rIyyeOdlI-Kz?J>#D!V@-QT3LGlLj>i5mBtb z55=vRWwEXU9d5^|d84#GN)}KpnPs{tt836!94JtM!tg#|_G)r1El=nxIaoc8RA56H4A0k3UmZ*SBJ_Phxt zh)k%+@l@SN&E`a-8Tfjd+M2D^v-|5{ux#x{M6%s~>IhgN%ihTvHdVk;DO#~ZF5*V5*yUO-b{gP|GRmO7@j3>8_*8LK=BHTGq|Z5n`)z4> z!4sovh#sr}9(0b~4h=z{Hez=>V`_xF2^-!m^j%JMBYdII3?vm)SKrC7WV3t^u+JgknmF3n#SADsH|6QRA7S^iB{>#r4Rm7S^*KhBn|a?P&C@cig?qfEMOp z;?a2-qT7sJ7EuvfqsM= zU;IuaZqiyaT23b$h@U{<1Q*nYcE7$dNLM|M6iEI*h_xJ7>r+kTXsR~V2E$HD!kX5}He-&DCZ0as{_;)71h_@L7q zybd>Lf|LoaY%#_;AUM~AT{ywH3BkGM@sqFvDQM4>)>;B|4K^>rG{wq|p>?=3fPXH) zYE|gKlTmZGz<)aao#3aPUHCXBKgw)x*Mfvo*6J z>1x)8Xa^1!^D2N1-@n^F^Vw}*C;H)A**`0Pk>vcG{41Va z_>gZ)M-j|9RagJJ{fjG!&nA8PwG+L3=m!%Skw2AKeKc= z0rK~K*YcO~BXsLl{wyK=KB=>Iw`jGy9>zwShm6kto9 zkw=9jK=S*pea<8kz~0{f|M&U-(ahOrpZ#2W?X}llYwfkugy~EnsMk!;Ie#|=CtBra zu;-L0>`_9gItQ^NdbxSPJQcI1vZc^hSizK>uiv0pTZghl>8B74v`qaN+0z`X#{nW3x*O|f_QEVCP*WBZ-<0OLE?7Ai_$G|sANIH0q|mwP-ppM z(@0J&ARVY5hxMVj-PkCDWqk00j8vLgO0ZajsvDn=@j*3&r0{Ab_LKB6&6_?H22c$kF8eFLAd%-L?n9oPRYm95Ja*9>uWL4$=D97z< zR(U(Q0GW~wCsJn4u1rALI|lh;-T;u{d%(2_;W;9F!8M3 z!EtZ%#s>%g1|Nf1(_cH$x%-=N+EHh(0?a=}v-J2`)jr5ov*j z#J-=}*U@+>Uq52UQP5seO!e1rcaHbS8|a?ebPfm1WV3Peh10)yZu$;?VY2tKW$ie% zFV;$LcBGINDhUbB3xp}FkA2eu+0yvyW34M$lhYPFzz9POkk*7I1m4*S-rt5U8wOvf1^!Ax zsnGk!$R7zRcsH7oHkHpz=lvkElCP$|J@-8=@L!Bgcr3MhS4MtAIKKU-_IA7}`0n8D z%fK>HP4!oIhVOgPD^Bgz)%V%wez)M6^L1AJsl8TngVRJ-HO>*03nJ2l?qOk{Vmw4% zqzdfEzDK+ZFQz#Au=_V>tGzG+r2J6-&}5vjAis$11jiK_qn?$i=_#^^;x|AUq9`Q@ zl?bk)$DySTeW{~ztSk`$k*RJV5fIkzb!bnHaz=k?PW6qym8pL087a@Z&iEApbB_Oq ziqZnlldbbs@q%;w0m@;H|Akz!W&|Fj%Q+`IP4o691%D#&coe(5LZ|llTq-%*)>V64 z+zA;MNh5HuQDpSB8Znw^y^h8Y(Spy?jTk7{6yL0puqifI%1`+UC;)?ZfszV8pf<%n zHhcTlZ=|=0Dhr$9mwp}V?W=@jF?faS|3+{9ltXW;$wf_`Uv%oDj8|Efnlx&l7uaVQ z3CwE$W@qGLCI!M3H=>vRNFIc$iIdX);U2;sl%7H4ViaQ;15QNt;)X8HY_veW-SWC6 zqcRo^kPWw?f2L$49sBNzsVd@AQg6D5-WY|ymk1@tqY>8b{D&%)$=`_ZWRQQk%cccx zVm{v6BD7SrA<{PJ2m~%Al*C;@MGl&p7Iy9Ciz{c_wc{bQtR4Y5I}je@3=i7PmAm`( z4@o8WR=LdiUSrYMcZ9w&=MRALxwRI3CATu3Nppv%JJ;xvCU=WguwCXmE{+L)shAg< z!LpFss0EwoL!^u{uouat>{{O8U>rE-rV!|BN78pBX`xCQAV{@aw7?wR!;_^YCVib0 z_x(J2dECC8E5S(-qpz`6k1&U;jwGtM#qUg8xV1JDfsb z?;!cP@DJl}UDlHiNh3i22>9cnMy(^5L46tWiW65M#X%83Dv!qkf68`IoXV$rXgdw- zNXjI!MH={ttq{3T(+_xOIi)2g{6$6``+n*`M_*NYw%hkZu}Lx2U#IAAC-~oRq4b{R zR@&n#?YXf3@YI3!7J9A+peJJhrTJQLI{;-Y(qK}-dOse3!wu3UwVmD`+^2-jXvYN3^Z?tBt>{pb)GF^Wcw;`Z4_o=(vX&DoP!itQN zr%X!p8E=+m;eOD@)GVL_0o=m$EOt~DI)(d}lR%YNh;wi)u+8Jh*9%>t0WxJ7kF?O8 zj{W;(MBz`&!$EqT@x(7UivcpukX}B; zix9_)B~@L>;g*-((!P3t=d3y8V0A27z-3e$@j`|mw4vaHOjGtgC(g(-f*jFekth68 zI$3U(7`&84z_^+hbIrNls%SN2s52G5phD#A(~1fYB^SyNE$}IW$9gk{W|BXV?%LYn z6xb^tcY$_jdX+ihPd^g6_;*Qcb}9IMT4Ui0qDkZNCux_G*8hT#^tp?$D=zmq3`{w8 zxyY%Py7aF4me6cR=urhfh~i{tIPKuQNXdnYh6|neyT{jX0du2icQhWo3jqBA_|Ny? zhrS8_#3}mtg^(JET)?e@tckM`_aozeYi$f-~Vv#_nhjSwyYzkK2(hj&H&2M0dReyQ4nwZ z4sMz|r3K_jPJDI1$INhra0*a1j%zQ+0@{-m()=|}G0>$xsmnQ{wx+rB?v(q}%;MDTNs~FZny!D`_JFhP0SAuPy=k%YyrNvVKpAJ| z-r2c@Xk$h>aPq_sa$46@`!3&}*n7I^2@B|scX+Rap>KC(HScGpE2~*NEwk|H1mk^H ziFzlO@(NQxxjyw^*JH}h)jZBilT;Dg%Ls(#Wjw!71Q3`Hm0xRS!w%?Gw5bVv;t)7)f^HA8V|_b`qd4qb?RvEfJ5ojsNDUZg={t zM3}w7t(WmDUe(F@u_@R{NQi17Njp!$x|n@)yt@6jl!JZq2jmh} zyExM7w6etN5B{2lp~ip^2Y)ARd`wIuw-KVUb9XBhstxQ`Oq+pYLT*f(fd$HD;DLHM zA7t%T`l_DXsoVXkwW={G?xegV43YWhf7lSGaEm`R{u#FFIz}M0_^9zoEaDIW z|HDlx-9L@DW6|3rU7|@5_Ze4-Nz@ou+hV6Vna8-4Tf56ci=CERx}Qr%+|q@3T3+o| z67<&%^lxDgG9P63Kh|GrS?V@QB(d;GcN2g;5Q+zJND1W_6JwvoOK$6u6XS1CYvsMw zDavQIgW`EUCBHusNcLA?r##bn$kUZaJR2@KHly_OnY~7dKzHD#CcIj~Scpn{kcvdS zMIyN#-3?;cj7Qnl(0dzki7wf6vXx3Y~E3}fIA;|RmuByA@QKgOe_B^VF*s5Bz`JCiW%cw7iW zlFAHW_-iOOoz@c)49p?vzcHOwQV!Fpj$9^T_`1`CYOg=I6JUle7I`~N&amYuFuWyP zJH$rHUxzsM1wMxzBbDQDc2cAFa#I*Qd6;NgQz5%*?ooBPwSdUCLif3hGnJs@Aor~> zP0DyE#cKHTeAmah^ts}b0f&tu{YS#yHZBd07papgKyW1bKY+ zhTsAHpf?&#&|8EH3x2J;)@VWD>tp=U9Yx0bR0*u_vBWE<_-cw*w4j(;h=@fCAp0>z z?{F>1FU(fTjJQ+f)`Ih7b#S>&4&n0=iiJ=T^PyoGlQNae`)lJ;0w%w7rI|Az(w@#^ zazU?$$5*RUqXWpLsT(|X1T`{FElum#Ej~Sb?HQ!xxijztkP*G zpz}ZkoyND&BO{Y2wIcT=(4L`>WB@|NM8c;LgZuK1^8*RZDbN660Rsc$M zm~by4hVT(fy7tfr&E_LU&Aj*rOt(M@2A< z&Ps+Rl&n=%!xeCk`81<9RZ-&XI(2_J-t=PZgn7Sl3Jh{)Ws;*cFR_e$I1qQ|**zIt zDqF;=gCWq0_b>!P(=3K1uE;KFBk_r)%P@6okJk?iEoQ5BzLAgz1EEJq8@*ZbC6vzp zU*sz#t?}*e&NVD5`oCvbRKd1g-|KI;A&Nsk1ut>r(l*ejVR;3J?VwZ1O#188->vM1 zW1Ouq5CXpWd7Q}^3v2L}QjD zR^(}(l~|12^mNd#JFwTcfISk3&QoRgm*i@fJ~AcVZ76x@I5Qxlai2IL}LC|#BpQSit%_~;r?SVJGs7Vf*`xN ztV^hv$`wzu?BX%Cz-`ZSs5^V7gqDaO+;cqQUTf_FdKtG-)2wJO+RsJLsa>O&8HL1H z`+?B}jlujVc3}_!HB;`mvo3BSZOB#gLqKGntgbR6)Rqg-*o@z+2u6_YA6q8D@joWU zS(~*Fvg|kDD9}24;J3BlFtUe+m$K9fnfN|$IdKxVk~M8h9meMYMJ>|w`UN!GVSK=Q zu`=&_#U6T0OKaSX7@kj-RypJ-*c~CH&!-9 zwJytRdkp^FOaB0lw%Y-=!(ZsLD`XE=FPlFcBKDZ)&d`JGCxPK${jeozGTx`_{t-6s z_=Y4Qs>pQ4!JT<}m^|_nMg+D*N8XT>ugf};8Ei9CditU=S?+F2lKnjXB=cu1=; zmJCo>Wu%*1EZ8LffiM5|eZ7sllx3+?h&0P%Hmd_dz3;fMcioz}`+A$lNPQL&viQ4D z4*P_gLbo|W4|3&e&bC=bB2127)L!t?V4THT$dWzmv~+zTas}Zqj>5Dr8lBRwYn+n(+ap80*U+ zA8KKIlaP>)zepK%ot8)AXOc?kpnhqkf|(ZL#V>`F$>)JW5g)QXhlpnR5{*wvXNz9s zgm@erFCGUQ@)f(S&(3Jb&y<4nQg=gse+k7nlZ~rnr$3mO(rQ9RQ&0Kkh>hpHGZl3Z zMXkAdK7Esl5dPhaSY<{Gln6;?EKw2qA%ycvMlTBnY{|yiQqcfX6dB(GG;j`u>G{#O||18m*7P9{nr%$WnUr-SUxslw-U~8A{ml zvRRn%yI90?5`lc=37(1@`>8~9$VVRHRT1x{1kRI>nE0L@?!rb*?b*1td2e`7mmB2u z=uX3bsMTMcpjBw>@xbpi<2p*IIg${bbaTQqL8kBXE*L2){qRL9Tk{)C5G=sMeFsoV zNrUajwyc&ng;LafnJ~IU^jP8+ETT+*(11;|>u*&iGr-(07zu1!cBQ^EgjR-kvjmIm zh|0Y$B`a&0@Ng+Rx5YC>->+5OVfWW2&^(9#lac<<`uUm5#v+n5A%K?Pp2RRJ|pqEtYd}ea&Y|o5h+d zO-%mKY-BlXH#BVJ)wD1=lnY%x>q-`@A2px#N{%MK#bk4opH^4dSh=)-9Dj@D{SvU1 zZ^0FQ8#i`F%0FuZrZtgnA1c+BD4OCW(6(@2H3U?Y^%hsg z)_burr6-OTydH5Isv;Bm&q6Z@ocJ<1AOB=mUKWIOwJyF97TXB-+AfXB#;ThZo zyQ6uol%0lgHY-}g7L@nlc0TKldxx>-MKKTB)1pKk$^ zD#r3f8a$k*zMCfFUOnKHmwMx|M>vh6aQ~Nt1WVZ?iF7)xq`@(p4xU^#R66GwX3Qjk zN_i&%^!C->?3kCy$Uq@i+>>!4KIen=#-S03d=Qf^8(g?J%gml(+%0?T%`Sa^&bDG> z$IA9aV?U|bzNJIe)1he@{AC(PB>Ie@UEp?)j~^<*_GQE%Dx z80#c~!1&JuVDQu}9Tjz+RO1&!NEz~R4PkEkZi!iB7!Ss>tsnppf^uHB(&5JHDpFBv z-(@&e2aQzqpj=IF9>leCrcMQy$(GZEiRi+QwAG@NLH*GGR4ern_d^qHTp_9 z(vGWDtaqc{Y;wS_UN3;NE~rKW)YCZrpf!5m5MY3gD|LqPYn5>0S69F?jGU}6?U-4_ z1L{lX<&FC-V4$rlEe0CDp(us5zb2q$*4!^aib1+;M1_{Y0)6*Y6Rdkqa8kr^vHK-N zX4ih7gv<@TrP+FN(rMRFX&i-%M%fukXK~Vmm$D0+2hxZEo5Gt`374kb3=IV9p>~f+%NL=J6{Fp__)uHW0 zaVW}OWpqRm3z5zjBWSUabrad2NEx>5 z)wEB!VpB4SE6i3<_{H=l8>zqx(ta*%vd$aT`OmUR5@A~5781P=ROh?OM5tfMUZV`bg|isPJPg-{vURt$SnH~vuwH{7Yb%a*Cl?v57pd3mK*-qA`c=IZGWO|os zRY&vYYb&;rFq~Eu&e&5Eb^Unv{Qixb+(aP>($)uTBR+-uVL-0Z_eTCebS1`r;aA;0 zg6;6tYpV^1?_#Q)cEG-+kD#xRus2QDWt#uh>rLl^AG-4`8P<-Sxv*s zc`Tlzh|H{FhVt7lkrWNxbT!d=$xFLB239!IqP^(B&C-KSR}rte@y0cT!j818Jt}W; z5f?Vefj#4kn`Nq|lyCNtKv+z@W|IVsH`G=xo`lJKY6tMsqzMH~IGX^r{M!u#$XZa` zExj&vmba$x&{m9(MQrRBj7~G{Est)x?c()2^;4%l)_2!Ld)!+mNwXUCrc;M&zU=bj z+WA=x^rV;cq`bB5(6?PMG+MuQq%}6#XE^Mg-5UPMnWca8pT2u}mbSi*mF?c@hmj1{ z7^y$rIzQ_zZT(w%owj~;vYBa8cB_9&EBGPJ_n%JIep*eyS2wU?PIlYmNF6VsxRGu* zHZ|K@Tk~&?H%r|=;>Sz#i=f&XvuJM4f$(c?A2IsTnj^^D^SYIFaSV}{2yG+W4x##4#-DjNM)RW}G?IXR zYL@X=o+2af==Qr;#k$=-=o`O~=7<$%=^0tEzk=6P(6UmP>**ubtVe|VE*{8b^}5T_ z;KbZR?OrT=V|VHVakRhcs@6v&Q9u>Tw@M!eGBnF42Nz zyiPV7iZJz1wpY>1Ev?+Ap&vWO`p+h!87u1{EKnZ97+HwOf|d&(DXydLk`LC2<@5p) zKsH9F5_w2zJ?D)sTx*2pm;PVzY@Kvwbeb70X>Ca`F` zU%|q2tzOUExXyT#3}a-+9vsHYgc4~QjhPqdj zw~Z%h$Ob2{gvk+40W;6>D&=}WhOU6-2#C$08)kg|6NXOh){YPoxW}0%JqV|!bzf%( zy9QFQ-0=(Zms1`2DKF+w;)qHeXpRAOoU}l`p|BhJCE|m6vJ4F8r-Y`YVB}FymznN4#N-n*iDv;%QM!*ej)Gwv=BXyZUEa$D z^H69FD$T~xyfL$@qOu6^={rn)S#-JHD4!X(K|05_BsrxFDRoNntIXtJ&>*ClLyRXW z8jQG}&Gqi0wq8svWvgP`N)#8rm-&~g64S^ow*tDPMDtd_t^}VC08K!7`NmSfV-fLs?PA}I6_>mV!83qEGh<$x8v5Q*XXe^3F~;qvc3Ir-~Yh~7}@81x6~5t<@vwL)Ln8m z!l|xxbOy)-WLyFno+&)!>1cdmv@8#@wHAA5n<3ZhZ3Js=?_{-CPO0tZL(9J!&uYU? zxq#8=&lJfcYd(^7n|^FTPh-%1YJOnLS-|Re4b_3RNM@~?I+7y?ZlUraBh;l=XDNu*1p`D#XqvwX)FGdmQ%bV z><~Np(R)p~p_1KjL7S4@_<7POhpocl_6#x3mNG=_G1YRNcCVs!Ln0y#vh027luH^0 zk`zR5ELlVG&M4>QB%jDtb`X#yUakK%O5t(>k-#9)3%KZ}Q|H=UqYot)Lm382T^U9y zuR>V7J&es}{@~m65qVQj;}s&f!X8IrFullmaAPm`CPFn_xh>j?iPA+b|6)YbXBpSu zrJzisG5|&(8lwg87jFJxevAUJOzV!6uS1r1xr(9><0*6!nL-XhTp_vx8HR$F zb|};xudsp?R3H}O1LAD=hiV&8btXt@(vnP-{dHa&eyHe!>H>Q94svzu z9+O-}cv|G@Q-a1meiXUdLjb|xmlUhUn3{&`AH_MU8K4~1Tw?q|azrnQyPI%q9|5xQ zI3FzIKb@e_il@+c>e4}9xL-(!Nyx763Ehf01;;xY@NCUup1&P5fXO8&go5B&g7Qxf zxbbF#DT*^RJ%jl9yr^qwSG!9I60^{X0UL@)jdai!HZ$?j!&~DR&?Vr0h7$Q8)$!pu z9`LEQqT*@bR!ZA0s1>V0Q66k+4e=Ou1UB;Iyhvp_Tpj1fDJo|hetNWZJyIB0IWYJ$ z2FxlmyjnGsqNTlenH`eW^1oClt(AWSrHN`eHQOh#(~67QXofVxY$5~f6yuTs)DU`A zLFPPr3N6qdVs6@0Xsg5}p<$oTct?^YdX9T0_P=d6TE?5^oy6CLx{K|m(2}Lyjoo*v z$?uA~jI9J^&bK|F+z!3TtMMv7rv6Vp#sCpGC9BA4nG`=~dw~Z6$l{<1VQ+;sTBlY3 zfFdIZEoF;KuZ&WPSkO(V>mouzUALfRCPzBDy7@NY_QQQQ0JTkUQP4Av17SG@-B;if zg3UjY%TnXYWBGZW4;DQaIBn%~2^1-fbDg7U!ny?LHK$z2VdZq?!VPG_*LkIkG#Z_v zf28jYUsOx2S;u+L(|4$9{k4g_WoV;!hR54cA8PBH!>-Hh@9X<>n>9b%bESu}zpJhI z9CQ|imQoR&wx1TI!U3(~U7|&)(7+SzP=WhK^T4k0!yf`sSuO++5Ap)YGhjvmgBJV` z3Xc4mEG0<)b1Y329Z+3YjSq|gDEh(33Q~56?AAyj(R;&Pq$6_H?4Jw}Bb-s$9bI;K zh7f+VRTX1^n7&&Qhtk{^EM86qMSp9&_5*9&w-AVHVW71KCA5Sd!3Q7E1H&9ZGJQgc zK4|us5X&PG`e|!`f+ZBT&Q4$Goy*fZrg@V=2*?@w$c=QSqtRig_<4<9){h3GmZi;| z@(+{zC-|}Q*P;ssCR)|Qc7I)hzTf}FNEu`Q=c1O?R_x-N;EtJEMqW<#AwVQY!f1WB z|Io;qFOrfQP||8EZX~*+*n3qXl(oD4het-lo~z^AAOA&_zq??S$5f815A13_7gcX^DQM!M6V-Xx6*$wlZ|`Y^O?)udHK9< zy*~0XSxwuA1I9#}0-kgFOAF4X{}Hk8B_gAv?Czx>N!iI}*|8$EpzP>EW<4QuY2|pV z=z*BvR_+DeOVg!4@7$>R(~HZEqG$x?U3h{ep?L;2&vAB_|!sR{5HN zOe;(WNG@>2_x3pklH4UCpKlh>XsiBA*chl9{a*w-YQ41dtN>!HRqHv};j*wQa*&xC zxBjIY4^h?v`vO6cf}*xPIVVNR8SE;AmtGln@R?5zV>$s@N^QDW)eB=>`ZkFc*urK< z^!g&>q}t}XijC_?9EJ%m6-GyvwGYfMU{N}m=)1W22(49zEl?l`TcFnEnT(f`V9`d( zAiUP?;{k&d;35AAuI8aW;v|%W9uZd+ylHC zjr^#M&^rY5R-oWOD9o>TTO4fi&V`D1#%Z^Z4o%T5ms?x)rVyDmWaF$!m~8Yy_L;uZiA%fqPA7OromVl&1%sthWQbQt zVMzS?@U$wrh@jDpA0@izN+7mf7ymDwz82Y-Vf02pqG0On&NWlHeDr>zAJ>m&HRc{& z{6nBL*BT7D4S5JtPsV36godC{TK<>dzuw2p68!7WAyj<$$)&xS^vlyDGK%TSyaGmQ z8mbz?i0H#>RV`L!Z~reVn_e`lQ$<>EpO6~r(T`=-_?z$1{8*jZYCcb>Ig|h#1n;O( zC{TFNlCUE`3qD4CJ-jH{ZgW8MX4`ex0hR~;L2pL3`PET#R{w!*u-3PdfQsHq6iHf16LvfgJNScJ7uPWvW^x3oL0pS z7AiLg`onEllBh_`>&6?eXA1z*ENtesPf&s}Pbaa9U5~%UmCq%<{`!9k2lzJ@-RK>m z)$T_q09&DM_8QC`{c_1-nEQQI)w|dM$Et3myLz*J91r=-EMmFbni&LeGuhNHc8njfxFOtQFRSm1S?Y~ZaT~kQ2W6;d++aq)b>c+A zctMjam^98Of$>R9CWUiYrjGBw1-R9OAIfN`imrc+-BCYao`ls-= z$LMOB{28a1op9Ou(YbY^?=7O`nT(JdlVHdD;iXMAA14Cm)4IdGCWL&M^`_sF0U^f# z}e6z`&p9wtH{astSY< zg7uyh^sQP@b}-3>W{8uj_D2+CLL_n>B^9e|^CH*MU*C!@MyP>q9wdiLO zV~4ab@%YHNfwbnW?n4QQ)ab7?8inDZYsad?PkYVhMUCdO$5x(tp*YAbL>ZJiOO8Tm zMzn}xlse!9Ax7v9)sV!p z!GTgoWW1nai&22W022+7*O(?6S9VbmQoOQiF?y*8&=Z9f(>xDI4gvgwHWi^z1O{=J z#j}pObeGsDIuiB6bc1aiza3gE64o3Pg>B1k&oXm|Vh*oX!N31dQLdC;Wqz@JabD=hiGx z$!W2k7NA_602Q4N{czMLC0gQZxzxaUKEIP48mUk(&A5RoW<|yIv56f?(JPG0h_kkJ zmk^X9jBb)ny4#fiXIn&-cSrnbv0s9v42|@_9El1QVXD-y4o0zqn^2n76;)uO=mD2s zpkbL-!<@!1r%1z`#?N?Kjaf}Fw8UvF=cy3=VFHxIe3k{nj>isbM(0$wPi@tJ4R2gK z^1e+w)(6I!@nA-~y{pr>4_?>5*%6mT;g665xnC?(PFr>_T@3=oozm35aI_j6UF(~53{r}==OVf?J-!f`d{jr6dp&}=w+G(u*apxYj>mSA6xfi9TxH$K^ z+HNi~>?~3g!`>`WnG@X0D6w8aQDm@01u|6}cZzZFx%@h8vx!DdBRa_(txtGbqxBI% zavF{DNigRfiJ+WycCOLZ=e8@o7@@fKrE^g`O@yISysW?Jv86qc?>dyRN<=oRdd=`Q z$nesPnn;p+r0;M)m(RDY8hcr>KJKzXNJjKW!$o4Z^tzge%g0gnZHMHuUgI7~9+Dp( z>D%TbstY-iHposldQ(lLmv7rqGo8v7OLKlUxj?4t25BE0oP!Z}!d~4x-S``d8G$7e z#sp@m08?flZkQ}+P6mU|6H5R|b7giK&rdWrAiv~kt;=f(q67#navFa53U~ybj}iu! z%g=$OAiOv+haaSM8Jk`_kMQY-6tNTX&2aFW<}Nb+SR^QuVNQa$@ko)H2gYN}yGnWf z{}y95-eO|R%RDWNd5NH4%x~nA^zhdbaUqNmd>2HQ^Te=&tjKYbSM^_1up-sYRQ(T$ zqyEmM-=Vv(Xn^L6%>rr}ei58wQw{wUNMy#B7=y>r4U00N(02+Ae0RF>EbT*HS?zJb zB8A01G5keUr0jRv?9*5+(u5yxu0`H z7#D1iAB5<6q)XFVw9$1%Ml)Lqh?Gc;?B2yZ(rsGc59V%6TzO{X?q!mSNzQC-RVgA% zsY7qUH)MOph48z#@dcW;2(0u(2gTaJQn(O+L-vgKCYX!U04bUx@R_wMa=pAD_90hB zsSOaYOG8vtWK3f>%;t%MkK8PlvumS#%Q;|g;!;rXuOx^|UpMO_*UAS(=w6u=UM^=) z0@cedQlfxNwuc<^`3g8hWC0b;fsowXQ=VIRrf5~m?f&`%vPKx%C^65ArX6G8q zv-s_rk6p>4dC4qq5!$ij{^(UW)BCt9NoqdsmHd8kLpjl@rg|pRQ*0$0UtX(@cD-Nz zu@ZfM)2)2F5`Dj`PIWaZZB8b{|Edo5ZVl$ia~6*A*R<-j0;9kOY(4}M-p|WV+i95Q zUuEv+*%?~EPA{4PPq$1qOp}b8$18MM1pA$qi)X?yq}Kdv<#&C-%!OTgT`8gJ;i(d{ zDigqlAF}73E*li)D}9d@i@0eTZXi^d9~Y{D5B`%Hjk|fli?IJ2USR6?8$;DFnHB_uAsz$N3il29>9f3Ol(NJ3$hrb=^!pOk>Hq&?wsE8#pz7{@5NWCsbe zbf3j6EmX|XXa~t``eBrzDp*lOSF=M{O#e7ZzX)Yze~P~zkh3q)=IwnyA-MS*29E*+@-x3b25CE7tUMK=@i84>SU5lglaDXBgo0kt3af^ZAZ zI^Jo?fmRa#gTx2EB=A0g7K%Ce0ncVq&KFqR54|PseM;KP-+Q!`(pt9zANBn)zH7mQ zAiJ41S9*h>qeNR&Gld`xU$m7*wGzL4yEg? z|4i$9LM0U9l{foHTb7L{zxBt|p1Hi$#?Do5ElV%2k%^JBOIyFKyjjhSr)tA9d)e)j zmwVK^ku^g^u=zMuY>*mlkx|eBZkiW*Yz#&~*J<^8%gMH(nL?}EK1lYF--g7umemVSQsp)QoOa`28c4mo=VbrlvVcD_sO zCgnZtxmPhrGbKzSX3rKxH;y=@;ldZh{>gbVF{;FzAe5|Q>4vYn2`(vIS$@FKNa5=W zRbeSou!KY7alM;iHuSYNWmc2{foT`M(I`2kq$-wp?rs2nJnIm)wCY)$WULY4#F5QyR6&uIcltL3|L8+4bQTl92Lw7@o(nemSehNk8 zge(g8d^522RD!NoiKB}}92H#gqJ-(PB`|u|Jb8hHbm1)H1yzYDsA?vilrAghO3t}3 zV9Ithg%#I{I}+jKqH|%zq@z|di;P>oqnR_6jnxI3I(-@&n2xr3m57se`bDWI^+RR4 z7R@m5$3PS0Se(=1AIGvpxh}+t_p>C}cOeR%!NzGePfJ8FgP<{iL?V($o3?qj>Uv(eiGt+=5 z;iv-cy}WY@Jm8k0^)<77zF%mo`HuKf#$^)MzY=_jph71ky#(i*u`-B)#Q>#02v$T^ zDU&gusqhnihoLCqeNLud*{|NU2#q1{^VRo&dxInoxL@NT#Z!PnhQ%30v!=D}0lUDF z{wPz_>AiJ!45wsCzC{Rrz}-j=y7ja?o^d}TkJsGK@t{3L3zAA#aJ?KmDPup%Fp2_8 zioj!dX&Xwy)uaRIJRr@&kg0nM7mDGC)8E_{TI~)2b?1L6aBQHB+ziH*R5K&3W*|FqOakZ#kkdtuNZ33YWr3{{Eg3w< z%&(1#7E{S-i34lceaS62-XCiWqMznHSg9 zeBw$zO|cnPX98jx6!`(;4v+hZ;&DIem3%O{0qY`C(cOUXLJ_&_n;}YxUu_G36)OZ5 zwtTz=^IHEM3{Tk6C-J7klQN}HYeA5CR3DCFrAq(x`qI*#xLn8P5dF` zHferwJ`hez%ssC8FH2RuaA;L&2}9HD;e5O2L)wyQuZt$wPsiXzv7(!Gg&m3XWJM|Y zr6wBeiHMC*?p82}ZoeQfL1BxHB}W`&lBvlClnAF0E=BdahL#h=>vbxzL&C1!XabqL z^whK^Y47gt&pUcruZ=xMPt&es4NR{0jG=@f92B9co%=_-Qo?Bib6Xa>!)fWm)M%_s z0ajJ1d~%N(H#99he21N@4ky}AgD7(V7`vYK`N3B6hvNlEr^zG*?brMX0wh{&jhua` z>tZ!>yAv^vq&GN9=l~GN2va-&5Yf1Wk)Ht``$3HTSWf|`N5(ChWS1*R7KSFHGVoU? z0mpnGz%3Hu&|mH{8t>_oyVcWM^FKu^NaoA4zsXna@m0JtxPcxNOMK{7S2!=#zLnA( z(Lwm}*c!hrI~cbub7+BmRJ|sA%bWh@ByGiJX-D6ZHCk0VhK5?z?!bX%H|kqspGBza zZyBhq*r@_TwG}^CfqX3>);f_*{FweLnmuFUCho`me5VhUjTC6nfjq6snUC!n8^z>z zeW#C><(eO~fLygf)%pHUMn)zGteUYhqw$h`agA(7Q}wMm+hQ3PH^la!4y%R!xl#iD z?VHT=&hSji+OG&98StFxxj47p^F7U9p#i9|0B|70>|tK?qtQfDkS6Ptew+iM8(68x zlTu_{KQ4Z)`kMfG5)uLI4CpUwkWU_K&86sFvZN8$zEmL>%sR+2=V5u;!%PsSr9ae= zxgclhOG%%>nkKh1&w=nN%;A^=uk(o>a%va9qS#x;Q@li`DSzIqSe34!=FHfoM19)t zYt_t<)f*bHM;m*T`Jczka3}Bal+j{YKhig`xU?YL&jJLBX?8R|&Y_j`6xL}nt>Iy|X+0#nBUil;=? zUYoQTY=?Q*-_1HGeC24WkCxJpA(ArY|BI?pH2>SOdNZ>o#aB7ss!}C4>kLn~Lm$l( zh*Eb}jf|7jCGd&WB!1(GOX1tH$X|s9StDig5tVb?cQRjvL2!`7746Xhf;Cz1Qm!L# zpyD8(`fF?J@aM@K^z_bUO36}q1B|pUZwT1apAbhK?hFqaqE!{Qu>k%M@M=}N0%(&G zWC?7MWl{^=NE0@KJ4E>SE&KIGBIK(qfsacnyG^+i_3z_KC%_cf9wt_*Ezst9C9;l8 z_ye8NW=^Cjtra_bpI7@@ecl_G?&;y>t+`E}Y^`eC*@}AW!`0#CXKA;~bG25r^19MRC_*21h1y`I3w_>6xy{$LN>uIoljvRY zcKR2{q?wVvG)b^}x=aics}<@J7K~m?FEOMN#3rVc;8uw_ermsKVTZfa}MuG;09ehk)+$C?h3gZ>$r}e|K*Z+!HBuji+pP^}&$XatCR^WB36-1=l zG29g|ofJsJ7m>=`sa~UYvzb(7<7g2!}YaOQ|M*8IRw!upBupb=nkYsEi&pH}fSeuEh50e=pub65d`(1D!O9E<8s#a)_Uf z2CQM$IC5(|g<91^;*$&JRjTxVuGYa(>T9hBNOv0@zYY!~kt26ISBWwFT2-IXvJNH? zR<_pd1uTA3Ch$cZDXnc^3AdP_aV0B&Sbg)mrJR27pH{&^vBMX z3Lq8v1>Jxj$>f0;vpvx-Nfg~j#z+|<8CEr?ESvNWzYBH z@z{GM1QHzfWX93Q-v2jx#2kq0(P1{F;Ux*-(PtxqX#VCdOM2sLq56>&4jUezOR41} z=FPi(iYHlEw#X}_`TxIHTJXP2X2sbtP(;|mw+OAa#;U98nIk;<^egsoUJ@r0k29l( zFtBcu-s-JcdzdUs2KsVsTE%ci+V>zbwhGxI`W{Rmltsv2ea43er|>j~zVpGiBXTnU z9Fm*)3;*47JbA+t><^xZoCU5ND-6gD1k3`KWQ_miAT)f2S)W=jMTyc!=6}^?N{jLq zlfSp#8h)_R-1`0^j3n`Msf*CI(<8@mqxC&UgI-pfiz-swpr_2d5e^<1z)8+ z0rO^_0_I};3oT34_l#2Y=Wg}xiHHOR%0IM2GbOOR83N+S-QyXpRrMYRZ4kf-5VfiU z$t?kZWvp!T8Y&KR?8(_B(5vbE@iu5*G)K1kT_HO)?AG@y zbrn2kzQvPydUcd_tt3xC#|94N?1DF5TkXM#DP$@S?{GWCb8he#5Wh%({zy$IWP$?L z7%27v9|6Tmo|Qeds+}Bg((8Cpcd=>#FG1KcrJXw@+BtO&NQ8Tm>pt~Wb-3nGQgV|z z_alz66mt^5GJ?!KA)e}%pqvAoH9^hHx+)XI_lcc@4ua1jfqPLNYn6161ViAW)=85+ za2IRcGGN4J5-aN&F(T%xc*ZRw$Tqy1hv)LJSqcbHw5W$-J7&@VCGp~6i(d0D5*&&X zi3#&eA=v}387=xxvEvl)5O)zCPrQrjFWrs39Rvvp5VJgEj zooyRmBOPBI#<=#cm<;n3QFMBEW@?)%smQn{_Icye)Wc+@( zKtVr-Slx(RC7WtI0m&ErxUp}W0L7A_oA!li%(HCNixn?|efoR)4$l?Ff3r|1sr=sw zC|5Y&i#Z!C{76brjws~-JYFb29HO)#tP%TX8RG{j?Sv>&4*@*kEsgmUvfy&ju`VPe zpM)$TkMA)Lv8%r2x%+wW+T};)^P*YmnL1hgI`o*zOU2ks%Os7D_w0ps)jv4lqmN$r1;?*kk1V}@(p^)10Rlo^Q?V{vtkGxHLC zY%(5RULw6Z2m40?puB@DirFZ2Hn5Fkipl^uSrFAFkStj)qvFr7ZVfmBxz*UGs`I$9 z6hw=DKu@ag3PWWS6Rlu7gMfc?nz8~lDtJLD&B1WWwJswyvv}W$?u)Z6Z1_OnZ!~_% zdft7b^pI76ZvIup$7x48^dp?VK1#7zc<671Uv(QK4;6BTO*vF!0;NqahN20#-PY*e zoWiV-B%*r|nnw3BEAQkiH199-zCkJ7rplpgN#ju&05!kyy$X-98+$KQdp?j=44gsx4tf%_pj@@)Tlc^|jM2>$~n&mo9=OsuIZN=Rb z2hlDHKcm{C?<+D!wihPj!<|7RNn`o#m|^t0NzLIm1=y?^X(W-STVT&K#d=SdXEfR3 zPwZ{wZI=IzCK{!DdtZn2D+{UD;xc=!w&FL^4vN$Fh#QYuZS+wHLW=#Q_5`=pY88+1 zSsYX@<%#f)%f3b%gRjDt48qc1=*1LX;Fd;5=8$3y4Vftov~V~&A)Y%cpe9yn3`M_n zTZWje1Z2MVlU5*wKqtOK(4C3OWi!HI@;6iXXDHUkm(LKHVrvR&CWp z!p5m9=|^O|M1ufYRUJ*5om?*vHHOhb5DG-w$~e;TH2pXq(v2&u53iz4W`L1Yq^wqw zR;)!#2_ONaqmW({34~X>eUwn5?csPHzsRHbMFFT)p?sjnv%!ZszLq4NI4Pu zG>wK$kcGicl+3^|jfLNm^}7Vs=#xB+KVM{yPuP@=8PD=gp)eA(3(kUH=nI8RNg)V* zp=IOJ`RUEy6lch62INIxmDNXt^EWmWI*}Pd6)uPjqSZ+pNM!KTu(~Qa-H8lm1?-6VRDcG`r!jO$& zpr*RQ*L2Zx(in9GwoV5G%@lHR&A4#Wf8s~-Nn3-hl+Oq)qU+c%C;;3Q7556AVk9}# zN!VA2=WL*2>c3Skd0lO?z%|qZTE(L~_Y&C=#*S?kFj2&>0AISbz`WG4AP#)Vy!v6C zL_r4FYRhv74cZ;!Lr5yGQ$2=z|xa?fn$xQC@&H6Beq28tTH0mTzNNr39ANoaL^Ye&aH%NQp>sC{Lltl|)MB@hYoLrQ0PTN2wiPqDVX>+m^qSl}o59LUDp{kqWF7anAY2vQ0wMxm%K+`k zdSA;N?a7)i9dYH&PC#dgMAqAfj|6;Lpo%`0H}@2vBDk~< zzg}X4a&Js{?wRl`M|jX+b}1h+b}psgJC*gmzm5Li1i0`BB4bj4ulj0^9RP!BdyNVN z^3>G`}TW=$pg*mgui_#DDg0Ib)R^d`SB9A#+#SH`U=k?Z6zcxtr>mz^FX; z)+u8E{9(cvfP|NyLGLbxt{l+sXA5P!v);jRsJ3#Vf_Ew{m%*#Ht3eF>SjCRA=j_TO zw${FfN1)h@Oz0Fj%8ca1n!}3sH=L35-d{(q;+rf!X)Ge~3|GFOjJ{8eoQX7bnJ17e zDO~XMq$Qr@apS%FBL^^K&5dfSW&n=xM7#cF)^=^hG+xkVx^lkO#egA2jYqSb-laSL z$vEOVxr$8(7+K>xP4g{8dxt2`5@I|LXjQZA-;v-}NdWURJK;ML43Y!`NRap)3BKpA zc92Ftp#|@eL3)xA&`;!ksri2{p@{M39&n~Ri$EYC5ovDG=cnjL;^3hsQN;eOLFC0{N^Na_evnLhs31n(_=;aLNqjqkB8L%qWwXD&s~a^lF@ zB}=c=Yor2;q`{)w;z(LT?y)5^qZj9Ld5AcERM%l-=TwI$I`}XQK}KVXfFBStBrARb zU!;EtFa!5v87p>jKN1UBoFGm5UgA1+6}2=j_t?@c;cP8yM;xIJ&LSmpJ_xuzfa4Jr zh0cmu$ss5NjZ4vIiDMgmUW&dnO`nxsF*T#4p|Gzl!Eapu*Vi*Cnc6Xe;H=WF&_lDJ9a604rmPY(Fud=z|WktG+Mi zfSS>DGO6ZxQu1@_y`Qra;CyGK5s1-FNA7NIRW_x|)N0JyDx_frQXe(D#EwIlLGY&* z{8{1wMJvd|xFcLu7_`$21=h#_R2A7T_}Sy-Q^JKmap1Hl5d^y6S3I~5&E4YZD^p`f z&NkJV8v8Nn%w_qxTfAQgL_+umoakhq*N;nt9c~(8i>9j&4Da@`A7UCKpFM}^TfV(! zon6+s8yWM+322hOPyf=$F&FJGjSa96BK*Soxvz@bm;yCb2tC92F){3a_`c6*+a(E& z3YFeCrrzS#dI_5AeNp8!XDA0Z0kW^K%?6wpuO-pj1W(`4C`3{zqvRaVgjBu^gPUb{ z&M)%VO74uToJQ9llxs>{qBkKOpDQO^Mt~F*Y>k;6X0E=zmIRgYB6g($%|r@x>rEu; z&s!Ee^|jtxa@z3JH!i%;?c&|uF*}8RveU~379sED8a!DdD+ znJE3HP?sT_VYBChmGx=1<{!eeir(}(G{j22bSGzR&MiH`D*bO98EWxwE>bc%WXSuO zWMIpF;|C`tK%GAVTB`-X{0SMY;xC3aCcb21hrBy9-67{_ZQ<+`e~UxMBu829X1FUK z7PispgY9^t&exW-KEabvanRS65XR*u6rbfT=VWHH(kE9wb|$dRa~rFA8&g$Qb)IUu z(W(m1<{Xe!z0UrTtm>lSAhNYn-$=`taJB}H} z;~S{tWUe?u8E$x!+;6l1_F^{OgedVBhAIHcJRP%tsvODQrcWnudizHQgX{q+ls2}* zqb9RPtEy4(@bm^2p47tJv)(sijmY^rdhzR2Z$na|>=|Mo^y9S8{@xof;j#-|;&0&& z0)LC$`=j9{U%{4k@eR4&dxzdodADE#ViFjAU2lqR#KHHzcLeV(1n00sk?+9_ zn<9ksP@q>sOy$6JPr+qE@rEGLAo)oTpnxHLf7F%y#>{p!42 z3AwdpdvXrsHilhE;esSP9>}#P5vgf`IrPN7r!qD7sOL&w%k^4tA`wvK#EQB~$0d0K z@RZBkSzGPgs(cczV_$PURxTupT+R>o@PV%U-Ok@K{(iz=Y_7}GobLlGZ||!#<4y&a zxr#iplFL8{Ux0IGVZiN*2S1GPrW91`4{gm^;{Z8qWxt!)`P)@scVw*f{}_Y?g{V zt0EOylNuCR!-k5YC1a0RVg~_#{TcmKR)cH{R|)>;4KQOf0M2*yDsiDZZDQte9*(SU zr|=Nt2$P;v-W=HFO;&aM5xA%ZJx5^Tl(F7V;BTDJ3P>7zAp4e$iej+M66KU!lTZX+ zc<(kT0c2z3_1@yjiB37I0$`hyUIwuGPH`;sx~s<; znOhC~JhHr94FO@<+ney$ zs-|8Bz&yK$Y+d@U_>L7T3H&?^mZKfl2zw&HKM8Ltl4{u|xU}G2($p9BwXd^N&Fj&p zI#6znd7JyiQk{tTTa50UIj6gmkvyl2wS{gKOGPE`r@x$imQS#Ja++J8Dc~W}9h&9P z_hjwRR@76DT|bxW^C>#hb zuVtr$m7x*^pOc>)z)Dm0Xpy%dE*OspzcnM|cy`UBqil(Qv+a<0u&H)LZ{W!d4m!N} zC`FNLLY%-WuqVKZU-%0w`8vCR%JZwJL!O-f3JnlSFN9+0P1N!NwQN*eU976}tC(bW zVkqibd{Lx3Jqk_1PmMz&v=y9J;m#w6p6!PJ?Yi_vHfbqp?MTdib^|51eI_kik`kV4 zN1IgeQMe#otTkM~w|?;@k^N*hI~R)t=n}^Yy%$;GQWdigBD{ zOV`KA=oJcMKb4yWQm0(R&$u4Zne{x}73MnLbTehABUF0*i9$D2IRZOf@l-Tu*h~--UT4tu|)UVr%_t?}dM;%(@!m z?Wlaa;OI=UCzu7j#;`~Kb{?D(Itu$*QoOAC<++|dN!#gHgJ||_k-MmB;|p0_uGpW~ z(od1`8iA+8xdGd#jX;5etHv1BkTt?@iqX__{7LwS{0WbIgg=A7K1{h!DOJRTvWg7m zZv=6zJY~MmVj0w`CYbB!?4h?fy?rO>dt|liljsP4x||U|R9TojbX+ovHXc@T&W zW!RJy?-Kk}hl*Xfjau;cG-@5UD#bqC75n75XWH~4V`#diPw^DT7cerG%3B(r`TMbG z&q&F9_TpIPfhzNbenL~zhfPWM4hj{faeH2FqxWK~KoxyOEZWmo3VbP6U|g3}p(;d@NkG!tFSr1^;>!U0Gs=v>KX_qm2thS%k+8TJl}aqGTYp4YKe;6 zO3M`e%RQ?FWD@J|YwK^d`L`tKdr+L7p{7cT5*Zjy?xgp``Y-S9Jz zyp`nvwS3cKmQX=k`58rb5XqR!mchzp%NsP?*6z2(<)%S)Ss=tuqPC)joV+>088<}4 zUADkyxaog6O#l&bDW2SN>%xtg=XrIpQ=q8lRe_6NiO7}>$e%5d20}!r-L|wpiJWR$ zap&Cn{Z@BAN%6mBk59K`Z+WwLo6%OiNL%9S>Sy|#aVk#2oo514;V3Ol&E7R8Z{^?2ugskXc2=bparFt(nwul25?W9 ziSTBeN)?y3wytgM@@b`7mb7X@Bmu3;q7}3%NY(c^E+~~vVZP7TeZMCQVC`pl{Qmgy zAoITadhWUBo_o%@vSlv47TZZ(eX@^3)$mXC&h0N1^fEBRNj=)%dAu_(*lxKcXs{uJOjN`s1RCSSa zf1v>{aC|Z533m#_>V6I?6%dFeVJ#bBK%gVACGH^!bKP!|=O53Iz;8Evx!ibL@gaoD zXK&Dp#7&fFf0`=u!I&PNQJ*E+;`O+X^QS<&9Ev<@r;X?Yv+#17im2kfd~ z?%?LESQ^4L7 zJ>1?DUlT<8rbny?k5O=&s;4PbWPD8k4t=V!9AC-aH{ew7~xVokrH%oDkJ}BAY>9|23=fSRl0$-Q$pAn zdorda+5S<0X4T-5u(o<;vW3jV8ELwOA%DLH6iqj5-O;LJ+GLH`WHc`)M~VuX(DMg7 zP+76jF-;Zbx1Wv*^zmk0;i{7@0>_h1ruwDt>aRFEbO@>$_6yNBxpax-&<)Dlx{?j# zqd3Xo?P{PcGuOW_7u_N9LPdUu9&t7AwcpjZmAw?BZ#$JrQ-RY=S#eBVwr>F%x1FM| zP+|0PWk#d{5nVVL2~@7QrL8KSJbP6p-|SDTjqcdf zks1b*8+45-B@AGo2TPl*0d1I-(uP?~X*GlM(S}*5SzGy>r&1ltUjQ$C;o;WOFOjG| zkBS1)CmT#6SAEk;h(b&AW*~QOb5YWj`P&b%P&?Vxv}lgFoJw z7k__9`~xH1K57uHN3ELEv$eF}P`;8aE^^hX-_K`o;F?ISnq+E@)T#>*NJd+h5Oh6E zF{o94AOUxRa&v{UikBI+>JLH%JB4Mv4ke@!YtGNe+-fGEMk8l+`w}Vl#S;gI@1w!CX3OT zu7Yp!8DmfgNL2zn=tb{gTY4i^h_O)@k`2MmdDLitqwrUlS8;aXS@t`r*?#*)qraVl z-Hd8k!0LzeDl^W0!;@EoA$OU9RNWJk5S{uw7h3CDQZ{l*OpiGHRZVm;`%ah z5t(QFGZT8Z$c;{+L@``|S z-`+eZ!))|>JaG9YVuuZ1<$2=7t8wXwcNa6mOIX(<^=oJ|yYZ1~%4tKni{P;G(rb5x z#UPZU5-oEp`|(1+#I#5DC?h;zRS&bpSA8)qr;Qkgb8FShr>?AIj@Dv7<7lw!w1$S^8QjZTWnj`_3oY}2&sv*xm{E&YcO7ltVo9SyI?Z+~eX!Jz{f;sALY zRY=CLLaiJ4Ve}kp>Dj~V!U+04IgN~&XKC=FmwHN)nM;VaKV_&sY|B5ZL7I>~kzf5V zmu=P>J^4bj=yO4{`w-0>8Ey)zDz(+B>mlSjnFMS)=#_5Hmrm)ng4N1qdwFL6&3)EI zx$JG;Gc8WnTJuaxcVntfK+J+SQC9pLzwHZ#XJk7V9`m&`P;!T~bVH+DW zdBgo&eEyb+PX!7P?Hjhye#`%s9%_QvzlUHk&60fU)36h`Q@<mG6tamg$`e9Lc#eVMJx)x12#YX6MB|c8aKZ zMw!}Bf=dv%9f$!_9{THbMv0>PLwxO~N0zzX&VMxDp5w)X{kATk553<@c$X3m?@Rb_ zacRfHvFh2)S++BW2%p2H3Tg$CGGA9_7Aoja4(CU$3Ged~PEx}5dKFM_g=kici5%%! zx;y+}mhRAr7)A+ZV29v{KVNL9eoWuhNotKL7A!aWt$AkXxbOMG5rbAOv;{C^bv1F?xyj*P%ARHV>PBDWE6eM#&H7hFHFSEZMb$RLSZX$d&*Caoo2 zhuz5nDV*L?IfZ5nx2pp-GO3e7;(Wtsla!jXhbvHHY&~qJbH>*HZo=AWfUI%@Gzo^l za-KE;&NIt(?87b`0ExY3wjSr!(bBV7P{GfO(GO|Rs*3X$?M+EzUEC8O6C zhOd^KSWHMs#VbahHp1|WmDQJzQkTO@D8b)f15o8$v&VGEfP&p*B~T92nIho4%8|ub zYF>vUeFDMDZ=hl6)nr>fR!!`ME3J#X<>xBmk8+i@Mm#KUA9=guGAx1RJ>~5o?>xnR zMGIFTU+&AyUjCWf-Q=FJ{2#61moIN=bzijnNx8-6%Zyz9xZEMR&tCpBxeMezW%-Zg zW|DlFW0&6|w<*8(@@wT*)tRo#C&}F#H^ad})tr`O+(?SBK?&Uw7HAttPwz0o5FB(M z70!#9@L%H32ka)3M~T{C$rZPLKiN#1Vo==zc`@%7}`h5St~yG zKw~M6_Ozt(xb#e4U}$jiHuKolPpBoCZ^$_MW7w*ySc9!^>b5}rW?G=_90DJ1zaePp zn`m2MZ5~;raUfp!2K?f#a{dg?XSmfkQt+xO>%fgmULJs0E!0D$w6!};G-#$P4pJ9k z+LsJ&d0mo2l9vaQ*M?dS_SC4e?z0@0--HVsb*MeSo)oaFgY~;;aQykc1_ignIv4(` z!(3=Q41VYfZWtiiGBpSL22!|4cKO-?`5%nNuaUg@n$ftz9gW+~Xk@o}qwy6EGa4h? zMkC+e)~;VU6t`Rttk>(QbvH!wTcxbv>*C~qT4O|Q)&;ylI%pJq(_OL@*4c-?i!&AS z4Sd-e_L&r!B;2X3@*{QsRA&}Vm|(V^6fPp_-XkKdTWQxA8!y1Ra&EJZY;^K#whoE( zsd=#`)BxKOj)ea&LSUKi*0PU?C*0_SB35WKk@iN?D#wd8ks+ZP2p2!;^Zp`4nCaK( z^a^b=sg%QuKQK!kSvvhiD?}G|b700JqPS_+ss6XEc?$?_>)6~|fQ%t@=+RGe9r`OS zmfm2j3w6ny>)47AHFCEJk6z^7tMO{9wV>Fa9Tm)+>U=+!=2|z+DQ=oMSaLbqzs7&t7Z{+$Zx23`;ivKPg!4BU~?Bf1!gT&HVT;K6Z(n+P%ZkKGk=E|DB(F zV%Ad6T2XD`zxa*-U{;AbMb}acqY37B;w9sqqs&lPiJt%x=lF@T;xm|ZkOaEMJip`A z{4xjjMFOnnNk>16X-=8?Ten6y#Y*%eJXIF7KNUaBT6#ei{`;+2z501OO+bV{HEw5o zPiNkr!yDgSf~+tO*BY%gPb~7<-9ySrIsZ?%Vd#E{ae%vT^1*B0lW)cUNnpP>&9%Sv z%Z&MMcyC85d-5%7MEbbm*Dm&t@Euq7S{0vyx2(E*s39$!Kd{Ava+xWcLc{hUBlIpZ z>NT-52ew4dvX)-5H+AdY1+Ue-*HE*!CUzo$Cs|8x{R#yY!j|mj|T(F6|CoCuM2$tLXxXil@+-2|O zdLPQ%YZcUKC>cV+)Ec#pF%^To%=SxiYFyA&fZ6_0o~A@*PeqlKKg=ZaHF`YSU~vzi zv%>GKuU3m%0bojqix@XdXxx=%NlV{FX4Xw#oBHUa?%jIrcfGxf_9LsV~}% z^@2!e*RK`2VlZEY0$v6dc+NDZY^zxOLJa#>$d7D882ff z##-751}t#N`8t*8qVuWL-Font8V};UK_ToMGF3P_Sr!@iwl#mPf&d=9O!qc!HZl#^ z?{NYNJ;+R%%WGLLiR>G|K7S3kGlz6ZaA%jS|GIEImE~m#J-6ZlerpVZocyp(L zZ==F=M?yzWi9i40Ma`^fj2cxI@xN61B4*+~9Pf-Lx5>A}A3O9Q(~6?(>iF~h4TRa7 zGR;f;nNN_ppKMArg*Sqp+6XBRA-nKW=%}%i?AOhx0?e`v7qHhNZPFK4C?i?Hw}r3b zd;QTtD<-Qkd-I}KqRA5N&sq;jxbq{Xa-o$Pg*mBBDDPcux1^;g(SC+}+)Op`kM$fndNKZ=4(G&o0$sG(|==sj!cS)&jVZqI}g)q@^FLYU96pk9{^ zk@>2%!T!`O0DDqf^9!0x=!zIoPjyPqqQ)dbR-fCO8n)!sY$@LGA&4z?emSESwAaNO zC)Vugni`+AhT-R&JK_zyIPw%WQY6)!K7*eXH>;$)bSZ95wuV7t7-Ml==E%Nk69{vS z%(K9N!92@GPP0uOKRosAo&6fjLW}P{dd|_wP^y?Qdp1gu+!6({Tb{kvbRj(+n2Mu> zlNg3WW@Ke)Zw#=B9Q|S2+@rUwl(__pHD6kj%Qt>pDN{B}ulElakgCW_750mr3$C4a zq7v>A1Y7Yi?v&m46Nq%+0rYkB*a3%2v*cfC368X%?Mf)2P^!DqV)Ard>{r&ZruvDW zR-$5; zD=tN!l>HhhbN3JJ`zMO@xyqn+6H*-`f-UpqpbNX-; zoq2XDetEyW+4!y=Gf(9dxOv|>N5gH19+!%jUaH{InMJAOi=+4QUWB{I-j46?YRx}_ z((R3AMcQx2SNpAJ8sgiE8=buPwk~!c@?_`qE=Ki9e+EOlanBTny{`ULM$WnX5&F{2 z`M{j+2>br0sI<|Eq5?b?jf3 z!gBQK@&|5Q_sKnW^m7|>z)!2s%0{)2l(d#*bmfLd!lpt{rU;O|=@T`CY z@ZK!Djw|&2FuI72adoKL&5w0!!}pKkFqp8PbN!&z6itiAutW+x)=MlO14)#?3pBiOz|O?KWUy2|P8RaK>`{<0;< z6==exL6fLni%;ouRkgrdmY*J(s!UmTQ`Yz@=M{3Pn~B3I4Y{vT?x1$j2)A~*?yq=V z$-#zxSq61%k;ul_4;LkQ;Op|@ehq|O+BX^;xRH&Hw8^U?$wMEe%DVNjV^%~r0CR^^ zpz~kfh2m{k-tfdw0j9lnerF}(_0R11OS0>+0;U13(+)tvxf#5%DE2_+X!92z;a4LN6KH8#V*?hVZ&OZ=H1 zx`SK0RfD_2WQo1xT#3UqRy4x|S&3&T{684jft16*&L$TF8@;c?kO~C*V#b|LXu-gC zaW-9{B{%9(lygb1p*npPQ+^@!RFbd6gn<}I z6CqB|Rh88jyP5m0ecT+XDpa|1b4DF(#i{X+Bt9NoKzr@Yl$JZGl|0!A_^)iWhSS%y zY`>>ZBoXc&2@Az%rE(n!OX?fkyv60etxy^LSx`Rbb0`ExJVm4Gk0GG?NnB1DG+TT8 z2|FU$(*W-LVMWpj=ng)Ka(`>p{fa?ilABPq0SG!F=#Ycd)2p0eZyQKG$AeU{TV4DU zi^B0iws+y!5?BO@8fs2UVAqA&mo^J#JDbe0Cg%@tfLywvKXu*_GrH z%-)GoX9q-(tG~`qdFsr53oUM{i{=)Z=rFJO2U%!ErqNX<3kz-cKXQ%sdyN+F{y%8+ z+ILK&yL*j3aG^angM~Ib^2p;tL=7OK-I_dYeokbHK}6er3nCh^(r%pJU5O@S*J_4V z^mvtYA`7a^a5ciY0xvx9E{HbY8+jjqd_kK|L_XlauA0YEO zw#V?J#S$#z)LZT_h`!6wmx}LZM|uJeNZzV5!c9C6GpaZ>E67tRcQTT#{0v<`nJX!F z0GO-6W+Z44l8%JypU4}5=xX(1Qcs)_aBg7Vh6~8X6^1|gIHA?QH&LCP32qdst_8k@ zT>K&S%9>BSsdL+PK)gn6hmVW1qGUyJvI3P8sfHp4*$59NJp%W_3dstGbubT9|FuK= z+;)XPBtdnL_H`GBO1z1Jh^NPU2%ef}860cI`GHiy%D!?DHNX=~pzUa}( zd>Vn($I)WyG*fl<`XVD46iPG@obN^)(x+X-f|dneF1Rh2PN)|Z0nlBM+L%{8X1_Lu zX?`K-UKlW3KbBY;dMMH_xT+Yv(^2YU^f-qXE%Ddx5m9toQL29HMj$9#KIf87{htZ_ zkqg83mvqbA7T?c6!$aXr4LQ}igfnb8>;E*GmnhkLGxVlr|W`C|i?6l5;K-1=C$ z(?EB|$(CKnZi3kzOs^+J?H)lyG*r81E66_=IPrmV`4$Ea{r*y(B-=Ye|<( zk0pUj*Cm}Y`Aa%y@|NT+K=~Pn=mft^AYjIL0$sQsoma05z()WIY`62*v{*0oQF>W@ z3qKQQba6(z>1yV7_AQ(gh@OrvXY*5jG_y7QtuPQP@a8|$W&h@1uE!O*;phc>GTuh0Z-=E%&dGwT6*aUdd^XuLiawf z1ZdhKkPcU`W@cJpy-8ug>V^ZtdRA{dAk3;x9}w2Fde;GAq3VLy_OGL$`p^Ty!qrC~ z5Z1N&lmo)LR}VNKtZVg%1HwYp7akDSt@=9$gaxao9}reheeD5Z-Kyst5Z1YR-T`6V ztLJwJJA}y@#NUPdeUHC6{3ZDlTjVMJbXa|pKe(5^PQc`0{GG&~?u^Itr*phEn2!6) zSc6yFzlW^zUhPLUl#;yD6>N9yxh8w=SQ)nJ8j0AkvLuNU9u?x@_PS?Iz_IgfYs}}h z`@*=bdB;$f36(tiw)#sCTei;Lx$|9nLw%pR%(%u(_p6$eu(ZYAwe#J^4?F*G<+M^1 zt`oh^{b!|&q;LMBGi;P)i-*V$Gq~(4UePSum%8SwIZwvF{N8P)uyNpbT-9)Mp=3pR z{&4NI(hb(K4KU%BEjERi^zl{u;$Ie6cRfn`YMROyOfJh_kcP*~xb@4Xo{rSuT!bZh z=bPm1CuGNtf;@ROb8>6GR{0})ZR3Yn2N~RTX6L|JnNEvBE3(cJ=i5 zo?IM`#6pwj;;CMVo|ou;1;J?o?G zMv2NjO$Q?Qb(9G5@nu47J@D_q#66KSr()^eZtL&AyfUGmpH;}~KkI;rfHI5Ci zB6Aw!7l>qzaAqrq*cG>%3|3+&>CMH^b`0Z6+&jo$A)}Ag&6h|sfz(dXdiJwbl;7RC z)y-#aNd|s_-OZ~BFm^YO1oj4gVSi%955WbxFO>D4b15G}qs-oOiIZM!h)}L!WO}-s z+l2neEkXjAK1IXM#qg4|@}2Dvr(1+zTKcGwU2@BC#$j;0o0b9A5*uFIvjA zDeUoCJfUL*IxjFVp8hGN)5{7vQ(<2nschz?EGQ5g-sjX(hRXT{sW7&x(ZKBVn=NKE zoUO0q>dfF$y4~IA4LXC+E!1pUj_#|G9+94MzG`yHyh0`IfMMt+dr!I$r?Z$sJi*|* za5@Qoj1WLAj(#6IQ9f=LZ^5PN7P{31?Pk*%)oJ(88{yXm?X|RHKq^p?3fy7$vw4+( z7aNC$YM&P#Fqk4)7%>ej{j9XZ4IPr3R${%R)*AO+I6Xe-*wlCOVj0i!QbT;RzjW8Y zRm`XA#uU_Ozx|2yuFu4u8hk#gcVDQN$lEl#qx8(nxn{4zrDkuSa9TIo9i_yZZsWhq zjZ}q3%Bs`NtJSx2&7+kB4X1@-PQ#f0!IBQ4Zy|iQ&%l|(~RjlsId}c%Gb1K)_ApLEhw>LTa1}u zak*t?cnM$Whe=w;dF5}phNN+|Ye*Hb>3c}JNbn{4BvpAUXGe($Tk)~@t!1h`la?Kz zc0<$J9Q);UpK!-Q8;fJ#AGpnSthkKmf&2FP0l*X0%1|#OJY?_m@3ii26b3#-t>o45 zZl;wB5cx^`lrgcJoCpn^Xe7PP?by`&HD=qGOt+HFw1?v6tsz7eykZU8?M_LfrsPiq ztAgM1WlB^*6u_c_rWY9tQ^8xf+Kt5x#2dJByX*{n-AepP^I_lC$T^`L1BvK@h{wzQ@_(_4I#edlr482h3VTRDr~-bjnhZM>5yIhd@;J3h zqS%G)W39w=B9n}?AcmnDov!9a47jTMFD?=+8==L;tDWUMb`WW{ga5b~m{DePtwsC`n1|%6J2_yqXM*TgZMZ6)G^g zl7^*5mXe)YtVL)BS_>X0jgZ2FeA%NzY}r;Kz=+ViB4^2JO}QrYMO?y9ShR8 z;HOnN!Yl@Zx<$e!=;C`naUDE zS&DV*?LAhV?gGB+@uF^EInlxSY3nX^HdJ^APN2Qg`A)@2?>?CM^L<#b!o0&k$;& zn{l)aW!<0Iq!#KHc)`l_-*eQNsZ0E}t9l51sWU7RRN(^csT+QK^+staFAb1AdKr{~k(?Lx>k$+lcJmMOudH zHiP%af zV=Ul)!mJPcd}bMz;_VHkU(PIJ!UL(oxpq$^ye`GePslyb5K2moLngzd#BS4=!ax4% zF*(Hfa{syGS(v;^I^umfu)MOI9{Oz7A+mBaFGyPb-ZUXKx0LSvIEH%P#idw)wAV(q z4Sv`}#7cQAp)?zRx6gFsK5~Mxja$3czUcE!_0=}{d=L9-xB9+%$fs8p=jkR6@D0=q z{1}QHk72aTS166PmU4z#P2o?*=Ex5c3-K74wX`A+#2B`nc*9<6_$t&8>{YsGY%ERl zkU<;{xX=HZHBYQz$(Fxl4NFT2?-2Z0+>lV#Z&X7U3JE%AHL@V!@|vf8#^TZDE6!p1 zLoHRW*w1DS@_zxrPf+_J8}K9Xa!#_3^JxR+m{nR}3W=VL*!gvVApLv)^2R;}-6aDXM6bM`g99n%Cki*xZmH}S4fWV=fe`Fu5xDoWE> zEt)knj+xSVW&5?U*tC&uN00ZqT&ePMUH*<+XP-1;c8p2p80Yw0b*FgMZBYz{GGy+a z%9t>1Na1+%Uf$4)o3~?AclMNYYU+|eZKJV^GZC^`g3*o41#;d{0HoX6wej5|rr$Tj zSFpiY^Qhf|+t>JEuYyel>uT3*tEs86Lw%(uaE0^)HVyo2)=B>DGryxj7Y$wa=G+Sz z@FUR?xa~Qxq8YXaa4~E}ne%D?5zhA&q2avNgh%_+@GDdxjpilt(=o<%VKBb3(}auC zvp}`Z7qc|VbkH2Poxd9|YHf_0&slAJ?bk<%{W2RznDOiHENn7+2be$Xj~xz->f!Su z&g;Cv@ z*RwC|Ykc=;=*7wxGDpA&AlN7Bw89#pCwePiSnzgmAKKL@>sEymdb~3fC0*=@g>(BX zoODdh+!C{FVcY~`S7v5ohx9BrCXtO+>SnI)#BtaII)vJRte{ra$UvsZ znND%%IE+BFb9~n|v7X*QAz_;zml@I~FMx&_8Mn*_=!@w}_@A3=KiUjQ&NCHLK{@)z z?)tLTHxaoWzt#6n6TaQL?xLU-zO2aVd4AC9IjqPEUpa}u^9NYrVSTOejJa00{sA&u z;Xf_Vr}Xhih4P2594&X1>#ml&+_)bV4wg6UdY|yTC9aqCX=1klkyiN8)t=Yq#_saG zLUF{Z<0?vLe7r^a;C<5div1|B@E@^~nv!>s>+S1#A9lTyJn!|cceLlNalLarZED3$$2{OD)+<0v&oc9w{BYtmHyMwg!6q=Q^(af zB>Oa@YR9d0%A7>f5(?nWCG(EZG~AOT zqfItx?@cqp?>s4V8?T-5UXmz69*2S{d`j%t>DH=7zu9VsQmF~+p|Cs?cCs2WDzGi< zvwpM^w`ow7XR~mmZagPZ*aT{!p`-1QqPGVqMB3hNO%sCKt=q@;7pNPM?KzTT$zm5| zdyc(W;Ra-TPN-D4f!ChbMzMQ1O>qWbdp^5Z!`pLd!hG&~S|1W`(@gdJ(c{K@XT*SS z&--5WV%NH{&wH_(jrYEPd9hErvH$d98{AkinN{*4H`a)!(Ta!N*#2JZ^=@p$c<+qV zxUm;|u~lwtr58KZjg5M-ka!8cA64>A|Ab7b2Mt227Ff^V*~np>u^~PejnAIttXyu;>e%T#Rd*-xr^Jrt zHZLNfR)8(~4+DJN6uXEZUiWh$@3t|m@W!o`DS7+^XDeq;3eKG1tXZbLqE{@~lCNx; zL!D)WxLa=9PLVT(gVeUjT$jF;b*xabE9!O^m7~#77)jm`M!$E(E|`iU{8P)cyjfxa ztPF36f7xaBWvRuM!Z4S$>^xk znV|Se?2QIZ+So&xfriK^{m?z%)~$&iXDxfs)Wyx>`BV|hOpkx*cWHhn{+_?|wM^${ z0!$|aJyb~FOPnA4A$NSmpc0pp7zf?oQuUnlZPz~ zb*0uKiPY+KLN1DoZ^o5FVgNNSEBOLbAsQ2beyJB<^0 zY}jn6=($0@fK3^3M;a#u=lx>mWN*V|oU$ zzomzqMn`*QdK-&hxqw)g!JUD(k|riKm^p_ElINRN-9Y}fR_U5Ekfc={rc%)!d8TLL z-QKJ_46>?ljf?%^1n2R4&B(y`Ec3;>YJl{TBCeZ61m{^dE$;q^pHz~%>Q~1Th(j+F&a(X@`UJiqZgaL2z;$t!0mevl%eB@f< zPG(+PtreO)N5_a=X>#B(eDtit|0@)F8FMUS*5N=XJb9VW{_oY_Yq?M|pp+XI@c z`Q7+J>$q;2^~T)$ zAB7PBiYHfi8sJj1CO4(7J|gJf#`7PvYRF+-ms8Fu z29Og=PmfK8MKFTLoFk*OhMK(uvw+=lep82n@q*ExqC>%~ahL zKw{=r_&YEPa+S}Cd$rIzSSw!2Gn8^XCm?{t8wqRv1lpcicfeTXwWa8<6n`}HFQP^} zOTRS>^MrX{i1ng|PA&PJDKq!viLveym~(iivU_Wo5DaXeCv)6&Ym_v0Zf2dnnKSpR za?BBVUW($(9}kFw^{iacdy^I;;*k+!1NMY}Z)!VTP1^y>x`x!~Y&6E;c?WoDs@VBV zM_;oCLUcpqiqzFfUuL^|j>O1z&#`QKJtqW=!b@v0r(C%)YuGO45MbYDB zH)kk@>>xT87VKM7vpYQd$jo)FAsyM#39)%M4fUetOhB6*)7M3BFc+JRVVHVxQ=2HD zcJ~LkZaXgZV|Audxyj^kNg^2HAcX_$(X9~oHBG%--GxjW8}sQm2sTU%4+cDDvCdPwc=t(_3m{gyF;Q;%c-#mJUU zJpvqRc;{F*V^FAG!k|sY4368dOPL!PX#a@tE&NGF2Y#pT@BE!dI1*>R2L7V_jpR>; zfx7co#NRajj^j^d$o=pBl>gtwA1tone~>5F_V(p%p&a!u7p6Yu-0F||&l(BT49J_s z>rG9_YfG>e2t(o76QVqLJVqS7c#ofNzr5lJ^cn2eou3V0Ngnki9*AHo@muPIBtFfF z|1Kvvlf(sGoj9E8?WPuAfFvCynjTa3&W>Au6%ns?+>&F^N=mv|3wM@^r^fy|AqU=Cy8-1cjy{(J4Fw z{=)#(Wxi!P;q0Od6S9ZVN29d$z4-0H;G7GbM)uqZnG2Gg?Eb6mTUH0M!-H=6)ucy1 z^&ISJxizTpU*d+|cnq?tliA|98q!V3NmsCVx;arLb>B_B4yROGUCzIAgh|lu{$=;& z%HbgmkKe!IX-3F7^(=IH{)!9I;&8KJU!*B5-IkP2o5)Tpp&l$DS+ z0m7A=L1-;LQ&fL853ZWt`b{3HSv#v=4)G+j-8vp2&^KSGX9zv+eT7G?ebhesLzlfo;x0L&v#cTL@e6FNUl>Le9C6}kI61@# z<}!CyY5Ci-qXV&U@=Ryjuf5C6k8$MS&m25P1hO$-R#+f8B4BKPmL@OoNwColMdoyM zmXZNxbEcc~dt8vv*&Dvn96pZE`3XOUxqBZDHG;?6MPnGIuG_!jB$VgtTtjj4Y+=@D zxz7$n1{FtU9&Voa;BcK#pwGXZKr1fP)jX;@#LlSD;5;iK4nlHb(EfWV28lZ38SKX{ z1Xnibl6*mB{*4&(@=eiJEhzyw{omsFQmA8gQLHS!H$QfQcYfbNvA);?>EBTU@)6K( zg>`ONB7Hw$AizQ;p@QDjTqn^_jOg&njuj23wKNuN!EMzYi<1QN#!x+@w*LSglZ=@G z#Ez+#sLBf4qnb)IgIC@^Oz z&H+ms+^6kf#+=0QsdUrKD(@7?`6v)ccJVij8((F==+r+AY=J}oP5X*qH=T%qmx5+Q zK(FGa)U^QV>iOS0SL+T_6aTowEWn4mfF5g1U^`6u$4gD5y5O$PUzmX0+S6D1l(2S_ zgE$VXMVMW-uXfWs#@6S&a~c7xAL-G4=8Quo#QFW>-WvK14(AvAm}{(`;Q)0saetv6 zBnMDj?f%6r>QG#sikp%v?lMzA)8BIU6T9Lcl_X;!)=l!VfHD5cX<*>S*gmvhzv(GKRC5&4J5 z=m48!u>k8|cmxDG?&S`ynJHR^3t5H!=$TrH64kNAz6qLzH(|VEUuu?}S|eSuDi&Ty zr@U|s{y=`L5((Ezoia3;_OO6`ey~N9h%a+43%IbKe>ErL3E3DouD|Bg%;Zy2KsJ_1 zLn@iNHAc8qhE^sIck>9@`N16L(AhZAOtUfkcgt)SFx>h6gNbQB-|fb?nrpMk$xA{Y zrAj0)*6J1wW<-C?o`^y98|7e zuFmrsH}XtfB(=%^wNy3L-d(!Rn)jkw$uOk`_aLx>rVo%{VyZab-c-69RJ)$wlGK>| zuXetJs~i_bH%KzLO?JVYmrpXY)@k;znp+OZc8yNsv#)D(DxbYwqnA@fdA#u}RBZ|P zs%vWISE)eQ{yesZh!X!c%=c7q8yFj#KFw`U32RB##RvP>=IonbNWKUC96hRLVAs@n z+1MwUL)twncG6@->^ImOy^^d%nxm)2qr%>YPR%?$*8&Sl=7LJ>O_bi>exnL_4LciH z0C5l5TXl5|7Hu+DyBc0iAN?*PpJb(lDt*~uVh;ky0B>p35^{fpeH-v9)5C-V!RbH7 zFPwfOIGD6$2a)+7qo{LTng24}&QBj^t4^2Vlzg5VVPveOey(N*n}-+qoiC8@a^d3W znwtyt+Xqf(qAONVZk9r; zcvfy*>Xt#-oon%p5gRaDD(7f&2TE6Z@PtiefR4he1l9obBw+ty#J&dr9HSYu!NiS0 z?sKX%Jn)yGvqRTYqjwQ8m>MUM@M1Do2p^?p?@Haiiyg8OGyN1wngLdG!>fc_eOFr( zyDxea6)x-5?ho^|E@`wb?);<)xvg=!b$!EF?(S9=yg*4Msqw+odAlfg3_i~}8fQ77 zR$>Ibp>8!!4V}aQT&!F)6n+=a+_b|FfmEQ&Nz5@Un%Ps;`I=k0WV>34e+d>`?>@Zg zHt$}%n>{a&6>7x-c={>Vi-x>4PZ2EN+rNrE1os?dlYW5ZBY2hUyUvWmY6f*peJ30H zbmtrP+VoAtlCaP$qjmt4{tZdBK#td}0%mYgvS+z)G|Gdc?P^FLcY(Z)+qn@C8gEP| zIoIOM&M~CpRXA0=a~TdJVmA>7)&8!Kc zM)x!x)Xv)tXn2{GZt`dwriLx!g(=dVHNSJp`RJ0xv|HuXWcumTG30efvaQ+P5uIW_WblnE%HX}#XV?tWaqUb0Kaa| zxlaK2So0)v!0CCbJT86r=WFFwFmKvbn>_94y4No>Db*}@pKmq++UMQ#Mp^Pi&Qr0V z6Qij)D;U^o8SJ(^XGUTR&0}w4Xe+Qvk-8uln*lpA6LoE0toylaUlf=un34F?PjdrR zk4po^0ro#JBVkhxwlA8=)mBsVzJBXFn!uPCs9V4A5-#o9KX73q(zOK*z(PG=8>lb( zyD=Or8w8^gbS5WHsU=H z2?HLzJ@6d3dqkTojlEC0200SFtF~%x~OTfAeRW^+Qad zvEMm=eW11fxHMw00rs19Sz40GBdUc1)YUEL9?D^NUP~@nT1sFyC)+X-`hwg>j*E9A zp<@o%h@&ORGle`kH&&2W=f(kiy>sK~IF-$bC{7c33=X#&3B5s=3`9_cPY@V?zRbOp zy0J`at=;l@V2oKlnl^X&%r^msOm0UXharRQEy>>5SU4LCIV+Jt21(Woj&zCzpy{t# zh@1)5nI;_WXC22dWbDbS}OUZ1YMA1q0qrt$T5f-7*6(;25Ib!n^uDCbE( zkI34Ww-Wkhedpfy(z`GtLdjc$5F%z&dG2ja5Am4Hg?ai;dY605uh=~1*ZPhh>=V*; zUM}d%{NNm8Q28YD5}W0|MF`S~3?Wab2K%u!YibsZiF77MzB!s_&fpO@z27D-Oos>D zIvam^O}W-Q)=j-pW)|dG%wOo6cX>>LCDef zxe(HuuLmJLaWX1oc6^G}fbPB53}~1Ey%0NN?FZC-UWb!Hq`1Bu?6M#F*~}`*U0?~> z6h^9?(w_;x6uU+kI>5^a!Ap57#4P&!{{mvprtyN9)A)K2bF%sa#Pm^=I#{fLgF*}# zH)kKB5lRyPZf86KfNF0qTK)fT*^BOj9%8(sy=Y@^CcL6S?AjV$41Z*GdvzX-|vK6jkRKcI_!jY8bF*dP!dsn733pde02Z zX#sDB0oz?{SHplctXMH%#heW|nR{|YY{#YA?xu*24A{9j25fUhxE-hU5Xbxdg44OlMt2>zbb% z^wh>ebw(**KhEn06DWSmK(=~u*{Cgfd(i31*8oKq1+;NLKfl{s4WHt0jRP|O9r!vh-63oa9HN+75^k?gi!m8804gEkF*_zvf{@4ljCXbvD^T&#B5_oMS(SGO4 zda$_euS1AxtsUi(y~u7DwG7ZvSRB*B*iqt`7G)6t*ko^POb0X7IsUAoSyN%ff&7B# zbc}&DBqnX$FR9aGm0EQV;L%Cp7QV>?*`t>w(Vx{eH`KZG$6DY+UH&ZgEVcl^yKCRo zgDTe2)djDM3M|+iz07oMUVuLNU$&dX9sQIIFLR<(L;)UVI0UB?FxRZjpaSu+62V-^Qgyv5aQ3t^ZqEdX!kHqeM$j6mGPfyHt!JmhLyj z@RFEFWJ5=bP%?D%jMhXm-9+cMCz5(3c~*W*q?<=46?7z{_4cRp6HEI!)|@xrU=~V< zrn+|x&sCa$HoEu^Cctd$-p_vY@g+1NM@vB;7rQO`&*Ep+R(6G0+WLbL*O5N10f~qLY5sTg@m0v0#1Bp%zl_YIOCSFo zm*C)==;H^K!%X?(UXHJ!k7uElb;emc;{ zbBCH`)J7lwzyz2T)PdgVKpzi-U-7@EkH;W@D{7~buZPoy;1spfPf_a9DGE3!wZr-M z{}=S}4woVGzow7(Ep#Dd2VW0DKEvtJ$D0+a0ewqhklNosA3p$g*$@33j6N<{^dHj4 zVXv3}yA#zBG+q$Xi?0VU-PIo;CTn{T^A(PRL(G4NK34z#Tl8`EM+eZy?cj4NV>wi4 zyeEI>=^S_QlhnX>61NGAG$)VI{KBf`7mo2GWrmiv5^IUBa;~FOMhHTWEJ$_Ns(T%m zQ$YBPLd|PWTteb=4WmZ6*^Nm;YW8;db4PZ$oy|#ul8#cjGLEdPF2g=B^0mp4LC)_Y zxKyNMW@)x*A+lxzaEqlpHiXs168i(w_;S zX-QG6Fin_36RMnh7q~sE`xdo56-d{qAudlNfmzqA%Rp#x4O4rK;zKH*^Wt0C?12q) zt<}ItDuJDJvG;aVhxS!DjUNetp;OW$Rse-q0<;tI4d4HlAa98CkjhV)eX z0g{sCF0e#&jK?nt3vK?oc)6IYMYd=IA_ALT+q=Q~)ozZ^)E^t$q1=i^N=VROB{=i$ z(Kc`}-o;rS@8ZcjTx{|LUk{r+hSPa~AA^|h#bFw2B?d4}>GSznQApt~c~&w=`$~Ii z%;0OOqjB9kiCOEo9IE`Uo8@rv*DQxZZ#ld|4OPxmDmTmF3ZThd4zH?Td+Kt_A&(S- z-CkxnD0lniAU{B6I9PH!>lT>h&_m^FIq00|E{Df(bzBY$2{{nzyyYOK_kl3cVL>p{ zS`Cj=OnNUrD@+S6qy^ZHp#$nz-3c1gT4Hl+;aURz-CDQ~+3W*bW!8e;STo=XG>LfU zW`SQMbopfk^LDLaceSpDpmXe*h`XOFn3^nxMfW6FVR{{2hXQXvV+E%O6Imj$k2GStM^QlX@F9C40Felprh*xLAol3j`f5 zvyCu$13qJlUcmPk5?47-#a&R;b&TC)z*cl~yeSYLBm?|1vE*wRZctjwa3e27oa8;S z`*eKGGfiQTp!9=n=3uaI<<%PdmRw&kAOYLKcs%kcv8|c>MNZ}+TE3KAiH7Ls$x|3u zwdxEY2{{j|4qj46ItZkMSyFT z|9&?r@u|Ae!7P7M&MbeEyVPW&-P&CS~z}>~!su1L* zVL{H%N8M&iC)YrIv8(<;XQKn{_j$Xs_2matBWkE0Jh;Sv2WO?voM#_17(FM^@|>T| zENkzIt;uOHtmp#DsXvii)%|ff|HWC8Jpt&bRK%%@h$>=nYebug_%O(vl#(HK5#Fh1 zngAo1vGroPg>eC7Z5G97_g3^ZM$`k`e`*rVJoAmntUKT@W7E1lD>LTXdFrbELF#5s z4c0b++Hi#A3k?o`HYG@Ik6{JBwI7K9NV>{xQo#BaUaY&kY|J?rc5$?~v%bc|;&0** zOnfdN)@?UBIMh&18+~e!{l-Km_N*Bf=A|zT20g!4&Oowe;Wp6lqG*vbFIQd?hs+ov zPECoXgsVH2suGWDEfGYd3qKMT*Z+W*wP=HGco?x6e&?1K+={O@c7IAht$n43!Zl{Z zc{t(5aXU}L%DGGI>yMpQ_ole$5HFtg_-?x4ym!0DB6$~wcj@>65k}UG3SBGK@OnIj z!HI}xSsc*g&xa;*u^t-l+(WOV34VpW%DJCHT#D-yDeb7G~Uehs|O)Z3XyktBP{ZzjqkbI|YRT1!VgDeQ-% zJ)J{H#weIaPP(fVAEVW_?>3LZ{}KnP?uVJKV)F4l{GQ3j%{XhH7lgP($8PsdWY+0| zSLYVAZ#&?|@0jpb5QCo8{=IGa^%V^3C!jT^M30VM56Fmx=|iySh3R<8+NczK#a)Qv zTcRXg?SbnKy=qu(9R$3U9W1rLPO1klSf9xE{j40eSpr@D*&G6a3UNNwI(*O2+OHrDj}#sBZ8ry3jLH~wsF38D_-BB6o7l@uy?W=Gf zI}Dn$bBK&)xl)M6+(dJj!no@bz5?Gw=XR4l*4bI9YMqz)MP~YB=PBcTj^E7D&gFc( zGs~qoow59w6WO2Jl8d*h~S_=Bz8@FS0Gvf zc{hfJi<$^H56zVRQ*2OXT&w)8Fd9NB!PvR1(}rNaB?TPU)}2Kd zFx=z(076V-V$~hRewE(3kC$E=YM*bQv1U!Rn?TABP-^Qf%mmcbv`i#l$)_XoCf_4} z6Ir^eQ_SBK|42kzCwBZ!el>rEqQF&w>cB>Jq>FZH%0nHmcm6ic`ReBOI;<`|qjN;x zq;H4M-%Onenc&yEm%KNKwaYn28Zmz?_BhY7|7ObCx;uT5s{!yU!sGk8+B;*G!Aj3b zbtTgodE$Nzt}=v4XY?AJp9I-uVdTF>8gwMsPC`~#)&XM^qpk4x;3%);@M!d3br~S=Ow4` z1ot8A-0_=vME=D1&2ZWaolkFMDP{`Wm*>1mn70J~j*~(Mfly=1Jo+bxFrQX3*GBFi zaXOF7@1fgY;0C3HG$Q+~c`KOycutbOh^eXXLu;!CXp*LA;0!%sh=P~L>_6pIfL&0R zRmlPbhix6V4ZO_9M#ZSt|a_*??Da}zpaq132OP(RKMU>tjEeCsy*9}_X}GH$#x zQRnFAL*tW|hqB|t)XUHuXU3wdvlWb=osIo0XA`dE*q|rUz7AjR01Es8pUDFBn<1H^ zUESNHXs^qg5Eyi7q0qehrB9HqznhE(cin}f^_gfk2QI1+0s`V9$pJg^{ZY6CMac=p z_GSp6zws&om{gY<`sN6ru=l==*$vRPKr)8bBhgVOf;o8@r&O-G>~#f=(Z0Mu;oI^> zXLg7Z)Ew!ql1bq)Ia1F!yh;t}NAT8WhYYiPv(H=+fBVScST5gUe}+w;t5#MJTG~?m z@Ev{~Vx2d+eKUo`rl^3t>enbB^S#>a2M}qqPhYX&f-A$h-1%3nbO!UFZT2%^5-9g-Gi3Ur;Zn8`Q?Sv`F8C{6;B)R*et1v7JfYH)Ht)irgQ zpVuRM+i&os-?q$^ZL2}@aJ>Ilv-_Pn-3D&ADmReemCVqZ-5b9`%6U=`q`*VY}gg-sy}ecZn}G(m%hm#xHm8I;9D0?TfzaydCq>zlkHW zp7D0?ugz)Aewi{)Mz@EuaGm8n9rO;vkI)nXQ?YA-Lk8Kdr61{^5bmCi9+<1s(OQaR zvsmNYh{HV<)tVqH@fb-vo{IE>m`*|zY#0#cR8&PdTnweirALGA=FuQYG3nlu-<&Er z4Onm#!RN5`+zxXCCkk9#ky^MAzYBRs&*+uNf0+hEc{$V^IYkk>T}kON@5d-KKEP-5 zMs8hCqL8Fd%?VN)B^&Dk8ha_6KS;uD*#g%fGCS9tf9=bRD#{ihuDpIj18qlt+rv?MnO23gS91KS8#7;V^KmZfYi+MWKGk%o?4 zD0KWSs;_=hi|1tyfCe4sn0_JWciZ=6osn!=9ZquJ?<+*@98F}$En4`koNYM(_A2@( zW%4bCme#j~kB)Hx!*evk(4rQJ2|YP#m^oYFH?IjX+P&cUsfqP6!xKomQ$S{z zxBu>8!2oyJhA|aLRfLmc!+=?3WAsM!GwaqMHg6>+2q1l#tK21aMob`fjj1VipVJ$M z3t~r`AS+Q$@{S;O(Dwj8jvB_piR3aozV9#)XQ zVkNIzt!5HiCzt6Ca|kZfBpbe~VK=jI1SBPd_NQTHs`I#ZbEmq9sXmISK0F770q1zY zRXUQgtFSU4>Z15yoLM7g%o9C&Dh(5^s zRFKmf*&>4;9?Z$t82f;FqpZxC!T3-)gf3z8;TJI;93HCoL6*JAhLoS{ha}B z4j2z1IvzGTq2U9up7tp`V4%H~!3e}o$(%jIf5~{KhOq`N&OoXa03I!7!2pTf($h*I}`?PJ#7gcb^zXqIV|J{Bi^K4-?+s`wE9BT^U3~p1r9`0@V*1Q$|5qiXze_!}iIZZqIGSpX0f?&U_*@);RkPvZpT}_c9 zKSR;(_E}i4%$*!|YWJhL(Sfzo3{_teJryttr|vX$Ya~Cv-i5o|NFK}CJ>jt?dUnbD zS;_6)N?A>(fY8jNxv~DM8S4qo$!?FNs1`!73E=3Hz6s>*jHO*PJ!B6Jv}h7(q?MSe zn2&zw!B`qc`T~O5LsL8X0qi4oV+voU#jny4aC%5>`Td8vRx8vW>t$NK5jUKM{PYt+ zl0uE95)p-wxj#TwJsFCCV_eHkW}-5^+lXFLFngRQ$>_OLi%lkH9H2&z6&>Hl4WVv@ z0Vnv5V)`WbRFC0@s_x`d#rFXWLR2~5b!*8*E><8gF`&vB<;KMKaYb=ErP+TqrP~jh zLfs7PP%6q4>GXCp>}=9py4tZo52~8R&}YdptF6TE7~LIBVb_ry6-?e9HfGA`#qUW6 z&>$?`uD?%5o~EqQzsL9Sn$Yo_o~&i3$?(_?_c0+ErRuB7md!L)%i0C^bc2oMvUb6H zOc^utv09cZN7l38TUQcyb!JK?n_aXldYCh! z+S{kc;?RjG9V3C^HGvlbK$Udg`h%|wZl~1piO%LW!xNly z{*+51Q)Xc>R}tG+UjwG>KrjEmlV^PqhYGbnpXi)-wY%goqQ<(>lB1#h$vR-Xv&1yd zN^o&yaLn0!odvm4>Tnnal2zB2h;%=GS_dz|Oq=n$3}b`eFn;HGxu!4D@k^J3`{(&! z|1nR$OX+6V+rSC_T!-<0#pMZW{4M6M-T1GX?v4M;IL!Ee!9x0m@t^v5Zg9VL{GWL; zm*k-1KbG2zJn^@25ov)H}q!_w}lk<@8IdV*%VUJuOY3=k?hm%p7ViQ;Q%%*U6O{_lH_(e(*kH7?Ro42mji$`e>FQC zcQ94>*r)y>2s%)$R;tIjYZzG-aAwegiRPMst_SS__M|}Oq9pHKnT6eAzi9pbm0%-6 z%8(w`<6puP#tdRZ!7fzPFAdnT)!3I3%3n^UmMS)P?tbul^oEnyV!qzF`!1a6A1e`jetOa0OezOYElT9d zwj5J%Iv4R{dUYWVvTE!#-l961e_+7OYp*|cNGsK$F$B5!GW}?$2K)OX{29*&t?=#_DD_$ zI7d3b#>ial!*PfY5V)N4_lobSV4Y5?AHd~=;h7MXYl>-*Igb|CtxpYu;(d#xt|fT; zbLhet5N{58yslJNPaIHIXm5d%FLI`R--R&FZZRF910aW>^G~WzcHgKrH=C{%bF{73 z5y2V0#dOVgLTlHQY~loZ_9l>)nCihrEe^wN9mADvAaCXfx*GgD@0N8Ekn*KUM)aUSyitz!VcB1Qaie}%7RWzhGx3CVuErpF6F0^{a}SL-uT7N=;8Mwb#Us6isu%V9cp%~!_C{78*xOoq^&o$$a!_8fI1+zv zNc{aiHG4MCj11fu<&le`iul$cjql|byj8Pj+sto~gz#C`(*H-@+s8*$T?_v+$p8}= zJprR8GL=~8YEsfRsZlc$O9%;|1&zpCTeR&h%@dVYO=bWq=!7$o9EPdfYFqo<_NlkE z_u5{2tF7hD7cxOffC>RB1W?{om|+A1RPqLy=ezbfGn1h0z4v#2zdwF_$eeTb>)LCt zz4qE`uf4WSKRhx1U8z5EYPCfq5=1vv1UXFoD;pw*g|Y)`a_)L~I5D5b&`PR1rBgChOy@H>HZk3pU$m z8@EZKC+6Z+{1*`}i@VQB zOxbv2v)`pB5Yw*XJN%G+!+Z=#3R}ZfWp+x%6$_zg{{uGtm8 z#c!VS!`FTE4;fnE=X_4FcQ)*cJ;j^y7tlgE*@{mUCov+J(4KBB>?-UbvY1_PXNNz} zds=&3y6XDk817Op;7h!86*x63H?_{VW2$P)ociw*~J3gI}}VW*+w zxKDzod&< z(Ui*YH1=p9PC2a?e&`qLe?w2|16S3L4nMSU{TB6+r>zJPYj4+kH0_BGA>i1fe5X5L zb-45@2)QWiyTR@q@ZGMhskgHQr5~F}XoY@wT%h-G{gkl#s!S4j`+aw4Yp$vkvOYFE z>!55l&5(3q*HxK7=VWGNEX)c zM@b$z>`Eu|NV1z%vMu`I5u}V99+R~>YkT8>BH%79n6C|PP_q0uJGNoRRd{PC^7gQ8 z$!F}`rHq9wbekO>Scg|`A!y-I7uDd)3QVMq ze*qv-O9!_i_^+(Svsyc?Y(`&58z|(DvS9d|C~+&4+)Wu$h5lxS-k-tHP)!jW@eVW8 zabUZ=j6{KDHmdxBRJmyY1GG-9=>{k%_5;^oS`qw}91yU(e2l7l?BVJRy4l#FA6JA> ziVv%xhvKz0#T5*R$a}-H&Z_>uhCpa2UlPm&aFeOWZj&}RJdxwWv-$-y!DIBk@B!H$ z)O*?1`vobmgTa=Vkj4x5(lczT$@?;!=k6Mhd2f$c%8U#wbF^ryWIM6(!nakrFiUVr zS1IWNd<;r=0wgqEs8i{tp<0r3Gr3VAIDwBr=~`8~@2Ye^x6)0YMY`2P({Zwx^6FK( zGgi8(lI{a5-Ee_#>7vF9i&dHkBB0bcU0{2e52@2kGqdr+qona=DVSW89B91oxWLr(BJr`~{G{spN5W&*QeVj~*g%H#`s|FbKa+9GHAUrzwdGfXZ@5st z_n;QM6FELP^p6hD+F#DdpHA2W83n;jDt0)Nd29o(MpwzX6oKf6SPjw`p^?aOmqiVo zc(sY0Bu1PcHyuSUn1ue1b`xe_xwf{NI%j0u=$TB*PkU;!B9z0uWgwv`8|oRHWw~mm zxPFR#gP&A0H)G8(n4<(+C_`(?VZT3kKn4&PQ$vSLHr{jmm(g9?@(X}uBJwP6+?=Jq zi9L`xe$Ms-{2c@f7u+dBHaLU!r0T5w@FFf|4%ug=AdHTrQfs_|VRO8ijG>tnUokG2 zwS=XXD55@+LNDmlkBo>M8I!dwYZEO{L+U9~STrKtH$x3tyd=Q5)p!*?ph!ImX?dLQ@< z3w>?kC!KsX))|%Bn)^taVH^~Z@F-+eUnV5uyV)Wp5K(5FMIg&u=qW4js=rCaGIb80 z!maiQhto?=s(cOYT#pvNN+5@4D@|J}SHsrGQCHRpHi6_;@q7UCO)z>2+l_tpPQ4F? zD(Ac71;~C!MfOvacyvtG+gWc~vY*PTHGPR>p>j{i?LlF|U_yEVK4)RS_H@JyBKFn&T;BH*?Ib820Xo_TEJK`dulC8sn}h_=sm-=BW^lBUNE(o<`Lo2{{GwQZ2v!6P1s(DwpC0SAOF^4z9fLqL%+3sr=UXqExT6 z!??^}I}KF8r1b+A_F<{z&+z@YyP= z9Xg*wg*HPNExjSUuZR?SOTYf+u;ese#PP4#ioql4YkUmtk2}aE^NRF|faIH)ZorpP z4fq@l@Pm;e)+>r*ss**=YrL>tHKa)z^333d{Q4px!4gblP5S8#G0zsM#yqJASD;mM zp2H*P*H$UD2Uckm6ivV2$I!U zl4%$n(3`{bP5mb2x1M4C&FAV(MKpI^G*N0zGU4D)MO0DfsIhsU#wwp1W50Zoe0MP0 zl`>T%SDg9}IHe~mV{=vc(ns{-O9UauvMOf2VO1QFi3DB4PYI7bNs7=UccR{r_)`2b zYN=xpy#Qz`2+K*-XD1#u4P@rWhlwd{jWU#Hn>rV>m~6I6a-buJ=zxGq&h|N?N4|mJ zWckPY5hm5zs6QYMZH?m7n0HBnDZYzyw&sU$0_@-7sc#|9=!fdNWS3;jR~gNB(P^6b zqFYoF%Pc_uu(Wx)ClkON046@?#LmL~Vy3cNmNkM{h2uYu9 z9l^~Zzk5TAnK}2NKUPYnVksngmZc$j$>;-}L+tI=w?G=vf4y2o0+VUKUw~Ei?T%1} zv9~*d{4~y26|QlFi{272*aZJVa(B3Pb>>xao7bB?{&V`{xJUQM+8m=;*r>L61Q#Hn zL3h{>G`Nfp;y1AtC5`_bjP;v;M;hY;RJr-l^|xDlN3Fb|w!S=hb59LbTlaI79AHO6 zT)|{t$sZn=kz@`d$B9`a!W!#y5Vs*pTLdFulcb#UFi&mB?kt^N6WwtqfQg;A|H@D` z+Zx&Eou|n521bwtia?@n%7O?wDM{VQ`~p)xS+LFA<;oz2{*t~jj{avoWqU{2^f_;k zhW@8LwS7=e-Nqs>r9qbdfVy)~nY%-|p~;R=gIo%G+S}W3gMFa>LAexmyHD-cU zgX@W*@zMKkLy@ig^XR-0Sk8qE4U&;tc;)Vd+;Gm9?On#*PA>h7J~dCY-5drp+g~J^ z#a8V`mDm4iqefrUS-hef{~{cA&M)5q9lcCYwxjzXJiphE0FU3we$cN}0Q2v>dH=55m|IjEvFZzUjl-&F9zvEk`_$lbEaSJ)B);gBx6 zKbzgKrYa(1zvL%9n3cW7tu}@egG!ocYq-wn44@Z`4i9V#c*eO}nu%zh?-^zuRG!Qv z6Jr<6W^9wzyZ*LwKV#o3!Y#=@{G$4xZFQo$u*2KgFq2uq$(47&X@6H+PA70Z$xYl$ zGFgsyHj94OXp0(CXx};C=TmL_83EEZc*o~s+ewtJV>KX#i>``)M(rVfE0s_S{wwLI zE>{S~-U=1n&A4`Q3GVXQYCs60j1%6|##>s`T8KV=vnt|hs|XX1IG`eXvpbvom1f$I zq#ebk9k_)aF=&&~%Q+jTvBY82IODQmnuD5@W7VX*WZZmQ`OqRa;Llg8wp{D;M0I<7pN66Lm%u)Cv%re~I z2)kdCN=r^A{XMsLUuTaRZ|iT{jNx3`hhXcEbGCCVN+P*2T~A!Etq^a-#==(|Q{$sb z67dmMlriC4tJ62ns_rbMQe8#(0Y|vhtYZuNC+pM=#aMVyFVkUu5Q5+foMwcZP?Ih#yFy7WP)DIm3g9$CG?K`j(^X;e-fT3JjWtUEZKVD}o%V2i>TWZr0zlKSp1i2C@Z=5$9{9fmc( z0WnaAaaa!7F^!1jZm#o#Pc`kA{l2t8zbU!oZpbwg=ZKX*nMDe=MaRH~WPU0#+9|Xc zY9K1-Ls}r^OA?+ky~%XMkpaG(>X<+)-%0`^BwK~Z`9)YR-vz4ZwQvKgB`JH@#t*wF z3cFKobuJ8gI^=_Ai}e)UqU(M_4TQk)hP#?O#*hFl)5Eg7`iBJ%}B7VEtQ8uJ0E*zfIL@FfRD zmb7G+-=O`FUyo6azq!$SIU_O2OH=$}b1t?yVh=8NCFIKfrfftJ&c2}2-l6v}=znAa zoDY+9haJtv(ig>2sUX%T>Z(DxvG6%gP!c~qs#F+jxGFQ@ZPhB}Rs|<55mGM?m%l{g zTzI6$I!-Jb_?PC^g0CD8K!Pu2KOkMajpJT&zN5_nR>NPhha9VsY4(C&*|e42BudOi zr6$)BIGn2Aa#Q==Bq`SW!OzozMey0}87W-@eo8gLkIXownz4EG9xmOR>}9Fq-^NWJ zBsFcA&>NmJ+O^=dDFl_FfD{A;q(o#)8cfCO3}3T}pk6@`)XRKQQTHr~FZCbJQR8ZLBbwY@z&DCHHNT)P?Msb$<{!G3JyGYgc7SNUbre{6eiU zy*z;@{KbFL`@j8IA@WQlnsHwX*B03#(a{gIFDTrmt=(p9N@pUy-ZlUhE7&4`d`w_d zakIPp&UhZW;{I14^?_d^*kxx`iT-$O6F?eRP}PG&!AG@~4aS4>CK>H!DM5h7w2HUQsKq9?VU( zs{Kr6y@+R?a}kG6IE;*>{HBu(S#g-?E7vbL8@^nUFt)~!Ic@No(50_@o;NFx|IZfX z>yJ6vFchmbu)TkFtb(_aMC@IX)@l!4-ttSi8{xsvbnrAzgdcI#Y9F=mw?#kNW4xW* zFaJiOR{P$2+*&!nGtTout@e)}T4CpTo+T`ku)o%73qP*a4xF*#GHSI&XKS^-%~n2p zI^Q_GO%`=T^b<%S3n}zK9~t=W+u=8AwSjhN4VN@TxTIk~Zfj`&KtjD-91Wm zr}!m%pfA&x!KI#W23cAP(aIIa>WE;Hdn?VaU{KBsh`<}&3?lV6@M*!hmJuQxxZ<2{ za}!sj{;ZR*rgze|DUM=_-8`k(KBSPwbRqs%R^CzkqCLf(@ubls{67+k6}kN zs2L(#Tg|{ELm1E}+u#z#WuC-+FE_Nv%?z@U57=>#%+xnwDSICJFL*`5oSm3sRd_u1 z0c?uY$XhO>XX?(60G7F;?G?$LX33Mi{S8-r3cP=`$DR{D$3zV`{WQ1)`C8NCl1M?e zQ3_r?bwatPA%{+IreTT4zDlZ+1F@MrQX|oP;e2>wpA10XCrUozxY-z5Af`s%_j8txBhQWWUj472VybZR|m7xd)YLvi!biJ6}eh zlu4M>5?wi*s7djZ!kx2 z6`pzCcT9V##nv*=Ue>13=rX%b4@{Bl#Fu%?teYr=C4>bpJq9-CngbFHz!LzB2? zQ46jlOA4Ud1)!IomRc%luQir5{VJ(ui|-z5$y2iB@3)uLI_>pMrQ96V&@&@cL#0zI zkB6c@&fJ`osi2IN7D@`W(N4nPERioe zq%6JVy!VXn1Mivo*`W2yB`vC5rhE{3IVezd@5y{Q_&!-=(Cm>xV}8oGiD+wf`}fM8 z{=L-y2d81Ok+@6NgVgu$XhC~HkTl-gu2n`9X-$p;t>)>Q_qz z%`ewO(L%4T$`$zbX1=;A317FsXMRpH;X7Ne;Cp=-(%M!BT`R@L zN3g#0{l;hqrP7-;q_SNN!OcBjXJ!6$T67n%WyquaJ6lw@c&ktNfJl`|Qnjij|qSEsN zrLCl#_~gs5)RB$1pTvdGB6x&m5Q`rq=Z_v^ufEr2sQE+qsW45T!~+!vZv`6F z*T_OYrd;Dya}ps>PoYH)nm$WvWO9fJai|*AXfBZ&g~cm;{=NF7E^!1%UFL-KIkPUw z%w+2tGDn;vp={>K{&Q-cu;#o$_)gYmsdrQDldLUdr7m;Mka5f8sOF5=Z;7$^9XKe# z$SKv#<+7HE)sb4YXYjS=c?aPQ%L3z#V%3|@24bSKvF*A@mk-tj7ODV(0FXPG(I6&Y`nz(MS$>Z zz*Zk$e^L4iHP7>QE-6oBGYt_6Es4)-*Oca2Wp=$S!{{;2q*P4p=!;Pg9gZaxOgl|| z(t`xBzYsCMzGZ${3hleq*ZL?~qbsPuQf^bsPm{&0w;iM0(b48qK&M&J;#5G5WS?ec zuaoz3^F1K%vg)STXXM>uzP~8%x#oK|rK3w99W6)}$C42JGu|Ne4=X};PTkCH(I)FN~Ab zSAZDSU!tq!rLAf;j2QvS+gE=glx^(8K-buAxIFegXyW_fdd@mf+@DDjDq7urK!0x> zt_)A@K4t7=jx@(_E0JhN4XO(-7KOIBx^sE=z-yfin9o-cT|YoMi|-4~UwuC0^6dTq zI&v8Ycc02SWxQ*YuD%`Zw6lJnL@ih+(y7BhLm)nl?%A~dy!3BD^!ei!-K=*Vr%TQd z^rKXen;-&$setLpG!LhO-lv>sB_ogCE=oqvOhuQQMNCQtm@9wtSI+Z^E-u^H>)om? zf1eiP?lWb8uv+iSTr@uHxFWD5;q`whuw=mNzbUZfg4bWJx1J9yIq&to8!sJ{o*w*0 zVCfYJZ+K?HcP5^9JLq@E#0FAt9pF7XCK9yXdVy09`s2I~IIgJlZmrLbe^%jhv*U_l zz8i8#dv^VN8a6lDe9Xd++C<;*wDf|d^%IM9GtBWUl zx7DAGcl@CQOmAAhR7f2swO>w_#F}l_2MS-)RTck`j99;rZ)KS5^|*7|XLu@WJ!2_3W^o zEj*RlqXh>)A@=ssf1Dd93XjbwJhZCq+Qyn(rQ=BHH;fz)Dvmue#41ev#+O*u89#ek z${M8Nc%Rma^ZI-Q7l~3r3`^U8x>-psEZiRgIR48T-e$75!y8)g${^yOUEE?h}rxrMG0DE~%D0 zZvcex@(?KFH<|L)GN+yxS^sT)pkOi1D4pi)Ihnp-zATL_QCfmhBI7$!EM{#xm>xyD zw3X7@f=^2tu*-^7YJ6FB5wm&=LEb&uWYic4%Quo1AxF9aX;J3qU3ka2JQU244nmzE z$wi%ToKs0~PAIf8_84Kl)38vrnE5LUEf_#eTBpEqiqI7nield5YDS!D*TiN27^B$4LwUhanpfxW@{54Bd#l=dN@ zPYTZp<{R{iqlrvd7_qh&^C`Aylk%srw~%q9ExKNRq|4^NOMm3AHvd=jM|y1jYQ3dP zf8@LzkiIS3w>N&H!nYpj8Zur)pkEB5Mkkmet@8{lXQY zSq?XAQb}nl7osQ^=0SxlNR!HiAdxbP)%amOYKRZgW%Z$ zJQph$6gnDC_Vb#@58I!P)D20>T~o=B3}Fxh&ybM(v7$o!ndMyo|zNqQ1` zXa-InFgg^^S?X|$g5g;GB6v|s!H`TJdNn9xQt)NMXK7efe<}^@V0@KPB^2+HnQ)*5 zw7Hl(;bS=yW;^Q()M>QA)K>)@D{=UpN~7r+Qi5!bAY&_)LpIc)_}+QIfa2~Q!uMAH zZGLAFnQw-$7}-zP1RwCb3d&a}xY&&62AliY1CQUDY_D<|HYj$w#Ewe?O<_Z`k0$~A z5bIZyA1?2bh1(bo&!-sm5uP-Y86O%<8)eUC0%b$|M|0H~c0lOKtCtavjb}3H$bHbT1)4!@8(dj zRP}Y0H9i{tA%2U$j59_qoBt|-F;_k&V~chiOo6ANzkh!{?>YHnYjKya+zo?45tx*Qj|;y1qS<#LQcv~3Ox#QLGFecGx1P+tmTKK(xkmqPveKrn?+0yjSPLw zVYFv;YQZj%yeplddXdN7S#nrk3m%ui?`MZ9bBuwk&A2ibiF>iybtJF+9k zvPle#)ji?KU0U^Nt$Gu}+F9+n)6U3y&Td(x5_vHEP>)uk)8;7*#IvtVYj_wGN ze94xi( zJQdh-HOtw^?&G`PqsLsx&*F5e2sMT@MtKMs&)&&cw};>*a3MmM)}p-)P=0OUPOZ5o zi$Q&4;_E1E5*y^Fq-FOB?RV$SMe?<3Tts&m9oKY%+WAJ;H9aUrx%$lL$m`@JC<3ka z>;B!xNvSsY6r4Q_2q%?@S4ue_u#|7Psbfhkl897lbX+Sb%mO>T2W4DIp?PPt<-b)$ z9^Cz2NehK;cxuaxM*-WTRiD+WJJ&r6aO2TGNCpajChQ1A4m*auh;Q5O6Glg*ZzQO( zx9WX&Y5Esv6$mMc92L*gj?n*Jg)KQ+2^=gI=QEqnr#&(|bstxlIaHh3yc&2greY|V<(3-E2SbaVW^{s3XZL%Q;W2tt|Lz=A zLAHt!UlqG47?)|PJf~G&sxT$U@P(@e52mC%vU%7yg_u9EEX8A0ra1DL&mhGafWF(t zXPNoP=YfSBzulc|sEJp$!xPC-0G5zre|Jdx^`71F-AA8K5`)l=G*PQMWbCBV#Fnsv z3{E|g(Dx)7`?c#8Kk#U413#4Bfp!;<)%zDT+{oeG{w!&Q_LE3>))qTC^W)1J`^67@ z!%dC-;s}1d7*%bMH?4B#OT*%qH}*%7QPwX2w;SY5f-@zj6cjI)-^PBiwpx5;V}Ibs z&)C*WaU0}Kl8%rPWWl#y%xyQwn*?V`34wha2i^i&iXj3qFDxsRGdl&s^%tn!3ZwO! z{iMt>`mQ-MUUZ#wCPq&-+gJ!;{3_Ms`hFWxZu2pXhrM^S7>+uwInA$_mFF|aXL*XQ z!QBh}>`tyn887TdZ7)f5%L>U+Od6;5>%F^=GDy}-C0cbKzK(@}E@R+Nph}~6EKp#C z*X+ov{~Y>z_WsY;jB-siA!7qLKsJug~s2 zmM;IGa3ExN+Art&a)d<2V+lESK0YH(>k&I7i~emVZlvX?ft$uS^xfi-T#^?Q?zCDc z2a#QQy>gnF5D!4+z+RtXU;uS)-abt)O-e^#8YZ1T)+eIH)gsvJy=5qh?CHlYYwe}V2unFDJI zyC?DH7KHA8EB~Yl-=yVh}JG@hk4p1Z{;iixx zMw>HlYuFXwBRiZkjRyuvv*3q9)xy>BI5Qq+i!v+;Dxj%VycbBc;u7LYq(J*U`RpB` z9FO+9kjbnwiVu;c(S6wcgC_#ULIs*W zP4Y```b9Y7xWpA=DC{D&dwh;3Z~MSDZ)@H_s8pG)HvB#&8za)`@rU>o4@j=U-E^DG zK?QmJyosrtYrMqqG--x6VRSC9nXY&QSJewK2_dl-H})6q$U8HE4GN-I~|c@O8w^Y@2Tu>nCWGh#dRQ(F5Ly(S_pAtt}rVaH<(BM`>i; zg&ldlAlWs(RPgN11J{`Dx{Lv3QKUx4&ibs_MDhvs3(B}4q4hjNiyfcd480R8)N6>P z`m@^dE2VsyU4=VMpA_pBB0g<&0g19wrXe|nT~t^A6nTB99VDRx;Br|g6ue~5Ycx#fKT~E5QXwg%I{rVt#`s zxCJk6K2pluRc`d!_l)ibgnXp>&b*$6?_)PtXFwOAmt^96YnpOghS_IV_tCIxrI(cm zP0rg|U$MRuYA5&zsfr5EM2=*JT}I(n=+|`_^XmkM2WTAixzccwIE`rz9t)J)WG*Nd zVSc(%mfX(aOSq`)raB5cjJ~|B{-cq^aI^)J9C*-CkL zhb8*539NkLr}0CPS=i+lNYGmdtRao- zi6Z#w6$0d7-9rvon$~nDUyc1TI~!fE@oR%f8^&XYtUamr2=L+cq+nT$l;;qS+4*E|HPBX~v>*<03K$OGSv_Xum5!icV5)*Uk!nSoXuY21~F?8*! ziDK%ES>f8CGP8!b9JNMO5kJ$5hKIj1Sj+jVjQjQ}E9>~^2evIJ zZ0B?uW!Nmk>7wEKn*#_Y+7BkF94U)x6`?GuEk}&usv>9MsgzB1?B{~5Y>slS5Aenc zf1$BC5_M?L?QsW=YJt9y^`ioucf`M}vZeH&~L&L?KSfQVD7EO!&d`tgsx&_EM{vagSF05$7CAe?$nLrUtatX#(aNdLIq$GUg#KDu75J4!wFej=QOokJEHF%}UW zloCmdw72OAmKxtcts7eC!3nA(^rS2^MlGZ`Z2cM9PH9W%Nm+1oBRI+up~F4Xf$n&#&HRNd88D1?As6}tMsss)W4jS8ISJ~E zS(YMx?(S2&-(y%3#xg3dv2LwmT>L}{-21qH6j{6@(Kukq;$?tXs;$N2JiA`>{P(fsFh20;L9MbD`GW&Y+7E=wK%8YvI`hF%j@3-gc2l-CPMOkmuSnN_SpRaI@zs1-cr~8>N6L}Q+~_lS@BqbBDl;5MZ%Pudd$q+b z>nM@z718cx+V7@W*@gS^KJxCyQ+Aw*UcZUih31~fV~6!~B6G@g6%Q48NW8N!Leh34 zme<>GqY(p5ImYgAxunU}o{QKE`;G3r9n_o?E*hgfx6|&Gj36r~Z-=HI6>$zB&e-Q| z%Zq8c*f?PjcRqeQe|$vE8zozww}bowE%=V)M0nNK zF785ZNvCdjiIw&|)ys zyGs(2194@*Yng?G@@7$v( zN3&#^0bL;uiuiPbJH}4s4QRT|bly$8@6q&sGRL7{L_~L|(O1}+cZS%mypDzvq*BN% zoHLeL%q~bP+^dAYyiEX_-F?*Ch5#s)fN=_FxJRltqTc<;*|!LyjeUhX^G+4E=XHA{ zECz%oh0^L5k#IiEna5#`sO^xVN>sX^Cr?3qs-%nGEx+>3xfOu4#cxspNakF8FUhXs zx5%W~$8wN>g%dQ4l0utvSezjevs}3Yd4fA@8Ma_o(Cg;P*Eh;dyN^FJ>Wx0e`uyk% zZz>oN)!vanIbt(E`jb@PLg5c}?;oHRSes~lnDgxU8_@t!=!CgF07?HtdGkFiPI z;A3o(&(7@}dMjtw)FHTIfBXEJx9yXs*EqW->%JV1y(3(D3-lpwj!SkW&#$%GcX~H- zehmr>RlAHcg^~%_ zi%s~8j`?voFMY;uZ}?%yV05t`r>(gcd|e7YIP!O|;H#HEj{V)6#FvCy$NuiU7+(@M z7+;c)!?kkHY4Y&j-^Q1;?2{Pt?osFc#7h!K{z^+e0q@1<|MvLfD`yvvXKqt7fpxqu zgvi>)np@*^pKlCf#^i06%cxu=D9C|cM7U2M?>!1+3G@5Cr9&6zGOGrb;~6~$(Hz; zLEI~8FSr2Q$Y#M399{O=g-h+NFL)(E&xaqd8;87aH;f1@_1ZT+u3;87BK(bnx6l6p zw{LTIi*o5vLo;V>6kEmD{uLKe*!EX{6gX>VBXUhY3~yezd?P95FaCyi&*HD+ly!wz zi?W68^0xY%ix{kS8LV9_ROG%V<=cY1!T%!w)Z5cd#2!$?W4g~g;Hyadx*yYEqy z8a@8^;|<;pmiJ;ySwjzGzW^x0~8hP3w7uNbad@ej++3}WZd?X%D@lM`NAfT`n4EWvanSV+3ZKv= z`IlPdW&g$MRsoizCOjffB)ipu!|GyzLv=Cnstaj;MXG=QY8IvdB7qvV(G{v*HBQX= zT_m)8VT87MV8(&tuKTZ74!W%2I#OJ8Ib+v}RE{XJQBWJo4NvaYd#+yW4mp}$H7aed z`3M!AZ{qN4-{UoQfq|y?&-V|D$yGzfzG#BJkVB_$@X2-w<4;@hds43J1WO$5y0zdG z4(Qg@*~`k1kHR^H{t_`NeVOVS`-;h=>A&YaY)CrG-sPlEn^Be*zRm9cYiuD&77s^2 z-sxY@A@&V(KdQ35Xb<1`R9BU43xzSQStgBAZnE{i5qp`}*XsF+6^P zet6*4t1$=i<%jjcuS#%X{pDeO+cbF{xoD(Pd&UZoWQ0<;Yl)o$TLQgoY()5!EihNOjG@F1j3aTR z@hDs0iFM0}ir+p6U#jx>#FV~@DLfi4HdE_c9r3HJjE_o%TQlO9THk*4ooVb*z=po! zu1Pd-64|70Olqktb|tQX;6KI*V_(aWjKC51?i2b^&FBcqZ1D)9=dbG7wM$vzpS^ugzZP4QeP%tZR?Pj z)#Ax&3UObv{;ncd^8Np<=j=h{C(D$uX6m-lj}e|b`CG%EFo^X1-Rx6iesCr#xtOKP z2i@ZRw8`Wgz$+Y!QLdgB-Qq1wKo{?B>C3OhX~-F)H;R^vD31GYGWEehzC#($qyF6> zZ&}Z?Htga}seBuImHt;0=yJG6g}rY2$fyuKiTKAbc61*d>>q<^tov9}p_^3QHuft2 z82j*;p_IC{hNB1{8ATaraTl*aefwW?k5QCiscxTq6%b9$bLNbgu#Zp{r+Hl;bgQiy*7KZ6{3s78fc9;JC!`OrH%2I-xn^{>jx6RobaZje^@ zcD1TZ3Ss8_qV&0gD8rRc9yZ0wG6~G)Jw4Ge5ix;zLQAqk59NgFoJ}Xg?rwxDarGm6 zmEwG-6gTkne5g3I#D(J9+h$;DGgUmS1xuh?nZm?>!%gO8wJw=*stMQM%vTDzG&@26 zQ5_{Ya!R#$KPwAWe<-2>R%|nRSm(m85O+s$$pKD{XPl4Uy_ywa!2~pdnEe2C_;xYA zENJ|`LndRtH6`Jwa`0Yvix@7&ng%{QRdFuWw?V0`8WPRWK`}O5gpIcvc*zTVYn*Bc0 zdMVz3bQw_y1MDd83{T(bhfi#Vm)L4ankzlL z8J3F(i#6Wes&^Y4i5pVA>wiFXYZztO>e&h3p`OI7L+4ek{=2+q8w&qUZ7`#^;y9Z1 zb}srHSB^nAyyXwgkcN%aju-9Nr?;e3F+YR#&52(3a#9QP0^it8r@ocke0;0$cQqu~ z?dlbgwBb??EJcTh9dF9y9>3q%N;o2F!?lqUT)lX>vF|Y4xM7jD=7-L|R&i|Nw#AQy z9dCcLm&CV5PPp{eE@WCz-mpYlvpm|36u(t+9-Sz6f3!CCi8^xeLu7xkU$Wn{cnR5G zyukHMMBv4y?vTN`;axJ~XkC%LOtzc!I*d_zbSgmFes(ne?OP4%?dO8vtE);fsj z%Egv(SoqyTmni44Inoh)D*=B)C(UC-s#Te=AR^QS;ygudVTmjJS@d-- zAi+?qY#S6{-^?Q@dR_RUz2rbyyIjtCkVjA)`Vq+8tb+pQnSq)5n=F`BI6e;~z5m%* zIdN)u7M>OSv%YrU`IWL6xEZwj&*1ETpha8Lr602w9*hYG;j97;LpSEs`<(UnhwFR1 zrx$-)Tf@ji7jwz8zeLI|xco&P_qEvhhjOI_rAJGZHNWCC)~#uq5Bx=&+o=`2SF8Qy zh&KBjZPtFYAe|&UfH$Pa4rFcek3bFOJ-uiLS1+x25o{sF;Xzlk?=9R4#$2A{eBDzR z)q64*P3NiyLC-!DJ^OqM6l%6`=J-bu`}VR<-`xr=g95mRp<1ED4AWcBOFIAW;)TLz zx(_P-2sYzIx8G4#Jp>;uxUrgsEyd={Qja-3oYC=^BWM1)4~l0rPyA%`sJUAog>Irx zY)+D$Nguf~2hbw%z*Yp)%;(Bqh$V-aHQWDXwN|%I!k3(k-6?3ltJs)SYJ9bNZ2UaQ&0jT(K%NA~^k(dhTWciYLb z&#HtXOT$IC7`wf1*8fPTUo8hp&Y2J$P}@G~!7TI^&bdM0nPkCZLQ}Q~FVmlau-VT# z9WP7gs9o*9da{DYyA5O7>Q1(m*%s@!pNNmK_U~qsP1R$ZQqYuNWxVZetN)4dvBI~q zwQ+c(+LY5wqovx^sP`>x#R!ErdsJKQ=Bgj1}oab2OUaSShuG~|b?#@j=s z9#GYWN>I#RO1<62oBn?jmvmL6FZGl~{Dl_M`VF?jL0UUoUfb-^WNNL+j}Q?bC;ch> zM1f7iQ^jdbvq)eP)JdyPEqpt^m;%2?fq%jTe>szr5f$(YyCg-BZ|Vd1oY4SpFKbzqH43p-<5s9s8-bhp5C^LpF}f@(5WZ!IO>c4G$LRiOuvHi zJ7O+66ST{r4{ReXXJyjSG0sGZ!v2yj*d5Q$*nY(vu_HVg74clS-rQaK@$&}yIcVdhxU*>N&t5RY=j`=ANsMehl#;xayzy4}D}N8QP}*ZH z-W|R&`=PLVR8oG`)@asnovQu%lp@^SADm0=I)1EG$FjPzPI&wMZ!-zF5)RKRpjI|- zo$@pWAbUsbDzFDQLlM&*p7iO68QkC6nt2!F2PJ#%-^33N`2OekLB3=s;M4GfAAfMC zdLI!XUX4j~@n8q;s|8;t6~hK!AFCI&fvr`a!g4(;nstVo*_{4PiV(L@ay~}(oz)$x z>>(8ycgiMHvGHK3ai2<4t{Z=n*`=;oUwo(_ussHz#h2-V~MkFJV+bA;jF+Wyxg4dOn>+eyPX@ST?f!^Z!tJGR9(7RDvu|ncEVOW;2`0?PDM;;AN%Miet ztn!Yu1bPEnQ-II#v`lZT;lUKRK6l(7IC419`>elOx?-L<9n?8<6jb= z;GAkc5Wliy*G8sfTYSVu(TquA#rV0V=ulRxDVIIwl#IibXr=`IyXPSBi(tT5;v!ev zhApW79G7;5OMe)4pNYg>5A0r0(6PZo^SIS|kO80vU+(d&4c8G-p0(JCeMD7`Jw7Ix zV#7ZWft{h}I?KCij=gY?T9KqI0i%b1E2E_B-mj-tPs#l+*=(*5^@v;u3V8|(C{y$k zc*JS*T@{+-xZhD1;8vOBC6KaW{|<@QD_ivwGIxo<0Ut(T%&@{1nRmI-O)X(aDNnab zy^xhjxo2*)=B(lpa_eH#b0m=Q25Q8&ac+2FhTS+N!cXBrOfD!Ikg|<-Y^Rn7NbB99 zEnmVD`!omlW4gy0Cu*Vz4xQ<5IAlv~ZG5(ZUvhdss{exCKTOkKCxgtwEVtZtkqUyc zJiD9Ed=4|u?zW?36xnK7vaW__;#Z_+2MfMzu;_|uY z6|MWzo1DA-qrBaV?g=ct(YEoiIdf*$m~Jg)|1x+$#mzM1z9P7`e_Ytj6#+tI3b2f+ndnH?fyEX*r=GU&xt+r`ZCqgxD zyuRvNGVYo!YwwxjnUf}L2n`QSlfBtlb5l!lf`6rgSpa{)4JLylRwiyD@qBQLoK~!5+d?(jp}HI`ds==o zKB<)-V1y$#)RJ#}z^|O?ELcUE+Gq^66_~T5W6<6!=r!f3)`D_&wC{W>{4n^(pc*fv zLx2^4gDmYk;dKEC*pW|v1T31VWE zB$}KArm2fRgFYs}&45S81-1kNTU(lQJT%9?9+rZ_heR;j#YO0HWO~|qm}p}w=_MEG zk4_A14K&a4*vXTz9{z(NQRKv!z}7C6P-ROd`Lui)5G@z6rCLK zIK{7$Bh7r8^ywC*&`{D0-JTno>Hbs#ZB~woOah%lPEqGGYF~GucMIHN+u-Dh=1HsC zqqjS1qIvtIUmZ9j=AWrQsY16P2c+gjK^J@Cl)Ty!BJ#2Cer?Sym69Lpi1@eU1!1!pcn4NjlVqy`+;5wbT6vK8!x@N1+VSDfh^A+gGvok*x*a zXTF!4wiOgdCdQP%K2@zNYtx_#7d!d5&K6eZ(p<@nitaiET2gmfOe2<*#Ky3 zmLzxoz5W|y3;h@Hu;lK46Yu8ke^MSspQzoL-2dMWSc_fZOT;_?Bjug`m(o@MYX6@; zL7F&^4ZtN}$x+z*$b^_iCW8ytFPEKsylru^Kq*4FTjluUk>ePm%#<^tj!=$=)frbq zWZ+7rc^@Dfd(BMjweL0h{6CMqL7=orj028In@rlRM*%%+?1N+}@%o2Qeg)f&3Rzse{qV&Om7CVp{_-L$=mOFd3JzkljKiaE5F#hn8n~ zN=2%?j^ePk$o0PM%h7ak8X`;~P+rItdLt$79C3RjPCR9paV5l^GQZ}@NePrWx4CO( z8*eA-t&Iw{gszFbL=tQL6`Fx%0ak=b%Yr7krbBEX=A>*O%9Ra-+{Y7gc`Or%5BM@o zAaY(%CJ-J>AUqziFi-{yrXj>HYga4fSp27{{b1TF_IJ$`)p$f1By4fS0#dfaqjLU( z3T)3X9G-Pz6cPKHh+ab@GbPe5k+(`D=mhJmy^XfNZ3mIynx9@(!)-9j{8*;sOamcj zc2#Wb1kzKQ!zFuHX?{2=O{Mi?UjzM+k!7mYFZ*DxiR7ZcYqNh0ILhw5aI^iOn9%-~ zX_$WeEd6+O!$@N3!-9>EkC7gmIXgOvqg+Z>E;$M3nkS)!CvZ(~kIlSGd8ao;T%R&& zsxl?yDZ$lu99@5!+L>2s1*_TX|PY%#d}h`&Gaw~N2$ z_)E^RDS1|Z#A)|uhgh&CrLsj=#IMmG$+m~MBQ_n1tOl`As(H1h(R!;Ac0Y&M>JeGj zl@xWWJa&wT5LJhn@ylJtw%9F7Uq}k%7X|cC; zsM!07Tp8@)XR1vw<7iE^VyBwehlso>e;@jXb=)x+x<}Nm*{nTWV%z5|=AX=f@}$e< z&__B-`j9yL*BWFy?H^7!#B2R7tRumcK_~p_Uf05>yH}| zE6R^%)$Vto$vDS2Ddj}C-eMPD43@P4gHdS$)=5+JzAUY>6~C}mo5iMor3Cei)bx>5 zjyH95h9E?ae0-Dfk=7>SOsA<%IvX9ok*Q0CK91Z zxljXzRT1lc2l10Te%9TDKQ}4}se55#vnqKa>QykbOuL_#3lDu-gLS6YVz!NMM_TP;{ z!o1Aq;b#O%=8=>nJNeJ_v!PGwXJse;KiAK)9sl?Bv+u!lKd~ME`dYJ>Qs7zgz3MMz zIHqm1ai+=PVLNtuSMutmU(r$(yHU)_26rI4pMUfIrQ`pF``CF0yPkRdGJ}ag4^~XtQI6bpg}j*W&LFw%d}lCA(_%a*xf@6c!EBe%d z(;Wv5IMkf%j5acJD*HQpE(vLH<~roWJg*ziK)4#%Te7ocuSMBCLfMZg6d8lJ8#!N{ zr0=s{~3Yze1gD{x8-d0FtN%TA!n%jOc5zz7B>JK(BO;jlXl{z+AN!GD&eW@!G$rDwU z-Ak~H#A5RxiOVSGI42rO<`yQIVKycZJR)y+o-}nW{M6jfeTUpxtiR#Hzr!%wN)r1@ zf-NuF{nv*a9+v!~B&%?TDqQ|7R_qa2WPAjd)XNp%cO^Q=C*||N3I&ivaHE+{wQ&7v zXbk6;@N%5F_%oTVA2q*RX-gcDmA|X5Lx4=K{5MJ1u(}sM5$3FW=M!OBb?<*7%u%Ng z39DUwIYWr0g6%H;zQbQ~1hPFM2=gf$4>xkz{aJM%OI{Jbl)kOhV;qwvu~sut7Jl3j zp6_vP7$BK(x~`eW-S>}*X5dqXW=k^sqGq9ytjpo&Zn*VvrJ?$tBNRotf;StC<^!`Q zR2G7wxGL|xN%o1I>3vtp__Y7&HV^0a#vh(erubrIg zs*#(R{BUBroS-b06ywaUM`uFE*y}da*Qw4TZ7$Jf%w^*S#o$|}vl&e3%KmthAlFfM zau9%S#ND(iPIXC29%}q>2_T1VVcsprGt~fu8;M@oh+BupWv3$Sx+%=r=YS2vD6MK| zcN^mVHS+X}W55?5i0uk9GE@Strc?Y8n2QO+@)ImZyx%+j#zfqsDHZxT22_}3q$yUl) zv6c6*(C^jOcelC5J?K-xowBXm(3r6cvUN~JBS@#@ADmKVX@@g%nP3th)!AVmE z@oFOv=$sxXk*7RQ~ES{$9^rWW$ z8ZnBNy$;H`{kVJIt?~jR@^Kxth;wu97Cm?cf77B(uM1VmwYLuF`%<72CZer{Y-_Py zeNs7psb=p)3xgRujQxj=W~GZzRESwKu|1i}1UP< zwI^g9h8Jq``EW4(7=AgZ%vrccd*V+3#?m7^J;w(;E(?8to>OaLH8%-*Hb?ncUaJiN zsMjM&aeC-IsOhg#dEut`f{R-m`w0=Uu-PLqpMuWrgOrr)sC4O7>C!tj{a#hN_pJ8B zEZ*$m@~9|&3m9`1wnA0O9!L9V^*H@kM1}cQ3zSiq1ueOX_B5gsHW5|siY&}VPgJSBa<_D6#qQ)36|kAPvQw%K$nOU zyKf>Ndg_=%?stgDS6-fp+2(Z511r&Ez}+f%R`7hVKI0FW!Ck(ID`&vBcIkZ?{`rAk z_|{&EQx`C{su%c{XezD2^2#8t)fsCe0tj3dugXsHDrbgGt?yycidVg&N-}wsDna{6 zYl>IBsd&{v=i5?gX45ki2Xk==bII0w z#%RlbMo8={AVQ$AxP^iyesdb)_}FA4%n{$oc#n@z5GvmeE^E+dCr3`Q83G3gmPtg8 z+4;ccQZQR)1U&&Njxr~u#yx3kNK+pD&Xa%)Y`UEMl3^_!&9E+KSPMQF*7*2%>=rtQ z&91_&i@uBR8&MKv3!PInzq!^(P$&2$7?;M31P{Gj5HIT9M~KTBos4pmQ<0NGa#d>R zf&ovC0{LW-tkfZ~B1ntC?81mruUPdB$`uzf@hR}48N}UcZ}1~ zV<0{D6hEOUx!m-Kga^hYy=V=@l{qE3lN;n()BhqR=38K^q^0l>jVqQuf5i*j%JHn0%!Xn|EMzy|f58no9m5IvrGESWN?+8^m z?VG$?{U5~Zus_t+F3D(29Ea8yPgGQ1D_-{V_+6mT%fe>JdQWBjZT#~|{SJo_RM1c2 zS7~e8Zk3Zr%0)Z*BwTBH6y%41v+&TOE0E?~NOOhd8NSccI;KVDL{TjkgR?*I0UZ{s zoaGsXyNBjE#qn9vz@ew9v#rzA$@kl)p|qj~YC*0e&XVXBfCzAvwj;~%6V>|UV=BYi)JwswS=bL8qh8UAl0u_hKf z6N??OFOfyrcW7&;W-5B4y-u}U94t>PT~pOp#yfX31N=S8-RP9qSfVX+dnML6-&Pyhh43!R51 zTTQqiLRczrXVkrUSyLwbFJZUc{7OrSp)P`OZ^Maxm|mf$1ry z1k!~+E7=;6aZtwvuBqFO!cn)oj)QWAy34nnv(Ez z$S%p%=waT6oQ0cB{$i|G98`fPN^qS1aUc-I-_72jx3R#ZAoMq#e;)3-7QadtZtSx+ zexm!VHW{eY+HZ^(YERN}&jPzyqZ3xsjaNqa-T3`-Ncex%~?1`6M4%$rmw6N7Kkr zWY;Vc-KteBVD^;dcf{%yRCO#2B-j2!j;SKcc@j5S8f@ir-oVpovpyV{hn zBN>zWe)rvocn7;9`8{>m9my;kU}b-fK*O%C{fM;=g%?Kt+<@QWKxQRBqC5TyZyg0_ zy?|%87+Ai`+l}l33e-Wvs_c%$?n83h5-r<-12-kB-}m+_recGJcYFCZqLdvJVK)v@>BPXn5PJ z2{|Qd9w>OLMBov!ir9=k~UqwI4~ zbom7sHGYy=hkz5>+^y3$_hlmZ+m9KlkY({|p71G);8U(4X!(@qZkXw|QpzG+Rw!=phPa=;4Wd_F>w> z?&Uk|UcSxhP`S8S^l)&nd>3%B+Yx-P5btj5B!|anPt!>b;cu&On^3-MadVCyK7q$W z=wbIl7B^dZ$h4$=^3$fBjr2g%=%&zVsz481X9IUhZ)Rv`GY6J&uHD&G`#YO?>}aBp z!%;j(@m%2VY=(91Y%a4qo4-?>-Px?S0qEcB1T1y3B+zaZd=j`d^EBUR#KB0Px4GHn zZEn`t!o1CmC40FYj!*UuvcLI|{S93bp#o(lPcmzMX_rEuMBPP+5JQhd+5OEu#AGf8 z9BNQ^Vv{|)tI^qGh1yGLEpm}SE`2KHa^ zH&weWh4uKG;nr+4^cnuf3WU4#ea@qwqd&4rgg<{7{n0<)-zkI~~%2 zdUHbTq{b6K-fU$f`2*7vd#;%O6~FYnnN7A3GvLbhX}0LD%*uD7m%+2959MEw9VpJO z%ja%>2X_kkO0t8P)Bh0iE^~UTSIOazxBuzVAEpj6{C89D!PSRV|A+O5U(i9tztSJx zcu@V}zfvE5@49Z|52dr`w|ma`-`YcUYLs&DDsS3<2Cez~&CTCzyy}m)O!MN`{A1Yh zKW`lUr|&)QzrXatx>)1%xwrqqf4}U7H-6ao^QWI~_TSGvX>6=<uYeQM4LQKW?x|VzFsdd4|7prn*u~+3+zDSj2BdoaHtFqP7I>9*c z_7GYdUWOFe-3~#Qb1nx+2_8^DfP2HVVl&f&uZ zeCyJR@;K(iV9*)!`~n}wf-hU$F9hK57XoZ8byAlH*sF5&N5FPLBLM(A&+hXsBQk-;f+Pp*=zT*2CeK#&h4FLWvv&N$6;wvK{~AB<>|s5* zd40NVemDH=#*a2p63pl`XU`2e$+2`MJu=@#emgP>!?1>r>G~U4Uv+%vrV2hY(BY1` zVN)@EpQe~52r{SCrMjbxmylWcU@$Oi;Ve!A-bzTjk#94b8eZn3Hp`>^!$P$b%@x|# zr@fQBLM6Xc{xS=5XnCLdy`R7X9_uVE=PKp;y}A)73S(2?H1tyghtV3m1OKGIWwE%! zmrdX(UFZ5O9R9rG?tv>N#}ubwuS2OHCtly@EZahmHef&=m!;walUWr+OB}8>I|*2q zd@(0kNlRg3i)h9Kt5+*|I*6K zshc6D;E&exukSQuXomXu?0f0+d)AJF11}wKRdDN_+slk9u zd3YmjZC0UZI&_gPUnS%gE~dB%fQTzB7OUvVJgvqeKEO26EJ!PE^J~q6gasva^GqNX zM7~k7Q`|0@M;^}6mytRJGf{_N`kQ-HOhm=}!7ql}egbY;TUF>NA$MC_RagP@{mz69 ze!?S^a0m%!JW(BJtqKotTM-kVyliA&=OOJ|-I0BmRh*|n5E~+tKrQbi6CuEMZen2= zYryXkHZh8ul$l0Q;?RcGa9MzGwAO9S3efJi)bAwg`AuOh!0H!VFZuWCBhur7oIoAq zK3maT*Pgw+OEzll4V&}oKYnFFUz{dXZy>=l*`b{7tSj)}<7W)TrRB->XZ>>iiJ5Ov zX~jBRJXG&Yj|p=0z53~Td^kp^fV&+>Y*2X=u|gXonsTbz$T~%HtZT&`TvoM`=F!$$ zc+{Hve`pDdPz66@r|;WmPh=(b^mLLtnf-~TeR$$<5^stUjK(+PirD?+Gc#}7ho+X{ zg^X?B8!k0wfr=a{32wqIaQX&y7mveuhHcN*CR+UtwmH?iiTZo?9Iu1kd;GMK6>ag8 z>d*V-{NplU06D}O1F+^mb#nDxqPiht@+tpZ>}O>Btxyews|6~5Q9-nrJ_jTpzf}+_SD1-*1-7>PL@wp%Ry%Z{tqHXpaAN8822g%wW#@LdCfn`Ha~tI*N?oO2P|j-?fvHGwD$@Mu=A^-BweTtLz*C=5&5$h1HU?2nqOq#u67?4W(etS|5AzH#o-_geI-CBk{9S=SOQh z1`rWRKum{5MNH!-rY?zyk}e3FZNH-t*|6Edvtyp^=CcHC37$hK_u7d2y=ZGyG@X;2 zsK(4p(XtvbdUhj$h>KfD;>V?&biNJ?i3Ga&vE_Ioc?lQiS{Wl54Xc&1!a=Sj^yN4_C{y*P~2qaxm?w^{XFl>T-_BGX6cMnyePlAyVY9iyDiR5=cv0tnObs1S`kgj`d~Z$KGX3)p62Y8TI@HvZD#4cKAQZ1fQIUl zFki&Q=xC41&mTJ7jix8*4n6KLvoo11+Ut%v(0|@^ckpDAhllgk`kkgANY}=?H#6gy zJu5kR#epCwOFka3h;X+ITi)MUy_Yj~G3%ivUlr15n-4IB$a`-_Izp>o1W${=V>xOb zDQDa6PWUf|F7f(#@~dT!-JPoh?rxG)IIBB;=N_Hrp zVK&y~a?e{QKg9zXq;z}?1bjNeZAW3o_%)kD7C#;M z8z2Il{Q_GFwAwN(Oq_-vkq`S_vD9#Tf@+BbH6w#hJ4?O~MN3!qaa$_(Im33lyMw!( zB{PXb?y#r< zP-sFXBy!A5)A%55Elw96DyE?o;=KO3Rl2RWGkx*EW_@tq@IdF?crWL z1(l^MZ$O=J2^}qUn@e_7yf|-$yEFI_*MS0(bcBmexQG#Bj%By=4i^E2I>|+#7*je# zgNjWfCpaWpn55>Z;ZG4kx8`M9;VWHs1-B{r9zyUtRTosW&;2N~lql+iMdy;GZ)UGs z+@j%dw<4>jp2ZtA4h)F}C>YU_cYGXWg5Y?`&Dms2# zuw9D?mJt5=lh*2JM_^dROLKSGP;e*Snpl3FC4U0M8t#gZoFxws=8l8n1RI6O_}Yok z+S1i_358Y555)VMzueK4m+3F;b<4u<0Hs2vLRnMRiR zD=BRaThPPV6J21}$f=g!t&UybcnmMQL()X!XHsmEzHkL|x^RB_x=`Z0K>Uc*f=|rX za;+Jx*7%E}7Vwr2>Rw`f(+V4i7aE7p9S_<<1i4<_Qa3z7zRB@Z(hF^|M^h{ipKSj2 z8^5D35>OH~MMXD%P`4$wbc(v#73mMT)W1_|ZwpIT@22|9S!l;ins{%2@e@L#d}A2z zFTKAQsbVa$jq!`o)j0>*UmV?;@I*hMOd-DP{vv*fx3^d@)I5pia#D6^gOq5YLEge1 z6Le>o2l$lR2>y;RQ1Q4ESe7u>0GVO@n3Pg^9K%wA=6ZfC$FQ(l78O3Vt8g(rtq9*U z0ZQmz>;sC-@?$=jEFlJ0pwT_-73`aNWjY*d-?a;g^4w-TYU9(M6Ug)}mUBf^B(+qr zy*>{zz<6|WXWV`#=C%?+9M~{b%qdBy6&*TM(vBI8_t8d}HSx^E&$jUgh^Nd2_wQ57 zUi4a4>9t@&Y)Y;b$=ID<_Jg)S)xzDY6{_8Db7v#Gy44mETCrH;BZ8aX7@k%}X8!U= zHNuuq9Xpoj;-r_XRMdfY%ZxUzP=EY_L@W6)ZTsz3{v|(+>{q{7Id}Yb<$TqaW9?Yj z%6%seKi?TOzp-K9(7Ovipcz>do)cwfpN!Z|CbD7P)_9!K?&3)QW zVUn@?Kl)MqO}vXaD!*mwln~lezN0{$g<6Ug#TBA~6Ill&D)Qgxvc zE{xJ4Tl3K`b0j&BG)j?HAzxPHvr5HSlKe0s74sh|rc>nemz>CFd1t~O`3d*YQn$F9 z$R{;8hPJ!cvQfx<5D9XHXdjFog(z(!u>d9YNL@L`?v%}H$emcgHg#mQt(QP3>0QAq?ojO&&P)`pLTB^IZOdAJ)-5^18>2 zQ%ny(Ceaj9vbx`8<|98T^Z2086!6a}EKw75;0WYxmCq^Tb7(&~|%!@%V}6 za`wM;lev#?`HRh!f3osY7@JVA?$i|QrFar4gN9j@bmxZMSy6XbzEz~V7ZkX&B5oem zH-oarlN#3=b3^Vd(%4v7qkDhuZ(RQufyCqa);#3TRWy@kFFl`8ke4R2>JqieR8F-^ zR2N-4%C^?O%hU9;Z`~-`C*zc@lic{{74t=JQnR$r3A>w93&SY9^4xdZdRV*J;TCl& zKE(+L6Jyx(=}6RC`h+fGxyHdsE&F94LKz_v^>F9me{wbLHLu(OP8SNQZxIqs<01>` z<*&B;($B5l^RP|cv)_72Lu-VNHIjx-k~GvYx2hOBHSY9_0r5R1q>yUd7N&**=9~T`U@K zye+f~G48JwEbX|a=7mxq%>Dqwx$4vD%0tBIySq!C83&aP)m~(dLjsTk*Smo0dcgHN zHUIvf<-oOukifOxcJE(7aRg4AKwYHde+(N*DN>s#xs=71LXfM&& z?i3^krhz^Q8L%IivVDc)4ezwVXm50ZI73b+plc)y1P^@V%VE{3T@Ui#Ur)m5H_v}q&qAr zphm<+*p1Xfqm!gV>Crv0&h4T<&gvt%2gb_3Kf);dv-0nCzIgZq6_VU=&LrcU6($B?OxwyHCDaRXS!R{2O2t^)RvlG zK|tVHBQW4@+Ae{ldaV;&SWCtLTMeDv69Z4n;!IZYBYq#{@*;4dC>NXMf+0iePPxAr|lKX_odqV zAOG*QmwDjdCm=@hv-T*WU$wZql#kij=wmi=J7sgpUi^%n6?|{*97%+pafa<}=vX)n zoUd~6=Y58G=qGTQ6G1R5etwEKzMW~8hSc@pY+j1{;!g|iaW4#CJh9fi%0@Sly8>vD zvTB8uBOthz4Y`$n-~~cyQ)nOiulL+odw#fLOsMW$_nAanaPE|Js86H#=886F*dAR? zK8M@48=4jlM=@}0>Qr+$WskS>soZNDmxa1Fge-wEAE9HhBDo%33*N~2nEWBU3N5(Z zK5{J(d{T464Z9YONS(|LZpWKO^4kr33jwQr8OV8S%~vzlW_?)Ui5HJI=GS)NbdPlx zgxm#Tullnm?YD@i_@QA@C7s|%l{asP6|G9N7W(Ul%nxF{DtmGL0N)cgm_U3$>e4sN z;9M`t38XG*$d0AEC%u{f%hi<6yib!5LwD)+03+ zj#6wMHrMdDv!FFO$#nC((d;7Up}Ap6xW9v6<5_YLpR6HCdZF|Ltfcui@mb3`Y_Ss- z-0j21iuaa5qMYO;!mJJXjRVSy}J4~Mvxu5=`tdN{+^mp5@O{q)3jnAYFYl%5?7y4hgXSrS3ih)iZ# zh-X}`v^Yy@{`4asj~*tV0o+QZsP<8+F*73BJ_>n9(p;Gp$<1rXa^s&9V zYd>@+pDH%QPobq@?o-6y>7njylzOZGDNtTX`iiIH$2hCU1`}<0EC-U)4_ZaXRc$=& zxu$ytUS=>l1MVt(OR5-W3H=PXpRyr|a>FbtmvcvwKu-5U?!NMl=2v_5*^9cxea~6) z4k@{qQVa;H#CqP!pUWh8tW^7w8);u|`EhX$|E|+;y7md{?NHF;Lid%DO&XG6&E-#^ zQ1JnBOLKZkI2e52S@IpmlvAt~EzYp5?%#tiJ4?nBqcOTrquuUqu^RAj{8)3y4;d#I z|EQ?WalB|;pghNB{)40@%b^fU4n82@eR7ihRLI8+CIF2IXs0kQrC~vfHjO` zO}3{GVQ!MA2{s1-H(HmS?t8WzU~xdF&ru1z=sCmT>^~g6-2>r2cTgwn^Si-5()?C0 z>)>qvF_?Q*C;XH3RO753WJe2a7wVK(d#OcIsqF3Ztnly|4naxhGInvB70idY+YCE= zz|fpIWbrdrO+x<{KVkJGy3jnTQCo!mB{PEJo8PkP8-a^%_VJ5b@PHB?&}pvC>&Ofs z56CMI>k&8X&Iq}4aMMs^Nu*B@;>UdsF#%6v{*pI%-Sj@ldFFpDZANx79WA1meBlrY2n$3}uxf3d~@hg=6`k>35%15CFlUi}Bh)w&v zOEPy+@PT=X$TR8l^30u=y$}UhpH@$8POgRqn={k?8hi!;RfO*O?3zg3uQGo`<=R!H)!!9D{EMJ}F$haBrEo7+ z2;JH2R84+rYytOa$wqE6Jdlfi4P>3YVvv&`CTA zj3n=&*x9w_k{w+VAE)7mv=UNgHRtBt6q_2$#O)%aMeKgE;+J8FJ2{jYL=#ku`Pyz+ z52imv?`>++ zwsjlC4Lt@9R{*{nk1slqmk zc&|xRNi$1x)$%=`cgqc^dAxUTve(pq(X@-rC7faf^tFNbq4a6AdC&Ey(c1)Y(%UsM zr&2*?I6qV__8o*&fwY8ecJ_k!TuH;VBLOFQ7%gV5lxFtPav&kA ztx7r>dfdk@9};#LE&c+DX(ZAZ&FBV+Y2rNv5#kGcFwk%CyV9J6RS7sV!FFpjV2}|O zb(nE#rIm|a;~z!32~>=T}DD`2YX&rhvHj$yNFX%4je2r2tA;idpKNCAl*6);bA zCVbu|j9<}R>=?xs2;|xys<$hPrKxv$S*H3BZ3VSDyXrIyfaA&>&kv?B?e0s9AJ-yk z8K7>0o=?xRt8a6o$i2D7uD)y4GH=7V&3^8tHhjuP%5aqp^OQaq&T6ksGza*D(*bgd~50$*}zjAE%iczn5d&7In*V`>I zqc_MuIo>Atwq&QQ+Nq>f>_QHUAbGJ*h@KJ0)RLsJi)zPP*BDW-GR(2n+hExsfH9W# zqVd+}aM=HHqxYqVT|$gv!naZa&;3-%ychV3wq&t^@wE`@Avm6>N>~?yWz=xT{xzWW z%hhl+U!2uGq+r5Si|;vgzgm2{K8^1)az}#*7YahD$X{ZucpnY@1?wM~6KJ=u`)-QV ztMPJ0F&W;@Z%-}l8MJ?Uux!t@Ck^{WuK#h5W#Zorrukhpe1$JSsHpKy510q-E=^V^ zYSSLB)6)qWJ)V;VW3Zr!2VeCd;WSFDrLJ8Sm3tfkF>nblk@RYP{LE)Uu+h zdL)}L4@>@r+zj<#K+=z9nadVKIvr8&J}p7HU&(mGhxI}D5}|A)fQcq$5uUQEuNW|hxn?buvAG%!3Q&g zR!~x959g-sFuHhlvJ#*Ak9#oT^u=kIO*|BSvWQ&_)Bud5ou9x}3MqiXV9kSN)v*yN zZ?+IMge-zT@_E*Ytl5evZ zf%FTBE?Yju9$1%O)WO7!O6Q+{etN>D4^qSSER%^jTwdye4^rRw1bVQQ+!XRRHEI}| z1H$VGGlqGV&^7Ub5f~GIY(+HRrd*LrFO`en3UB?iKx~ z$Iln3qJz>3Z$4OBQFKC;=7aQuqe$=3i&0f-r&m9{o89p&q^h%eNu_fAX!^qa=z#t1 zUdpSC-vONvndyYqb9~R$@wpWWt!xsjX-zp2LgV)-VQkiBG z#G2yq(iDH+7vY^qfDbY6Ly>WEA0h-m^hGHTL01LOPpmTu4oo!+K^g^KFD!3*7`R)S zqmy-+Yr!VzD+MqHFJdtfIRdR?OZrp3!bO2DVqlzxQsLes-szpa#_;CuO?zCBxvqaF z^Fx$ndf;^6gBqf;=KBZLQi(ha56<4E{s<+rKOi)i&=4GBcr>XwBRtR1n&d4=cHH&O z>X)0hhx@doyfhizyUAP=>1KMd+KS%=_-4X~@O@l*29^3LH4?1!pfto}uJ^(BCIRMp zQRZ+;0bD~Q6Jh_4uTuFpM?lA!0eb)or#yY6C(zdgr<(soMj>1FG?EEaVa}xxQX9-m zANV!LmuHTmYV$o(lP=V8tvz5cN3ZH=HG7_K`6X!$n4}LLX?1sY@A_@Xr81ZgYuhx( zA_93!>jq?xBO=lnVK*-5!zsq@CVCTaw>FzFDL56DjBR4TZK5LckL&zIuMrSFP|_k6 zpoWo?k^kq*~Wg;q!>c`qSWiLL6qJ5*=0R+_&lc(x5bR7#VUMZ)CRSIDW#ULhzFh3sP6)8CXG_DL! z5yNvguk=FGJ##2kXzHo4UPFO^T1A^*B=~bLpqlYnszd9=IW%(YP)SO@o%5_UWlu? z;?dN(=9de65Z^%nkBR2yTttdM;s#9V2c&L@ngzM&xYCU*lva{MgoWnme|(BsvbbY@ z%vVbm`)bMgF<&iNNsft}P#Vm$W4YZeRR%6W~I&D=R-d>W#poo|F7U zO9zK08&-b=%g7LI;t(9E(qlqq;-@SL4=T&J(EY)+6kNY_ z$t^1Xx>|QnyYs+uF@P0&oaAs4ae63F?<9vPvz*W%59-v zI0{mAN^1V-iY?1)hs--U`5aRsRClsFcXVsjkf1xPI(u1{aNLnR-W^%(?#!O=rHuDf zl1gPtT~zH}pwo#(AV3igD>>-slxVeGUV-etm=GQ-iB#gQGFO6sY9MrtUz9)ZE9XLI zz#W#ac88bZn{pE^zA(nma7G3IRDswv?%wQhrg1Rtj+dq` z8jbt4)su(JJB({DkI*{jjSn4j+xmVz8%$@dA%>vKKA@-k1KuxugNNxjcI z0Xysx8a`tNAyZA)SP%9mh7iVyzzq|MXrS(h#KMT^-JGzwNo8y4NfNlU==3Uk~(vuG1@K2pgZlb&v0>*;2-XK6n&LrTqS%Hgc$Kfi}JWU8#Z9#~^q~Cb9R}`KP2JJuuI!NsaEozOQZsPY&wVaaBzZZny1Glvr1k zXez=&=gDAe_UMwfV5{=W9AGicN{tC8TEkd2k{}C3>K|-zU&`YAA)M`zSSO2$B5XD| zmID~3f41x6YSs14*V?Z4r|Uqd&>gDo7noY2y>}l3LqpUUaD#wged2M?Fh@14kszu3 z30q72cC%?sCs;a{JPmIuoTvzJQ@J-(ZGvi`#oT36d+^f@7;~?weg86Mc-O ziWA>wVpySg8%9}O!-#@!()f;QEOh0 z%u~deIY??1LCQAKf$jK#j zGr#Ff^m{MSxbC7AndcV4HTLyoDwsWv>eHH+M-)Ew;|S0%=z-3e1uBFmKV98{C8!zq zkid`Wc-Y#2caw_0b%MThGtk{)BQ!{;qZ4n-;?-W{#Gnqg%r<1Z+cmE6brCm$&@LA0 z;l66u&q99D(eR6j5t@g%<;KN?YmtEo55YA2LtSlzsq>idb%X@gL0|wC>@TG1#)L0Z z4$FkE^mA<1K*;IE{!I8~oe96|C)5t0J0zoktiKP%h=pP=K@nHEG<(??pg1wetcMj3 z!HN&4%&WUR+qbn>4=-Z=d*EgGvpjjJ&y(kyzh5Pu95AqgTisIjc=H5tJ~RC|K^0;C zOX)<>{zO1@Bqn39ZbMX!W@A6T^$Z)~jZazXx)4Tvy#>5`)Wcz+`WwsG5lfb}d~#X+ z$7l)uOqfv%Y5!V8AiuS$taoZusotY-bvg}Fr4^BuE+2IUBK$n(p{nxfZYZ|Arc5?- z@o;)<$b92NHUvF$?ad>g&WVghmQPR~&IoXtM3F`46uqvyBgJ8jELwJH>9UEZO?Stf z!n%@&CyZXLBTK_su9W6>oX5*-r_b+`TN&bn%*nJnp_O56*OHOc2i)L%cF9P*?THuQ z$;A=8+PH?KwYVU@;$tle;R6>K%mrz9sw}lI=WJXO|t}r*C=;as#du zQzK(qoBJkOWA2ViGsBSVUD{&jqudQ6!;4OWSB)aLjgA#}co~c$vrTc6bQ~b0!9-Tc zueUM6A3hc^sWH*?NLCW3x|u}{$7Uh(A9!@fh;izN`y}kJ)0WX=3P*tEO7&uy`P00BoI4;dhm_F$fZVlei1N+%=txV#mBJxB0S2| zH-=nGkkd)tk{V%X1MMCC>-tc8%+$OLo%j(6>=gL{fyCpZgeyLMDx&hTRR7etXnJV0 z;W?*z9Wq(lv#atv?cFgoTmEq}k>J5TzHD0G`Y^S`T?&t1ESnI6J?3aYZGSu=| zlmqbLoi{vuz_b>AE9&DzRQPZ@IemQ4@ihk9M}?F3QjnyFl`?7Cl zT9Cwdj#4N4^5jJKX*1*`sJJ$}al11<8OFN8XPT=MtsxE8hvfF7%KfNy+d89;@uM#L zduJ50-e#QgiblCxeLyGNMK7Lu&BKp6cpm1Rj~@|Ld8isJdhxmNEW=b1c+T9BgQqzc zkLbu561aBxqFDd&bPtm6^YkJ4F2R2R$?v_;4U(3g$$xowQs$Aa&qdsYJuTus(B6f( zCb^xKgS}rEV~6|gKD(>kXR6%?B|#DM_!cnMA%Vr%2!Vum3s%?A*bu7;x7tBenMz@E z>UGxCs@wS4@7?@KMh-}!{R#LFH9mdKry|M^{~8g_xxboS#nDT4ZB;_E!P5qRx?#R@6aLf6VOv`sTB0rfQ+w6-8AXXZcdmo|qG3=*M zuBAqXg+1)@!sctQ3J)WAB!m(k`2pL<8={}zg4+->eSQmuQis_x&2PbG0+Lw$B^R;I zMihR2>1Y4T(qAXLS(q!V&MVA(Hy1HY5hG(z?tX$Bw@4J5yKP)4osA!!8d;`JABz>f zC^Bn%=4B+(=`p2d9uv>|9Dmh*@dnY`k5n;66Sx2v)3lqe9?Su>q*UC3Y z&3agX`+D=>PsGkhIA0K~I|=$-$fjnX_67F`xn3hbTWwpD?K`5psXci0U{1oG&Uo$| zKMBN~YU=##m9b!5MAV<1W&ie$k%Ms*ACl>%k4Vwc+sJ|} z^tVGiYe5yJ_VAFZmz7h=3Tb9B&tg86`ijPU!UeW&_z>z5-$P3C{2<6pb!-$_buR&B z*$*M}_P29;lMe`qA$QesdBQos$ZTC_$_+LprcnDCn6`4IkJ@{N^#K% zRg#QD)?yZoe9Wn|P%SXiX&Ml$w&0d&BV)!QVQ!e3gZ5HFg7!^0Xoo$MKFb96G8cCy z{FY4^zx=bn&a=SgHX*@Urb!;GOT7#Sz`D?bb%FVq<02N;dkA#G8t$|^te55=0P8v% z0j$?N{qV0hG#+vD!2k5<%V+&F2sEAU4(Rz-532hq#DK_w{vS9{l#u_2_ekETY3!BX zx!!i3XY4maNxtZLyH7}K9=hJ+xu6>$>HpR9jG&+9VD$cy;ei=b^M|1rMY`*6>ZwHFT&T9=S-7MZbAGxm>@xoCSy9( z%iV!Wrds0Z|8xF7&5`JUzJUKv=zT~=u^O!G0JrVz%2=I~EwSxMv_*K07pA_(#(q%Z zMh@k@ZEB|Y^5bd(*}t)D;`8Qw1EoKF37bQ4@#wt;8-c(=v;_M5QO zs__8=py|NeiOTb$8t*k~oYriFp>pF9rh}aMf%T~MoXjvJMGTWAtc*~=JE4v5z{?^S z5RuVIN@tTAt9$DTQkSv#drmVbOg@h#4brDbdN5x74$*n`C-CR`QN>Qqv(M-fzDnMV zH@o`1^5?o+=h=61p1r1i?>lwJ`0w$GVHLaMhj5^eywWhk{XVJITf0 zrg+?qX-MrL*aDQD@*B?6*MHJ|4_|@Gf=;M>oo_$|hyaBGLFM-(RKXT9IjBSq=>~%X z&iiL{7O(5`O2G$zxBU?}d*}T#5<$u%>{t9K@2WW+`yXh*v=g?zs{mXC+>yQRAYK4; z5Yc)8VA@6rG|UCfvf4ao+&$#8U9PJI3B7}WK-S&t?mPewhc!dDifYZ`LPU=*0sd%$ z-9I>#9fbX`Ixjqo%gpgLz&nlJ4 z6UrkGzqcw8ch1t5>NOoVp8NdTZ4dlB_?Uhw+K+hANq1oD%}K5L=93q1K5oqA`#2a> z|I=FoxOF)Litn~{y|4Nf@6GP!#w#~mcBQ*VbwwhUpQ)BkfcH_VbN6d$&t$OqpMx~- zXjc*6Vof!}1HldH71l184>H-B0D1)yn`P!J!7NKa6@G3-XH7!{1_w}am3CbnJwWo3 zkNj51%0}#*QfiJLwf2-#=6t*H+jHlA=Zx?fwLSW5P!3P+kseu4YXW`j0)hZ+*$woQ z>zZG1lA}94G{Q-afci9^a>{q{-ZLk3Ml`W&W}htQ&0#L+j2v=i4@09g=y} z?--d^am8Z1XY|+A%)qPHues)GO~tD>5&7(N=jC64-Fu%$>zLwJbuP>*v?IR*2W6WFfxH;-QIQ~HMq zq(U*~KyXjp@7&#)PZ@dUj?^mVRz7~ZZ`>PV{Q z6ZXx-p+~B#_B+v!PEfJek4mO%L=!XYB}O5uWmW zGR*b-S#$C~ejZRvG<}e=ooe`s$Rc-*9-E|CaDponcf$@Gi*bR+4!mQA<$TaSYMW=5BXteB5)Lf3G+!zhhUt<`I76=NWua$_)+v*CI`=|`@QFWG>*kkTLSwkla=qY4N(H~$%hj}H|Ui05lT#hisN7xlsoY2mBVCo^ahJh^vJ!)9GVR-BNI zRgL-LtS0$2UPg^=0o(2>Z=YIamrhW=$ZfHCN0QeZrkoZHj`nk&Nlp;YZX;EvyD-d& zn<{s5#N9ii6hT9+ne(3LvCJc@xKUK)fIroAfrZxANfV0*a;sKMk2~x^m|BxZ6;ghj z0t)Gad5fKPDrvt;Y;{}?wZ`rh=NK=~6sR$s3F=-UL9sISU)P0)$J@l5I29~jn6V5J zVwR{|`tQ(5=5K^^1?~2B)=b7(26Nhd!Dd}I$t<8PMEHQ}9VHWhN_hsx_2fx;PFK?y(;@<> zMeh_HrBGEF_PcMBz;8G!tMCP5!eK&Jj_jQ=FU(xLW7-g}Txowyd zwg>yxgz9>;7}kWdWzM7~rvzl16&-I1#sve?kdGrN(}37E`S75Ly#;vYLyhh{ZsuCz z_5Xl`sN=k^Pc#P=^=@Jlx4Ll}+^vbEL#t`WSec8_cD2!#!<>X1%J(Xa5>Ugpzju*? z%ZBf}NFi4`t4BrC3-f_e0hjhI-kT;F=L`6h8l~+YY(j10uT!Ts`WLJK|0qRK%zd`N z)r=aajROOBzt;TE9wi&%$LvyN@kJFI7H~cGnR(fnUCb@_MbLI<$$9<2W4P^Y^cJTT zP{6?MR~w&V`|7N0;R4Usu<~j+l0>@2Ah9=p?to^~qftE><@|YlV#l$Y|Cv}vIlCiT z^o!OMsnH`h3BAnqk66Y7DCq8i0s*R;pQd-|V*YgJy`EK;6M3&+nSIXL^cEm(;%@_g zFOYK67$yIQ+rs-6g3tbA@ovh`D}Oo&vtmc1nLKlz7z3RQAvieZwhv%gb?)2O z*SUMoVX4X(UnAvvAQbrko03AoZIplCM#s6EU5WKTe+GPWx$4-wcqi;rVDS#MvIo`$ zZlzfF@PHSc`>1vx9gmc2FVpPY{Yt;o9k$FfkOZ$Au+6#q#i(=N)@b>&Lj-=R*O0q+s~XaK!HfIGmsZ?{8ietDaESH6WSTq1Ob z4cmSD2GW~;G$nEddH3*Lx_W!dj=L?mRRDWhvf>aOid0G9KaAN-yCFXvIpgN#JPKGKj*$z2A&a$@g)-6 zFo0gUEy2y&-?|?UBsXNI7OSbvhk!Kq?TF${hh`2q1D>UP3lZXsCzr3cVwdu*meEr8 zT4+Emj<(s%xouUu5v?Ehio4C-n|N(sa8q+8ny75F%vAg;d`#$8Qe9(&z26phgYDu& zO#q^{`L$@DO{x5)ZfnVwVBW?*EOS7a?ufBUHox9#ej)L)P+D3%QGF;Jee6$%d>Q@{JG^P)_a~B_{wVm zwT0cmjTn6Fb=S95@3o{Slck_;<*RfWv3Q@YfWnE8qlcpD)buYZ@qzpfs|fv;h}{;S zDr~fF`wMgvUp{@+##0w<==_ehk_A-ehL-b%Gd~-tX(R03Mh}9*0OC=Ugf^0`*4obv zjtxDoIaPQwY|%jX>0u??j%%&hGS6gh_xJl0PmwAeD2G%uU8m0*xd=7BK9pKv30Vge zGhMwW)B#;$@mT>7IJ4kfV7H_qcw!=Y@p|@y_E;@*xS^S26xmsVV!FDyv!Jd5>K@BJ zi`$;*I%v{{zw_U!(6hQ=Yx(2)8>8v?iPFBN7vy8@cw@-icD}!P`ze76zrNjd&$B>V zAutV_&lmQ}S`gH*t9Ydy5(Z4Lvi+g%`rWTdjwcqMzE8I9zREkez^de>bfibgIv1-Q zYrniVv2IUIqB0eTe_#`pyu?SwC3~FxuHjBcKBbsIiSGLW;hS>lfh*%$G}v1yV~D}D zxE3pII<$c$q5#09t2czwE4<(>u{-(360%ZBya(*jExfhQh6VKeR+CZ5_;80lT*(I% zKA>_DrF(bB^?Gby#~7#KGFAljdnlW$!!&IZZ|*bSVDDp%MJEveW?~w3r^$nszcy#* zJ`eFeH+6ny;Ru+*+~*^_&rf!K7OP-Bt?>*0hyaCu(D_-cj@g#`{Id7ivY57R@qgyA z+~-FK&~WMSN`Y`xm$6iy&wVT_6WqUogR)P|k4a+pR4Y{!3VQBdd5s#E*%}9!c|_+J z`>P1&3~kLfc=6cm%L$1Uxumz{FFuFOo``4wSl_8~`NukcHxIMe|#J^n-RBs z@-Y%Aw3_V59FP4zAyxOW3OpE(?d@=UHv1J=4D$zNwruulKl3wW2CojzW>;A@yU!cl z*=#wi0fb_+OMx-}i#aLd$?7>+k2~ziY;HoL3bEM{Fi#&$eKT2;_N%nQiXWo*^{Xv* z-YGEr?H#e)nh;LIUFw*}-OdxvC++Z`pk)6TK}YO8VDAtT6fO{N)Ap+ej~yYt^041{ z&wfAmo;`oh)2%rirmY6~$d*YkdRrXx3l(E69q;jrX<=4bOGh~=cjYKk0aMqR@cVv3 z-8Zqnj;jS-%`o3#MU{0}ah`Hng<_4LOV{*0N}oBam*f|AYG2PT2NvFrihgQ_uA#-w zlDi0{Js70DL-s)Jej=HhRYQ)ko62gR5{x2RbGMcOu}Qprtv&yJi{001QcEmG6`Flh z53f==6KGVxT)r2r#T3kzk@C1N&I-<`rF1iU+b7y%>Gw3}sy(~AAgcdGr_aybDx zglOFS^~;e|#+*O4Ub+5skwbS=v*|T+lc8}X&o=6@`?Z;StGH+le?6PsJ;A5fCbk_l z9C_XDSDXKNXnE7j4fulF9)3AxPtg9Fa&)B8)&genr9pDMOpj! za;T0zSR46#^B5;(CT8=ymVoIi&F_fw?d9(wXnw|zhe^LCButW96}RPIW72S8(r{tY zcwtgsGeN~zOqxOnwoWB=dPla%)Oo2~ac9~xze)+lE!K6pKjAi;1JS8{SPq@`5Tb&H zM>!|aO~ZWSZYu-vV8Hbj0#$CrR*}WhxBCgO3Tx)(#3a27wXSKKDhg*#XG|w{9G+mu zh(5B4axMs`{9x$G;MKfPxQ_ z#3CoWh0sv*!u;-Gs7>eA_;eke9LA4%e`x2py-Sc;aHo=&9@Bj%-9yO-^3zQZKWmo- z3hQc0T((aXSJ>JiWby~1w(>!{OOyJJl6UjyeX`BJ_D@CVdD+?rW;{;FeDGJRq9x^D z^+8)Iv*|*sJ_^*I`+Q0J5wG~N?n$+%oW9D^;I`&s#+(0wHo7fqt?awqeF66N*+#j7 zY|ab{zL}+XzOv zdw;a<2oR>0U%s)thW$=%YqS%lDp1#lnNV%Eq990N=}CBPfW@#8k-ZhrOftWAa|mG1 zNyd1UA&=)@PD}&y?@m2DwkqZ9YK}S$CjbXLxXlUeYA(VfBX5g8*2UUxyS;Eau{AL7 zl*GqZI6t_Rtcj2NI6r76P~TFvY)WbGuUkNOQ8V%5ZXuq*XQ+sYJJ0X4j;oqBWzV(QI_1&g_?SuWl7DMq{p(Ks$I9RGwa)w- z%iML#rbK$3+ zv&7QIt;{VmKP04e>@A5uX`Z#u=adp2DrNN476g9-nd>DuVn^*4W6menj6jjMRT|?L z@m~~SBWq2`*^unVW#~|w=D;2duCA_~47HeIJA)fSJ!dpgx;zL@x=`sOh%9Su+(ho$ zZD?V7JRYs55A>@?-8U#LLbqWa*{@l&m2zBuOrV{!WkFkQu5E7N#T5~zJ5)dhjY_Ogw0Tjm}m{?paH5% z0Mf&&zgsH-!KfMa^w~Uh`+kjOqduhWw9jks+kS&zSA#dx{PCGh1gXtdbBou_6}E05 ztc$nfR8`ikX0O&s``79;{Ft_UUafLHCopZNE9P6a)~5*K2-sQj9$el*K(j&7K4|_x z*qlVRiJ9LicoadO9~(r_^ySCedxZ%+*7v9pfrpQ!HJLStkNlp|hhl;nM1tDTg>|iT z;xIvdBd2aXer_`%Veb^y19k?wAy_*D-4M*v-Vn^wyCL{9JAKTBGA5|Y#f7EpRh&|H8 z%zXqch<6Vw%KMBykYCD6cDygc$lvJBy~oj1tqH7Wy}G|Bw^BotacIu z1;nLf^?-OYAp!AlD_;MSKs-;ySRmH;#XQ#kpg^gMST{^i#ii0 z{W?E^*Z+5+Z2fe1qS!ma&7&xGVnz-_O_ZPy=e`61-9F?d7SbORcx<>pceDpOIsW)h zh<)Zx5&tcG_H#Z<(6r|AwGdDbANzTZkosW%it>I=hjjJBdNU@VIi)x162>_eMf0X1I#^ zEQa6SneZ+@;gL%CZ-VqxU@WQ~$(NnF~@tQWm zhc$WOQ?`3gl#18v=C5D$ZrMuB{cA7mqtHUWymPuUpXW74*V}~idA|lt<;y+i*!P#8 zC;Zh--Z#S6oYHQ??>$bKLSKHJKN}yg1<%*}i7UM{+fj*r;H7yFZKoPwzkf*FtAu%8 zbIP4wJ(&Dn({HMmFV_aj-S;W!c)pCH`sKs!x8LV0+|zFdY3FXqqoOzY+m4F*?vPmD zL=ziOtf)II&?col4yxAdV3P~za0h_gq?+&Ag)rmvPrDF5=&ZgaB5gp~I$TmYtDid~ zd5cONTKDGeO%?3)+084d)3Abk@MNPNmbB!tF@-uCB%dhx!~iAN_+ zB%1nO{EcDo;{A#&$l^WA>{DIz&DHAaGBAYr6FRLEh2A6x3cbj~qR8L>?0VwL5SOR(T5~mF z;s?uuX^IzLrud0o{16F9s|j1J$WQ|2Ony8;@VSIE8E^4OZ;|y}?ro{sJGWF+RGTY# zGB1JdC>>U9A4rsea*a5XdPa7Vk^b=y<`b6J{td(VTd$9am~=IFq4Wj7^Cs z*9}M78TQy^Ie<6~$M89GGCyhdSd63HJ$dNiZ$mfbj|j{N!vU+Gt>@T+8RJ4Le36m$ zG4#i6qpoH7gyJzXoTk}P8BM@mZc$J-h%G-YV7+=xk{kAGYLJ$oLJGqmSapM9Xsom$ zrEY5{MG`0ZK7&sNnqZ%mdZwq~@8v<;-06IyEWFR{oRybG8$Zc>`&bJzd?75v7lO)l z9wL#K&`ZkpAvP;C$(*@g(vwL_dk#!FO(`S$r946@7sW!0We~u=Zxrtw3_QY&V7%kbdeTs}k9hSEaHity-KtewCX&X4Qb~k*n&t zBV|eU&{fH7|5Zz~hpZ~f_FA<(o40BO@Q$K@t(1g$tUNJ%9R+smY!B$T`@Bxd;)U!x zCt!TMJI!vIMqw*h^&ay9TS0G-*i2}20AT?XIVxjh7PTmur0Jf9h0I7dvVz0jPGEg^YE=1O}L`D{s=#W(C*p~o-?d?PoGhp9*(mqgs5?&S;-o8fuPt!L74lZf+Z^}WB6pll+TXGf2#!RDvp69XuB53aA zXHvGp+{F{{8%MHiaMDF$=`YW4d-tXfAjbo%ijY2x}6W+&diMZW|R4vAG{avkX@3PQ}8`4c}S=G~ns z`%~uaeoAt>g{|(Q)=(84jbNoj3?lj#^3|GZOm`BG%deG=aOJyu(UMq&_Rk)(3T;cG zAZd4;=(8!e5g?NDYyHhlggyUfinKR<=3ETqU$$M1A5C3hJcDdQpGIGc)Y7elU28DOS&N3u@tu8y zjod1T^AEq$VzwxGjwPrP?AmdjC1mKGAI_LDLJ?FGX=bY}Lc&;A% z%sHn?=0aAIPEGIlNoHd)@6GNDm`F(5n|{!i?YAl7nYE}IKqQ8DI}iQi+!M3gJM<)P z_0t%*8Q!5Mm}KdXNc=VrO=uLx%=su&09#U+-(q*K`7wt8CYi7Q)jRJ0LfY>+*5G?* zTet$rQtyy;vH9uo{w(-00Z^mKD?bOeZV)2)1|Rj0pxWW%gK9F87pFbOzi0UmPcks;d$9LNiOkc|zw8C(4zxtJe&el(X@^`xt4 zwr}r~9({JOHPAcJR8~{5W9|-9NJ$|d|} z1sl-TT0GKA6z#%Gq$b6o=1Jf%t6CirM8uTcL~jo?4^y+a};E{&$KeK=+0)Iz3e6prLQPkDOle@RE*n~UtNB#Vd z9wh(NT>fP2N3^!92+z92&Y5KFr}mSbHlDSK#r9Z5@{m0&QMkjBcjaJG;Fz##>gX)(7Z+=}b6 zTxV*Wu8!37(`xKq7IhcobHR6OO`&Gh$;)bv)vSUL)ErHMsckhyl!bL;thJ_?mfC4t zQ(`+>^OZHW#u{l!BW_I@k6O1zp87e)GNi4>&R6r(!rX}cf{((@dtL=Sjb5;=M>cs>%%`Lr&Vdeazll(D( zRM4O8>pyoUPuZ18XMV3b5+Jv^Tku~v{V1P3x`u%D zAmHDq{3%wvco48K_bP?S_#2f{_jVrom!obUO*HRL_E;S6qm^w4+i3RvO6ZeDXNwo8 zH8(uzuaj7|5`E~t3rtJhmALHw|Fqd%WB;#}@)aPDxM*zDhAjlW2 zeCY213fb@aRo9xx|3lupz(-YG{oe@;FhF1i4H`ApsH1{L8x)l&)gTd2Qy2sZRTS!l zB4S0D2=#)&$!HEktZlXWRBN%dt+rZiwcNCr5F~i17qo~{6|J>J6oP2bmSSLNRL^kLJO#7uL7Dehb zduYZU=o9690P71(4J16X5eu)AjPm->iZ}`|-Ul?e?PL@|v=a4l=!LbWMkGY7r;ldw z3-*MKGAKrCL#~a4;<0fgH!TOisCKI9MIf>B(jrQ_(4t`;oDZ%~zfVotH1<&@?W$xdzwfB0k+^t@*+pB}^rY#vI zFm#l(#Q|y*4cQ2i$V)c+=TEGQRK5kmi>nwm2a(wCJzDh-Z2d0t>7n(Y%_1)ubI-mZYMtxRspGIhWz%K!V)q|Gmv=DhcD0)&g^ai(2Bl z+m7bd+Zy=pZ51XkTDXjrL+Bk=g~Ro#FX}^7;IWWL;;7`V5F5qY!tk9tA7=jPiCHz5 z)s(p>#mdOZHovXFVr(MP(y8B`F`L_(Lnrh|ZoaH%Q>0EkT!UlcJta`=S4iZ&2qX0k z1hQRmWCio!=e|%dk7I_@3Fb*a;)6r_f3aYy^3?QOcwl`FFq!_oaJ~-^$ZjN60ZJy$ z&!EQEE|2EZ3y-0W4-h?WMzlD+xsC?EG_cg_?9Nrh@l|lVm5dE*1#FvO{_&Yb2YCR; zIbVK>t7 zFfV2iUjtI6jY5>cnq63~yF$ZRb7KTI^*N0*)f>^1gKXd(&e3c;$?^0E=UXn}gmL6< zPS{*Yy49TPc^OatjO8hS<~)9^gq#Zi5#q{R{3~745X#SvfBsLNUvvr+dtc`KBC}*) z2zaC#<0&8&ZFZq+jEnuo81Fa6q-a^+4tJ?Gc2g61CJmuv>S4JgwEyG`Im z9{QvEQOi)GXq_ZvlD&vJu$)VCN@=Ua#IQ={y#P@}Di}cz6k{1l47PVt56it+d_uTu z-*c<|3&p+H&3@NFR7Wli6zVju%Iw^GB;tGJ;LnXN$tjpNjCd*2^-b@D@?TG_MHSQ5 z>xAsLkJ~KLaDh%Ih*OM`*8P8SDfVwYHaA6XXJF3$K(dXQK@s1{b{qhS z%b8MA_e{zk4+0U)h- z9@BDE4*eot8A{XD@{FXG)1^y_d?q#ROuAR`*r7*@k_`^Cs}-fM#4FL(kvR9Qs&p31T*M(^&+zmGd8ZrIuJ+=v4-VD zG(@%$P`(MT%&w!LnuUmv4y+rXA^_`n*)nN>rUu74gb${zh7dlKpqHozxBReD$!xiy z&7K)j%u*FLBfe&S+&jqoULfUNrMz_=0THxeNSd2WE9{6e#n1Sw{Kc9{-WoKD=2OBtw(zFkX!+d>4Fx^R*F?@} zvJ=u?i~QF=(1*>MTZz=CfVH>9Z0Lm?A)eMR^9e5~C9JQS(##{Eh#v~j!^{S<6yOoz zO6Hbk@wiD`sqP~85}HA~;Z#+xc&j<F8P{|S|9JSUkjMS zDrR3JlL$16m)j$G6ICd;c7+Ik&O^T@j%m1Plhr}{n1d*aT_;qeGErLe5OGjN@tUyp0zzxO!H<>zeaBWD7KXMV_oTT27fM02KxyPXvkgxbenj{=Vo6t z%GyOkRU&kwV)6&`BqR*05Qb#4mR87FVI3xm`c-H$N$u@ZjCjE)NDN85tVrj`#I@?B zxBI75y06v)+GE3i=5E4~p140Q{UNU!Az&;HQ~@Gn zN#Qv7^^Qyt0mL44O zUi4emZjbKNp27IBTu$TCP}Y8der2R@U5D25;#$|+<~OX=ra2AwJZ)kZIWeW|?~xvL zUv`i5C9n`R;o`u)W>^oOvrhwP-y==A|HCHf&32PCrwe+U@}F~?q+i=@lk^MOP15Uq z+kiPh?UjDp?UnB7C^r{MCIa`wT)8J0{A2z?yoBFJ-`!n}6gEHN>9@b=Y$Vjw%(E#7!wyVgc8x6un7=YNs&Wh2 zwBgE|ez-JY55GF!CTBT_Cc!7(>ie$X!E68VJmp)u)V}u{ZJkI}!WnT0hRF!|F(&9t z_rB)0O4DlB$AFa8J!ECcb2z23&LjcmrYzzDA91!2JGw0FB$J#-G?P3?rb@Bw+~0UV z7LRtH1MFU4w~kiEVtTfo<694+LTWoR1yD#-F^^#)T8cdTpruIaV@)IINV`kX-VX?6 zCOpIOe8cGiIH%Gr8c;@;-L`H{sh<*zj#{Ly|_ zUT$5%>o!1}^_NAnfvaqwx7ndAwr}RCW_Y}J&RGWcy0ma!`Drz{XwGQ!EfI8;_|S|! z!p=q6;|R7M@D>Z8bQJG|IP>Peg5SL6Af(zHsrS|HID+-N9Y?TP#}RzGm*WT?KFeR- z2p6JzmT52i@?*%o0lfyl@f$aD&-Rg)Rb~tR>f@Fw1F`|lHXu!-csn`{(JX6duHH7x z-7{%fxQ)=n4YY~WIc|Gq4s4~5WP&JXtG*)zA}O?S=HsBa%PM$xv_9LFBpA_ob`d(^>0fzo(qrtN%G>(CX^<`r@0fY1Nc`! z5e{%8p#A_2kAl7yp&oFnG}P^O@{NxR2|-unHGEH|wr2Gz5O7i#D&H%4t2lJHI-M9F zN4bx};bRpKdzJ{9kRP#B7(RUH7latH&$$quKn>V@H>0LZ?Tp&YaKnTiTi!Z!UDrVf zl1f@Vc7p3CVXlXS*7mz#8i8HlWXPlevjxkz1p#YY(nnrQ7z{ZFE728z1#4Toacx!O zF6O!C6oR98=9>5E6PsnJx8|7x7^yh#^r1k~$UmOoywj&ZDrx&t_v}BIr^i;Nbrm_@ zY4m>o7$11{Ddx%NxXz>ro5r0aY*qalASHYd30nRwSms}4QlA`Vpe6fi#c)lo{QPf_7}4sZ-$cKgx2HDU}a(Z1%;?Ai^$>$^#KgB zokKeF$Pv({7vFtDv>Tw=zJr!fAGifTMx|z+Q$$YeZ{8xv+LQkPV9?tuvxyGUPQR;z zS97>_Km&*)Y5IU0xgeIdyRtkx0ncY>?V~$;0tMz~;-?o(I|I_1T{l`wz*~pW{U{s( z1H3-LJaDE>WSn{XA;%wX_7xTo=TcE%%59~l*+Gm)%?#C!12J5O=f$fSnR+%+$ zq=5usGa{lgnuoZpBS#oMF~^L`3Ijc95jc!fx+T8mi^P6`NL=zaYbF*U6r~77XnP%mlBHKZVQCsF(4(}orF7?vbiaXxWGqz^IQ-++CL0HitJ<>ty}L; zrUA+nLN4~0NSo+Sq*a(0X;!yZm}2E( z+lrLTvG>Wp4QO8F$4bJ>0I*!Cq+~KlAtg(LZ%qJJN}ff}S}DOsDuOSpr0gLgzDAp1 zMxK-_B`BJ#lq{lH=o+_J3LX$2`VaH+^?|TFY1dLYZF$`pHmz#&hX>o0sm*^S3@o(^ z6N=CEr!}ICWcdSNq+tI5sYkHx6crJK+TMc~5TxMs2Pm#pOhBd1Ul(s%e1iGm5L-O; zqqJClL`RBPtDZM?zdWpy4%IP4hY{4p2J^tbbfyc4q~;V7yr!x3;3m`S(B{vYNn83Kvk`(yI;pu#W&N>ywk|e>7YoD#Kv+7sv|y~!;k#nP z^Hl*CA6Zuvh;k_pZ`+`@CzRHMdFWcoSHRgPnr3F1{j|Ia*g20OuDOqKI73YG7TNSi zX#}FmEgIW=FhC#3>nV3n%tZWrrGJ>?QJZ9R?u^;~Z{n1w1L)%FT(@kD8wAy&Ej8+? zchCNFr9D@pv`29+^SnMYc~xJ@nZ!Yl_&cR#d&I>+s%B5pvcg|N3GLuVfJtQ$8+^o# zqxs%Z_=EniquiUb6xWLMSU>I`iR;g~&J1NPQLSe1$y@Chj3W`DOAe(nd7yj+`TX_q zx$>FYi@ii;Y%jJ3facV@m0!KX(&BO}zoNJKK62-V<#z&!JSS3e7)ogHEOYzzS+T+la<-tV=B)*dQ8swA<@9uqD157$@_h+ z$0mxE6U@Q0T+2D#8|b1mb5kTAsr&5!)G6m^PaEIG6@$9ib=!S3& z`*>K?aVoNKO`*f_ds#-#wxJiFNT=+&?&Pj6H4`C)DoQ5O-WKJjpIVA5NsSaV2O`)! z_dPV6rt1>>&=OVVf=~RWnh0S1agkIHhU%GS%1%W@0$NU#hP2^nRjwvdJ#k7o3ZF7N zs`G74lDqQliuwjO-JCciz^)V)*mp5k5jPbM+a1M>pG8H7BMN-WiN@JPND%jS#eoUb zQB<3di`zOX@Ly}d`PGtWg2N!YUr3vcHq)Ell%geWe(pZI@CoKe?lrlCY3z4FNuw|+ zp?DE63@8d&>0&N&kp?v`+scLlT21XjzsEKQV#H<>bUhZ%Ne*L5~A3z z_=d)=|Jz8C_vLthb0V49LELEo)&za{r1mZ@%&exW>sAxv1cmU!g`t8&AaH_EzPo-SfsgS zHHFubkGOeO}Iv|&Toj3zqbr+$eV$^3zzK)>usp>R{}HZ1E4q;UQg^;s&CI)`^i zaT|gF7gzW_*yGL&pnzyl+r^7#^vCA7h3>u-EepUZCnAy5JE%toR0p9*W+K~TA&oXk z3?yZ` zF*_;5Jt_BC=3`e~U&nO$E6G7sKu+DYDBgAr&0P5bu+l8)*xR=i5P6!w>>*Avsv<8l zLDRchdtZ3;!mTtWwgI0}qX=hzw4Bus`v4?ym8Oa$KDf(3G2c1Qq6^NiIT+beL^Obi zmbs8NYwr`Gfj%O1J}Fe}$C<{Vl$~)!ldjynJyr`AafA$F9S?1ZKoasPLoKfX^DK30?Jc`26wMArR{PP8CYnDKVQtH58bM5?tq)IH zikUQswk7HTmRkQDOVC{%7V;3oC$~l;H#HIsYH!qoEe(9~n+pOGHP4@Y?}XibT0#`H zDClZ2>%6_)HYw?dlI`tL#do`b-3h6f*gSR*WOij{d@A;DpO9ZNKRY4c8{}*y`Jux!0p| zIV(d}`(X1+qFF28=KyHsVm?;7j}@jq_?QB)irU7SWUdN6%mAQHGGbAFdT5N$gNcua zuB05BX*xTI7(Fm|oWZF_Ou>KIF~Rwakg+N3fPjGk>+=4^(N+HNK^)UQAo#jN9kd~H zEI5zlLy%Mf3y?GY`C;4|7Ev+>e@5o6A?T$ot$pr?4WcNa+y3q|M+1PPRzGtcFqXkg zIUs6WIE2z2k`-n$@0N;_+=nT7HJ7x`GNX8NQWpoJA*^Ba=xM;%4fy@TlqqUOD;{b+ z-xOu>OMujxb>M;*H~<55*B1TEKi;!tvZm%cz~Bu;8zDQLUCO`qB@GK3+2 zeQa8!aKJKVl&k9c##f&GDxhxo}%8n<}U&BU9Gz<@sJf}HjeFDjO z1*`_bDPXq$&2N=00Omt}Z1FMx#CfacPo#;9A;E~Ql4_ntdJ}^(mF=G1MPc(BBHF_J zTIt;rr1xJ+ug%*Wt3xV$Pa{V|^|cKgHr0Hz4Aky+tn*r} z5XqNj-h4Mm`tLwW`Ya_qGvp1iK4c1XkC@-Cn7a#r7Jd*+OTu3Pcv}^zYZqJg$A!vS z4+UiEu5SVT+5mlyMbGr&Ye#_x@CZj<*mK1R${60PRfTi1wxJ&t@l26eBx%QWsl9 zTDFU~jpDpjS^rnHx#NfJtfr#LSM;*;715-sl-sSSl9}}z{RaID0IE$9YIk%^oCHCY ztyx02W5B0?)ZmAoLYhUvGy@^2&v7(FQWFT5j?A+O)$@?hLxM*gSP?hde-ISSZ)H0P zTKEe)NDBm@W?#Q~D30i!ISn05GAcRal0y8&i0uGGz6gwBUi~(x)xg?$jrKxaW`D7( zI^0pH1;AW+L@HQVx5uW@IRGq-O|d|5GoiJK3wp%3*PZMf zGM!G1b7<$6oErb761M&4!$3+nkA$rU=16h6w$uqQ*Jlyye8ksqTy&fWXij|=Oa%;g z`{}5jE&yT*aF27^E=-?lO}sPBp(I${dZsx*Sy&@oAu3CXED(%v$XrAZC_HNGr*j{Wyq`q3|F;mIT^@oD*e+0m{v9I^Kn>-r+ z11(U=?p&t^FqFg<77H|I(2k#sGlLJzopP|6OpOZbYv5xwnKgBpudg;OQ>^cTX><0N z@!8D;UVWrX0v})+3HHtXhEOfz14&dvXg(QQW^%e0y|9UJ3Z(I-{>(>5wzaYEU0&0M zn!-VApMWNIRj0mY7Q))-A$_$aR9XPYA%HKXRxVXRTV~b4)Ni0c?CQkZfYczzok&8I zim!e#)h;+Z`~qg{Z&UYE8>I;iWwVjqkwU-6L$U^_{!*YhHn;qd6$-P>k$EP7o+<>g zADn&Ts$)l%st$l(oln_%?G%sIeJX_2c&bv3P61FcIK}bWpQ?}6DUJ$IJpiq~(zfuo z{Q8aXD$At~oupr7z z1i*SKBJ-_`Vv9<03G4-{VQ*Ss zbt$Ww>vWbfG%b>jpvToX(ph*CF7wQK%mF^x9U&`uf!0wBeA7u$mN^eONOwCNQ?nhz`*CAAbU)~5g3R1;BN!CeI3ouHh_gZeRsnx zfHbrn6xjB86m)Zi5XA@60Pvu^5u9N_weAO@!P%eQI?67R=nv4EtPXsyJyflu<_F=E z_R!DT!A zOv@`FOK3I9&oD}c4e~#`1rC0)jbe&yPpAB(Q>Yr>RdS^QC=H@N2%sJ*D$HOlP?XRKE`^Xgvi&6u?g+HC~u7 z+D%E3qR=`|vF#mO;0C7wERJTdWw~hvd!zg8!WnnES384!rT79uki3M<=H2NG_B}3A zr!&}|KW9B|_c`lCV$b>NZ|^x@J$i5R)xT;z!Jn^AeW_{cZg!d)foz|mzWy28%cA*n zrl=EF!XTQSp4vV?9rj)>Z{ob1bD0IN-SPIE-sLNqMI-3V*3)Zu=!6{io)|Q&d}U%l z?I}OI=I~74?w!s^_i7lMU)~fs^VzAlk-$Bcsv`0Z^Z84NxSf&i_OcV}A0F)nKwoM` zdWE9fVa{qGX@vub-aaF(VNMZjV(!Qy{?td@G!Vp&>z%L$?8zZa(R4B+&FGuXX|E@T zoItudIpi3g{($93Kywg3wm&HXKti>diY2}WE z>{`!}i}@h=L9zvjZRNpT*^KVo#CQEoFxT}71}+M-7Oq9DjE%yq#S)~$RF?k3^d29K zU8txJIr@a>!tyumAW%?&lh9qhYW?8EIlK52rzj?~5aXuWemnpAR zQ?pZEi>V&eaPxY7&2m`APUtNG_}`iGN{ir7jb64Y*nJvzGhJ1<8R63^-|Re?GRf@h z&(k+Mqkx$sKttWwv)#8nXZveAApaDY@a$C8o4ngLe#3p3qAkR0Tm-B4Rsz#=imigF z56fbqaWtT_xqO?%+}F2*3%c%xjP{LVtOo-#$jy2nQ>g1W1+WM^Dg8v2xsPZ>p=xeF+rVGzfrG%1WT2NfIFkg$78MHlZj^Tag>wc9#BrOc@`Xr1uS+CQh>p9-#;*z{>YCRO}b8+ zCICsAmLHBZ=^TZ?eMR{>>LYdQ--+`xe$2&SvL$riY}AANs5dGqf{5YRqKs7C!RAc9 zqT+p1Juyf{X?mCI+<(|GGd$Ja=iXoUxi{lMv5v4t0Q6{)f1AKt*6EFX(9bO53u#&> z!B2$6aGKO{{Ha`yaQR2O(On;?M7kQg}DG&yw8(C_51xUy?}GKEMCkx3kLb-mq16 zqNw)V{~1oP%I;Z!LC5FFg-Noe1-a0NO_xIed+ilN%`^DtzX~%-( zI=kWiEw|zRE_wtc>O+dr$%q?svaqvJ_tz+;)ZczQef8H55Jn8sP9w}km$K(|GuDo4 zZ&pDuHleMfBv>*klIpEjd9XS#=+<@y-Sib1^s6wZUnnGKcYl@T(Ma7VVnxf8Ml2dI zWY}3pVn~F{XUM4egt|&&{6Cc;&$xE)3^`(QmLdCK;-eY^h8+5|&yeK+|C1h51$Zu@gq5+;b6^ zgxyCoI8xVywn+EIa2wn(EX3*a zgqBJ~6!eB6o}(b+d#x*L5uKj~-6#K^omA$UC8gy2^wisKI?Ae0LkYo_dPJ7;%;R(5 zMmGkcC>qM}RX!7aMf2Kema13@3CTTNZH6bDHO-~+-0`NBy?;i}(kt8jRYaDio$D`M z1cY=_E7lF;Y)){by8YFXs&AniWvDfYk=q4;yIb#OS2TXXa6w%Ku>$?So7=UMwyicZ zXS*uB2GML|a2E1IlnftD?u#1kbP_tx> z{zfVXEkslLHtYCu!#)s|@!q>azYnApaz=U`m%54Weve6VIZNFFQkXS0d)GYApP$t{ zD?=SL&q_*dyTYdczP#POc7D|Cb}xWi{&*=t9*Dfx=+1UI-&@JG-TZWQh41VyL7 z?W~||2dEE${ZHAf{m(P7{{htqzA#nD2!?)&RBdj!I^g2r!^FkD;6+lWYQPW-0h#}K ziu8OR-&4SRl00cDLU+OxT7R}=)!fZjYb)OcAR+%LWK5r|@p;3D5RQ&b1WqK(sw{aG_NQQ&10oB98@1MVcI$dq{S0eJ{ z76N#iGHHUbal_tAt)Yg>==HWYXbgBJi5m2cv}<+;&@giaaGYnZFbObnT|D}00Z zMF5Mp%iHRX;lbKv{X4<7qK^PTH=1(BH0m;)qlJ|k~7#I2D3Og1+ z)5&|_il3TElVuD)zWbV6&5xzfetkPBT)w{gh5I`y)tqGu_by<25`|xwgaJ25;&~;} z-6rvjz#UHpHRwtp?P@2)E|Eule5}B&;E_ci_Tr&T#V2+;Tun>46@TyL{%KC8^Oe&N z$f-IrPvFhjOm77e**?Kk3ziEhH@7AMLvIR$xka4doq33#_6pDW!o1JP$@}Zdu)oc_ zRKdO)<`@{M3Ez^E+}cVa3Gnj!Pxu1!Hvn+N0vh?hz-u7(YuqO%_8mn20lrvC_$2_R z(T(U#+>+6C)+~K^RNlq(e_oq=2CvF$bMUCeCBPbS#Em{kX079STd4&aUGP& zd(B$uh4!R0txp_m*C%E*i(Tu;pfzmzlGr%vYNu{{D4(6kr7i0=0JlCd#om<$7GZX} z^zwPo-1-lP&(cfy+it-etYZAf<&o(ifqDRQ13xzVYh7|IkIZ~Xoy?`Y`)=IHLL46; zjs;k;iJR}9()yX!>&+?cm?sMJ=m7I5VKxi%SYe)PqV1Tyg_##%e$F6t#ht<|73Ki* zJ^_C2?*N*0{Mcf?BFve>JPJ&+f>$U0tAWJFN8_f3VIJUX`_vztb35My&bbvBHRsQb z&9u7o6+3+%9{5T_B3e{Cub?4uSaMz{FHx92%}fN}^1^wF=(`%2K41UD6x@c^)o`Lq z-ntsTF034#lemG^Lrz`R%-T&=UO6&XRfdLksfjZvmcg~>p&MFF7fm1H_pHrJVFZSj zPw))(e*ucQ%&!4#f$s-^8g`PAZC&cE+>*h}{lMl%#dV8|t_3t#@ngw6BPX8iN-L$; zc- zQ#(~j)Wx*+AaOKE#l|DHrOpol*peZS&}S@^+U6EY9mw@rk>0kn)f^-67~?ETOS7|F z=Bm2br6fdp2_BepYAOBshN3`B!Vg`&Ho3>Y^mshBRS&kQx<_7tMkH+34*_8Q6!Ms! zPq(cUX@lwF)=G0MG!$FUaGFzH>RxiKixnt|oVc4Ul_GUzQoy$_&Y7#eqPY3O(E|%D0md5d4Rff3 z%a8z3UPYimRrX|C$lDb;*3R4pq-3fv zVC`gHv5Kn6JOO4+7V#w?@o*vLOy>2qcZywPx0SLHS9?l3v25OyKJYD@Ch3E#NUl1w zLf}JySgsc;E34Hm^Rs%U4BATMYliG*9qq_#G@ z9?L=5!V4%85Qn1HH5+nKUgZV37;Fw9Ir5V$x2~8rCEoo+%S#O4v(}Uqw?*~KLO44t z8EUoWVWz<)5NfU{tG*b7lzWSv80k8>?ZneAh*GU0Myo=22JqbNgyQ?Q8L;<*HL)VS;Qati0}6T@hc0@hdH#=A(ZBLlB>?h>0*uo^l5n* zpxK`vOUpul759slM~RlNy1qn;Te{_Sj%n^d%a+|~d1T|>XnCAy`N*RIEtdd^2)C(j zUsVxJQ!uO$A%10AZp)$Nnik9{GWzFx}kslQDy#eywLLMjN0Ybh2WSBVW6Mon3Ol%3iI){lLW=t(6 z-m?d=Onef_yB^>)AQ66l5#p;7{-3`K2)_kL$($YTl<=#wh%fkvhYIm46Mi+FSfCJo z18lA&x$4ZX1zrs36aGR#b1pxY@M8d09GxY6gi*Tpw)d$SMELX>)5CF74wPy{W#R%k zgn}h^%vd@Dx_fVV+ahN)Hw^7DuvwGGg=5Wl2E7m#!^rll_t<{bypO(2?z$p!%T8iB z!v38gQDg-&^OXtvVUgdYKY{TumYt7;4Cb4lL z$(PiGk_Is#W3kHV$#L50z|T7#SMJ&FCa#<%AV)6jVCSXIL-GP z@n2NtEzRR11zrxG!V6E%5xlB@ql1s#=$`)|YzzPUMDG{QtXI2Fjcj07#RhJ*yoTph z2iID}Yk0rvHNv~iwC@}K0(|02?i=t`$8NIlKUV>h=!U=X--hSegs;*25w|&LF~`~Ba9y#vhis$&q18F^M50T_5C3YN0N<9S{NoREbX9Nr6|W!Q<-t|8Us+6Zz-OnwqBJ6T@#$Q$;7$k2&FSgNnSeGpZLauI1&XSg>b&x`}~xpp+5 z8P1Q*uR?Dp>Z{MIUk6_Cs0uJp1^6dF4CzEMyooh)vvsO_gLD}hYgi#q;&Z(2Mv>7& za)-y(llV)p_HN;PPhb5S=->cz&x5ML`R$R+0z#Zg`$HhBri$@@(Ryjwd2$_ElQt-) zhVnI2GV7^^8BGkI2xkGB)A+GOI2B;U$I^)VH{U;vKX_&!!OFNp|+Eq7k*@LnOEQhajDrOIMri>qRIv;#;oC0XRu2>oel>%fF?N4*r zM5DpyKJK#ygKj;S9WQMDwIBOq0Ajnbf@0gT!rI{Ti|(@sCp;E>eiQ&!9Bg&~ z_6nzmoCT&0lj)+^FaX{|0yw&ZNT*zzk|ok)SZevn3V<`U>wc{9PR>+ zQ~=VFXZEoH=Ag?_KfRX~Wy80hZ(|l_V`gkX+};lXW=R(FC5M?uh)eP*7a)V&1^mth z%*Y1()CT09M~ug4{)e?7Fwb(A9ylrV==a%5bbGVFvd>nQL{i-3nfIroc%Q#3$|G{q z*+IavLsG3{{rxap)Bdgfm%Qw4+48RUN>gi}%bSHfu*KWD<(;Mvx?QpI(t$0Uf3?qP z?^Tje+s1!)^WKUqx&3s#b2)J7&Z*w`(p?Q#?ws?-?`4U8;lZZcgiZ@dnAG?{)^ zthsdHbCD&_dCeR)-_u2^D&3WQdY51PAD)+UBzQNu_Py%-AY$jTye5TEg46 z-bb|G-J{P5)xI04-QH`~zO^f>Tl?iAROHn@TUI}zZS+XoVXrP#{DE7)F`q{y`D1=9 zm8&PTmUGnkld)PtyiH9XhhmYTy=HX_o!r{>wt}+yk!@p!;{f}+i@x4QpM8OiI<9(p zmudh0fOFi3c%M?=$oC8ADl=vLK%|2LqNsi=M0y*kAyhi>;|X!LO=$6x`QS3m*hc5C zQuY^3zTm=UuW7kp)0h$`Z)-5YJE!ci3)g412f5Ohs+t7e7YoZ(|2I$hJw8E zKS$2Uq&{NfC-1miw3n{bdpliZ9;Phkjq`R$lROO!TMWt!0V_Cv$$Pr|-`-W>*{)DAU z<0gm3@@vNHe3}sc#BLlHmx$`(=hO{~fFk9{x!Uqb&DC63d|`S9TKLRRTa7<^e5UKS zPS$F-^o4Hbct7*E`_w@DQL~Ubo%gWLS|^x46Y4kD8bD1OnPmXB4vQ6XRT%2ktpq*8 zY3N!^6{Y|o%bB1Tdi#3kguLNlZ%#P5s>t!<=0R(Z!N1%3Hs>FGUd;jDG+B}?OZ>Zc0W{7LmGEE_$$T1DX%$ILT} zFfI;LqrD6ycv*{)-_XglTIgG^Z(RKn%RTgQyL#oU@)~+C37+X*k+oygM`=qHk zH*NH6IV03XNt_XG(Nz(7-aH6j>$4mA>^%#9x<+){l?n6Q|3vu8MO~(+B(1KD)^x+Gqhv zXYslaudDMhzdM$rw)RzFR~3A#IjD(y2IuW>O@0_n*Mz-|Z8gz0t~)p>ZtgqU%2w^r zSl5~mm)>5!fQ_UDF_<`n4wNA{hVxU2l31UULXr1vpDb@V=*r%&&%0gB#HeGg zpuhUp`5#U~M|;mP3);mDx*ILHm33QkWO&*uGpVS^bTAHYScVI~mjHddHCJv+sWqowTspj?7#F3ieNPrBKj`Tt?uc}BTMJgy`hzl2r3ZTlrNju5ai@I*N2U=l**`Tzf4d_!O z5Tim~JnYRaXc2+(GFOWr7lJeWQ006XkZg@sf=Rv4L>k*$y=a<~k#1Amvwz$^{Tr%A z@lroRhDPoURXvrawKMwpY2K`c(p1f%Y8uUR3NRb*3=j>FGM7sy*BKkd*f`!dHp(); zCDH^FB2n{8MJ-XeANHeG5>@5?o?qbkeu1y%=^rYu&zIZaeibr|;?l5T^Q~+#zU`;A zPQ_GtO9ZIA0!&#JafpwIdv}lW?&p`c&>Ba>opCfg?5w}}tHk=&IHGC9c~aKJEDSm$ z1S@!F`$kk^0B1X{4!Qj>h3R=a&0~!BZ0GVQ0H{e_I=rdoZJC;RiC;4^`2im+6Wt2X zdWRXtH8vQy{*_dR+qWD;Y#$e(mT-nxz6(%QUBITZl|V;(X6dtsuZS*xC%$!o)2d5< zb?jB!m%n`d-7mQJV_BQe!E;^8dy((iGi0B#Rp$#uZ zNTRmt6)QY$D({x0#+sK727S4ZzHIuHUn>3ge&VM;W%u+aQvOMle@esH0>276OB5Zz z5lTfWx&In%7^?~v`maR|V+W}GQ~u07e&gxl$LbQ%m_5dIJZrJXmNlF;n2=IG#9pOc z`>4HwcL?D_1?Lc|Vy3G|rF=MiAH_q2(&_dUypLCS+#F;pGAZceP_Ijix5KP|LmzMp zExV1TgmRqg zg)D>g;XCzFb;xk}Us;qsy^ne2bDJd%A!UbXz#^>?>aN392+=8E5@I+A93T{8)ElAR zpS-&(vH7b+33&_fNT{~v-Z6IYp&T8H_u+OMMkC7G`OS8Y?8x(Wc(3g`F;sC$dSvnR z=rplp+ngeI+%B$*p)u}I6z|%uXLV()r|o|rUBR>usg3#dBd#utB)MCT+hG&&$MW%e zR3^9O*BnJq&$`CMAqe$nd7+y9)1!*HnRInNnanJ5m%xKt#Ao+qUy{sz;gres^)yCu zRa6yq{*~RzD;EDs<=yhT|F!bE@%F^>v4yl}C~}K#wrQBfMS-bxk<>a~xPZMaG0_dQ z@Zm*jzfYj|v~4mu^&++N2*`gra?>?D%|eEV)>&`|fLQXkLT^rP+|~4tE>?f8S!AWa z+cfBz)?RjM$Q~+Wx%#TYbahdBPShJy=#7kelZ#Rx(fdYaO(4>Rz~M;U$1qF7hPt4k8=C^M)TT zuZZF${zVIaQ`xnIenJ*`-skB#Md`xz>B{w?dhe={zRdJmuz0L1r1_C5kO|)IvvOkodr27$b+Fggj z?{^+9OEQFD<@356zh2(7!TK;S`=L@FhU-JUK3o=jz#k(iG6|;ZBE1ozFczFnc#^89 zsNi}+o|PJ|^Bl!PdY}xVl!8|VzLf6Zl6|=2LtT(8J6)_?6{}eO02%Rds6O)4l^mS+ z$XVIBeO&c~bh-CJ@+=W8p^^`_OOoa;)Q%ERrKyoXSjQ@iB(`Ogqo-@Z!#_0Qz zY|2?hkLE9<^0haQC{15f=&j!r`Tgi<`T9s*g3sU3mq^{^fb3?-t4)8mAbqA4C2j1? z9H2ClC?h7H+);{eLO0+gia73|=veSr2F(_8UN^Bp8KD8DtTilLfTSLfAwYoPm`qC2%UF7!=l-vfn z>3IPdJ3UFUlXDBW?#CKnEfocP$*Z}hb(%Sg)T{~}0Wdsh{+gH_Po+nMEx*izUlOBi z>n4T;IEi=YfRi_b7=q};FNB4h>KsH)wui^6wmIG9X1l8i47BP}q;3I9%L7FEdkDq0yACCSSNKK|q12Vt-ny>L-6pc4!&FbdaVqasG z_!=vwx)WX$eTAuF?Ihqo??bG{8Xp_Fe8{i(fK^Fgg$>lviYRj4wa_=uoPVb@*0TEt zQh)&}Ko~2_#DW4WJF90%~>`xA9Z! z6~t;TP1mFHSq{%jBqjZkUMiWPdmhj(PwB}8-Zu08xfC>ifj?r|MW4ckinnXt^|jbO z=*7Pg=1<)m0qN7acpO@D%AqDY51QyxA z-HCVbk43yMm&;H(n-00CQ&BFr<>sQm-E&#OLDPPxBK@u&rD06ilzk7HO)g;n2bVhg z`X+shdA;7BI$j5W;%TkS)5p#2pWD+2KW6ad>wARlo1+@207xHTL%=rMeBk8~m!FAZZ0AXpl@Jq$qP{cUa~oqJT<>2!8xkT zfGijjt$QX?S4%B27w~nN;+hNxBgW04HgZj~dG;2@3D$kE7D(O2LQq@sgzGC0jNYeh zz9f&9=;hM6k95w9o41HXo{5En8e4{2UE_w{+5A%*r60x=rk-K#kd)JnL-Qi3zGOmX zsh?7~piTqhW`Qk3;sn1=QZ0U+rYEms;C=P#kI&dQ`@&{3^T0iX zufW%jQC~k6LVfASurGWuL{*mG0AD|rF5h}YR>aGE{aEblffAZ9&z!>1+mYUb*3y`F ztW35@9aXjux)nK+@2Jn!*-Io z#oSC3+b&6f^mWC1XOx|xP8sENw0dE+xu58!JV@*$mzWt41RP-lVrKs!pilwrY|uub zY!!9_NWFKePbz6Pr%zstcF-q%Ni9d8^aszEy-xJWrF?Z#_+K|mpS(<#v}m)r7Qjj2 zO*SY}cL%6nLJG%{4*KL)Vtuhb$-q9oKG|%=L;7TYGU-I0oMOw6)hEM*?{s7*`sBrw zYSP0-L7zN&Q&5woK+=p_QuiflatrBDlU2m(T%TM6;lEIy{H05$Y~uGhH;}N|haam? zA^_4S`9Z+0`2_4mpL~ch)i62cy>2f42&co1XqIUDRP!`ZECa7p+;)z7m{-eDzX8Z9 zmi_np-%u>?H0+^Rc0Kde6w5_!@_RSMGOaKeF1IU|1hqGpxIrqlm>DAetYls z+xZ>rH#S8U!0f?pHf@Byx?J!gO!^wG|? z^zgxLv&-E2&*6i8@5Age-}~@0MP=^)PM*Fk{X?6`&>Y7>58oAWvY9D#Ibg2@2-X15 z%X4y+hPs@uvRO62+&sfN5AN?ufzGK=-}INW0U4^KhYjUB#|!AwunNkGQ>nP-C&{J? zb6g=Z9&^DGB4Q$8pwv90B8SGoU2zZgjS;YJ~?@;C({ko?wg-C8zIxc#pkB#B4iVb#gB(=jT)AHPOPYXMDlihDHgS=I%S&TD#w7 zPQ{(kkw_VkEs-{mWk4ivhqvW_MyOe%Sf6W&nLf7)x=tzoB(fN49b31STY(0NG*oSh zH`dXt#MgJC*sj+7g7KJ;BXwKxqkK79zTGf7-y0qf^c)d%xFu-n6VhnatibhR0-IWv z5r5#=DiL=qm0HZ{C#}Q(Bjs;AZ4b)#Q%RkS-q#g<(JrHPljvF{owDQQOgY;LY$TP@ zL_Y#s!qW+Cr0z}Nj8TA<>PTvpkMvvCQ3Xg#h18sb^fMpnNL|fkMIRTFknZJYcOS`o z7OPmVFnl$XL4FB75>0$vZ^r<2v0BK4*l1^lG^zghTHy=~_gjL^rBhy=?AGZoBP^UJGBu;xc-zgDZe-eSCsrL}hpNiQ&1jx#1F}|(n_tj`-~dRa z#f4=|Yn(bVTGOq3a`>7Pk(LnYc7xDp=@8$;5YT$*ao@=SRdb^E-LQ8NbE@FvWtQ;M zGExQLVSUHm=JfvKSmIJ^)8Di$?-j)6^fGVO(3*o| zt-Z}FK*zb*SY-b^DuwpstAZ}e#_w;67dpXb-~rHeUrL01^Av_8MJ?|I68ura6& z8kqVqWs`4kh>vXYIPmGa{(P{SU$dkaHZS`tb3udFPUk+lL3XM$s~{Y`3K)-`QII}6 z>b*uPH{qYmOYiT!(>5pEHYa4(FR|53yQu<^Ol0cI!b+A``t#ja<7yZaO`KJ`t;?*+ zJ#P^zNgw0ea2pa-5*zLno^3Td#gQ)nnr42i&S?aoK6tYn)zj7C@@HoqFtDjBtH(!# zywPDd+nr_YWo2Rsp9AcAb~+X&MW9jCRK0AKu(!$gCx50t2^7R} zX4z~hh~u*TwdT)#{h&o8yXl8C*uH+a8Bm2ba{w$OB@{xj_tXy(XR99^gP2M%-Nw`^ zAn6Agk?04V`G9`trZXR;Cv@fmPj}|SNUcc7)eoP~3Pit~O(rqb>W5;bCH)}4tj{8C z1cJ4Ph}o_ojy}q22<7B7!~r%Scf2U| zUt(20mxtqD#MhhudU?||THP+~@N42qI}GhwGnQ|#Q>=XbH3uYHLf*DY zVqWXF~3*f-t7Ezku!5R-Bl>y*I5NvgWvUDV`Iz=>cEu6A+<^;C>kd`lX|+k zzyeu-voD%Au({>GF+J}*&NVMHo36Gka-6EK5>Tn3`OW2@&RV=wwhG7Nq~7J3 z(J72JB$E$hzDYFi=|PP)3OFl-^BzB@btW8PSKNIHB*uymK^!#VFnXA$7fs+H1{>|3 z{ZF$`e{KIsywvZxwExFS)OJJn`icIOyzKJ+Lj|mc)dZL;vxqeokwrLK=Qiz`%DmMT z;lAF}EJo>Fe1i-*--dq2+}=x`9w#kj*Eh|bZa$j*429lk;I?DFH>{;q6_2Z?+MGZI!04X!|kRa zX3PIB5}kb&w2Vj(p9`c0+Rrsmw^m=&-{a}EkW@tve!`|mF)Z~<{1~s0kQMZZ013JP z^Uv=Fh+BY^^l$XNsJ#WW;IXeS?A+24SOa|}>;>(@PAh4TKtJ{fT-@3lE5`*~^G^i1 zlidQPX}4RT&|FEr)vb_$)l$|ZYCX(+i!guf!gxR>Va^nuXmAFAq%J1+ZI0vn)x&I? zsamd`nr*=I!G4EL^FP#4rc8}R8z#l%p)YD+IZ3)p!;{v!r(=lJy$EyJ!RH@)2;gY{ z?*OE)Wu*m^4a_$sPDX^qe;!n5R^@sQ= z-AeQp)l)N5dguygHm87Q(Mm(O^U|N z9h~M)#(w(3k2JWf&9(j~NaTo{`UPXi1tW(OFCIP{R7pcC^``)+kgdCcBaVnL1f^8nshr-Pkn^!(Y^b zhPoZJmzFrBUQvN`a_*MQY#3vic)+B-D^L2Lu5irL#&FwQ%!_Ny=`OggF{;)SKCMaW zFbOA7=p8m-0Nu-_RZd!5Rdfxp@TN0TCbi5f{Mh?E&Jg1@#N{{%aR~cMBx73en6Rd* z2;^3knn8IelG+HE<UXeAHB%*Ju zc^UQ(%cTpZ2le_Pkd%x;O83I0@Mq-K5BN@V)sa#z1Jbg~Q zWq4dUde3fIyD8H2qlLipxARl$b~G*%cuQKr85Z5BBSTH|D?b+twyff*pcP@Kg)t4e zEXDv{Z@1nhi>muy*4S_T>SB!!a2Hfr>=KJD!Lg|<0?=l39?)tGq|2NxEwMIIe?1i# z_$<(^%>)m6##Mu+K~&s*=QG~Zh2v@0P*!vf#K}Sn#c8a1lBCq*DK85MVbn-U10`FD zxyV*6-))Hyk!(rPtTS`V?^m)iHq9bE>f*4z*uFjxyvFM`WNTx;s6LU@MDojA?lP^4 z&9vm1)}D1G=VKSfGAgKJ&U>y9qrW=MF*@V1HuF7R9HY;7!F8|o*`3i>d(Do~SLZN# zoV4iN8;B)lg#Fm?DQ3q}-e&9FS$QbDYw{{vMH=1~Iu6xoe!Aici$Rma8X}x^e-ftz zQis|`#rXh|&n*Ol5^w<@hIC3>@&GAITk(@~1KY%kI-@N&raPV&EA(QP_}lMVohkj2 zWvA4?)gf`i0R*-hr(x7iX&GPX{1;qhl};%XO)rcs0*xcH>SFZ*oIi?fq+QZy)7eH{ zFh%Rq5d*y^d~@689c|txFd-hv4jpCcwXIP7J~`f8k)dUg>nuvzJBx_sZ%jIA`-`HS z{z6Nr?A$c_hd*K-Z$qYl22?l8Qi2OU-5IRmU}-Ci#%X+0o!;2Wo8M2~iM8hX$w*2E zzNTk~GAHSItu_P~HOvXKfx80LumCl;U{dUWIvh!FQmHzO-@owm6ZL&+U}mq0_MISNZM{Yvj0WeZYSTR0n%fN(t~4xs{4pc zy{20T8&lXavXBx7I<7hzD7fB~(J8nw(Tr9sSQb8o-|?~IWig*^x$O*E*okUY>}cTe zl6+7O)UA89Bup4`Yq6%-Bo4D!Fh21n!uV0Bmzv@-sEl1}an9#!g@mRuHcKF40XSV? zkp(Xn7`5QJnYU>=I>D$@TdRka_K4J#_QcX~-LX01pF7$z2NB?=%%^@w&2jIgPHTj* z2h4C@oKbs@3$9yc3EOcQ&gwmv;T%X>bdS}{i`31Pu3oE<^hhS9n!34SE#t}Zq15jnjK4xBSo-s;sVe_l zmpBeM9t6MVe48q|o->lVoM4^#%4wTG8VF`C5$3alo>>aH@-WH9gm<%pI=6w&wl+|B z!P&BbdPVByPyv6CL7Qkx?L;-DY$gUO*e{iA5Evy62~UOf&ca&nMaVg7YFRd9E?ye0 z<~=8@b`&(6CU)&SoECP?Je&r0t=ttr8zK7TWyVQI*~acpALSbRbi%M)zwr_6d;+kU zeQ_Wt*8xdTUMBcUm^)`*X4~@?Vp((Na;<@!%a1zPA46Z)!5*tddjgaSJXgo)bs;q2P z#Uyj%)jbk(ZcW#=F@+k^3(wssw@2}`RCtr1os6y=yy0pu~a6?6Dk4*3G zd+4ceUMj{)ecMsYZar{|+kOeIQ;1)rq<;4%N-7jHpG^sfzY9pjA5Z)=ly=vo+E)nkr#dni~doNLO*ZFxQrN5m8`I?Gr zEyzf!kzgkW%|KQTG=wu_iRL8!TYds^EOuO8B0E7EfV8YZY!~niAXn^!%ZMc#q3%v7 z+v40d&RSJJv+u{uPC+~g8aNj7Y z+qf82qS@~(y^fMBj#ZcdJAHeW#g$a{6IM7Qmyp?dQ9#%{zlh&OmF-U0rX0fBB3jx$ z|LvfN-Bm=9w}R5`LEgt%NW&a{(SqR`LLQi%&ob9t_eJ#l>EHQE>zvn`wE_a2dM-J$ z{*khas9Rt*zkg0c-@q0)j{4=U?M$6QK&tT%`Kb0lfu~O2uA6}v4BbwvMe6pU^6AN? z={aSiype--ANB!+u%l+s+AW`!f9h42MQ+|#I3r^Xh1WE_8)Excbis^hX=GrX9Z#Vx zqS4ir(b68ZpZBQ8y_Zfz2k7HQ()SW}z*-rV_SCp}Ng{geR6@fGDx+UV>!Pp!rczfr zyjc7RV&w&n%1Umfm7cbdi=?d!d~MyAZ8LZz2BhPm)LO4PXBlCIWyf?;ixQGcuSf~EkwX;&jiG+-KEU1Nd&Ok6 z$!C*9NexleObG{mn{-4x8F~TSGK% z{>35mtT7zO+LHizOb+rL7CGW0w}6b8p)6=M+J`Mu3&zLf7{{!}(6>XS0e<_}#THTE z`th;RQz=Omr$Or-{L$`^%K56)f;_mutLTR zxgelp1(2jccU*O(qdWyxG3KsFj$CBB&MIPA<+2vVxVKfwb*uG}RjZkkNW3#^LIV@a zmK`h#yoAo8=$m^!aUvm3+Ow=X=2`_^36$p>>k`x>e``S6fpoDh642hg+F1;3wV7yM4; z$P99~e&-KLEv$~!(d7W{iTsKraIUik_h50sJtStUeY<6@seW z=h#t{slDRQs~R)7t=ds!qjr=`6sd;9_%JT}VWwVVt`?(!xi;0D*guHYp59i`t2i62 zo%FSo&UDRwXpd2^ls{>*AXlkl<#5^|&ilW(dl$HcW>yEWB(tPc_V;~e&RLcft6%p1f1l5P&S%ct@6S9l^UTaMgi@ih$E`M! zq463wY!TPI|ZXxE|AEZS{GYWTawu zviDc;!E2=YM_A&LoFiM;kU~8f+h1%(NR`uqdbD3~EC_I<^lC^6fQe4M;bt;Y4U+E( z7TCV;M2$gJNFJ0b1Y_fkWVU33P`D-nyKG}o2xO!)L$P|vfPG;q0n1tr&swyUMz(U+ z@GzINF^@JGaXS=A(#nN352aT#@*=x$M$I~66Km5cNRQ1|?>I6L5 z8(2|4A&NzV+BTf%v%U;^MiR_oK*wC2xq-g){9Xohr?QlyorR8yb}xdrTL#!&K*vDt zKDc97CJNP-<#@Oj5i+VplD2vVr&=&OM|wuX$P7wOCeE^3feP(nG3+_*f?d*Vw8Kn| z!iH74`Ww%NmT1&KG-e~zGaHSxZXD{$?g%-%I~g6oolM@KP!Aj2sE0i!vQRJ&6j<&-Ni_=XePkyvH`4hz<;1WvK_?f8o2d@ z@rD(FIzc=m^8tvh;Y|tcTxfz0XmzF&dnC6qD*@O#F-u80OUg#l1gO--d5u(00*XT5 zxOFtVDOA9Z+13NC&KMPN0%``+op|JB6uMWc!`pEu5&k&k(_67duOB5v0`drTav^^j8iCwrJnJa zfC8=sOIIkJ1#Q(SWD-T9&3jGwuWaF44d7(&pj0~1yS%d=m zu=uR2q;2Dr8P_i8sE^D--0f#v1axf1B?BE>EUbhkbHNQ2xPS=Y4Z zs;iHH@1#t8`WeNpT)>D=3yApi2*Kk%vT>w<_+$YVBdkQD8BNMx#uUk8QXb6mo-b!K z7#`&Mcmz=^^+D7;+x0$ziJJl0kYB%z6IhV;ZGwHlIdh|%SIEhpKmF zngksK5!%e6(MEbdP08s;&`~3%AP?=w!w#|V(s8Uq>_8|&XslD<{ExE{lVFC4{gG>q ziRo58FmW1D@Z3<$m>q5uJi;w&hswA`K_{TMrEz+jwu)_1pvBodVi|TU0GCPN8=*!l z_Ol%ER4t|>!oKMI(wAeEj{YrlRIWv=T-2E{17pz9VMl*2gO%$igkohPYF@i;PUz~n zBNzFzREeEk^GV7GBuJ2fmGFEe(YI)Fv5X__ zBzL6UY33gx?Vtm0M66c{b>rf9<1c7y>C;rDK0bqv>ch;k=w2V-X5+Th$!BV{}K8y~4(c!_7m!CJdv-pp)UW$EgilN^j*Fd1qi*82h8PXIv z+mQshe0KC8>Rv&EGht0!Z%3*hOryKN)w5xt(2Hc8TfLOgi?mfs5YRC##IXQ`qAW~* zQW&ww0o$69oLF?ho(*DAHTg@?I|5o9IW0KD)xzMWLES>&16mE6uHDEy1%x|4WI**X z#;w~pDJPpqIVrSAb%ET+?!=sv$RY;OD8V|wkwTQ5{*JUjM~Vohb196LgR$SzgUtl` zBN3pElsJkEmoln9fQp)q^1uhbj-|Q^y_3priID4QI@00wWWAe)3Yzj+<`N#D8s87@ z2GvKbmd53XQhIre0w-@lM{qI*p*;sk8BScFoWTd%xkw$LoB>dN8==vEEDyKuJ4l(* z%w=g>2A~H0h@xXZ%xOB^5SmVUOFv?V7?#d1@^s|JtuCq#3jpsjRfl=s2=C2KPSx>~ ze%ityUmgCdz1c-;**RJ%*a7IMV8o}+vtS*J{4b_5gm4_87(&2Bf1JW$B<0?U5)TIYc&r z%76oqORF({ftfQ3@KeYqlim+k<+h>glkaVIO_P3*s^@CP%4TpzvOZlt@*qL8RW8ueGaE zM(z0Ku##mD!pX;q10#d*^Q8fprAL9}N!N`+2uR9^4Y1#0 z{nassj@bqc9RmhGPs7*HL_h7KN1(wl8iozhL=A;)NMw*y6W3HTqGi*!-gvo4t#6C2 z7WX0!+FJT*AE4vNNIlGg^2#mAN zq0y^;YUG&?uXD>;RUszKR9n)|^tJ%%AGy;Iao2u|%2|i#u;jIN2YYQyr1@gEF#=r_ z=l!*do~P7sCjB$#V18#Yh4cQN&)@8rV~|cK(*Z;SGC-9P{EOKh&`!ULCW`4#w+0(gg!dS1nfU2VIx=HMKio z0p{x&=+Qc9K9;qpew_{X4b=MJA5~4NGq%kwwmLts+J6H{gxEJb;^_*3s)b!dKxTvN zi5mMnwS70|H(+nEZ3$r45jGGb{qVZR+fn&#R};pmWQc4>e`5z=iFa2U{QY3*SEHs% z!z%-JkNWhEp=zuH{55%nJE^4;sY!!Wzu|m0W1JxEz=?lkSQCd6u-Bm_38vwzM)PA# z1I>T5wigjKHB2|S)=W_YEGZ#&-h{`$mEe1(hM3vM{8lkqbxFHu8~Jr(W&Z)p1VOVX z1#eWi^z{gw%2!yUw!lE`NnWPIi#h|#A$i{(8@aKQ;Emk?`Trod_UkXap zWZjmCq0) z54xh2h><)_%?C(LiKwIz@)>zP!K3=Kdv8m?Ir)PMXi4|NAG`Zd1&v(8)&It%Q{jBy zk6jGu?O{Sw`D_b6Vpat0+dShd9@xUqR)-`Q5hY zXT-6@YWPqczfFV2mZtF|}1Sh!U?+#q$nFU@Ffr z&%wVk6K4a1`%L^W{1Mp$+oRCY*g^LvU6EFzKV?Yw%8@=uU6fDnpL2_J6RbIvV+(X_ z2}{fs`Lt6tf+oE&JcjCGK$-N_aAmgl9dy+9Y3chHW_#}^vf18QgkrP32*h^9*S?*v2J-VSxHSsHI#A6B{i5z4|vskt* z3wT{rpQDxaLoARzM6az5hSnq8g#-#0DHr!GL@d|iMEF%2=OnCoJ$?@ztH-aP;q|zd z#qiS|JZrO&r1Urpe5d!{+`3AK*#1I2mLe|D%icgJR*%CGTe~?kEdwTjUV?FsU!1(% zl~kmh)XT`(Ur5S}CpBD2DiE!5SyDfIa?vUGv9TI!4`8L5G(TxE2&3p?mM%?N*idKl zwSO(W4d$I7&Vpc4Jq>XYa%5D8aWJqcOf5V#j(|z}6{L4e`Dlj4_W*mI^_T-51Y05L z*q+NqT@SN6oAC06Efyi!Y(U8uO(65YOo>mcC?> zvqAm;57MU+UMc;%UFkbm8tu~0QqrI5k$zJ%m0vo?l(zjp@WZG>THr;rn<&^`;7>b5 z(jqLIXlbBPmUJlSL^>ieAN7@^4`CZ7+Yyv#X6&E@q4a7U*6fZu*(#CFW6?kb4A1Cl z%!zSK!jv(<`UD}}L7QEd8a>I4X3~0>$E9Xl(cP zV*Uc88H%-m{Ed*gTiq#28(t@t8zIh$AerSx2(jGIR*3{(6+v`mQ@i*ehI>g*Q8a!A zts@ifYOqn{0fl{p&SCao9}x$SXmp`cTNMs1_7&#K_ZhKt?0|oS9iA`~_$&M)f@m6w z!B*xUK_`H9d{>_MxRv;`yaaz8@n?zd4xk}EE++UR{w%Ub&Ywlsof)EAM60% zBR70d)lBE$feC0**axUGg0oZ8R^I~$LJp${@0XGDlG>Ew+e{>4i3zG@P$utiR?)-R1 zGc@-C2=AO9@7*p00)D&;0_-hxsz4Xhg54)Hy^J=Bq5TjQ+#x^Swiq5*Mi7wA`SCuq z6bAbh`SF&;JCfN=f1><5dfBjoud*Q-$6PmlyeaXH>^6S9X~d6rg2InCEp=Nm`05?E5Z2j`tjkHR$MAeUv#r^N^b%eN9txWpf|?8+}6>Y zKrU`h|9!p9>12DSlW(*+?P%|0fAjJ#m)xK%n%d}wjPGrT%V9K_+H#J(jPLC=E(Z_3 zx4&;|>%Gc)3aqvr)u2EG|?*C zf-u3NcPt2Wq=}AfJr+s?Ee$Cm{!sL!pjWD!G~qkK_hB$rlRF_kjG!72oU#KP(=_rS zCizGcHiNP8OFf28zl!YiYZ;7=?5KtmfH?9Bc2=KIJiE7fsX)&`x3|W*$}|jl!#k?s zyi6lulFQTztx~21q(_-7YATN-O)WjTkv34YRSV(bxZMG=jj}DqlKjDv^RCMN9hPnE z_%iMb=%~e#5#?V1l~)iKmT})86kEoH zA~shh5QRV$@W_UX&c=N(@bt|r{Wo|*)oUsJbXWQl<@C40yJz|`>s|L_7yS_z7)%x@ z=`ZRi{q9Jg_Q&ssBT}Q81q+lEq2OWR_C-blFxsh^jP~zwD$XEvpZT)$Wt=CMaB;U*SEtDWk?yT z8wEc+^@sR@j)e1y|1F#vKAZ&xemESeH2MkXsL^NsHT>{4;z6VTh){owAAH;4haT?u z;ZXobhV-(W@N$^szC?`il)khd)*L^44jsb}bmDSbO0+86DPsuGQL>4S(gAwFEf+jL z)ui=!qU*1shSJMW!(KFH$EaZhvW5FE19&}-g-I^XC1{o6RFS?NYMApOM-7YN(jjV? z{;mqA9R2W~0TG831aZw}2qK>5>1=j)Ak7Uy_`de12;xD=&<=J-s}UDqWivuC1Tmna4qCnr2!ik~htqK^eLGL6`dvyt z)Rq2VIsFZP4MF%IE+B|RCH?swrQf`kBZzr$lo3QQh_0IUL|5VTx znG$5tNsikwfsfJ?DdhoZU6|o#p#L_u&^H@iiVaEnH%%Gfq2K_@MXz{{= z^$W)R(Ne+|rCrejFb;}FJXM_OIWt9G`4=c{%$95$KZg!%Q z4vpe4BO=bwR&PdZuIyA-k;zx)i%BQWSnd3PYC+cXl-en$+R6JHwZq>FRBA|Tn}HPE zY6*Sa?%PPSAKX@9IEk@M!19%y)vB6`3{=-)VA13B9DGRu@8P24NZ6vxS^6Ya@;Ll) zQW;&Ey=R89X35uf%YW7`z=;&*i*9*V=_^s(Lha}5t}m)2&ylNJctIuTg!xnK{9=0e zk;S>G3opQ5r6q(O@{zBLABw5hrf(149{h}CGgr=#f z-b8y!Sa==z2y#p8MJ$jM>Zd2|VE#H8nXLUBdp_$%Aj+aZ+ThbQoxUf`1q#< zN(YvK(wP$EoUNBP>OtJZZ22a~Y`x5wE)gM!xo|90nW5SsXg!`VQqDtMZ~p>os1YD1 zSkmN|acCjp$nbNFQp->K_|iN8?CWTH&o(}A2q0Ypf;qv1B!pjmOJn;dOL~f!@)k{IlEbRFqE2Xo$j4Ijeesu8n7ytli|!#C$gS z;G`G%MsT@QmTf?l8i@#jO&?PK-)GS(wPoGVxR(ZOEiY};X_U5;Qd)0bTFT86jc>r4 zXMZSJeTDvzsW`On4;FfE-=eRn|CqjZ1G0Su`r2eA?QCfNE`99)x(27OeZzHE zps(eeqbVk>5*YI>%McpSZUA{L8T2;7&RMoiV4TNj$c@JyK?88>VQ$uw9(P&yce8%v z3756j%{ul;^l_Oe?b-W&#H^lCvfU0TFtXZbE(Z^?+Ip9R2U+b!#i67A8erf3;OH#- z=M29P$%+=Cj@+c7xudMz87*xTOqd8UUVFgo_K``ppz~q{QDdP_9_{rnWcG9*Vcffj$k8@k$22@3?cI1JMVsaaI zFr+lDgcZ=Y{dcHtS7!5QUU26-auZ2!--yLu04;3RLPv|gGZc9}A6>V_>i}}BW~k<> zK;?9gYzN^KCgU*OvHQQ2=(@@>t^9yZ&l1flUSjE{d^9bn$s z8!)VHx=9)2&V7eotVO=qCbk9|awm`OgB(xJ`iR@e!dGzpaO4}K&RJ!ETI+E(CRxeG z+5lvd({aY_qpqaPEm(b9eJGp5mCCNrxm7fVt)^Sp*kuh=2CF+L*OU9mxz2{B$;;k% zZ3rrU9dM{nltE3feU)5o0Bssl9fHFTN5|QLrPQI!&2?ajxw~9LJzP1xdEx0w#EtnX zO%*W9Tt-TFhw$rW91YzF!>^k~2edyziz5bmKe`o~^IvIG&n|4$L9boZ7ZAy8Yq5DY z`MTA6?dQ**u0Y8-g2Bo~M$T|)L?U0*b z1J!ShIz;=_=HMT*Gw>cVorIIRe@SObbqlvt!kL}Yz%#<6m%e95q8Xy&^N}Dld)!8f z2CxyPw9+#$Gs};tUF7}J=C#yb=Rr5N?{90WP4?~QzvWG()N$~pwx(LznP)vK?h?2! z#yM;5zc}ap4x4JbA@~#R>QAVtltA!rYiLDxj7M|b--DVeFfP5RH>;uhH#B|gRyE8k zuaBfS6|2+W*0w5XJwjCy%_@WA`H9&wG*>a^`>4@cl-kvf4ne!R-TuCI^&a~kzym=A zKte|#(X9<6Y87}W1VHR>*TRAATUat9FAKL&YFLseEi?84;RLrKh__E5CenBwR)S|? z5Zj_7}zgFm+Y-gkD8 zcd=T#$PZ(Zcd3O zjPs#O=q5B?70AKHW`y)fFL@?(02=Ill<3vgVCAglv`?vcY`_cO7rvvBjs`Fj5W1QQ zhXpw%?FdA-1$AUY!x%9ww}B>)p&q58!=~(Ht*SnlN*PV}G8fkYrC?p+t*I98P7<77 zgVr8~6@nLKwL#$c8xv*2dy)uGJrmvgbvi(8vJbATC4{fcOX7F z4!Wp_IN1J)?UJ|lffJM#PSD%7UUUd{ZyqO+lyMc#J=*I$qutbKZi|*kK9sdk{tkg;HR&24DEg2ZBqBFt6c8eSg&1jyc`k7+H{RrNQugPv$ zor04PS`v(ZH?`PzS=Zr62|W!EfCW5}1O3pMG}dYwO-E- zCmn3s-G(x1sm;AC-?4^&lsC!cIaXRl$EuK8g;kYOzr0bX&D$DQlW3dBsbFSNnLhp4j?h9z`|L;p5TAZ=jl?iUaSgKY611 ziq8;6xu??67&S1VWe>YN1T!9XNyQ{ohx=O{z5bM@ya9x1#GC=rL4S7pM}s$BY7rBE z|LGvT|I`&}t9IcOJ&ui(0_f@eCwQjmhx|~`3ouGg;KvTuFC#~!Oa6z!|F&eoyQwSi zHJTOZ8GI|{8+VccKIQkHpd(@mTN3is%wpJM4!lZcbP8a$D*ULS(x10Y+(43D@0;Yl9amI$aNMx#Vo#pVuivBn}r zZQqX#Lh?^yrg~yVwsV|_g))XW5hwZC6@Tsl+;0#`pu_tQ1H@4DzdLvy7|Wb?-p6~y z-v!O+>K>8kOi0)Y(8_I%hZv7c$P7K^cX+hzTF( zxPilEy@~{sW+pxA7zNEl>1ABX!rU6W;XWBJCV}=xXQumBQh8xFEDv^2w?p=;*Qro@WH;o|LhWp*v!R-fLk`n{TN~{C%UOUU-$CDJ57WCb!&Jt8~u86>k8Sh(3_?pe$I>@C!uIn4c>`3C-xFmwM3c3(gb)ih`YPv;o?%6Xvp zTDQR+>XCk{cwFSxFOTWX`@P_KKOA?$6XX$pIa7Oa6kwS;gy5+TbSepR8CHc8YcQ$I zkn(!7>SM!H^{;45Q3e)h`7#yT)xEK%z}<802iGTtf!YNAMi(NJ){CR9Kb+qa0}PB^ zVDbxwG1T6)=0JPP1Gc?fgKN3`JRaH-uC!uN+dtlP%8xbdcHj-f?+56HV*noTOlh{C zR~^$XB7PG?@6%`()6yB2GVLF$&T1FYR?x!VIRu%Z_nrzyCy3IoCaJ3~J7c_5gT=W0 zFknJeLGN0LAW;W52h+11pjBV6Zy1Q7HpyP!f>-Q)`#div@eEX$d;W`(0*rhf ze=QOjrGuTn19q^+MLp2E1NjP|8i zst*O^vVtsSh_Z1YA@4(2nY<+twsuUQSLwUglU{n7S=sll6M(>^i<>?0`>YR{1+^T< z?^C!1)hV|a%`GTv+#;G;@DV`SFU6r9KE5ASl?F8SMSZ&DZlt}?_EVG~3AWDN0i6J6)H{F%SI+J<=boLK1>A2!6Rn})Wny_Ei| z!Tq>gI~(u)krQRSpNcxec>f_nB5k!i-oFE*^eTRAynl%tkqH{_2f)AEc#pLw8}IpT z42k%7@lG}$I)c6rQHcNR_uK|hG^~>iV$oP;u%@Th!A6Yyo|~V`la6~zbRX|8f6t8% z`0|5pZ6kg>0nK6Q9j4p?n1y?LYtWW@!H!qYs_v(@BPNmi!*_tbgy*X_ z5TFHbi#e}NId4C!+N@o)1b!6sS4~CvMfItcy?Qvb1Sg~xle;&tUQLp>CL3I1?#DtK zxDauvnuk$rxQK4O1~8*WerHmGm~Y{+xL(2M?Tyx@4iH*XkpnsiLZay!2lmGZ`hb5E z)eS^0qxfVRyR-yMsqs>n+#^nHWTsQn-OL(jU5^F-0cNZ0rvw1?fMtPw7d0%M?ZTP7 zE{^f)nw9zhbj2FFJ5t58Gu0EuWje>>r7|L9F`fr>ycN4gIINbgKEDraswoKkWn?y+ zzGod9YE1)9Oo4 z&f7Ev|NMv1Hzu))8r2T)3IYLP2;h% z$YXG5!C?XIg>fC+71SByCdi<`fde2Lj@@W_P1MghWP&q;HNVTPX9H*F3HAmHw@~gm zv0>IpOxQ8oxUJ|+SxO<6=BuR!$9Ae&_qQ-I6h`h|e?9vLv405rhp~SY`$w~X9Q((! ze-itTV*gb3&tU&7_MgQ5IqaXu{s#6hV*e8MFK2%X`_EVW!{~G(RWdBv{{~r6VVgL2)U&sDi*nd0w?_~cy?0JJ_CL=4 zC)rss`$T6ioYS1G=Ct5X_EzasLI#R9&{oW8&x(fddl&`7axiL9%i>C0w# zJEcNymd>INN_|+c*%YjPW1=qAfiE4ih5z8Fs8YgwSOZXL? zCSNDX*J|dg!G{84Oc0uU9z2AUoYtdK66$KQ^c5<`(H!ZFxx;dOw)6_mmPI>prq@Kr zV8HT>6N4gQshI5Kk$D6A00$u#oy5)6_L^`4TF;590J$ho+T2T26q2O z8ByF$*-|)MaU9x5BKFZUsV)vue3Ru;IJPwnbBsOhP+|Km`8Y=Oy@n@|hDOi4%jaYu$YTBZ2rd=MSDg zY&%GVH63URv>fXNw`<@O(B{+&P61u(tTzBJ5^pVC5#qs;73f^??uHXJCE!)BjQSVjX}8KtVGjB4bJPIIr-OhimA zOZCDclv~!1w`@}eOO9^V6KME(BuC8}K+UR?D@7wWs~>At9hx)Xb_9c}k=v9KpWry{ zNcPKijEeK#u3eoFP&2NV_a10E&1w$vK0EYt5Ff^BhK|vgyI|7jov0bQ-K?=~4jTHo z^;Bftw5j!u%}u{aQ_v596TBnp>J86h`7dN|IEns^gFj8`p?fU4$U4WzxOj`F$gRy0 zb<^rssixHCG<79sd1HR zDhqg8lMQ}Kpr8BLT2RO`L7RD^;Mb3Ai2|!bg7jEB_F-|H5l3?F#jeQm0&BSuOs=i14wvbG@`B3 zF5BeTM0iN{5K$*NLDHiNlD5MGO0TV?D()Ovx0c#tF|WPKVN~IQrBfv+oYo#rtDp2Q zG$5%CsFNqlwalu>f$E^@v3=ba9`o5dx z>w}}@RtvBh&!KW!1QvDn#Eog+#ecW~Njrx&Sp2KESvsHJ^I{fKYbvZsK9}L_8Hj<} zk=znVZE?}r(+|dQrom7GO-=G?c+$Y&7~5Qvd@*wD>BzAcBexITZS`H7j<}n2)w^)E zdy{|nkvN`pT-SBG-Jcrw{9e01rNf&rvM#=U4QgMg$H-aahstsGR3p;*BCO>E{8Shh zq^W>0+ZOEET2(Z>CIZZNuF=7B{hD6%m(HNT*etX8sj+;M@N_IUdBKE;V|Hq$G`hPSR|H7q@y~LE7CzSfT>kY)um4J-#LRDdJ?;>-+tbuDv!4Ug8X1e_xP^3ss}8n#^H82Yg6+gzPDc5UMWhKWA^>TS7U*iEDa47-^W|6xM> zQz}cR$hxVU)q*qwg~fQVAqzeHL;4Ns06?3olUY-4pqq1mHP&DgbNrJ&iD;c5+=xA36FS6@yKc1OAk@XmWeB{;) zyHRplTO7$3<$h1~o7`-8k;0v=M^7-=DHUOIF0z7}9Cwz=?z9FttvaVwgT7f5^%&-3 z)Da|ltje~f7w@3`^r(Hob~-3C^2mtJeKO!-W*3RJKZsaRisrQ$n=!q#`ID1Zw$v<`(``TxJ~YNIpKO%wjC*y4{g{bf#+1 zNMo6`>-I@Ag~^wN#9nmr!G6udo!Vh_IL=_XWmsM(FToNxteljd!!kN~3zlxMgyIWJ zZviKxhXo-Yw%sZ_(=>IGE$(aabtEGf64D3s*^^JtkC^E@DRKu-wPxx;9L}jAR)zLV zWcldp0xHCw+>GkAbhhpG;?dumkm#vph^%g&S`91Y7mR8eQOQ0MGvK<7ahqa_k+UXEyhW}ZVs zVsP-8={5P&;1|OZF}C@K(7$I8{rl+YKS-qiut59^m-ZaR6#qD;^y$SEp8%%x(=la$ z2Fmh>ed3|uM8u0xOjW-a4YelO@5LlCGj!76Q;EtWr1CsDz8D8ngHIU#l)3xi`&-z575l%&{O(k|4Q~>!~T2Ne;NBPVgD`cU&;Pe z>|etE2KL{{{_nB>lkC5o{a3L6OYE=1f0e2prTzb_I5n6c9q)}r_y{W?S3+)p+y{9a z@^{D{kv>8cWGZAKOROi$d@2PA>$yY zK$b&RLN0?OaT{iY8b}fHT1YQQ5-Vr|3h|(HB2 zbgTQgOSh(A&9YrA8|p5xlBU(POV%bFo$W3~xV4kEH9v@MvaGnQ!jfN7BBq*Vh(XhX zN0*hE#7v{bS}sl?H-axEe>z>fpvVeyK~72W^a_h1r(#}NK~8CTML~|K%ve!mvV@u| zgh@CS&=+avL()VkzoNouwiKJn#KQdI5~Cqj47#ntSW*~j$hYK&&M;bnf`dbgD{{*a zM^G?M#mnK%2#f7|m-!3muZ6Uh&oJj3ipyq*`7`p1%Utds%kE0}_h7yWQZaj@p|B+) zthzQ{00oJaZPl$K(Ek#c%z!=*vJP?&{80T<`BxlF5X2)1LOkTEU5P^8BME|TWr9%G zz0FVgcZotR+(_<$6k*P2PHg8#=jLYx{M3D$D6BZs-p{I^M!4c>Zbp7!t~`f4xuvxV z;gqzFBc42%n}2K{Plj7O#}SVJ^PZnaxNrulLa1}gPaWc^gjx70(N$lS@YEUpvWqLM z`6Xhe#cC)vi6cw~qgY%aTFcRVXoS$v&`w?|Uv+07B|mTXe2OCc;S{_d=_%RnZ*17NDF3(WhRSgEG@Up6Qoy?fLR0~3!RJL zYea0$1VC6tPJVg$Y~wtWIVZFr-#o*VV>Zqxu0W5^A&8w(Y$>u%4=pg24hT0E6bz1t zi7`x%F&0EeMCMeKm}U&H7|o>vB0?iW!KsQ!%nb9ETmx)HR*<=>2WyZPX z#sZ7cP%;m=)afKTE|z@6tjr1aeoovyW9WU*(+h({U~-6 z&z1ZT%y$&ep4XFvJh-h!z`;-zGhM+YbAD-gX~Niyv234s(s0N5 zD=OoKI!Iv=R5$#y0%pM$-wu}u7$4gCd5ybM-I1(Czm9(pcmVx8rFgEC~CtH9A8`MDAtDKO$*H}N&72S{c9#`4-h{q1=(NiZUB zb0DdI{}0-~jH)`P7<2=3S$;_cjoyOri=lxwr;p7yCzPAV=Fb~rEgNGkNwChyG?u3qSkg?hlZ*v{ZzTz!dkVKe zrFy>|D)q52Syl2d2xfw>7+D<#mHOETs8naEP$`~Fs1(m#vWh%d^Ud>+4>PIAOhFN{ zQ(S`F7?GWM$d9$cf-G5#rPGaOWXuEwnPW!ekg39Q#7AxaoUFbet1rvyYqI*Lto}z< z$C}Ertj38(LspSB#ax`3Z^^WlA)eE4r~IFVO8Nc`DwV_QKRo|kppv^zHusXvh|iEe z4^dV?LA02Sk-5lfCKV~*k3_6yQqjxu=Ly0VgeBNh`jDdjzvx3s+MX(C{K9eM)4dWZ<_W~d~rQSTOUH0zj z_UnB4>I-vF3s$-X;vHgG657&;IO#|*jynm8nGVj9`G3&I=7kmv@ECIj3c`Bi zV=B_46MO&6oSx#wOeZ`vGKS6P4e~4k=_wP6*w_kV0T5?J`w58B`Xch;*>?#}{>lDS zDC3PkN|Vx4(u7tJAwBa&W5S>LQE-F0o3^u;#=o0ym#!KgZRalD{@t{yt{VSNox61X zr`!p^$hVX&t1mO$e2hkaVh-O_OG!Xs} z-5|6OI*9HNJs_@u2!QAbaV^Ak5WOIJ%i?;78z2H9`as+W(HBC5xC!EBh+81^5d9$f zL);1x1Q85z8^rApArJ!~u=Ecd2oVMmE{h0=NQfwiK@fu>hCoC^#6ZMC426h;7zS|% z#Bhjshy;j4h!GG;5XlfJ5F;T*L5!Bg7>GL|QX$4dq(P)ZWI&9A7!Q#Nkp(dUA{$~N z#3YEx5K|!Tg2;iG3NZ~L7a|WL9|CQQ%dC(IcB=JAMg&oenm9z_xCf%h{%(I}! zZ6HP;B^v497gX7QUsP67BmFHQXL;0^tNAJ`$E5!KkFt=KaW!9MWybiw|55r`*;n&b zR%TDSny<2Q(v-jdQT}tLUCmcnIW6z+f0X`o!_|C(@b_V#LjEntr$AQ)^`ou==EqzW zyr*3Sv}aruq-R|foM&GJlux=U2+z3+_?~uEusvN_uhR4vV@1G*Bw-TNY)G2_UHus5 zIj`n)@(xxRm|Kf?3=_k|{{6)=GQ^2#naLw^Gm^*WLjC7+QZY{^U~NniZbn&Cu-TM_ zYREEW&Z__!hxGCmlsE^w0kNVW{9CS{<(Syhx+4`~2S8QqpOx*~V#qRO-IIycQ*mK& zL8_@BzoesR+tEUggBBY9`k&ML+-Zch@ZbCw!jzkeE3j>55KBx2vtqH)V6qe$&7vj0 zVwO@=?Bo?22o@^eh!+B&68)k1%Xns{{X;UBf6dK``>GS|%{mYF+GFkA#c$f1Gmf`6 zhso(F@n?M1-o4htJxorY4!hD?XU|dY-({BbqnKBD#MkVRzc85VP=2}{N9A3G{9O*S zXU>3 z*a5T{b&1NM>}7}j5-;2cx5;pe_2PTo3Vm{p9ER<5=2N3yJ^pQr3)`j<*iqs`0a@p= zB-%X00zb`|ffg{BP37f4SEa^^iu@VI3ejK%Oas7+^2^GMC9WNw6l+OI3XTVqpe*it zQhWZJAT%F|XE=e{Dg%95*$Wq;&w~tuypkWCo1ec@|AwteLN3zz4w7(yVvdw?!qwLz zhtOQ$@B9+bt0F@ODIJlzohO{uoog%map=cmYgyhslRn%S8LUgDsAG`Sx^65afz3%g1!06ubVE zDUcB@z{w)pN-G8`E&~9I)8|=?75vZ(0r?D^E5cT$5yt?E?Gluv>ar{>^h}?B{ipKN}}(@=-aO?MaMwFbYIs zg4=dyb}Dk_VE8c2smNid-F@C6yqF;5LGIj}#P*!s;cvwY2}1ii%q+rLDMR~wal6-% z{_RM28B`oz7Y<&-&wLb8pBBwPW;7XN?H{YuLwSB#altGghdD)as}ibND}VlY=(bb6x<+>L#`Uk{lw#(kb-OLVo*=9a2pEMzs-Jye3ppL6xBiQ zfoz7%w3w0q%i(JU;&F$sX2e$;hj<|;@w$$6`hY2<>8+KBLH3QXXn30rJ28Q@(!b43+vo=DgAo=mllg@=Q7vG%>#f9T}D> zW>e|tvJxDGAAz2T4G!3iG+I(&ak-Nca&VL!GQnUlw+}!z%z1PfYLyM&46BrzO|vnZ zHYgpw0<$l4byn3hCf~6$N$3g{!vhndtWv#^AbXNz287NkGtDWx1Nt1uFF)aXyULiY z>=zw`J-}U1%%YfY0mT--P~jZhdcf^nL?}XaYt!<4OA(qeCuexhgtQSkp*bS*b|d_R zL*CZjFP2U&oFIoo3W|VVHR>Nz3gKICem1KU%v6Rel@m_Pzv74diDU^ub|lD-;v}&#mSEb6op1_4NQ}*(i!C&@c1@Gp&4oHT*XP!sc(&wqy_}-i zh$%ZwtV`xGsua>LwPHvXR$xBc7j-fMlIDbN@wj6K<{6djs)Izi4isRA2TUO5;kY2y z3^)r|Tn5;zKnI}d1-i{FLijkHqs*TlL_=JI^k}R(yr1Vmaa#;Gf-RZW!rO(GA^9}I z8!+|*x?NKiMsBgpG4TRnN+r}GKEi*a5IK#*nI%SJ`3NOswmjFtlH>B&JUS=trO0!3 zx^i;aoE_)vDGFo-Rnt~Tws4+-Y_}n$l6e#JXVEl>=U&M}yINuuL{my@8O7DM)_4qk zjmn|qg|5s{UeYTHFzIZ+))U_0I9LUDlDbt1g1oM8Hzz*+c7iYhO{i1iG*@Tb5uQ=u(PaB0@fz-uOZ!PnMlZe3efdv zI!(zDemW6jC%DdhCz}daea7ctH0LAS<}R+#A8?eN)3uek-U-00h=A^O7Ip$-B4qns zkEuKn2jmW4QDlXAPMP~UCjJc8IFMmKd5otp>(0U+vRyjokPhT!>7dAeluq977@IF( z?RBwze6=u#U4lI%&#fT*_<0iRugYBWAk0)(-=mLt^owE>kTO_f@ z5y%7K#&%`EKxry1HI?P$TXHe$u;k*-17V~W+U^R~c1sl48gT6Bv|Lovh&wN@#ez_d zy@T9t{?y6o_CuP4Q#(#qo;Vhl6;i98Ll|nO&WDm%UQ2O-%S`hk^jJRs!t{(+hrA!s zHu+PoKN;s1;FvEVdJrKEB}OyidkyggLDf^-khm6=#i%uzw3ZkN`gA_JIjHA!p^0FP z=1At*MtQBlX*sk`@Q56c>57~72564kzMQUg7y!0lR<3g79c4X^JW*a6q0+gKF7l)R z(|Uqx#V7IuViM0tm+{7e*~vs&%XDplaidb6Bx6N^xtJBd=&(GNK@|~yJmlr=@5&!f z9rxaS{IYmV1Zx-GW zlNo#j;k_)vNvDASFdPfBIp0W^YW=?-{RJ7^T1jxhFP0@#*ddR@`tYikZJ% zdE0eQc8NMO=u#XrKlIL^+b+zAekbEn5;G4SzHQ&J1KX=+T}ox>=#Kj*h&me%FW{P3D@*F5*pu~!~$eTkWu-Dg>{JNNaL*IQRI^X_L} zd-z}FNo%*XzQ@e7dTKYeH2XbxtaUvze-IvSoX~I8r@yssVdjcSS6CI8z8=p^GXT-+U>0 z-)E&l6f-B^{PcDGZ%u!0i4e!kw_ezCApC`bA6~#pm&9vtZC@H~{A$%lY}Z&2ju_v( z{vp2xa3afM?oao*JMp(ZQ@5ODR6xwdzrW#?km9kA`l}4g{Zvi)^@bl+hi_GZAPO;N z&Y7p5da?9{M3se^t7qN!-o0}>pUqLtXXZJ*zMS{`$*lM0sH&KG^VVnXdh~(29(Yu> zl$nQ3eSG`Y%t6~%s+KYHyDOgfJ?FjK9&1o7XXbBmS3LF6b17eat$K->`z?(*61Dl6 zmoKVTGIP#zPrhh=dfTtpdcDWYyEZgtWo|sWI^1hLGoMJf`RsK+UtE&vwS}2qo}07( znO)+}La&|7d@S>(dw-sC?UM_=4lr|USl=g(zQ5wcGhRoT`SEwZ$;sS%=(P{LPBL>` z(yK2Wn*Yp&Jzl4oS(o(EtEs88KWy?k$IRC+kN@DzLvK1dd0%AakgAEV=+5-rBYLZW zA;DiZ{E^0QU(!7@)LX;M&uW%Gf8iP3_Y=GWxcj-G(+`P3E6cqDnYnuRtM^R1GpW+y zt!L%|U#|3yKY7!}m%T%n`C(_$w1LZKJXGf$#mot7mM(wxy2t~Ez2lhq^&7r<@6jW@ z|NV=15;Gr~b8KDN#>bnq>QrW?@Mg?v)U~^ssy5y8z3dD zW$1yx6%VL{_(ZKx`S_E9@bxcX=J52;J>Mj;``>hLo91}nFl9RXz%5L-@XX5UyAnzV z{OA_3s_)E=h99EKet6>5!{>e*-sqi9yJzi%>W;@kJ3n>I`%-jI?ZA_kTTcJ7d%xdN z^_Ih{K3(7Y{>WFn`}b{3!#MkALN!11$-5Ts-(Y_3(80w6d-m9t@zt#IvN5~02Os;a z?Cy8^uPWU3mVR*0K2!E5#&yeb7SvTt*m>QV-;8I2)=xO!aJ2I14`t_eojIC&KGR1~ z$~hI~j6=eTc{!Uly64jU2{9TpQ#$GjuLBg3P@ z2Zav~9}*rN9upB35l&~mBcdV(MGTG@5)mB{6B!m69!bZ*qap`I4vriW866pe(M4;dUi zIA%!LknkZ9Ln4Pn4H-0qj*~|ZiHQ!24v&tAj*O0q9uz$|nhu!9#2||?NInKp#~@e? ztOOzGTfVOn3iW2x#~RR>8DszmX+Fh^tW*vr_A_uy3{!V@W`)SRsG}J;XERz#Vk5-7 z?~~a6Ne04F_z>7rJ1O?#WP6>5|M9Z@VT2#-=08)me-ZXW-0ZVtdj%erz)bx>F%vc= z^MAhM^Y-mfd&B%S8lBo*gqikvo`R%xgJRwdz1zIr1y6+~mI#B9kvXx%oiQ)RV9uXm zqWuFws6|{iBHS`LtYUr)=Dv`MnbM-T74y^3D=_Q{ze;-i_VMLw#4;0KBYK8&hx;7V z8O85ecBPJbp(2P@>~40iLwbwZ-F!35dN=fo>RBZTh4+csS9C;j=%b&*HOPXBHMfR3mWywzh}SrQnvT(7hlQtgr)-^w?h(7 zUu-f6@&4XIWfdTGK)6cS+|*TAHfWBmk*}9MVMOT<)aC@UikU|FD46pQj_6Lap_03T zH#*69gX0H|J+N3eqxETHmM|&yg_z;;YUSHRtm0N7UV^2$kOYICaIW+ZY#i|ZIKvE1 z930;(b)L|~<9G()-RoSjUoP7#b*|VyE88n|uGs%uwpZ$0v42js4?ubYpjYglm+jA= z;{EUt)Iivcfh3%xm{VnQ9o(ruDP_M1J<&iE^KGbm3P-~2{39K3#F>Zb^Vsg0XGIx` z=jDPeKt6Gw37dO)onvRJ1Sf*%F!JS&yyt+;0Pip8z(L_+T%0&KT-p4&azAcs5YP5_ z8|9$(@ITFIX-a*)Bio-wJ>CR&#r|E{-m`vwhP`|J{0cMGk5XU3=mccGyj(ZY@k#7! zF`g+`Mj7tqMLbHrW+2~$?`iHu<*0_4@VsKLmhHnrLp@tV0oyB~b>!==u&KZu({ByC zb-?X+;S$+YVf+t#kM%+De4#!!91pr72_X*lWIl}kP30_tJJHQ%L#3(TJy2<1*wg=4 z@K5k4cf4h8Lv zocN(@>`byFU}7*$Bl3{m=SY|ERvlC-R~8CE?W>qa!Ax{V67G3uqo;(13My~9AL#Ad z30DKVcM0s;TNB{lquaGwway!t06Sl+y3VJUS8wm@eFMGvsQO+jdf(nD#A`s;P*s?B zxL1VN>t1iD-}L+4>w?cEb*s0t^ILQ0Ici=An>fj_v^KEMm)*2?re3%hI&gT-)ZF(^ zRMkB6$fK{nz3#)U+je~X)yZ$2g1UQ;;P9v+u|tQA9y7J-AvnIb?!#>#@7jIxTS4vL zjk(4SO->m-W}3lR^~f{N?%1{4zk6`<=!phn%_FbF^VS{5PJY|0_V1oN+F-0)SoO~O z4I4lEqWLFV^#gXt(kEBE^vY|muUxlb)f*dje{t;T_$QtWd$_N2moqJW z%3Z#GTHUP!e>_uW8ZvBnVsh;xt^*qs`&OqQ=H9&Mn0ir?-wo*d?iKSMpjdw{n}-My1m6RYmi&%aZuSgQU%>|FVN>zxcsOV3lKNM7ips1(_hlmv=A}aQP6-5as z7$7A7@4S+{9Ct}5BK|)A2b0~Mot>STt#5DN?#!O9cLElb_;mbV1Ok^-mG1SYl|vB%=Kx9umD$efa|4z9$^o^ z6?#A!e#hN@hLD9*Te-FeyI!^F{6hnc!9#+>0`r@6@tf>FDa5t7U8m4CAwxo4D*~Tg zAJ*1i^|=4SFM0)q1q8UBj98c%KBrH=z>)s0yZv1|{W|(JZ_04TD72KL;>tqzx0bh+caV1q=p5WbHq-AG`40I<@`GWYgnTOhO#X$eEZ}GP?}~E&GyY+{ zE%s42tbX*-#{z>w^fvqWKT1FHZ`Dq37(d~4-G}?jS}a|@>d~5NNVRa(4JoOUr@r)Z z$4+SwGh^fj#_t`1c9cHj%lC78*j@ zga*4FH2Eb5hbY?wboJ{PAaff1M+6M?4-EZJhlS|<%mE#O{KJCchZ{6aH9^tA zp$mIOx)$~c?&o@Hlz*4zG0oZsg$51{=^awg#4)H}pd}zQ@Wwz{K)7FkYh^;$VZouU zr*7^R*CaHsX-i{psD6NdxXW!#851U3$c6=v>1B~w!4nhXq&aLT(paI)E= zKb~y5F!IKQcP;n7C7`KaNKp8_iLTS3dBIt2hq%_Y3Y!qp-nDe$P`^6|H*bAseE+4N zxIXJUA|TXXzBnRw;RtJ>%zs=!N3DEevjP4oVdF!a`c3t>nL0Ne;2(kt8t7WL_>(40 z{Xzrt!zT3(^M@9JeS*7;4)dSx*SBeCpkGsEVzWEf@V(~W_ZLTVNuGxDsleJs{STe~ zRlVz_8lq~9K6onV3@{q~#K-;EV>a^B$bl3*6&LBQ7U(LPD-zG}zq6E_i{(g5&hzh+ zOeXj94+snj4hhB=^Z0N+JfcNQw752H+qLh|u~X+Rk&4>IoUXNA@^$Opqh~L9Z+Rd1 z`}XTE9}pEiP$`$I5L8nyE_Y~+2djsg*QVi2P zS|JJ3T9`DR)`e&tP^2FKzXBjW()l;O*q{wiQ>SHTXCz=7Ah(Hwxz8Q9bJX-oB6%vf zvmAwPx>Z%zDsDdq_1<{myC_@~cGCL?p714f>n!Wec6R0VeN+l`rCk*6n(qxj;FKX9 zJ@meS$GzK@DCJuetK`GNurpD}2S0F4b#W=UKPQ7+g|#7^G}e(hYQjibEM#9*_-z?? zJY}S_CK{fy^J)0IM~1h<6h)1>%6Jlb^Cy6I91ym|;jC(|ARjYwe_0|qLM}^X{;-`( zc;$B%{t#L57*ADQNZ%Y_Wv4A(i7+NM=k`-tEfjz;{wru%POF)JRiEz~?k5b+=eQR_ zj*2ic&c|E=Ju)K%#c&a{0Ku406!5wJB5Sw-!sEwc@xqvh5Uq7pSNpl(FgK`NbQ=gB zzMS7_Nqz|5(?w2xY}$I~CJm=>t&c`$?V8msb(t%Fo^8{g}oY6Dsw&e6i}7`2$o@+l~_PqZQR!Y zeaO=npRnO~HCiC1t%!-VA|!mJ$^Z7oEe8$e_AhhWv3T$G1^HYEd5Yg2h~NB(t{HK& zd&Y6=#i2DFK^(U;L0q2>6V|8e>}eL3sp&Ip9NkPi)-sdk;2`u&dWvfA%WFeCY!e&F_N6kq>@~fE>kiBavHO6{r zomL=@!Xl1)FIx-*Y9Rel&@&JJQ6BVrERBjNG8Xf=X*cnB}_9ZXz* z&XLFQd&@x79r4mI%|FEOa>R=*P+A}80~f5u(|+hW`_q)qLpSIr>gx_4#BM>|jH8pi zYZ8r!f0gt0&5a>wYQ8)#IKIj^kpJwFJbKlh@6yzl2 zXQ$EzNcx&r)7DFf^Sst zdj#4b{DQt>nTq?KOTm-c+7GZXnq8gthV7;W8T5OHSrN}20mAV>ZA-`A_+0F~j8@zp z?9Znk!+o}b4?JiFD}Hm!BXN!`a62ojMJlG4qUhKSwa6W-l$DF@02pZMDgY{JA+k75m2MxM;8qj9o`!cB_-l<5H zTY}=a`LSp}d}_k=D`GeUVX6~ixBz~d(>6ys%s1FsjJ;%Uq3v^D+HqxAN0Rzuh5Z|s ze^dkgmXn9tz*V;k#r-L4KMFvqEWqR+f$n zxuIhx=ynh;y*$iD$3(hb*k{mZhL~2Ms}TBF{(H1pT(yg$=`Nk^gVz+UUsblnc@NEE zYWmocR=DG$0dON;**b>Bx4|6|fbzC6;0Bq2r~aM#Os5)rbx!8)=VV3EPTYOtWbrm9 ze#CULl2~U=eBv-C3m@rZr8j_X3}_~RrZ?id13$%C^ZmHHtFvZIbRC6^KgTe|FELE~ z&Wqpuk(y!%iR1P(l?BJK36SG4RFJN4FTX&!14>Ymb;^>EX7dpG2rL$xrn7LWl9vli z=&Rwr(cA}hwI>E)e+*>p2HBDTG){`)X+l^iKYW=YxjTg}P)Xpv!9Xv9`FuoeS(bJ{ zxpb_1ZwCuU8Axb~H^RoCp?4}OCl~xhonly8O^1rl5oU|K@-esT9K-cxL|X)ZVwV`^ zij3i2R0$WaKv^K{4M%mD9-1@IxjBhlW4PCPO2@kMb%wm2kLS51Qak%q=` zPd?jy(EsIwz6|vADl<3}>I@2T^7*92GUaAl>sqCHe}Jzgh`n1in7t>mPUNlA`7- z=BOxch7c8n{*k^Nj+*s3&ITd7ybqV=Oky6dB1~JtaSrG6qmw*VjNWaOp7-vYRSaQ)%ZOXv43>hgLA;SRuW^uX8l>=^4)@o}qS=(yoH zBY=)k5k4ELk?By=TAtKS+z4YKh80Wj()vYvMW{?foy7Vzj;l|K+4#06uOOK|^u_T5 zP)MwoFZxKA0A7zkeyY2o&F1^m2lp@0OppI|7P}m=Q2~pc_*@Q^ne$*`OgA;*TYvDN z@)3EC^x!GTo0gq{A+mOVL<-K_!R-mTbB&;0%y$Aj-glUY;@W3m+tL>*tTH*ek!Lh6? zHkOsPfWK`lQsA63q=|$(K$2FDaF|C}tTVJjo$M&uRIF=ayv0X+ZQqHv{Nx!z6`^{; z6+}&)?27c1zbAjLZcricg-y4PaRn&m+tf!oY;aCM^+ESmTkpes(DJiVvqI!q4LQ8Y z5=&zPomi8KQiV)r1&86QNKI|6<@3A`K7#}$=-YYXm;yR6?~M(l5&DcgyaD25x|BK< zS>*Ak4<0eu85!K64fL5K&d}kTS2~UZ!sm<9Q7!L=9DFbhqt_kjME=wtdaDbgF}tT! zBImgqB7xq@t>!r@fTk${dn3ZD76u183V|CSq7}o@@j-pX^z3{yf7KZs zhr=DVMBmxwrKV<5Lhif`DS?z_(lngXgcA=uxYfvds}EU4Jb3>KS9U%QHhGB>**7mSl<;HV{hPK_QJJou9Tz>0GjgXFe>OiKd%U=U6)akQwe&u)6P| ziFn^~0pfq<-!Vu|f-;2JG29sls2vZ5xws&lA}=c`hc11rC7=N_Egc6AiS>qCngPEs z-09aAt~hr%*0!##Jm+u+5l>^{3vj!_T?Uud1y;c&n?3@U_|1ST+Ldfx+bV8JN9QP- zk&Of$?G;aiOMC`+q$?Kex)yQLK2fymn3@R~4h`dn&2U^^VYtHCgC*!zqL>jZWKnhDhwX^VtKvh zBds`n7V@phYpV|#W9WMkF%!{RwN^saQuGmQt5Bef$X>&^RlK^(ygV+RR(`qn$dPqv z>n!o|w6!a|C7`AE;vH~lp8J*%J^+{AMZOloN8wT%{!75iJK|W#ATim zA7A?i(4lMe(nvKIQ$tz_#ME$ra1IxDqaZ?Q8A;QDR?ZoqNX|_rPi?c|2A&zb=3bUr z`ISr|et2wcx;hagTfLDau8*{W20mg%rF=y5=Z%q`J_tC~eZ&bzRHXQbhN-w|29CNA zZvd`)J1{?p)YyhEF0n+UM^UDx#Eg#7sIfC1l~Py+sE@TmuZ=>3s+EhcWKkgF8oM>la z-|RW&zJqvbr_M-wKAC@oMNghL6=&DXn3|bHrwAn{;S6Lt*AQ=$+^@RqTgcxH zLU+OdOTWbzWT6Ac7dJRSR0HCx!2@35&3!l zEk;633;#Jdfi5>8J1qgn!r?dF`SYdh=wv8m4bMpe&+T3Lb*j@S6Vgf4aj6hrpJKf1 zxq0Q_F$8Jf0nnNpJ(u`?L%&7f94$H;hRzvFtC?Z)y)bO)33BnjsZmAX ze^a>)Z@My&F09_ zsz{+rY@Zw>>H33c&s^A(>YW%~gK!T?csIh{`!K$q@V_{w(D~p6s4UW-F>82Yqi?-D za1LNH7C%#@iA8zd6w+?*#gDm9KsJ&`3~zy-#!4}~PKftjKe&YrSn|SJ-;e9nd2KKi z$ioj}xe53Jo;$n~deMp=x;DH~^P6s{e-ZOM1wYl@3%T-FgG%)h(<}qMRPHqh)BBVd z9|^ss;bR_l_)Q20;v3f}q|?Bq_a^b|V`&AFmU|+8iRKp#s2k(XTEkg~7`$r+Q~uCu zERLe#bKCmN=IaMdRP^EZ8HoD>zej&e{nUjzXJSIh?=wI&^OR5g#`b6MqdC+c0PlQ| zKL$RLt_pNyW3dg5=JqamwxKLVB06-T4P7W&PJS*OP)KDb^1V~Aqxbs4T}|M%z9ja^ zNKM1?u}zViK7B@h-^5S_wpOHJ!8b8+Kq!wSf1MLkZFU9sCAB2~uE?MIvkQggYoxb& zC(3R>TCxcWkh^+a+-8M!ZA_EtIMK;VN zuonhzJTvjLP~KGO!t_)u)1%{?nvP?1qH>a>go{6-GV^97Pt8Tojh%Q?Q&MyIRN@wf zsAQEsIoY5~HW~GLQ<5q*IwxfsXF~<@BA`dX{ly=M7mm$K(RA+u1u>Cr4ICHlk(tGj z75lR?2pWxx=<}0$=m=N#xIedU7Ohk!r%lIi@nSe;^w=H~V+Ik;&mK5J9;=I+OmyXS zaKpK@e|q2uS>b_;0j{zxj^oFk5M<+I8OibUuZtT@`3Bd;acRTq;NrQo;dOBwU8_2{ zu^e4H;DW(7n#*@AN2dVpzU9E>a?@|N4Rx6Ijq%|gV@Zxu;4n27ad~riQm($wM}IHS z-get9*VY6ab!F@>;3RcJOSlYm02_b~N1)RajyVHZA{_eFISFne!he!()AG3a z6^jpG3W}eemY$N=V=lZP3SctA<|2tAd*B*i!m*qH7LGQK!6G-ghf+nT@Z11a zfeDI$<76ki^r5eJDZEc`Dg4ZeShf>Dj~IVQ60cc}vpWIzL1*##N*}<2(LTry;!_12 z18%*l7T3cNz}lg%Zj#_m1E&D)kOUWN3}7RHOMwl=r<*x|9Re;`f{O)iK5$HeO9L(+ zxQPpbF3edME%|z-T}YU=Cmz;1R%fzg>-wffkaNTg*0CM3^1Pp_p zo)WlS1pj#8>DeU53RgV;qYM^?b8sSyAGt$vQ&aH`8pX!&7kTl=C=X9z%)(J%7e#h5 z%MTcX!}XJA;C4;!m}N9dN^^a7N5XcTdN=PBHoknqBp$u7iz{PkrX47^2Dze?hY86 zkq6Xxx@&>0q7YWp`OqCKhIStE`mi?xCg7K$Avl{EtDG6BH%z19n}x~vwa6H{&IwcI zF+gISj6Fs9kcH{sdi)}fGpYS*FDLS(j*`XEOwtq0O8iEq;%BJ~@LdBSq(lof2A zN2$i-rwFECf60goUfwXDM4_Y3R0d3-6ZNSG*g4)W#7|&hl00L@?PZWvHi4>*hs`x`O%Ibv6SWpjHR0u zvY@JnV$G=@_>{jTL**Nf3W#7C#0=(Xk^(vK#!y%*dY2-?@fwR1o5COW*z^2KC%z&D}mdU|FIF`Of2sUm^+-OnjA-Int zGdTwm4Nk$_*X67bDQD(?D8AOyD3Q%l4TK)Lh< zK6q!PrB6rSkdT!`SGXkL9c322on;B>HMgyaQIgx4=+?4?>EJI=c_T6MJRndee*fSo z$)AARU>IFjz*tYx6`rxYtZ7()MsE`UNplhsNRnjw0;MJdx!OWvK5ZNL_|y)DZHd$A z&Y9eVd~U?zud*UDB%ndj%?PyKLDzrbEkV?oC#Aay(5rzPS&M#9;DnIzxpMa_kWBhI z_Q1G9Ot~Kb@OzFVe<3DKsQlOunvjf}$9O5Q^PTKXolRO!0&3h$Mh4+pJxj_-$D1I% z6hXeDlEU)+hUdkmPAi~m zYUAlQXWX~DE?`_1-y&*zJ9Li3noXfz&1dvHa1(OO&K-i$1hrk{%1xNA(jWJEC-?qC z+0lCtJ>e?{ac;>Ig8N_I74fVs_iD?1A1$V#1mxe^epl?MADypB@f@@N|8vb*fPUYm z^(!pJpx4LmE&zJDru8n0`~TQ2cBE}7BZIROY4T>BgHFx;FUh`PT=En z1K8{6u)pUSv2c`BpTV_Z;~N2NW6#=f*-rs%Mu*z)FnJ)`h|XS2U)~~+EyEhB7@pH9 zkj(&ZF2d+i!DO z;Og5Zx1PU$-k`Y@KE>|3X~g82swt`4*BuLHU!0!B0{>dGxyRQBxAjx78DCb(+HD&5 z(c@iZ&M%(|O59Wt6C-!M)VZx|(AK3({8{G8maeT&G;12dzG&lMi@R~Ywb9J)GcI;S zq)RoM^S$5EweVps?dSf9`~EB~V#S%KW$mojy*lj^S+E2eVn=p2rWXPe0>Ax>Wzf0l#n(z1PI8c#rorb(d}AQr;iw+WIb+=d=CU z;@6v#Y~!c1w`O(e(1LAy4u_B3Y}58&Gp1OOy@m75leK&8{KKbOGvy!sWvs&x=2{ZL zij(}=jCL0WPrq;~K=H!n$Fi&5J7xK`DCjTww)MY0u*RNU^&!H~r=Po-$xHA0Y0s_? zzDBSs+xX4zha=~Wo%7_W=O6k_CUbsrII2Qlho+X7-zW&lr?&`O~Y` zZhokf%y|M=IURcajTMRMw|BKfuvQ=ZRKEJTQ-2)EzvsP< zRa;AJkSJCt6*aH)WH-GE1kF4_ebtjh=9((hweDY9s-RRHC_sHb& zp-Un|!d)$tmBa2}bKWlR-c?@Ke$VPR=kzNXdQ zv!8`cS(Nv{{-VcL9A28IS`b=3>eeNNIsJ}~x~Z_siCcbryZpcG?Vv=}!~J)ZcYUhm z@WQO|ZGT9rxN({BF~4CgWy8-deYI-y#{FT+%09z(G?zcQ(rKC^UlMue@^i!8;R^@e zxGSx!aD==3zs?hm&`t~1KGsdX=Ci0lraimHuN&7P^!^`jc5RC&f3at7l zkC}6*kD~7nA2`#ymnDw~w^!!(uHI7^b#&9&)l-t6-!|Ltsk>b%uk;Mwvun-qwo^Cv zy#1qT`YpeFeE+gu=YMk_?Os$kBL1!Nr9BIu`)h(?g>}E*u*ik;rz}!0d90`7^qS)f z6-T=(p8TdoMdX6Dl@Inf-g4o|Sj7ix-PPqUeE)XJnaGf}z2&#Q>|eDMuC283p%}D^*TG#O)BNoK|)SZp~J$T2?p5>Ox0cY-s{if~W9jU4*&-~i+=q*njuXsDH zXHN9d#q*n0AFq6R_1MZyEO71w`GJz2-ni+`*$*#W$u@ry;Zjz<(xuz;tN&V4_3Y+d zB|F0tA2{h(mR<37)svfdnSOcQ-#Iun$o*G&bNlir*(3c7EH$j!6(yV6Ps381R=1lX z-#+?g_Fm^I8GJX6XYWOFzW7n>7j!5u`76f_VZU@D+=C|~U9T=JEWi1{%s+Oue&?;( z?2C3)yO*!u^2^ztQ{>+tF|f?0)rY3v`3ajM@9~p{9e(b0)6(h%f4skP%+{XHz$yqo z;)mCtJ^t^(!Y;Oq##FuzKXqZVDtByg*(w zyW)83N8c~}(I%D`pQoGy6nmurRK>o}CPFv>&Dgy8fs?lHnDLzx{axBU#|z)B zUb{CVdb~U*`mHvJJ&#VgV~eKG^mnVEVROnpK4U5Pjy`HGkbR zJ$2H)Bj*dt!*8m7;OJk5wLcmPZwvdq=LgSLjHw>F%>8Sy>*+stoymT?Z1Uk779=>n zykTMR4%}4!!}$*i+bk?3y0S zmPfGT%UFwUtY>gU#kAYoZ)`5>6SqBcU9h5`JibLY*E_+^^j}u6fj6p#uQs9)6?rg?$6VWE+Qn6TGQs zRO{1!HE+K&vW0@ZI6QLU(BTiP$(s1%1FPA=KG*y2>|2?>Yej`F=`MD#-zfiyKTcT1 z4jwBH{;Gf2dG%S{?$+}7*U}@lk2ijh(DU_P+Xu19B^LQDw)4lTy8e{9yNhhb-uHvQ z>KAtYz_E3St3F%&@>9R=?`fN%dhLast=e`dv>7qg>d>6+_p5Iva%lfAXPXQ^-sAQM z@;8+C-5T`qv+|<2iXMrd?YcLA=b2OKe?0c}%uaWf|GH{}ySU%og)Pc|7`iZF_3lHH zzr3+%XI_)O_)&h=982JrU39A!Z5zGJ&+w?bx4dM-QPrVYTW)PNxW}Q61GaMg`<5*w9ebgV_uI)8+iBN9X;vW8u8dBbv*WZT!{IXH)2pDjS@h>!+rb!7mi}D>MnJc3;}FCoYdn`gApGcakUF zQ24`+$LIUIm*-9^`R(TY--TDL`(ueZoGpFt?%gj0M+}?ZjQZkeglq7N5sNdwdZKej*+%EXs&?PC`7I{G z^nE;f<%Ksn ztUvrb^}zBIpB#Mar>HOd*_LjBrq8*!UegkLo+s43;eG>;d+LH~Keo1Q^4)B`Gb}z>UerP5O7>T52w(ilksa5E7(2*H!mB@-=^hm9(oJJA{_d93 zT>FAu6W(O)G0h71>oJ&J7ZVm9A?wp#<-Rp5#2K|rcKU_2`Q49>UirD7Y~zi#E#qUX ztJg&L{Q9o!72Vj2-2d*JOPjR{Y@P13YV-V%W5tZ#)@$$Uh zY&Bj+ZX1KQnWSCqS`~6a&U^H2=QBUYXFpRd3pf~>KKCxWkzP!P$Bl~JJUDSt{GeFc ztLOx{05Yb)Up#of{9kzX-Nxbp#ei}Fir^~#7j*Nb1N4*XT#c|da1)&`9{)CcBX#y> zhccvf0kA^y?|LpnXK!{O9JLeYwQPmIL1%BaC`CSrfNP>oTqT{o*@61Zf26RiVbe~13iSqY#zMs=-De%D&~O6d>1M4f5u`MY#31#dUN1;_z70hg86 z<>-&R{|=qWexzd&fb=9C6~5#|+*Q>d`CSQ}%fW|qEC!H{@c^YS9qYp*-QTW1$p$C_ zlwD+gq+ z#F36g0Me6myrlYiDLU4d269}M{-g(h^b&O}hM#nd2RQ4?`&x*DjF+oFmE{#}lULI& zm#hEPl=bh(>))zB)j2@o<=W)msK20lsUUkfT!(Vgn{zghpw z)%~B;A9=?EE@xb-ub-E;@p}DNyZoVZF`yhE%0>S8hUAdOgZ_%>PBKXOdh<)<6y?1r z*OMps(YWJ{N0BG3w=mKw0i`~8c;j0y&RZT*+~wvY{|zK|^{|yw|?--=e=zR+nOfI`v(&r|ABh^uGifTu|Rdy+!xmroUhV zS0m(hi#pclHiFMJ(f&mpAg>ZYb-FQa-X*5<B9F4}ng~ofOv?9`(^kd3p0AZGF0v zZbkL+m&Ca|`AgzNTV3FKrtu6nhDUugp8TX?q^nQ&Qp78W9&TgD#yahxKDop=sXX5N zBHg9B-gpuY{OZ&Fg82;S8*77d&^m=YE+}tLJ&3Np$CLhI!`^sX&|HiSu0{PxPfxjuJ@u?Fd?jsAUp^G)MOIJQ>kWJ3 z51v#9iU4GbL~k?=;V2!T-n<(V--vuJE02cwUrzj$ut7ulH^zqb(KN*Wa^o-81`Xw3 zpKgtbYl#1qh=&|bKzU>2@uX=ee^2_04L8L9O2tDi>QgS-1`XwZvHE(_H^l!+#$Tij zN#WC`g+ngHlHg=2N{$A(p4P0%HXH*(&xLf zulyxEL|zx=`r`X{;~_WMpakH&oV@<6`d^OD(zO4te@z>@sCqBjO=`=3qhHkH5?%Md zQD>>lm!LQGyF~znl+VA_e-ZkZg7%Wem}}WKjnKasG|p>Ths%-8hyFC5Z~-oQK5;p+ z{1a(C^milN;GFrNkn``#6Z&3Oe}?NSs;es^@duAPh;wj<6X%xWV1M$s7^8?v=pchz zM!LWy2X2Mnx_Or_fN}tj#E~FDVx+|h@63-&QbrsoDLHT*g3CEXk9-IZw<3~v%Y%5g zjCMl-?-pE_-~vf_k{bCGLQJ^j4#-7rBm{w55md&<`?=*5u9D#>L%8_gjB{N$W|_in zwt#cXSQY1%`|)m>jCaL&k)GjtEaFE;Bf_l|_>1|KH|O&g<*5+l6Xk_IoDgtbTz<9s zl?mZ;KO%uWn)7aDA@A}@@mH{y)a9%UJYS&If|;v{4Lt(7IsPLcoL z;r`|4Br~-~H=qbW?a~QQkSuU(WNVDS zG4g|t5{Pw0g#M|04Ly*`#Ge& zWciWSm&~PzBRNUN9019vsMnB}7zw@?B|qpznMpo^A^^!rGB#M=mnf#sWXSVk<#+mI z_76l{to;9gi1lW9t;i2K5(QaG;KtW0v?TIckY6IZv@VwcPi?>6zUiNq--ql{J<35- zEHQZ{MjBV@19qmIy$z&|Db#mG)FN<^;Xy%O?+$3^w~7c2YUB|rGm*hTG(%GnL5 zx2=)kK$9rY*VK*1gzFex5@<|XDUBp4$xYK>S=@=o*r}1nEkB$>PaR4Ev(@g%{IFUC?^d!3{iDpWrqmdk*mf9i{PVPicNq zzb|@UcxhUxAN0ju(olVJdBKY^mLaaD?Zf|%$xpf<|KfUN6=fD(sxNig`#&wephHe0 zbl~cXwETp$|ET>%dFrzx;u1wVPq)5wp0r}P5w;S`n{&l&Ol zKquPF4S%>a-kTpZm!yL?UV;ohb@rx%H$I?Kc*Fa`U5XC%@VadIeetdjf3Z6F;^oc8 z_2GQ+xfJ}x=-`WgeX@Fs^Tp><@r}@-95h9~_XX%5 z+~vqwUs^#{YKtWRXMMENIBzo6hm)qg7X0MibCkXb5&HyP{0Nz+~n{`zF~h@){f z@mi2sDuaiN-o~SQ#KMH@?ADG$sx0 z8d@mqKVpU4exx$ioO2mnHtTgC7#Pz&Fe*&!Zlaw~+&(aJX&)H5v?Gb!LcxW@g|Q9H zL3r>D;@xsT-YpYcH|L(Kc5!Z5HRIg{yjyPN-HKp2hp%LToLj}3ac(uU^R8<_ov;`$ z(u?Uueq{oGF+VYXY}?}bRF?^^D6c5LsE??h7nidm@Vs5C%XvFjpMc$IpB6zpK-{P0 z#C@>;ZBWrHiUhf0x`IGI{G433pZ7Ya?ayCTkhex&Yx<+Fq9-lQ%gDNA3+#maYuWTJAsKo)Pf#>jVxGEw_<1Bw7tr>L?B_Gnq1BwBZPkp>d zh7thDKxv$!4E4F7tB+?*oRkOBC;>%)a*y<-2$LKnLn6QlxU4pY^ffXx;1^}0{0T_D z9019nkjj50{ovhb`L1NXjpfx?`5McwF?7f?v9UJ4+VUa4Vo9Flch;wqgtp#tu8&7! z<2+=O=11)+(HozuC0{+V)yVlz$=4X!$WB*EKJZcisBfw1=e_YJ9B8EVt;SZsU*Pw~ z!yBD9oR}7IiIVto_~XSmPZx2GmW_CNrl+tZuM6~%#!1t9$+t)vFYxsx8|g%FL4KY* z1U?tgH72bW8B2jvG$0$%C;@K31^He{`FzMhb}8|eH*jQ6ZY+j-Rpj#_qo-X+=0vG& zuBLnq$XE(lE@2~fo<#tuY@(my6heLY zTiXZnA=xNDF>i9E?K9CMPNXXbJ|6J5$p_w^vQeIiWEbf}IDjaZr%P!(aaUyg5b_oI zmmz#X`xNCAXfKe%n{0#=(@9-lw4Qir8uBCF2?+PZdxk+%pB?MS?wOXto^tpKdrR9` zTw`VQ#?O~Lo_KF*F9z2b8NKoIl*3opTiT1o)gxmu;=I;lU-Ee3FIE;`^b#4%;CBJ) zt;3#j_zL^V?^5u{!>g^l@$w~)C*E7ytAX>B!&mrf$l@&zU-C%sRCk@;(q0XmL=I_R z*{Hhv56I_+yzy5f-^S(vd1x#x0x0TBgP)Je3PAvuMRINh{XB)R8-L-_`2^&a3$BZW zk*|^k(fJ1SyA7Ueu%$;-*>1H06OdAn3s@^-4O zB)idXObUP#ApXwes<&qa;T3pLuHk@0KnZ}_NTbU8a-(8mLc0p$R1d@mYTpWTs1I3N*Fa;5U~>P zl{d*;M;5mi~YUiO?J2{_0J>kn))r2hZ6CG z^Q;pWl#^$9dP!4;ibTnKwR{ij(9??Z6F)zf@kAk`DP%{U`z` zyrsu3)kqv!7(}ZH)n#=4A;Ksmr$x<=!OKX@nrIe?Oj z7_~P2(s{~| zD2)^RoIWBiX}pNL7WhN1zs)}2T`bZ2ikGjzpUN}Q!=_5$q~$D@H|KiL)`=74mC|_g zgH8dU`g1{gDZRIN!bxd-`9T*B@XX_i^bca5l03*>R2Ra6@2%XddN*JpK;~wv0Cxb~ z5pGs?D-Yx+9K{h0N4py?rLEo#c$@pZhzd#p5a(e|e*`Y$feyvK^l6B#kk+%VxEo4G z@jlXuyb=*#2B3COr*1YPE%6|oL|#-@N>L_{IFY7~>mv`6Ny=ADL-j!Pb8aK^BDoTU zyu7COAqUZtZKOK=E$NYmH+{vt>XqM1+D6;YBke_(AJS7^WTR5RMb{s({OWVT*Qagj zODB!Zx;Jp*iA~p_3?WBNzKDcIqTEQBVXEdXK(kGa?z`G-R64wqy z^kys*awmgp2HXVXkqc?3<8La$c}&C9HHl>`i1Sk~`+8Hdh||gUxqSvRCTB`mkm5Gt z^nO3q2QSDJnt^Xb{h2}`#KFP=tQ}sQDQ+3wmjhWia2zFi?I31N%F9d5oR%?HF()%4 zE6>)gAUDgLmpmgiGbt}BGd(#sJ1;veKPovp)0~u-89htYO_76k&Fu6njk=rNI#85d%#RZy zB{eTOH$5jGqS?ofQ4kYF0mncwBQ+x@HP<>&NwIwm_aGdn9PCOa!XH#;M*Tdh^}WRv=>l2b4(BRzRU>fEu}x1_?> zdYwr(O|MmHwaLk8s+6>Dij1VJ=>+S~Rb@H9xl?FMoJeT6QCA z14@B2SYB#!K`shhuv2d8tp%tcsVVWf>9f)^Qm3cp@i8IRny9!rNJE7*GIdsJh9ZOh z+PWp>4bPedO;Oeb>4TD~s@S@vC1vELQhEDGEaX}n?UAi@pj1BVz#1(np*1Nd2Nq5u zQ5vbWM$j7dkP3KAYJPrt*7Q6+wRv`)+SYAGetwR5;6R}vMb|W>Xf&jOW3C@QP_0zy z2MRSrWWcixv4Vp+B`1B*?4;b(ELgxEpPGApc2;_RcJ6rf07XGo62({tUO>l{#Xt|S zI3)*4v;?BI>Dc23#o~YL@KHl2P82-DBh;!WFxY;qovEH%QvET8H<7dZT4kWdCJYIcQuDK zdhK}agW3}9@7h3JoNlCUhHi`QCEbU*<%Y)%rwwh46OB2>&BnKk0j4lhA5*qzmT8q~ ztR=&;*YbmlO z^)BR!oABR*rxRgbGq ztJ(}dWHUG{Ve^<`fv3e3{JyQqs%lOx@|X= znwpt=nWvjqo8L2+n>Sc@SzFn(wpq4SwtcqmZN2QH>?`agc6zI$e5NZ4l?Ro7D)p*S zs=HL{RX?hlsjowxJ+xNsJ=(3>KeSDB!*xlz|LWe?1?i*oKN+eGV~zR7my918!%RI) zX|U#drgGCmmaUdRYcJ~ztIN96`l+?8&0)LER&1kL`Xk7vTB%f>Quopf*8Hg%r@ckH zM0-&CgZ8wxi*AH&jP5qw29(-cy3cfnb>+IVx^R6T!%#!6VTs`;<9_2gV+)f5+I?=y zG0!uvF+XA6Y~E@9(0thZoB5161Uc`ud}KLnIbrE+?PeWjt%SxspmVJ4VcU1M3fp;G zC%e+V(*Brzi~WRM=4kEM;rP^X%s~|@AF?sjse{U&l@&^(DpoaC^@l1#-CJ!@k5Gqc zZ`ZEU|8B@KFEtOaI4$v(-d2NkgmsE_v-MT$ht_YbO>7-)y=?|toGrnYXDhU=w*6!~ zXKP}gY|pYUu(xn@cbFWL9hr`Wj+Ksej%OV-al8vzhN%~--&KF94$y>ZT5CpX3N@=W z4{M&*yrTJ5b6j&y6QXUe{YZOQ`4q)wId7)%vdWu=RKAX=_(ox^15AN!v5F7j0kLPT7?9A@=+1#VGwZ z?U|0>9IS}nKiNd7QZ80Lq#0X%4nb zv+T5-vkZoP@329MV%~ngXw;}JBedhRDcW4)eB(;gj=jeBj3K6ura04erg5fQO|O{V zH=Qz_H3gVe<{Qna=DrrYCC)O*l5Tm{@{^^dwYznoHOKnB^*8GPn+|e6WP2J?``KIC zBkg(i#rD;9yJMK+4F@aX?|?F+MGjIOP)$>Rr%pyMkc8SaL-(^TRexBYWUw1sn^H`( zO*dF3SZ+qUn`3cVzOY1E=U5L~{cWvm3fnZ>Y~=8YZLe*r{XzR%_D}6c?6K7T+>AX4 z=Qdd6W#zBRbIKsqKGmnH+tiEIA0w~h>iab7HQO|wp=`=gHX*u}x^C!qa&(XAHtDvb zUC!1oGkj$D!qCiUHI78@^R{t~>98rn+|?Xq9%-I$zRUcexr60K%k7rCEe}~bS$kRo zZOv^r+7{aGvHi#Px$TI}Y9DEzXy0Ui(LTkI;@IQ(*zv7{l`?i8djK!v$}6|zoVw+>7UZS zq<=%-+^1)na|ovCHwJgMOHEf$fLNDrGZO2h}9a zbDGaJM>VH3)3h1dN?j9uPyL^IrD3We!!XD2j^V7Kmr-vVjQ+h4`uv8v)!N*}+|PWw zdAa#s^Ir3Q^RMQUW|^g_Ww@ola;N1U%UtyIA-49mp0*rYfo+$42u7L}j)PlB>a4n< zx>LGpT{GDF9{tn$-LUqj`c8)aXqm4-&T7)RlsyC{?R{vM? zy5?(5D{W7$Lpwx!gEkR;>c`rzwGo(S57SN4rK8VStXrj%>6_>+`dIxu{Yw1<`a}8? z=re*0;fAh;0R|QN*m%Qc!(PMphCdC=*xNYTI31QOH_A;-OwXI%Fnx#?8)MGJ=+)lR z&!V%KVaZg>w0U-PcUp$*o(t~;;muOF+=(LbtxTffeDz!+_sX*z1U0j=bu`8Cx3 z`HpwU4oVpt06SExyKCOk{-Hak^Mh75>G$Xd7_^3E27i+h^>(pohh>MAIb|#svf8XsT`Vg%>vDxXdzE)e$kxP$h9rBH|z8DYf(QpqlR`c95VcDXlfi` zeAC9_Wo#sPj8V@~->g&V-$Ok*XKrqpXgOl(iGJ#O)c->3YU>l$ZRl%1xBhB1bhwO?wPZkvu7elSLubS5j>U!^4-W6bY1=8|y>SZ`~3YquEx zH2RzRns3DjwbuN!`33V^=5Nf+9Bmw(9X%Zehr{s@`gs{Q&ONJoUiGEwC)F9%2=zF1 ziaJYuyZSEm!|Dy{7u37d@2fxK`nPkKYqZoTF;c&)`3QFEu6>?=5Ozr$ zqgNRE8E!DFHaui_*|6X6li|3*&)C*Dz^FB*W1jV(@k!%z#@)vEjmUL-{So_q`ync)5*Zr{r=L=UPajnpMWVrcs!)Otw5~x!wA(b)2opemmxy?>m@V z#x1rzt!$-AP><2DQW=|wJib*q)QdIybT=6WV>CI6w%Hc_wHZD2OjCi$Wm;)kYkJ(Y z$@DT>>j$QvO@EmD%+1U*Ewe2zSq7q~K4d*&?QH9Ai?XXR`p4U`d4UZB-#;*)m8(Kk zZB@6bj;Q`pozui)teR%@vox`^v~;xGYI(!b$~wfFYh47Je1o3KiN5M*j7>A_bL@B6 zSvhY5tIDcgs=i0PPkliBfaVd+7R+F7&`;1O=%?#n(Q6H9hBbyK(8p96CK?ls+c4ft zMGbn;wB9t;I@Pul^OBDC{&s`?Rr{}~HFB&kG1f}iS=m$hf%2HLAM7|p^^WR@x|yb} zCK9bTNqax)<5sOxcb#sME*ZVteY(wbKRAn!YHn4H^~t z`Xi{BU3C3)<8+z2yL8?4x#;6xMGya(ezM^XLy6%iY9jb4 ze$tJF9dgk3hMP3j`>aE3(f09}6+UJE(0&rL{%E{wJW8@C<=nf5S(&N4Q+YDoMP zp?0PA0c|qMW~=T!-EX?p`mYQp4Y9^MjK@ts*v{IT+dJBO+ckFPl5-y*^+10#Mm0q> zRg-eW3bQ{iFJX<`cu$cys*Sc-k0lx(TE1BJ)^_-1@xjpzSZT zJMbx%b3b}?SN2h+Dc7Q}2~)+O{ms|>sQFbBtzD#jLfc8#L)Q)U^Lu@Op{2oM$T6%k zY=^wx8G?-_<8ISR%RJ1bAGSYdf8G9*{fu4ZusP!K=7~36^lNgq9*#m81O9(1m#7|u zY-d!F>fLx(iO^^@lQfIbDmI~B9MyEv_JQT%G3TG7-GYhX?TJ_ob75ZSqB)lCJ8cyR)GThYPWHi}KgVAf2K!UxdgQjmxv&;{1^Tf9- zhb&F4ChN`C?bf|kIp&E&Y;V~P*_zr-_M7du*}LLx?ncZR(;W9F#J^;4-;DXO`u<*FxDyH%g7PN=F>foi5R>YSLX z#p|BYZ7{xQQke72XU(ik&h7xq2UW$Yjj9q=sQP;KGwKc+ohD8*N^=u>*!MI?FoOxv zcG0S}H)_+gw`p_HGi=oz&>exr)%wBuTlH)7&tMkX-=IMah%x-faNIP+Jjy&CbMWnE z1;*>!F&nQ~GGZnd4UjknLUGraY_>p0;!L-xTsKdm*$ zFbA5X?xD%nEWx<{f#wH|Mmq)?WNLS5Kht)=d(?1Uw(f1+e)O`d(CRAmr!jL*!0djf z@l#_Dlhw4s^o;3N^y_QUlO4Cl*j8e`yxmSS9UJ8n?#J~>!@>1_?PJ<#eJevJLl4Y! z7od;Mz^cVN#$1Uq4eYWKecig`ua7>*OVsIhC^skm8i#2+Ei^X-KUtNA25Dl z?2fT^p?#l&IsLf#+uh2xDyM3gDqb}aGr3T8lzNOhQ@v8XLbFD*PVf%X%; zmp+8`n&&ZdjnS9t{S3_v>kKa#@*v%Aa6NB)%(T(m+%_5Sz%y;RSQUEAz5y#EFJpxK z*zu*~I|q%#EZ&cM7mHIquRN^Oscfn^)%6%BJHaxWFo)lveiQFRt2OUyI%0;{U#rpH zjX7KlYV%ZG3f2zp*8NBKwC+XS2fEL70hr0D^fvuR`lEVg2sR8tdt8eC-)fA*ThRl? z4(2B?TiK6QfVG%S?}bFjKhcltGnLATkf03pZ?I~r>UT|N?L&q$hIh@MVD-n((gSZK z*IDu`^DMKlj`ywg7wdgkbJ}9tjTIQG+u)Pq$MyTYmBTSh+oC+8`bBjTt#6__TQeK0 zE)QyoH77M$sDDTB&fG=U3#}+f-(25IAFZE{+4^((7xnL;H|>h|<4G7(H=8~-{fPHt z8Q$h6V9vb>Ey`_fWy!_tXagiaXdCG$!2Ev;+0f<3jq5X2xvJY$PpDp3?N$AW_jNN? z*hZ_DsaIkC9<9}D?dZ9l)PAS^Rr`u=mp%?-%qomvyNySTzZoM@>uILf6z{g3&3d!l zTx33Oe#r8F?VbNuSM?poKg*BB&OR$NY?#==#%Z6Ft^57H@BQ2_tiy_wmKo(|MTwJ& zk_?MeRLrO-(Sz=jV<*-yv80Iaatx$x&fh2alhcH7c@C8x=L&sI$kt)YjQQ zuwUjc9)FR0UtgZzUiawh@M|vox}4PHba$bvxJ%rN$a+o)-Z?d0yJA_B9eD{qS*TU& z4Jeui)%(nCXoZL{tWL{M)F+-z9L86ifQ(y=8r|S3u)}_MVXj}|M>=PO8uX|^JA&z%LaoAbT7aCaepo(qqf1jf)NrNJ1yY@~NoohD5^@8YdzXAr`LhyH=c{oh^b>U*%=kDi zQQ5nalIwkTkXAY%&BCBFS?Q8={@^E{zU#vo~f)L@%gQ`P*>ozv&na6 zkhiWg?g5*|j0?<0Jjmbi_9uvy;7S?kNz$sac3TU;*;V%S;N*I{6D8DV586lUtewxa zmXaX4&ehJC^9a7;vtZ7T%m^aiNSBm=lE>Y}WEMA~Wxog7UkkqN^(TYAaLEla<ZN~AT?PsqM2^8R|Jexz8zlMjk=#p@^hB4 z(pU|e%_CRQNW8Bx?_dJ&Hy<%$?kS|b%fPeMq)*uC~XJIki! zI9r^j!sPf}=VRw2vZy$_`+c_eQn%XOL?U^>J?ehy&h!?*%(hqRUF5Cs*21V8$!;G) zxAl=$u7F3Pp;kLfULjvE-zM*uUyycG>~k)fQe^l5|Id|lR0 zHs%|}hGG1`xBz@TV4Px}V_stZ*gQ=2PZkB@3b9!{00JB%J)Q&Frma_l^bLS%vOVxSCHd323 zNyGu;uyK?OGVtP?Ngaa3q0Cx_ihRl1YCmqjW#5(9n%Il~Ogfv;kcXTr-DmMH(eOVA z{U>_;BJFar%$u~kwV!IQX-Bm8^pEx9jF>Uc_zp-|!c5+6+z;oxX}phn_Q-4>G@l?V z+Gmc_zkIPkd{9U&m$Zcj(wR zoN}+itMsb9XPD-f=$noc{<*)^-!+|kHbwb&B_fesc#%Ew^YT398@Mb<6YS$kZ7nyD z4cd0_^AH*POnsI<+srplLsu;{CDSk+^K9;3KQt@MOPR5&$YyUKon41F-e{)qjvc%~ z7YRVGxf{ONYYv$&leN7;zmM`xpPEzVaUw^YDDuRqqEMVcrlSZUJW)!=mh!HZq!Kl} zaXsA7B<>-D+Ct?Y5IdNX9xe@iVp1%y?y!Cns`>ra`#93itk>PIlcBH1ZEy7MXO9nf z?|_{jdo%r$xW?S-Z})#i>I)a8qLESF{aezv$<-66vYWYx-6w682BiJcIBq<+TpdOg zMwL0>X|-}KX<1r%gRCq^orONUO>JThx2t{XKJ@~eWR>=)_7qC-V{MA-K%PEdFV+q2 zk{9b$`qlW$O?Z=E=-coo-6+Z3IQl^p?`!1c?}Ul@3?s)l5#M=wsO6U#m*Mp5V1q{E zPNN0xX=6S*NiDmLCz#2njR9jnD(^KTW4r|~{gvtb2grWB8H1yPKJjv$(Mavrpc;7$ z{V~a#lxXERw+ftFn!Oyux#j5jILA28D&e67nRXe^yi~8ylPJ0>y%twjuQ#9pn#ea& zq%Q3+VyC`C??Mx#^*(M>1H8$QKB8yzBQWe3Dc-m~rALe?Zxl0fjXZ9aMMj+cmkiAi zq_0gzGw;-Dq>OgnsoUrw(MTKp$xX2)AKgbLC3ps-D&!)*(G+VUB*2n zi6^PDYwbEzeG|8pl-*`$>{0M+!fs8pCpr?H@MjOVi~fYbuax0fk~qv7bW;Pj$`&W( z^f?305SO70_ou8g!Tm7m#<&tyyS1QTBe$+r)LpOJ=MIDlF9Y`#dU0-wf-6lgSUBia z`?Y?3fKxru(4!|&BrPPqX=#|tVnoiD0|u-@ouu$}{qhKjc#)!^rFWy!dXrv} zulWwCcMBJQl-~izcl$kDEBo=9!~Vg*oApN{-Sje7D!^?POOoWkvE|ZIsZy#US*Vj5 zNf%miZ5{mdZmCD=llrA0o+5*a&N9(cJWWi_l?(6^fs?4=nOef9YF9E!Rw+O;6{|vZ z)Dp0-jN9Z=wSrWr5)E0c)~K~=omx*u)QEEKCMD`s)69OqI-nj@M^G8#T%e*_jJZ0f zjcB7xR~APy!Hi8YWif6hdCXdYUig(+Dz^oKACl1$(a-)W6 zX=GM}Sqj=zfFx69ob*?~v!&p~^pqS7?^*d)fmO(Dx)?p`SS41e6{xdH)LFGvgCA?K z8c9x@zsMoG;K8)jXXP?eWq8~q^E6-&+4W3KnyDE~1lXGEl#^psI^AUcDLh7xTLGR< zcYg?FmO-0ky>V}XE=JMLWuz*R;b>$aSU;(YKBVcxurwkya<%J|g;J`NDHTcz1r$;9 z)BRDdAWTAkLYwV>5HwQhE_jmjJe_bLD18|1(irA8U|lO%f->`)t9w8Q9P zkAfW>=rJPUFg&yHYaNbZ#;qyoPbTH z5|Ja(Fvss#y6AJ3-cFI4<_j!7Ih#(3uw?uI++FmM%esuwmz4xRT{N)ZPdte z@rdEYi(!j$vxbXZ6P}@6bn-N5)blWX%cW-$-3ofuX=SWYYl37kX6M;OcCqcS?-lHN zEh$MeJKllws>Q!FCtBI@9f@8xd?=AgXpR$hD(F+N*Z76d%%Yb6Gxx?*tBjeFX z5&an_LyBl)@JNo8Z^f-Xwr$8C`Qn;2Gcv@!6|-mMlEXI=?Q%z$&Ge$!`_Qr()V8KL zO1V;rr)yK%l^yhSNXg?STg#^OP`7^meu=)Ov~sfLQXSlibuSGo-{th6eEOY161)*GbqqwEi@mLt?X?_$bM;NV!#+O4#MT5aCyuO@~gsdYf4E{8_XtVWr}UC z{el-;zTm|!QuA@xSPc|qppfcN9xYmc6q97M4d8k^xK+S4x{AcQ3Edd%MGrfX zD@sHe_?~3aM?{h=ZTdYXtRh?ET_*Upsx6$$UZyf&`FiG|jai`2B{L&={1%n+;mSB% ODJ1^*|6l*Z3j7Q3=OaD< literal 386560 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

eFA1Q-#0a%9*pdsXs^H78BATp3U%;gyOZmr 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ӛpOZl6*u%EAJvW@bJoSwZ;`mspdx8eC>QNNRp^7i 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 Date: Fri, 14 Jun 2019 11:20:39 +0200 Subject: [PATCH 0168/1449] web - receive proper uris --- src/vs/code/browser/workbench/workbench.html | 3 ++- src/vs/workbench/browser/web.main.ts | 26 ++++++++------------ 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/src/vs/code/browser/workbench/workbench.html b/src/vs/code/browser/workbench/workbench.html index 1d443c01e62..a11d9901d77 100644 --- a/src/vs/code/browser/workbench/workbench.html +++ b/src/vs/code/browser/workbench/workbench.html @@ -16,7 +16,8 @@ self.WINDOW_CONFIGURATION = { folderUri: '{{FOLDER}}', workspaceUri: '{{WORKSPACE}}', - userDataUri: '{{USER_DATA}}' + userDataUri: '{{USER_DATA}}', + authority: '{{AUTHORITY}}' } diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index 0732bd22a90..9f39bae7e51 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -24,7 +24,7 @@ import { Schemas } from 'vs/base/common/network'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { onUnexpectedError } from 'vs/base/common/errors'; -import { URI } from 'vs/base/common/uri'; +import { URI, UriComponents } from 'vs/base/common/uri'; import { IWorkspaceInitializationPayload } from 'vs/platform/workspaces/common/workspaces'; import { WorkspaceService } from 'vs/workbench/services/configuration/browser/configurationService'; import { ConfigurationCache } from 'vs/workbench/services/configuration/browser/configurationCache'; @@ -185,26 +185,20 @@ class CodeRendererMain extends Disposable { } export interface IWindowConfigurationContents { - userDataUri: string; - folderUri?: string; - workspaceUri?: string; + authority: string; + userDataUri: UriComponents; + folderUri?: UriComponents; + workspaceUri?: UriComponents; } export function main(windowConfigurationContents: IWindowConfigurationContents): Promise { const windowConfiguration: IWindowConfiguration = { - userDataUri: toResource(windowConfigurationContents.userDataUri), - folderUri: windowConfigurationContents.folderUri ? toResource(windowConfigurationContents.folderUri) : undefined, - workspaceUri: windowConfigurationContents.workspaceUri ? toResource(windowConfigurationContents.workspaceUri) : undefined, - remoteAuthority: document.location.host + userDataUri: URI.revive(windowConfigurationContents.userDataUri), + remoteAuthority: windowConfigurationContents.authority, + folderUri: windowConfigurationContents.folderUri ? URI.revive(windowConfigurationContents.folderUri) : undefined, + workspaceUri: windowConfigurationContents.workspaceUri ? URI.revive(windowConfigurationContents.workspaceUri) : undefined }; const renderer = new CodeRendererMain(windowConfiguration); return renderer.open(); -} - -function toResource(uri: string): URI { - return URI.parse(uri).with({ - scheme: Schemas.vscodeRemote, - authority: document.location.host - }); -} +} \ No newline at end of file From 96913ae480c8e056cc15d7c3a55f25be2b602efe Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 14 Jun 2019 11:21:42 +0200 Subject: [PATCH 0169/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4f1e1fe316b..e31c66de33d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "57a01bff16cd179e088fbd31d759765c4f62f080", + "distro": "2ae09f85117daa71bf7db8f10eaf4c52af4ae4ec", "author": { "name": "Microsoft Corporation" }, From c6d9e8ea6406fb7a197a3ecd3f32c78321446b2a Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 14 Jun 2019 11:52:39 +0200 Subject: [PATCH 0170/1449] status - push proposed API for statusbar id/name and adopt --- .../client/src/jsonMain.ts | 7 ++- .../src/utils/projectStatus.ts | 7 ++- .../src/utils/versionStatus.ts | 10 +++- src/vs/vscode.proposed.d.ts | 49 +++++++++++++++++++ src/vs/workbench/api/node/extHost.api.impl.ts | 21 ++++++-- 5 files changed, 87 insertions(+), 7 deletions(-) diff --git a/extensions/json-language-features/client/src/jsonMain.ts b/extensions/json-language-features/client/src/jsonMain.ts index 291889faad9..1f51b66733d 100644 --- a/extensions/json-language-features/client/src/jsonMain.ts +++ b/extensions/json-language-features/client/src/jsonMain.ts @@ -83,7 +83,12 @@ export function activate(context: ExtensionContext) { let documentSelector = ['json', 'jsonc']; - let schemaResolutionErrorStatusBarItem = window.createStatusBarItem(StatusBarAlignment.Right, 0); + let schemaResolutionErrorStatusBarItem = window.createStatusBarItem({ + id: 'status.json.resolveError', + name: localize('json.resolveError', "JSON: Schema Resolution Error"), + alignment: StatusBarAlignment.Right, + priority: 0 + }); schemaResolutionErrorStatusBarItem.command = '_json.retryResolveSchema'; schemaResolutionErrorStatusBarItem.tooltip = localize('json.schemaResolutionErrorMessage', 'Unable to resolve schema.') + ' ' + localize('json.clickToRetry', 'Click to retry.'); schemaResolutionErrorStatusBarItem.text = '$(alert)'; diff --git a/extensions/typescript-language-features/src/utils/projectStatus.ts b/extensions/typescript-language-features/src/utils/projectStatus.ts index 4eb9b8c7686..15aa72a80d0 100644 --- a/extensions/typescript-language-features/src/utils/projectStatus.ts +++ b/extensions/typescript-language-features/src/utils/projectStatus.ts @@ -23,7 +23,12 @@ class ExcludeHintItem { constructor( private readonly telemetryReporter: TelemetryReporter ) { - this._item = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 98 /* to the right of typescript version status (99) */); + this._item = vscode.window.createStatusBarItem({ + id: 'status.typescript.exclude', + name: localize('statusExclude', "TypeScript: Configure Excludes"), + alignment: vscode.StatusBarAlignment.Right, + priority: 98 /* to the right of typescript version status (99) */ + }); this._item.command = 'js.projectStatus.command'; } diff --git a/extensions/typescript-language-features/src/utils/versionStatus.ts b/extensions/typescript-language-features/src/utils/versionStatus.ts index 0b3e3412617..07bd2e5921a 100644 --- a/extensions/typescript-language-features/src/utils/versionStatus.ts +++ b/extensions/typescript-language-features/src/utils/versionStatus.ts @@ -7,6 +7,9 @@ import * as vscode from 'vscode'; import * as languageModeIds from './languageModeIds'; import { TypeScriptVersion } from './versionProvider'; import { Disposable } from './dispose'; +import * as nls from 'vscode-nls'; + +const localize = nls.loadMessageBundle(); export default class VersionStatus extends Disposable { private readonly _versionBarEntry: vscode.StatusBarItem; @@ -15,7 +18,12 @@ export default class VersionStatus extends Disposable { private readonly _normalizePath: (resource: vscode.Uri) => string | undefined ) { super(); - this._versionBarEntry = this._register(vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 99 /* to the right of editor status (100) */)); + this._versionBarEntry = this._register(vscode.window.createStatusBarItem({ + id: 'status.typescript.version', + name: localize('typescriptVersion', "TypeScript: Version"), + alignment: vscode.StatusBarAlignment.Right, + priority: 99 /* to the right of editor status (100) */ + })); vscode.window.onDidChangeActiveTextEditor(this.showHideStatus, this, this._disposables); } diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 317a06d6a5b..7aad5441466 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1436,4 +1436,53 @@ declare module 'vscode' { } // #endregion + + + // #region Ben - status bar item with ID and Name + + export namespace window { + + /** + * Options to configure the status bar item. + */ + export interface StatusBarItemOptions { + + /** + * A unique identifier of the status bar item. The identifier + * is for example used to allow a user to show or hide the + * status bar item in the UI. + */ + id: string; + + /** + * A human readable name of the status bar item. The name is + * for example used as a label in the UI to show or hide the + * status bar item. + */ + name: string; + + /** + * The alignment of the status bar item. + */ + alignment?: StatusBarAlignment; + + /** + * The priority of the status bar item. Higher value means the item should + * be shown more to the left. + */ + priority?: number; + } + + /** + * Creates a status bar [item](#StatusBarItem). + * + * @param options The options of the item. If not provided, some default values + * will be assumed. For example, the `StatusBarItemOptions.id` will be the id + * of the extension and the `StatusBarItemOptions.name` will be the extension name. + * @return A new status bar item. + */ + export function createStatusBarItem(options?: StatusBarItemOptions): StatusBarItem; + } + + //#endregion } diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index dc6f2cd2e16..6944f8e767e 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -465,11 +465,24 @@ export function createApiFactory( showSaveDialog(options) { return extHostDialogs.showSaveDialog(options); }, - createStatusBarItem(position?: vscode.StatusBarAlignment, priority?: number): vscode.StatusBarItem { - const id = extension.identifier.value; - const name = nls.localize('extensionLabel', "{0} (Extension)", extension.displayName || extension.name); + createStatusBarItem(alignmentOrOptions?: vscode.StatusBarAlignment | vscode.window.StatusBarItemOptions, priority?: number): vscode.StatusBarItem { + let id: string; + let name: string; + let alignment: number | undefined; - return extHostStatusBar.createStatusBarEntry(id, name, position, priority); + if (alignmentOrOptions && typeof alignmentOrOptions !== 'number') { + id = alignmentOrOptions.id; + name = alignmentOrOptions.name; + alignment = alignmentOrOptions.alignment; + priority = alignmentOrOptions.priority; + } else { + id = extension.identifier.value; + name = nls.localize('extensionLabel', "{0} (Extension)", extension.displayName || extension.name); + alignment = alignmentOrOptions; + priority = priority; + } + + return extHostStatusBar.createStatusBarEntry(id, name, alignment, priority); }, setStatusBarMessage(text: string, timeoutOrThenable?: number | Thenable): vscode.Disposable { return extHostStatusBar.setStatusBarMessage(text, timeoutOrThenable); From bfa6a69e6bc2160b8c0fe851077425d7ae3eeb5f Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 14 Jun 2019 12:01:57 +0200 Subject: [PATCH 0171/1449] fix #75497 --- src/vs/code/electron-main/app.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index bf75167101e..c0915846528 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -254,21 +254,18 @@ export class CodeApplication extends Disposable { ipc.on('vscode:reloadWindow', (event: Event) => event.sender.reload()); - // After waking up from sleep (after window opened) + // Some listeners after window opened (async () => { await this.lifecycleService.when(LifecycleMainPhase.AfterWindowOpen); + // After waking up from sleep (after window opened) powerMonitor.on('resume', () => { if (this.windowsMainService) { this.windowsMainService.sendToAll('vscode:osResume', undefined); } }); - })(); - - // Keyboard layout changes (after window opened) - (async () => { - await this.lifecycleService.when(LifecycleMainPhase.AfterWindowOpen); + // Keyboard layout changes (after window opened) const nativeKeymap = await import('native-keymap'); nativeKeymap.onDidChangeKeyboardLayout(() => { if (this.windowsMainService) { From 8c4a49f8b9cd6a537647747ac157497385e101b2 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Fri, 14 Jun 2019 12:06:59 +0200 Subject: [PATCH 0172/1449] [testresolver] kill server on shutdown --- .../scripts/terminateProcess.sh | 12 ++++++ .../vscode-test-resolver/src/extension.ts | 7 ++-- .../src/util/processes.ts | 37 +++++++++++++++++++ 3 files changed, 53 insertions(+), 3 deletions(-) create mode 100755 extensions/vscode-test-resolver/scripts/terminateProcess.sh create mode 100644 extensions/vscode-test-resolver/src/util/processes.ts diff --git a/extensions/vscode-test-resolver/scripts/terminateProcess.sh b/extensions/vscode-test-resolver/scripts/terminateProcess.sh new file mode 100755 index 00000000000..908a68287fa --- /dev/null +++ b/extensions/vscode-test-resolver/scripts/terminateProcess.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +terminateTree() { + for cpid in $(/usr/bin/pgrep -P $1); do + terminateTree $cpid + done + kill -9 $1 > /dev/null 2>&1 +} + +for pid in $*; do + terminateTree $pid +done \ No newline at end of file diff --git a/extensions/vscode-test-resolver/src/extension.ts b/extensions/vscode-test-resolver/src/extension.ts index 1c2236ddc58..0520edcff4e 100644 --- a/extensions/vscode-test-resolver/src/extension.ts +++ b/extensions/vscode-test-resolver/src/extension.ts @@ -10,6 +10,7 @@ import * as fs from 'fs'; import * as os from 'os'; import * as net from 'net'; import { downloadAndUnzipVSCodeServer } from './download'; +import { terminateProcess } from './util/processes'; let extHostProcess: cp.ChildProcess | undefined; const enum CharCode { @@ -87,14 +88,14 @@ export function activate(context: vscode.ExtensionContext) { if (!commit) { // dev mode const vscodePath = path.resolve(path.join(context.extensionPath, '..', '..')); const serverCommandPath = path.join(vscodePath, 'resources', 'server', 'bin-dev', serverCommand); - extHostProcess = cp.spawn(serverCommandPath, commandArgs, { env, cwd: vscodePath, detached: true }); + extHostProcess = cp.spawn(serverCommandPath, commandArgs, { env, cwd: vscodePath }); } else { const serverBin = path.join(remoteDataDir, 'bin'); progress.report({ message: 'Installing VSCode Server' }); const serverLocation = await downloadAndUnzipVSCodeServer(updateUrl, commit, quality, serverBin); outputChannel.appendLine(`Using server build at ${serverLocation}`); - extHostProcess = cp.spawn(path.join(serverLocation, serverCommand), commandArgs, { env, cwd: serverLocation, detached: true }); + extHostProcess = cp.spawn(path.join(serverLocation, serverCommand), commandArgs, { env, cwd: serverLocation }); } extHostProcess.stdout.on('data', (data: Buffer) => processOutput(data.toString())); extHostProcess.stderr.on('data', (data: Buffer) => processOutput(data.toString())); @@ -109,7 +110,7 @@ export function activate(context: vscode.ExtensionContext) { context.subscriptions.push({ dispose: () => { if (extHostProcess) { - process.kill(-extHostProcess.pid); + terminateProcess(extHostProcess, context.extensionPath); } } }); diff --git a/extensions/vscode-test-resolver/src/util/processes.ts b/extensions/vscode-test-resolver/src/util/processes.ts new file mode 100644 index 00000000000..d5af12566fb --- /dev/null +++ b/extensions/vscode-test-resolver/src/util/processes.ts @@ -0,0 +1,37 @@ +/*--------------------------------------------------------------------------------------------- + * 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 * as path from 'path'; + +export interface TerminateResponse { + success: boolean; + error?: any; +} + +export function terminateProcess(p: cp.ChildProcess, extensionPath: string): TerminateResponse { + if (process.platform === 'win32') { + try { + const options: any = { + stdio: ['pipe', 'pipe', 'ignore'] + }; + cp.execFileSync('taskkill', ['/T', '/F', '/PID', p.pid.toString()], options); + } catch (err) { + return { success: false, error: err }; + } + } else if (process.platform === 'darwin' || process.platform === 'linux') { + try { + const cmd = path.join(extensionPath, 'scripts', 'terminateProcess.sh'); + const result = cp.spawnSync(cmd, [process.pid.toString()]); + if (result.error) { + return { success: false, error: result.error }; + } + } catch (err) { + return { success: false, error: err }; + } + } else { + p.kill('SIGKILL'); + } + return { success: true }; +} \ No newline at end of file From 14b384f2cc5e53be3114a74f8903c01a0089d31a Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 14 Jun 2019 11:12:53 +0200 Subject: [PATCH 0173/1449] :lipstick: suggest widget dispose --- .../editor/contrib/suggest/suggestWidget.ts | 63 +++++++------------ 1 file changed, 22 insertions(+), 41 deletions(-) diff --git a/src/vs/editor/contrib/suggest/suggestWidget.ts b/src/vs/editor/contrib/suggest/suggestWidget.ts index 0c0fbb66f0a..8b9e470db98 100644 --- a/src/vs/editor/contrib/suggest/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/suggestWidget.ts @@ -9,7 +9,7 @@ import { createMatches } from 'vs/base/common/filters'; import * as strings from 'vs/base/common/strings'; import { Event, Emitter } from 'vs/base/common/event'; import { onUnexpectedError } from 'vs/base/common/errors'; -import { IDisposable, dispose, toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose, toDisposable, DisposableStore, Disposable } from 'vs/base/common/lifecycle'; import { addClass, append, $, hide, removeClass, show, toggleClass, getDomNodePagePosition, hasClass, addDisposableListener } from 'vs/base/browser/dom'; import { IListVirtualDelegate, IListEvent, IListRenderer, IListMouseEvent } from 'vs/base/browser/ui/list/list'; import { List } from 'vs/base/browser/ui/list/listWidget'; @@ -29,7 +29,7 @@ import { IStorageService, StorageScope } from 'vs/platform/storage/common/storag import { MarkdownRenderer } from 'vs/editor/contrib/markdown/markdownRenderer'; import { IModeService } from 'vs/editor/common/services/modeService'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { TimeoutTimer, CancelablePromise, createCancelablePromise } from 'vs/base/common/async'; +import { TimeoutTimer, CancelablePromise, createCancelablePromise, disposableTimeout } from 'vs/base/common/async'; import { CompletionItemKind, completionKindToCssClass } from 'vs/editor/common/modes'; import { IconLabel, IIconLabelValueOptions } from 'vs/base/browser/ui/iconLabel/iconLabel'; import { getIconClasses } from 'vs/editor/common/services/getIconClasses'; @@ -405,7 +405,7 @@ export class SuggestWidget implements IContentWidget, IListVirtualDelegate | null; private focusedItem: CompletionItem | null; private ignoreFocusEvents = false; @@ -423,7 +423,7 @@ export class SuggestWidget implements IContentWidget, IListVirtualDelegate(); private onDidFocusEmitter = new Emitter(); @@ -466,7 +466,7 @@ export class SuggestWidget implements IContentWidget, IListVirtualDelegate { + this.toDispose.add(addDisposableListener(this.element, 'click', e => { if (e.target === this.element) { this.hideWidget(); } @@ -487,19 +487,18 @@ export class SuggestWidget implements IContentWidget, IListVirtualDelegate this.onThemeChange(t)), - editor.onDidLayoutChange(() => this.onEditorLayoutChange()), - this.list.onMouseDown(e => this.onListMouseDown(e)), - this.list.onSelectionChange(e => this.onListSelection(e)), - this.list.onFocusChange(e => this.onListFocus(e)), - this.editor.onDidChangeCursorSelection(() => this.onCursorSelectionChanged()), - this.editor.onDidChangeConfiguration(e => e.contribInfo && applyIconStyle()) - ); + this.toDispose.add(attachListStyler(this.list, themeService, { + listInactiveFocusBackground: editorSuggestWidgetSelectedBackground, + listInactiveFocusOutline: activeContrastBorder + })); + this.toDispose.add(themeService.onThemeChange(t => this.onThemeChange(t))); + this.toDispose.add(editor.onDidLayoutChange(() => this.onEditorLayoutChange())); + this.toDispose.add(this.list.onMouseDown(e => this.onListMouseDown(e))); + this.toDispose.add(this.list.onSelectionChange(e => this.onListSelection(e))); + this.toDispose.add(this.list.onFocusChange(e => this.onListFocus(e))); + this.toDispose.add(this.editor.onDidChangeCursorSelection(() => this.onCursorSelectionChanged())); + this.toDispose.add(this.editor.onDidChangeConfiguration(e => e.contribInfo && applyIconStyle())); + this.suggestWidgetVisible = SuggestContext.Visible.bindTo(contextKeyService); this.suggestWidgetMultipleSuggestions = SuggestContext.MultipleSuggestions.bindTo(contextKeyService); @@ -725,10 +724,7 @@ export class SuggestWidget implements IContentWidget, IListVirtualDelegate { - this.loadingTimeout = null; - this.setState(State.Loading); - }, delay); + this.loadingTimeout = disposableTimeout(() => this.setState(State.Loading), delay); } } @@ -736,10 +732,7 @@ export class SuggestWidget implements IContentWidget, IListVirtualDelegate Date: Fri, 14 Jun 2019 12:15:26 +0200 Subject: [PATCH 0174/1449] show Loading... in details view, #73311 --- .../editor/contrib/suggest/suggestWidget.ts | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/vs/editor/contrib/suggest/suggestWidget.ts b/src/vs/editor/contrib/suggest/suggestWidget.ts index 8b9e470db98..d3089cd1428 100644 --- a/src/vs/editor/contrib/suggest/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/suggestWidget.ts @@ -281,7 +281,12 @@ class SuggestionDetails { return this.el; } - render(item: CompletionItem): void { + renderLoading(): void { + this.type.textContent = nls.localize('loading', "Loading..."); + this.docs.textContent = ''; + } + + renderItem(item: CompletionItem): void { this.renderDisposeable = dispose(this.renderDisposeable); if (!item || !canExpandCompletionItem(item)) { @@ -630,7 +635,13 @@ export class SuggestWidget implements IContentWidget, IListVirtualDelegate item.resolve(token)); + this.currentSuggestionDetails = createCancelablePromise(async token => { + const loading = disposableTimeout(() => this.showDetails(true), 250); + token.onCancellationRequested(() => loading.dispose()); + const result = await item.resolve(token); + loading.dispose(); + return result; + }); this.currentSuggestionDetails.then(() => { if (this.list.length < index) { @@ -644,7 +655,7 @@ export class SuggestWidget implements IContentWidget, IListVirtualDelegate Date: Fri, 14 Jun 2019 13:02:18 +0200 Subject: [PATCH 0175/1449] remove extHostHeapService, use normal cache in commands converter, #74846 --- .../api/common/extHostApiCommands.ts | 2 +- .../workbench/api/common/extHostCommands.ts | 29 ++++++++-------- .../api/common/extHostHeapService.ts | 33 ------------------- src/vs/workbench/api/node/extHost.api.impl.ts | 4 +-- .../api/extHostApiCommands.test.ts | 5 +-- .../api/extHostCommands.test.ts | 4 +-- .../api/extHostLanguageFeatures.test.ts | 5 +-- .../api/extHostTreeViews.test.ts | 3 +- 8 files changed, 23 insertions(+), 62 deletions(-) delete mode 100644 src/vs/workbench/api/common/extHostHeapService.ts diff --git a/src/vs/workbench/api/common/extHostApiCommands.ts b/src/vs/workbench/api/common/extHostApiCommands.ts index 0c5874b2b06..2da50e9c3f4 100644 --- a/src/vs/workbench/api/common/extHostApiCommands.ts +++ b/src/vs/workbench/api/common/extHostApiCommands.ts @@ -473,7 +473,7 @@ export class ExtHostApiCommands { }); } - private _executeCodeActionProvider(resource: URI, range: types.Range, kind?: string): Promise<(vscode.CodeAction | vscode.Command)[] | undefined> { + private _executeCodeActionProvider(resource: URI, range: types.Range, kind?: string): Promise<(vscode.CodeAction | vscode.Command | undefined)[] | undefined> { const args = { resource, range: typeConverters.Range.from(range), diff --git a/src/vs/workbench/api/common/extHostCommands.ts b/src/vs/workbench/api/common/extHostCommands.ts index 11df6eeef3c..5173ebb176c 100644 --- a/src/vs/workbench/api/common/extHostCommands.ts +++ b/src/vs/workbench/api/common/extHostCommands.ts @@ -9,7 +9,6 @@ import * as extHostTypes from 'vs/workbench/api/common/extHostTypes'; import * as extHostTypeConverter from 'vs/workbench/api/common/extHostTypeConverters'; import { cloneAndChange } from 'vs/base/common/objects'; import { MainContext, MainThreadCommandsShape, ExtHostCommandsShape, ObjectIdentifier, IMainContext, CommandDto } from './extHost.protocol'; -import { ExtHostHeapService } from 'vs/workbench/api/common/extHostHeapService'; import { isNonEmptyArray } from 'vs/base/common/arrays'; import * as modes from 'vs/editor/common/modes'; import * as vscode from 'vscode'; @@ -40,12 +39,11 @@ export class ExtHostCommands implements ExtHostCommandsShape { constructor( mainContext: IMainContext, - heapService: ExtHostHeapService, logService: ILogService ) { this._proxy = mainContext.getProxy(MainContext.MainThreadCommands); this._logService = logService; - this._converter = new CommandsConverter(this, heapService); + this._converter = new CommandsConverter(this); this._argumentProcessors = [ { processArgument(a) { @@ -201,14 +199,14 @@ export class ExtHostCommands implements ExtHostCommandsShape { export class CommandsConverter { private readonly _delegatingCommandId: string; - private _commands: ExtHostCommands; - private _heap: ExtHostHeapService; + private readonly _commands: ExtHostCommands; + private readonly _cache = new Map(); + private _cachIdPool = 0; // --- conversion between internal and api commands - constructor(commands: ExtHostCommands, heap: ExtHostHeapService) { + constructor(commands: ExtHostCommands) { this._delegatingCommandId = `_internal_command_delegation_${Date.now()}`; this._commands = commands; - this._heap = heap; this._commands.registerCommand(true, this._delegatingCommandId, this._executeConvertedCommand, this); } @@ -229,8 +227,9 @@ export class CommandsConverter { // we have a contributed command with arguments. that // means we don't want to send the arguments around - const id = this._heap.keep(command); - disposables.add(toDisposable(() => this._heap.delete(id))); + const id = ++this._cachIdPool; + this._cache.set(id, command); + disposables.add(toDisposable(() => this._cache.delete(id))); result.$ident = id; result.id = this._delegatingCommandId; @@ -260,7 +259,8 @@ export class CommandsConverter { // we have a contributed command with arguments. that // means we don't want to send the arguments around - const id = this._heap.keep(command); + const id = ++this._cachIdPool; + this._cache.set(id, command); result.$ident = id; result.id = this._delegatingCommandId; @@ -274,11 +274,11 @@ export class CommandsConverter { return result; } - fromInternal(command: modes.Command): vscode.Command { + fromInternal(command: modes.Command): vscode.Command | undefined { const id = ObjectIdentifier.of(command); if (typeof id === 'number') { - return this._heap.get(id); + return this._cache.get(id); } else { return { @@ -290,7 +290,10 @@ export class CommandsConverter { } private _executeConvertedCommand(...args: any[]): Promise { - const actualCmd = this._heap.get(args[0]); + const actualCmd = this._cache.get(args[0]); + if (!actualCmd) { + return Promise.reject('actual command NOT FOUND'); + } return this._commands.executeCommand(actualCmd.command, ...(actualCmd.arguments || [])); } diff --git a/src/vs/workbench/api/common/extHostHeapService.ts b/src/vs/workbench/api/common/extHostHeapService.ts deleted file mode 100644 index f2044a8b50e..00000000000 --- a/src/vs/workbench/api/common/extHostHeapService.ts +++ /dev/null @@ -1,33 +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 { ExtHostHeapServiceShape } from './extHost.protocol'; - -export class ExtHostHeapService implements ExtHostHeapServiceShape { - - private static _idPool = 0; - - private _data = new Map(); - - keep(obj: any): number { - const id = ExtHostHeapService._idPool++; - this._data.set(id, obj); - return id; - } - - delete(id: number): boolean { - return this._data.delete(id); - } - - get(id: number): T { - return this._data.get(id); - } - - $onGarbageCollection(ids: number[]): void { - for (const id of ids) { - this.delete(id); - } - } -} diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index e662303e702..55887526da7 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -33,7 +33,6 @@ import { ExtensionActivatedByAPI } from 'vs/workbench/api/common/extHostExtensio import { ExtHostExtensionService } from 'vs/workbench/api/node/extHostExtensionService'; import { ExtHostFileSystem } from 'vs/workbench/api/common/extHostFileSystem'; import { ExtHostFileSystemEventService } from 'vs/workbench/api/common/extHostFileSystemEventService'; -import { ExtHostHeapService } from 'vs/workbench/api/common/extHostHeapService'; import { ExtHostLanguageFeatures } from 'vs/workbench/api/common/extHostLanguageFeatures'; import { ExtHostLanguages } from 'vs/workbench/api/common/extHostLanguages'; import { ExtHostLogService } from 'vs/workbench/api/common/extHostLogService'; @@ -97,7 +96,6 @@ export function createApiFactory( // Addressable instances rpcProtocol.set(ExtHostContext.ExtHostLogService, extHostLogService); - const extHostHeapService = rpcProtocol.set(ExtHostContext.ExtHostHeapService, new ExtHostHeapService()); const extHostDecorations = rpcProtocol.set(ExtHostContext.ExtHostDecorations, new ExtHostDecorations(rpcProtocol)); const extHostWebviews = rpcProtocol.set(ExtHostContext.ExtHostWebviews, new ExtHostWebviews(rpcProtocol)); const extHostUrls = rpcProtocol.set(ExtHostContext.ExtHostUrls, new ExtHostUrls(rpcProtocol)); @@ -106,7 +104,7 @@ export function createApiFactory( const extHostDocumentContentProviders = rpcProtocol.set(ExtHostContext.ExtHostDocumentContentProviders, new ExtHostDocumentContentProvider(rpcProtocol, extHostDocumentsAndEditors, extHostLogService)); const extHostDocumentSaveParticipant = rpcProtocol.set(ExtHostContext.ExtHostDocumentSaveParticipant, new ExtHostDocumentSaveParticipant(extHostLogService, extHostDocuments, rpcProtocol.getProxy(MainContext.MainThreadTextEditors))); const extHostEditors = rpcProtocol.set(ExtHostContext.ExtHostEditors, new ExtHostEditors(rpcProtocol, extHostDocumentsAndEditors)); - const extHostCommands = rpcProtocol.set(ExtHostContext.ExtHostCommands, new ExtHostCommands(rpcProtocol, extHostHeapService, extHostLogService)); + const extHostCommands = rpcProtocol.set(ExtHostContext.ExtHostCommands, new ExtHostCommands(rpcProtocol, extHostLogService)); const extHostTreeViews = rpcProtocol.set(ExtHostContext.ExtHostTreeViews, new ExtHostTreeViews(rpcProtocol.getProxy(MainContext.MainThreadTreeViews), extHostCommands, extHostLogService)); rpcProtocol.set(ExtHostContext.ExtHostWorkspace, extHostWorkspace); rpcProtocol.set(ExtHostContext.ExtHostConfiguration, extHostConfiguration); diff --git a/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts b/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts index ee6c78be43e..047d78070f3 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts @@ -18,7 +18,6 @@ import { ExtHostLanguageFeatures } from 'vs/workbench/api/common/extHostLanguage import { MainThreadLanguageFeatures } from 'vs/workbench/api/browser/mainThreadLanguageFeatures'; import { ExtHostApiCommands } from 'vs/workbench/api/common/extHostApiCommands'; import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; -import { ExtHostHeapService } from 'vs/workbench/api/common/extHostHeapService'; import { MainThreadCommands } from 'vs/workbench/api/browser/mainThreadCommands'; import { ExtHostDocuments } from 'vs/workbench/api/common/extHostDocuments'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; @@ -107,9 +106,7 @@ suite('ExtHostLanguageFeatureCommands', function () { const extHostDocuments = new ExtHostDocuments(rpcProtocol, extHostDocumentsAndEditors); rpcProtocol.set(ExtHostContext.ExtHostDocuments, extHostDocuments); - const heapService = new ExtHostHeapService(); - - commands = new ExtHostCommands(rpcProtocol, heapService, new NullLogService()); + commands = new ExtHostCommands(rpcProtocol, new NullLogService()); rpcProtocol.set(ExtHostContext.ExtHostCommands, commands); rpcProtocol.set(MainContext.MainThreadCommands, inst.createInstance(MainThreadCommands, rpcProtocol)); ExtHostApiCommands.register(commands); diff --git a/src/vs/workbench/test/electron-browser/api/extHostCommands.test.ts b/src/vs/workbench/test/electron-browser/api/extHostCommands.test.ts index 07bb3ac3cea..d0cf59f320e 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostCommands.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostCommands.test.ts @@ -26,7 +26,7 @@ suite('ExtHostCommands', function () { } }; - const commands = new ExtHostCommands(SingleProxyRPCProtocol(shape), undefined!, new NullLogService()); + const commands = new ExtHostCommands(SingleProxyRPCProtocol(shape), new NullLogService()); commands.registerCommand(true, 'foo', (): any => { }).dispose(); assert.equal(lastUnregister!, 'foo'); assert.equal(CommandsRegistry.getCommand('foo'), undefined); @@ -46,7 +46,7 @@ suite('ExtHostCommands', function () { } }; - const commands = new ExtHostCommands(SingleProxyRPCProtocol(shape), undefined!, new NullLogService()); + const commands = new ExtHostCommands(SingleProxyRPCProtocol(shape), new NullLogService()); const reg = commands.registerCommand(true, 'foo', (): any => { }); reg.dispose(); reg.dispose(); diff --git a/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts b/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts index 713720637d2..18ecedc673b 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts @@ -36,7 +36,6 @@ import { getDocumentFormattingEditsUntilResult, getDocumentRangeFormattingEditsU import { getLinks } from 'vs/editor/contrib/links/getLinks'; import { MainContext, ExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostDiagnostics } from 'vs/workbench/api/common/extHostDiagnostics'; -import { ExtHostHeapService } from 'vs/workbench/api/common/extHostHeapService'; import * as vscode from 'vscode'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { NullLogService } from 'vs/platform/log/common/log'; @@ -100,9 +99,7 @@ suite('ExtHostLanguageFeatures', function () { const extHostDocuments = new ExtHostDocuments(rpcProtocol, extHostDocumentsAndEditors); rpcProtocol.set(ExtHostContext.ExtHostDocuments, extHostDocuments); - const heapService = new ExtHostHeapService(); - - const commands = new ExtHostCommands(rpcProtocol, heapService, new NullLogService()); + const commands = new ExtHostCommands(rpcProtocol, new NullLogService()); rpcProtocol.set(ExtHostContext.ExtHostCommands, commands); rpcProtocol.set(MainContext.MainThreadCommands, inst.createInstance(MainThreadCommands, rpcProtocol)); diff --git a/src/vs/workbench/test/electron-browser/api/extHostTreeViews.test.ts b/src/vs/workbench/test/electron-browser/api/extHostTreeViews.test.ts index 7619369f02c..5f05a9bc453 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostTreeViews.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostTreeViews.test.ts @@ -11,7 +11,6 @@ import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; import { MainThreadTreeViewsShape, MainContext } from 'vs/workbench/api/common/extHost.protocol'; import { TreeDataProvider, TreeItem } from 'vscode'; import { TestRPCProtocol } from './testRPCProtocol'; -import { ExtHostHeapService } from 'vs/workbench/api/common/extHostHeapService'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { MainThreadCommands } from 'vs/workbench/api/browser/mainThreadCommands'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -72,7 +71,7 @@ suite('ExtHostTreeView', function () { rpcProtocol.set(MainContext.MainThreadCommands, inst.createInstance(MainThreadCommands, rpcProtocol)); target = new RecordingShape(); - testObject = new ExtHostTreeViews(target, new ExtHostCommands(rpcProtocol, new ExtHostHeapService(), new NullLogService()), new NullLogService()); + testObject = new ExtHostTreeViews(target, new ExtHostCommands(rpcProtocol, new NullLogService()), new NullLogService()); onDidChangeTreeNode = new Emitter<{ key: string }>(); onDidChangeTreeNodeWithId = new Emitter<{ key: string }>(); testObject.createTreeView('testNodeTreeProvider', { treeDataProvider: aNodeTreeDataProvider() }, { enableProposedApi: true } as IExtensionDescription); From 69a0ef879c391b15d9287346c7ba75dbc49c5282 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 14 Jun 2019 14:56:14 +0200 Subject: [PATCH 0176/1449] main - wait for driver --- src/vs/code/electron-main/app.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index c0915846528..97aaf7a658a 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -347,12 +347,10 @@ export class CodeApplication extends Disposable { // Create driver if (this.environmentService.driverHandle) { - (async () => { - const server = await serveDriver(electronIpcServer, this.environmentService.driverHandle!, this.environmentService, appInstantiationService); + const server = await serveDriver(electronIpcServer, this.environmentService.driverHandle!, this.environmentService, appInstantiationService); - this.logService.info('Driver started at:', this.environmentService.driverHandle); - this._register(server); - })(); + this.logService.info('Driver started at:', this.environmentService.driverHandle); + this._register(server); } // Setup Auth Handler From 3ccd965ddbeec748bf7b9a2b12f5a6d01a553a4b Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 14 Jun 2019 15:08:22 +0200 Subject: [PATCH 0177/1449] Fix #74833 --- .../api/common/configurationExtensionPoint.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/api/common/configurationExtensionPoint.ts b/src/vs/workbench/api/common/configurationExtensionPoint.ts index 0732f1c3bea..aa05f7e1187 100644 --- a/src/vs/workbench/api/common/configurationExtensionPoint.ts +++ b/src/vs/workbench/api/common/configurationExtensionPoint.ts @@ -42,12 +42,12 @@ const configurationEntrySchema: IJSONSchema = { enum: ['application', 'machine', 'window', 'resource'], default: 'window', enumDescriptions: [ - nls.localize('scope.application.description', "Application specific configuration, which can be configured only in local user settings."), - nls.localize('scope.machine.description', "Machine specific configuration, which can be configured only in local and remote user settings."), - nls.localize('scope.window.description', "Window specific configuration, which can be configured in the user or workspace settings."), - nls.localize('scope.resource.description', "Resource specific configuration, which can be configured in the user, workspace or folder settings.") + nls.localize('scope.application.description', "Application specific configuration, which can be configured only in the user settings."), + nls.localize('scope.machine.description', "Machine specific configuration, which can be configured only in the user settings when the extension is running locally, or only in the remote settings when the extension is running remotely."), + nls.localize('scope.window.description', "Window specific configuration, which can be configured in the user, remote or workspace settings."), + nls.localize('scope.resource.description', "Resource specific configuration, which can be configured in the user, remote, workspace or folder settings.") ], - description: nls.localize('scope.description', "Scope in which the configuration is applicable. Available scopes are `window` and `resource`.") + description: nls.localize('scope.description', "Scope in which the configuration is applicable. Available scopes are `application`, `machine`, `window` and `resource`.") }, enumDescriptions: { type: 'array', From 3fe6a332950c098557396c0dcd9ecf2dd2939fce Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 14 Jun 2019 15:12:30 +0200 Subject: [PATCH 0178/1449] fix bad handling of missing channel in IPC related to #72531 --- src/vs/base/parts/ipc/common/ipc.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/vs/base/parts/ipc/common/ipc.ts b/src/vs/base/parts/ipc/common/ipc.ts index 80f063e5891..345d4529f1e 100644 --- a/src/vs/base/parts/ipc/common/ipc.ts +++ b/src/vs/base/parts/ipc/common/ipc.ts @@ -309,9 +309,16 @@ export class ChannelServer implements IChannelServer{ + id: request.id, + data: { message: request.channelName, name: 'Unknown channel', stack: undefined }, + type: ResponseType.PromiseError + }); + return; } + const cancellationTokenSource = new CancellationTokenSource(); let promise: Promise; @@ -348,8 +355,10 @@ export class ChannelServer implements IChannelServer Date: Fri, 14 Jun 2019 15:53:26 +0200 Subject: [PATCH 0179/1449] implement timeout mechanism for missing ipc channels fixes #72531 --- src/vs/base/parts/ipc/common/ipc.ts | 67 +++++++++++++++++++++++++---- 1 file changed, 59 insertions(+), 8 deletions(-) diff --git a/src/vs/base/parts/ipc/common/ipc.ts b/src/vs/base/parts/ipc/common/ipc.ts index 345d4529f1e..84ee9622882 100644 --- a/src/vs/base/parts/ipc/common/ipc.ts +++ b/src/vs/base/parts/ipc/common/ipc.ts @@ -246,19 +246,29 @@ function deserialize(reader: IReader): any { } } +interface PendingRequest { + request: IRawPromiseRequest | IRawEventListenRequest; + timeoutTimer: NodeJS.Timer; +} + export class ChannelServer implements IChannelServer, IDisposable { private channels = new Map>(); private activeRequests = new Map(); private protocolListener: IDisposable | null; - constructor(private protocol: IMessagePassingProtocol, private ctx: TContext) { + // Requests might come in for channels which are not yet registered. + // They will timeout after `timeoutDelay`. + private pendingRequests = new Map(); + + constructor(private protocol: IMessagePassingProtocol, private ctx: TContext, private timeoutDelay: number = 1000) { this.protocolListener = this.protocol.onMessage(msg => this.onRawMessage(msg)); this.sendResponse({ type: ResponseType.Initialize }); } registerChannel(channelName: string, channel: IServerChannel): void { this.channels.set(channelName, channel); + this.flushPendingRequests(channelName); } private sendResponse(response: IRawResponse): void { @@ -311,11 +321,7 @@ export class ChannelServer implements IChannelServer{ - id: request.id, - data: { message: request.channelName, name: 'Unknown channel', stack: undefined }, - type: ResponseType.PromiseError - }); + this.collectPendingRequest(request); return; } @@ -357,7 +363,7 @@ export class ChannelServer implements IChannelServer implements IChannelServer { + console.error(`Unknown channel: ${request.channelName}`); + + if (request.type === RequestType.Promise) { + this.sendResponse({ + id: request.id, + data: { name: 'Unknown channel', message: `Channel name '${request.channelName}' timed out after ${this.timeoutDelay}ms`, stack: undefined }, + type: ResponseType.PromiseError + }); + } + }, this.timeoutDelay); + + pendingRequests.push({ request, timeoutTimer: timer }); + } + + private flushPendingRequests(channelName: string): void { + const requests = this.pendingRequests.get(channelName); + + if (requests) { + for (const request of requests) { + clearTimeout(request.timeoutTimer); + + switch (request.request.type) { + case RequestType.Promise: this.onPromise(request.request); break; + case RequestType.EventListen: this.onEventListen(request.request); break; + } + } + + this.pendingRequests.delete(channelName); + } + } + public dispose(): void { if (this.protocolListener) { this.protocolListener.dispose(); @@ -596,6 +642,7 @@ export interface ClientConnectionEvent { } interface Connection extends Client { + readonly channelServer: ChannelServer; readonly channelClient: ChannelClient; } @@ -634,7 +681,7 @@ export class IPCServer implements IChannelServer, I this.channels.forEach((channel, name) => channelServer.registerChannel(name, channel)); - const connection: Connection = { channelClient, ctx }; + const connection: Connection = { channelServer, channelClient, ctx }; this._connections.add(connection); this._onDidChangeConnections.fire(connection); @@ -670,6 +717,10 @@ export class IPCServer implements IChannelServer, I registerChannel(channelName: string, channel: IServerChannel): void { this.channels.set(channelName, channel); + + for (const connection of this._connections) { + connection.channelServer.registerChannel(channelName, channel); + } } dispose(): void { From 2b03e7165e88a01ad5706135ea60d7bf3d4d3c5a Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 14 Jun 2019 15:59:48 +0200 Subject: [PATCH 0180/1449] :lipstick: --- src/vs/workbench/browser/parts/views/panelViewlet.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/browser/parts/views/panelViewlet.ts b/src/vs/workbench/browser/parts/views/panelViewlet.ts index 982b5c906fc..6c2671e227f 100644 --- a/src/vs/workbench/browser/parts/views/panelViewlet.ts +++ b/src/vs/workbench/browser/parts/views/panelViewlet.ts @@ -334,18 +334,17 @@ export class PanelViewlet extends Viewlet { } private addPanel(panel: ViewletPanel, size: number, index = this.panelItems.length - 1): void { - const disposables: IDisposable[] = []; - const onDidFocus = panel.onDidFocus(() => this.lastFocusedPanel = panel, null, disposables); + const onDidFocus = panel.onDidFocus(() => this.lastFocusedPanel = panel); const onDidChangeTitleArea = panel.onDidChangeTitleArea(() => { if (this.isSingleView()) { this.updateTitleArea(); } - }, null, disposables); + }); const onDidChange = panel.onDidChange(() => { if (panel === this.lastFocusedPanel && !panel.isExpanded()) { this.lastFocusedPanel = undefined; } - }, null, disposables); + }); const panelStyler = attachStyler(this.themeService, { headerForeground: SIDE_BAR_SECTION_HEADER_FOREGROUND, From 58be455dad68acb777231f65c9dac8e13bf9541a Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 14 Jun 2019 16:36:46 +0200 Subject: [PATCH 0181/1449] fix monaco editor compilation --- src/vs/base/parts/ipc/common/ipc.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/base/parts/ipc/common/ipc.ts b/src/vs/base/parts/ipc/common/ipc.ts index 84ee9622882..6292487e1c1 100644 --- a/src/vs/base/parts/ipc/common/ipc.ts +++ b/src/vs/base/parts/ipc/common/ipc.ts @@ -248,7 +248,7 @@ function deserialize(reader: IReader): any { interface PendingRequest { request: IRawPromiseRequest | IRawEventListenRequest; - timeoutTimer: NodeJS.Timer; + timeoutTimer: any; } export class ChannelServer implements IChannelServer, IDisposable { @@ -718,9 +718,9 @@ export class IPCServer implements IChannelServer, I registerChannel(channelName: string, channel: IServerChannel): void { this.channels.set(channelName, channel); - for (const connection of this._connections) { + this._connections.forEach(connection => { connection.channelServer.registerChannel(channelName, channel); - } + }); } dispose(): void { From e08e8b025f615ccaacfe461f66ddae35795fd45d Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 14 Jun 2019 09:15:39 -0700 Subject: [PATCH 0182/1449] Move window.shell to env.shell Part of #75091 --- src/vs/vscode.proposed.d.ts | 12 ++++++------ src/vs/workbench/api/node/extHost.api.impl.ts | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index f75173510e5..edcdf8c66a7 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -629,6 +629,12 @@ declare module 'vscode' { */ export const logLevel: LogLevel; + /** + * The detected default shell for the extension host, this is overridden by the + * `terminal.integrated.shell` setting for the extension host's platform. + */ + export const shell: string; + /** * An [event](#Event) that fires when the log level has changed. */ @@ -1110,12 +1116,6 @@ declare module 'vscode' { } namespace window { - /** - * The detected default shell for the extension host, this is overridden by the - * `terminal.integrated.shell` setting for the extension host's platform. - */ - export const shell: string; - /** * An event which fires when the [dimensions](#Terminal.dimensions) of the terminal change. */ diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 12450c7efb0..126d3e3d6bd 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -254,6 +254,9 @@ export function createApiFactory( get clipboard(): vscode.Clipboard { return extHostClipboard; }, + get shell() { + return extHostTerminalService.getDefaultShell(configProvider); + }, openExternal(uri: URI) { return extHostWindow.openUri(uri, { allowTunneling: !!initData.remoteAuthority }); } @@ -389,9 +392,6 @@ export function createApiFactory( get terminals() { return extHostTerminalService.terminals; }, - get shell() { - return extHostTerminalService.getDefaultShell(configProvider); - }, showTextDocument(documentOrUri: vscode.TextDocument | vscode.Uri, columnOrOptions?: vscode.ViewColumn | vscode.TextDocumentShowOptions, preserveFocus?: boolean): Thenable { let documentPromise: Promise; if (URI.isUri(documentOrUri)) { From 3183f556d9fea4176961e8ab176ff2e4bd7ddc47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Chaloupka?= Date: Fri, 14 Jun 2019 18:33:06 +0200 Subject: [PATCH 0183/1449] Update terminalEnvironment.ts --- .../workbench/contrib/terminal/common/terminalEnvironment.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts b/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts index 4c850cc9831..848164e0901 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts @@ -93,6 +93,7 @@ function _getLangEnvVariable(locale?: string) { // app.getLocale can return just a language without a variant, fill in the variant for // supported languages as many shells expect a 2-part locale. const languageVariants = { + cs: 'CZ', de: 'DE', en: 'US', es: 'ES', @@ -257,4 +258,4 @@ export function createTerminalEnvironment( addTerminalEnvironmentKeys(env, version, platform.locale, setLocaleVariables); } return env; -} \ No newline at end of file +} From fa71df46e63dbc689dd49c189d85705a2efa42f5 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 14 Jun 2019 19:19:44 +0200 Subject: [PATCH 0184/1449] remove ExtHostHeapService --- src/vs/workbench/api/common/extHost.protocol.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 527d667cc5a..0109dda3dec 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -1321,7 +1321,6 @@ export const ExtHostContext = { ExtHostTreeViews: createExtId('ExtHostTreeViews'), ExtHostFileSystem: createExtId('ExtHostFileSystem'), ExtHostFileSystemEventService: createExtId('ExtHostFileSystemEventService'), - ExtHostHeapService: createExtId('ExtHostHeapMonitor'), ExtHostLanguageFeatures: createExtId('ExtHostLanguageFeatures'), ExtHostQuickOpen: createExtId('ExtHostQuickOpen'), ExtHostExtensionService: createExtId('ExtHostExtensionService'), From 1ad7350e87b3404cdb7d57dd27cc99933078dfd9 Mon Sep 17 00:00:00 2001 From: jeanp413 Date: Fri, 14 Jun 2019 12:39:45 -0500 Subject: [PATCH 0185/1449] Use extname and basename helper functions --- src/vs/workbench/contrib/files/browser/fileActions.ts | 10 ++++------ .../files/test/electron-browser/fileActions.test.ts | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/contrib/files/browser/fileActions.ts b/src/vs/workbench/contrib/files/browser/fileActions.ts index 60f6ee39c94..ca8d73b9e92 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.ts @@ -8,6 +8,7 @@ import * as nls from 'vs/nls'; import * as types from 'vs/base/common/types'; import { isWindows, isLinux } from 'vs/base/common/platform'; import * as extpath from 'vs/base/common/extpath'; +import { extname, basename } from 'vs/base/common/path'; import * as resources from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { toErrorMessage } from 'vs/base/common/errorMessage'; @@ -347,16 +348,13 @@ export function incrementFileName(name: string, isFolder: boolean): string { let namePrefix = name; let extSuffix = ''; if (!isFolder) { - let index = name.lastIndexOf('.'); - if (index > 0 && index < name.length - 1) { - namePrefix = name.substring(0, index); - extSuffix = name.substring(index); - } + extSuffix = extname(name); + namePrefix = basename(name, extSuffix); } // name copy 5(.txt) => name copy 6(.txt) // name copy(.txt) => name copy 2(.txt) - let suffixRegex = /^(.+ copy)( \d+)?$/; + const suffixRegex = /^(.+ copy)( \d+)?$/; if (suffixRegex.test(namePrefix)) { return namePrefix.replace(suffixRegex, (match, g1?, g2?) => { let number = (g2 ? parseInt(g2) : 1); diff --git a/src/vs/workbench/contrib/files/test/electron-browser/fileActions.test.ts b/src/vs/workbench/contrib/files/test/electron-browser/fileActions.test.ts index a511fa508c5..d52b99bb2d9 100644 --- a/src/vs/workbench/contrib/files/test/electron-browser/fileActions.test.ts +++ b/src/vs/workbench/contrib/files/test/electron-browser/fileActions.test.ts @@ -53,7 +53,7 @@ suite('Files - Increment file name', () => { test('Increment file name without any extension or version, trailing dot', function () { const name = 'test.'; const result = incrementFileName(name, false); - assert.strictEqual(result, 'test. copy'); + assert.strictEqual(result, 'test copy.'); }); test('Increment file name without any extension or version, leading dot', function () { From 2935ccca97ee8d269463b01e01fb5c0a6e572913 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Fri, 14 Jun 2019 11:00:08 -0700 Subject: [PATCH 0186/1449] Update editorOverviewRuler.findMatchForeground --- src/vs/platform/theme/common/colorRegistry.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index fdcb656205d..3739dbf7936 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -384,7 +384,7 @@ export const overviewRulerCurrentContentForeground = registerColor('editorOvervi export const overviewRulerIncomingContentForeground = registerColor('editorOverviewRuler.incomingContentForeground', { dark: transparent(mergeIncomingHeaderBackground, rulerTransparency), light: transparent(mergeIncomingHeaderBackground, rulerTransparency), hc: mergeBorder }, nls.localize('overviewRulerIncomingContentForeground', 'Incoming overview ruler foreground for inline merge-conflicts.')); export const overviewRulerCommonContentForeground = registerColor('editorOverviewRuler.commonContentForeground', { dark: transparent(mergeCommonHeaderBackground, rulerTransparency), light: transparent(mergeCommonHeaderBackground, rulerTransparency), hc: mergeBorder }, nls.localize('overviewRulerCommonContentForeground', 'Common ancestor overview ruler foreground for inline merge-conflicts.')); -export const overviewRulerFindMatchForeground = registerColor('editorOverviewRuler.findMatchForeground', { dark: '#ea5e00d0', light: '#ea5e00d0', hc: '#ea5e00' }, nls.localize('overviewRulerFindMatchForeground', 'Overview ruler marker color for find matches. The color must not be opaque so as not to hide underlying decorations.'), true); +export const overviewRulerFindMatchForeground = registerColor('editorOverviewRuler.findMatchForeground', { dark: '#d186167e', light: '#d186167e', hc: '#AB5A00' }, nls.localize('overviewRulerFindMatchForeground', 'Overview ruler marker color for find matches. The color must not be opaque so as not to hide underlying decorations.'), true); export const overviewRulerSelectionHighlightForeground = registerColor('editorOverviewRuler.selectionHighlightForeground', { dark: '#A0A0A0CC', light: '#A0A0A0CC', hc: '#A0A0A0CC' }, nls.localize('overviewRulerSelectionHighlightForeground', 'Overview ruler marker color for selection highlights. The color must not be opaque so as not to hide underlying decorations.'), true); From 10d4256ff57133fe369d765faee56be0331687f0 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 14 Jun 2019 11:33:37 -0700 Subject: [PATCH 0187/1449] Remove process usage from terminalEnvironment Fixes #75509 --- .../api/node/extHostTerminalService.ts | 17 ++++++++++++-- .../electron-browser/terminalTaskSystem.ts | 2 +- .../contrib/terminal/browser/terminal.ts | 4 ++++ .../terminal/browser/terminalConfigHelper.ts | 8 +------ .../browser/terminalInstanceService.ts | 3 +++ .../browser/terminalProcessManager.ts | 2 +- .../contrib/terminal/common/terminal.ts | 6 +---- .../terminal/common/terminalEnvironment.ts | 15 ++++++++----- .../terminalInstanceService.ts | 22 ++++++++++++++++--- .../terminalLinkHandler.test.ts | 3 +++ 10 files changed, 57 insertions(+), 25 deletions(-) diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index f5d85a2f68e..1136a567c3f 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -335,7 +335,13 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { .inspect(key.substr(key.lastIndexOf('.') + 1)); return this._apiInspectConfigToPlain(setting); }; - return terminalEnvironment.getDefaultShell(fetchSetting, this._isWorkspaceShellAllowed, getDefaultShell(platform.platform)); + return terminalEnvironment.getDefaultShell( + fetchSetting, + this._isWorkspaceShellAllowed, + getDefaultShell(platform.platform), + process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432'), + process.env.windir + ); } public async resolveTerminalRenderer(id: number): Promise { @@ -485,7 +491,14 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { .inspect(key.substr(key.lastIndexOf('.') + 1)); return this._apiInspectConfigToPlain(setting); }; - terminalEnvironment.mergeDefaultShellPathAndArgs(shellLaunchConfig, fetchSetting, isWorkspaceShellAllowed || false, getDefaultShell(platform.platform)); + terminalEnvironment.mergeDefaultShellPathAndArgs( + shellLaunchConfig, + fetchSetting, + isWorkspaceShellAllowed || false, + getDefaultShell(platform.platform), + process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432'), + process.env.windir + ); } // Get the initial cwd diff --git a/src/vs/workbench/contrib/tasks/electron-browser/terminalTaskSystem.ts b/src/vs/workbench/contrib/tasks/electron-browser/terminalTaskSystem.ts index b009cbea51e..789b395e34b 100644 --- a/src/vs/workbench/contrib/tasks/electron-browser/terminalTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/electron-browser/terminalTaskSystem.ts @@ -779,7 +779,7 @@ export class TerminalTaskSystem implements ITaskSystem { let originalCommand = task.command.name; if (isShellCommand) { shellLaunchConfig = { name: terminalName, executable: undefined, args: undefined, waitOnExit }; - this.terminalService.configHelper.mergeDefaultShellPathAndArgs(shellLaunchConfig, this.getDefaultShell(platform), platform); + this.terminalInstanceService.mergeDefaultShellPathAndArgs(shellLaunchConfig, this.getDefaultShell(platform), this.terminalService.configHelper, platform); let shellSpecified: boolean = false; let shellOptions: ShellConfiguration | undefined = task.command.options && task.command.options.shell; if (shellOptions) { diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.ts b/src/vs/workbench/contrib/terminal/browser/terminal.ts index 59c773a8f7b..b7648c67e3c 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -26,6 +26,10 @@ export interface ITerminalInstanceService { createWindowsShellHelper(shellProcessId: number, instance: ITerminalInstance, xterm: XTermTerminal): IWindowsShellHelper; createTerminalProcess(shellLaunchConfig: IShellLaunchConfig, cwd: string, cols: number, rows: number, env: IProcessEnvironment, windowsEnableConpty: boolean): ITerminalChildProcess; getDefaultShell(p: Platform): string; + /** + * Merges the default shell path and args into the provided launch configuration + */ + mergeDefaultShellPathAndArgs(shell: IShellLaunchConfig, defaultShell: string, configHelper: ITerminalConfigHelper, platformOverride?: Platform): void; getMainProcessParentEnv(): Promise; } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalConfigHelper.ts b/src/vs/workbench/contrib/terminal/browser/terminalConfigHelper.ts index 965f9de0e44..4935f3122e7 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalConfigHelper.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalConfigHelper.ts @@ -8,12 +8,11 @@ import * as platform from 'vs/base/common/platform'; import { EDITOR_FONT_DEFAULTS, IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; -import { ITerminalConfiguration, ITerminalFont, IShellLaunchConfig, IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY, TERMINAL_CONFIG_SECTION, DEFAULT_LETTER_SPACING, DEFAULT_LINE_HEIGHT, MINIMUM_LETTER_SPACING, LinuxDistro } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ITerminalConfiguration, ITerminalFont, IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY, TERMINAL_CONFIG_SECTION, DEFAULT_LETTER_SPACING, DEFAULT_LINE_HEIGHT, MINIMUM_LETTER_SPACING, LinuxDistro } from 'vs/workbench/contrib/terminal/common/terminal'; import Severity from 'vs/base/common/severity'; import { Terminal as XTermTerminal } from 'xterm'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IBrowserTerminalConfigHelper } from 'vs/workbench/contrib/terminal/browser/terminal'; -import { mergeDefaultShellPathAndArgs } from 'vs/workbench/contrib/terminal/common/terminalEnvironment'; import { Emitter, Event } from 'vs/base/common/event'; const MINIMUM_FONT_SIZE = 6; @@ -232,11 +231,6 @@ export class TerminalConfigHelper implements IBrowserTerminalConfigHelper { return !!isWorkspaceShellAllowed; } - public mergeDefaultShellPathAndArgs(shell: IShellLaunchConfig, defaultShell: string, platformOverride: platform.Platform = platform.platform): void { - const isWorkspaceShellAllowed = this.checkWorkspaceShellPermissions(platformOverride === platform.Platform.Windows ? platform.OperatingSystem.Windows : (platformOverride === platform.Platform.Mac ? platform.OperatingSystem.Macintosh : platform.OperatingSystem.Linux)); - mergeDefaultShellPathAndArgs(shell, (key) => this._workspaceConfigurationService.inspect(key), isWorkspaceShellAllowed, defaultShell, platformOverride); - } - private _toInteger(source: any, minimum: number, maximum: number, fallback: number): number { let r = parseInt(source, 10); if (isNaN(r)) { diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts index eb28c172632..dbbb9313e12 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts @@ -55,4 +55,7 @@ export class TerminalInstanceService implements ITerminalInstanceService { public async getMainProcessParentEnv(): Promise { return {}; } + + public mergeDefaultShellPathAndArgs(): void { + } } \ No newline at end of file diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts index f5c58368380..707c8068d26 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts @@ -161,7 +161,7 @@ export class TerminalProcessManager implements ITerminalProcessManager { private async _launchProcess(shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number): Promise { if (!shellLaunchConfig.executable) { - this._configHelper.mergeDefaultShellPathAndArgs(shellLaunchConfig, this._terminalInstanceService.getDefaultShell(platform.platform)); + this._terminalInstanceService.mergeDefaultShellPathAndArgs(shellLaunchConfig, this._terminalInstanceService.getDefaultShell(platform.platform), this._configHelper); } const activeWorkspaceRootUri = this._historyService.getLastActiveWorkspaceRoot(Schemas.file); diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index e700aef3e1b..78c89124183 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -9,7 +9,7 @@ import { RawContextKey, ContextKeyExpr, IContextKey } from 'vs/platform/contextk import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { URI } from 'vs/base/common/uri'; import { FindReplaceState } from 'vs/editor/contrib/find/findState'; -import { Platform, OperatingSystem } from 'vs/base/common/platform'; +import { OperatingSystem } from 'vs/base/common/platform'; import { IOpenFileRequest } from 'vs/platform/windows/common/windows'; export const TERMINAL_PANEL_ID = 'workbench.panel.terminal'; @@ -114,10 +114,6 @@ export interface ITerminalConfigHelper { configFontIsMonospace(): boolean; getFont(): ITerminalFont; - /** - * Merges the default shell path and args into the provided launch configuration - */ - mergeDefaultShellPathAndArgs(shell: IShellLaunchConfig, defaultShell: string, platformOverride?: Platform): void; /** Sets whether a workspace shell configuration is allowed or not */ setWorkspaceShellAllowed(isAllowed: boolean): void; checkWorkspaceShellPermissions(osOverride?: OperatingSystem): boolean; diff --git a/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts b/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts index 848164e0901..78a6f0e734f 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts @@ -166,6 +166,8 @@ export function getDefaultShell( fetchSetting: (key: string) => { user: string | string[] | undefined, value: string | string[] | undefined, default: string | string[] | undefined }, isWorkspaceShellAllowed: boolean, defaultShell: string, + isWoW64: boolean, + windir: string | undefined, platformOverride: platform.Platform = platform.platform ): string { const platformKey = platformOverride === platform.Platform.Windows ? 'windows' : platformOverride === platform.Platform.Mac ? 'osx' : 'linux'; @@ -175,10 +177,10 @@ export function getDefaultShell( // Change Sysnative to System32 if the OS is Windows but NOT WoW64. It's // safe to assume that this was used by accident as Sysnative does not // exist and will break the terminal in non-WoW64 environments. - if ((platformOverride === platform.Platform.Windows) && !process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432') && process.env.windir) { - const sysnativePath = path.join(process.env.windir, 'Sysnative').toLowerCase(); + if ((platformOverride === platform.Platform.Windows) && !isWoW64 && windir) { + const sysnativePath = path.join(windir, 'Sysnative').toLowerCase(); if (executable && executable.toLowerCase().indexOf(sysnativePath) === 0) { - executable = path.join(process.env.windir, 'System32', executable.substr(sysnativePath.length)); + executable = path.join(windir, 'System32', executable.substr(sysnativePath.length)); } } @@ -193,7 +195,6 @@ export function getDefaultShell( function getDefaultShellArgs( fetchSetting: (key: string) => { user: string | string[] | undefined, value: string | string[] | undefined, default: string | string[] | undefined }, isWorkspaceShellAllowed: boolean, - defaultShell: string, platformOverride: platform.Platform = platform.platform ): string[] { const platformKey = platformOverride === platform.Platform.Windows ? 'windows' : platformOverride === platform.Platform.Mac ? 'osx' : 'linux'; @@ -207,10 +208,12 @@ export function mergeDefaultShellPathAndArgs( fetchSetting: (key: string) => { user: string | string[] | undefined, value: string | string[] | undefined, default: string | string[] | undefined }, isWorkspaceShellAllowed: boolean, defaultShell: string, + isWoW64: boolean, + windir: string | undefined, platformOverride: platform.Platform = platform.platform ): void { - shell.executable = getDefaultShell(fetchSetting, isWorkspaceShellAllowed, defaultShell, platformOverride); - shell.args = getDefaultShellArgs(fetchSetting, isWorkspaceShellAllowed, defaultShell, platformOverride); + shell.executable = getDefaultShell(fetchSetting, isWorkspaceShellAllowed, defaultShell, isWoW64, windir, platformOverride); + shell.args = getDefaultShellArgs(fetchSetting, isWorkspaceShellAllowed, platformOverride); } export function createTerminalEnvironment( diff --git a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts index 885f01b4e4f..357bd5dc736 100644 --- a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts @@ -4,10 +4,10 @@ *--------------------------------------------------------------------------------------------*/ import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal'; -import { ITerminalInstance, IWindowsShellHelper, IShellLaunchConfig, ITerminalChildProcess } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ITerminalInstance, IWindowsShellHelper, IShellLaunchConfig, ITerminalChildProcess, ITerminalConfigHelper } from 'vs/workbench/contrib/terminal/common/terminal'; import { WindowsShellHelper } from 'vs/workbench/contrib/terminal/node/windowsShellHelper'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IProcessEnvironment, Platform, isLinux, isMacintosh, isWindows } from 'vs/base/common/platform'; +import { IProcessEnvironment, Platform, isLinux, isMacintosh, isWindows, OperatingSystem, platform } from 'vs/base/common/platform'; import { TerminalProcess } from 'vs/workbench/contrib/terminal/node/terminalProcess'; import { getDefaultShell } from 'vs/workbench/contrib/terminal/node/terminal'; import { Terminal as XTermTerminal } from 'xterm'; @@ -15,6 +15,8 @@ import { WebLinksAddon as XTermWebLinksAddon } from 'xterm-addon-web-links'; import { SearchAddon as XTermSearchAddon } from 'xterm-addon-search'; import { readFile } from 'vs/base/node/pfs'; import { basename } from 'vs/base/common/path'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { mergeDefaultShellPathAndArgs } from 'vs/workbench/contrib/terminal/common/terminalEnvironment'; let Terminal: typeof XTermTerminal; let WebLinksAddon: typeof XTermWebLinksAddon; @@ -26,7 +28,8 @@ export class TerminalInstanceService implements ITerminalInstanceService { private _mainProcessParentEnv: IProcessEnvironment | undefined; constructor( - @IInstantiationService private readonly _instantiationService: IInstantiationService + @IInstantiationService private readonly _instantiationService: IInstantiationService, + @IConfigurationService private readonly _configurationService: IConfigurationService ) { } @@ -63,6 +66,19 @@ export class TerminalInstanceService implements ITerminalInstanceService { return getDefaultShell(p); } + public mergeDefaultShellPathAndArgs(shell: IShellLaunchConfig, defaultShell: string, configHelper: ITerminalConfigHelper, platformOverride: Platform = platform): void { + const isWorkspaceShellAllowed = configHelper.checkWorkspaceShellPermissions(platformOverride === Platform.Windows ? OperatingSystem.Windows : (platformOverride === Platform.Mac ? OperatingSystem.Macintosh : OperatingSystem.Linux)); + mergeDefaultShellPathAndArgs( + shell, + (key) => this._configurationService.inspect(key), + isWorkspaceShellAllowed, + defaultShell, + process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432'), + process.env.windir, + platformOverride + ); + } + public async getMainProcessParentEnv(): Promise { if (this._mainProcessParentEnv) { return this._mainProcessParentEnv; diff --git a/src/vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts b/src/vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts index 2ed2188c6d0..eea75ac373d 100644 --- a/src/vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts +++ b/src/vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts @@ -30,6 +30,9 @@ class TestXterm { } class MockTerminalInstanceService implements ITerminalInstanceService { + mergeDefaultShellPathAndArgs(): void { + throw new Error('Method not implemented.'); + } _serviceBrand: any; getXtermConstructor(): Promise { throw new Error('Method not implemented.'); From 7751dd0b0ad226c76b10ae53748efadd87ab21d5 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 14 Jun 2019 11:56:51 -0700 Subject: [PATCH 0188/1449] Bump distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e31c66de33d..738de9a57cd 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "2ae09f85117daa71bf7db8f10eaf4c52af4ae4ec", + "distro": "8a2c96a9296c1b8112a4d0e74c0b10063c1a8d44", "author": { "name": "Microsoft Corporation" }, From b63c9f9849c22af11a96fae335e1e0a4e33102e6 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 14 Jun 2019 12:21:04 -0700 Subject: [PATCH 0189/1449] Remove typo --- .../contrib/terminal/common/terminalProcessExtHostProxy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/terminal/common/terminalProcessExtHostProxy.ts b/src/vs/workbench/contrib/terminal/common/terminalProcessExtHostProxy.ts index 80c756977d3..8346a90cd46 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalProcessExtHostProxy.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalProcessExtHostProxy.ts @@ -19,7 +19,7 @@ export class TerminalProcessExtHostProxy extends Disposable implements ITerminal private readonly _onProcessExit = this._register(new Emitter()); public readonly onProcessExit: Event = this._onProcessExit.event; private readonly _onProcessReady = new Emitter<{ pid: number, cwd: string }>(); - public get onProcessReady(): Event<{ pid: number, cwd: string }> { return this._onProcessReady.event; }t; + public get onProcessReady(): Event<{ pid: number, cwd: string }> { return this._onProcessReady.event; } private readonly _onProcessTitleChanged = this._register(new Emitter()); public readonly onProcessTitleChanged: Event = this._onProcessTitleChanged.event; From 8ef603062f300b4f1a5ee58e8041093552c18d7d Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Fri, 14 Jun 2019 13:03:29 -0700 Subject: [PATCH 0190/1449] #74846. no CommandsConverter#toInternal --- .../workbench/api/common/extHostComments.ts | 66 ++++++++++++------- 1 file changed, 42 insertions(+), 24 deletions(-) diff --git a/src/vs/workbench/api/common/extHostComments.ts b/src/vs/workbench/api/common/extHostComments.ts index adfbeb4f0d7..4b76a7bece0 100644 --- a/src/vs/workbench/api/common/extHostComments.ts +++ b/src/vs/workbench/api/common/extHostComments.ts @@ -10,13 +10,14 @@ import { ExtHostDocuments } from 'vs/workbench/api/common/extHostDocuments'; import * as extHostTypeConverter from 'vs/workbench/api/common/extHostTypeConverters'; import * as types from 'vs/workbench/api/common/extHostTypes'; import * as vscode from 'vscode'; -import { ExtHostCommentsShape, IMainContext, MainContext, MainThreadCommentsShape } from './extHost.protocol'; +import { ExtHostCommentsShape, IMainContext, MainContext, MainThreadCommentsShape, CommandDto } from './extHost.protocol'; import { CommandsConverter, ExtHostCommands } from './extHostCommands'; import { IRange } from 'vs/editor/common/core/range'; import { CancellationToken } from 'vs/base/common/cancellation'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { Event, Emitter } from 'vs/base/common/event'; import { debounce } from 'vs/base/common/decorators'; +import { MutableDisposable, DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; interface HandlerData { @@ -26,7 +27,8 @@ interface HandlerData { type ProviderHandle = number; -export class ExtHostComments implements ExtHostCommentsShape { +export class ExtHostComments implements ExtHostCommentsShape, IDisposable { + private static handlePool = 0; private _proxy: MainThreadCommentsShape; @@ -38,12 +40,15 @@ export class ExtHostComments implements ExtHostCommentsShape { private _documentProviders = new Map>(); private _workspaceProviders = new Map>(); + private _commandDisposables = new MutableDisposable(); + constructor( mainContext: IMainContext, private _commands: ExtHostCommands, private readonly _documents: ExtHostDocuments, ) { this._proxy = mainContext.getProxy(MainContext.MainThreadComments); + this._commandDisposables.value = new DisposableStore(); _commands.registerArgumentProcessor({ processArgument: arg => { @@ -334,7 +339,7 @@ export class ExtHostComments implements ExtHostCommentsShape { const handlerData = this.getDocumentProvider(handle); return asPromise(() => { return handlerData.provider.createNewCommentThread(data.document, ran, text, CancellationToken.None); - }).then(commentThread => commentThread ? convertToCommentThread(handlerData.extensionId, handlerData.provider, commentThread, this._commands.converter) : null); + }).then(commentThread => commentThread ? convertToCommentThread(handlerData.extensionId, handlerData.provider, commentThread, this._commands.converter, this._commandDisposables.value!) : null); } $replyToCommentThread(handle: number, uri: UriComponents, range: IRange, thread: modes.CommentThread, text: string): Promise { @@ -348,7 +353,7 @@ export class ExtHostComments implements ExtHostCommentsShape { const handlerData = this.getDocumentProvider(handle); return asPromise(() => { return handlerData.provider.replyToCommentThread(data.document, ran, convertFromCommentThread(thread), text, CancellationToken.None); - }).then(commentThread => commentThread ? convertToCommentThread(handlerData.extensionId, handlerData.provider, commentThread, this._commands.converter) : null); + }).then(commentThread => commentThread ? convertToCommentThread(handlerData.extensionId, handlerData.provider, commentThread, this._commands.converter, this._commandDisposables.value!) : null); } $editComment(handle: number, uri: UriComponents, comment: modes.Comment, text: string): Promise { @@ -434,7 +439,7 @@ export class ExtHostComments implements ExtHostCommentsShape { const handlerData = this.getDocumentProvider(handle); return asPromise(() => { return handlerData.provider.provideDocumentComments(document, CancellationToken.None); - }).then(commentInfo => commentInfo ? convertCommentInfo(handle, handlerData.extensionId, handlerData.provider, commentInfo, this._commands.converter) : null); + }).then(commentInfo => commentInfo ? convertCommentInfo(handle, handlerData.extensionId, handlerData.provider, commentInfo, this._commands.converter, this._commandDisposables.value!) : null); } $provideWorkspaceComments(handle: number): Promise { @@ -446,7 +451,7 @@ export class ExtHostComments implements ExtHostCommentsShape { return asPromise(() => { return handlerData.provider.provideWorkspaceComments(CancellationToken.None); }).then(comments => - comments.map(comment => convertToCommentThread(handlerData.extensionId, handlerData.provider, comment, this._commands.converter) + comments.map(comment => convertToCommentThread(handlerData.extensionId, handlerData.provider, comment, this._commands.converter, this._commandDisposables.value!) )); } @@ -454,9 +459,9 @@ export class ExtHostComments implements ExtHostCommentsShape { provider.onDidChangeCommentThreads(event => { this._proxy.$onDidCommentThreadsChange(handle, { - changed: event.changed.map(thread => convertToCommentThread(extensionId, provider, thread, this._commands.converter)), - added: event.added.map(thread => convertToCommentThread(extensionId, provider, thread, this._commands.converter)), - removed: event.removed.map(thread => convertToCommentThread(extensionId, provider, thread, this._commands.converter)), + changed: event.changed.map(thread => convertToCommentThread(extensionId, provider, thread, this._commands.converter, this._commandDisposables.value!)), + added: event.added.map(thread => convertToCommentThread(extensionId, provider, thread, this._commands.converter, this._commandDisposables.value!)), + removed: event.removed.map(thread => convertToCommentThread(extensionId, provider, thread, this._commands.converter, this._commandDisposables.value!)), draftMode: !!(provider as vscode.DocumentCommentProvider).startDraft && !!(provider as vscode.DocumentCommentProvider).finishDraft ? (event.inDraftMode ? modes.DraftMode.InDraft : modes.DraftMode.NotInDraft) : modes.DraftMode.NotSupported }); }); @@ -469,6 +474,10 @@ export class ExtHostComments implements ExtHostCommentsShape { } return provider; } + + dispose(): void { + this._commandDisposables.dispose(); + } } export class ExtHostCommentThread implements vscode.CommentThread { @@ -592,6 +601,8 @@ export class ExtHostCommentThread implements vscode.CommentThread { private _commentsMap: Map = new Map(); + private _acceptInputDisposables = new MutableDisposable(); + constructor( private _proxy: MainThreadCommentsShape, private readonly _commandsConverter: CommandsConverter, @@ -602,6 +613,8 @@ export class ExtHostCommentThread implements vscode.CommentThread { private _comments: vscode.Comment[], extensionId: ExtensionIdentifier ) { + this._acceptInputDisposables.value = new DisposableStore(); + if (this._id === undefined) { this._id = `${_commentController.id}.${this.handle}`; } @@ -626,15 +639,20 @@ export class ExtHostCommentThread implements vscode.CommentThread { this.comments = _comments; } + @debounce(100) eventuallyUpdateCommentThread(): void { + if (!this._acceptInputDisposables.value) { + this._acceptInputDisposables.value = new DisposableStore(); + } + const commentThreadRange = extHostTypeConverter.Range.from(this._range); const label = this.label; const contextValue = this.contextValue; - const comments = this._comments.map(cmt => { return convertToModeComment2(this, this._commentController, cmt, this._commandsConverter, this._commentsMap); }); - const acceptInputCommand = this._acceptInputCommand ? this._commandsConverter.toInternal(this._acceptInputCommand) : undefined; - const additionalCommands = this._additionalCommands ? this._additionalCommands.map(x => this._commandsConverter.toInternal(x)) : []; - const deleteCommand = this._deleteCommand ? this._commandsConverter.toInternal(this._deleteCommand) : undefined; + const comments = this._comments.map(cmt => { return convertToModeComment2(this, this._commentController, cmt, this._commandsConverter, this._commentsMap, this._acceptInputDisposables.value!); }); + const acceptInputCommand = this._acceptInputCommand ? this._commandsConverter.toInternal2(this._acceptInputCommand, this._acceptInputDisposables.value) : undefined; + const additionalCommands = (this._additionalCommands ? this._additionalCommands.map(x => this._commandsConverter.toInternal2(x, this._acceptInputDisposables.value!)) : []) as CommandDto[]; + const deleteCommand = this._deleteCommand ? this._commandsConverter.toInternal2(this._deleteCommand, this._acceptInputDisposables.value) : undefined; const collapsibleState = convertToCollapsibleState(this._collapseState); this._proxy.$updateCommentThread( @@ -676,6 +694,7 @@ export class ExtHostCommentThread implements vscode.CommentThread { } dispose() { + this._acceptInputDisposables.dispose(); this._localDisposables.forEach(disposable => disposable.dispose()); this._proxy.$deleteCommentThread( this._commentController.handle, @@ -683,7 +702,6 @@ export class ExtHostCommentThread implements vscode.CommentThread { ); this._isDiposed = true; } - } export class ExtHostCommentInputBox implements vscode.CommentInputBox { @@ -844,22 +862,22 @@ class ExtHostCommentController implements vscode.CommentController { } } -function convertCommentInfo(owner: number, extensionId: ExtensionIdentifier, provider: vscode.DocumentCommentProvider, vscodeCommentInfo: vscode.CommentInfo, commandsConverter: CommandsConverter): modes.CommentInfo { +function convertCommentInfo(owner: number, extensionId: ExtensionIdentifier, provider: vscode.DocumentCommentProvider, vscodeCommentInfo: vscode.CommentInfo, commandsConverter: CommandsConverter, disposables: DisposableStore): modes.CommentInfo { return { extensionId: extensionId.value, - threads: vscodeCommentInfo.threads.map(x => convertToCommentThread(extensionId, provider, x, commandsConverter)), + threads: vscodeCommentInfo.threads.map(x => convertToCommentThread(extensionId, provider, x, commandsConverter, disposables)), commentingRanges: vscodeCommentInfo.commentingRanges ? vscodeCommentInfo.commentingRanges.map(range => extHostTypeConverter.Range.from(range)) : [], draftMode: provider.startDraft && provider.finishDraft ? (vscodeCommentInfo.inDraftMode ? modes.DraftMode.InDraft : modes.DraftMode.NotInDraft) : modes.DraftMode.NotSupported }; } -function convertToCommentThread(extensionId: ExtensionIdentifier, provider: vscode.DocumentCommentProvider | vscode.WorkspaceCommentProvider, vscodeCommentThread: vscode.CommentThread, commandsConverter: CommandsConverter): modes.CommentThread { +function convertToCommentThread(extensionId: ExtensionIdentifier, provider: vscode.DocumentCommentProvider | vscode.WorkspaceCommentProvider, vscodeCommentThread: vscode.CommentThread, commandsConverter: CommandsConverter, disposables: DisposableStore): modes.CommentThread { return { extensionId: extensionId.value, threadId: vscodeCommentThread.id, resource: vscodeCommentThread.resource.toString(), range: extHostTypeConverter.Range.from(vscodeCommentThread.range), - comments: vscodeCommentThread.comments.map(comment => convertToComment(provider, comment as vscode.Comment, commandsConverter)), + comments: vscodeCommentThread.comments.map(comment => convertToComment(provider, comment as vscode.Comment, commandsConverter, disposables)), collapsibleState: vscodeCommentThread.collapsibleState }; } @@ -914,7 +932,7 @@ function convertFromComment(comment: modes.Comment): vscode.Comment { }; } -function convertToModeComment2(thread: ExtHostCommentThread, commentController: ExtHostCommentController, vscodeComment: vscode.Comment, commandsConverter: CommandsConverter, commentsMap: Map): modes.Comment { +function convertToModeComment2(thread: ExtHostCommentThread, commentController: ExtHostCommentController, vscodeComment: vscode.Comment, commandsConverter: CommandsConverter, commentsMap: Map, disposables: DisposableStore): modes.Comment { let commentUniqueId = commentsMap.get(vscodeComment)!; if (!commentUniqueId) { commentUniqueId = ++thread.commentHandle; @@ -933,15 +951,15 @@ function convertToModeComment2(thread: ExtHostCommentThread, commentController: userName: vscodeComment.author ? vscodeComment.author.name : vscodeComment.userName, userIconPath: iconPath, isDraft: vscodeComment.isDraft, - selectCommand: vscodeComment.selectCommand ? commandsConverter.toInternal(vscodeComment.selectCommand) : undefined, - editCommand: vscodeComment.editCommand ? commandsConverter.toInternal(vscodeComment.editCommand) : undefined, - deleteCommand: vscodeComment.deleteCommand ? commandsConverter.toInternal(vscodeComment.deleteCommand) : undefined, + selectCommand: vscodeComment.selectCommand ? commandsConverter.toInternal2(vscodeComment.selectCommand, disposables) : undefined, + editCommand: vscodeComment.editCommand ? commandsConverter.toInternal2(vscodeComment.editCommand, disposables) : undefined, + deleteCommand: vscodeComment.deleteCommand ? commandsConverter.toInternal2(vscodeComment.deleteCommand, disposables) : undefined, label: vscodeComment.label, commentReactions: reactions ? reactions.map(reaction => convertToReaction2(commentController.reactionProvider, reaction)) : undefined }; } -function convertToComment(provider: vscode.DocumentCommentProvider | vscode.WorkspaceCommentProvider, vscodeComment: vscode.Comment, commandsConverter: CommandsConverter): modes.Comment { +function convertToComment(provider: vscode.DocumentCommentProvider | vscode.WorkspaceCommentProvider, vscodeComment: vscode.Comment, commandsConverter: CommandsConverter, disposables: DisposableStore): modes.Comment { const canEdit = !!(provider as vscode.DocumentCommentProvider).editComment && vscodeComment.canEdit; const canDelete = !!(provider as vscode.DocumentCommentProvider).deleteComment && vscodeComment.canDelete; const iconPath = vscodeComment.userIconPath ? vscodeComment.userIconPath.toString() : vscodeComment.gravatar; @@ -953,7 +971,7 @@ function convertToComment(provider: vscode.DocumentCommentProvider | vscode.Work userIconPath: iconPath, canEdit: canEdit, canDelete: canDelete, - selectCommand: vscodeComment.command ? commandsConverter.toInternal(vscodeComment.command) : undefined, + selectCommand: vscodeComment.command ? commandsConverter.toInternal2(vscodeComment.command, disposables) : undefined, isDraft: vscodeComment.isDraft, commentReactions: vscodeComment.commentReactions ? vscodeComment.commentReactions.map(reaction => convertToReaction(provider, reaction)) : undefined }; From 08ac6296c2366908e1a6d5b056aef643c5573918 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 14 Jun 2019 13:33:27 -0700 Subject: [PATCH 0191/1449] xterm@3.15.0-beta37 Diff https://github.com/xtermjs/xterm.js/compare/566f594...cdc9f79 - Addon webpacking - Docs - Fix DOM cursor blink - Remove some IE workarounds Fixes #75534 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 738de9a57cd..7fbcc2a52b5 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "vscode-ripgrep": "^1.2.5", "vscode-sqlite3": "4.0.7", "vscode-textmate": "^4.1.1", - "xterm": "3.15.0-beta34", + "xterm": "3.15.0-beta37", "xterm-addon-search": "0.1.0-beta6", "xterm-addon-web-links": "0.1.0-beta10", "yauzl": "^2.9.2", diff --git a/yarn.lock b/yarn.lock index 917577b00e5..7d76af26819 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9909,10 +9909,10 @@ xterm-addon-web-links@0.1.0-beta10: resolved "https://registry.yarnpkg.com/xterm-addon-web-links/-/xterm-addon-web-links-0.1.0-beta10.tgz#610fa9773a2a5ccd41c1c83ba0e2dd2c9eb66a23" integrity sha512-xfpjy0V6bB4BR44qIgZQPoCMVakxb65gMscPkHpO//QxvUxKzabV3dxOsIbeZRFkUGsWTFlvz2OoaBLoNtv5gg== -xterm@3.15.0-beta34: - version "3.15.0-beta34" - resolved "https://registry.yarnpkg.com/xterm/-/xterm-3.15.0-beta34.tgz#32ca9523f842cfc213bf64cbb199bb9adaddcd2d" - integrity sha512-eqq/K002xVCfYXZggbI7v7dRgRKTvJhVFTHqcs6MdMHuiOYl4lwZFkv4aFf896kkbnKQOZZGGzhnBFfa1w1rTA== +xterm@3.15.0-beta37: + version "3.15.0-beta37" + resolved "https://registry.yarnpkg.com/xterm/-/xterm-3.15.0-beta37.tgz#239733c1b195e8d1b560bb87806ace928ddd0874" + integrity sha512-ma9A8di0xxedFTZIuQD7wKbX9lxuwNi7j07rpSe9Igg5uw57YMFJnbb1E58zjLNQe4GHqU4edBsyNFmMyO7pbQ== y18n@^3.2.1: version "3.2.1" From 8c00f566e520d95ada37a97a7d43dc1bd7b54d94 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Fri, 14 Jun 2019 13:56:57 -0700 Subject: [PATCH 0192/1449] Fix #75530, add high contrast colors --- src/vs/workbench/browser/media/icons.css | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/vs/workbench/browser/media/icons.css b/src/vs/workbench/browser/media/icons.css index d64467ddee8..9393c1d303e 100644 --- a/src/vs/workbench/browser/media/icons.css +++ b/src/vs/workbench/browser/media/icons.css @@ -34,6 +34,20 @@ --yellow: #fc0; } +:root .hc-black { + --blue: #75beff; + --gray: #FFF; + --grayLight: #FFF; + --green: #89d185; + --greenLight: #9cce9c; + --orange: #e8ab53; + --orangeLight: #ff8e00; + --purple: #b180d7; + --red: #f48771; + --redLight: #e51400; + --yellow: #fc0; +} + /**************** Base From 3509f35d98117c90ca93032cb96810ad80456d8d Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Fri, 14 Jun 2019 14:24:01 -0700 Subject: [PATCH 0193/1449] separate inline and context actions for comment node --- .../contrib/comments/browser/commentMenus.ts | 2 +- .../contrib/comments/browser/commentNode.ts | 48 ++++++++++++++++--- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/contrib/comments/browser/commentMenus.ts b/src/vs/workbench/contrib/comments/browser/commentMenus.ts index e5ba3f06f5b..bdcf3118728 100644 --- a/src/vs/workbench/contrib/comments/browser/commentMenus.ts +++ b/src/vs/workbench/contrib/comments/browser/commentMenus.ts @@ -47,7 +47,7 @@ export class CommentMenus implements IDisposable { const secondary: IAction[] = []; const result = { primary, secondary }; - createAndFillInContextMenuActions(menu, { shouldForwardArgs: true }, result, this.contextMenuService, g => true); + createAndFillInContextMenuActions(menu, { shouldForwardArgs: true }, result, this.contextMenuService, g => /^inline/.test(g)); return menu; } diff --git a/src/vs/workbench/contrib/comments/browser/commentNode.ts b/src/vs/workbench/contrib/comments/browser/commentNode.ts index f86440c5efa..f4ac3fe8dd5 100644 --- a/src/vs/workbench/contrib/comments/browser/commentNode.ts +++ b/src/vs/workbench/contrib/comments/browser/commentNode.ts @@ -6,7 +6,7 @@ import * as nls from 'vs/nls'; import * as dom from 'vs/base/browser/dom'; import * as modes from 'vs/editor/common/modes'; -import { ActionsOrientation, ActionViewItem, ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; +import { ActionsOrientation, ActionViewItem, ActionBar, Separator } from 'vs/base/browser/ui/actionbar/actionbar'; import { Button } from 'vs/base/browser/ui/button/button'; import { Action, IActionRunner, IAction } from 'vs/base/common/actions'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; @@ -35,7 +35,7 @@ import { ToggleReactionsAction, ReactionAction, ReactionActionViewItem } from '. import { ICommandService } from 'vs/platform/commands/common/commands'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { ICommentThreadWidget } from 'vs/workbench/contrib/comments/common/commentThreadWidget'; -import { MenuItemAction } from 'vs/platform/actions/common/actions'; +import { MenuItemAction, SubmenuItemAction } from 'vs/platform/actions/common/actions'; import { ContextAwareMenuEntryActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; @@ -153,6 +153,7 @@ export class CommentNode extends Disposable { private createActionsToolbar() { const actions: IAction[] = []; + const secondaryActions: IAction[] = []; let hasReactionHandler = this.commentService.hasReactionHandler(this.owner); @@ -188,12 +189,22 @@ export class CommentNode extends Disposable { const menu = commentMenus.getCommentTitleActions(this.comment, this._contextKeyService); this._register(menu); this._register(menu.onDidChange(e => { - const contributedActions = menu.getActions({ shouldForwardArgs: true }).reduce((r, [, actions]) => [...r, ...actions], []); - this.toolbar.setActions(contributedActions); + const primary: IAction[] = []; + const secondary: IAction[] = []; + const result = { primary, secondary }; + fillInActions(contributedActions, result, false, g => /^inline/.test(g)); + this.toolbar.setActions(primary, secondary); })); - const contributedActions = menu.getActions({ shouldForwardArgs: true }).reduce((r, [, actions]) => [...r, ...actions], []); - actions.push(...contributedActions); + const contributedActions = menu.getActions({ shouldForwardArgs: true }); + { + const primary: IAction[] = []; + const secondary: IAction[] = []; + const result = { primary, secondary }; + fillInActions(contributedActions, result, false, g => /^inline/.test(g)); + actions.push(...primary); + secondaryActions.push(...secondary); + } if (actions.length) { this.toolbar = new ToolBar(this._actionsToolbarContainer, this.contextMenuService, { @@ -224,7 +235,7 @@ export class CommentNode extends Disposable { }; this.registerActionBarListeners(this._actionsToolbarContainer); - this.toolbar.setActions(actions, [])(); + this.toolbar.setActions(actions, secondaryActions)(); this._register(this.toolbar); } } @@ -727,4 +738,27 @@ export class CommentNode extends Disposable { }, 3000); } } +} + +function fillInActions(groups: [string, Array][], target: IAction[] | { primary: IAction[]; secondary: IAction[]; }, useAlternativeActions: boolean, isPrimaryGroup: (group: string) => boolean = group => group === 'navigation'): void { + for (let tuple of groups) { + let [group, actions] = tuple; + if (useAlternativeActions) { + actions = actions.map(a => (a instanceof MenuItemAction) && !!a.alt ? a.alt : a); + } + + if (isPrimaryGroup(group)) { + const to = Array.isArray(target) ? target : target.primary; + + to.unshift(...actions); + } else { + const to = Array.isArray(target) ? target : target.secondary; + + if (to.length > 0) { + to.push(new Separator()); + } + + to.push(...actions); + } + } } \ No newline at end of file From 1151dab2bf0f8da6f7a3c97845d6bc2271dfb990 Mon Sep 17 00:00:00 2001 From: Evgeny Zakharov Date: Sat, 15 Jun 2019 03:16:16 +0500 Subject: [PATCH 0194/1449] add window.disableMenuBarAltBehavior option (#73258) * add window.disableMenuBarAltBehavior option * enable alt behavior when menuBarVisibility is set to 'toggle' * rename 'window.disableMenuBarAltBehavior' to 'window.disableCustomMenuBarAltBehavior' and change its description * don't affect mnemonics --- src/vs/base/browser/ui/menu/menubar.ts | 3 ++- .../browser/parts/titlebar/menubarControl.ts | 17 ++++++++++++++--- .../electron-browser/main.contribution.ts | 7 +++++++ 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/vs/base/browser/ui/menu/menubar.ts b/src/vs/base/browser/ui/menu/menubar.ts index 280c102f541..e74092b1148 100644 --- a/src/vs/base/browser/ui/menu/menubar.ts +++ b/src/vs/base/browser/ui/menu/menubar.ts @@ -23,6 +23,7 @@ const $ = DOM.$; export interface IMenuBarOptions { enableMnemonics?: boolean; + disableAltFocus?: boolean; visibility?: string; getKeybinding?: (action: IAction) => ResolvedKeybinding | undefined; alwaysOnMnemonics?: boolean; @@ -786,7 +787,7 @@ export class MenuBar extends Disposable { // Clean alt key press and release if (allModifiersReleased && modifierKeyStatus.lastKeyPressed === 'alt' && modifierKeyStatus.lastKeyReleased === 'alt') { if (!this.awaitingAltRelease) { - if (!this.isFocused) { + if (!this.isFocused && !(this.options.disableAltFocus && this.options.visibility !== 'toggle')) { this.mnemonicsInUse = true; this.focusedMenu = { index: this.numMenusShown > 0 ? 0 : MenuBar.OVERFLOW_INDEX }; this.focusState = MenubarState.FOCUSED; diff --git a/src/vs/workbench/browser/parts/titlebar/menubarControl.ts b/src/vs/workbench/browser/parts/titlebar/menubarControl.ts index 7e6709fef7b..40c05858aea 100644 --- a/src/vs/workbench/browser/parts/titlebar/menubarControl.ts +++ b/src/vs/workbench/browser/parts/titlebar/menubarControl.ts @@ -40,6 +40,7 @@ export abstract class MenubarControl extends Disposable { protected keys = [ 'window.menuBarVisibility', 'window.enableMenuBarMnemonics', + 'window.disableCustomMenuBarAltFocus', 'window.nativeTabs' ]; @@ -603,6 +604,15 @@ export class CustomMenubarControl extends MenubarControl { return this.configurationService.getValue('window.menuBarVisibility'); } + private get currentDisableMenuBarAltFocus(): boolean { + let disableMenuBarAltBehavior = this.configurationService.getValue('window.disableCustomMenuBarAltFocus'); + if (typeof disableMenuBarAltBehavior !== 'boolean') { + disableMenuBarAltBehavior = false; + } + + return disableMenuBarAltBehavior; + } + private insertActionsBefore(nextAction: IAction, target: IAction[]): void { switch (nextAction.id) { case 'workbench.action.openRecent': @@ -640,6 +650,7 @@ export class CustomMenubarControl extends MenubarControl { this.menubar = this._register(new MenuBar( this.container, { enableMnemonics: this.currentEnableMenuBarMnemonics, + disableAltFocus: this.currentDisableMenuBarAltFocus, visibility: this.currentMenubarVisibility, getKeybinding: (action) => this.keybindingService.lookupKeybinding(action.id), } @@ -647,7 +658,7 @@ export class CustomMenubarControl extends MenubarControl { this.accessibilityService.alwaysUnderlineAccessKeys().then(val => { this.alwaysOnMnemonics = val; - this.menubar.update({ enableMnemonics: this.currentEnableMenuBarMnemonics, visibility: this.currentMenubarVisibility, getKeybinding: (action) => this.keybindingService.lookupKeybinding(action.id), alwaysOnMnemonics: this.alwaysOnMnemonics }); + this.menubar.update({ enableMnemonics: this.currentEnableMenuBarMnemonics, disableAltFocus: this.currentDisableMenuBarAltFocus, visibility: this.currentMenubarVisibility, getKeybinding: (action) => this.keybindingService.lookupKeybinding(action.id), alwaysOnMnemonics: this.alwaysOnMnemonics }); }); this._register(this.menubar.onFocusStateChange(e => this._onFocusStateChange.fire(e))); @@ -655,7 +666,7 @@ export class CustomMenubarControl extends MenubarControl { this._register(attachMenuStyler(this.menubar, this.themeService)); } else { - this.menubar.update({ enableMnemonics: this.currentEnableMenuBarMnemonics, visibility: this.currentMenubarVisibility, getKeybinding: (action) => this.keybindingService.lookupKeybinding(action.id), alwaysOnMnemonics: this.alwaysOnMnemonics }); + this.menubar.update({ enableMnemonics: this.currentEnableMenuBarMnemonics, disableAltFocus: this.currentDisableMenuBarAltFocus, visibility: this.currentMenubarVisibility, getKeybinding: (action) => this.keybindingService.lookupKeybinding(action.id), alwaysOnMnemonics: this.alwaysOnMnemonics }); } // Update the menu actions @@ -774,7 +785,7 @@ export class CustomMenubarControl extends MenubarControl { } if (this.menubar) { - this.menubar.update({ enableMnemonics: this.currentEnableMenuBarMnemonics, visibility: this.currentMenubarVisibility, getKeybinding: (action) => this.keybindingService.lookupKeybinding(action.id), alwaysOnMnemonics: this.alwaysOnMnemonics }); + this.menubar.update({ enableMnemonics: this.currentEnableMenuBarMnemonics, disableAltFocus: this.currentDisableMenuBarAltFocus, visibility: this.currentMenubarVisibility, getKeybinding: (action) => this.keybindingService.lookupKeybinding(action.id), alwaysOnMnemonics: this.alwaysOnMnemonics }); } } } diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index 09ea6255a91..5ea030c654a 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -623,6 +623,13 @@ import product from 'vs/platform/product/node/product'; 'description': nls.localize('enableMenuBarMnemonics', "If enabled, the main menus can be opened via Alt-key shortcuts. Disabling mnemonics allows to bind these Alt-key shortcuts to editor commands instead."), 'included': isWindows || isLinux }, + 'window.disableCustomMenuBarAltFocus': { + 'type': 'boolean', + 'default': false, + 'scope': ConfigurationScope.APPLICATION, + 'markdownDescription': nls.localize('disableCustomMenuBarAltFocus', "If enabled, disables the ability to focus the menu bar with the Alt-key when not set to toggle."), + 'included': isWindows || isLinux + }, 'window.autoDetectHighContrast': { 'type': 'boolean', 'default': true, From e3294dc7b1c5e8e976434e9b90e54e3d135b3bdf Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 13 Jun 2019 19:59:36 -0700 Subject: [PATCH 0195/1449] Fix exception if extension is not installed --- .../src/utils/versionProvider.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/extensions/typescript-language-features/src/utils/versionProvider.ts b/extensions/typescript-language-features/src/utils/versionProvider.ts index b9cfc16d31d..fcbee87bb1d 100644 --- a/extensions/typescript-language-features/src/utils/versionProvider.ts +++ b/extensions/typescript-language-features/src/utils/versionProvider.ts @@ -155,11 +155,13 @@ export class TypeScriptVersionProvider { private getContributedVersion(extensionId: string, pathToTs: readonly string[]): TypeScriptVersion | undefined { try { - const { extensionPath } = vscode.extensions.getExtension(extensionId)!; - const typescriptPath = path.join(extensionPath, ...pathToTs, 'typescript', 'lib'); - const bundledVersion = new TypeScriptVersion(typescriptPath, ''); - if (bundledVersion.isValid) { - return bundledVersion; + const extension = vscode.extensions.getExtension(extensionId); + if (extension) { + const typescriptPath = path.join(extension.extensionPath, ...pathToTs, 'typescript', 'lib'); + const bundledVersion = new TypeScriptVersion(typescriptPath, ''); + if (bundledVersion.isValid) { + return bundledVersion; + } } } catch { // noop From e1c930e120cd8525a1063f9310ec16fcfd145152 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 11 Jun 2019 22:38:41 -0700 Subject: [PATCH 0196/1449] iFrame work --- .../contrib/webview/browser/pre/main.js | 657 +++++++++--------- .../contrib/webview/browser/webviewElement.ts | 443 ++++++++++++ .../electron-browser/pre/electron-index.js | 5 + .../electron-browser/webviewService.ts | 5 +- 4 files changed, 778 insertions(+), 332 deletions(-) create mode 100644 src/vs/workbench/contrib/webview/browser/webviewElement.ts diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index 85dd7a6dbc4..691168dd20f 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -3,41 +3,42 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // @ts-check -'use strict'; +(function () { + 'use strict'; -/** - * Use polling to track focus of main webview and iframes within the webview - * - * @param {Object} handlers - * @param {() => void} handlers.onFocus - * @param {() => void} handlers.onBlur - */ -const trackFocus = ({ onFocus, onBlur }) => { - const interval = 50; - let isFocused = document.hasFocus(); - setInterval(() => { - const isCurrentlyFocused = document.hasFocus(); - if (isCurrentlyFocused === isFocused) { - return; - } - isFocused = isCurrentlyFocused; - if (isCurrentlyFocused) { - onFocus(); - } else { - onBlur(); - } - }, interval); -}; + /** + * Use polling to track focus of main webview and iframes within the webview + * + * @param {Object} handlers + * @param {() => void} handlers.onFocus + * @param {() => void} handlers.onBlur + */ + const trackFocus = ({ onFocus, onBlur }) => { + const interval = 50; + let isFocused = document.hasFocus(); + setInterval(() => { + const isCurrentlyFocused = document.hasFocus(); + if (isCurrentlyFocused === isFocused) { + return; + } + isFocused = isCurrentlyFocused; + if (isCurrentlyFocused) { + onFocus(); + } else { + onBlur(); + } + }, interval); + }; -const getActiveFrame = () => { - return /** @type {HTMLIFrameElement} */ (document.getElementById('active-frame')); -}; + const getActiveFrame = () => { + return /** @type {HTMLIFrameElement} */ (document.getElementById('active-frame')); + }; -const getPendingFrame = () => { - return /** @type {HTMLIFrameElement} */ (document.getElementById('pending-frame')); -}; + const getPendingFrame = () => { + return /** @type {HTMLIFrameElement} */ (document.getElementById('pending-frame')); + }; -const defaultCssRules = ` + const defaultCssRules = ` body { background-color: var(--vscode-editor-background); color: var(--vscode-editor-foreground); @@ -93,170 +94,166 @@ const defaultCssRules = ` background-color: var(--vscode-scrollbarSlider-activeBackground); }`; -/** - * @typedef {{ - * postMessage: (channel: string, data?: any) => void, - * onMessage: (channel: string, handler: any) => void, - * injectHtml?: (document: HTMLDocument) => void, - * preProcessHtml?: (text: string) => void, - * focusIframeOnCreate?: boolean - * }} HostCommunications - */ - -/** - * @param {HostCommunications} host - */ -function createWebviewManager(host) { - // state - let firstLoad = true; - let loadTimeout; - let pendingMessages = []; - let isInDevelopmentMode = false; - - const initData = { - initialScrollProgress: undefined - }; + /** + * @typedef {{ + * postMessage: (channel: string, data?: any) => void, + * onMessage: (channel: string, handler: any) => void, + * injectHtml?: (document: HTMLDocument) => void, + * preProcessHtml?: (text: string) => void, + * focusIframeOnCreate?: boolean + * }} HostCommunications + */ /** - * @param {HTMLDocument?} document - * @param {HTMLElement?} body + * @param {HostCommunications} host */ - const applyStyles = (document, body) => { - if (!document) { - return; - } + function createWebviewManager(host) { + // state + let firstLoad = true; + let loadTimeout; + let pendingMessages = []; + let isInDevelopmentMode = false; - if (body) { - body.classList.remove('vscode-light', 'vscode-dark', 'vscode-high-contrast'); - body.classList.add(initData.activeTheme); - } + const initData = { + initialScrollProgress: undefined + }; - if (initData.styles) { - for (const variable of Object.keys(initData.styles)) { - document.documentElement.style.setProperty(`--${variable}`, initData.styles[variable]); - } - } - }; - - /** - * @param {MouseEvent} event - */ - const handleInnerClick = (event) => { - if (!event || !event.view || !event.view.document) { - return; - } - - let baseElement = event.view.document.getElementsByTagName('base')[0]; - /** @type {any} */ - let node = event.target; - while (node) { - if (node.tagName && node.tagName.toLowerCase() === 'a' && node.href) { - if (node.getAttribute('href') === '#') { - event.view.scrollTo(0, 0); - } else if (node.hash && (node.getAttribute('href') === node.hash || (baseElement && node.href.indexOf(baseElement.href) >= 0))) { - let scrollTarget = event.view.document.getElementById(node.hash.substr(1, node.hash.length - 1)); - if (scrollTarget) { - scrollTarget.scrollIntoView(); - } - } else { - host.postMessage('did-click-link', node.href.baseVal || node.href); - } - event.preventDefault(); - break; - } - node = node.parentNode; - } - }; - - /** - * @param {KeyboardEvent} e - */ - const handleInnerKeydown = (e) => { - host.postMessage('did-keydown', { - key: e.key, - keyCode: e.keyCode, - code: e.code, - shiftKey: e.shiftKey, - altKey: e.altKey, - ctrlKey: e.ctrlKey, - metaKey: e.metaKey, - repeat: e.repeat - }); - }; - - const onMessage = (message) => { - host.postMessage(message.data.command, message.data.data); - }; - - let isHandlingScroll = false; - const handleInnerScroll = (event) => { - if (!event.target || !event.target.body) { - return; - } - if (isHandlingScroll) { - return; - } - - const progress = event.currentTarget.scrollY / event.target.body.clientHeight; - if (isNaN(progress)) { - return; - } - - isHandlingScroll = true; - window.requestAnimationFrame(() => { - try { - host.postMessage('did-scroll', progress); - } catch (e) { - // noop - } - isHandlingScroll = false; - }); - }; - - document.addEventListener('DOMContentLoaded', () => { - if (!document.body) { - return; - } - - host.onMessage('styles', (_event, data) => { - initData.styles = data.styles; - initData.activeTheme = data.activeTheme; - - const target = getActiveFrame(); - if (!target) { + /** + * @param {HTMLDocument?} document + * @param {HTMLElement?} body + */ + const applyStyles = (document, body) => { + if (!document) { return; } - if (target.contentDocument) { - applyStyles(target.contentDocument, target.contentDocument.body); + if (body) { + body.classList.remove('vscode-light', 'vscode-dark', 'vscode-high-contrast'); + body.classList.add(initData.activeTheme); } - }); - // propagate focus - host.onMessage('focus', () => { - const target = getActiveFrame(); - if (target) { - target.contentWindow.focus(); + if (initData.styles) { + for (const variable of Object.keys(initData.styles)) { + document.documentElement.style.setProperty(`--${variable}`, initData.styles[variable]); + } } - }); + }; - // update iframe-contents - host.onMessage('content', (_event, data) => { - const options = data.options; + /** + * @param {MouseEvent} event + */ + const handleInnerClick = (event) => { + if (!event || !event.view || !event.view.document) { + return; + } - const text = host.preProcessHtml ? host.preProcessHtml(data.contents) : data.contents; - const newDocument = new DOMParser().parseFromString(text, 'text/html'); + let baseElement = event.view.document.getElementsByTagName('base')[0]; + /** @type {any} */ + let node = event.target; + while (node) { + if (node.tagName && node.tagName.toLowerCase() === 'a' && node.href) { + if (node.getAttribute('href') === '#') { + event.view.scrollTo(0, 0); + } else if (node.hash && (node.getAttribute('href') === node.hash || (baseElement && node.href.indexOf(baseElement.href) >= 0))) { + let scrollTarget = event.view.document.getElementById(node.hash.substr(1, node.hash.length - 1)); + if (scrollTarget) { + scrollTarget.scrollIntoView(); + } + } else { + host.postMessage('did-click-link', node.href.baseVal || node.href); + } + event.preventDefault(); + break; + } + node = node.parentNode; + } + }; - newDocument.querySelectorAll('a').forEach(a => { - if (!a.title) { - a.title = a.getAttribute('href'); + /** + * @param {KeyboardEvent} e + */ + const handleInnerKeydown = (e) => { + host.postMessage('did-keydown', { + key: e.key, + keyCode: e.keyCode, + code: e.code, + shiftKey: e.shiftKey, + altKey: e.altKey, + ctrlKey: e.ctrlKey, + metaKey: e.metaKey, + repeat: e.repeat + }); + }; + + let isHandlingScroll = false; + const handleInnerScroll = (event) => { + if (!event.target || !event.target.body) { + return; + } + if (isHandlingScroll) { + return; + } + + const progress = event.currentTarget.scrollY / event.target.body.clientHeight; + if (isNaN(progress)) { + return; + } + + isHandlingScroll = true; + window.requestAnimationFrame(() => { + try { + host.postMessage('did-scroll', progress); + } catch (e) { + // noop + } + isHandlingScroll = false; + }); + }; + + document.addEventListener('DOMContentLoaded', () => { + if (!document.body) { + return; + } + + host.onMessage('styles', (_event, data) => { + initData.styles = data.styles; + initData.activeTheme = data.activeTheme; + + const target = getActiveFrame(); + if (!target) { + return; + } + + if (target.contentDocument) { + applyStyles(target.contentDocument, target.contentDocument.body); } }); - // apply default script - if (options.allowScripts) { - const defaultScript = newDocument.createElement('script'); - defaultScript.textContent = ` + // propagate focus + host.onMessage('focus', () => { + const target = getActiveFrame(); + if (target) { + target.contentWindow.focus(); + } + }); + + // update iframe-contents + host.onMessage('content', (_event, data) => { + const options = data.options; + + const text = host.preProcessHtml ? host.preProcessHtml(data.contents) : data.contents; + const newDocument = new DOMParser().parseFromString(text, 'text/html'); + + newDocument.querySelectorAll('a').forEach(a => { + if (!a.title) { + a.title = a.getAttribute('href'); + } + }); + + // apply default script + if (options.allowScripts) { + const defaultScript = newDocument.createElement('script'); + defaultScript.textContent = ` const acquireVsCodeApi = (function() { const originalPostMessage = window.parent.postMessage.bind(window.parent); let acquired = false; @@ -288,175 +285,175 @@ function createWebviewManager(host) { delete window.frameElement; `; - newDocument.head.prepend(defaultScript); - } + newDocument.head.prepend(defaultScript); + } - // apply default styles - const defaultStyles = newDocument.createElement('style'); - defaultStyles.id = '_defaultStyles'; - defaultStyles.innerHTML = defaultCssRules; - newDocument.head.prepend(defaultStyles); + // apply default styles + const defaultStyles = newDocument.createElement('style'); + defaultStyles.id = '_defaultStyles'; + defaultStyles.innerHTML = defaultCssRules; + newDocument.head.prepend(defaultStyles); - applyStyles(newDocument, newDocument.body); + applyStyles(newDocument, newDocument.body); - if (host.injectHtml) { - host.injectHtml(newDocument); - } + if (host.injectHtml) { + host.injectHtml(newDocument); + } - const frame = getActiveFrame(); - const wasFirstLoad = firstLoad; - // keep current scrollY around and use later - let setInitialScrollPosition; - if (firstLoad) { - firstLoad = false; - setInitialScrollPosition = (body, window) => { - if (!isNaN(initData.initialScrollProgress)) { - if (window.scrollY === 0) { - window.scroll(0, body.clientHeight * initData.initialScrollProgress); + const frame = getActiveFrame(); + const wasFirstLoad = firstLoad; + // keep current scrollY around and use later + let setInitialScrollPosition; + if (firstLoad) { + firstLoad = false; + setInitialScrollPosition = (body, window) => { + if (!isNaN(initData.initialScrollProgress)) { + if (window.scrollY === 0) { + window.scroll(0, body.clientHeight * initData.initialScrollProgress); + } } - } - }; - } else { - const scrollY = frame && frame.contentDocument && frame.contentDocument.body ? frame.contentWindow.scrollY : 0; - setInitialScrollPosition = (body, window) => { - if (window.scrollY === 0) { - window.scroll(0, scrollY); - } - }; - } - - // Clean up old pending frames and set current one as new one - const previousPendingFrame = getPendingFrame(); - if (previousPendingFrame) { - previousPendingFrame.setAttribute('id', ''); - document.body.removeChild(previousPendingFrame); - } - if (!wasFirstLoad) { - pendingMessages = []; - } - - const newFrame = document.createElement('iframe'); - newFrame.setAttribute('id', 'pending-frame'); - newFrame.setAttribute('frameborder', '0'); - newFrame.setAttribute('sandbox', options.allowScripts ? 'allow-scripts allow-forms allow-same-origin' : 'allow-same-origin'); - newFrame.style.cssText = 'display: block; margin: 0; overflow: hidden; position: absolute; width: 100%; height: 100%; visibility: hidden'; - document.body.appendChild(newFrame); - - // write new content onto iframe - newFrame.contentDocument.open('text/html', 'replace'); - - newFrame.contentWindow.addEventListener('keydown', handleInnerKeydown); - - newFrame.contentWindow.addEventListener('DOMContentLoaded', e => { - const contentDocument = e.target ? (/** @type {HTMLDocument} */ (e.target)) : undefined; - if (contentDocument) { - applyStyles(contentDocument, contentDocument.body); - } - }); - - newFrame.contentWindow.onbeforeunload = () => { - if (isInDevelopmentMode) { // Allow reloads while developing a webview - host.postMessage('do-reload'); - return false; + }; + } else { + const scrollY = frame && frame.contentDocument && frame.contentDocument.body ? frame.contentWindow.scrollY : 0; + setInitialScrollPosition = (body, window) => { + if (window.scrollY === 0) { + window.scroll(0, scrollY); + } + }; } - // Block navigation when not in development mode - console.log('prevented webview navigation'); - return false; - }; - - const onLoad = (contentDocument, contentWindow) => { - if (contentDocument && contentDocument.body) { - // Workaround for https://github.com/Microsoft/vscode/issues/12865 - // check new scrollY and reset if neccessary - setInitialScrollPosition(contentDocument.body, contentWindow); + // Clean up old pending frames and set current one as new one + const previousPendingFrame = getPendingFrame(); + if (previousPendingFrame) { + previousPendingFrame.setAttribute('id', ''); + document.body.removeChild(previousPendingFrame); } - - const newFrame = getPendingFrame(); - if (newFrame && newFrame.contentDocument && newFrame.contentDocument === contentDocument) { - const oldActiveFrame = getActiveFrame(); - if (oldActiveFrame) { - document.body.removeChild(oldActiveFrame); - } - // Styles may have changed since we created the element. Make sure we re-style - applyStyles(newFrame.contentDocument, newFrame.contentDocument.body); - newFrame.setAttribute('id', 'active-frame'); - newFrame.style.visibility = 'visible'; - if (host.focusIframeOnCreate) { - newFrame.contentWindow.focus(); - } - - contentWindow.addEventListener('scroll', handleInnerScroll); - - pendingMessages.forEach((data) => { - contentWindow.postMessage(data, '*'); - }); + if (!wasFirstLoad) { pendingMessages = []; } - }; - clearTimeout(loadTimeout); - loadTimeout = undefined; - loadTimeout = setTimeout(() => { + const newFrame = document.createElement('iframe'); + newFrame.setAttribute('id', 'pending-frame'); + newFrame.setAttribute('frameborder', '0'); + newFrame.setAttribute('sandbox', options.allowScripts ? 'allow-scripts allow-forms allow-same-origin' : 'allow-same-origin'); + newFrame.style.cssText = 'display: block; margin: 0; overflow: hidden; position: absolute; width: 100%; height: 100%; visibility: hidden'; + document.body.appendChild(newFrame); + + // write new content onto iframe + newFrame.contentDocument.open('text/html', 'replace'); + + newFrame.contentWindow.addEventListener('keydown', handleInnerKeydown); + + newFrame.contentWindow.addEventListener('DOMContentLoaded', e => { + const contentDocument = e.target ? (/** @type {HTMLDocument} */ (e.target)) : undefined; + if (contentDocument) { + applyStyles(contentDocument, contentDocument.body); + } + }); + + newFrame.contentWindow.onbeforeunload = () => { + if (isInDevelopmentMode) { // Allow reloads while developing a webview + host.postMessage('do-reload'); + return false; + } + + // Block navigation when not in development mode + console.log('prevented webview navigation'); + return false; + }; + + const onLoad = (contentDocument, contentWindow) => { + if (contentDocument && contentDocument.body) { + // Workaround for https://github.com/Microsoft/vscode/issues/12865 + // check new scrollY and reset if neccessary + setInitialScrollPosition(contentDocument.body, contentWindow); + } + + const newFrame = getPendingFrame(); + if (newFrame && newFrame.contentDocument && newFrame.contentDocument === contentDocument) { + const oldActiveFrame = getActiveFrame(); + if (oldActiveFrame) { + document.body.removeChild(oldActiveFrame); + } + // Styles may have changed since we created the element. Make sure we re-style + applyStyles(newFrame.contentDocument, newFrame.contentDocument.body); + newFrame.setAttribute('id', 'active-frame'); + newFrame.style.visibility = 'visible'; + if (host.focusIframeOnCreate) { + newFrame.contentWindow.focus(); + } + + contentWindow.addEventListener('scroll', handleInnerScroll); + + pendingMessages.forEach((data) => { + contentWindow.postMessage(data, '*'); + }); + pendingMessages = []; + } + }; + clearTimeout(loadTimeout); loadTimeout = undefined; - onLoad(newFrame.contentDocument, newFrame.contentWindow); - }, 200); - - newFrame.contentWindow.addEventListener('load', function (e) { - if (loadTimeout) { + loadTimeout = setTimeout(() => { clearTimeout(loadTimeout); loadTimeout = undefined; - onLoad(e.target, this); - } + onLoad(newFrame.contentDocument, newFrame.contentWindow); + }, 200); + + newFrame.contentWindow.addEventListener('load', function (e) { + if (loadTimeout) { + clearTimeout(loadTimeout); + loadTimeout = undefined; + onLoad(e.target, this); + } + }); + + // Bubble out link clicks + newFrame.contentWindow.addEventListener('click', handleInnerClick); + + // set DOCTYPE for newDocument explicitly as DOMParser.parseFromString strips it off + // and DOCTYPE is needed in the iframe to ensure that the user agent stylesheet is correctly overridden + newFrame.contentDocument.write(''); + newFrame.contentDocument.write(newDocument.documentElement.innerHTML); + newFrame.contentDocument.close(); + + host.postMessage('did-set-content', undefined); }); - // Bubble out link clicks - newFrame.contentWindow.addEventListener('click', handleInnerClick); - - // set DOCTYPE for newDocument explicitly as DOMParser.parseFromString strips it off - // and DOCTYPE is needed in the iframe to ensure that the user agent stylesheet is correctly overridden - newFrame.contentDocument.write(''); - newFrame.contentDocument.write(newDocument.documentElement.innerHTML); - newFrame.contentDocument.close(); - - host.postMessage('did-set-content', undefined); - }); - - // Forward message to the embedded iframe - host.onMessage('message', (_event, data) => { - const pending = getPendingFrame(); - if (!pending) { - const target = getActiveFrame(); - if (target) { - target.contentWindow.postMessage(data, '*'); - return; + // Forward message to the embedded iframe + host.onMessage('message', (_event, data) => { + const pending = getPendingFrame(); + if (!pending) { + const target = getActiveFrame(); + if (target) { + target.contentWindow.postMessage(data, '*'); + return; + } } - } - pendingMessages.push(data); + pendingMessages.push(data); + }); + + host.onMessage('initial-scroll-position', (_event, progress) => { + initData.initialScrollProgress = progress; + }); + + host.onMessage('devtools-opened', () => { + isInDevelopmentMode = true; + }); + + trackFocus({ + onFocus: () => host.postMessage('did-focus'), + onBlur: () => host.postMessage('did-blur') + }); + + // signal ready + host.postMessage('webview-ready', {}); }); + } - host.onMessage('initial-scroll-position', (_event, progress) => { - initData.initialScrollProgress = progress; - }); - - host.onMessage('devtools-opened', () => { - isInDevelopmentMode = true; - }); - - trackFocus({ - onFocus: () => host.postMessage('did-focus'), - onBlur: () => host.postMessage('did-blur') - }); - - // Forward messages from the embedded iframe - window.onmessage = onMessage; - - // signal ready - host.postMessage('webview-ready', {}); - }); -} - -if (typeof module !== 'undefined') { - module.exports = createWebviewManager; -} \ No newline at end of file + if (typeof module !== 'undefined') { + module.exports = createWebviewManager; + } else { + window.createWebviewManager = createWebviewManager; + } +}()); \ No newline at end of file diff --git a/src/vs/workbench/contrib/webview/browser/webviewElement.ts b/src/vs/workbench/contrib/webview/browser/webviewElement.ts new file mode 100644 index 00000000000..fc5486d2b7f --- /dev/null +++ b/src/vs/workbench/contrib/webview/browser/webviewElement.ts @@ -0,0 +1,443 @@ +/*--------------------------------------------------------------------------------------------- +* Copyright (c) Microsoft Corporation. All rights reserved. +* Licensed under the MIT License. See License.txt in the project root for license information. +*--------------------------------------------------------------------------------------------*/ + +import { Emitter } from 'vs/base/common/event'; +import { URI } from 'vs/base/common/uri'; +import { Webview, WebviewContentOptions, WebviewOptions } from 'vs/workbench/contrib/webview/common/webview'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IThemeService, ITheme } from 'vs/platform/theme/common/themeService'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { IFileService } from 'vs/platform/files/common/files'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { areWebviewInputOptionsEqual } from 'vs/workbench/contrib/webview/browser/webviewEditorService'; +import { addDisposableListener, addClass } from 'vs/base/browser/dom'; +import { createServer } from 'http'; +import * as fs from 'fs'; +import * as path from 'path'; +import { startsWith } from 'vs/base/common/strings'; +import { getWebviewThemeData } from 'vs/workbench/contrib/webview/common/themeing'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { getWebviewContentMimeType } from 'vs/workbench/contrib/webview/common/mimeTypes'; + +const SERVER_RESOURCE_ROOT_PATH = '/resource/'; + +class Server { + public static make( + id: string, + fileService: IFileService + ): Promise { + let address = ''; + return new Promise((resolve, reject) => { + const server = createServer((req, res) => { + if (req.url === '/') { + res.writeHead(200, { 'Content-Type': 'text/html' }); + res.write(getHtml(id, address)); + res.end(); + return; + } + if (req.url === '/main.js') { + res.writeHead(200, { 'Content-Type': 'text/html' }); + res.write(fs.readFileSync(path.join(__dirname.replace('file:', ''), 'pre', 'main.js'))); + res.end(); + return; + } + if (req.url && startsWith(req.url, SERVER_RESOURCE_ROOT_PATH)) { + const path = URI.file(req.url.replace(SERVER_RESOURCE_ROOT_PATH, '/')); + res.writeHead(200, { 'Content-Type': getWebviewContentMimeType(path) }); + fileService.readFile(path).then(result => { + res.write(result.value.buffer); + }).finally(() => { + res.end(); + }); + return; + } + + res.writeHead(404); + res.end(); + return; + }); + + server.on('error', reject); + const l = server.listen(() => { + server.removeListener('error', reject); + address = `http://localhost:${l.address().port}`; + resolve(new Server(server, l.address().port)); + }); + }); + } + + private constructor( + public readonly server: import('http').Server, + public readonly port: number + ) { } + + dispose() { + this.server.close(); + } +} + +interface WebviewContent { + readonly html: string; + readonly options: WebviewContentOptions; + readonly state: string | undefined; +} + +export class IFrameWebview extends Disposable implements Webview { + private element: HTMLIFrameElement; + + private _ready: Promise; + + private content: WebviewContent; + private _focused = false; + + private readonly id: string; + private readonly server: Promise; + + constructor( + private readonly _options: WebviewOptions, + contentOptions: WebviewContentOptions, + @IInstantiationService instantiationService: IInstantiationService, + @IThemeService themeService: IThemeService, + @IEnvironmentService environmentService: IEnvironmentService, + @IFileService fileService: IFileService, + @ITelemetryService telemetryService: ITelemetryService, + @IConfigurationService private readonly _configurationService: IConfigurationService, + ) { + super(); + this.content = { + html: '', + options: contentOptions, + state: undefined + }; + + this.id = `webview-${Date.now()}`; + + this.element = document.createElement('iframe'); + this.element.sandbox.add('allow-scripts'); + this.element.sandbox.add('allow-same-origin'); + this.element.setAttribute('src', ''); + this.element.style.border = 'none'; + this.element.style.width = '100%'; + this.element.style.height = '100%'; + + this.server = Server.make(this.id, fileService); + this.server.then(async server => { + this.element.setAttribute('src', `http://localhost:${server.port}`); + }); + + this._register(addDisposableListener(window, 'message', e => { + if (!e || !e.data || e.data.target !== this.id) { + return; + } + + switch (e.data.channel) { + case 'onmessage': + if (e.data.data) { + this._onMessage.fire(e.data.data); + } + return; + + case 'did-click-link': + let [uri] = e.data.data; + this._onDidClickLink.fire(URI.parse(uri)); + return; + + case 'did-set-content': + // this._webview.style.flex = ''; + // this._webview.style.width = '100%'; + // this._webview.style.height = '100%'; + // this.layout(); + return; + + case 'did-scroll': + // if (event.args && typeof event.args[0] === 'number') { + // this._onDidScroll.fire({ scrollYPercentage: event.args[0] }); + // } + return; + + case 'do-reload': + this.reload(); + return; + + case 'do-update-state': + const state = e.data.data; + this.state = state; + this._onDidUpdateState.fire(state); + return; + + case 'did-focus': + this.handleFocusChange(true); + return; + + case 'did-blur': + this.handleFocusChange(false); + return; + + } + })); + + this._ready = new Promise(resolve => { + const subscription = this._register(addDisposableListener(window, 'message', (e) => { + if (e.data && e.data.target === this.id && e.data.channel === 'webview-ready') { + addClass(this.element, 'ready'); + subscription.dispose(); + resolve(); + } + })); + }); + + this.style(themeService.getTheme()); + this._register(themeService.onThemeChange(this.style, this)); + } + + public mountTo(parent: HTMLElement) { + parent.appendChild(this.element); + } + + public set options(options: WebviewContentOptions) { + if (areWebviewInputOptionsEqual(options, this.content.options)) { + return; + } + + this.content = { + html: this.content.html, + options: options, + state: this.content.state, + }; + this.doUpdateContent(); + } + + public set html(value: string) { + this.content = { + html: value, + options: this.content.options, + state: this.content.state, + }; + this.doUpdateContent(); + } + + public update(html: string, options: WebviewContentOptions, retainContextWhenHidden: boolean) { + if (retainContextWhenHidden && html === this.content.html && areWebviewInputOptionsEqual(options, this.content.options)) { + return; + } + this.content = { + html: html, + options: options, + state: this.content.state, + }; + this.doUpdateContent(); + } + + private doUpdateContent() { + this._send('content', { + contents: this.content.html, + options: this.content.options, + state: this.content.state + }); + } + + private handleFocusChange(isFocused: boolean): void { + this._focused = isFocused; + if (isFocused) { + this._onDidFocus.fire(); + } + } + + initialScrollProgress: number; + state: string | undefined; + + private readonly _onDidFocus = this._register(new Emitter()); + public readonly onDidFocus = this._onDidFocus.event; + + private readonly _onDidClickLink = this._register(new Emitter()); + public readonly onDidClickLink = this._onDidClickLink.event; + + private readonly _onDidScroll = this._register(new Emitter<{ scrollYPercentage: number }>()); + public readonly onDidScroll = this._onDidScroll.event; + + private readonly _onDidUpdateState = this._register(new Emitter()); + public readonly onDidUpdateState = this._onDidUpdateState.event; + + private readonly _onMessage = this._register(new Emitter()); + public readonly onMessage = this._onMessage.event; + + + sendMessage(data: any): void { + this._send('message', data); + } + + + layout(): void { + // noop + } + + focus(): void { + this.element.focus(); + } + dispose(): void { + if (this.element) { + if (this.element.parentElement) { + this.element.parentElement.removeChild(this.element); + } + } + + this.element = undefined!; + super.dispose(); + } + + reload(): void { + throw new Error('Method not implemented.'); + } + selectAll(): void { + throw new Error('Method not implemented.'); + } + copy(): void { + throw new Error('Method not implemented.'); + } + paste(): void { + throw new Error('Method not implemented.'); + } + cut(): void { + throw new Error('Method not implemented.'); + } + undo(): void { + throw new Error('Method not implemented.'); + } + redo(): void { + throw new Error('Method not implemented.'); + } + showFind(): void { + throw new Error('Method not implemented.'); + } + hideFind(): void { + throw new Error('Method not implemented.'); + } + + private _send(channel: string, data: any): void { + this._ready + .then(() => this.element.contentWindow!.postMessage({ + channel: channel, + args: data + }, '*')) + .catch(err => console.error(err)); + } + + + private style(theme: ITheme): void { + const { styles, activeTheme } = getWebviewThemeData(theme, this._configurationService); + this._send('styles', { styles, activeTheme }); + } +} + +function getHtml(id: string, origin: string): any { + return ` + + + + + + + + Virtual Document + + + + + +`; +} diff --git a/src/vs/workbench/contrib/webview/electron-browser/pre/electron-index.js b/src/vs/workbench/contrib/webview/electron-browser/pre/electron-index.js index 4762aa24c4b..a5f4d3b1809 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/pre/electron-index.js +++ b/src/vs/workbench/contrib/webview/electron-browser/pre/electron-index.js @@ -40,5 +40,10 @@ document.addEventListener('DOMContentLoaded', () => { registerVscodeResourceScheme(); + + // Forward messages from the embedded iframe + window.onmessage = (message) => { + ipcRenderer.sendToHost(message.data.command, message.data.data); + }; }); }()); \ No newline at end of file diff --git a/src/vs/workbench/contrib/webview/electron-browser/webviewService.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewService.ts index e341b1864ea..c158e3212b6 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webviewService.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewService.ts @@ -4,8 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IWebviewService, Webview, WebviewContentOptions, WebviewOptions } from 'vs/workbench/contrib/webview/common/webview'; -import { WebviewElement } from 'vs/workbench/contrib/webview/electron-browser/webviewElement'; +// import { WebviewElement } from 'vs/workbench/contrib/webview/electron-browser/webviewElement'; +import { IFrameWebview as WebviewElement } from 'vs/workbench/contrib/webview/browser/webviewElement'; +import { IWebviewService, WebviewOptions, WebviewContentOptions, Webview } from 'vs/workbench/contrib/webview/common/webview'; export class WebviewService implements IWebviewService { _serviceBrand: any; From cac27d27907138e968c6c5cfbf4bfd181ae7c3be Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 14 Jun 2019 16:29:24 -0700 Subject: [PATCH 0197/1449] Enable basic iframe webviews prototype in the web --- .../contrib/webview/browser/pre/index.html | 55 +++++ .../contrib/webview/browser/webviewElement.ts | 189 +----------------- .../contrib/webview/browser/webviewService.ts | 22 +- .../electron-browser/webviewService.ts | 7 +- src/vs/workbench/workbench.web.main.ts | 7 +- 5 files changed, 82 insertions(+), 198 deletions(-) create mode 100644 src/vs/workbench/contrib/webview/browser/pre/index.html diff --git a/src/vs/workbench/contrib/webview/browser/pre/index.html b/src/vs/workbench/contrib/webview/browser/pre/index.html new file mode 100644 index 00000000000..f8c9b0a5e6a --- /dev/null +++ b/src/vs/workbench/contrib/webview/browser/pre/index.html @@ -0,0 +1,55 @@ + + + + + + + + + + Virtual Document + + + + + + + diff --git a/src/vs/workbench/contrib/webview/browser/webviewElement.ts b/src/vs/workbench/contrib/webview/browser/webviewElement.ts index fc5486d2b7f..c40c6ec2bf9 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewElement.ts @@ -1,7 +1,7 @@ /*--------------------------------------------------------------------------------------------- -* Copyright (c) Microsoft Corporation. All rights reserved. -* Licensed under the MIT License. See License.txt in the project root for license information. -*--------------------------------------------------------------------------------------------*/ + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ import { Emitter } from 'vs/base/common/event'; import { URI } from 'vs/base/common/uri'; @@ -14,70 +14,8 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { Disposable } from 'vs/base/common/lifecycle'; import { areWebviewInputOptionsEqual } from 'vs/workbench/contrib/webview/browser/webviewEditorService'; import { addDisposableListener, addClass } from 'vs/base/browser/dom'; -import { createServer } from 'http'; -import * as fs from 'fs'; -import * as path from 'path'; -import { startsWith } from 'vs/base/common/strings'; import { getWebviewThemeData } from 'vs/workbench/contrib/webview/common/themeing'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { getWebviewContentMimeType } from 'vs/workbench/contrib/webview/common/mimeTypes'; - -const SERVER_RESOURCE_ROOT_PATH = '/resource/'; - -class Server { - public static make( - id: string, - fileService: IFileService - ): Promise { - let address = ''; - return new Promise((resolve, reject) => { - const server = createServer((req, res) => { - if (req.url === '/') { - res.writeHead(200, { 'Content-Type': 'text/html' }); - res.write(getHtml(id, address)); - res.end(); - return; - } - if (req.url === '/main.js') { - res.writeHead(200, { 'Content-Type': 'text/html' }); - res.write(fs.readFileSync(path.join(__dirname.replace('file:', ''), 'pre', 'main.js'))); - res.end(); - return; - } - if (req.url && startsWith(req.url, SERVER_RESOURCE_ROOT_PATH)) { - const path = URI.file(req.url.replace(SERVER_RESOURCE_ROOT_PATH, '/')); - res.writeHead(200, { 'Content-Type': getWebviewContentMimeType(path) }); - fileService.readFile(path).then(result => { - res.write(result.value.buffer); - }).finally(() => { - res.end(); - }); - return; - } - - res.writeHead(404); - res.end(); - return; - }); - - server.on('error', reject); - const l = server.listen(() => { - server.removeListener('error', reject); - address = `http://localhost:${l.address().port}`; - resolve(new Server(server, l.address().port)); - }); - }); - } - - private constructor( - public readonly server: import('http').Server, - public readonly port: number - ) { } - - dispose() { - this.server.close(); - } -} interface WebviewContent { readonly html: string; @@ -94,10 +32,9 @@ export class IFrameWebview extends Disposable implements Webview { private _focused = false; private readonly id: string; - private readonly server: Promise; constructor( - private readonly _options: WebviewOptions, + _options: WebviewOptions, contentOptions: WebviewContentOptions, @IInstantiationService instantiationService: IInstantiationService, @IThemeService themeService: IThemeService, @@ -118,16 +55,11 @@ export class IFrameWebview extends Disposable implements Webview { this.element = document.createElement('iframe'); this.element.sandbox.add('allow-scripts'); this.element.sandbox.add('allow-same-origin'); - this.element.setAttribute('src', ''); + this.element.setAttribute('src', `/src/vs/workbench/contrib/webview/browser/pre/index.html?id=${this.id}`); this.element.style.border = 'none'; this.element.style.width = '100%'; this.element.style.height = '100%'; - this.server = Server.make(this.id, fileService); - this.server.then(async server => { - this.element.setAttribute('src', `http://localhost:${server.port}`); - }); - this._register(addDisposableListener(window, 'message', e => { if (!e || !e.data || e.data.target !== this.id) { return; @@ -241,7 +173,7 @@ export class IFrameWebview extends Disposable implements Webview { private handleFocusChange(isFocused: boolean): void { this._focused = isFocused; - if (isFocused) { + if (this._focused) { this._onDidFocus.fire(); } } @@ -332,112 +264,3 @@ export class IFrameWebview extends Disposable implements Webview { } } -function getHtml(id: string, origin: string): any { - return ` - - - - - - - - Virtual Document - - - - - -`; -} diff --git a/src/vs/workbench/contrib/webview/browser/webviewService.ts b/src/vs/workbench/contrib/webview/browser/webviewService.ts index 00f58a88efb..58448a143cb 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewService.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewService.ts @@ -3,13 +3,23 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IWebviewService, Webview, WebviewContentOptions, WebviewOptions } from 'vs/workbench/contrib/webview/common/webview'; - -export class NullWebviewService implements IWebviewService { +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IFrameWebview as WebviewElement } from 'vs/workbench/contrib/webview/browser/webviewElement'; +import { IWebviewService, WebviewOptions, WebviewContentOptions, Webview } from 'vs/workbench/contrib/webview/common/webview'; +export class WebviewService implements IWebviewService { _serviceBrand: any; - createWebview(_options: WebviewOptions, _contentOptions: WebviewContentOptions): Webview { - throw new Error('not supported'); + constructor( + @IInstantiationService private readonly _instantiationService: IInstantiationService, + ) { } + + createWebview( + options: WebviewOptions, + contentOptions: WebviewContentOptions + ): Webview { + return this._instantiationService.createInstance(WebviewElement, + options, + contentOptions); } -} +} \ No newline at end of file diff --git a/src/vs/workbench/contrib/webview/electron-browser/webviewService.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewService.ts index c158e3212b6..3d2c83af712 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webviewService.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewService.ts @@ -4,8 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -// import { WebviewElement } from 'vs/workbench/contrib/webview/electron-browser/webviewElement'; -import { IFrameWebview as WebviewElement } from 'vs/workbench/contrib/webview/browser/webviewElement'; +import { WebviewElement } from 'vs/workbench/contrib/webview/electron-browser/webviewElement'; import { IWebviewService, WebviewOptions, WebviewContentOptions, Webview } from 'vs/workbench/contrib/webview/common/webview'; export class WebviewService implements IWebviewService { @@ -19,10 +18,8 @@ export class WebviewService implements IWebviewService { options: WebviewOptions, contentOptions: WebviewContentOptions ): Webview { - const element = this._instantiationService.createInstance(WebviewElement, + return this._instantiationService.createInstance(WebviewElement, options, contentOptions); - - return element; } } \ No newline at end of file diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index 784b747c83b..d4c7fd3e13a 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -247,13 +247,12 @@ import 'vs/workbench/contrib/markers/browser/markers.contribution'; import 'vs/workbench/contrib/url/common/url.contribution'; // Webview -// import 'vs/workbench/contrib/webview/browser/webview.contribution'; -// import 'vs/workbench/contrib/webview/electron-browser/webview.contribution'; +import 'vs/workbench/contrib/webview/browser/webview.contribution'; import { IWebviewService } from 'vs/workbench/contrib/webview/common/webview'; -import { NullWebviewService } from 'vs/workbench/contrib/webview/browser/webviewService'; +import { WebviewService } from 'vs/workbench/contrib/webview/browser/webviewService'; import { IWebviewEditorService, WebviewEditorService } from 'vs/workbench/contrib/webview/browser/webviewEditorService'; -registerSingleton(IWebviewService, NullWebviewService, true); +registerSingleton(IWebviewService, WebviewService, true); registerSingleton(IWebviewEditorService, WebviewEditorService, true); // Extensions Management From fa4f870501f161747fa032dec006b89476a42baf Mon Sep 17 00:00:00 2001 From: Lee Houghton Date: Sat, 15 Jun 2019 00:36:23 +0100 Subject: [PATCH 0198/1449] Handle multiple users with /tmp/vscode-typescript This fixes an issue where the typescript language server fails to load if multiple users launch VS Code on the same Linux machine. Steps to reproduce: - Log in as user1 - Launch VS Code - Log out - Log in as user2 - Launch VS Code - It tries to write to files in /tmp/vscode-typescript, but that directory is not writeable because it is owned by user1 - You cannot use TypeScript intellisense This fix namespaces the directory with the current uid so that each user will get their own. On Windows, this shouldn't be an issue anyway since each user gets their own temp directory. --- extensions/typescript-language-features/src/utils/electron.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extensions/typescript-language-features/src/utils/electron.ts b/extensions/typescript-language-features/src/utils/electron.ts index 3a1ece8f726..1f542fe07cc 100644 --- a/extensions/typescript-language-features/src/utils/electron.ts +++ b/extensions/typescript-language-features/src/utils/electron.ts @@ -7,13 +7,14 @@ import * as temp from './temp'; import path = require('path'); import fs = require('fs'); import cp = require('child_process'); +import process = require('process'); const getRootTempDir = (() => { let dir: string | undefined; return () => { if (!dir) { - dir = temp.getTempFile(`vscode-typescript`); + dir = temp.getTempFile(`vscode-typescript${process.getuid ? process.getuid() : ''}`); } if (!fs.existsSync(dir)) { fs.mkdirSync(dir); From 7be1e8928c052ca1a7693404d93be99c8c719ce4 Mon Sep 17 00:00:00 2001 From: SteVen Batten Date: Sat, 15 Jun 2019 00:02:07 +0000 Subject: [PATCH 0199/1449] fixing labels in web --- .../label/common/label.contribution.ts | 48 +++++++++++++++++++ src/vs/workbench/workbench.web.main.ts | 3 ++ 2 files changed, 51 insertions(+) create mode 100644 src/vs/workbench/contrib/label/common/label.contribution.ts diff --git a/src/vs/workbench/contrib/label/common/label.contribution.ts b/src/vs/workbench/contrib/label/common/label.contribution.ts new file mode 100644 index 00000000000..b4868c64869 --- /dev/null +++ b/src/vs/workbench/contrib/label/common/label.contribution.ts @@ -0,0 +1,48 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IWorkbenchContribution, IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; +import { ILabelService } from 'vs/platform/label/common/label'; +import { isWeb } from 'vs/base/common/platform'; +import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; + +export class LabelContribution implements IWorkbenchContribution { + constructor( + @ILabelService private readonly labelService: ILabelService, + @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService) { + this.registerFormatters(); + } + + private useWindowsPaths(): boolean { + if (this.environmentService.configuration.folderUri) { + return this.environmentService.configuration.folderUri.fsPath.indexOf('/') === -1; + } + + if (this.environmentService.configuration.workspace) { + return this.environmentService.configuration.workspace.configPath.fsPath.indexOf('/') === -1; + } + + return false; + } + + private registerFormatters(): void { + if (isWeb) { + this.labelService.registerFormatter({ + scheme: 'vscode-remote', + authority: this.environmentService.configuration.remoteAuthority, + formatting: { + label: '${path}', + separator: this.useWindowsPaths() ? '\\' : '/', + tildify: !this.useWindowsPaths() + } + }); + } + } +} + +const workbenchContributionsRegistry = Registry.as(WorkbenchExtensions.Workbench); +workbenchContributionsRegistry.registerWorkbenchContribution(LabelContribution, LifecyclePhase.Starting); \ No newline at end of file diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index d4c7fd3e13a..382912df5f6 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -194,6 +194,9 @@ import 'vs/workbench/contrib/telemetry/browser/telemetry.contribution'; // Localizations // import 'vs/workbench/contrib/localizations/browser/localizations.contribution'; +// Labels +import 'vs/workbench/contrib/label/common/label.contribution'; + // Preferences import 'vs/workbench/contrib/preferences/browser/preferences.contribution'; import 'vs/workbench/contrib/preferences/browser/keybindingsEditorContribution'; From 71145e6a961745ebecd1265bf6540b22f8efb9af Mon Sep 17 00:00:00 2001 From: SteVen Batten Date: Sat, 15 Jun 2019 00:03:22 +0000 Subject: [PATCH 0200/1449] use constant --- src/vs/workbench/contrib/label/common/label.contribution.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/label/common/label.contribution.ts b/src/vs/workbench/contrib/label/common/label.contribution.ts index b4868c64869..08308a541fc 100644 --- a/src/vs/workbench/contrib/label/common/label.contribution.ts +++ b/src/vs/workbench/contrib/label/common/label.contribution.ts @@ -9,6 +9,7 @@ import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { ILabelService } from 'vs/platform/label/common/label'; import { isWeb } from 'vs/base/common/platform'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { Schemas } from 'vs/base/common/network'; export class LabelContribution implements IWorkbenchContribution { constructor( @@ -32,7 +33,7 @@ export class LabelContribution implements IWorkbenchContribution { private registerFormatters(): void { if (isWeb) { this.labelService.registerFormatter({ - scheme: 'vscode-remote', + scheme: Schemas.vscodeRemote, authority: this.environmentService.configuration.remoteAuthority, formatting: { label: '${path}', From de6af75dd0f6c1a79ef94c7d1de0845d5cd7bf15 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 14 Jun 2019 17:35:56 -0700 Subject: [PATCH 0201/1449] Basic modifications to get webview resources loading --- src/vs/workbench/contrib/webview/browser/pre/index.html | 5 +++-- src/vs/workbench/contrib/webview/browser/pre/main.js | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/index.html b/src/vs/workbench/contrib/webview/browser/pre/index.html index f8c9b0a5e6a..4b247552399 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/index.html +++ b/src/vs/workbench/contrib/webview/browser/pre/index.html @@ -23,7 +23,8 @@ }; window.addEventListener('message', (e) => { - if (e.origin === 'TODO - Does this come from the inner iframe we created?') { + if (e.data && (e.data.command === 'onmessage' || e.data.command === 'do-update-state')) { + // Came from inner iframe postMessageToVsCode(e.data.command, e.data.data); return; } @@ -46,7 +47,7 @@ handlers[channel] = handler; }, preProcessHtml: (text) => { - return text.replace(/(?:["'])vscode-resource:([^\s'"]+)(?:["'])/gi, '/resource?path=$1'); + return text.replace(/(?:["'])vscode-resource:([^\s'"]+)(?:["'])/gi, '/vscode-resource$1'); } }); }()); diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index 691168dd20f..806ad7abfc3 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -256,6 +256,7 @@ defaultScript.textContent = ` const acquireVsCodeApi = (function() { const originalPostMessage = window.parent.postMessage.bind(window.parent); + const targetOrigin = window.parent.origin; let acquired = false; let state = ${data.state ? `JSON.parse(${JSON.stringify(data.state)})` : undefined}; @@ -267,11 +268,11 @@ acquired = true; return Object.freeze({ postMessage: function(msg) { - return originalPostMessage({ command: 'onmessage', data: msg }, '*'); + return originalPostMessage({ command: 'onmessage', data: msg }, targetOrigin); }, setState: function(newState) { state = newState; - originalPostMessage({ command: 'do-update-state', data: JSON.stringify(newState) }, '*'); + originalPostMessage({ command: 'do-update-state', data: JSON.stringify(newState) }, targetOrigin); return newState; }, getState: function() { From 308686a901450c74b3298a8237a00c38b0a5ca3d Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Fri, 14 Jun 2019 17:41:53 -0700 Subject: [PATCH 0202/1449] window keyboard layout should have vkey --- .../browser/keyboardLayoutProvider.ts | 8 +- .../browser/keyboardLayouts/cz.win.ts | 106 ++++++++--------- .../browser/keyboardLayouts/de-swiss.win.ts | 106 ++++++++--------- .../browser/keyboardLayouts/de.win.ts | 106 ++++++++--------- .../browser/keyboardLayouts/dk.win.ts | 106 ++++++++--------- .../browser/keyboardLayouts/en-belgian.win.ts | 106 ++++++++--------- .../browser/keyboardLayouts/en-in.win.ts | 106 ++++++++--------- .../browser/keyboardLayouts/en-intl.win.ts | 106 ++++++++--------- .../browser/keyboardLayouts/en-uk.win.ts | 106 ++++++++--------- .../browser/keyboardLayouts/en.win.ts | 106 ++++++++--------- .../browser/keyboardLayouts/es-latin.win.ts | 106 ++++++++--------- .../browser/keyboardLayouts/es.win.ts | 106 ++++++++--------- .../browser/keyboardLayouts/fr.win.ts | 106 ++++++++--------- .../browser/keyboardLayouts/hu.win.ts | 106 ++++++++--------- .../browser/keyboardLayouts/it.win.ts | 106 ++++++++--------- .../browser/keyboardLayouts/no.win.ts | 106 ++++++++--------- .../browser/keyboardLayouts/pl.win.ts | 106 ++++++++--------- .../browser/keyboardLayouts/pt-br.win.ts | 111 +++++++++--------- .../browser/keyboardLayouts/pt.win.ts | 106 ++++++++--------- .../browser/keyboardLayouts/ru.win.ts | 106 ++++++++--------- .../browser/keyboardLayouts/sv.win.ts | 106 ++++++++--------- .../browser/keyboardLayouts/thai.win.ts | 106 ++++++++--------- .../browser/keyboardLayouts/tr.win.ts | 106 ++++++++--------- 23 files changed, 1174 insertions(+), 1171 deletions(-) diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayoutProvider.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayoutProvider.ts index 469c4be7a7f..c51e35f830f 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayoutProvider.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayoutProvider.ts @@ -17,14 +17,16 @@ function deserializeMapping(serializedMapping: ISerializedMapping) { let withAltGr = result[2]; let withShiftAltGr = result[3]; let mask = Number(result[4]); + let vkey = result.length === 6 ? result[5] : undefined; ret[key] = { 'value': value, - 'valueIsDeadKey': (mask & 1) > 0, + 'vkey': vkey, 'withShift': withShift, - 'withShiftIsDeadKey': (mask & 2) > 0, 'withAltGr': withAltGr, - 'withAltGrIsDeadKey': (mask & 4) > 0, 'withShiftAltGr': withShiftAltGr, + 'valueIsDeadKey': (mask & 1) > 0, + 'withShiftIsDeadKey': (mask & 2) > 0, + 'withAltGrIsDeadKey': (mask & 4) > 0, 'withShiftAltGrIsDeadKey': (mask & 8) > 0 }; } else { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/cz.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/cz.win.ts index 47cf35f8794..1908441eceb 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/cz.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/cz.win.ts @@ -11,58 +11,58 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( { Sleep: [], WakeUp: [], - KeyA: ['a', 'A', '', '', 0], - KeyB: ['b', 'B', '{', '', 0], - KeyC: ['c', 'C', '&', '', 0], - KeyD: ['d', 'D', 'Đ', '', 0], - KeyE: ['e', 'E', '€', '', 0], - KeyF: ['f', 'F', '[', '', 0], - KeyG: ['g', 'G', ']', '', 0], - KeyH: ['h', 'H', '', '', 0], - KeyI: ['i', 'I', '', '', 0], - KeyJ: ['j', 'J', '', '', 0], - KeyK: ['k', 'K', 'ł', '', 0], - KeyL: ['l', 'L', 'Ł', '', 0], - KeyM: ['m', 'M', '', '', 0], - KeyN: ['n', 'N', '}', '', 0], - KeyO: ['o', 'O', '', '', 0], - KeyP: ['p', 'P', '', '', 0], - KeyQ: ['q', 'Q', '\\', '', 0], - KeyR: ['r', 'R', '', '', 0], - KeyS: ['s', 'S', 'đ', '', 0], - KeyT: ['t', 'T', '', '', 0], - KeyU: ['u', 'U', '', '', 0], - KeyV: ['v', 'V', '@', '', 0], - KeyW: ['w', 'W', '|', '', 0], - KeyX: ['x', 'X', '#', '', 0], - KeyY: ['z', 'Z', '', '', 0], - KeyZ: ['y', 'Y', '', '', 0], - Digit1: ['+', '1', '~', '', 0], - Digit2: ['ě', '2', 'ˇ', '', 0], - Digit3: ['š', '3', '^', '', 0], - Digit4: ['č', '4', '˘', '', 0], - Digit5: ['ř', '5', '°', '', 0], - Digit6: ['ž', '6', '˛', '', 0], - Digit7: ['ý', '7', '`', '', 0], - Digit8: ['á', '8', '˙', '', 0], - Digit9: ['í', '9', '´', '', 0], - Digit0: ['é', '0', '˝', '', 0], + KeyA: ['a', 'A', '', '', 0, 'VK_A'], + KeyB: ['b', 'B', '{', '', 0, 'VK_B'], + KeyC: ['c', 'C', '&', '', 0, 'VK_C'], + KeyD: ['d', 'D', 'Đ', '', 0, 'VK_D'], + KeyE: ['e', 'E', '€', '', 0, 'VK_E'], + KeyF: ['f', 'F', '[', '', 0, 'VK_F'], + KeyG: ['g', 'G', ']', '', 0, 'VK_G'], + KeyH: ['h', 'H', '', '', 0, 'VK_H'], + KeyI: ['i', 'I', '', '', 0, 'VK_I'], + KeyJ: ['j', 'J', '', '', 0, 'VK_J'], + KeyK: ['k', 'K', 'ł', '', 0, 'VK_K'], + KeyL: ['l', 'L', 'Ł', '', 0, 'VK_L'], + KeyM: ['m', 'M', '', '', 0, 'VK_M'], + KeyN: ['n', 'N', '}', '', 0, 'VK_N'], + KeyO: ['o', 'O', '', '', 0, 'VK_O'], + KeyP: ['p', 'P', '', '', 0, 'VK_P'], + KeyQ: ['q', 'Q', '\\', '', 0, 'VK_Q'], + KeyR: ['r', 'R', '', '', 0, 'VK_R'], + KeyS: ['s', 'S', 'đ', '', 0, 'VK_S'], + KeyT: ['t', 'T', '', '', 0, 'VK_T'], + KeyU: ['u', 'U', '', '', 0, 'VK_U'], + KeyV: ['v', 'V', '@', '', 0, 'VK_V'], + KeyW: ['w', 'W', '|', '', 0, 'VK_W'], + KeyX: ['x', 'X', '#', '', 0, 'VK_X'], + KeyY: ['z', 'Z', '', '', 0, 'VK_Z'], + KeyZ: ['y', 'Y', '', '', 0, 'VK_Y'], + Digit1: ['+', '1', '~', '', 0, 'VK_1'], + Digit2: ['ě', '2', 'ˇ', '', 0, 'VK_2'], + Digit3: ['š', '3', '^', '', 0, 'VK_3'], + Digit4: ['č', '4', '˘', '', 0, 'VK_4'], + Digit5: ['ř', '5', '°', '', 0, 'VK_5'], + Digit6: ['ž', '6', '˛', '', 0, 'VK_6'], + Digit7: ['ý', '7', '`', '', 0, 'VK_7'], + Digit8: ['á', '8', '˙', '', 0, 'VK_8'], + Digit9: ['í', '9', '´', '', 0, 'VK_9'], + Digit0: ['é', '0', '˝', '', 0, 'VK_0'], Enter: [], Escape: [], Backspace: [], Tab: [], - Space: [' ', ' ', '', '', 0], - Minus: ['=', '%', '¨', '', 0], - Equal: ['´', 'ˇ', '¸', '', 0], - BracketLeft: ['ú', '/', '÷', '', 0], - BracketRight: [')', '(', '×', '', 0], - Backslash: ['¨', '\'', '¤', '', 0], - Semicolon: ['ů', '"', '$', '', 0], - Quote: ['§', '!', 'ß', '', 0], - Backquote: [';', '°', '', '', 0], - Comma: [',', '?', '<', '', 0], - Period: ['.', ':', '>', '', 0], - Slash: ['-', '_', '*', '', 0], + Space: [' ', ' ', '', '', 0, 'VK_SPACE'], + Minus: ['=', '%', '¨', '', 0, 'VK_OEM_PLUS'], + Equal: ['´', 'ˇ', '¸', '', 0, 'VK_OEM_2'], + BracketLeft: ['ú', '/', '÷', '', 0, 'VK_OEM_4'], + BracketRight: [')', '(', '×', '', 0, 'VK_OEM_6'], + Backslash: ['¨', '\'', '¤', '', 0, 'VK_OEM_5'], + Semicolon: ['ů', '"', '$', '', 0, 'VK_OEM_1'], + Quote: ['§', '!', 'ß', '', 0, 'VK_OEM_7'], + Backquote: [';', '°', '', '', 0, 'VK_OEM_3'], + Comma: [',', '?', '<', '', 0, 'VK_OEM_COMMA'], + Period: ['.', ':', '>', '', 0, 'VK_OEM_PERIOD'], + Slash: ['-', '_', '*', '', 0, 'VK_OEM_MINUS'], CapsLock: [], F1: [], F2: [], @@ -90,10 +90,10 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( ArrowDown: [], ArrowUp: [], NumLock: [], - NumpadDivide: ['/', '/', '', '', 0], - NumpadMultiply: ['*', '*', '', '', 0], - NumpadSubtract: ['-', '-', '', '', 0], - NumpadAdd: ['+', '+', '', '', 0], + NumpadDivide: ['/', '/', '', '', 0, 'VK_DIVIDE'], + NumpadMultiply: ['*', '*', '', '', 0, 'VK_MULTIPLY'], + NumpadSubtract: ['-', '-', '', '', 0, 'VK_SUBTRACT'], + NumpadAdd: ['+', '+', '', '', 0, 'VK_ADD'], NumpadEnter: [], Numpad1: [], Numpad2: [], @@ -106,7 +106,7 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( Numpad9: [], Numpad0: [], NumpadDecimal: [], - IntlBackslash: ['\\', '|', '', '', 0], + IntlBackslash: ['\\', '|', '', '', 0, 'VK_OEM_102'], ContextMenu: [], Power: [], NumpadEqual: [], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de-swiss.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de-swiss.win.ts index 2113280f62a..44d82a33db5 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de-swiss.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de-swiss.win.ts @@ -11,58 +11,58 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( { Sleep: [], WakeUp: [], - KeyA: ['a', 'A', '', '', 0], - KeyB: ['b', 'B', '', '', 0], - KeyC: ['c', 'C', '', '', 0], - KeyD: ['d', 'D', '', '', 0], - KeyE: ['e', 'E', '€', '', 0], - KeyF: ['f', 'F', '', '', 0], - KeyG: ['g', 'G', '', '', 0], - KeyH: ['h', 'H', '', '', 0], - KeyI: ['i', 'I', '', '', 0], - KeyJ: ['j', 'J', '', '', 0], - KeyK: ['k', 'K', '', '', 0], - KeyL: ['l', 'L', '', '', 0], - KeyM: ['m', 'M', '', '', 0], - KeyN: ['n', 'N', '', '', 0], - KeyO: ['o', 'O', '', '', 0], - KeyP: ['p', 'P', '', '', 0], - KeyQ: ['q', 'Q', '', '', 0], - KeyR: ['r', 'R', '', '', 0], - KeyS: ['s', 'S', '', '', 0], - KeyT: ['t', 'T', '', '', 0], - KeyU: ['u', 'U', '', '', 0], - KeyV: ['v', 'V', '', '', 0], - KeyW: ['w', 'W', '', '', 0], - KeyX: ['x', 'X', '', '', 0], - KeyY: ['z', 'Z', '', '', 0], - KeyZ: ['y', 'Y', '', '', 0], - Digit1: ['1', '+', '¦', '', 0], - Digit2: ['2', '"', '@', '', 0], - Digit3: ['3', '*', '#', '', 0], - Digit4: ['4', 'ç', '°', '', 0], - Digit5: ['5', '%', '§', '', 0], - Digit6: ['6', '&', '¬', '', 0], - Digit7: ['7', '/', '|', '', 0], - Digit8: ['8', '(', '¢', '', 0], - Digit9: ['9', ')', '', '', 0], - Digit0: ['0', '=', '', '', 0], + KeyA: ['a', 'A', '', '', 0, 'VK_A'], + KeyB: ['b', 'B', '', '', 0, 'VK_B'], + KeyC: ['c', 'C', '', '', 0, 'VK_C'], + KeyD: ['d', 'D', '', '', 0, 'VK_D'], + KeyE: ['e', 'E', '€', '', 0, 'VK_E'], + KeyF: ['f', 'F', '', '', 0, 'VK_F'], + KeyG: ['g', 'G', '', '', 0, 'VK_G'], + KeyH: ['h', 'H', '', '', 0, 'VK_H'], + KeyI: ['i', 'I', '', '', 0, 'VK_I'], + KeyJ: ['j', 'J', '', '', 0, 'VK_J'], + KeyK: ['k', 'K', '', '', 0, 'VK_K'], + KeyL: ['l', 'L', '', '', 0, 'VK_L'], + KeyM: ['m', 'M', '', '', 0, 'VK_M'], + KeyN: ['n', 'N', '', '', 0, 'VK_N'], + KeyO: ['o', 'O', '', '', 0, 'VK_O'], + KeyP: ['p', 'P', '', '', 0, 'VK_P'], + KeyQ: ['q', 'Q', '', '', 0, 'VK_Q'], + KeyR: ['r', 'R', '', '', 0, 'VK_R'], + KeyS: ['s', 'S', '', '', 0, 'VK_S'], + KeyT: ['t', 'T', '', '', 0, 'VK_T'], + KeyU: ['u', 'U', '', '', 0, 'VK_U'], + KeyV: ['v', 'V', '', '', 0, 'VK_V'], + KeyW: ['w', 'W', '', '', 0, 'VK_W'], + KeyX: ['x', 'X', '', '', 0, 'VK_X'], + KeyY: ['z', 'Z', '', '', 0, 'VK_Z'], + KeyZ: ['y', 'Y', '', '', 0, 'VK_Y'], + Digit1: ['1', '+', '¦', '', 0, 'VK_1'], + Digit2: ['2', '"', '@', '', 0, 'VK_2'], + Digit3: ['3', '*', '#', '', 0, 'VK_3'], + Digit4: ['4', 'ç', '°', '', 0, 'VK_4'], + Digit5: ['5', '%', '§', '', 0, 'VK_5'], + Digit6: ['6', '&', '¬', '', 0, 'VK_6'], + Digit7: ['7', '/', '|', '', 0, 'VK_7'], + Digit8: ['8', '(', '¢', '', 0, 'VK_8'], + Digit9: ['9', ')', '', '', 0, 'VK_9'], + Digit0: ['0', '=', '', '', 0, 'VK_0'], Enter: [], Escape: [], Backspace: [], Tab: [], - Space: [' ', ' ', '', '', 0], - Minus: ['\'', '?', '´', '', 0], - Equal: ['^', '`', '~', '', 0], - BracketLeft: ['ü', 'è', '[', '', 0], - BracketRight: ['¨', '!', ']', '', 0], - Backslash: ['$', '£', '}', '', 0], - Semicolon: ['ö', 'é', '', '', 0], - Quote: ['ä', 'à', '{', '', 0], - Backquote: ['§', '°', '', '', 0], - Comma: [',', ';', '', '', 0], - Period: ['.', ':', '', '', 0], - Slash: ['-', '_', '', '', 0], + Space: [' ', ' ', '', '', 0, 'VK_SPACE'], + Minus: ['\'', '?', '´', '', 0, 'VK_OEM_4'], + Equal: ['^', '`', '~', '', 0, 'VK_OEM_6'], + BracketLeft: ['ü', 'è', '[', '', 0, 'VK_OEM_1'], + BracketRight: ['¨', '!', ']', '', 0, 'VK_OEM_3'], + Backslash: ['$', '£', '}', '', 0, 'VK_OEM_8'], + Semicolon: ['ö', 'é', '', '', 0, 'VK_OEM_7'], + Quote: ['ä', 'à', '{', '', 0, 'VK_OEM_5'], + Backquote: ['§', '°', '', '', 0, 'VK_OEM_2'], + Comma: [',', ';', '', '', 0, 'VK_OEM_COMMA'], + Period: ['.', ':', '', '', 0, 'VK_OEM_PERIOD'], + Slash: ['-', '_', '', '', 0, 'VK_OEM_MINUS'], CapsLock: [], F1: [], F2: [], @@ -90,10 +90,10 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( ArrowDown: [], ArrowUp: [], NumLock: [], - NumpadDivide: ['/', '/', '', '', 0], - NumpadMultiply: ['*', '*', '', '', 0], - NumpadSubtract: ['-', '-', '', '', 0], - NumpadAdd: ['+', '+', '', '', 0], + NumpadDivide: ['/', '/', '', '', 0, 'VK_DIVIDE'], + NumpadMultiply: ['*', '*', '', '', 0, 'VK_MULTIPLY'], + NumpadSubtract: ['-', '-', '', '', 0, 'VK_SUBTRACT'], + NumpadAdd: ['+', '+', '', '', 0, 'VK_ADD'], NumpadEnter: [], Numpad1: [], Numpad2: [], @@ -106,7 +106,7 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( Numpad9: [], Numpad0: [], NumpadDecimal: [], - IntlBackslash: ['<', '>', '\\', '', 0], + IntlBackslash: ['<', '>', '\\', '', 0, 'VK_OEM_102'], ContextMenu: [], Power: [], NumpadEqual: [], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.win.ts index b492d2242ed..5f304096a0e 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.win.ts @@ -11,58 +11,58 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( { Sleep: [], WakeUp: [], - KeyA: ['a', 'A', '', '', 0], - KeyB: ['b', 'B', '', '', 0], - KeyC: ['c', 'C', '', '', 0], - KeyD: ['d', 'D', '', '', 0], - KeyE: ['e', 'E', '€', '', 0], - KeyF: ['f', 'F', '', '', 0], - KeyG: ['g', 'G', '', '', 0], - KeyH: ['h', 'H', '', '', 0], - KeyI: ['i', 'I', '', '', 0], - KeyJ: ['j', 'J', '', '', 0], - KeyK: ['k', 'K', '', '', 0], - KeyL: ['l', 'L', '', '', 0], - KeyM: ['m', 'M', 'µ', '', 0], - KeyN: ['n', 'N', '', '', 0], - KeyO: ['o', 'O', '', '', 0], - KeyP: ['p', 'P', '', '', 0], - KeyQ: ['q', 'Q', '@', '', 0], - KeyR: ['r', 'R', '', '', 0], - KeyS: ['s', 'S', '', '', 0], - KeyT: ['t', 'T', '', '', 0], - KeyU: ['u', 'U', '', '', 0], - KeyV: ['v', 'V', '', '', 0], - KeyW: ['w', 'W', '', '', 0], - KeyX: ['x', 'X', '', '', 0], - KeyY: ['z', 'Z', '', '', 0], - KeyZ: ['y', 'Y', '', '', 0], - Digit1: ['1', '!', '', '', 0], - Digit2: ['2', '"', '²', '', 0], - Digit3: ['3', '§', '³', '', 0], - Digit4: ['4', '$', '', '', 0], - Digit5: ['5', '%', '', '', 0], - Digit6: ['6', '&', '', '', 0], - Digit7: ['7', '/', '{', '', 0], - Digit8: ['8', '(', '[', '', 0], - Digit9: ['9', ')', ']', '', 0], - Digit0: ['0', '=', '}', '', 0], + KeyA: ['a', 'A', '', '', 0, 'VK_A'], + KeyB: ['b', 'B', '', '', 0, 'VK_B'], + KeyC: ['c', 'C', '', '', 0, 'VK_C'], + KeyD: ['d', 'D', '', '', 0, 'VK_D'], + KeyE: ['e', 'E', '€', '', 0, 'VK_E'], + KeyF: ['f', 'F', '', '', 0, 'VK_F'], + KeyG: ['g', 'G', '', '', 0, 'VK_G'], + KeyH: ['h', 'H', '', '', 0, 'VK_H'], + KeyI: ['i', 'I', '', '', 0, 'VK_I'], + KeyJ: ['j', 'J', '', '', 0, 'VK_J'], + KeyK: ['k', 'K', '', '', 0, 'VK_K'], + KeyL: ['l', 'L', '', '', 0, 'VK_L'], + KeyM: ['m', 'M', 'µ', '', 0, 'VK_M'], + KeyN: ['n', 'N', '', '', 0, 'VK_N'], + KeyO: ['o', 'O', '', '', 0, 'VK_O'], + KeyP: ['p', 'P', '', '', 0, 'VK_P'], + KeyQ: ['q', 'Q', '@', '', 0, 'VK_Q'], + KeyR: ['r', 'R', '', '', 0, 'VK_R'], + KeyS: ['s', 'S', '', '', 0, 'VK_S'], + KeyT: ['t', 'T', '', '', 0, 'VK_T'], + KeyU: ['u', 'U', '', '', 0, 'VK_U'], + KeyV: ['v', 'V', '', '', 0, 'VK_V'], + KeyW: ['w', 'W', '', '', 0, 'VK_W'], + KeyX: ['x', 'X', '', '', 0, 'VK_X'], + KeyY: ['z', 'Z', '', '', 0, 'VK_Z'], + KeyZ: ['y', 'Y', '', '', 0, 'VK_Y'], + Digit1: ['1', '!', '', '', 0, 'VK_1'], + Digit2: ['2', '"', '²', '', 0, 'VK_2'], + Digit3: ['3', '§', '³', '', 0, 'VK_3'], + Digit4: ['4', '$', '', '', 0, 'VK_4'], + Digit5: ['5', '%', '', '', 0, 'VK_5'], + Digit6: ['6', '&', '', '', 0, 'VK_6'], + Digit7: ['7', '/', '{', '', 0, 'VK_7'], + Digit8: ['8', '(', '[', '', 0, 'VK_8'], + Digit9: ['9', ')', ']', '', 0, 'VK_9'], + Digit0: ['0', '=', '}', '', 0, 'VK_0'], Enter: [], Escape: [], Backspace: [], Tab: [], - Space: [' ', ' ', '', '', 0], - Minus: ['ß', '?', '\\', 'ẞ', 0], - Equal: ['´', '`', '', '', 0], - BracketLeft: ['ü', 'Ü', '', '', 0], - BracketRight: ['+', '*', '~', '', 0], - Backslash: ['#', '\'', '', '', 0], - Semicolon: ['ö', 'Ö', '', '', 0], - Quote: ['ä', 'Ä', '', '', 0], - Backquote: ['^', '°', '', '', 0], - Comma: [',', ';', '', '', 0], - Period: ['.', ':', '', '', 0], - Slash: ['-', '_', '', '', 0], + Space: [' ', ' ', '', '', 0, 'VK_SPACE'], + Minus: ['ß', '?', '\\', 'ẞ', 0, 'VK_OEM_4'], + Equal: ['´', '`', '', '', 0, 'VK_OEM_6'], + BracketLeft: ['ü', 'Ü', '', '', 0, 'VK_OEM_1'], + BracketRight: ['+', '*', '~', '', 0, 'VK_OEM_PLUS'], + Backslash: ['#', '\'', '', '', 0, 'VK_OEM_2'], + Semicolon: ['ö', 'Ö', '', '', 0, 'VK_OEM_3'], + Quote: ['ä', 'Ä', '', '', 0, 'VK_OEM_7'], + Backquote: ['^', '°', '', '', 0, 'VK_OEM_5'], + Comma: [',', ';', '', '', 0, 'VK_OEM_COMMA'], + Period: ['.', ':', '', '', 0, 'VK_OEM_PERIOD'], + Slash: ['-', '_', '', '', 0, 'VK_OEM_MINUS'], CapsLock: [], F1: [], F2: [], @@ -90,10 +90,10 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( ArrowDown: [], ArrowUp: [], NumLock: [], - NumpadDivide: ['/', '/', '', '', 0], - NumpadMultiply: ['*', '*', '', '', 0], - NumpadSubtract: ['-', '-', '', '', 0], - NumpadAdd: ['+', '+', '', '', 0], + NumpadDivide: ['/', '/', '', '', 0, 'VK_DIVIDE'], + NumpadMultiply: ['*', '*', '', '', 0, 'VK_MULTIPLY'], + NumpadSubtract: ['-', '-', '', '', 0, 'VK_SUBTRACT'], + NumpadAdd: ['+', '+', '', '', 0, 'VK_ADD'], NumpadEnter: [], Numpad1: [], Numpad2: [], @@ -106,7 +106,7 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( Numpad9: [], Numpad0: [], NumpadDecimal: [], - IntlBackslash: ['<', '>', '|', '', 0], + IntlBackslash: ['<', '>', '|', '', 0, 'VK_OEM_102'], ContextMenu: [], Power: [], NumpadEqual: [], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/dk.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/dk.win.ts index 44dce30ed46..f75d21328df 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/dk.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/dk.win.ts @@ -11,58 +11,58 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( { Sleep: [], WakeUp: [], - KeyA: ['a', 'A', '', '', 0], - KeyB: ['b', 'B', '', '', 0], - KeyC: ['c', 'C', '', '', 0], - KeyD: ['d', 'D', '', '', 0], - KeyE: ['e', 'E', '€', '', 0], - KeyF: ['f', 'F', '', '', 0], - KeyG: ['g', 'G', '', '', 0], - KeyH: ['h', 'H', '', '', 0], - KeyI: ['i', 'I', '', '', 0], - KeyJ: ['j', 'J', '', '', 0], - KeyK: ['k', 'K', '', '', 0], - KeyL: ['l', 'L', '', '', 0], - KeyM: ['m', 'M', 'µ', '', 0], - KeyN: ['n', 'N', '', '', 0], - KeyO: ['o', 'O', '', '', 0], - KeyP: ['p', 'P', '', '', 0], - KeyQ: ['q', 'Q', '', '', 0], - KeyR: ['r', 'R', '', '', 0], - KeyS: ['s', 'S', '', '', 0], - KeyT: ['t', 'T', '', '', 0], - KeyU: ['u', 'U', '', '', 0], - KeyV: ['v', 'V', '', '', 0], - KeyW: ['w', 'W', '', '', 0], - KeyX: ['x', 'X', '', '', 0], - KeyY: ['y', 'Y', '', '', 0], - KeyZ: ['z', 'Z', '', '', 0], - Digit1: ['1', '!', '', '', 0], - Digit2: ['2', '"', '@', '', 0], - Digit3: ['3', '#', '£', '', 0], - Digit4: ['4', '¤', '$', '', 0], - Digit5: ['5', '%', '€', '', 0], - Digit6: ['6', '&', '', '', 0], - Digit7: ['7', '/', '{', '', 0], - Digit8: ['8', '(', '[', '', 0], - Digit9: ['9', ')', ']', '', 0], - Digit0: ['0', '=', '}', '', 0], + KeyA: ['a', 'A', '', '', 0, 'VK_A'], + KeyB: ['b', 'B', '', '', 0, 'VK_B'], + KeyC: ['c', 'C', '', '', 0, 'VK_C'], + KeyD: ['d', 'D', '', '', 0, 'VK_D'], + KeyE: ['e', 'E', '€', '', 0, 'VK_E'], + KeyF: ['f', 'F', '', '', 0, 'VK_F'], + KeyG: ['g', 'G', '', '', 0, 'VK_G'], + KeyH: ['h', 'H', '', '', 0, 'VK_H'], + KeyI: ['i', 'I', '', '', 0, 'VK_I'], + KeyJ: ['j', 'J', '', '', 0, 'VK_J'], + KeyK: ['k', 'K', '', '', 0, 'VK_K'], + KeyL: ['l', 'L', '', '', 0, 'VK_L'], + KeyM: ['m', 'M', 'µ', '', 0, 'VK_M'], + KeyN: ['n', 'N', '', '', 0, 'VK_N'], + KeyO: ['o', 'O', '', '', 0, 'VK_O'], + KeyP: ['p', 'P', '', '', 0, 'VK_P'], + KeyQ: ['q', 'Q', '', '', 0, 'VK_Q'], + KeyR: ['r', 'R', '', '', 0, 'VK_R'], + KeyS: ['s', 'S', '', '', 0, 'VK_S'], + KeyT: ['t', 'T', '', '', 0, 'VK_T'], + KeyU: ['u', 'U', '', '', 0, 'VK_U'], + KeyV: ['v', 'V', '', '', 0, 'VK_V'], + KeyW: ['w', 'W', '', '', 0, 'VK_W'], + KeyX: ['x', 'X', '', '', 0, 'VK_X'], + KeyY: ['y', 'Y', '', '', 0, 'VK_Y'], + KeyZ: ['z', 'Z', '', '', 0, 'VK_Z'], + Digit1: ['1', '!', '', '', 0, 'VK_1'], + Digit2: ['2', '"', '@', '', 0, 'VK_2'], + Digit3: ['3', '#', '£', '', 0, 'VK_3'], + Digit4: ['4', '¤', '$', '', 0, 'VK_4'], + Digit5: ['5', '%', '€', '', 0, 'VK_5'], + Digit6: ['6', '&', '', '', 0, 'VK_6'], + Digit7: ['7', '/', '{', '', 0, 'VK_7'], + Digit8: ['8', '(', '[', '', 0, 'VK_8'], + Digit9: ['9', ')', ']', '', 0, 'VK_9'], + Digit0: ['0', '=', '}', '', 0, 'VK_0'], Enter: [], Escape: [], Backspace: [], Tab: [], - Space: [' ', ' ', '', '', 0], - Minus: ['+', '?', '', '', 0], - Equal: ['´', '`', '|', '', 0], - BracketLeft: ['å', 'Å', '', '', 0], - BracketRight: ['¨', '^', '~', '', 0], - Backslash: ['\'', '*', '', '', 0], - Semicolon: ['æ', 'Æ', '', '', 0], - Quote: ['ø', 'Ø', '', '', 0], - Backquote: ['½', '§', '', '', 0], - Comma: [',', ';', '', '', 0], - Period: ['.', ':', '', '', 0], - Slash: ['-', '_', '', '', 0], + Space: [' ', ' ', '', '', 0, 'VK_SPACE'], + Minus: ['+', '?', '', '', 0, 'VK_OEM_PLUS'], + Equal: ['´', '`', '|', '', 0, 'VK_OEM_4'], + BracketLeft: ['å', 'Å', '', '', 0, 'VK_OEM_6'], + BracketRight: ['¨', '^', '~', '', 0, 'VK_OEM_1'], + Backslash: ['\'', '*', '', '', 0, 'VK_OEM_2'], + Semicolon: ['æ', 'Æ', '', '', 0, 'VK_OEM_3'], + Quote: ['ø', 'Ø', '', '', 0, 'VK_OEM_7'], + Backquote: ['½', '§', '', '', 0, 'VK_OEM_5'], + Comma: [',', ';', '', '', 0, 'VK_OEM_COMMA'], + Period: ['.', ':', '', '', 0, 'VK_OEM_PERIOD'], + Slash: ['-', '_', '', '', 0, 'VK_OEM_MINUS'], CapsLock: [], F1: [], F2: [], @@ -90,10 +90,10 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( ArrowDown: [], ArrowUp: [], NumLock: [], - NumpadDivide: ['/', '/', '', '', 0], - NumpadMultiply: ['*', '*', '', '', 0], - NumpadSubtract: ['-', '-', '', '', 0], - NumpadAdd: ['+', '+', '', '', 0], + NumpadDivide: ['/', '/', '', '', 0, 'VK_DIVIDE'], + NumpadMultiply: ['*', '*', '', '', 0, 'VK_MULTIPLY'], + NumpadSubtract: ['-', '-', '', '', 0, 'VK_SUBTRACT'], + NumpadAdd: ['+', '+', '', '', 0, 'VK_ADD'], NumpadEnter: [], Numpad1: [], Numpad2: [], @@ -106,7 +106,7 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( Numpad9: [], Numpad0: [], NumpadDecimal: [], - IntlBackslash: ['<', '>', '\\', '', 0], + IntlBackslash: ['<', '>', '\\', '', 0, 'VK_OEM_102'], ContextMenu: [], Power: [], NumpadEqual: [], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-belgian.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-belgian.win.ts index 03f8a5b1169..19b8f554303 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-belgian.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-belgian.win.ts @@ -11,58 +11,58 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( { Sleep: [], WakeUp: [], - KeyA: ['q', 'Q', '', '', 0], - KeyB: ['b', 'B', '', '', 0], - KeyC: ['c', 'C', '', '', 0], - KeyD: ['d', 'D', '', '', 0], - KeyE: ['e', 'E', '€', '', 0], - KeyF: ['f', 'F', '', '', 0], - KeyG: ['g', 'G', '', '', 0], - KeyH: ['h', 'H', '', '', 0], - KeyI: ['i', 'I', '', '', 0], - KeyJ: ['j', 'J', '', '', 0], - KeyK: ['k', 'K', '', '', 0], - KeyL: ['l', 'L', '', '', 0], - KeyM: [',', '?', '', '', 0], - KeyN: ['n', 'N', '', '', 0], - KeyO: ['o', 'O', '', '', 0], - KeyP: ['p', 'P', '', '', 0], - KeyQ: ['a', 'A', '', '', 0], - KeyR: ['r', 'R', '', '', 0], - KeyS: ['s', 'S', '', '', 0], - KeyT: ['t', 'T', '', '', 0], - KeyU: ['u', 'U', '', '', 0], - KeyV: ['v', 'V', '', '', 0], - KeyW: ['z', 'Z', '', '', 0], - KeyX: ['x', 'X', '', '', 0], - KeyY: ['y', 'Y', '', '', 0], - KeyZ: ['w', 'W', '', '', 0], - Digit1: ['&', '1', '|', '', 0], - Digit2: ['é', '2', '@', '', 0], - Digit3: ['"', '3', '#', '', 0], - Digit4: ['\'', '4', '{', '', 0], - Digit5: ['(', '5', '[', '', 0], - Digit6: ['§', '6', '^', '', 0], - Digit7: ['è', '7', '', '', 0], - Digit8: ['!', '8', '', '', 0], - Digit9: ['ç', '9', '{', '', 0], - Digit0: ['à', '0', '}', '', 0], + KeyA: ['q', 'Q', '', '', 0, 'VK_Q'], + KeyB: ['b', 'B', '', '', 0, 'VK_B'], + KeyC: ['c', 'C', '', '', 0, 'VK_C'], + KeyD: ['d', 'D', '', '', 0, 'VK_D'], + KeyE: ['e', 'E', '€', '', 0, 'VK_E'], + KeyF: ['f', 'F', '', '', 0, 'VK_F'], + KeyG: ['g', 'G', '', '', 0, 'VK_G'], + KeyH: ['h', 'H', '', '', 0, 'VK_H'], + KeyI: ['i', 'I', '', '', 0, 'VK_I'], + KeyJ: ['j', 'J', '', '', 0, 'VK_J'], + KeyK: ['k', 'K', '', '', 0, 'VK_K'], + KeyL: ['l', 'L', '', '', 0, 'VK_L'], + KeyM: [',', '?', '', '', 0, 'VK_OEM_COMMA'], + KeyN: ['n', 'N', '', '', 0, 'VK_N'], + KeyO: ['o', 'O', '', '', 0, 'VK_O'], + KeyP: ['p', 'P', '', '', 0, 'VK_P'], + KeyQ: ['a', 'A', '', '', 0, 'VK_A'], + KeyR: ['r', 'R', '', '', 0, 'VK_R'], + KeyS: ['s', 'S', '', '', 0, 'VK_S'], + KeyT: ['t', 'T', '', '', 0, 'VK_T'], + KeyU: ['u', 'U', '', '', 0, 'VK_U'], + KeyV: ['v', 'V', '', '', 0, 'VK_V'], + KeyW: ['z', 'Z', '', '', 0, 'VK_Z'], + KeyX: ['x', 'X', '', '', 0, 'VK_X'], + KeyY: ['y', 'Y', '', '', 0, 'VK_Y'], + KeyZ: ['w', 'W', '', '', 0, 'VK_W'], + Digit1: ['&', '1', '|', '', 0, 'VK_1'], + Digit2: ['é', '2', '@', '', 0, 'VK_2'], + Digit3: ['"', '3', '#', '', 0, 'VK_3'], + Digit4: ['\'', '4', '{', '', 0, 'VK_4'], + Digit5: ['(', '5', '[', '', 0, 'VK_5'], + Digit6: ['§', '6', '^', '', 0, 'VK_6'], + Digit7: ['è', '7', '', '', 0, 'VK_7'], + Digit8: ['!', '8', '', '', 0, 'VK_8'], + Digit9: ['ç', '9', '{', '', 0, 'VK_9'], + Digit0: ['à', '0', '}', '', 0, 'VK_0'], Enter: [], Escape: [], Backspace: [], Tab: [], - Space: [' ', ' ', '', '', 0], - Minus: [')', '°', '', '', 0], - Equal: ['-', '_', '', '', 0], - BracketLeft: ['^', '¨', '[', '', 0], - BracketRight: ['$', '*', ']', '', 0], - Backslash: ['µ', '£', '`', '`', 0], - Semicolon: ['m', 'M', '', '', 0], - Quote: ['ù', '%', '´', '´', 0], - Backquote: ['²', '³', '', '', 0], - Comma: [';', '.', '', '', 0], - Period: [':', '/', '', '', 0], - Slash: ['=', '+', '~', '~', 0], + Space: [' ', ' ', '', '', 0, 'VK_SPACE'], + Minus: [')', '°', '', '', 0, 'VK_OEM_4'], + Equal: ['-', '_', '', '', 0, 'VK_OEM_MINUS'], + BracketLeft: ['^', '¨', '[', '', 0, 'VK_OEM_6'], + BracketRight: ['$', '*', ']', '', 0, 'VK_OEM_1'], + Backslash: ['µ', '£', '`', '`', 0, 'VK_OEM_5'], + Semicolon: ['m', 'M', '', '', 0, 'VK_M'], + Quote: ['ù', '%', '´', '´', 0, 'VK_OEM_3'], + Backquote: ['²', '³', '', '', 0, 'VK_OEM_7'], + Comma: [';', '.', '', '', 0, 'VK_OEM_PERIOD'], + Period: [':', '/', '', '', 0, 'VK_OEM_2'], + Slash: ['=', '+', '~', '~', 0, 'VK_OEM_PLUS'], CapsLock: [], F1: [], F2: [], @@ -90,10 +90,10 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( ArrowDown: [], ArrowUp: [], NumLock: [], - NumpadDivide: ['/', '/', '', '', 0], - NumpadMultiply: ['*', '*', '', '', 0], - NumpadSubtract: ['-', '-', '', '', 0], - NumpadAdd: ['+', '+', '', '', 0], + NumpadDivide: ['/', '/', '', '', 0, 'VK_DIVIDE'], + NumpadMultiply: ['*', '*', '', '', 0, 'VK_MULTIPLY'], + NumpadSubtract: ['-', '-', '', '', 0, 'VK_SUBTRACT'], + NumpadAdd: ['+', '+', '', '', 0, 'VK_ADD'], NumpadEnter: [], Numpad1: [], Numpad2: [], @@ -106,7 +106,7 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( Numpad9: [], Numpad0: [], NumpadDecimal: [], - IntlBackslash: ['<', '>', '\\', '', 0], + IntlBackslash: ['<', '>', '\\', '', 0, 'VK_OEM_102'], ContextMenu: [], Power: [], NumpadEqual: [], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-in.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-in.win.ts index 301b52455b0..7cd020c8087 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-in.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-in.win.ts @@ -11,58 +11,58 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( { Sleep: [], WakeUp: [], - KeyA: ['a', 'A', '─ü', '─Ç', 0], - KeyB: ['b', 'B', '', '', 0], - KeyC: ['c', 'C', '', '', 0], - KeyD: ['d', 'D', 'ß╕ì', 'ß╕î', 0], - KeyE: ['e', 'E', '─ô', '─Æ', 0], - KeyF: ['f', 'F', '', '', 0], - KeyG: ['g', 'G', 'ß╣à', 'ß╣ä', 0], - KeyH: ['h', 'H', 'ß╕Ñ', 'ß╕ñ', 0], - KeyI: ['i', 'I', '─½', '─¬', 0], - KeyJ: ['j', 'J', '', '', 0], - KeyK: ['k', 'K', '', '', 0], - KeyL: ['l', 'L', 'l╠Ñ', 'L╠Ñ', 0], - KeyM: ['m', 'M', 'ß╣ü', 'ß╣Ç', 0], - KeyN: ['n', 'N', 'ß╣ç', 'ß╣å', 0], - KeyO: ['o', 'O', '┼ì', '┼î', 0], - KeyP: ['p', 'P', '', '', 0], - KeyQ: ['q', 'Q', '├ª', '├å', 0], - KeyR: ['r', 'R', 'r╠Ñ', 'R╠Ñ', 0], - KeyS: ['s', 'S', '┼¢', '┼Ü', 0], - KeyT: ['t', 'T', 'ß╣¡', 'ß╣¼', 0], - KeyU: ['u', 'U', '┼½', '┼¬', 0], - KeyV: ['v', 'V', '', '', 0], - KeyW: ['w', 'W', '', '', 0], - KeyX: ['x', 'X', 'ß╣ú', 'ß╣ó', 0], - KeyY: ['y', 'Y', '├▒', '├æ', 0], - KeyZ: ['z', 'Z', '', '', 0], - Digit1: ['1', '!', '', '', 0], - Digit2: ['2', '@', '', '', 0], - Digit3: ['3', '#', '', '', 0], - Digit4: ['4', '$', 'Γé╣', '', 0], - Digit5: ['5', '%', '', '', 0], - Digit6: ['6', '^', '', '╦å', 0], - Digit7: ['7', '&', '', '', 0], - Digit8: ['8', '*', '', '', 0], - Digit9: ['9', '(', '', '╦ÿ', 0], - Digit0: ['0', ')', '', '', 0], + KeyA: ['a', 'A', 'ā', 'Ā', 0, 'VK_A'], + KeyB: ['b', 'B', '', '', 0, 'VK_B'], + KeyC: ['c', 'C', '', '', 0, 'VK_C'], + KeyD: ['d', 'D', 'ḍ', 'Ḍ', 0, 'VK_D'], + KeyE: ['e', 'E', 'ē', 'Ē', 0, 'VK_E'], + KeyF: ['f', 'F', '', '', 0, 'VK_F'], + KeyG: ['g', 'G', 'ṅ', 'Ṅ', 0, 'VK_G'], + KeyH: ['h', 'H', 'ḥ', 'Ḥ', 0, 'VK_H'], + KeyI: ['i', 'I', 'ī', 'Ī', 0, 'VK_I'], + KeyJ: ['j', 'J', '', '', 0, 'VK_J'], + KeyK: ['k', 'K', '', '', 0, 'VK_K'], + KeyL: ['l', 'L', 'l̥', 'L̥', 0, 'VK_L'], + KeyM: ['m', 'M', 'ṁ', 'Ṁ', 0, 'VK_M'], + KeyN: ['n', 'N', 'ṇ', 'Ṇ', 0, 'VK_N'], + KeyO: ['o', 'O', 'ō', 'Ō', 0, 'VK_O'], + KeyP: ['p', 'P', '', '', 0, 'VK_P'], + KeyQ: ['q', 'Q', 'æ', 'Æ', 0, 'VK_Q'], + KeyR: ['r', 'R', 'r̥', 'R̥', 0, 'VK_R'], + KeyS: ['s', 'S', 'ś', 'Ś', 0, 'VK_S'], + KeyT: ['t', 'T', 'ṭ', 'Ṭ', 0, 'VK_T'], + KeyU: ['u', 'U', 'ū', 'Ū', 0, 'VK_U'], + KeyV: ['v', 'V', '', '', 0, 'VK_V'], + KeyW: ['w', 'W', '', '', 0, 'VK_W'], + KeyX: ['x', 'X', 'ṣ', 'Ṣ', 0, 'VK_X'], + KeyY: ['y', 'Y', 'ñ', 'Ñ', 0, 'VK_Y'], + KeyZ: ['z', 'Z', '', '', 0, 'VK_Z'], + Digit1: ['1', '!', '', '', 0, 'VK_1'], + Digit2: ['2', '@', '', '', 0, 'VK_2'], + Digit3: ['3', '#', '', '', 0, 'VK_3'], + Digit4: ['4', '$', '₹', '', 0, 'VK_4'], + Digit5: ['5', '%', '', '', 0, 'VK_5'], + Digit6: ['6', '^', '', 'ˆ', 0, 'VK_6'], + Digit7: ['7', '&', '', '', 0, 'VK_7'], + Digit8: ['8', '*', '', '', 0, 'VK_8'], + Digit9: ['9', '(', '', '˘', 0, 'VK_9'], + Digit0: ['0', ')', '', '', 0, 'VK_0'], Enter: [], Escape: [], Backspace: [], Tab: [], - Space: [' ', ' ', '', '', 0], - Minus: ['-', '_', '-', '╦ì', 0], - Equal: ['=', '+', '', '', 0], - BracketLeft: ['[', '{', '', '', 0], - BracketRight: [']', '}', '', '', 0], - Backslash: ['\\', '|', '', '', 0], - Semicolon: [';', ':', '', '', 0], - Quote: ['\'', '"', '', '', 0], - Backquote: ['`', '~', '', '~', 0], - Comma: [',', '<', ',', '<', 0], - Period: ['.', '>', '.', '', 0], - Slash: ['/', '?', '', '', 0], + Space: [' ', ' ', '', '', 0, 'VK_SPACE'], + Minus: ['-', '_', '-', 'ˍ', 0, 'VK_OEM_MINUS'], + Equal: ['=', '+', '', '', 0, 'VK_OEM_PLUS'], + BracketLeft: ['[', '{', '', '', 0, 'VK_OEM_4'], + BracketRight: [']', '}', '', '', 0, 'VK_OEM_6'], + Backslash: ['\\', '|', '', '', 0, 'VK_OEM_5'], + Semicolon: [';', ':', '', '', 0, 'VK_OEM_1'], + Quote: ['\'', '"', '', '', 0, 'VK_OEM_7'], + Backquote: ['`', '~', '', '~', 0, 'VK_OEM_3'], + Comma: [',', '<', ',', '<', 0, 'VK_OEM_COMMA'], + Period: ['.', '>', '.', '', 0, 'VK_OEM_PERIOD'], + Slash: ['/', '?', '', '', 0, 'VK_OEM_2'], CapsLock: [], F1: [], F2: [], @@ -90,10 +90,10 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( ArrowDown: [], ArrowUp: [], NumLock: [], - NumpadDivide: ['/', '/', '', '', 0], - NumpadMultiply: ['*', '*', '', '', 0], - NumpadSubtract: ['-', '-', '', '', 0], - NumpadAdd: ['+', '+', '', '', 0], + NumpadDivide: ['/', '/', '', '', 0, 'VK_DIVIDE'], + NumpadMultiply: ['*', '*', '', '', 0, 'VK_MULTIPLY'], + NumpadSubtract: ['-', '-', '', '', 0, 'VK_SUBTRACT'], + NumpadAdd: ['+', '+', '', '', 0, 'VK_ADD'], NumpadEnter: [], Numpad1: [], Numpad2: [], @@ -106,7 +106,7 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( Numpad9: [], Numpad0: [], NumpadDecimal: [], - IntlBackslash: ['\\', '|', '', '', 0], + IntlBackslash: ['\\', '|', '', '', 0, 'VK_OEM_102'], ContextMenu: [], Power: [], NumpadEqual: [], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-intl.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-intl.win.ts index 7b726906de0..019d09d7f67 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-intl.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-intl.win.ts @@ -11,58 +11,58 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( { Sleep: [], WakeUp: [], - KeyA: ['a', 'A', 'á', 'Á', 0], - KeyB: ['b', 'B', '', '', 0], - KeyC: ['c', 'C', '©', '¢', 0], - KeyD: ['d', 'D', 'ð', 'Ð', 0], - KeyE: ['e', 'E', 'é', 'É', 0], - KeyF: ['f', 'F', '', '', 0], - KeyG: ['g', 'G', '', '', 0], - KeyH: ['h', 'H', '', '', 0], - KeyI: ['i', 'I', 'í', 'Í', 0], - KeyJ: ['j', 'J', '', '', 0], - KeyK: ['k', 'K', '', '', 0], - KeyL: ['l', 'L', 'ø', 'Ø', 0], - KeyM: ['m', 'M', 'µ', '', 0], - KeyN: ['n', 'N', 'ñ', 'Ñ', 0], - KeyO: ['o', 'O', 'ó', 'Ó', 0], - KeyP: ['p', 'P', 'ö', 'Ö', 0], - KeyQ: ['q', 'Q', 'ä', 'Ä', 0], - KeyR: ['r', 'R', '®', '', 0], - KeyS: ['s', 'S', 'ß', '§', 0], - KeyT: ['t', 'T', 'þ', 'Þ', 0], - KeyU: ['u', 'U', 'ú', 'Ú', 0], - KeyV: ['v', 'V', '', '', 0], - KeyW: ['w', 'W', 'å', 'Å', 0], - KeyX: ['x', 'X', '', '', 0], - KeyY: ['y', 'Y', 'ü', 'Ü', 0], - KeyZ: ['z', 'Z', 'æ', 'Æ', 0], - Digit1: ['1', '!', '¡', '¹', 0], - Digit2: ['2', '@', '²', '', 0], - Digit3: ['3', '#', '³', '', 0], - Digit4: ['4', '$', '¤', '£', 0], - Digit5: ['5', '%', '€', '', 0], - Digit6: ['6', '^', '¼', '', 0], - Digit7: ['7', '&', '½', '', 0], - Digit8: ['8', '*', '¾', '', 0], - Digit9: ['9', '(', '‘', '', 0], - Digit0: ['0', ')', '’', '', 0], + KeyA: ['a', 'A', 'á', 'Á', 0, 'VK_A'], + KeyB: ['b', 'B', '', '', 0, 'VK_B'], + KeyC: ['c', 'C', '©', '¢', 0, 'VK_C'], + KeyD: ['d', 'D', 'ð', 'Ð', 0, 'VK_D'], + KeyE: ['e', 'E', 'é', 'É', 0, 'VK_E'], + KeyF: ['f', 'F', '', '', 0, 'VK_F'], + KeyG: ['g', 'G', '', '', 0, 'VK_G'], + KeyH: ['h', 'H', '', '', 0, 'VK_H'], + KeyI: ['i', 'I', 'í', 'Í', 0, 'VK_I'], + KeyJ: ['j', 'J', '', '', 0, 'VK_J'], + KeyK: ['k', 'K', '', '', 0, 'VK_K'], + KeyL: ['l', 'L', 'ø', 'Ø', 0, 'VK_L'], + KeyM: ['m', 'M', 'µ', '', 0, 'VK_M'], + KeyN: ['n', 'N', 'ñ', 'Ñ', 0, 'VK_N'], + KeyO: ['o', 'O', 'ó', 'Ó', 0, 'VK_O'], + KeyP: ['p', 'P', 'ö', 'Ö', 0, 'VK_P'], + KeyQ: ['q', 'Q', 'ä', 'Ä', 0, 'VK_Q'], + KeyR: ['r', 'R', '®', '', 0, 'VK_R'], + KeyS: ['s', 'S', 'ß', '§', 0, 'VK_S'], + KeyT: ['t', 'T', 'þ', 'Þ', 0, 'VK_T'], + KeyU: ['u', 'U', 'ú', 'Ú', 0, 'VK_U'], + KeyV: ['v', 'V', '', '', 0, 'VK_V'], + KeyW: ['w', 'W', 'å', 'Å', 0, 'VK_W'], + KeyX: ['x', 'X', '', '', 0, 'VK_X'], + KeyY: ['y', 'Y', 'ü', 'Ü', 0, 'VK_Y'], + KeyZ: ['z', 'Z', 'æ', 'Æ', 0, 'VK_Z'], + Digit1: ['1', '!', '¡', '¹', 0, 'VK_1'], + Digit2: ['2', '@', '²', '', 0, 'VK_2'], + Digit3: ['3', '#', '³', '', 0, 'VK_3'], + Digit4: ['4', '$', '¤', '£', 0, 'VK_4'], + Digit5: ['5', '%', '€', '', 0, 'VK_5'], + Digit6: ['6', '^', '¼', '', 0, 'VK_6'], + Digit7: ['7', '&', '½', '', 0, 'VK_7'], + Digit8: ['8', '*', '¾', '', 0, 'VK_8'], + Digit9: ['9', '(', '‘', '', 0, 'VK_9'], + Digit0: ['0', ')', '’', '', 0, 'VK_0'], Enter: [], Escape: [], Backspace: [], Tab: [], - Space: [' ', ' ', '', '', 0], - Minus: ['-', '_', '¥', '', 0], - Equal: ['=', '+', '×', '÷', 0], - BracketLeft: ['[', '{', '«', '', 0], - BracketRight: [']', '}', '»', '', 0], - Backslash: ['\\', '|', '¬', '¦', 0], - Semicolon: [';', ':', '¶', '°', 0], - Quote: ['\'', '"', '´', '¨', 0], - Backquote: ['`', '~', '', '', 0], - Comma: [',', '<', 'ç', 'Ç', 0], - Period: ['.', '>', '', '', 0], - Slash: ['/', '?', '¿', '', 0], + Space: [' ', ' ', '', '', 0, 'VK_SPACE'], + Minus: ['-', '_', '¥', '', 0, 'VK_OEM_MINUS'], + Equal: ['=', '+', '×', '÷', 0, 'VK_OEM_PLUS'], + BracketLeft: ['[', '{', '«', '', 0, 'VK_OEM_4'], + BracketRight: [']', '}', '»', '', 0, 'VK_OEM_6'], + Backslash: ['\\', '|', '¬', '¦', 0, 'VK_OEM_5'], + Semicolon: [';', ':', '¶', '°', 0, 'VK_OEM_1'], + Quote: ['\'', '"', '´', '¨', 0, 'VK_OEM_7'], + Backquote: ['`', '~', '', '', 0, 'VK_OEM_3'], + Comma: [',', '<', 'ç', 'Ç', 0, 'VK_OEM_COMMA'], + Period: ['.', '>', '', '', 0, 'VK_OEM_PERIOD'], + Slash: ['/', '?', '¿', '', 0, 'VK_OEM_2'], CapsLock: [], F1: [], F2: [], @@ -90,10 +90,10 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( ArrowDown: [], ArrowUp: [], NumLock: [], - NumpadDivide: ['/', '/', '', '', 0], - NumpadMultiply: ['*', '*', '', '', 0], - NumpadSubtract: ['-', '-', '', '', 0], - NumpadAdd: ['+', '+', '', '', 0], + NumpadDivide: ['/', '/', '', '', 0, 'VK_DIVIDE'], + NumpadMultiply: ['*', '*', '', '', 0, 'VK_MULTIPLY'], + NumpadSubtract: ['-', '-', '', '', 0, 'VK_SUBTRACT'], + NumpadAdd: ['+', '+', '', '', 0, 'VK_ADD'], NumpadEnter: [], Numpad1: [], Numpad2: [], @@ -106,7 +106,7 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( Numpad9: [], Numpad0: [], NumpadDecimal: [], - IntlBackslash: ['\\', '|', '', '', 0], + IntlBackslash: ['\\', '|', '', '', 0, 'VK_OEM_102'], ContextMenu: [], Power: [], NumpadEqual: [], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-uk.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-uk.win.ts index e2f80157e5b..f8b26f6493a 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-uk.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-uk.win.ts @@ -11,58 +11,58 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( { Sleep: [], WakeUp: [], - KeyA: ['a', 'A', 'á', 'Á', 0], - KeyB: ['b', 'B', '', '', 0], - KeyC: ['c', 'C', '', '', 0], - KeyD: ['d', 'D', '', '', 0], - KeyE: ['e', 'E', 'é', 'É', 0], - KeyF: ['f', 'F', '', '', 0], - KeyG: ['g', 'G', '', '', 0], - KeyH: ['h', 'H', '', '', 0], - KeyI: ['i', 'I', 'í', 'Í', 0], - KeyJ: ['j', 'J', '', '', 0], - KeyK: ['k', 'K', '', '', 0], - KeyL: ['l', 'L', '', '', 0], - KeyM: ['m', 'M', '', '', 0], - KeyN: ['n', 'N', '', '', 0], - KeyO: ['o', 'O', 'ó', 'Ó', 0], - KeyP: ['p', 'P', '', '', 0], - KeyQ: ['q', 'Q', '', '', 0], - KeyR: ['r', 'R', '', '', 0], - KeyS: ['s', 'S', '', '', 0], - KeyT: ['t', 'T', '', '', 0], - KeyU: ['u', 'U', 'ú', 'Ú', 0], - KeyV: ['v', 'V', '', '', 0], - KeyW: ['w', 'W', '', '', 0], - KeyX: ['x', 'X', '', '', 0], - KeyY: ['y', 'Y', '', '', 0], - KeyZ: ['z', 'Z', '', '', 0], - Digit1: ['1', '!', '', '', 0], - Digit2: ['2', '"', '', '', 0], - Digit3: ['3', '£', '', '', 0], - Digit4: ['4', '$', '€', '', 0], - Digit5: ['5', '%', '', '', 0], - Digit6: ['6', '^', '', '', 0], - Digit7: ['7', '&', '', '', 0], - Digit8: ['8', '*', '', '', 0], - Digit9: ['9', '(', '', '', 0], - Digit0: ['0', ')', '', '', 0], + KeyA: ['a', 'A', 'á', 'Á', 0, 'VK_A'], + KeyB: ['b', 'B', '', '', 0, 'VK_B'], + KeyC: ['c', 'C', '', '', 0, 'VK_C'], + KeyD: ['d', 'D', '', '', 0, 'VK_D'], + KeyE: ['e', 'E', 'é', 'É', 0, 'VK_E'], + KeyF: ['f', 'F', '', '', 0, 'VK_F'], + KeyG: ['g', 'G', '', '', 0, 'VK_G'], + KeyH: ['h', 'H', '', '', 0, 'VK_H'], + KeyI: ['i', 'I', 'í', 'Í', 0, 'VK_I'], + KeyJ: ['j', 'J', '', '', 0, 'VK_J'], + KeyK: ['k', 'K', '', '', 0, 'VK_K'], + KeyL: ['l', 'L', '', '', 0, 'VK_L'], + KeyM: ['m', 'M', '', '', 0, 'VK_M'], + KeyN: ['n', 'N', '', '', 0, 'VK_N'], + KeyO: ['o', 'O', 'ó', 'Ó', 0, 'VK_O'], + KeyP: ['p', 'P', '', '', 0, 'VK_P'], + KeyQ: ['q', 'Q', '', '', 0, 'VK_Q'], + KeyR: ['r', 'R', '', '', 0, 'VK_R'], + KeyS: ['s', 'S', '', '', 0, 'VK_S'], + KeyT: ['t', 'T', '', '', 0, 'VK_T'], + KeyU: ['u', 'U', 'ú', 'Ú', 0, 'VK_U'], + KeyV: ['v', 'V', '', '', 0, 'VK_V'], + KeyW: ['w', 'W', '', '', 0, 'VK_W'], + KeyX: ['x', 'X', '', '', 0, 'VK_X'], + KeyY: ['y', 'Y', '', '', 0, 'VK_Y'], + KeyZ: ['z', 'Z', '', '', 0, 'VK_Z'], + Digit1: ['1', '!', '', '', 0, 'VK_1'], + Digit2: ['2', '"', '', '', 0, 'VK_2'], + Digit3: ['3', '£', '', '', 0, 'VK_3'], + Digit4: ['4', '$', '€', '', 0, 'VK_4'], + Digit5: ['5', '%', '', '', 0, 'VK_5'], + Digit6: ['6', '^', '', '', 0, 'VK_6'], + Digit7: ['7', '&', '', '', 0, 'VK_7'], + Digit8: ['8', '*', '', '', 0, 'VK_8'], + Digit9: ['9', '(', '', '', 0, 'VK_9'], + Digit0: ['0', ')', '', '', 0, 'VK_0'], Enter: [], Escape: [], Backspace: [], Tab: [], - Space: [' ', ' ', '', '', 0], - Minus: ['-', '_', '', '', 0], - Equal: ['=', '+', '', '', 0], - BracketLeft: ['[', '{', '', '', 0], - BracketRight: [']', '}', '', '', 0], - Backslash: ['#', '~', '\\', '|', 0], - Semicolon: [';', ':', '', '', 0], - Quote: ['\'', '@', '', '', 0], - Backquote: ['`', '¬', '¦', '', 0], - Comma: [',', '<', '', '', 0], - Period: ['.', '>', '', '', 0], - Slash: ['/', '?', '', '', 0], + Space: [' ', ' ', '', '', 0, 'VK_SPACE'], + Minus: ['-', '_', '', '', 0, 'VK_OEM_MINUS'], + Equal: ['=', '+', '', '', 0, 'VK_OEM_PLUS'], + BracketLeft: ['[', '{', '', '', 0, 'VK_OEM_4'], + BracketRight: [']', '}', '', '', 0, 'VK_OEM_6'], + Backslash: ['#', '~', '\\', '|', 0, 'VK_OEM_7'], + Semicolon: [';', ':', '', '', 0, 'VK_OEM_1'], + Quote: ['\'', '@', '', '', 0, 'VK_OEM_3'], + Backquote: ['`', '¬', '¦', '', 0, 'VK_OEM_8'], + Comma: [',', '<', '', '', 0, 'VK_OEM_COMMA'], + Period: ['.', '>', '', '', 0, 'VK_OEM_PERIOD'], + Slash: ['/', '?', '', '', 0, 'VK_OEM_2'], CapsLock: [], F1: [], F2: [], @@ -90,10 +90,10 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( ArrowDown: [], ArrowUp: [], NumLock: [], - NumpadDivide: ['/', '/', '', '', 0], - NumpadMultiply: ['*', '*', '', '', 0], - NumpadSubtract: ['-', '-', '', '', 0], - NumpadAdd: ['+', '+', '', '', 0], + NumpadDivide: ['/', '/', '', '', 0, 'VK_DIVIDE'], + NumpadMultiply: ['*', '*', '', '', 0, 'VK_MULTIPLY'], + NumpadSubtract: ['-', '-', '', '', 0, 'VK_SUBTRACT'], + NumpadAdd: ['+', '+', '', '', 0, 'VK_ADD'], NumpadEnter: [], Numpad1: [], Numpad2: [], @@ -106,7 +106,7 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( Numpad9: [], Numpad0: [], NumpadDecimal: [], - IntlBackslash: ['\\', '|', '', '', 0], + IntlBackslash: ['\\', '|', '', '', 0, 'VK_OEM_5'], ContextMenu: [], Power: [], NumpadEqual: [], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.win.ts index 895c21d30df..cfb7709c627 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.win.ts @@ -16,58 +16,58 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( { Sleep: [], WakeUp: [], - KeyA: ['a', 'A', '', '', 0], - KeyB: ['b', 'B', '', '', 0], - KeyC: ['c', 'C', '', '', 0], - KeyD: ['d', 'D', '', '', 0], - KeyE: ['e', 'E', '', '', 0], - KeyF: ['f', 'F', '', '', 0], - KeyG: ['g', 'G', '', '', 0], - KeyH: ['h', 'H', '', '', 0], - KeyI: ['i', 'I', '', '', 0], - KeyJ: ['j', 'J', '', '', 0], - KeyK: ['k', 'K', '', '', 0], - KeyL: ['l', 'L', '', '', 0], - KeyM: ['m', 'M', '', '', 0], - KeyN: ['n', 'N', '', '', 0], - KeyO: ['o', 'O', '', '', 0], - KeyP: ['p', 'P', '', '', 0], - KeyQ: ['q', 'Q', '', '', 0], - KeyR: ['r', 'R', '', '', 0], - KeyS: ['s', 'S', '', '', 0], - KeyT: ['t', 'T', '', '', 0], - KeyU: ['u', 'U', '', '', 0], - KeyV: ['v', 'V', '', '', 0], - KeyW: ['w', 'W', '', '', 0], - KeyX: ['x', 'X', '', '', 0], - KeyY: ['y', 'Y', '', '', 0], - KeyZ: ['z', 'Z', '', '', 0], - Digit1: ['1', '!', '', '', 0], - Digit2: ['2', '@', '', '', 0], - Digit3: ['3', '#', '', '', 0], - Digit4: ['4', '$', '', '', 0], - Digit5: ['5', '%', '', '', 0], - Digit6: ['6', '^', '', '', 0], - Digit7: ['7', '&', '', '', 0], - Digit8: ['8', '*', '', '', 0], - Digit9: ['9', '(', '', '', 0], - Digit0: ['0', ')', '', '', 0], + KeyA: ['a', 'A', '', '', 0, 'VK_A'], + KeyB: ['b', 'B', '', '', 0, 'VK_B'], + KeyC: ['c', 'C', '', '', 0, 'VK_C'], + KeyD: ['d', 'D', '', '', 0, 'VK_D'], + KeyE: ['e', 'E', '', '', 0, 'VK_E'], + KeyF: ['f', 'F', '', '', 0, 'VK_F'], + KeyG: ['g', 'G', '', '', 0, 'VK_G'], + KeyH: ['h', 'H', '', '', 0, 'VK_H'], + KeyI: ['i', 'I', '', '', 0, 'VK_I'], + KeyJ: ['j', 'J', '', '', 0, 'VK_J'], + KeyK: ['k', 'K', '', '', 0, 'VK_K'], + KeyL: ['l', 'L', '', '', 0, 'VK_L'], + KeyM: ['m', 'M', '', '', 0, 'VK_M'], + KeyN: ['n', 'N', '', '', 0, 'VK_N'], + KeyO: ['o', 'O', '', '', 0, 'VK_O'], + KeyP: ['p', 'P', '', '', 0, 'VK_P'], + KeyQ: ['q', 'Q', '', '', 0, 'VK_Q'], + KeyR: ['r', 'R', '', '', 0, 'VK_R'], + KeyS: ['s', 'S', '', '', 0, 'VK_S'], + KeyT: ['t', 'T', '', '', 0, 'VK_T'], + KeyU: ['u', 'U', '', '', 0, 'VK_U'], + KeyV: ['v', 'V', '', '', 0, 'VK_V'], + KeyW: ['w', 'W', '', '', 0, 'VK_W'], + KeyX: ['x', 'X', '', '', 0, 'VK_X'], + KeyY: ['y', 'Y', '', '', 0, 'VK_Y'], + KeyZ: ['z', 'Z', '', '', 0, 'VK_Z'], + Digit1: ['1', '!', '', '', 0, 'VK_1'], + Digit2: ['2', '@', '', '', 0, 'VK_2'], + Digit3: ['3', '#', '', '', 0, 'VK_3'], + Digit4: ['4', '$', '', '', 0, 'VK_4'], + Digit5: ['5', '%', '', '', 0, 'VK_5'], + Digit6: ['6', '^', '', '', 0, 'VK_6'], + Digit7: ['7', '&', '', '', 0, 'VK_7'], + Digit8: ['8', '*', '', '', 0, 'VK_8'], + Digit9: ['9', '(', '', '', 0, 'VK_9'], + Digit0: ['0', ')', '', '', 0, 'VK_0'], Enter: [], Escape: [], Backspace: [], Tab: [], - Space: [' ', ' ', '', '', 0], - Minus: ['-', '_', '', '', 0], - Equal: ['=', '+', '', '', 0], - BracketLeft: ['[', '{', '', '', 0], - BracketRight: [']', '}', '', '', 0], - Backslash: ['\\', '|', '', '', 0], - Semicolon: [';', ':', '', '', 0], - Quote: ['\'', '"', '', '', 0], - Backquote: ['`', '~', '', '', 0], - Comma: [',', '<', '', '', 0], - Period: ['.', '>', '', '', 0], - Slash: ['/', '?', '', '', 0], + Space: [' ', ' ', '', '', 0, 'VK_SPACE'], + Minus: ['-', '_', '', '', 0, 'VK_OEM_MINUS'], + Equal: ['=', '+', '', '', 0, 'VK_OEM_PLUS'], + BracketLeft: ['[', '{', '', '', 0, 'VK_OEM_4'], + BracketRight: [']', '}', '', '', 0, 'VK_OEM_6'], + Backslash: ['\\', '|', '', '', 0, 'VK_OEM_5'], + Semicolon: [';', ':', '', '', 0, 'VK_OEM_1'], + Quote: ['\'', '"', '', '', 0, 'VK_OEM_7'], + Backquote: ['`', '~', '', '', 0, 'VK_OEM_3'], + Comma: [',', '<', '', '', 0, 'VK_OEM_COMMA'], + Period: ['.', '>', '', '', 0, 'VK_OEM_PERIOD'], + Slash: ['/', '?', '', '', 0, 'VK_OEM_2'], CapsLock: [], F1: [], F2: [], @@ -95,10 +95,10 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( ArrowDown: [], ArrowUp: [], NumLock: [], - NumpadDivide: ['/', '/', '', '', 0], - NumpadMultiply: ['*', '*', '', '', 0], - NumpadSubtract: ['-', '-', '', '', 0], - NumpadAdd: ['+', '+', '', '', 0], + NumpadDivide: ['/', '/', '', '', 0, 'VK_DIVIDE'], + NumpadMultiply: ['*', '*', '', '', 0, 'VK_MULTIPLY'], + NumpadSubtract: ['-', '-', '', '', 0, 'VK_SUBTRACT'], + NumpadAdd: ['+', '+', '', '', 0, 'VK_ADD'], NumpadEnter: [], Numpad1: [], Numpad2: [], @@ -111,7 +111,7 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( Numpad9: [], Numpad0: [], NumpadDecimal: [], - IntlBackslash: ['\\', '|', '', '', 0], + IntlBackslash: ['\\', '|', '', '', 0, 'VK_OEM_102'], ContextMenu: [], Power: [], NumpadEqual: [], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es-latin.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es-latin.win.ts index 35ffd27323c..b7a0251226f 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es-latin.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es-latin.win.ts @@ -11,58 +11,58 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( { Sleep: [], WakeUp: [], - KeyA: ['a', 'A', '', '', 0], - KeyB: ['b', 'B', '', '', 0], - KeyC: ['c', 'C', '', '', 0], - KeyD: ['d', 'D', '', '', 0], - KeyE: ['e', 'E', '', '', 0], - KeyF: ['f', 'F', '', '', 0], - KeyG: ['g', 'G', '', '', 0], - KeyH: ['h', 'H', '', '', 0], - KeyI: ['i', 'I', '', '', 0], - KeyJ: ['j', 'J', '', '', 0], - KeyK: ['k', 'K', '', '', 0], - KeyL: ['l', 'L', '', '', 0], - KeyM: ['m', 'M', '', '', 0], - KeyN: ['n', 'N', '', '', 0], - KeyO: ['o', 'O', '', '', 0], - KeyP: ['p', 'P', '', '', 0], - KeyQ: ['q', 'Q', '@', '', 0], - KeyR: ['r', 'R', '', '', 0], - KeyS: ['s', 'S', '', '', 0], - KeyT: ['t', 'T', '', '', 0], - KeyU: ['u', 'U', '', '', 0], - KeyV: ['v', 'V', '', '', 0], - KeyW: ['w', 'W', '', '', 0], - KeyX: ['x', 'X', '', '', 0], - KeyY: ['y', 'Y', '', '', 0], - KeyZ: ['z', 'Z', '', '', 0], - Digit1: ['1', '!', '', '', 0], - Digit2: ['2', '"', '', '', 0], - Digit3: ['3', '#', '', '', 0], - Digit4: ['4', '$', '', '', 0], - Digit5: ['5', '%', '', '', 0], - Digit6: ['6', '&', '', '', 0], - Digit7: ['7', '/', '', '', 0], - Digit8: ['8', '(', '', '', 0], - Digit9: ['9', ')', '', '', 0], - Digit0: ['0', '=', '', '', 0], + KeyA: ['a', 'A', '', '', 0, 'VK_A'], + KeyB: ['b', 'B', '', '', 0, 'VK_B'], + KeyC: ['c', 'C', '', '', 0, 'VK_C'], + KeyD: ['d', 'D', '', '', 0, 'VK_D'], + KeyE: ['e', 'E', '', '', 0, 'VK_E'], + KeyF: ['f', 'F', '', '', 0, 'VK_F'], + KeyG: ['g', 'G', '', '', 0, 'VK_G'], + KeyH: ['h', 'H', '', '', 0, 'VK_H'], + KeyI: ['i', 'I', '', '', 0, 'VK_I'], + KeyJ: ['j', 'J', '', '', 0, 'VK_J'], + KeyK: ['k', 'K', '', '', 0, 'VK_K'], + KeyL: ['l', 'L', '', '', 0, 'VK_L'], + KeyM: ['m', 'M', '', '', 0, 'VK_M'], + KeyN: ['n', 'N', '', '', 0, 'VK_N'], + KeyO: ['o', 'O', '', '', 0, 'VK_O'], + KeyP: ['p', 'P', '', '', 0, 'VK_P'], + KeyQ: ['q', 'Q', '@', '', 0, 'VK_Q'], + KeyR: ['r', 'R', '', '', 0, 'VK_R'], + KeyS: ['s', 'S', '', '', 0, 'VK_S'], + KeyT: ['t', 'T', '', '', 0, 'VK_T'], + KeyU: ['u', 'U', '', '', 0, 'VK_U'], + KeyV: ['v', 'V', '', '', 0, 'VK_V'], + KeyW: ['w', 'W', '', '', 0, 'VK_W'], + KeyX: ['x', 'X', '', '', 0, 'VK_X'], + KeyY: ['y', 'Y', '', '', 0, 'VK_Y'], + KeyZ: ['z', 'Z', '', '', 0, 'VK_Z'], + Digit1: ['1', '!', '', '', 0, 'VK_1'], + Digit2: ['2', '"', '', '', 0, 'VK_2'], + Digit3: ['3', '#', '', '', 0, 'VK_3'], + Digit4: ['4', '$', '', '', 0, 'VK_4'], + Digit5: ['5', '%', '', '', 0, 'VK_5'], + Digit6: ['6', '&', '', '', 0, 'VK_6'], + Digit7: ['7', '/', '', '', 0, 'VK_7'], + Digit8: ['8', '(', '', '', 0, 'VK_8'], + Digit9: ['9', ')', '', '', 0, 'VK_9'], + Digit0: ['0', '=', '', '', 0, 'VK_0'], Enter: [], Escape: [], Backspace: [], Tab: [], - Space: [' ', ' ', '', '', 0], - Minus: ['\'', '?', '\\', '', 0], - Equal: ['¿', '¡', '', '', 0], - BracketLeft: ['´', '¨', '', '', 0], - BracketRight: ['+', '*', '~', '', 0], - Backslash: ['}', ']', '`', '', 0], - Semicolon: ['ñ', 'Ñ', '', '', 0], - Quote: ['{', '[', '^', '', 0], - Backquote: ['|', '°', '¬', '', 0], - Comma: [',', ';', '', '', 0], - Period: ['.', ':', '', '', 0], - Slash: ['-', '_', '', '', 0], + Space: [' ', ' ', '', '', 0, 'VK_SPACE'], + Minus: ['\'', '?', '\\', '', 0, 'VK_OEM_4'], + Equal: ['¿', '¡', '', '', 0, 'VK_OEM_6'], + BracketLeft: ['´', '¨', '', '', 0, 'VK_OEM_1'], + BracketRight: ['+', '*', '~', '', 0, 'VK_OEM_PLUS'], + Backslash: ['}', ']', '`', '', 0, 'VK_OEM_2'], + Semicolon: ['ñ', 'Ñ', '', '', 0, 'VK_OEM_3'], + Quote: ['{', '[', '^', '', 0, 'VK_OEM_7'], + Backquote: ['|', '°', '¬', '', 0, 'VK_OEM_5'], + Comma: [',', ';', '', '', 0, 'VK_OEM_COMMA'], + Period: ['.', ':', '', '', 0, 'VK_OEM_PERIOD'], + Slash: ['-', '_', '', '', 0, 'VK_OEM_MINUS'], CapsLock: [], F1: [], F2: [], @@ -90,10 +90,10 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( ArrowDown: [], ArrowUp: [], NumLock: [], - NumpadDivide: ['/', '/', '', '', 0], - NumpadMultiply: ['*', '*', '', '', 0], - NumpadSubtract: ['-', '-', '', '', 0], - NumpadAdd: ['+', '+', '', '', 0], + NumpadDivide: ['/', '/', '', '', 0, 'VK_DIVIDE'], + NumpadMultiply: ['*', '*', '', '', 0, 'VK_MULTIPLY'], + NumpadSubtract: ['-', '-', '', '', 0, 'VK_SUBTRACT'], + NumpadAdd: ['+', '+', '', '', 0, 'VK_ADD'], NumpadEnter: [], Numpad1: [], Numpad2: [], @@ -106,7 +106,7 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( Numpad9: [], Numpad0: [], NumpadDecimal: [], - IntlBackslash: ['<', '>', '', '', 0], + IntlBackslash: ['<', '>', '', '', 0, 'VK_OEM_102'], ContextMenu: [], Power: [], NumpadEqual: [], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.win.ts index 527d08dbf9f..7902f93b24b 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.win.ts @@ -11,58 +11,58 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( { Sleep: [], WakeUp: [], - KeyA: ['a', 'A', '', '', 0], - KeyB: ['b', 'B', '', '', 0], - KeyC: ['c', 'C', '', '', 0], - KeyD: ['d', 'D', '', '', 0], - KeyE: ['e', 'E', '€', '', 0], - KeyF: ['f', 'F', '', '', 0], - KeyG: ['g', 'G', '', '', 0], - KeyH: ['h', 'H', '', '', 0], - KeyI: ['i', 'I', '', '', 0], - KeyJ: ['j', 'J', '', '', 0], - KeyK: ['k', 'K', '', '', 0], - KeyL: ['l', 'L', '', '', 0], - KeyM: ['m', 'M', '', '', 0], - KeyN: ['n', 'N', '', '', 0], - KeyO: ['o', 'O', '', '', 0], - KeyP: ['p', 'P', '', '', 0], - KeyQ: ['q', 'Q', '', '', 0], - KeyR: ['r', 'R', '', '', 0], - KeyS: ['s', 'S', '', '', 0], - KeyT: ['t', 'T', '', '', 0], - KeyU: ['u', 'U', '', '', 0], - KeyV: ['v', 'V', '', '', 0], - KeyW: ['w', 'W', '', '', 0], - KeyX: ['x', 'X', '', '', 0], - KeyY: ['y', 'Y', '', '', 0], - KeyZ: ['z', 'Z', '', '', 0], - Digit1: ['1', '!', '|', '', 0], - Digit2: ['2', '"', '@', '', 0], - Digit3: ['3', '·', '#', '', 0], - Digit4: ['4', '$', '~', '', 0], - Digit5: ['5', '%', '€', '', 0], - Digit6: ['6', '&', '¬', '', 0], - Digit7: ['7', '/', '', '', 0], - Digit8: ['8', '(', '', '', 0], - Digit9: ['9', ')', '', '', 0], - Digit0: ['0', '=', '', '', 0], + KeyA: ['a', 'A', '', '', 0, 'VK_A'], + KeyB: ['b', 'B', '', '', 0, 'VK_B'], + KeyC: ['c', 'C', '', '', 0, 'VK_C'], + KeyD: ['d', 'D', '', '', 0, 'VK_D'], + KeyE: ['e', 'E', '€', '', 0, 'VK_E'], + KeyF: ['f', 'F', '', '', 0, 'VK_F'], + KeyG: ['g', 'G', '', '', 0, 'VK_G'], + KeyH: ['h', 'H', '', '', 0, 'VK_H'], + KeyI: ['i', 'I', '', '', 0, 'VK_I'], + KeyJ: ['j', 'J', '', '', 0, 'VK_J'], + KeyK: ['k', 'K', '', '', 0, 'VK_K'], + KeyL: ['l', 'L', '', '', 0, 'VK_L'], + KeyM: ['m', 'M', '', '', 0, 'VK_M'], + KeyN: ['n', 'N', '', '', 0, 'VK_N'], + KeyO: ['o', 'O', '', '', 0, 'VK_O'], + KeyP: ['p', 'P', '', '', 0, 'VK_P'], + KeyQ: ['q', 'Q', '', '', 0, 'VK_Q'], + KeyR: ['r', 'R', '', '', 0, 'VK_R'], + KeyS: ['s', 'S', '', '', 0, 'VK_S'], + KeyT: ['t', 'T', '', '', 0, 'VK_T'], + KeyU: ['u', 'U', '', '', 0, 'VK_U'], + KeyV: ['v', 'V', '', '', 0, 'VK_V'], + KeyW: ['w', 'W', '', '', 0, 'VK_W'], + KeyX: ['x', 'X', '', '', 0, 'VK_X'], + KeyY: ['y', 'Y', '', '', 0, 'VK_Y'], + KeyZ: ['z', 'Z', '', '', 0, 'VK_Z'], + Digit1: ['1', '!', '|', '', 0, 'VK_1'], + Digit2: ['2', '"', '@', '', 0, 'VK_2'], + Digit3: ['3', '·', '#', '', 0, 'VK_3'], + Digit4: ['4', '$', '~', '', 0, 'VK_4'], + Digit5: ['5', '%', '€', '', 0, 'VK_5'], + Digit6: ['6', '&', '¬', '', 0, 'VK_6'], + Digit7: ['7', '/', '', '', 0, 'VK_7'], + Digit8: ['8', '(', '', '', 0, 'VK_8'], + Digit9: ['9', ')', '', '', 0, 'VK_9'], + Digit0: ['0', '=', '', '', 0, 'VK_0'], Enter: [], Escape: [], Backspace: [], Tab: [], - Space: [' ', ' ', '', '', 0], - Minus: ['\'', '?', '', '', 0], - Equal: ['¡', '¿', '', '', 0], - BracketLeft: ['`', '^', '[', '', 0], - BracketRight: ['+', '*', ']', '', 0], - Backslash: ['ç', 'Ç', '}', '', 0], - Semicolon: ['ñ', 'Ñ', '', '', 0], - Quote: ['´', '¨', '{', '', 0], - Backquote: ['º', 'ª', '\\', '', 0], - Comma: [',', ';', '', '', 0], - Period: ['.', ':', '', '', 0], - Slash: ['-', '_', '', '', 0], + Space: [' ', ' ', '', '', 0, 'VK_SPACE'], + Minus: ['\'', '?', '', '', 0, 'VK_OEM_4'], + Equal: ['¡', '¿', '', '', 0, 'VK_OEM_6'], + BracketLeft: ['`', '^', '[', '', 0, 'VK_OEM_1'], + BracketRight: ['+', '*', ']', '', 0, 'VK_OEM_PLUS'], + Backslash: ['ç', 'Ç', '}', '', 0, 'VK_OEM_2'], + Semicolon: ['ñ', 'Ñ', '', '', 0, 'VK_OEM_3'], + Quote: ['´', '¨', '{', '', 0, 'VK_OEM_7'], + Backquote: ['º', 'ª', '\\', '', 0, 'VK_OEM_5'], + Comma: [',', ';', '', '', 0, 'VK_OEM_COMMA'], + Period: ['.', ':', '', '', 0, 'VK_OEM_PERIOD'], + Slash: ['-', '_', '', '', 0, 'VK_OEM_MINUS'], CapsLock: [], F1: [], F2: [], @@ -90,10 +90,10 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( ArrowDown: [], ArrowUp: [], NumLock: [], - NumpadDivide: ['/', '/', '', '', 0], - NumpadMultiply: ['*', '*', '', '', 0], - NumpadSubtract: ['-', '-', '', '', 0], - NumpadAdd: ['+', '+', '', '', 0], + NumpadDivide: ['/', '/', '', '', 0, 'VK_DIVIDE'], + NumpadMultiply: ['*', '*', '', '', 0, 'VK_MULTIPLY'], + NumpadSubtract: ['-', '-', '', '', 0, 'VK_SUBTRACT'], + NumpadAdd: ['+', '+', '', '', 0, 'VK_ADD'], NumpadEnter: [], Numpad1: [], Numpad2: [], @@ -106,7 +106,7 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( Numpad9: [], Numpad0: [], NumpadDecimal: [], - IntlBackslash: ['<', '>', '', '', 0], + IntlBackslash: ['<', '>', '', '', 0, 'VK_OEM_102'], ContextMenu: [], Power: [], NumpadEqual: [], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.win.ts index c5a7b9810ea..6f3e5882160 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.win.ts @@ -11,58 +11,58 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( { Sleep: [], WakeUp: [], - KeyA: ['q', 'Q', '', '', 0], - KeyB: ['b', 'B', '', '', 0], - KeyC: ['c', 'C', '', '', 0], - KeyD: ['d', 'D', '', '', 0], - KeyE: ['e', 'E', '€', '', 0], - KeyF: ['f', 'F', '', '', 0], - KeyG: ['g', 'G', '', '', 0], - KeyH: ['h', 'H', '', '', 0], - KeyI: ['i', 'I', '', '', 0], - KeyJ: ['j', 'J', '', '', 0], - KeyK: ['k', 'K', '', '', 0], - KeyL: ['l', 'L', '', '', 0], - KeyM: [',', '?', '', '', 0], - KeyN: ['n', 'N', '', '', 0], - KeyO: ['o', 'O', '', '', 0], - KeyP: ['p', 'P', '', '', 0], - KeyQ: ['a', 'A', '', '', 0], - KeyR: ['r', 'R', '', '', 0], - KeyS: ['s', 'S', '', '', 0], - KeyT: ['t', 'T', '', '', 0], - KeyU: ['u', 'U', '', '', 0], - KeyV: ['v', 'V', '', '', 0], - KeyW: ['z', 'Z', '', '', 0], - KeyX: ['x', 'X', '', '', 0], - KeyY: ['y', 'Y', '', '', 0], - KeyZ: ['w', 'W', '', '', 0], - Digit1: ['&', '1', '', '', 0], - Digit2: ['é', '2', '~', '', 0], - Digit3: ['"', '3', '#', '', 0], - Digit4: ['\'', '4', '{', '', 0], - Digit5: ['(', '5', '[', '', 0], - Digit6: ['-', '6', '|', '', 0], - Digit7: ['è', '7', '`', '', 0], - Digit8: ['_', '8', '\\', '', 0], - Digit9: ['ç', '9', '^', '', 0], - Digit0: ['à', '0', '@', '', 0], + KeyA: ['q', 'Q', '', '', 0, 'VK_Q'], + KeyB: ['b', 'B', '', '', 0, 'VK_B'], + KeyC: ['c', 'C', '', '', 0, 'VK_C'], + KeyD: ['d', 'D', '', '', 0, 'VK_D'], + KeyE: ['e', 'E', '€', '', 0, 'VK_E'], + KeyF: ['f', 'F', '', '', 0, 'VK_F'], + KeyG: ['g', 'G', '', '', 0, 'VK_G'], + KeyH: ['h', 'H', '', '', 0, 'VK_H'], + KeyI: ['i', 'I', '', '', 0, 'VK_I'], + KeyJ: ['j', 'J', '', '', 0, 'VK_J'], + KeyK: ['k', 'K', '', '', 0, 'VK_K'], + KeyL: ['l', 'L', '', '', 0, 'VK_L'], + KeyM: [',', '?', '', '', 0, 'VK_OEM_COMMA'], + KeyN: ['n', 'N', '', '', 0, 'VK_N'], + KeyO: ['o', 'O', '', '', 0, 'VK_O'], + KeyP: ['p', 'P', '', '', 0, 'VK_P'], + KeyQ: ['a', 'A', '', '', 0, 'VK_A'], + KeyR: ['r', 'R', '', '', 0, 'VK_R'], + KeyS: ['s', 'S', '', '', 0, 'VK_S'], + KeyT: ['t', 'T', '', '', 0, 'VK_T'], + KeyU: ['u', 'U', '', '', 0, 'VK_U'], + KeyV: ['v', 'V', '', '', 0, 'VK_V'], + KeyW: ['z', 'Z', '', '', 0, 'VK_Z'], + KeyX: ['x', 'X', '', '', 0, 'VK_X'], + KeyY: ['y', 'Y', '', '', 0, 'VK_Y'], + KeyZ: ['w', 'W', '', '', 0, 'VK_W'], + Digit1: ['&', '1', '', '', 0, 'VK_1'], + Digit2: ['é', '2', '~', '', 0, 'VK_2'], + Digit3: ['"', '3', '#', '', 0, 'VK_3'], + Digit4: ['\'', '4', '{', '', 0, 'VK_4'], + Digit5: ['(', '5', '[', '', 0, 'VK_5'], + Digit6: ['-', '6', '|', '', 0, 'VK_6'], + Digit7: ['è', '7', '`', '', 0, 'VK_7'], + Digit8: ['_', '8', '\\', '', 0, 'VK_8'], + Digit9: ['ç', '9', '^', '', 0, 'VK_9'], + Digit0: ['à', '0', '@', '', 0, 'VK_0'], Enter: [], Escape: [], Backspace: [], Tab: [], - Space: [' ', ' ', '', '', 0], - Minus: [')', '°', ']', '', 0], - Equal: ['=', '+', '}', '', 0], - BracketLeft: ['^', '¨', '', '', 0], - BracketRight: ['$', '£', '¤', '', 0], - Backslash: ['*', 'µ', '', '', 0], - Semicolon: ['m', 'M', '', '', 0], - Quote: ['ù', '%', '', '', 0], - Backquote: ['²', '', '', '', 0], - Comma: [';', '.', '', '', 0], - Period: [':', '/', '', '', 0], - Slash: ['!', '§', '', '', 0], + Space: [' ', ' ', '', '', 0, 'VK_SPACE'], + Minus: [')', '°', ']', '', 0, 'VK_OEM_4'], + Equal: ['=', '+', '}', '', 0, 'VK_OEM_PLUS'], + BracketLeft: ['^', '¨', '', '', 0, 'VK_OEM_6'], + BracketRight: ['$', '£', '¤', '', 0, 'VK_OEM_1'], + Backslash: ['*', 'µ', '', '', 0, 'VK_OEM_5'], + Semicolon: ['m', 'M', '', '', 0, 'VK_M'], + Quote: ['ù', '%', '', '', 0, 'VK_OEM_3'], + Backquote: ['²', '', '', '', 0, 'VK_OEM_7'], + Comma: [';', '.', '', '', 0, 'VK_OEM_PERIOD'], + Period: [':', '/', '', '', 0, 'VK_OEM_2'], + Slash: ['!', '§', '', '', 0, 'VK_OEM_8'], CapsLock: [], F1: [], F2: [], @@ -90,10 +90,10 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( ArrowDown: [], ArrowUp: [], NumLock: [], - NumpadDivide: ['/', '/', '', '', 0], - NumpadMultiply: ['*', '*', '', '', 0], - NumpadSubtract: ['-', '-', '', '', 0], - NumpadAdd: ['+', '+', '', '', 0], + NumpadDivide: ['/', '/', '', '', 0, 'VK_DIVIDE'], + NumpadMultiply: ['*', '*', '', '', 0, 'VK_MULTIPLY'], + NumpadSubtract: ['-', '-', '', '', 0, 'VK_SUBTRACT'], + NumpadAdd: ['+', '+', '', '', 0, 'VK_ADD'], NumpadEnter: [], Numpad1: [], Numpad2: [], @@ -106,7 +106,7 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( Numpad9: [], Numpad0: [], NumpadDecimal: [], - IntlBackslash: ['<', '>', '', '', 0], + IntlBackslash: ['<', '>', '', '', 0, 'VK_OEM_102'], ContextMenu: [], Power: [], NumpadEqual: [], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/hu.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/hu.win.ts index 62f2b66cd01..fb069ab561b 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/hu.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/hu.win.ts @@ -11,58 +11,58 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( { Sleep: [], WakeUp: [], - KeyA: ['a', 'A', 'ä', '', 0], - KeyB: ['b', 'B', '{', '', 0], - KeyC: ['c', 'C', '&', '', 0], - KeyD: ['d', 'D', 'Đ', '', 0], - KeyE: ['e', 'E', 'Ä', '', 0], - KeyF: ['f', 'F', '[', '', 0], - KeyG: ['g', 'G', ']', '', 0], - KeyH: ['h', 'H', '', '', 0], - KeyI: ['i', 'I', 'Í', '', 0], - KeyJ: ['j', 'J', 'í', '', 0], - KeyK: ['k', 'K', 'ł', '', 0], - KeyL: ['l', 'L', 'Ł', '', 0], - KeyM: ['m', 'M', '<', '', 0], - KeyN: ['n', 'N', '}', '', 0], - KeyO: ['o', 'O', '', '', 0], - KeyP: ['p', 'P', '', '', 0], - KeyQ: ['q', 'Q', '\\', '', 0], - KeyR: ['r', 'R', '', '', 0], - KeyS: ['s', 'S', 'đ', '', 0], - KeyT: ['t', 'T', '', '', 0], - KeyU: ['u', 'U', '€', '', 0], - KeyV: ['v', 'V', '@', '', 0], - KeyW: ['w', 'W', '|', '', 0], - KeyX: ['x', 'X', '#', '', 0], - KeyY: ['z', 'Z', '', '', 0], - KeyZ: ['y', 'Y', '>', '', 0], - Digit1: ['1', '\'', '~', '', 0], - Digit2: ['2', '"', 'ˇ', '', 0], - Digit3: ['3', '+', '^', '', 0], - Digit4: ['4', '!', '˘', '', 0], - Digit5: ['5', '%', '°', '', 0], - Digit6: ['6', '/', '˛', '', 0], - Digit7: ['7', '=', '`', '', 0], - Digit8: ['8', '(', '˙', '', 0], - Digit9: ['9', ')', '´', '', 0], - Digit0: ['ö', 'Ö', '˝', '', 0], + KeyA: ['a', 'A', 'ä', '', 0, 'VK_A'], + KeyB: ['b', 'B', '{', '', 0, 'VK_B'], + KeyC: ['c', 'C', '&', '', 0, 'VK_C'], + KeyD: ['d', 'D', 'Đ', '', 0, 'VK_D'], + KeyE: ['e', 'E', 'Ä', '', 0, 'VK_E'], + KeyF: ['f', 'F', '[', '', 0, 'VK_F'], + KeyG: ['g', 'G', ']', '', 0, 'VK_G'], + KeyH: ['h', 'H', '', '', 0, 'VK_H'], + KeyI: ['i', 'I', 'Í', '', 0, 'VK_I'], + KeyJ: ['j', 'J', 'í', '', 0, 'VK_J'], + KeyK: ['k', 'K', 'ł', '', 0, 'VK_K'], + KeyL: ['l', 'L', 'Ł', '', 0, 'VK_L'], + KeyM: ['m', 'M', '<', '', 0, 'VK_M'], + KeyN: ['n', 'N', '}', '', 0, 'VK_N'], + KeyO: ['o', 'O', '', '', 0, 'VK_O'], + KeyP: ['p', 'P', '', '', 0, 'VK_P'], + KeyQ: ['q', 'Q', '\\', '', 0, 'VK_Q'], + KeyR: ['r', 'R', '', '', 0, 'VK_R'], + KeyS: ['s', 'S', 'đ', '', 0, 'VK_S'], + KeyT: ['t', 'T', '', '', 0, 'VK_T'], + KeyU: ['u', 'U', '€', '', 0, 'VK_U'], + KeyV: ['v', 'V', '@', '', 0, 'VK_V'], + KeyW: ['w', 'W', '|', '', 0, 'VK_W'], + KeyX: ['x', 'X', '#', '', 0, 'VK_X'], + KeyY: ['z', 'Z', '', '', 0, 'VK_Z'], + KeyZ: ['y', 'Y', '>', '', 0, 'VK_Y'], + Digit1: ['1', '\'', '~', '', 0, 'VK_1'], + Digit2: ['2', '"', 'ˇ', '', 0, 'VK_2'], + Digit3: ['3', '+', '^', '', 0, 'VK_3'], + Digit4: ['4', '!', '˘', '', 0, 'VK_4'], + Digit5: ['5', '%', '°', '', 0, 'VK_5'], + Digit6: ['6', '/', '˛', '', 0, 'VK_6'], + Digit7: ['7', '=', '`', '', 0, 'VK_7'], + Digit8: ['8', '(', '˙', '', 0, 'VK_8'], + Digit9: ['9', ')', '´', '', 0, 'VK_9'], + Digit0: ['ö', 'Ö', '˝', '', 0, 'VK_OEM_3'], Enter: [], Escape: [], Backspace: [], Tab: [], - Space: [' ', ' ', '', '', 0], - Minus: ['ü', 'Ü', '¨', '', 0], - Equal: ['ó', 'Ó', '¸', '', 0], - BracketLeft: ['ő', 'Ő', '÷', '', 0], - BracketRight: ['ú', 'Ú', '×', '', 0], - Backslash: ['ű', 'Ű', '¤', '', 0], - Semicolon: ['é', 'É', '$', '', 0], - Quote: ['á', 'Á', 'ß', '', 0], - Backquote: ['0', '§', '', '', 0], - Comma: [',', '?', ';', '', 0], - Period: ['.', ':', '>', '', 0], - Slash: ['-', '_', '*', '', 0], + Space: [' ', ' ', '', '', 0, 'VK_SPACE'], + Minus: ['ü', 'Ü', '¨', '', 0, 'VK_OEM_2'], + Equal: ['ó', 'Ó', '¸', '', 0, 'VK_OEM_PLUS'], + BracketLeft: ['ő', 'Ő', '÷', '', 0, 'VK_OEM_4'], + BracketRight: ['ú', 'Ú', '×', '', 0, 'VK_OEM_6'], + Backslash: ['ű', 'Ű', '¤', '', 0, 'VK_OEM_5'], + Semicolon: ['é', 'É', '$', '', 0, 'VK_OEM_1'], + Quote: ['á', 'Á', 'ß', '', 0, 'VK_OEM_7'], + Backquote: ['0', '§', '', '', 0, 'VK_0'], + Comma: [',', '?', ';', '', 0, 'VK_OEM_COMMA'], + Period: ['.', ':', '>', '', 0, 'VK_OEM_PERIOD'], + Slash: ['-', '_', '*', '', 0, 'VK_OEM_MINUS'], CapsLock: [], F1: [], F2: [], @@ -90,10 +90,10 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( ArrowDown: [], ArrowUp: [], NumLock: [], - NumpadDivide: ['/', '/', '', '', 0], - NumpadMultiply: ['*', '*', '', '', 0], - NumpadSubtract: ['-', '-', '', '', 0], - NumpadAdd: ['+', '+', '', '', 0], + NumpadDivide: ['/', '/', '', '', 0, 'VK_DIVIDE'], + NumpadMultiply: ['*', '*', '', '', 0, 'VK_MULTIPLY'], + NumpadSubtract: ['-', '-', '', '', 0, 'VK_SUBTRACT'], + NumpadAdd: ['+', '+', '', '', 0, 'VK_ADD'], NumpadEnter: [], Numpad1: [], Numpad2: [], @@ -106,7 +106,7 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( Numpad9: [], Numpad0: [], NumpadDecimal: [], - IntlBackslash: ['í', 'Í', '<', '', 0], + IntlBackslash: ['í', 'Í', '<', '', 0, 'VK_OEM_102'], ContextMenu: [], Power: [], NumpadEqual: [], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/it.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/it.win.ts index 93ffb73ecca..88de00a2ccc 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/it.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/it.win.ts @@ -11,58 +11,58 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( { Sleep: [], WakeUp: [], - KeyA: ['a', 'A', '', '', 0], - KeyB: ['b', 'B', '', '', 0], - KeyC: ['c', 'C', '', '', 0], - KeyD: ['d', 'D', '', '', 0], - KeyE: ['e', 'E', '€', '', 0], - KeyF: ['f', 'F', '', '', 0], - KeyG: ['g', 'G', '', '', 0], - KeyH: ['h', 'H', '', '', 0], - KeyI: ['i', 'I', '', '', 0], - KeyJ: ['j', 'J', '', '', 0], - KeyK: ['k', 'K', '', '', 0], - KeyL: ['l', 'L', '', '', 0], - KeyM: ['m', 'M', '', '', 0], - KeyN: ['n', 'N', '', '', 0], - KeyO: ['o', 'O', '', '', 0], - KeyP: ['p', 'P', '', '', 0], - KeyQ: ['q', 'Q', '', '', 0], - KeyR: ['r', 'R', '', '', 0], - KeyS: ['s', 'S', '', '', 0], - KeyT: ['t', 'T', '', '', 0], - KeyU: ['u', 'U', '', '', 0], - KeyV: ['v', 'V', '', '', 0], - KeyW: ['w', 'W', '', '', 0], - KeyX: ['x', 'X', '', '', 0], - KeyY: ['y', 'Y', '', '', 0], - KeyZ: ['z', 'Z', '', '', 0], - Digit1: ['1', '!', '', '', 0], - Digit2: ['2', '"', '', '', 0], - Digit3: ['3', '£', '', '', 0], - Digit4: ['4', '$', '', '', 0], - Digit5: ['5', '%', '€', '', 0], - Digit6: ['6', '&', '', '', 0], - Digit7: ['7', '/', '', '', 0], - Digit8: ['8', '(', '', '', 0], - Digit9: ['9', ')', '', '', 0], - Digit0: ['0', '=', '', '', 0], + KeyA: ['a', 'A', '', '', 0, 'VK_A'], + KeyB: ['b', 'B', '', '', 0, 'VK_B'], + KeyC: ['c', 'C', '', '', 0, 'VK_C'], + KeyD: ['d', 'D', '', '', 0, 'VK_D'], + KeyE: ['e', 'E', '€', '', 0, 'VK_E'], + KeyF: ['f', 'F', '', '', 0, 'VK_F'], + KeyG: ['g', 'G', '', '', 0, 'VK_G'], + KeyH: ['h', 'H', '', '', 0, 'VK_H'], + KeyI: ['i', 'I', '', '', 0, 'VK_I'], + KeyJ: ['j', 'J', '', '', 0, 'VK_J'], + KeyK: ['k', 'K', '', '', 0, 'VK_K'], + KeyL: ['l', 'L', '', '', 0, 'VK_L'], + KeyM: ['m', 'M', '', '', 0, 'VK_M'], + KeyN: ['n', 'N', '', '', 0, 'VK_N'], + KeyO: ['o', 'O', '', '', 0, 'VK_O'], + KeyP: ['p', 'P', '', '', 0, 'VK_P'], + KeyQ: ['q', 'Q', '', '', 0, 'VK_Q'], + KeyR: ['r', 'R', '', '', 0, 'VK_R'], + KeyS: ['s', 'S', '', '', 0, 'VK_S'], + KeyT: ['t', 'T', '', '', 0, 'VK_T'], + KeyU: ['u', 'U', '', '', 0, 'VK_U'], + KeyV: ['v', 'V', '', '', 0, 'VK_V'], + KeyW: ['w', 'W', '', '', 0, 'VK_W'], + KeyX: ['x', 'X', '', '', 0, 'VK_X'], + KeyY: ['y', 'Y', '', '', 0, 'VK_Y'], + KeyZ: ['z', 'Z', '', '', 0, 'VK_Z'], + Digit1: ['1', '!', '', '', 0, 'VK_1'], + Digit2: ['2', '"', '', '', 0, 'VK_2'], + Digit3: ['3', '£', '', '', 0, 'VK_3'], + Digit4: ['4', '$', '', '', 0, 'VK_4'], + Digit5: ['5', '%', '€', '', 0, 'VK_5'], + Digit6: ['6', '&', '', '', 0, 'VK_6'], + Digit7: ['7', '/', '', '', 0, 'VK_7'], + Digit8: ['8', '(', '', '', 0, 'VK_8'], + Digit9: ['9', ')', '', '', 0, 'VK_9'], + Digit0: ['0', '=', '', '', 0, 'VK_0'], Enter: [], Escape: [], Backspace: [], Tab: [], - Space: [' ', ' ', '', '', 0], - Minus: ['\'', '?', '', '', 0], - Equal: ['ì', '^', '', '', 0], - BracketLeft: ['è', 'é', '[', '{', 0], - BracketRight: ['+', '*', ']', '}', 0], - Backslash: ['ù', '§', '', '', 0], - Semicolon: ['ò', 'ç', '@', '', 0], - Quote: ['à', '°', '#', '', 0], - Backquote: ['\\', '|', '', '', 0], - Comma: [',', ';', '', '', 0], - Period: ['.', ':', '', '', 0], - Slash: ['-', '_', '', '', 0], + Space: [' ', ' ', '', '', 0, 'VK_SPACE'], + Minus: ['\'', '?', '', '', 0, 'VK_OEM_4'], + Equal: ['ì', '^', '', '', 0, 'VK_OEM_6'], + BracketLeft: ['è', 'é', '[', '{', 0, 'VK_OEM_1'], + BracketRight: ['+', '*', ']', '}', 0, 'VK_OEM_PLUS'], + Backslash: ['ù', '§', '', '', 0, 'VK_OEM_2'], + Semicolon: ['ò', 'ç', '@', '', 0, 'VK_OEM_3'], + Quote: ['à', '°', '#', '', 0, 'VK_OEM_7'], + Backquote: ['\\', '|', '', '', 0, 'VK_OEM_5'], + Comma: [',', ';', '', '', 0, 'VK_OEM_COMMA'], + Period: ['.', ':', '', '', 0, 'VK_OEM_PERIOD'], + Slash: ['-', '_', '', '', 0, 'VK_OEM_MINUS'], CapsLock: [], F1: [], F2: [], @@ -90,10 +90,10 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( ArrowDown: [], ArrowUp: [], NumLock: [], - NumpadDivide: ['/', '/', '', '', 0], - NumpadMultiply: ['*', '*', '', '', 0], - NumpadSubtract: ['-', '-', '', '', 0], - NumpadAdd: ['+', '+', '', '', 0], + NumpadDivide: ['/', '/', '', '', 0, 'VK_DIVIDE'], + NumpadMultiply: ['*', '*', '', '', 0, 'VK_MULTIPLY'], + NumpadSubtract: ['-', '-', '', '', 0, 'VK_SUBTRACT'], + NumpadAdd: ['+', '+', '', '', 0, 'VK_ADD'], NumpadEnter: [], Numpad1: [], Numpad2: [], @@ -106,7 +106,7 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( Numpad9: [], Numpad0: [], NumpadDecimal: [], - IntlBackslash: ['<', '>', '', '', 0], + IntlBackslash: ['<', '>', '', '', 0, 'VK_OEM_102'], ContextMenu: [], Power: [], NumpadEqual: [], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/no.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/no.win.ts index c73de6993c2..da7134a5516 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/no.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/no.win.ts @@ -11,58 +11,58 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( { Sleep: [], WakeUp: [], - KeyA: ['a', 'A', '', '', 0], - KeyB: ['b', 'B', '', '', 0], - KeyC: ['c', 'C', '', '', 0], - KeyD: ['d', 'D', '', '', 0], - KeyE: ['e', 'E', '€', '', 0], - KeyF: ['f', 'F', '', '', 0], - KeyG: ['g', 'G', '', '', 0], - KeyH: ['h', 'H', '', '', 0], - KeyI: ['i', 'I', '', '', 0], - KeyJ: ['j', 'J', '', '', 0], - KeyK: ['k', 'K', '', '', 0], - KeyL: ['l', 'L', '', '', 0], - KeyM: ['m', 'M', 'µ', '', 0], - KeyN: ['n', 'N', '', '', 0], - KeyO: ['o', 'O', '', '', 0], - KeyP: ['p', 'P', '', '', 0], - KeyQ: ['q', 'Q', '', '', 0], - KeyR: ['r', 'R', '', '', 0], - KeyS: ['s', 'S', '', '', 0], - KeyT: ['t', 'T', '', '', 0], - KeyU: ['u', 'U', '', '', 0], - KeyV: ['v', 'V', '', '', 0], - KeyW: ['w', 'W', '', '', 0], - KeyX: ['x', 'X', '', '', 0], - KeyY: ['y', 'Y', '', '', 0], - KeyZ: ['z', 'Z', '', '', 0], - Digit1: ['1', '!', '', '', 0], - Digit2: ['2', '"', '@', '', 0], - Digit3: ['3', '#', '£', '', 0], - Digit4: ['4', '¤', '$', '', 0], - Digit5: ['5', '%', '€', '', 0], - Digit6: ['6', '&', '', '', 0], - Digit7: ['7', '/', '{', '', 0], - Digit8: ['8', '(', '[', '', 0], - Digit9: ['9', ')', ']', '', 0], - Digit0: ['0', '=', '}', '', 0], + KeyA: ['a', 'A', '', '', 0, 'VK_A'], + KeyB: ['b', 'B', '', '', 0, 'VK_B'], + KeyC: ['c', 'C', '', '', 0, 'VK_C'], + KeyD: ['d', 'D', '', '', 0, 'VK_D'], + KeyE: ['e', 'E', '€', '', 0, 'VK_E'], + KeyF: ['f', 'F', '', '', 0, 'VK_F'], + KeyG: ['g', 'G', '', '', 0, 'VK_G'], + KeyH: ['h', 'H', '', '', 0, 'VK_H'], + KeyI: ['i', 'I', '', '', 0, 'VK_I'], + KeyJ: ['j', 'J', '', '', 0, 'VK_J'], + KeyK: ['k', 'K', '', '', 0, 'VK_K'], + KeyL: ['l', 'L', '', '', 0, 'VK_L'], + KeyM: ['m', 'M', 'µ', '', 0, 'VK_M'], + KeyN: ['n', 'N', '', '', 0, 'VK_N'], + KeyO: ['o', 'O', '', '', 0, 'VK_O'], + KeyP: ['p', 'P', '', '', 0, 'VK_P'], + KeyQ: ['q', 'Q', '', '', 0, 'VK_Q'], + KeyR: ['r', 'R', '', '', 0, 'VK_R'], + KeyS: ['s', 'S', '', '', 0, 'VK_S'], + KeyT: ['t', 'T', '', '', 0, 'VK_T'], + KeyU: ['u', 'U', '', '', 0, 'VK_U'], + KeyV: ['v', 'V', '', '', 0, 'VK_V'], + KeyW: ['w', 'W', '', '', 0, 'VK_W'], + KeyX: ['x', 'X', '', '', 0, 'VK_X'], + KeyY: ['y', 'Y', '', '', 0, 'VK_Y'], + KeyZ: ['z', 'Z', '', '', 0, 'VK_Z'], + Digit1: ['1', '!', '', '', 0, 'VK_1'], + Digit2: ['2', '"', '@', '', 0, 'VK_2'], + Digit3: ['3', '#', '£', '', 0, 'VK_3'], + Digit4: ['4', '¤', '$', '', 0, 'VK_4'], + Digit5: ['5', '%', '€', '', 0, 'VK_5'], + Digit6: ['6', '&', '', '', 0, 'VK_6'], + Digit7: ['7', '/', '{', '', 0, 'VK_7'], + Digit8: ['8', '(', '[', '', 0, 'VK_8'], + Digit9: ['9', ')', ']', '', 0, 'VK_9'], + Digit0: ['0', '=', '}', '', 0, 'VK_0'], Enter: [], Escape: [], Backspace: [], Tab: [], - Space: [' ', ' ', '', '', 0], - Minus: ['+', '?', '', '', 0], - Equal: ['\\', '`', '´', '', 0], - BracketLeft: ['å', 'Å', '', '', 0], - BracketRight: ['¨', '^', '~', '', 0], - Backslash: ['\'', '*', '', '', 0], - Semicolon: ['ø', 'Ø', '', '', 0], - Quote: ['æ', 'Æ', '', '', 0], - Backquote: ['|', '§', '', '', 0], - Comma: [',', ';', '', '', 0], - Period: ['.', ':', '', '', 0], - Slash: ['-', '_', '', '', 0], + Space: [' ', ' ', '', '', 0, 'VK_SPACE'], + Minus: ['+', '?', '', '', 0, 'VK_OEM_PLUS'], + Equal: ['\\', '`', '´', '', 0, 'VK_OEM_4'], + BracketLeft: ['å', 'Å', '', '', 0, 'VK_OEM_6'], + BracketRight: ['¨', '^', '~', '', 0, 'VK_OEM_1'], + Backslash: ['\'', '*', '', '', 0, 'VK_OEM_2'], + Semicolon: ['ø', 'Ø', '', '', 0, 'VK_OEM_3'], + Quote: ['æ', 'Æ', '', '', 0, 'VK_OEM_7'], + Backquote: ['|', '§', '', '', 0, 'VK_OEM_5'], + Comma: [',', ';', '', '', 0, 'VK_OEM_COMMA'], + Period: ['.', ':', '', '', 0, 'VK_OEM_PERIOD'], + Slash: ['-', '_', '', '', 0, 'VK_OEM_MINUS'], CapsLock: [], F1: [], F2: [], @@ -90,10 +90,10 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( ArrowDown: [], ArrowUp: [], NumLock: [], - NumpadDivide: ['/', '/', '', '', 0], - NumpadMultiply: ['*', '*', '', '', 0], - NumpadSubtract: ['-', '-', '', '', 0], - NumpadAdd: ['+', '+', '', '', 0], + NumpadDivide: ['/', '/', '', '', 0, 'VK_DIVIDE'], + NumpadMultiply: ['*', '*', '', '', 0, 'VK_MULTIPLY'], + NumpadSubtract: ['-', '-', '', '', 0, 'VK_SUBTRACT'], + NumpadAdd: ['+', '+', '', '', 0, 'VK_ADD'], NumpadEnter: [], Numpad1: [], Numpad2: [], @@ -106,7 +106,7 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( Numpad9: [], Numpad0: [], NumpadDecimal: [], - IntlBackslash: ['<', '>', '', '', 0], + IntlBackslash: ['<', '>', '', '', 0, 'VK_OEM_102'], ContextMenu: [], Power: [], NumpadEqual: [], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pl.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pl.win.ts index c8d502b4a75..8d91f5cf72a 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pl.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pl.win.ts @@ -11,58 +11,58 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( { Sleep: [], WakeUp: [], - KeyA: ['a', 'A', 'ą', 'Ą', 0], - KeyB: ['b', 'B', '', '', 0], - KeyC: ['c', 'C', 'ć', 'Ć', 0], - KeyD: ['d', 'D', '', '', 0], - KeyE: ['e', 'E', 'ę', 'Ę', 0], - KeyF: ['f', 'F', '', '', 0], - KeyG: ['g', 'G', '', '', 0], - KeyH: ['h', 'H', '', '', 0], - KeyI: ['i', 'I', '', '', 0], - KeyJ: ['j', 'J', '', '', 0], - KeyK: ['k', 'K', '', '', 0], - KeyL: ['l', 'L', 'ł', 'Ł', 0], - KeyM: ['m', 'M', '', '', 0], - KeyN: ['n', 'N', 'ń', 'Ń', 0], - KeyO: ['o', 'O', 'ó', 'Ó', 0], - KeyP: ['p', 'P', '', '', 0], - KeyQ: ['q', 'Q', '', '', 0], - KeyR: ['r', 'R', '', '', 0], - KeyS: ['s', 'S', 'ś', 'Ś', 0], - KeyT: ['t', 'T', '', '', 0], - KeyU: ['u', 'U', '€', '', 0], - KeyV: ['v', 'V', '', '', 0], - KeyW: ['w', 'W', '', '', 0], - KeyX: ['x', 'X', 'ź', 'Ź', 0], - KeyY: ['y', 'Y', '', '', 0], - KeyZ: ['z', 'Z', 'ż', 'Ż', 0], - Digit1: ['1', '!', '', '', 0], - Digit2: ['2', '@', '', '', 0], - Digit3: ['3', '#', '', '', 0], - Digit4: ['4', '$', '', '', 0], - Digit5: ['5', '%', '', '', 0], - Digit6: ['6', '^', '', '', 0], - Digit7: ['7', '&', '', '', 0], - Digit8: ['8', '*', '', '', 0], - Digit9: ['9', '(', '', '', 0], - Digit0: ['0', ')', '', '', 0], + KeyA: ['a', 'A', 'ą', 'Ą', 0, 'VK_A'], + KeyB: ['b', 'B', '', '', 0, 'VK_B'], + KeyC: ['c', 'C', 'ć', 'Ć', 0, 'VK_C'], + KeyD: ['d', 'D', '', '', 0, 'VK_D'], + KeyE: ['e', 'E', 'ę', 'Ę', 0, 'VK_E'], + KeyF: ['f', 'F', '', '', 0, 'VK_F'], + KeyG: ['g', 'G', '', '', 0, 'VK_G'], + KeyH: ['h', 'H', '', '', 0, 'VK_H'], + KeyI: ['i', 'I', '', '', 0, 'VK_I'], + KeyJ: ['j', 'J', '', '', 0, 'VK_J'], + KeyK: ['k', 'K', '', '', 0, 'VK_K'], + KeyL: ['l', 'L', 'ł', 'Ł', 0, 'VK_L'], + KeyM: ['m', 'M', '', '', 0, 'VK_M'], + KeyN: ['n', 'N', 'ń', 'Ń', 0, 'VK_N'], + KeyO: ['o', 'O', 'ó', 'Ó', 0, 'VK_O'], + KeyP: ['p', 'P', '', '', 0, 'VK_P'], + KeyQ: ['q', 'Q', '', '', 0, 'VK_Q'], + KeyR: ['r', 'R', '', '', 0, 'VK_R'], + KeyS: ['s', 'S', 'ś', 'Ś', 0, 'VK_S'], + KeyT: ['t', 'T', '', '', 0, 'VK_T'], + KeyU: ['u', 'U', '€', '', 0, 'VK_U'], + KeyV: ['v', 'V', '', '', 0, 'VK_V'], + KeyW: ['w', 'W', '', '', 0, 'VK_W'], + KeyX: ['x', 'X', 'ź', 'Ź', 0, 'VK_X'], + KeyY: ['y', 'Y', '', '', 0, 'VK_Y'], + KeyZ: ['z', 'Z', 'ż', 'Ż', 0, 'VK_Z'], + Digit1: ['1', '!', '', '', 0, 'VK_1'], + Digit2: ['2', '@', '', '', 0, 'VK_2'], + Digit3: ['3', '#', '', '', 0, 'VK_3'], + Digit4: ['4', '$', '', '', 0, 'VK_4'], + Digit5: ['5', '%', '', '', 0, 'VK_5'], + Digit6: ['6', '^', '', '', 0, 'VK_6'], + Digit7: ['7', '&', '', '', 0, 'VK_7'], + Digit8: ['8', '*', '', '', 0, 'VK_8'], + Digit9: ['9', '(', '', '', 0, 'VK_9'], + Digit0: ['0', ')', '', '', 0, 'VK_0'], Enter: [], Escape: [], Backspace: [], Tab: [], - Space: [' ', ' ', '', '', 0], - Minus: ['-', '_', '', '', 0], - Equal: ['=', '+', '', '', 0], - BracketLeft: ['[', '{', '', '', 0], - BracketRight: [']', '}', '', '', 0], - Backslash: ['\\', '|', '', '', 0], - Semicolon: [';', ':', '', '', 0], - Quote: ['\'', '"', '', '', 0], - Backquote: ['`', '~', '', '', 0], - Comma: [',', '<', '', '', 0], - Period: ['.', '>', '', '', 0], - Slash: ['/', '?', '', '', 0], + Space: [' ', ' ', '', '', 0, 'VK_SPACE'], + Minus: ['-', '_', '', '', 0, 'VK_OEM_MINUS'], + Equal: ['=', '+', '', '', 0, 'VK_OEM_PLUS'], + BracketLeft: ['[', '{', '', '', 0, 'VK_OEM_4'], + BracketRight: [']', '}', '', '', 0, 'VK_OEM_6'], + Backslash: ['\\', '|', '', '', 0, 'VK_OEM_5'], + Semicolon: [';', ':', '', '', 0, 'VK_OEM_1'], + Quote: ['\'', '"', '', '', 0, 'VK_OEM_7'], + Backquote: ['`', '~', '', '', 0, 'VK_OEM_3'], + Comma: [',', '<', '', '', 0, 'VK_OEM_COMMA'], + Period: ['.', '>', '', '', 0, 'VK_OEM_PERIOD'], + Slash: ['/', '?', '', '', 0, 'VK_OEM_2'], CapsLock: [], F1: [], F2: [], @@ -90,10 +90,10 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( ArrowDown: [], ArrowUp: [], NumLock: [], - NumpadDivide: ['/', '/', '', '', 0], - NumpadMultiply: ['*', '*', '', '', 0], - NumpadSubtract: ['-', '-', '', '', 0], - NumpadAdd: ['+', '+', '', '', 0], + NumpadDivide: ['/', '/', '', '', 0, 'VK_DIVIDE'], + NumpadMultiply: ['*', '*', '', '', 0, 'VK_MULTIPLY'], + NumpadSubtract: ['-', '-', '', '', 0, 'VK_SUBTRACT'], + NumpadAdd: ['+', '+', '', '', 0, 'VK_ADD'], NumpadEnter: [], Numpad1: [], Numpad2: [], @@ -106,7 +106,7 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( Numpad9: [], Numpad0: [], NumpadDecimal: [], - IntlBackslash: ['\\', '|', '', '', 0], + IntlBackslash: ['\\', '|', '', '', 0, 'VK_OEM_102'], ContextMenu: [], Power: [], NumpadEqual: [], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt-br.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt-br.win.ts index 3233a429e00..5007c43b7d3 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt-br.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt-br.win.ts @@ -11,58 +11,58 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( { Sleep: [], WakeUp: [], - KeyA: ['a', 'A', '', '', 0], - KeyB: ['b', 'B', '', '', 0], - KeyC: ['c', 'C', '₢', '', 0], - KeyD: ['d', 'D', '', '', 0], - KeyE: ['e', 'E', '°', '', 0], - KeyF: ['f', 'F', '', '', 0], - KeyG: ['g', 'G', '', '', 0], - KeyH: ['h', 'H', '', '', 0], - KeyI: ['i', 'I', '', '', 0], - KeyJ: ['j', 'J', '', '', 0], - KeyK: ['k', 'K', '', '', 0], - KeyL: ['l', 'L', '', '', 0], - KeyM: ['m', 'M', '', '', 0], - KeyN: ['n', 'N', '', '', 0], - KeyO: ['o', 'O', '', '', 0], - KeyP: ['p', 'P', '', '', 0], - KeyQ: ['q', 'Q', '/', '', 0], - KeyR: ['r', 'R', '', '', 0], - KeyS: ['s', 'S', '', '', 0], - KeyT: ['t', 'T', '', '', 0], - KeyU: ['u', 'U', '', '', 0], - KeyV: ['v', 'V', '', '', 0], - KeyW: ['w', 'W', '?', '', 0], - KeyX: ['x', 'X', '', '', 0], - KeyY: ['y', 'Y', '', '', 0], - KeyZ: ['z', 'Z', '', '', 0], - Digit1: ['1', '!', '¹', '', 0], - Digit2: ['2', '@', '²', '', 0], - Digit3: ['3', '#', '³', '', 0], - Digit4: ['4', '$', '£', '', 0], - Digit5: ['5', '%', '¢', '', 0], - Digit6: ['6', '¨', '¬', '', 0], - Digit7: ['7', '&', '', '', 0], - Digit8: ['8', '*', '', '', 0], - Digit9: ['9', '(', '', '', 0], - Digit0: ['0', ')', '', '', 0], + KeyA: ['a', 'A', '', '', 0, 'VK_A'], + KeyB: ['b', 'B', '', '', 0, 'VK_B'], + KeyC: ['c', 'C', '₢', '', 0, 'VK_C'], + KeyD: ['d', 'D', '', '', 0, 'VK_D'], + KeyE: ['e', 'E', '°', '', 0, 'VK_E'], + KeyF: ['f', 'F', '', '', 0, 'VK_F'], + KeyG: ['g', 'G', '', '', 0, 'VK_G'], + KeyH: ['h', 'H', '', '', 0, 'VK_H'], + KeyI: ['i', 'I', '', '', 0, 'VK_I'], + KeyJ: ['j', 'J', '', '', 0, 'VK_J'], + KeyK: ['k', 'K', '', '', 0, 'VK_K'], + KeyL: ['l', 'L', '', '', 0, 'VK_L'], + KeyM: ['m', 'M', '', '', 0, 'VK_M'], + KeyN: ['n', 'N', '', '', 0, 'VK_N'], + KeyO: ['o', 'O', '', '', 0, 'VK_O'], + KeyP: ['p', 'P', '', '', 0, 'VK_P'], + KeyQ: ['q', 'Q', '/', '', 0, 'VK_Q'], + KeyR: ['r', 'R', '', '', 0, 'VK_R'], + KeyS: ['s', 'S', '', '', 0, 'VK_S'], + KeyT: ['t', 'T', '', '', 0, 'VK_T'], + KeyU: ['u', 'U', '', '', 0, 'VK_U'], + KeyV: ['v', 'V', '', '', 0, 'VK_V'], + KeyW: ['w', 'W', '?', '', 0, 'VK_W'], + KeyX: ['x', 'X', '', '', 0, 'VK_X'], + KeyY: ['y', 'Y', '', '', 0, 'VK_Y'], + KeyZ: ['z', 'Z', '', '', 0, 'VK_Z'], + Digit1: ['1', '!', '¹', '', 0, 'VK_1'], + Digit2: ['2', '@', '²', '', 0, 'VK_2'], + Digit3: ['3', '#', '³', '', 0, 'VK_3'], + Digit4: ['4', '$', '£', '', 0, 'VK_4'], + Digit5: ['5', '%', '¢', '', 0, 'VK_5'], + Digit6: ['6', '¨', '¬', '', 0, 'VK_6'], + Digit7: ['7', '&', '', '', 0, 'VK_7'], + Digit8: ['8', '*', '', '', 0, 'VK_8'], + Digit9: ['9', '(', '', '', 0, 'VK_9'], + Digit0: ['0', ')', '', '', 0, 'VK_0'], Enter: [], Escape: [], Backspace: [], Tab: [], - Space: [' ', ' ', '', '', 0], - Minus: ['-', '_', '', '', 0], - Equal: ['=', '+', '§', '', 0], - BracketLeft: ['´', '`', '', '', 0], - BracketRight: ['[', '{', 'ª', '', 0], - Backslash: [']', '}', 'º', '', 0], - Semicolon: ['ç', 'Ç', '', '', 0], - Quote: ['~', '^', '', '', 0], - Backquote: ['\'', '"', '', '', 0], - Comma: [',', '<', '', '', 0], - Period: ['.', '>', '', '', 0], - Slash: [';', ':', '', '', 0], + Space: [' ', ' ', '', '', 0, 'VK_SPACE'], + Minus: ['-', '_', '', '', 0, 'VK_OEM_MINUS'], + Equal: ['=', '+', '§', '', 0, 'VK_OEM_PLUS'], + BracketLeft: ['´', '`', '', '', 0, 'VK_OEM_4'], + BracketRight: ['[', '{', 'ª', '', 0, 'VK_OEM_6'], + Backslash: [']', '}', 'º', '', 0, 'VK_OEM_5'], + Semicolon: ['ç', 'Ç', '', '', 0, 'VK_OEM_1'], + Quote: ['~', '^', '', '', 0, 'VK_OEM_7'], + Backquote: ['\'', '"', '', '', 0, 'VK_OEM_3'], + Comma: [',', '<', '', '', 0, 'VK_OEM_COMMA'], + Period: ['.', '>', '', '', 0, 'VK_OEM_PERIOD'], + Slash: [';', ':', '', '', 0, 'VK_OEM_2'], CapsLock: [], F1: [], F2: [], @@ -90,10 +90,10 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( ArrowDown: [], ArrowUp: [], NumLock: [], - NumpadDivide: ['/', '/', '', '', 0], - NumpadMultiply: ['*', '*', '', '', 0], - NumpadSubtract: ['-', '-', '', '', 0], - NumpadAdd: ['+', '+', '', '', 0], + NumpadDivide: ['/', '/', '', '', 0, 'VK_DIVIDE'], + NumpadMultiply: ['*', '*', '', '', 0, 'VK_MULTIPLY'], + NumpadSubtract: ['-', '-', '', '', 0, 'VK_SUBTRACT'], + NumpadAdd: ['+', '+', '', '', 0, 'VK_ADD'], NumpadEnter: [], Numpad1: [], Numpad2: [], @@ -106,7 +106,7 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( Numpad9: [], Numpad0: [], NumpadDecimal: [], - IntlBackslash: ['\\', '|', '', '', 0], + IntlBackslash: ['\\', '|', '', '', 0, 'VK_OEM_102'], ContextMenu: [], Power: [], NumpadEqual: [], @@ -130,8 +130,8 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( AudioVolumeMute: [], AudioVolumeUp: [], AudioVolumeDown: [], - NumpadComma: ['.', '.', '', '', 0], - IntlRo: ['/', '?', '°', '', 0], + NumpadComma: ['.', '.', '', '', 0, 'VK_ABNT_C2'], + IntlRo: ['/', '?', '°', '', 0, 'VK_ABNT_C1'], KanaMode: [], IntlYen: [], Convert: [], @@ -161,6 +161,7 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( BrowserHome: [], BrowserBack: [], BrowserForward: [], + BrowserStop: [], BrowserRefresh: [], BrowserFavorites: [] diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt.win.ts index 4c112bb61f5..74dfa547d94 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt.win.ts @@ -11,58 +11,58 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( { Sleep: [], WakeUp: [], - KeyA: ['a', 'A', '', '', 0], - KeyB: ['b', 'B', '', '', 0], - KeyC: ['c', 'C', '', '', 0], - KeyD: ['d', 'D', '', '', 0], - KeyE: ['e', 'E', '€', '', 0], - KeyF: ['f', 'F', '', '', 0], - KeyG: ['g', 'G', '', '', 0], - KeyH: ['h', 'H', '', '', 0], - KeyI: ['i', 'I', '', '', 0], - KeyJ: ['j', 'J', '', '', 0], - KeyK: ['k', 'K', '', '', 0], - KeyL: ['l', 'L', '', '', 0], - KeyM: ['m', 'M', '', '', 0], - KeyN: ['n', 'N', '', '', 0], - KeyO: ['o', 'O', '', '', 0], - KeyP: ['p', 'P', '', '', 0], - KeyQ: ['q', 'Q', '', '', 0], - KeyR: ['r', 'R', '', '', 0], - KeyS: ['s', 'S', '', '', 0], - KeyT: ['t', 'T', '', '', 0], - KeyU: ['u', 'U', '', '', 0], - KeyV: ['v', 'V', '', '', 0], - KeyW: ['w', 'W', '', '', 0], - KeyX: ['x', 'X', '', '', 0], - KeyY: ['y', 'Y', '', '', 0], - KeyZ: ['z', 'Z', '', '', 0], - Digit1: ['1', '!', '', '', 0], - Digit2: ['2', '"', '@', '', 0], - Digit3: ['3', '#', '£', '', 0], - Digit4: ['4', '$', '§', '', 0], - Digit5: ['5', '%', '€', '', 0], - Digit6: ['6', '&', '', '', 0], - Digit7: ['7', '/', '{', '', 0], - Digit8: ['8', '(', '[', '', 0], - Digit9: ['9', ')', ']', '', 0], - Digit0: ['0', '=', '}', '', 0], + KeyA: ['a', 'A', '', '', 0, 'VK_A'], + KeyB: ['b', 'B', '', '', 0, 'VK_B'], + KeyC: ['c', 'C', '', '', 0, 'VK_C'], + KeyD: ['d', 'D', '', '', 0, 'VK_D'], + KeyE: ['e', 'E', '€', '', 0, 'VK_E'], + KeyF: ['f', 'F', '', '', 0, 'VK_F'], + KeyG: ['g', 'G', '', '', 0, 'VK_G'], + KeyH: ['h', 'H', '', '', 0, 'VK_H'], + KeyI: ['i', 'I', '', '', 0, 'VK_I'], + KeyJ: ['j', 'J', '', '', 0, 'VK_J'], + KeyK: ['k', 'K', '', '', 0, 'VK_K'], + KeyL: ['l', 'L', '', '', 0, 'VK_L'], + KeyM: ['m', 'M', '', '', 0, 'VK_M'], + KeyN: ['n', 'N', '', '', 0, 'VK_N'], + KeyO: ['o', 'O', '', '', 0, 'VK_O'], + KeyP: ['p', 'P', '', '', 0, 'VK_P'], + KeyQ: ['q', 'Q', '', '', 0, 'VK_Q'], + KeyR: ['r', 'R', '', '', 0, 'VK_R'], + KeyS: ['s', 'S', '', '', 0, 'VK_S'], + KeyT: ['t', 'T', '', '', 0, 'VK_T'], + KeyU: ['u', 'U', '', '', 0, 'VK_U'], + KeyV: ['v', 'V', '', '', 0, 'VK_V'], + KeyW: ['w', 'W', '', '', 0, 'VK_W'], + KeyX: ['x', 'X', '', '', 0, 'VK_X'], + KeyY: ['y', 'Y', '', '', 0, 'VK_Y'], + KeyZ: ['z', 'Z', '', '', 0, 'VK_Z'], + Digit1: ['1', '!', '', '', 0, 'VK_1'], + Digit2: ['2', '"', '@', '', 0, 'VK_2'], + Digit3: ['3', '#', '£', '', 0, 'VK_3'], + Digit4: ['4', '$', '§', '', 0, 'VK_4'], + Digit5: ['5', '%', '€', '', 0, 'VK_5'], + Digit6: ['6', '&', '', '', 0, 'VK_6'], + Digit7: ['7', '/', '{', '', 0, 'VK_7'], + Digit8: ['8', '(', '[', '', 0, 'VK_8'], + Digit9: ['9', ')', ']', '', 0, 'VK_9'], + Digit0: ['0', '=', '}', '', 0, 'VK_0'], Enter: [], Escape: [], Backspace: [], Tab: [], - Space: [' ', ' ', '', '', 0], - Minus: ['\'', '?', '', '', 0], - Equal: ['«', '»', '', '', 0], - BracketLeft: ['+', '*', '¨', '', 0], - BracketRight: ['´', '`', ']', '', 0], - Backslash: ['~', '^', '', '', 0], - Semicolon: ['ç', 'Ç', '', '', 0], - Quote: ['º', 'ª', '', '', 0], - Backquote: ['\\', '|', '', '', 0], - Comma: [',', ';', '', '', 0], - Period: ['.', ':', '', '', 0], - Slash: ['-', '_', '', '', 0], + Space: [' ', ' ', '', '', 0, 'VK_SPACE'], + Minus: ['\'', '?', '', '', 0, 'VK_OEM_4'], + Equal: ['«', '»', '', '', 0, 'VK_OEM_6'], + BracketLeft: ['+', '*', '¨', '', 0, 'VK_OEM_PLUS'], + BracketRight: ['´', '`', ']', '', 0, 'VK_OEM_1'], + Backslash: ['~', '^', '', '', 0, 'VK_OEM_2'], + Semicolon: ['ç', 'Ç', '', '', 0, 'VK_OEM_3'], + Quote: ['º', 'ª', '', '', 0, 'VK_OEM_7'], + Backquote: ['\\', '|', '', '', 0, 'VK_OEM_5'], + Comma: [',', ';', '', '', 0, 'VK_OEM_COMMA'], + Period: ['.', ':', '', '', 0, 'VK_OEM_PERIOD'], + Slash: ['-', '_', '', '', 0, 'VK_OEM_MINUS'], CapsLock: [], F1: [], F2: [], @@ -90,10 +90,10 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( ArrowDown: [], ArrowUp: [], NumLock: [], - NumpadDivide: ['/', '/', '', '', 0], - NumpadMultiply: ['*', '*', '', '', 0], - NumpadSubtract: ['-', '-', '', '', 0], - NumpadAdd: ['+', '+', '', '', 0], + NumpadDivide: ['/', '/', '', '', 0, 'VK_DIVIDE'], + NumpadMultiply: ['*', '*', '', '', 0, 'VK_MULTIPLY'], + NumpadSubtract: ['-', '-', '', '', 0, 'VK_SUBTRACT'], + NumpadAdd: ['+', '+', '', '', 0, 'VK_ADD'], NumpadEnter: [], Numpad1: [], Numpad2: [], @@ -106,7 +106,7 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( Numpad9: [], Numpad0: [], NumpadDecimal: [], - IntlBackslash: ['<', '>', '', '', 0], + IntlBackslash: ['<', '>', '', '', 0, 'VK_OEM_102'], ContextMenu: [], Power: [], NumpadEqual: [], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.win.ts index 0d730439d1e..cfc3ac1631f 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.win.ts @@ -11,58 +11,58 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( { Sleep: [], WakeUp: [], - KeyA: ['ф', 'Ф', '', '', 0], - KeyB: ['и', 'И', '', '', 0], - KeyC: ['с', 'С', '', '', 0], - KeyD: ['в', 'В', '', '', 0], - KeyE: ['у', 'У', '', '', 0], - KeyF: ['а', 'А', '', '', 0], - KeyG: ['п', 'П', '', '', 0], - KeyH: ['р', 'Р', '', '', 0], - KeyI: ['ш', 'Ш', '', '', 0], - KeyJ: ['о', 'О', '', '', 0], - KeyK: ['л', 'Л', '', '', 0], - KeyL: ['д', 'Д', '', '', 0], - KeyM: ['ь', 'Ь', '', '', 0], - KeyN: ['т', 'Т', '', '', 0], - KeyO: ['щ', 'Щ', '', '', 0], - KeyP: ['з', 'З', '', '', 0], - KeyQ: ['й', 'Й', '', '', 0], - KeyR: ['к', 'К', '', '', 0], - KeyS: ['ы', 'Ы', '', '', 0], - KeyT: ['е', 'Е', '', '', 0], - KeyU: ['г', 'Г', '', '', 0], - KeyV: ['м', 'М', '', '', 0], - KeyW: ['ц', 'Ц', '', '', 0], - KeyX: ['ч', 'Ч', '', '', 0], - KeyY: ['н', 'Н', '', '', 0], - KeyZ: ['я', 'Я', '', '', 0], - Digit1: ['1', '!', '', '', 0], - Digit2: ['2', '"', '', '', 0], - Digit3: ['3', '№', '', '', 0], - Digit4: ['4', ';', '', '', 0], - Digit5: ['5', '%', '', '', 0], - Digit6: ['6', ':', '', '', 0], - Digit7: ['7', '?', '', '', 0], - Digit8: ['8', '*', '₽', '', 0], - Digit9: ['9', '(', '', '', 0], - Digit0: ['0', ')', '', '', 0], + KeyA: ['ф', 'Ф', '', '', 0, 'VK_A'], + KeyB: ['и', 'И', '', '', 0, 'VK_B'], + KeyC: ['с', 'С', '', '', 0, 'VK_C'], + KeyD: ['в', 'В', '', '', 0, 'VK_D'], + KeyE: ['у', 'У', '', '', 0, 'VK_E'], + KeyF: ['а', 'А', '', '', 0, 'VK_F'], + KeyG: ['п', 'П', '', '', 0, 'VK_G'], + KeyH: ['р', 'Р', '', '', 0, 'VK_H'], + KeyI: ['ш', 'Ш', '', '', 0, 'VK_I'], + KeyJ: ['о', 'О', '', '', 0, 'VK_J'], + KeyK: ['л', 'Л', '', '', 0, 'VK_K'], + KeyL: ['д', 'Д', '', '', 0, 'VK_L'], + KeyM: ['ь', 'Ь', '', '', 0, 'VK_M'], + KeyN: ['т', 'Т', '', '', 0, 'VK_N'], + KeyO: ['щ', 'Щ', '', '', 0, 'VK_O'], + KeyP: ['з', 'З', '', '', 0, 'VK_P'], + KeyQ: ['й', 'Й', '', '', 0, 'VK_Q'], + KeyR: ['к', 'К', '', '', 0, 'VK_R'], + KeyS: ['ы', 'Ы', '', '', 0, 'VK_S'], + KeyT: ['е', 'Е', '', '', 0, 'VK_T'], + KeyU: ['г', 'Г', '', '', 0, 'VK_U'], + KeyV: ['м', 'М', '', '', 0, 'VK_V'], + KeyW: ['ц', 'Ц', '', '', 0, 'VK_W'], + KeyX: ['ч', 'Ч', '', '', 0, 'VK_X'], + KeyY: ['н', 'Н', '', '', 0, 'VK_Y'], + KeyZ: ['я', 'Я', '', '', 0, 'VK_Z'], + Digit1: ['1', '!', '', '', 0, 'VK_1'], + Digit2: ['2', '"', '', '', 0, 'VK_2'], + Digit3: ['3', '№', '', '', 0, 'VK_3'], + Digit4: ['4', ';', '', '', 0, 'VK_4'], + Digit5: ['5', '%', '', '', 0, 'VK_5'], + Digit6: ['6', ':', '', '', 0, 'VK_6'], + Digit7: ['7', '?', '', '', 0, 'VK_7'], + Digit8: ['8', '*', '₽', '', 0, 'VK_8'], + Digit9: ['9', '(', '', '', 0, 'VK_9'], + Digit0: ['0', ')', '', '', 0, 'VK_0'], Enter: [], Escape: [], Backspace: [], Tab: [], - Space: [' ', ' ', '', '', 0], - Minus: ['-', '_', '', '', 0], - Equal: ['=', '+', '', '', 0], - BracketLeft: ['х', 'Х', '', '', 0], - BracketRight: ['ъ', 'Ъ', '', '', 0], - Backslash: ['\\', '/', '', '', 0], - Semicolon: ['ж', 'Ж', '', '', 0], - Quote: ['э', 'Э', '', '', 0], - Backquote: ['ё', 'Ё', '', '', 0], - Comma: ['б', 'Б', '', '', 0], - Period: ['ю', 'Ю', '', '', 0], - Slash: ['.', ',', '', '', 0], + Space: [' ', ' ', '', '', 0, 'VK_SPACE'], + Minus: ['-', '_', '', '', 0, 'VK_OEM_MINUS'], + Equal: ['=', '+', '', '', 0, 'VK_OEM_PLUS'], + BracketLeft: ['х', 'Х', '', '', 0, 'VK_OEM_4'], + BracketRight: ['ъ', 'Ъ', '', '', 0, 'VK_OEM_6'], + Backslash: ['\\', '/', '', '', 0, 'VK_OEM_5'], + Semicolon: ['ж', 'Ж', '', '', 0, 'VK_OEM_1'], + Quote: ['э', 'Э', '', '', 0, 'VK_OEM_7'], + Backquote: ['ё', 'Ё', '', '', 0, 'VK_OEM_3'], + Comma: ['б', 'Б', '', '', 0, 'VK_OEM_COMMA'], + Period: ['ю', 'Ю', '', '', 0, 'VK_OEM_PERIOD'], + Slash: ['.', ',', '', '', 0, 'VK_OEM_2'], CapsLock: [], F1: [], F2: [], @@ -90,10 +90,10 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( ArrowDown: [], ArrowUp: [], NumLock: [], - NumpadDivide: ['/', '/', '', '', 0], - NumpadMultiply: ['*', '*', '', '', 0], - NumpadSubtract: ['-', '-', '', '', 0], - NumpadAdd: ['+', '+', '', '', 0], + NumpadDivide: ['/', '/', '', '', 0, 'VK_DIVIDE'], + NumpadMultiply: ['*', '*', '', '', 0, 'VK_MULTIPLY'], + NumpadSubtract: ['-', '-', '', '', 0, 'VK_SUBTRACT'], + NumpadAdd: ['+', '+', '', '', 0, 'VK_ADD'], NumpadEnter: [], Numpad1: [], Numpad2: [], @@ -106,7 +106,7 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( Numpad9: [], Numpad0: [], NumpadDecimal: [], - IntlBackslash: ['\\', '/', '', '', 0], + IntlBackslash: ['\\', '/', '', '', 0, 'VK_OEM_102'], ContextMenu: [], Power: [], NumpadEqual: [], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/sv.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/sv.win.ts index c703841d394..74f52703c99 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/sv.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/sv.win.ts @@ -13,58 +13,58 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( { Sleep: [], WakeUp: [], - KeyA: ['a', 'A', '', '', 0], - KeyB: ['b', 'B', '', '', 0], - KeyC: ['c', 'C', '', '', 0], - KeyD: ['d', 'D', '', '', 0], - KeyE: ['e', 'E', '€', '', 0], - KeyF: ['f', 'F', '', '', 0], - KeyG: ['g', 'G', '', '', 0], - KeyH: ['h', 'H', '', '', 0], - KeyI: ['i', 'I', '', '', 0], - KeyJ: ['j', 'J', '', '', 0], - KeyK: ['k', 'K', '', '', 0], - KeyL: ['l', 'L', '', '', 0], - KeyM: ['m', 'M', 'µ', '', 0], - KeyN: ['n', 'N', '', '', 0], - KeyO: ['o', 'O', '', '', 0], - KeyP: ['p', 'P', '', '', 0], - KeyQ: ['q', 'Q', '', '', 0], - KeyR: ['r', 'R', '', '', 0], - KeyS: ['s', 'S', '', '', 0], - KeyT: ['t', 'T', '', '', 0], - KeyU: ['u', 'U', '', '', 0], - KeyV: ['v', 'V', '', '', 0], - KeyW: ['w', 'W', '', '', 0], - KeyX: ['x', 'X', '', '', 0], - KeyY: ['y', 'Y', '', '', 0], - KeyZ: ['z', 'Z', '', '', 0], - Digit1: ['1', '!', '', '', 0], - Digit2: ['2', '"', '@', '', 0], - Digit3: ['3', '#', '£', '', 0], - Digit4: ['4', '¤', '$', '', 0], - Digit5: ['5', '%', '€', '', 0], - Digit6: ['6', '&', '', '', 0], - Digit7: ['7', '/', '{', '', 0], - Digit8: ['8', '(', '[', '', 0], - Digit9: ['9', ')', ']', '', 0], - Digit0: ['0', '=', '}', '', 0], + KeyA: ['a', 'A', '', '', 0, 'VK_A'], + KeyB: ['b', 'B', '', '', 0, 'VK_B'], + KeyC: ['c', 'C', '', '', 0, 'VK_C'], + KeyD: ['d', 'D', '', '', 0, 'VK_D'], + KeyE: ['e', 'E', '€', '', 0, 'VK_E'], + KeyF: ['f', 'F', '', '', 0, 'VK_F'], + KeyG: ['g', 'G', '', '', 0, 'VK_G'], + KeyH: ['h', 'H', '', '', 0, 'VK_H'], + KeyI: ['i', 'I', '', '', 0, 'VK_I'], + KeyJ: ['j', 'J', '', '', 0, 'VK_J'], + KeyK: ['k', 'K', '', '', 0, 'VK_K'], + KeyL: ['l', 'L', '', '', 0, 'VK_L'], + KeyM: ['m', 'M', 'µ', '', 0, 'VK_M'], + KeyN: ['n', 'N', '', '', 0, 'VK_N'], + KeyO: ['o', 'O', '', '', 0, 'VK_O'], + KeyP: ['p', 'P', '', '', 0, 'VK_P'], + KeyQ: ['q', 'Q', '', '', 0, 'VK_Q'], + KeyR: ['r', 'R', '', '', 0, 'VK_R'], + KeyS: ['s', 'S', '', '', 0, 'VK_S'], + KeyT: ['t', 'T', '', '', 0, 'VK_T'], + KeyU: ['u', 'U', '', '', 0, 'VK_U'], + KeyV: ['v', 'V', '', '', 0, 'VK_V'], + KeyW: ['w', 'W', '', '', 0, 'VK_W'], + KeyX: ['x', 'X', '', '', 0, 'VK_X'], + KeyY: ['y', 'Y', '', '', 0, 'VK_Y'], + KeyZ: ['z', 'Z', '', '', 0, 'VK_Z'], + Digit1: ['1', '!', '', '', 0, 'VK_1'], + Digit2: ['2', '"', '@', '', 0, 'VK_2'], + Digit3: ['3', '#', '£', '', 0, 'VK_3'], + Digit4: ['4', '¤', '$', '', 0, 'VK_4'], + Digit5: ['5', '%', '€', '', 0, 'VK_5'], + Digit6: ['6', '&', '', '', 0, 'VK_6'], + Digit7: ['7', '/', '{', '', 0, 'VK_7'], + Digit8: ['8', '(', '[', '', 0, 'VK_8'], + Digit9: ['9', ')', ']', '', 0, 'VK_9'], + Digit0: ['0', '=', '}', '', 0, 'VK_0'], Enter: [], Escape: [], Backspace: [], Tab: [], - Space: [' ', ' ', '', '', 0], - Minus: ['+', '?', '\\', '', 0], - Equal: ['´', '`', '', '', 0], - BracketLeft: ['å', 'Å', '', '', 0], - BracketRight: ['¨', '^', '~', '', 0], - Backslash: ['\'', '*', '', '', 0], - Semicolon: ['ö', 'Ö', '', '', 0], - Quote: ['ä', 'Ä', '', '', 0], - Backquote: ['§', '½', '', '', 0], - Comma: [',', ';', '', '', 0], - Period: ['.', ':', '', '', 0], - Slash: ['-', '_', '', '', 0], + Space: [' ', ' ', '', '', 0, 'VK_SPACE'], + Minus: ['+', '?', '\\', '', 0, 'VK_OEM_PLUS'], + Equal: ['´', '`', '', '', 0, 'VK_OEM_4'], + BracketLeft: ['å', 'Å', '', '', 0, 'VK_OEM_6'], + BracketRight: ['¨', '^', '~', '', 0, 'VK_OEM_1'], + Backslash: ['\'', '*', '', '', 0, 'VK_OEM_2'], + Semicolon: ['ö', 'Ö', '', '', 0, 'VK_OEM_3'], + Quote: ['ä', 'Ä', '', '', 0, 'VK_OEM_7'], + Backquote: ['§', '½', '', '', 0, 'VK_OEM_5'], + Comma: [',', ';', '', '', 0, 'VK_OEM_COMMA'], + Period: ['.', ':', '', '', 0, 'VK_OEM_PERIOD'], + Slash: ['-', '_', '', '', 0, 'VK_OEM_MINUS'], CapsLock: [], F1: [], F2: [], @@ -92,10 +92,10 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( ArrowDown: [], ArrowUp: [], NumLock: [], - NumpadDivide: ['/', '/', '', '', 0], - NumpadMultiply: ['*', '*', '', '', 0], - NumpadSubtract: ['-', '-', '', '', 0], - NumpadAdd: ['+', '+', '', '', 0], + NumpadDivide: ['/', '/', '', '', 0, 'VK_DIVIDE'], + NumpadMultiply: ['*', '*', '', '', 0, 'VK_MULTIPLY'], + NumpadSubtract: ['-', '-', '', '', 0, 'VK_SUBTRACT'], + NumpadAdd: ['+', '+', '', '', 0, 'VK_ADD'], NumpadEnter: [], Numpad1: [], Numpad2: [], @@ -108,7 +108,7 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( Numpad9: [], Numpad0: [], NumpadDecimal: [], - IntlBackslash: ['<', '>', '|', '', 0], + IntlBackslash: ['<', '>', '|', '', 0, 'VK_OEM_102'], ContextMenu: [], Power: [], NumpadEqual: [], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/thai.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/thai.win.ts index bf0c8d27948..36a05f22e41 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/thai.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/thai.win.ts @@ -11,58 +11,58 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( { Sleep: [], WakeUp: [], - KeyA: ['ฟ', 'ฤ', '', '', 0], - KeyB: ['ิ', 'ฺ', '', '', 0], - KeyC: ['แ', 'ฉ', '', '', 0], - KeyD: ['ก', 'ฏ', '', '', 0], - KeyE: ['ำ', 'ฎ', '', '', 0], - KeyF: ['ด', 'โ', '', '', 0], - KeyG: ['เ', 'ฌ', '', '', 0], - KeyH: ['้', '็', '', '', 0], - KeyI: ['ร', 'ณ', '', '', 0], - KeyJ: ['่', '๋', '', '', 0], - KeyK: ['า', 'ษ', '', '', 0], - KeyL: ['ส', 'ศ', '', '', 0], - KeyM: ['ท', '?', '', '', 0], - KeyN: ['ื', '์', '', '', 0], - KeyO: ['น', 'ฯ', '', '', 0], - KeyP: ['ย', 'ญ', '', '', 0], - KeyQ: ['ๆ', '๐', '', '', 0], - KeyR: ['พ', 'ฑ', '', '', 0], - KeyS: ['ห', 'ฆ', '', '', 0], - KeyT: ['ะ', 'ธ', '', '', 0], - KeyU: ['ี', '๊', '', '', 0], - KeyV: ['อ', 'ฮ', '', '', 0], - KeyW: ['ไ', '"', '', '', 0], - KeyX: ['ป', ')', '', '', 0], - KeyY: ['ั', 'ํ', '', '', 0], - KeyZ: ['ผ', '(', '', '', 0], - Digit1: ['ๅ', '+', '', '', 0], - Digit2: ['/', '๑', '', '', 0], - Digit3: ['-', '๒', '', '', 0], - Digit4: ['ภ', '๓', '', '', 0], - Digit5: ['ถ', '๔', '', '', 0], - Digit6: ['ุ', 'ู', '', '', 0], - Digit7: ['ึ', '฿', '', '', 0], - Digit8: ['ค', '๕', '', '', 0], - Digit9: ['ต', '๖', '', '', 0], - Digit0: ['จ', '๗', '', '', 0], + KeyA: ['ฟ', 'ฤ', '', '', 0, 'VK_A'], + KeyB: ['ิ', 'ฺ', '', '', 0, 'VK_B'], + KeyC: ['แ', 'ฉ', '', '', 0, 'VK_C'], + KeyD: ['ก', 'ฏ', '', '', 0, 'VK_D'], + KeyE: ['ำ', 'ฎ', '', '', 0, 'VK_E'], + KeyF: ['ด', 'โ', '', '', 0, 'VK_F'], + KeyG: ['เ', 'ฌ', '', '', 0, 'VK_G'], + KeyH: ['้', '็', '', '', 0, 'VK_H'], + KeyI: ['ร', 'ณ', '', '', 0, 'VK_I'], + KeyJ: ['่', '๋', '', '', 0, 'VK_J'], + KeyK: ['า', 'ษ', '', '', 0, 'VK_K'], + KeyL: ['ส', 'ศ', '', '', 0, 'VK_L'], + KeyM: ['ท', '?', '', '', 0, 'VK_M'], + KeyN: ['ื', '์', '', '', 0, 'VK_N'], + KeyO: ['น', 'ฯ', '', '', 0, 'VK_O'], + KeyP: ['ย', 'ญ', '', '', 0, 'VK_P'], + KeyQ: ['ๆ', '๐', '', '', 0, 'VK_Q'], + KeyR: ['พ', 'ฑ', '', '', 0, 'VK_R'], + KeyS: ['ห', 'ฆ', '', '', 0, 'VK_S'], + KeyT: ['ะ', 'ธ', '', '', 0, 'VK_T'], + KeyU: ['ี', '๊', '', '', 0, 'VK_U'], + KeyV: ['อ', 'ฮ', '', '', 0, 'VK_V'], + KeyW: ['ไ', '"', '', '', 0, 'VK_W'], + KeyX: ['ป', ')', '', '', 0, 'VK_X'], + KeyY: ['ั', 'ํ', '', '', 0, 'VK_Y'], + KeyZ: ['ผ', '(', '', '', 0, 'VK_Z'], + Digit1: ['ๅ', '+', '', '', 0, 'VK_1'], + Digit2: ['/', '๑', '', '', 0, 'VK_2'], + Digit3: ['-', '๒', '', '', 0, 'VK_3'], + Digit4: ['ภ', '๓', '', '', 0, 'VK_4'], + Digit5: ['ถ', '๔', '', '', 0, 'VK_5'], + Digit6: ['ุ', 'ู', '', '', 0, 'VK_6'], + Digit7: ['ึ', '฿', '', '', 0, 'VK_7'], + Digit8: ['ค', '๕', '', '', 0, 'VK_8'], + Digit9: ['ต', '๖', '', '', 0, 'VK_9'], + Digit0: ['จ', '๗', '', '', 0, 'VK_0'], Enter: [], Escape: [], Backspace: [], Tab: [], - Space: [' ', ' ', '', '', 0], - Minus: ['ข', '๘', '', '', 0], - Equal: ['ช', '๙', '', '', 0], - BracketLeft: ['บ', 'ฐ', '', '', 0], - BracketRight: ['ล', ',', '', '', 0], - Backslash: ['ฃ', 'ฅ', '', '', 0], - Semicolon: ['ว', 'ซ', '', '', 0], - Quote: ['ง', '.', '', '', 0], - Backquote: ['_', '%', '', '', 0], - Comma: ['ม', 'ฒ', '', '', 0], - Period: ['ใ', 'ฬ', '', '', 0], - Slash: ['ฝ', 'ฦ', '', '', 0], + Space: [' ', ' ', '', '', 0, 'VK_SPACE'], + Minus: ['ข', '๘', '', '', 0, 'VK_OEM_MINUS'], + Equal: ['ช', '๙', '', '', 0, 'VK_OEM_PLUS'], + BracketLeft: ['บ', 'ฐ', '', '', 0, 'VK_OEM_4'], + BracketRight: ['ล', ',', '', '', 0, 'VK_OEM_6'], + Backslash: ['ฃ', 'ฅ', '', '', 0, 'VK_OEM_5'], + Semicolon: ['ว', 'ซ', '', '', 0, 'VK_OEM_1'], + Quote: ['ง', '.', '', '', 0, 'VK_OEM_7'], + Backquote: ['_', '%', '', '', 0, 'VK_OEM_3'], + Comma: ['ม', 'ฒ', '', '', 0, 'VK_OEM_COMMA'], + Period: ['ใ', 'ฬ', '', '', 0, 'VK_OEM_PERIOD'], + Slash: ['ฝ', 'ฦ', '', '', 0, 'VK_OEM_2'], CapsLock: [], F1: [], F2: [], @@ -90,10 +90,10 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( ArrowDown: [], ArrowUp: [], NumLock: [], - NumpadDivide: ['/', '/', '', '', 0], - NumpadMultiply: ['*', '*', '', '', 0], - NumpadSubtract: ['-', '-', '', '', 0], - NumpadAdd: ['+', '+', '', '', 0], + NumpadDivide: ['/', '/', '', '', 0, 'VK_DIVIDE'], + NumpadMultiply: ['*', '*', '', '', 0, 'VK_MULTIPLY'], + NumpadSubtract: ['-', '-', '', '', 0, 'VK_SUBTRACT'], + NumpadAdd: ['+', '+', '', '', 0, 'VK_ADD'], NumpadEnter: [], Numpad1: [], Numpad2: [], @@ -106,7 +106,7 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( Numpad9: [], Numpad0: [], NumpadDecimal: [], - IntlBackslash: ['ฃ', 'ฅ', '', '', 0], + IntlBackslash: ['ฃ', 'ฅ', '', '', 0, 'VK_OEM_102'], ContextMenu: [], Power: [], NumpadEqual: [], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/tr.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/tr.win.ts index 479e37ab4c5..9708d7e6622 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/tr.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/tr.win.ts @@ -11,58 +11,58 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( { Sleep: [], WakeUp: [], - KeyA: ['a', 'A', 'æ', 'Æ', 0], - KeyB: ['b', 'B', '', '', 0], - KeyC: ['c', 'C', '', '', 0], - KeyD: ['d', 'D', '', '', 0], - KeyE: ['e', 'E', '€', '', 0], - KeyF: ['f', 'F', '', '', 0], - KeyG: ['g', 'G', '', '', 0], - KeyH: ['h', 'H', '', '', 0], - KeyI: ['ı', 'I', 'i', 'İ', 0], - KeyJ: ['j', 'J', '', '', 0], - KeyK: ['k', 'K', '', '', 0], - KeyL: ['l', 'L', '', '', 0], - KeyM: ['m', 'M', '', '', 0], - KeyN: ['n', 'N', '', '', 0], - KeyO: ['o', 'O', '', '', 0], - KeyP: ['p', 'P', '', '', 0], - KeyQ: ['q', 'Q', '@', '', 0], - KeyR: ['r', 'R', '', '', 0], - KeyS: ['s', 'S', 'ß', '', 0], - KeyT: ['t', 'T', '₺', '', 0], - KeyU: ['u', 'U', '', '', 0], - KeyV: ['v', 'V', '', '', 0], - KeyW: ['w', 'W', '', '', 0], - KeyX: ['x', 'X', '', '', 0], - KeyY: ['y', 'Y', '', '', 0], - KeyZ: ['z', 'Z', '', '', 0], - Digit1: ['1', '!', '>', '', 0], - Digit2: ['2', '\'', '£', '', 0], - Digit3: ['3', '^', '#', '', 0], - Digit4: ['4', '+', '$', '', 0], - Digit5: ['5', '%', '½', '', 0], - Digit6: ['6', '&', '', '', 0], - Digit7: ['7', '/', '{', '', 0], - Digit8: ['8', '(', '[', '', 0], - Digit9: ['9', ')', ']', '', 0], - Digit0: ['0', '=', '}', '', 0], + KeyA: ['a', 'A', 'æ', 'Æ', 0, 'VK_A'], + KeyB: ['b', 'B', '', '', 0, 'VK_B'], + KeyC: ['c', 'C', '', '', 0, 'VK_C'], + KeyD: ['d', 'D', '', '', 0, 'VK_D'], + KeyE: ['e', 'E', '€', '', 0, 'VK_E'], + KeyF: ['f', 'F', '', '', 0, 'VK_F'], + KeyG: ['g', 'G', '', '', 0, 'VK_G'], + KeyH: ['h', 'H', '', '', 0, 'VK_H'], + KeyI: ['ı', 'I', 'i', 'İ', 0, 'VK_I'], + KeyJ: ['j', 'J', '', '', 0, 'VK_J'], + KeyK: ['k', 'K', '', '', 0, 'VK_K'], + KeyL: ['l', 'L', '', '', 0, 'VK_L'], + KeyM: ['m', 'M', '', '', 0, 'VK_M'], + KeyN: ['n', 'N', '', '', 0, 'VK_N'], + KeyO: ['o', 'O', '', '', 0, 'VK_O'], + KeyP: ['p', 'P', '', '', 0, 'VK_P'], + KeyQ: ['q', 'Q', '@', '', 0, 'VK_Q'], + KeyR: ['r', 'R', '', '', 0, 'VK_R'], + KeyS: ['s', 'S', 'ß', '', 0, 'VK_S'], + KeyT: ['t', 'T', '₺', '', 0, 'VK_T'], + KeyU: ['u', 'U', '', '', 0, 'VK_U'], + KeyV: ['v', 'V', '', '', 0, 'VK_V'], + KeyW: ['w', 'W', '', '', 0, 'VK_W'], + KeyX: ['x', 'X', '', '', 0, 'VK_X'], + KeyY: ['y', 'Y', '', '', 0, 'VK_Y'], + KeyZ: ['z', 'Z', '', '', 0, 'VK_Z'], + Digit1: ['1', '!', '>', '', 0, 'VK_1'], + Digit2: ['2', '\'', '£', '', 0, 'VK_2'], + Digit3: ['3', '^', '#', '', 0, 'VK_3'], + Digit4: ['4', '+', '$', '', 0, 'VK_4'], + Digit5: ['5', '%', '½', '', 0, 'VK_5'], + Digit6: ['6', '&', '', '', 0, 'VK_6'], + Digit7: ['7', '/', '{', '', 0, 'VK_7'], + Digit8: ['8', '(', '[', '', 0, 'VK_8'], + Digit9: ['9', ')', ']', '', 0, 'VK_9'], + Digit0: ['0', '=', '}', '', 0, 'VK_0'], Enter: [], Escape: [], Backspace: [], Tab: [], - Space: [' ', ' ', '', '', 0], - Minus: ['*', '?', '\\', '', 0], - Equal: ['-', '_', '|', '', 0], - BracketLeft: ['ğ', 'Ğ', '¨', '', 0], - BracketRight: ['ü', 'Ü', '~', '', 0], - Backslash: [',', ';', '`', '', 0], - Semicolon: ['ş', 'Ş', '´', '', 0], - Quote: ['i', 'İ', '', '', 0], - Backquote: ['"', 'é', '<', '', 0], - Comma: ['ö', 'Ö', '', '', 0], - Period: ['ç', 'Ç', '', '', 0], - Slash: ['.', ':', '', '', 0], + Space: [' ', ' ', '', '', 0, 'VK_SPACE'], + Minus: ['*', '?', '\\', '', 0, 'VK_OEM_8'], + Equal: ['-', '_', '|', '', 0, 'VK_OEM_MINUS'], + BracketLeft: ['ğ', 'Ğ', '¨', '', 0, 'VK_OEM_4'], + BracketRight: ['ü', 'Ü', '~', '', 0, 'VK_OEM_6'], + Backslash: [',', ';', '`', '', 0, 'VK_OEM_COMMA'], + Semicolon: ['ş', 'Ş', '´', '', 0, 'VK_OEM_1'], + Quote: ['i', 'İ', '', '', 0, 'VK_OEM_7'], + Backquote: ['"', 'é', '<', '', 0, 'VK_OEM_3'], + Comma: ['ö', 'Ö', '', '', 0, 'VK_OEM_2'], + Period: ['ç', 'Ç', '', '', 0, 'VK_OEM_5'], + Slash: ['.', ':', '', '', 0, 'VK_OEM_PERIOD'], CapsLock: [], F1: [], F2: [], @@ -90,10 +90,10 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( ArrowDown: [], ArrowUp: [], NumLock: [], - NumpadDivide: ['/', '/', '', '', 0], - NumpadMultiply: ['*', '*', '', '', 0], - NumpadSubtract: ['-', '-', '', '', 0], - NumpadAdd: ['+', '+', '', '', 0], + NumpadDivide: ['/', '/', '', '', 0, 'VK_DIVIDE'], + NumpadMultiply: ['*', '*', '', '', 0, 'VK_MULTIPLY'], + NumpadSubtract: ['-', '-', '', '', 0, 'VK_SUBTRACT'], + NumpadAdd: ['+', '+', '', '', 0, 'VK_ADD'], NumpadEnter: [], Numpad1: [], Numpad2: [], @@ -106,7 +106,7 @@ KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( Numpad9: [], Numpad0: [], NumpadDecimal: [], - IntlBackslash: ['<', '>', '|', '', 0], + IntlBackslash: ['<', '>', '|', '', 0, 'VK_OEM_102'], ContextMenu: [], Power: [], NumpadEqual: [], From 23bdcebe602c31432279b3a040d31af901fd4f8a Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 14 Jun 2019 18:27:33 -0700 Subject: [PATCH 0203/1449] Fix undefined access exception --- src/vs/workbench/browser/web.resources.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/web.resources.ts b/src/vs/workbench/browser/web.resources.ts index 3fb3daab88a..8d1d22a8264 100644 --- a/src/vs/workbench/browser/web.resources.ts +++ b/src/vs/workbench/browser/web.resources.ts @@ -56,7 +56,7 @@ export class WebResources { while (match = this._regexp.exec(target.textContent)) { const remoteUrl = match[2]; - positions.push(match.index! + 'url('.length + match[1].length); + positions.push(match.index! + 'url('.length + (typeof match[1] === 'string' ? match[1].length : 0)); positions.push(remoteUrl.length); if (this._cache.has(remoteUrl)) { From b2bf3e396863c9c53b225c3a31c0021442f53a99 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 14 Jun 2019 18:57:43 -0700 Subject: [PATCH 0204/1449] Revert origin for webview based webviews --- src/vs/workbench/contrib/webview/browser/pre/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index 806ad7abfc3..e1c46415bb9 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -256,7 +256,7 @@ defaultScript.textContent = ` const acquireVsCodeApi = (function() { const originalPostMessage = window.parent.postMessage.bind(window.parent); - const targetOrigin = window.parent.origin; + const targetOrigin = '*'; let acquired = false; let state = ${data.state ? `JSON.parse(${JSON.stringify(data.state)})` : undefined}; From 8fcbea2b10d76e01331f166da3bb05ccabb2841b Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Sat, 15 Jun 2019 01:36:38 -0700 Subject: [PATCH 0205/1449] Extract common resource loader logic --- .../contrib/webview/common/resourceLoader.ts | 71 +++++++++++++++++++ .../electron-browser/webviewProtocols.ts | 59 +++++---------- 2 files changed, 87 insertions(+), 43 deletions(-) create mode 100644 src/vs/workbench/contrib/webview/common/resourceLoader.ts diff --git a/src/vs/workbench/contrib/webview/common/resourceLoader.ts b/src/vs/workbench/contrib/webview/common/resourceLoader.ts new file mode 100644 index 00000000000..2d9971f7e4e --- /dev/null +++ b/src/vs/workbench/contrib/webview/common/resourceLoader.ts @@ -0,0 +1,71 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { VSBuffer } from 'vs/base/common/buffer'; +import { sep } from 'vs/base/common/path'; +import { startsWith } from 'vs/base/common/strings'; +import { URI } from 'vs/base/common/uri'; +import { IFileService } from 'vs/platform/files/common/files'; +import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; +import { getWebviewContentMimeType } from 'vs/workbench/contrib/webview/common/mimeTypes'; + +class Success { + readonly type = 'success'; + + constructor( + public readonly data: VSBuffer, + public readonly mimeType: string + ) { } +} + +const Failed = new class { readonly type = 'failed'; }; +const AccessDenied = new class { readonly type = 'access-denied'; }; + +type LocalResourceResponse = Success | typeof Failed | typeof AccessDenied; + +async function resolveContent( + fileService: IFileService, + resource: URI, + mime: string +): Promise { + try { + const contents = await fileService.readFile(resource); + return new Success(contents.value, mime); + } catch (err) { + console.log(err); + return Failed; + } +} + +export async function loadLocalResource( + requestUri: URI, + fileService: IFileService, + extensionLocation: URI | undefined, + getRoots: () => ReadonlyArray +): Promise { + const requestPath = requestUri.path; + const normalizedPath = URI.file(requestPath); + for (const root of getRoots()) { + if (!startsWith(normalizedPath.fsPath, root.fsPath + sep)) { + continue; + } + + if (extensionLocation && extensionLocation.scheme === REMOTE_HOST_SCHEME) { + const redirectedUri = URI.from({ + scheme: REMOTE_HOST_SCHEME, + authority: extensionLocation.authority, + path: '/vscode-resource', + query: JSON.stringify({ + requestResourcePath: requestUri.path + }) + }); + return resolveContent(fileService, redirectedUri, getWebviewContentMimeType(requestUri)); + } else { + return resolveContent(fileService, normalizedPath, getWebviewContentMimeType(normalizedPath)); + } + } + + return AccessDenied; +} diff --git a/src/vs/workbench/contrib/webview/electron-browser/webviewProtocols.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewProtocols.ts index b10b22c053b..95d41d147cc 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webviewProtocols.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewProtocols.ts @@ -3,27 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as electron from 'electron'; -import { sep } from 'vs/base/common/path'; -import { startsWith } from 'vs/base/common/strings'; import { URI } from 'vs/base/common/uri'; import { IFileService } from 'vs/platform/files/common/files'; -import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; -import { getWebviewContentMimeType } from 'vs/workbench/contrib/webview/common/mimeTypes'; - -type BufferProtocolCallback = (buffer?: Buffer | electron.MimeTypedBuffer | { error: number }) => void; - - -function resolveContent(fileService: IFileService, resource: URI, mime: string, callback: BufferProtocolCallback): void { - fileService.readFile(resource).then(contents => { - callback({ - data: Buffer.from(contents.value.buffer), - mimeType: mime - }); - }, (err) => { - console.log(err); - callback({ error: -2 /* FAILED: https://cs.chromium.org/chromium/src/net/base/net_error_list.h */ }); - }); -} +import { loadLocalResource } from 'vs/workbench/contrib/webview/common/resourceLoader'; export function registerFileProtocol( contents: electron.WebContents, @@ -32,33 +14,24 @@ export function registerFileProtocol( extensionLocation: URI | undefined, getRoots: () => ReadonlyArray ) { - contents.session.protocol.registerBufferProtocol(protocol, (request, callback: any) => { - const requestPath = URI.parse(request.url).path; - const normalizedPath = URI.file(requestPath); - for (const root of getRoots()) { - if (!startsWith(normalizedPath.fsPath, root.fsPath + sep)) { - continue; - } - - if (extensionLocation && extensionLocation.scheme === REMOTE_HOST_SCHEME) { - const requestUri = URI.parse(request.url); - const redirectedUri = URI.from({ - scheme: REMOTE_HOST_SCHEME, - authority: extensionLocation.authority, - path: '/vscode-resource', - query: JSON.stringify({ - requestResourcePath: requestUri.path - }) + contents.session.protocol.registerBufferProtocol(protocol, async (request, callback: any) => { + try { + const result = await loadLocalResource(URI.parse(request.url), fileService, extensionLocation, getRoots); + if (result.type === 'success') { + return callback({ + data: Buffer.from(result.data.buffer), + mimeType: result.mimeType }); - resolveContent(fileService, redirectedUri, getWebviewContentMimeType(requestUri), callback); - return; - } else { - resolveContent(fileService, normalizedPath, getWebviewContentMimeType(normalizedPath), callback); - return; } + if (result.type === 'access-denied') { + console.error('Webview: Cannot load resource outside of protocol root'); + return callback({ error: -10 /* ACCESS_DENIED: https://cs.chromium.org/chromium/src/net/base/net_error_list.h */ }); + } + } catch { + // noop } - console.error('Webview: Cannot load resource outside of protocol root'); - callback({ error: -10 /* ACCESS_DENIED: https://cs.chromium.org/chromium/src/net/base/net_error_list.h */ }); + + return callback({ error: -2 /* FAILED: https://cs.chromium.org/chromium/src/net/base/net_error_list.h */ }); }, (error) => { if (error) { console.error(`Failed to register '${protocol}' protocol`); From 0a7bfcf32bfe03b525fd1a7cfc4cc8fb86f1df92 Mon Sep 17 00:00:00 2001 From: Howard Hung Date: Sat, 15 Jun 2019 22:44:25 +0800 Subject: [PATCH 0206/1449] Fix some typos in comment --- src/vs/base/common/event.ts | 4 ++-- src/vs/base/node/id.ts | 2 +- src/vs/platform/notification/common/notification.ts | 8 ++++---- src/vs/platform/opener/common/opener.ts | 2 +- src/vs/workbench/browser/labels.ts | 6 +++--- src/vs/workbench/browser/parts/editor/editorGroupView.ts | 2 +- .../contrib/files/browser/views/explorerViewer.ts | 2 +- src/vs/workbench/contrib/outline/browser/outlinePanel.ts | 2 +- src/vs/workbench/services/textfile/common/textfiles.ts | 4 ++-- 9 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/vs/base/common/event.ts b/src/vs/base/common/event.ts index a58170e6b78..d708931ec78 100644 --- a/src/vs/base/common/event.ts +++ b/src/vs/base/common/event.ts @@ -49,7 +49,7 @@ export namespace Event { /** * Given an event and a `map` function, returns another event which maps each element - * throught the mapping function. + * through the mapping function. */ export function map(event: Event, map: (i: I) => O): Event { return snapshot((listener, thisArgs = null, disposables?) => event(i => listener.call(thisArgs, map(i)), null, disposables)); @@ -90,7 +90,7 @@ export namespace Event { /** * Given an event and a `merge` function, returns another event which maps each element - * and the cummulative result throught the `merge` function. Similar to `map`, but with memory. + * and the cumulative result through the `merge` function. Similar to `map`, but with memory. */ export function reduce(event: Event, merge: (last: O | undefined, event: I) => O, initial?: O): Event { let output: O | undefined = initial; diff --git a/src/vs/base/node/id.ts b/src/vs/base/node/id.ts index d8f617df434..6f72afeed79 100644 --- a/src/vs/base/node/id.ts +++ b/src/vs/base/node/id.ts @@ -11,7 +11,7 @@ import { TernarySearchTree } from 'vs/base/common/map'; // http://www.techrepublic.com/blog/data-center/mac-address-scorecard-for-common-virtual-machine-platforms/ // VMware ESX 3, Server, Workstation, Player 00-50-56, 00-0C-29, 00-05-69 // Microsoft Hyper-V, Virtual Server, Virtual PC 00-03-FF -// Parallells Desktop, Workstation, Server, Virtuozzo 00-1C-42 +// Parallels Desktop, Workstation, Server, Virtuozzo 00-1C-42 // Virtual Iron 4 00-0F-4B // Red Hat Xen 00-16-3E // Oracle VM 00-16-3E diff --git a/src/vs/platform/notification/common/notification.ts b/src/vs/platform/notification/common/notification.ts index c33fd5c93e1..75549c25f55 100644 --- a/src/vs/platform/notification/common/notification.ts +++ b/src/vs/platform/notification/common/notification.ts @@ -210,19 +210,19 @@ export interface INotificationService { notify(notification: INotification): INotificationHandle; /** - * A convinient way of reporting infos. Use the `INotificationService.notify` + * A convenient way of reporting infos. Use the `INotificationService.notify` * method if you need more control over the notification. */ info(message: NotificationMessage | NotificationMessage[]): void; /** - * A convinient way of reporting warnings. Use the `INotificationService.notify` + * A convenient way of reporting warnings. Use the `INotificationService.notify` * method if you need more control over the notification. */ warn(message: NotificationMessage | NotificationMessage[]): void; /** - * A convinient way of reporting errors. Use the `INotificationService.notify` + * A convenient way of reporting errors. Use the `INotificationService.notify` * method if you need more control over the notification. */ error(message: NotificationMessage | NotificationMessage[]): void; @@ -239,7 +239,7 @@ export interface INotificationService { prompt(severity: Severity, message: string, choices: IPromptChoice[], options?: IPromptOptions): INotificationHandle; /** - * Shows a status message in the status area with the provied text. + * Shows a status message in the status area with the provided text. * * @param message the message to show as status * @param options provides some optional configuration options diff --git a/src/vs/platform/opener/common/opener.ts b/src/vs/platform/opener/common/opener.ts index 3c999d51b30..8c0f9fee5df 100644 --- a/src/vs/platform/opener/common/opener.ts +++ b/src/vs/platform/opener/common/opener.ts @@ -21,7 +21,7 @@ export interface IOpenerService { registerOpener(opener: IOpener): IDisposable; /** - * Opens a resource, like a webadress, a document uri, or executes command. + * Opens a resource, like a webaddress, a document uri, or executes command. * * @param resource A resource * @return A promise that resolves when the opening is done. diff --git a/src/vs/workbench/browser/labels.ts b/src/vs/workbench/browser/labels.ts index f36a9516edc..99c24e24cb5 100644 --- a/src/vs/workbench/browser/labels.ts +++ b/src/vs/workbench/browser/labels.ts @@ -52,19 +52,19 @@ export interface IResourceLabel extends IDisposable { setLabel(label?: string, description?: string, options?: IIconLabelValueOptions): void; /** - * Convinient method to apply a label by passing a resource along. + * Convenient method to apply a label by passing a resource along. * * Note: for file resources consider to use the #setFile() method instead. */ setResource(label: IResourceLabelProps, options?: IResourceLabelOptions): void; /** - * Convinient method to render a file label based on a resource. + * Convenient method to render a file label based on a resource. */ setFile(resource: URI, options?: IFileLabelOptions): void; /** - * Convinient method to apply a label by passing an editor along. + * Convenient method to apply a label by passing an editor along. */ setEditor(editor: IEditorInput, options?: IResourceLabelOptions): void; diff --git a/src/vs/workbench/browser/parts/editor/editorGroupView.ts b/src/vs/workbench/browser/parts/editor/editorGroupView.ts index fb988c60942..fb450decc71 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupView.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupView.ts @@ -1280,7 +1280,7 @@ export class EditorGroupView extends Themable implements IEditorGroupView { // If the group is empty and the request is to close all editors, we still close // the editor group is the related setting to close empty groups is enabled for - // a convinient way of removing empty editor groups for the user. + // a convenient way of removing empty editor groups for the user. if (this.accessor.partOptions.closeEmptyGroups) { this.accessor.removeGroup(this); } diff --git a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts index 8fa1c60463b..76fab053275 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts @@ -484,7 +484,7 @@ export class FileDragAndDrop implements ITreeDragAndDrop { const items = (data as ElementsDragAndDropData).elements; if (!target) { - // Droping onto the empty area. Do not accept if items dragged are already + // Dropping onto the empty area. Do not accept if items dragged are already // children of the root unless we are copying the file if (!isCopy && items.every(i => !!i.parent && i.parent.isRoot)) { return false; diff --git a/src/vs/workbench/contrib/outline/browser/outlinePanel.ts b/src/vs/workbench/contrib/outline/browser/outlinePanel.ts index b83ce337543..7b5eaee508e 100644 --- a/src/vs/workbench/contrib/outline/browser/outlinePanel.ts +++ b/src/vs/workbench/contrib/outline/browser/outlinePanel.ts @@ -113,7 +113,7 @@ class RequestOracle { ); if (this._lastState && thisState.equals(this._lastState)) { - // prevent unneccesary changes... + // prevent unnecessary changes... return; } dispose(this._sessionDisposable); diff --git a/src/vs/workbench/services/textfile/common/textfiles.ts b/src/vs/workbench/services/textfile/common/textfiles.ts index fd36a109bf8..d2178242607 100644 --- a/src/vs/workbench/services/textfile/common/textfiles.ts +++ b/src/vs/workbench/services/textfile/common/textfiles.ts @@ -136,12 +136,12 @@ export interface ITextFileService extends IDisposable { confirmSave(resources?: URI[]): Promise; /** - * Convinient fast access to the current auto save mode. + * Convenient fast access to the current auto save mode. */ getAutoSaveMode(): AutoSaveMode; /** - * Convinient fast access to the raw configured auto save settings. + * Convenient fast access to the raw configured auto save settings. */ getAutoSaveConfiguration(): IAutoSaveConfiguration; } From 1319038ec00d775bc8f34253ccf5e42d808a6927 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Sat, 15 Jun 2019 12:35:18 -0700 Subject: [PATCH 0207/1449] Add experimental service-worker based loading of webview content ## Problem We use a custom `vscode-resource` protocol to control access to local resources inside of webviews. This will not work on the web, but we still would prefer a way to intercept webview requests from the main client ## Proposed solution Move webviews into their own origin and register a service worker on this origin. This service worker can talk with the outer iframe of our webview. When a request for a resource comes in to the service worker: * In the service worker, add the request to a map and post a message back to the client saying we want to load this resource * The outer iframe gets the message from the sercice worker and forwards it to our main process * This process handles the message and use the normal file system api to read the resource (also restricting which files can be read) * We post the result back into the inner iframe which fowards it back to the service worker * The service worker now resolves the pending request. The prototype version in this change works but does not correctly handle multiple clients existing at the same time (plus probably a lot of other edge cases too) --- src/vs/code/browser/workbench/workbench.html | 3 +- .../environment/common/environment.ts | 2 + src/vs/workbench/browser/web.main.ts | 6 +- .../workbench/browser/web.simpleservices.ts | 1 + .../contrib/webview/browser/pre/fake.html | 0 .../contrib/webview/browser/pre/main.js | 49 +++++++++-- .../webview/browser/pre/service-worker.js | 84 +++++++++++++++++++ .../contrib/webview/browser/webviewElement.ts | 37 +++++++- 8 files changed, 172 insertions(+), 10 deletions(-) create mode 100644 src/vs/workbench/contrib/webview/browser/pre/fake.html create mode 100644 src/vs/workbench/contrib/webview/browser/pre/service-worker.js diff --git a/src/vs/code/browser/workbench/workbench.html b/src/vs/code/browser/workbench/workbench.html index a11d9901d77..8a35fe1ee16 100644 --- a/src/vs/code/browser/workbench/workbench.html +++ b/src/vs/code/browser/workbench/workbench.html @@ -17,7 +17,8 @@ folderUri: '{{FOLDER}}', workspaceUri: '{{WORKSPACE}}', userDataUri: '{{USER_DATA}}', - authority: '{{AUTHORITY}}' + authority: '{{AUTHORITY}}', + webviewEndpoint: '{{WEBVIEW_ENDPOINT}}' } diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index adcdb08cfb1..b2d41431207 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -151,4 +151,6 @@ export interface IEnvironmentService { driverHandle?: string; driverVerbose: boolean; + + webviewEndpoint?: string; } diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index 9f39bae7e51..ec54aaab3e8 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -41,6 +41,7 @@ interface IWindowConfiguration { userDataUri: URI; folderUri?: URI; workspaceUri?: URI; + webviewEndpoint?: string; } class CodeRendererMain extends Disposable { @@ -149,6 +150,7 @@ class CodeRendererMain extends Disposable { port: null, break: false }; + environmentService.webviewEndpoint = this.configuration.webviewEndpoint; return environmentService; } @@ -189,6 +191,7 @@ export interface IWindowConfigurationContents { userDataUri: UriComponents; folderUri?: UriComponents; workspaceUri?: UriComponents; + webviewEndpoint?: string; } export function main(windowConfigurationContents: IWindowConfigurationContents): Promise { @@ -196,7 +199,8 @@ export function main(windowConfigurationContents: IWindowConfigurationContents): userDataUri: URI.revive(windowConfigurationContents.userDataUri), remoteAuthority: windowConfigurationContents.authority, folderUri: windowConfigurationContents.folderUri ? URI.revive(windowConfigurationContents.folderUri) : undefined, - workspaceUri: windowConfigurationContents.workspaceUri ? URI.revive(windowConfigurationContents.workspaceUri) : undefined + workspaceUri: windowConfigurationContents.workspaceUri ? URI.revive(windowConfigurationContents.workspaceUri) : undefined, + webviewEndpoint: windowConfigurationContents.webviewEndpoint }; const renderer = new CodeRendererMain(windowConfiguration); diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index 67866d6b239..92493e0c8da 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -228,6 +228,7 @@ export class SimpleWorkbenchEnvironmentService implements IWorkbenchEnvironmentS disableCrashReporter: boolean; driverHandle?: string; driverVerbose: boolean; + webviewEndpoint?: string; } diff --git a/src/vs/workbench/contrib/webview/browser/pre/fake.html b/src/vs/workbench/contrib/webview/browser/pre/fake.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index e1c46415bb9..2b706c812da 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -118,6 +118,28 @@ initialScrollProgress: undefined }; + // Service worker for resource loading + const FAKE_LOAD = !!navigator.serviceWorker; + if (navigator.serviceWorker) { + navigator.serviceWorker.register('service-worker.js'); + + navigator.serviceWorker.ready.then(registration => { + registration.active.postMessage('ping'); + + host.onMessage('loaded-resource', event => { + registration.active.postMessage({ channel: 'loaded-resource', data: event.data.args }); + }); + }); + + navigator.serviceWorker.addEventListener('message', event => { + switch (event.data.channel) { + case 'load-resource': + host.postMessage('load-resource', { path: event.data.path }); + return; + } + }); + } + /** * @param {HTMLDocument?} document * @param {HTMLElement?} body @@ -337,15 +359,30 @@ newFrame.setAttribute('id', 'pending-frame'); newFrame.setAttribute('frameborder', '0'); newFrame.setAttribute('sandbox', options.allowScripts ? 'allow-scripts allow-forms allow-same-origin' : 'allow-same-origin'); + if (FAKE_LOAD) { + // We should just be able to use srcdoc, but I wasn't + // seeing the service worker applying properly. + // Fake load an empty on the correct origin and then write real html + // into it to get around this. + newFrame.src = '/fake.html'; + } newFrame.style.cssText = 'display: block; margin: 0; overflow: hidden; position: absolute; width: 100%; height: 100%; visibility: hidden'; document.body.appendChild(newFrame); - // write new content onto iframe - newFrame.contentDocument.open('text/html', 'replace'); + if (!FAKE_LOAD) { + // write new content onto iframe + newFrame.contentDocument.open(); + } newFrame.contentWindow.addEventListener('keydown', handleInnerKeydown); newFrame.contentWindow.addEventListener('DOMContentLoaded', e => { + if (FAKE_LOAD) { + newFrame.contentDocument.open(); + newFrame.contentDocument.write(''); + newFrame.contentDocument.write(newDocument.documentElement.innerHTML); + newFrame.contentDocument.close(); + } const contentDocument = e.target ? (/** @type {HTMLDocument} */ (e.target)) : undefined; if (contentDocument) { applyStyles(contentDocument, contentDocument.body); @@ -414,9 +451,11 @@ // set DOCTYPE for newDocument explicitly as DOMParser.parseFromString strips it off // and DOCTYPE is needed in the iframe to ensure that the user agent stylesheet is correctly overridden - newFrame.contentDocument.write(''); - newFrame.contentDocument.write(newDocument.documentElement.innerHTML); - newFrame.contentDocument.close(); + if (!FAKE_LOAD) { + newFrame.contentDocument.write(''); + newFrame.contentDocument.write(newDocument.documentElement.innerHTML); + newFrame.contentDocument.close(); + } host.postMessage('did-set-content', undefined); }); diff --git a/src/vs/workbench/contrib/webview/browser/pre/service-worker.js b/src/vs/workbench/contrib/webview/browser/pre/service-worker.js new file mode 100644 index 00000000000..98f46d57477 --- /dev/null +++ b/src/vs/workbench/contrib/webview/browser/pre/service-worker.js @@ -0,0 +1,84 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Listen for messages from clients. +const resolvedPaths = new Map(); + +self.addEventListener('message', (event) => { + switch (event.data.channel) { + case 'loaded-resource': + { + const data = event.data.data; + const target = resolvedPaths.get(data.path); + if (!target) { + console.log('Loaded unknown resource', data.path); + return; + } + + if (data.status === 200) { + target.resolve(new Response(data.data, { + status: 200, + headers: { 'Content-Type': data.mime }, + }).clone()); + } else { + target.resolve(new Response('Not Found', { + status: 404, + }).clone()); + } + } + return; + } +}); + +var clients; +const resourceRoot = '/vscode-resource'; + +self.addEventListener('fetch', (event) => { + const requestUrl = new URL(event.request.url); + + if (!requestUrl.pathname.startsWith(resourceRoot + '/')) { + return event.respondWith(fetch(event.request)); + } + + event.respondWith((async () => { + const resourcePath = requestUrl.pathname.replace(resourceRoot, ''); + + const existing = resolvedPaths.get(resourcePath); + if (existing) { + return existing.promise.then(r => r.clone()); + } + + const allClients = await clients.matchAll({ + includeUncontrolled: true + }); + + for (const client of allClients) { + const clientUrl = new URL(client.url); + if (clientUrl.pathname === '/') { + client.postMessage({ + channel: 'load-resource', + path: resourcePath + }); + + if (resolvedPaths.has(resourcePath)) { + // Someone else added it in the mean time + return resolvedPaths.get(resolvedPaths).promise; + } + + let resolve; + const promise = new Promise(r => resolve = r); + resolvedPaths.set(resourcePath, { resolve, promise }); + return promise.then(r => r.clone()); + } + } + })()); +}); + +self.addEventListener('install', (event) => { + event.waitUntil(self.skipWaiting()); // Activate worker immediately +}); + +self.addEventListener('activate', (event) => { + event.waitUntil(self.clients.claim()); // Become available to all pages +}); diff --git a/src/vs/workbench/contrib/webview/browser/webviewElement.ts b/src/vs/workbench/contrib/webview/browser/webviewElement.ts index c40c6ec2bf9..52936cb045c 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewElement.ts @@ -16,6 +16,7 @@ import { areWebviewInputOptionsEqual } from 'vs/workbench/contrib/webview/browse import { addDisposableListener, addClass } from 'vs/base/browser/dom'; import { getWebviewThemeData } from 'vs/workbench/contrib/webview/common/themeing'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { loadLocalResource } from 'vs/workbench/contrib/webview/common/resourceLoader'; interface WebviewContent { readonly html: string; @@ -34,12 +35,12 @@ export class IFrameWebview extends Disposable implements Webview { private readonly id: string; constructor( - _options: WebviewOptions, + private _options: WebviewOptions, contentOptions: WebviewContentOptions, @IInstantiationService instantiationService: IInstantiationService, @IThemeService themeService: IThemeService, @IEnvironmentService environmentService: IEnvironmentService, - @IFileService fileService: IFileService, + @IFileService private readonly fileService: IFileService, @ITelemetryService telemetryService: ITelemetryService, @IConfigurationService private readonly _configurationService: IConfigurationService, ) { @@ -55,7 +56,7 @@ export class IFrameWebview extends Disposable implements Webview { this.element = document.createElement('iframe'); this.element.sandbox.add('allow-scripts'); this.element.sandbox.add('allow-same-origin'); - this.element.setAttribute('src', `/src/vs/workbench/contrib/webview/browser/pre/index.html?id=${this.id}`); + this.element.setAttribute('src', `${environmentService.webviewEndpoint}?id=${this.id}`); // TODO: get this from env service this.element.style.border = 'none'; this.element.style.width = '100%'; this.element.style.height = '100%'; @@ -108,6 +109,13 @@ export class IFrameWebview extends Disposable implements Webview { this.handleFocusChange(false); return; + case 'load-resource': + { + const path = e.data.data.path; + const uri = URI.file(path); + this.loadResource(uri); + return; + } } })); @@ -262,5 +270,28 @@ export class IFrameWebview extends Disposable implements Webview { const { styles, activeTheme } = getWebviewThemeData(theme, this._configurationService); this._send('styles', { styles, activeTheme }); } + + private async loadResource(uri: URI) { + try { + const result = await loadLocalResource(uri, this.fileService, this._options.extension ? this._options.extension.location : undefined, + () => (this.content.options.localResourceRoots || [])); + + if (result.type === 'success') { + return this._send('loaded-resource', { + status: 200, + path: uri.path, + mime: result.mimeType, + data: result.data.buffer + }); + } + } catch { + // noop + } + + return this._send('loaded-resource', { + status: 404, + path: uri.path + }); + } } From fb19107658e2eee747cd880e3cd85fd1a89f6c52 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 15 Jun 2019 13:34:24 -0700 Subject: [PATCH 0208/1449] xterm@3.15.0-beta42 Diff: https://github.com/xtermjs/xterm.js/compare/cdc9f79...846a189 - Saved absolute cursor position (xtermjs/xterm.js#2217) - Buffer line refactor (moving parts into new files) - Splitting Types.ts into .d.ts and Constants.ts - Fix refresh after DPR change - Fix NPE in setTheme (didn't affect VS Codee) Fixes #75575 Fixes #75576 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 7fbcc2a52b5..7f64838dee7 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "vscode-ripgrep": "^1.2.5", "vscode-sqlite3": "4.0.7", "vscode-textmate": "^4.1.1", - "xterm": "3.15.0-beta37", + "xterm": "3.15.0-beta42", "xterm-addon-search": "0.1.0-beta6", "xterm-addon-web-links": "0.1.0-beta10", "yauzl": "^2.9.2", diff --git a/yarn.lock b/yarn.lock index 7d76af26819..73658789903 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9909,10 +9909,10 @@ xterm-addon-web-links@0.1.0-beta10: resolved "https://registry.yarnpkg.com/xterm-addon-web-links/-/xterm-addon-web-links-0.1.0-beta10.tgz#610fa9773a2a5ccd41c1c83ba0e2dd2c9eb66a23" integrity sha512-xfpjy0V6bB4BR44qIgZQPoCMVakxb65gMscPkHpO//QxvUxKzabV3dxOsIbeZRFkUGsWTFlvz2OoaBLoNtv5gg== -xterm@3.15.0-beta37: - version "3.15.0-beta37" - resolved "https://registry.yarnpkg.com/xterm/-/xterm-3.15.0-beta37.tgz#239733c1b195e8d1b560bb87806ace928ddd0874" - integrity sha512-ma9A8di0xxedFTZIuQD7wKbX9lxuwNi7j07rpSe9Igg5uw57YMFJnbb1E58zjLNQe4GHqU4edBsyNFmMyO7pbQ== +xterm@3.15.0-beta42: + version "3.15.0-beta42" + resolved "https://registry.yarnpkg.com/xterm/-/xterm-3.15.0-beta42.tgz#8ed1f2928d46cb5f941dc39e4116782787a4b8a6" + integrity sha512-1hXcdnrhAsvmyTrcR+cz/B3O/Bv9oRRg4lPrOVoJkW+0otRfljJ5CHMfaL0uiZwphNoWpkHXrzApsY5GzS8o5Q== y18n@^3.2.1: version "3.2.1" From a0a6761d6403134ae38854ec0f1202f29dd26cab Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Sat, 15 Jun 2019 09:47:12 -0700 Subject: [PATCH 0209/1449] Capitalization --- .../contrib/extensions/electron-browser/extensionsActions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts index e89bb57eeaf..7a7282a0c42 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts @@ -1070,7 +1070,7 @@ export class CheckForUpdatesAction extends Action { private checkUpdatesAndNotify(): void { const outdated = this.extensionsWorkbenchService.outdated; if (!outdated.length) { - this.notificationService.info(localize('noUpdatesAvailable', "All Extensions are up to date.")); + this.notificationService.info(localize('noUpdatesAvailable', "All extensions are up to date.")); return; } From e257780a814fffd002e966f7ca497b10585ae49c Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Sun, 16 Jun 2019 14:28:38 -0700 Subject: [PATCH 0210/1449] keyboard layout provider initialization --- .../browser/keyboardLayoutService.ts | 58 ++++++++++++++----- 1 file changed, 44 insertions(+), 14 deletions(-) diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts index e09016e99d2..aab36a31b07 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts @@ -25,7 +25,20 @@ export class BrowserKeymap { private readonly _onDidChangeKeyboardLayout = new Emitter(); public readonly onDidChangeKeyboardLayout: Event = this._onDidChangeKeyboardLayout.event; + private readonly _onDidInitialized = new Emitter(); + public readonly onDidInitialized: Event = this._onDidInitialized.event; + + private _initialized: boolean; + private constructor() { + this._initialized = false; + const platform = isWindows ? 'win' : isMacintosh ? 'darwin' : 'linux'; + + import('vs/workbench/services/keybinding/browser/keyboardlayouts/layout.contribution.' + platform).then(() => { + this._initialized = true; + this._onDidInitialized.fire(); + }); + if ((navigator as any).keyboard && (navigator as any).keyboard.addEventListener) { (navigator as any).keyboard.addEventListener('layoutchange', () => { // Update user keyboard map settings @@ -39,14 +52,14 @@ export class BrowserKeymap { }); } - const platform = isWindows ? 'win' : isMacintosh ? 'darwin' : 'linux'; - import('vs/workbench/services/keybinding/browser/keyboardlayouts/layout.contribution.' + platform).then(() => { - console.log(KeyboardLayoutProvider.INSTANCE.getKeyboardLayouts().length); - }); } validateCurrentKeyboardMapping(keyboardEvent: IKeyboardEvent): boolean { + if (!this._initialized) { + return true; + } + const standardKeyboardEvent = keyboardEvent as StandardKeyboardEvent; const currentKeymap = KeyboardLayoutProvider.INSTANCE.activeKeyboardLayout; const mapping = currentKeymap.value[standardKeyboardEvent.code]; @@ -92,6 +105,10 @@ export class BrowserKeymap { } getCurrentKeyboardLayout() { + if (!this._initialized) { + return null; + } + return KeyboardLayoutProvider.INSTANCE.activeKeyboardLayout.layout; } @@ -125,12 +142,20 @@ export class BrowserKeyboardMapperFactory { private readonly _onDidChangeKeyboardMapper = new Emitter(); public readonly onDidChangeKeyboardMapper: Event = this._onDidChangeKeyboardMapper.event; + private readonly _onDidInitialized = new Emitter(); + public readonly onDidInitialized: Event = this._onDidInitialized.event; + private constructor() { this._layoutInfo = null; this._rawMapping = null; this._keyboardMapper = null; this._initialized = false; + BrowserKeymap.INSTANCE.onDidInitialized(() => { + this._initialized = true; + this._onKeyboardLayoutChanged(); + }); + BrowserKeymap.INSTANCE.onDidChangeKeyboardLayout(() => { this._onKeyboardLayoutChanged(); }); @@ -138,21 +163,24 @@ export class BrowserKeyboardMapperFactory { private _onKeyboardLayoutChanged(): void { if (this._initialized) { - this.updateKeyboardLayoutAsync(); + this.updateKeyboardLayoutAsync(true); } } - private updateKeyboardLayoutAsync() { + private updateKeyboardLayoutAsync(initialized: boolean) { + if (!initialized) { + return; + } + BrowserKeymap.INSTANCE.getBrowserKeyMap().then(keyMap => { KeyboardLayoutProvider.INSTANCE.setActive(keyMap); - this._setKeyboardData(BrowserKeymap.INSTANCE.getCurrentKeyboardLayout(), keyMap); + this._setKeyboardData(BrowserKeymap.INSTANCE.getCurrentKeyboardLayout()!, keyMap); }); } public getKeyboardMapper(dispatchConfig: DispatchConfig): IKeyboardMapper { if (!this._initialized) { - this._setKeyboardData(BrowserKeymap.INSTANCE.getCurrentKeyboardLayout(), {}); - this.updateKeyboardLayoutAsync(); + return new MacLinuxFallbackKeyboardMapper(OS); } if (dispatchConfig === DispatchConfig.KeyCode) { // Forcefully set to use keyCode @@ -164,26 +192,28 @@ export class BrowserKeyboardMapperFactory { public getCurrentKeyboardLayout(): IKeyboardLayoutInfo | null { if (!this._initialized) { - this._setKeyboardData(BrowserKeymap.INSTANCE.getCurrentKeyboardLayout(), {}); - this.updateKeyboardLayoutAsync(); + return null; } return this._layoutInfo; } public validateCurrentKeyboardMapping(keyboardEvent: IKeyboardEvent): void { + if (!this._initialized) { + return; + } + let isCurrentKeyboard = BrowserKeymap.INSTANCE.validateCurrentKeyboardMapping(keyboardEvent); if (isCurrentKeyboard) { return; } - this.updateKeyboardLayoutAsync(); + this.updateKeyboardLayoutAsync(true); } public getRawKeyboardMapping(): IKeyboardMapping | null { if (!this._initialized) { - this._setKeyboardData(BrowserKeymap.INSTANCE.getCurrentKeyboardLayout(), {}); - this.updateKeyboardLayoutAsync(); + return null; } return this._rawMapping; } From 0fb1b17d2363655ad03c053c77e1230c59695194 Mon Sep 17 00:00:00 2001 From: rebornix Date: Sun, 16 Jun 2019 15:38:19 -0700 Subject: [PATCH 0211/1449] Fix keymap lookup --- .../services/keybinding/browser/keyboardLayoutProvider.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayoutProvider.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayoutProvider.ts index c51e35f830f..5c90daec77a 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayoutProvider.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayoutProvider.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IKeyboardLayoutInfo } from 'vs/workbench/services/keybinding/common/keymapService'; +import { isWindows } from 'vs/base/common/platform'; function deserializeMapping(serializedMapping: ISerializedMapping) { let mapping = serializedMapping; @@ -73,6 +74,10 @@ export class KeyboardLayoutInfo { fuzzyEqual(other: IKeyboardMapping): boolean { for (let key in other) { + if (isWindows && (key === 'Backslash' || key === 'KeyQ')) { + // keymap from Chromium is probably wrong. + continue; + } if (this.value[key] === undefined) { return false; } From 6cb35a72acda3c36ecec335864ca313053557e46 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Sun, 16 Jun 2019 15:56:00 -0700 Subject: [PATCH 0212/1449] reload keymapper correctly after reload --- .../services/keybinding/browser/keyboardLayoutService.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts index aab36a31b07..cc5347b7d73 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts @@ -220,10 +220,6 @@ export class BrowserKeyboardMapperFactory { private _setKeyboardData(layoutInfo: IKeyboardLayoutInfo, rawMapping: IKeyboardMapping): void { this._layoutInfo = layoutInfo; - if (this._initialized && BrowserKeyboardMapperFactory._equals(this._rawMapping, rawMapping)) { - // nothing to do... - return; - } this._initialized = true; this._rawMapping = rawMapping; this._keyboardMapper = new CachedKeyboardMapper(BrowserKeyboardMapperFactory._createKeyboardMapper(this._layoutInfo, this._rawMapping)); From 4bbe9ce388bde8b62f617d402d583edfc4df1127 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Sun, 16 Jun 2019 15:57:40 -0700 Subject: [PATCH 0213/1449] remove unused code --- .../keybinding/browser/keyboardLayoutService.ts | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts index cc5347b7d73..08f03b6f1f7 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts @@ -10,11 +10,11 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { DispatchConfig } from 'vs/workbench/services/keybinding/common/dispatchConfig'; import { IKeyboardMapper, CachedKeyboardMapper } from 'vs/workbench/services/keybinding/common/keyboardMapper'; import { OS, OperatingSystem, isMacintosh, isWindows } from 'vs/base/common/platform'; -import { WindowsKeyboardMapper, windowsKeyboardMappingEquals } from 'vs/workbench/services/keybinding/common/windowsKeyboardMapper'; +import { WindowsKeyboardMapper } from 'vs/workbench/services/keybinding/common/windowsKeyboardMapper'; import { MacLinuxFallbackKeyboardMapper } from 'vs/workbench/services/keybinding/common/macLinuxFallbackKeyboardMapper'; import { IKeyboardEvent } from 'vs/platform/keybinding/common/keybinding'; import { KeyCodeUtils, KeyCode } from 'vs/base/common/keyCodes'; -import { IMacLinuxKeyboardMapping, MacLinuxKeyboardMapper, macLinuxKeyboardMappingEquals } from 'vs/workbench/services/keybinding/common/macLinuxKeyboardMapper'; +import { IMacLinuxKeyboardMapping, MacLinuxKeyboardMapper } from 'vs/workbench/services/keybinding/common/macLinuxKeyboardMapper'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { KeyboardLayoutProvider } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; @@ -252,13 +252,6 @@ export class BrowserKeyboardMapperFactory { return new MacLinuxKeyboardMapper(isUSStandard, rawMapping, OS); } - - private static _equals(a: IKeyboardMapping | null, b: IKeyboardMapping | null): boolean { - if (OS === OperatingSystem.Windows) { - return windowsKeyboardMappingEquals(a, b); - } - return macLinuxKeyboardMappingEquals(a, b); - } } From e9a657d289911b155001b274412b79b42e52f769 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Sun, 16 Jun 2019 16:06:43 -0700 Subject: [PATCH 0214/1449] Remove BrowserKeymapLayer --- .../browser/keyboardLayoutService.ts | 223 ++++++++---------- 1 file changed, 92 insertions(+), 131 deletions(-) diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts index 08f03b6f1f7..86d912beeed 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts @@ -16,123 +16,8 @@ import { IKeyboardEvent } from 'vs/platform/keybinding/common/keybinding'; import { KeyCodeUtils, KeyCode } from 'vs/base/common/keyCodes'; import { IMacLinuxKeyboardMapping, MacLinuxKeyboardMapper } from 'vs/workbench/services/keybinding/common/macLinuxKeyboardMapper'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; - import { KeyboardLayoutProvider } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; -export class BrowserKeymap { - public static readonly INSTANCE: BrowserKeymap = new BrowserKeymap(); - - private readonly _onDidChangeKeyboardLayout = new Emitter(); - public readonly onDidChangeKeyboardLayout: Event = this._onDidChangeKeyboardLayout.event; - - private readonly _onDidInitialized = new Emitter(); - public readonly onDidInitialized: Event = this._onDidInitialized.event; - - private _initialized: boolean; - - private constructor() { - this._initialized = false; - const platform = isWindows ? 'win' : isMacintosh ? 'darwin' : 'linux'; - - import('vs/workbench/services/keybinding/browser/keyboardlayouts/layout.contribution.' + platform).then(() => { - this._initialized = true; - this._onDidInitialized.fire(); - }); - - if ((navigator as any).keyboard && (navigator as any).keyboard.addEventListener) { - (navigator as any).keyboard.addEventListener('layoutchange', () => { - // Update user keyboard map settings - this.getBrowserKeyMap().then((keymap: IKeyboardMapping) => { - if (KeyboardLayoutProvider.INSTANCE.isActive(keymap)) { - return; - } - - this._onDidChangeKeyboardLayout.fire(); - }); - }); - } - - - } - - validateCurrentKeyboardMapping(keyboardEvent: IKeyboardEvent): boolean { - if (!this._initialized) { - return true; - } - - const standardKeyboardEvent = keyboardEvent as StandardKeyboardEvent; - const currentKeymap = KeyboardLayoutProvider.INSTANCE.activeKeyboardLayout; - const mapping = currentKeymap.value[standardKeyboardEvent.code]; - - if (!mapping) { - return false; - } - - if (mapping.value === '') { - // we don't undetstand - if (keyboardEvent.ctrlKey || keyboardEvent.metaKey) { - setTimeout(() => { - this.getBrowserKeyMap().then((keymap: IKeyboardMapping) => { - if (KeyboardLayoutProvider.INSTANCE.isActive(keymap)) { - return; - } - - this._onDidChangeKeyboardLayout.fire(); - }); - }, 350); - } - return true; - } - - const expectedValue = standardKeyboardEvent.altKey && standardKeyboardEvent.shiftKey ? mapping.withShiftAltGr : - standardKeyboardEvent.altKey ? mapping.withAltGr : - standardKeyboardEvent.shiftKey ? mapping.withShift : mapping.value; - - const isDead = (standardKeyboardEvent.altKey && standardKeyboardEvent.shiftKey && mapping.withShiftAltGrIsDeadKey) || - (standardKeyboardEvent.altKey && mapping.withAltGrIsDeadKey) || - (standardKeyboardEvent.shiftKey && mapping.withShiftIsDeadKey) || - mapping.valueIsDeadKey; - - if (isDead && standardKeyboardEvent.browserEvent.key !== 'Dead') { - return false; - } - - if (!isDead && standardKeyboardEvent.browserEvent.key !== expectedValue) { - return false; - } - - return true; - } - - getCurrentKeyboardLayout() { - if (!this._initialized) { - return null; - } - - return KeyboardLayoutProvider.INSTANCE.activeKeyboardLayout.layout; - } - - async getBrowserKeyMap() { - if ((navigator as any).keyboard) { - return (navigator as any).keyboard.getLayoutMap().then((e: any) => { - let ret: IKeyboardMapping = {}; - for (let key of e) { - ret[key[0]] = { - 'value': key[1], - 'withShift': '', - 'withAltGr': '', - 'withShiftAltGr': '' - }; - } - - return KeyboardLayoutProvider.INSTANCE.getMatchedKeyboardLayout(ret).value; - }); - } - - return {}; - } -} - export class BrowserKeyboardMapperFactory { public static readonly INSTANCE = new BrowserKeyboardMapperFactory(); private _layoutInfo: IKeyboardLayoutInfo | null; @@ -142,39 +27,46 @@ export class BrowserKeyboardMapperFactory { private readonly _onDidChangeKeyboardMapper = new Emitter(); public readonly onDidChangeKeyboardMapper: Event = this._onDidChangeKeyboardMapper.event; - private readonly _onDidInitialized = new Emitter(); - public readonly onDidInitialized: Event = this._onDidInitialized.event; - private constructor() { this._layoutInfo = null; this._rawMapping = null; this._keyboardMapper = null; this._initialized = false; - BrowserKeymap.INSTANCE.onDidInitialized(() => { + const platform = isWindows ? 'win' : isMacintosh ? 'darwin' : 'linux'; + + import('vs/workbench/services/keybinding/browser/keyboardlayouts/layout.contribution.' + platform).then(() => { this._initialized = true; this._onKeyboardLayoutChanged(); }); - BrowserKeymap.INSTANCE.onDidChangeKeyboardLayout(() => { - this._onKeyboardLayoutChanged(); - }); - } + if ((navigator as any).keyboard && (navigator as any).keyboard.addEventListener) { + (navigator as any).keyboard.addEventListener('layoutchange', () => { + // Update user keyboard map settings + this.getBrowserKeyMap().then((keymap: IKeyboardMapping) => { + if (KeyboardLayoutProvider.INSTANCE.isActive(keymap)) { + return; + } - private _onKeyboardLayoutChanged(): void { - if (this._initialized) { - this.updateKeyboardLayoutAsync(true); + this._onKeyboardLayoutChanged(); + }); + }); } } - private updateKeyboardLayoutAsync(initialized: boolean) { + private _onKeyboardLayoutChanged(): void { + this._updateKeyboardLayoutAsync(this._initialized); + } + + private _updateKeyboardLayoutAsync(initialized: boolean) { if (!initialized) { return; } - BrowserKeymap.INSTANCE.getBrowserKeyMap().then(keyMap => { + this.getBrowserKeyMap().then(keyMap => { KeyboardLayoutProvider.INSTANCE.setActive(keyMap); - this._setKeyboardData(BrowserKeymap.INSTANCE.getCurrentKeyboardLayout()!, keyMap); + let currentKeyboardLayout = KeyboardLayoutProvider.INSTANCE.activeKeyboardLayout.layout; + this._setKeyboardData(currentKeyboardLayout, keyMap); }); } @@ -202,13 +94,62 @@ export class BrowserKeyboardMapperFactory { return; } - let isCurrentKeyboard = BrowserKeymap.INSTANCE.validateCurrentKeyboardMapping(keyboardEvent); + let isCurrentKeyboard = this._validateCurrentKeyboardMapping(keyboardEvent); if (isCurrentKeyboard) { return; } - this.updateKeyboardLayoutAsync(true); + this._updateKeyboardLayoutAsync(true); + } + + private _validateCurrentKeyboardMapping(keyboardEvent: IKeyboardEvent): boolean { + if (!this._initialized) { + return true; + } + + const standardKeyboardEvent = keyboardEvent as StandardKeyboardEvent; + const currentKeymap = KeyboardLayoutProvider.INSTANCE.activeKeyboardLayout; + const mapping = currentKeymap.value[standardKeyboardEvent.code]; + + if (!mapping) { + return false; + } + + if (mapping.value === '') { + // we don't undetstand + if (keyboardEvent.ctrlKey || keyboardEvent.metaKey) { + setTimeout(() => { + this.getBrowserKeyMap().then((keymap: IKeyboardMapping) => { + if (KeyboardLayoutProvider.INSTANCE.isActive(keymap)) { + return; + } + + this._onKeyboardLayoutChanged(); + }); + }, 350); + } + return true; + } + + const expectedValue = standardKeyboardEvent.altKey && standardKeyboardEvent.shiftKey ? mapping.withShiftAltGr : + standardKeyboardEvent.altKey ? mapping.withAltGr : + standardKeyboardEvent.shiftKey ? mapping.withShift : mapping.value; + + const isDead = (standardKeyboardEvent.altKey && standardKeyboardEvent.shiftKey && mapping.withShiftAltGrIsDeadKey) || + (standardKeyboardEvent.altKey && mapping.withAltGrIsDeadKey) || + (standardKeyboardEvent.shiftKey && mapping.withShiftIsDeadKey) || + mapping.valueIsDeadKey; + + if (isDead && standardKeyboardEvent.browserEvent.key !== 'Dead') { + return false; + } + + if (!isDead && standardKeyboardEvent.browserEvent.key !== expectedValue) { + return false; + } + + return true; } public getRawKeyboardMapping(): IKeyboardMapping | null { @@ -252,6 +193,26 @@ export class BrowserKeyboardMapperFactory { return new MacLinuxKeyboardMapper(isUSStandard, rawMapping, OS); } + + async getBrowserKeyMap() { + if ((navigator as any).keyboard) { + return (navigator as any).keyboard.getLayoutMap().then((e: any) => { + let ret: IKeyboardMapping = {}; + for (let key of e) { + ret[key[0]] = { + 'value': key[1], + 'withShift': '', + 'withAltGr': '', + 'withShiftAltGr': '' + }; + } + + return KeyboardLayoutProvider.INSTANCE.getMatchedKeyboardLayout(ret).value; + }); + } + + return {}; + } } From e39072b660666c5404d06def7f3ab3ebdbaf9258 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Sun, 16 Jun 2019 16:13:11 -0700 Subject: [PATCH 0215/1449] keyboard layout service is async in browser --- .../browser/keyboardLayoutProvider.ts | 8 ++++---- .../browser/keyboardLayoutService.ts | 19 ++++++++++++++++--- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayoutProvider.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayoutProvider.ts index 5c90daec77a..981b726fc66 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayoutProvider.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayoutProvider.ts @@ -224,10 +224,10 @@ export class KeyboardLayoutProvider { private _layoutInfos: KeyboardLayoutInfo[] = []; // private _mru: KeyboardLayoutInfo[] = []; - private _active: KeyboardLayoutInfo; + private _active: KeyboardLayoutInfo | null; private constructor() { - this._active = EN_US; + this._active = null; } registerKeyboardLayout(layout: KeyboardLayoutInfo) { @@ -246,7 +246,7 @@ export class KeyboardLayoutProvider { this._active = this.getMatchedKeyboardLayout(keymap); } - getMatchedKeyboardLayout(keymap: IKeyboardMapping): KeyboardLayoutInfo { + getMatchedKeyboardLayout(keymap: IKeyboardMapping): KeyboardLayoutInfo | null { // TODO go through mru list instead of _layoutInfos for (let i = 0; i < this._layoutInfos.length; i++) { if (this._layoutInfos[i].fuzzyEqual(keymap)) { @@ -254,7 +254,7 @@ export class KeyboardLayoutProvider { } } - return EN_US; + return null; } getKeyboardLayouts(): KeyboardLayoutInfo[] { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts index 86d912beeed..aa2ea26318d 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts @@ -65,8 +65,11 @@ export class BrowserKeyboardMapperFactory { this.getBrowserKeyMap().then(keyMap => { KeyboardLayoutProvider.INSTANCE.setActive(keyMap); - let currentKeyboardLayout = KeyboardLayoutProvider.INSTANCE.activeKeyboardLayout.layout; - this._setKeyboardData(currentKeyboardLayout, keyMap); + let currentKeyboardLayout = KeyboardLayoutProvider.INSTANCE.activeKeyboardLayout; + + if (currentKeyboardLayout) { + this._setKeyboardData(currentKeyboardLayout.layout, keyMap); + } }); } @@ -110,6 +113,10 @@ export class BrowserKeyboardMapperFactory { const standardKeyboardEvent = keyboardEvent as StandardKeyboardEvent; const currentKeymap = KeyboardLayoutProvider.INSTANCE.activeKeyboardLayout; + if (!currentKeymap) { + return true; + } + const mapping = currentKeymap.value[standardKeyboardEvent.code]; if (!mapping) { @@ -207,7 +214,13 @@ export class BrowserKeyboardMapperFactory { }; } - return KeyboardLayoutProvider.INSTANCE.getMatchedKeyboardLayout(ret).value; + const matchedKeyboardLayout = KeyboardLayoutProvider.INSTANCE.getMatchedKeyboardLayout(ret); + + if (matchedKeyboardLayout) { + return matchedKeyboardLayout.value; + } + + return {}; }); } From cc8341563d1bb78d8a7396dc854875e5df95d674 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Sun, 16 Jun 2019 16:34:11 -0700 Subject: [PATCH 0216/1449] mru cache for keyboard layouts --- .../browser/keyboardLayoutProvider.ts | 21 +++++++++++++++---- .../browser/keyboardLayoutService.ts | 5 +++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayoutProvider.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayoutProvider.ts index 981b726fc66..4b4bf1b564f 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayoutProvider.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayoutProvider.ts @@ -223,7 +223,7 @@ export class KeyboardLayoutProvider { public static readonly INSTANCE: KeyboardLayoutProvider = new KeyboardLayoutProvider(); private _layoutInfos: KeyboardLayoutInfo[] = []; - // private _mru: KeyboardLayoutInfo[] = []; + private _mru: KeyboardLayoutInfo[] = []; private _active: KeyboardLayoutInfo | null; private constructor() { @@ -232,6 +232,7 @@ export class KeyboardLayoutProvider { registerKeyboardLayout(layout: KeyboardLayoutInfo) { this._layoutInfos.push(layout); + this._mru = this._layoutInfos; } get activeKeyboardLayout() { @@ -244,13 +245,25 @@ export class KeyboardLayoutProvider { setActive(keymap: IKeyboardMapping) { this._active = this.getMatchedKeyboardLayout(keymap); + + if (!this._active) { + return; + } + const index = this._mru.indexOf(this._active); + + if (index === 0) { + return; + } + + this._mru.splice(index, 1); + this._mru.unshift(this._active); } getMatchedKeyboardLayout(keymap: IKeyboardMapping): KeyboardLayoutInfo | null { // TODO go through mru list instead of _layoutInfos - for (let i = 0; i < this._layoutInfos.length; i++) { - if (this._layoutInfos[i].fuzzyEqual(keymap)) { - return this._layoutInfos[i]; + for (let i = 0; i < this._mru.length; i++) { + if (this._mru[i].fuzzyEqual(keymap)) { + return this._mru[i]; } } diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts index aa2ea26318d..b459f0e5a9a 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts @@ -64,6 +64,10 @@ export class BrowserKeyboardMapperFactory { } this.getBrowserKeyMap().then(keyMap => { + // might be false positive + if (KeyboardLayoutProvider.INSTANCE.isActive(keyMap)) { + return; + } KeyboardLayoutProvider.INSTANCE.setActive(keyMap); let currentKeyboardLayout = KeyboardLayoutProvider.INSTANCE.activeKeyboardLayout; @@ -152,6 +156,7 @@ export class BrowserKeyboardMapperFactory { return false; } + // TODO, this assumption is wrong as `browserEvent.key` doesn't necessarily equal expectedValue from real keymap if (!isDead && standardKeyboardEvent.browserEvent.key !== expectedValue) { return false; } From 11b88a3323878a98b418e4efca77e7afabd50d01 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Sun, 16 Jun 2019 21:21:41 -0700 Subject: [PATCH 0217/1449] Remove ramya from auto issue assignment --- .github/classifier.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/classifier.yml b/.github/classifier.yml index 3236507a472..9581f82f716 100644 --- a/.github/classifier.yml +++ b/.github/classifier.yml @@ -52,7 +52,7 @@ editor-symbols: [], editor-textbuffer: [], editor-wrapping: [], - emmet: [ octref, ramya-rao-a ], + emmet: [ octref ], error-list: [], explorer-custom: [], extension-host: [], From bb0603c5730a2e9b4c05cd7f9cbea5d8afd094cd Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 17 Jun 2019 09:31:13 +0200 Subject: [PATCH 0218/1449] adopt more DisposableStore/MutableDisposable (#74922) --- .../platform/dialogs/browser/dialogService.ts | 10 ++-- src/vs/platform/progress/common/progress.ts | 24 ++++------ src/vs/platform/windows/common/windows.ts | 13 +++-- .../windows/electron-main/windowsService.ts | 15 +++--- .../workbench/api/common/extHostTreeViews.ts | 4 +- .../browser/actions/layoutActions.ts | 16 ++----- src/vs/workbench/browser/layout.ts | 10 ++-- .../parts/activitybar/activitybarActions.ts | 4 +- .../parts/activitybar/activitybarPart.ts | 9 ++-- .../workbench/browser/parts/compositeBar.ts | 1 + .../browser/parts/compositeBarActions.ts | 9 ++-- .../workbench/browser/parts/compositePart.ts | 11 ++--- .../browser/parts/editor/editorActions.ts | 12 ++--- .../browser/parts/editor/editorControl.ts | 16 ++----- .../browser/parts/editor/editorGroupView.ts | 15 +++--- .../browser/parts/editor/editorPart.ts | 10 ++-- .../browser/parts/editor/editorStatus.ts | 36 ++++++-------- .../browser/parts/editor/tabsTitleControl.ts | 13 +++-- .../browser/parts/editor/textDiffEditor.ts | 16 ++----- .../browser/parts/editor/titleControl.ts | 19 ++++---- .../notifications/notificationsToasts.ts | 32 ++++++------- .../notifications/notificationsViewer.ts | 48 +++++++++---------- .../browser/parts/panel/panelActions.ts | 26 ++-------- .../browser/parts/titlebar/titlebarPart.ts | 16 +++---- .../browser/parts/views/customView.ts | 35 +++++--------- src/vs/workbench/common/editor/editorGroup.ts | 14 +++--- .../common/editor/textEditorModel.ts | 15 ++---- .../contrib/debug/browser/callStackView.ts | 13 ++--- .../files/browser/editors/textFileEditor.ts | 13 ++--- .../files/browser/views/explorerView.ts | 18 +++---- .../files/browser/views/openEditorsView.ts | 12 ++--- .../contrib/files/common/dirtyFilesTracker.ts | 8 ++-- .../workbench/contrib/files/common/files.ts | 24 ++++------ .../quickopen/browser/commandsHandler.ts | 11 ++++- .../contrib/search/browser/searchView.ts | 12 ++--- src/vs/workbench/electron-browser/window.ts | 2 +- .../services/editor/browser/editorService.ts | 12 ++--- .../services/files/common/fileService.ts | 8 ++-- .../services/history/browser/history.ts | 14 +++--- .../textfile/common/textFileEditorModel.ts | 25 ++++------ 40 files changed, 265 insertions(+), 356 deletions(-) diff --git a/src/vs/platform/dialogs/browser/dialogService.ts b/src/vs/platform/dialogs/browser/dialogService.ts index 057ed24c053..d5cc82af884 100644 --- a/src/vs/platform/dialogs/browser/dialogService.ts +++ b/src/vs/platform/dialogs/browser/dialogService.ts @@ -12,7 +12,7 @@ import { Dialog } from 'vs/base/browser/ui/dialog/dialog'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { attachDialogStyler } from 'vs/platform/theme/common/styler'; -import { dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { DisposableStore } from 'vs/base/common/lifecycle'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { EventHelper } from 'vs/base/browser/dom'; @@ -70,7 +70,7 @@ export class DialogService implements IDialogService { async show(severity: Severity, message: string, buttons: string[], options?: IDialogOptions): Promise { this.logService.trace('DialogService#show', message); - const dialogDisposables: IDisposable[] = []; + const dialogDisposables = new DisposableStore(); const dialog = new Dialog( this.layoutService.container, message, @@ -84,11 +84,11 @@ export class DialogService implements IDialogService { } }); - dialogDisposables.push(dialog); - dialogDisposables.push(attachDialogStyler(dialog, this.themeService)); + dialogDisposables.add(dialog); + dialogDisposables.add(attachDialogStyler(dialog, this.themeService)); const choice = await dialog.show(); - dispose(dialogDisposables); + dialogDisposables.dispose(); return choice; } diff --git a/src/vs/platform/progress/common/progress.ts b/src/vs/platform/progress/common/progress.ts index cffb0fe749e..ac1259c91d2 100644 --- a/src/vs/platform/progress/common/progress.ts +++ b/src/vs/platform/progress/common/progress.ts @@ -5,7 +5,7 @@ import { createDecorator, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; -import { IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; +import { toDisposable, DisposableStore, Disposable } from 'vs/base/common/lifecycle'; import { IAction } from 'vs/base/common/actions'; export const IProgressService = createDecorator('progressService'); @@ -124,15 +124,17 @@ export interface IOperation { stop(): void; } -export class LongRunningOperation { +export class LongRunningOperation extends Disposable { private currentOperationId = 0; - private currentOperationDisposables: IDisposable[] = []; + private readonly currentOperationDisposables = this._register(new DisposableStore()); private currentProgressRunner: IProgressRunner; private currentProgressTimeout: any; constructor( private localProgressService: ILocalProgressService - ) { } + ) { + super(); + } start(progressDelay: number): IOperation { @@ -148,11 +150,9 @@ export class LongRunningOperation { } }, progressDelay); - this.currentOperationDisposables.push( - toDisposable(() => clearTimeout(this.currentProgressTimeout)), - toDisposable(() => newOperationToken.cancel()), - toDisposable(() => this.currentProgressRunner ? this.currentProgressRunner.done() : undefined) - ); + this.currentOperationDisposables.add(toDisposable(() => clearTimeout(this.currentProgressTimeout))); + this.currentOperationDisposables.add(toDisposable(() => newOperationToken.cancel())); + this.currentOperationDisposables.add(toDisposable(() => this.currentProgressRunner ? this.currentProgressRunner.done() : undefined)); return { id: newOperationId, @@ -168,11 +168,7 @@ export class LongRunningOperation { private doStop(operationId: number): void { if (this.currentOperationId === operationId) { - this.currentOperationDisposables = dispose(this.currentOperationDisposables); + this.currentOperationDisposables.clear(); } } - - dispose(): void { - this.currentOperationDisposables = dispose(this.currentOperationDisposables); - } } diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index d288f2f8b84..6110a4b6c70 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -13,7 +13,7 @@ import { IRecentlyOpened, IRecent } from 'vs/platform/history/common/history'; import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; import { ExportData } from 'vs/base/common/performance'; import { LogLevel } from 'vs/platform/log/common/log'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { DisposableStore, Disposable } from 'vs/base/common/lifecycle'; import { URI, UriComponents } from 'vs/base/common/uri'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { CancelablePromise, createCancelablePromise } from 'vs/base/common/async'; @@ -451,13 +451,15 @@ export interface IRunKeybindingInWindowRequest { userSettingsLabel: string; } -export class ActiveWindowManager implements IDisposable { +export class ActiveWindowManager extends Disposable { - private disposables: IDisposable[] = []; + private readonly disposables = this._register(new DisposableStore()); private firstActiveWindowIdPromise: CancelablePromise | undefined; private activeWindowId: number | undefined; constructor(@IWindowsService windowsService: IWindowsService) { + super(); + const onActiveWindowChange = Event.latch(Event.any(windowsService.onWindowOpen, windowsService.onWindowFocus)); onActiveWindowChange(this.setActiveWindow, this, this.disposables); @@ -478,10 +480,7 @@ export class ActiveWindowManager implements IDisposable { async getActiveClientId(): Promise { const id = this.firstActiveWindowIdPromise ? (await this.firstActiveWindowIdPromise) : this.activeWindowId; + return `window:${id}`; } - - dispose() { - this.disposables = dispose(this.disposables); - } } diff --git a/src/vs/platform/windows/electron-main/windowsService.ts b/src/vs/platform/windows/electron-main/windowsService.ts index 07d8e6071a9..ed90804f293 100644 --- a/src/vs/platform/windows/electron-main/windowsService.ts +++ b/src/vs/platform/windows/electron-main/windowsService.ts @@ -5,7 +5,7 @@ import * as nls from 'vs/nls'; import * as os from 'os'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { assign } from 'vs/base/common/objects'; import { URI } from 'vs/base/common/uri'; import product from 'vs/platform/product/node/product'; @@ -23,12 +23,13 @@ import { Schemas } from 'vs/base/common/network'; import { mnemonicButtonLabel } from 'vs/base/common/labels'; import { isMacintosh, isLinux } from 'vs/base/common/platform'; import { ILogService } from 'vs/platform/log/common/log'; +import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; -export class WindowsService implements IWindowsService, IURLHandler, IDisposable { +export class WindowsService extends Disposable implements IWindowsService, IURLHandler { - _serviceBrand: any; + _serviceBrand: ServiceIdentifier; - private disposables: IDisposable[] = []; + private readonly disposables = this._register(new DisposableStore()); private _activeWindowId: number | undefined; @@ -52,6 +53,8 @@ export class WindowsService implements IWindowsService, IURLHandler, IDisposable @IHistoryMainService private readonly historyService: IHistoryMainService, @ILogService private readonly logService: ILogService ) { + super(); + urlService.registerHandler(this); // remember last active window id @@ -460,8 +463,4 @@ export class WindowsService implements IWindowsService, IURLHandler, IDisposable return undefined; } - - dispose(): void { - this.disposables = dispose(this.disposables); - } } diff --git a/src/vs/workbench/api/common/extHostTreeViews.ts b/src/vs/workbench/api/common/extHostTreeViews.ts index e70b95021c4..ac0c9878b0e 100644 --- a/src/vs/workbench/api/common/extHostTreeViews.ts +++ b/src/vs/workbench/api/common/extHostTreeViews.ts @@ -442,7 +442,7 @@ class ExtHostTreeView extends Disposable { } private createTreeNode(element: T, extensionTreeItem: vscode.TreeItem, parent: TreeNode | Root): TreeNode { - const disposable: DisposableStore = new DisposableStore(); + const disposable = new DisposableStore(); const handle = this.createHandle(element, extensionTreeItem, parent); const icon = this.getLightIconPath(extensionTreeItem); const item = { @@ -464,7 +464,7 @@ class ExtHostTreeView extends Disposable { item, parent, children: undefined, - dispose() { disposable.dispose(); } + dispose(): void { disposable.dispose(); } }; } diff --git a/src/vs/workbench/browser/actions/layoutActions.ts b/src/vs/workbench/browser/actions/layoutActions.ts index 3c3f7710d61..9bffa5213e7 100644 --- a/src/vs/workbench/browser/actions/layoutActions.ts +++ b/src/vs/workbench/browser/actions/layoutActions.ts @@ -16,7 +16,7 @@ import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IEditorGroupsService, GroupOrientation } from 'vs/workbench/services/editor/common/editorGroupsService'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { KeyMod, KeyCode, KeyChord } from 'vs/base/common/keyCodes'; -import { dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { DisposableStore } from 'vs/base/common/lifecycle'; import { MenuBarVisibility } from 'vs/platform/windows/common/windows'; import { isWindows, isLinux } from 'vs/base/common/platform'; import { IsMacNativeContext } from 'vs/workbench/browser/contextkeys'; @@ -110,7 +110,7 @@ export class ToggleEditorLayoutAction extends Action { static readonly ID = 'workbench.action.toggleEditorGroupLayout'; static readonly LABEL = nls.localize('flipLayout', "Toggle Vertical/Horizontal Editor Layout"); - private toDispose: IDisposable[]; + private readonly toDispose = this._register(new DisposableStore()); constructor( id: string, @@ -119,8 +119,6 @@ export class ToggleEditorLayoutAction extends Action { ) { super(id, label); - this.toDispose = []; - this.class = 'flip-editor-layout'; this.updateEnablement(); @@ -128,8 +126,8 @@ export class ToggleEditorLayoutAction extends Action { } private registerListeners(): void { - this.toDispose.push(this.editorGroupService.onDidAddGroup(() => this.updateEnablement())); - this.toDispose.push(this.editorGroupService.onDidRemoveGroup(() => this.updateEnablement())); + this.toDispose.add(this.editorGroupService.onDidAddGroup(() => this.updateEnablement())); + this.toDispose.add(this.editorGroupService.onDidRemoveGroup(() => this.updateEnablement())); } private updateEnablement(): void { @@ -142,12 +140,6 @@ export class ToggleEditorLayoutAction extends Action { return Promise.resolve(); } - - dispose(): void { - this.toDispose = dispose(this.toDispose); - - super.dispose(); - } } CommandsRegistry.registerCommand('_workbench.editor.setGroupOrientation', function (accessor: ServicesAccessor, args: [GroupOrientation]) { diff --git a/src/vs/workbench/browser/layout.ts b/src/vs/workbench/browser/layout.ts index f9e16f717e4..e06870b2bb7 100644 --- a/src/vs/workbench/browser/layout.ts +++ b/src/vs/workbench/browser/layout.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { Event, Emitter } from 'vs/base/common/event'; import { EventType, addDisposableListener, addClass, removeClass, isAncestor, getClientArea, position, size, EventHelper } from 'vs/base/browser/dom'; import { onDidChangeFullscreen, isFullscreen, getZoomFactor } from 'vs/base/browser/browser'; @@ -159,7 +159,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi transitionedToCenteredEditorLayout: false, wasSideBarVisible: false, wasPanelVisible: false, - transitionDisposeables: [] as IDisposable[] + transitionDisposeables: new DisposableStore() }, // TODO @misolori remove before shipping stable @@ -582,7 +582,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi toggleZenMode(skipLayout?: boolean, restoring = false): void { this.state.zenMode.active = !this.state.zenMode.active; - this.state.zenMode.transitionDisposeables = dispose(this.state.zenMode.transitionDisposeables); + this.state.zenMode.transitionDisposeables.clear(); const setLineNumbers = (lineNumbers: any) => this.editorService.visibleTextEditorWidgets.forEach(editor => editor.updateOptions({ lineNumbers })); @@ -621,11 +621,11 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi if (config.hideLineNumbers) { setLineNumbers('off'); - this.state.zenMode.transitionDisposeables.push(this.editorService.onDidVisibleEditorsChange(() => setLineNumbers('off'))); + this.state.zenMode.transitionDisposeables.add(this.editorService.onDidVisibleEditorsChange(() => setLineNumbers('off'))); } if (config.hideTabs && this.editorGroupService.partOptions.showTabs) { - this.state.zenMode.transitionDisposeables.push(this.editorGroupService.enforcePartOptions({ showTabs: false })); + this.state.zenMode.transitionDisposeables.add(this.editorGroupService.enforcePartOptions({ showTabs: false })); } if (config.centerLayout) { diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts index 79d64736026..24d8fe70c7f 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts @@ -147,7 +147,7 @@ export class GlobalActivityActionViewItem extends ActivityActionViewItem { private showContextMenu(): void { const globalActivityActions: IAction[] = []; const globalActivityMenu = this.menuService.createMenu(MenuId.GlobalActivity, this.contextKeyService); - createAndFillInActionBarActions(globalActivityMenu, undefined, { primary: [], secondary: globalActivityActions }); + const actionsDisposable = createAndFillInActionBarActions(globalActivityMenu, undefined, { primary: [], secondary: globalActivityActions }); const containerPosition = DOM.getDomNodePagePosition(this.container); const location = { x: containerPosition.left + containerPosition.width / 2, y: containerPosition.top }; @@ -156,7 +156,7 @@ export class GlobalActivityActionViewItem extends ActivityActionViewItem { getActions: () => globalActivityActions, onHide: () => { globalActivityMenu.dispose(); - dispose(globalActivityActions); + dispose(actionsDisposable); } }); } diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index 175a5a6c935..d602a8ed768 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -15,7 +15,7 @@ import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IBadge } from 'vs/workbench/services/activity/common/activity'; import { IWorkbenchLayoutService, Parts, Position as SideBarPosition } from 'vs/workbench/services/layout/browser/layoutService'; import { IInstantiationService, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; -import { IDisposable, toDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IDisposable, toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { ToggleActivityBarVisibilityAction } from 'vs/workbench/browser/actions/layoutActions'; import { IThemeService, ITheme } from 'vs/platform/theme/common/themeService'; import { ACTIVITY_BAR_BACKGROUND, ACTIVITY_BAR_BORDER, ACTIVITY_BAR_FOREGROUND, ACTIVITY_BAR_BADGE_BACKGROUND, ACTIVITY_BAR_BADGE_FOREGROUND, ACTIVITY_BAR_DRAG_AND_DROP_BACKGROUND, ACTIVITY_BAR_INACTIVE_FOREGROUND } from 'vs/workbench/common/theme'; @@ -121,15 +121,13 @@ export class ActivitybarPart extends Part implements IActivityBarService { this._register(this.viewletService.onDidViewletClose(viewlet => this.compositeBar.deactivateComposite(viewlet.getId()))); // Extension registration - let disposables: IDisposable[] = []; + let disposables = this._register(new DisposableStore()); this._register(this.extensionService.onDidRegisterExtensions(() => { - disposables = dispose(disposables); + disposables.clear(); this.onDidRegisterExtensions(); this.compositeBar.onDidChange(() => this.saveCachedViewlets(), this, disposables); this.storageService.onDidChangeStorage(e => this.onDidStorageChange(e), this, disposables); })); - - this._register(toDisposable(() => dispose(disposables))); } private onDidRegisterExtensions(): void { @@ -172,6 +170,7 @@ export class ActivitybarPart extends Part implements IActivityBarService { private showGlobalActivity(badge: IBadge, clazz?: string): IDisposable { this.globalActivityAction.setBadge(badge, clazz); + return toDisposable(() => this.globalActivityAction.setBadge(undefined)); } diff --git a/src/vs/workbench/browser/parts/compositeBar.ts b/src/vs/workbench/browser/parts/compositeBar.ts index 4743b7e053e..69f53744b05 100644 --- a/src/vs/workbench/browser/parts/compositeBar.ts +++ b/src/vs/workbench/browser/parts/compositeBar.ts @@ -201,6 +201,7 @@ export class CompositeBar extends Widget implements ICompositeBar { const activity: ICompositeActivity = { badge, clazz, priority }; this.model.addActivity(compositeId, activity); + return toDisposable(() => this.model.removeActivity(compositeId, activity)); } diff --git a/src/vs/workbench/browser/parts/compositeBarActions.ts b/src/vs/workbench/browser/parts/compositeBarActions.ts index 34a0685818c..fe21d315410 100644 --- a/src/vs/workbench/browser/parts/compositeBarActions.ts +++ b/src/vs/workbench/browser/parts/compositeBarActions.ts @@ -8,7 +8,7 @@ import { Action } from 'vs/base/common/actions'; import * as dom from 'vs/base/browser/dom'; import { BaseActionViewItem, IBaseActionViewItemOptions, Separator } from 'vs/base/browser/ui/actionbar/actionbar'; import { ICommandService } from 'vs/platform/commands/common/commands'; -import { dispose, IDisposable, Disposable, toDisposable } from 'vs/base/common/lifecycle'; +import { dispose, toDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IThemeService, ITheme } from 'vs/platform/theme/common/themeService'; import { TextBadge, NumberBadge, IBadge, IconBadge, ProgressBadge } from 'vs/workbench/services/activity/common/activity'; @@ -130,7 +130,7 @@ export class ActivityActionViewItem extends BaseActionViewItem { protected options: IActivityActionViewItemOptions; private badgeContent: HTMLElement; - private badgeDisposable: IDisposable = Disposable.None; + private readonly badgeDisposable = this._register(new MutableDisposable()); private mouseUpTimeout: any; constructor( @@ -236,8 +236,7 @@ export class ActivityActionViewItem extends BaseActionViewItem { const badge = action.getBadge(); const clazz = action.getClass(); - this.badgeDisposable.dispose(); - this.badgeDisposable = Disposable.None; + this.badgeDisposable.clear(); dom.clearNode(this.badgeContent); dom.hide(this.badge); @@ -280,7 +279,7 @@ export class ActivityActionViewItem extends BaseActionViewItem { if (clazz) { dom.addClasses(this.badge, clazz); - this.badgeDisposable = toDisposable(() => dom.removeClasses(this.badge, clazz)); + this.badgeDisposable.value = toDisposable(() => dom.removeClasses(this.badge, clazz)); } } diff --git a/src/vs/workbench/browser/parts/compositePart.ts b/src/vs/workbench/browser/parts/compositePart.ts index 86ea39bde6a..8be3d84e29e 100644 --- a/src/vs/workbench/browser/parts/compositePart.ts +++ b/src/vs/workbench/browser/parts/compositePart.ts @@ -6,7 +6,7 @@ import 'vs/css!./media/compositepart'; import * as nls from 'vs/nls'; import { defaultGenerator } from 'vs/base/common/idGenerator'; -import { IDisposable, dispose, DisposableStore } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose, DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle'; import * as strings from 'vs/base/common/strings'; import { Emitter } from 'vs/base/common/event'; import * as errors from 'vs/base/common/errors'; @@ -68,7 +68,7 @@ export abstract class CompositePart extends Part { private titleLabel: ICompositeTitleLabel; private progressBar: ProgressBar; private contentAreaSize: Dimension; - private telemetryActionsListener: IDisposable | null; + private readonly telemetryActionsListener = this._register(new MutableDisposable()); private currentCompositeOpenToken: string; constructor( @@ -249,13 +249,8 @@ export abstract class CompositePart extends Part { } actionsBinding(); - if (this.telemetryActionsListener) { - this.telemetryActionsListener.dispose(); - this.telemetryActionsListener = null; - } - // Action Run Handling - this.telemetryActionsListener = this.toolBar.actionRunner.onDidRun(e => { + this.telemetryActionsListener.value = this.toolBar.actionRunner.onDidRun(e => { // Check for Error if (e.error && !errors.isPromiseCanceledError(e.error)) { diff --git a/src/vs/workbench/browser/parts/editor/editorActions.ts b/src/vs/workbench/browser/parts/editor/editorActions.ts index 7f7a5a58e53..ba90f283b0a 100644 --- a/src/vs/workbench/browser/parts/editor/editorActions.ts +++ b/src/vs/workbench/browser/parts/editor/editorActions.ts @@ -21,7 +21,7 @@ import { CLOSE_EDITOR_COMMAND_ID, NAVIGATE_ALL_EDITORS_GROUP_PREFIX, MOVE_ACTIVE import { IEditorGroupsService, IEditorGroup, GroupsArrangement, EditorsOrder, GroupLocation, GroupDirection, preferredSideBySideGroupDirection, IFindGroupScope, GroupOrientation, EditorGroupLayout, GroupsOrder } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { DisposableStore } from 'vs/base/common/lifecycle'; export class ExecuteCommandAction extends Action { @@ -41,7 +41,7 @@ export class ExecuteCommandAction extends Action { } export class BaseSplitEditorAction extends Action { - private toDispose: IDisposable[] = []; + private readonly toDispose = this._register(new DisposableStore()); private direction: GroupDirection; constructor( @@ -62,7 +62,7 @@ export class BaseSplitEditorAction extends Action { } private registerListeners(): void { - this.toDispose.push(this.configurationService.onDidChangeConfiguration(e => { + this.toDispose.add(this.configurationService.onDidChangeConfiguration(e => { if (e.affectsConfiguration('workbench.editor.openSideBySideDirection')) { this.direction = preferredSideBySideGroupDirection(this.configurationService); } @@ -74,12 +74,6 @@ export class BaseSplitEditorAction extends Action { return Promise.resolve(true); } - - dispose(): void { - super.dispose(); - - this.toDispose = dispose(this.toDispose); - } } export class SplitEditorAction extends BaseSplitEditorAction { diff --git a/src/vs/workbench/browser/parts/editor/editorControl.ts b/src/vs/workbench/browser/parts/editor/editorControl.ts index 1f70301f300..a3c50f7011a 100644 --- a/src/vs/workbench/browser/parts/editor/editorControl.ts +++ b/src/vs/workbench/browser/parts/editor/editorControl.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { dispose, Disposable, IDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { EditorInput, EditorOptions } from 'vs/workbench/common/editor'; import { Dimension, show, hide, addClass } from 'vs/base/browser/dom'; import { Registry } from 'vs/platform/registry/common/platform'; @@ -38,7 +38,7 @@ export class EditorControl extends Disposable { private _activeControl: BaseEditor | null; private controls: BaseEditor[] = []; - private activeControlDisposeables: IDisposable[] = []; + private readonly activeControlDisposeables = this._register(new DisposableStore()); private dimension: Dimension; private editorOperation: LongRunningOperation; @@ -139,12 +139,12 @@ export class EditorControl extends Disposable { this._activeControl = control; // Clear out previous active control listeners - this.activeControlDisposeables = dispose(this.activeControlDisposeables); + this.activeControlDisposeables.clear(); // Listen to control changes if (control) { - this.activeControlDisposeables.push(control.onDidSizeConstraintsChange(e => this._onDidSizeConstraintsChange.fire(e))); - this.activeControlDisposeables.push(control.onDidFocus(() => this._onDidFocus.fire())); + this.activeControlDisposeables.add(control.onDidSizeConstraintsChange(e => this._onDidSizeConstraintsChange.fire(e))); + this.activeControlDisposeables.add(control.onDidFocus(() => this._onDidFocus.fire())); } // Indicate that size constraints could have changed due to new editor @@ -228,10 +228,4 @@ export class EditorControl extends Disposable { this._activeControl.layout(this.dimension); } } - - dispose(): void { - this.activeControlDisposeables = dispose(this.activeControlDisposeables); - - super.dispose(); - } } diff --git a/src/vs/workbench/browser/parts/editor/editorGroupView.ts b/src/vs/workbench/browser/parts/editor/editorGroupView.ts index fb450decc71..5aa9e32bb4b 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupView.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupView.ts @@ -24,7 +24,7 @@ import { ILocalProgressService } from 'vs/platform/progress/common/progress'; import { LocalProgressService } from 'vs/workbench/services/progress/browser/localProgressService'; import { localize } from 'vs/nls'; import { isPromiseCanceledError } from 'vs/base/common/errors'; -import { dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { dispose, MutableDisposable } from 'vs/base/common/lifecycle'; import { Severity, INotificationService, INotificationActions } from 'vs/platform/notification/common/notification'; import { toErrorMessage } from 'vs/base/common/errorMessage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -216,15 +216,15 @@ export class EditorGroupView extends Themable implements IEditorGroupView { const groupActiveEditorDirtyContextKey = EditorGroupActiveEditorDirtyContext.bindTo(contextKeyServcie); const groupEditorsCountContext = EditorGroupEditorsCountContext.bindTo(contextKeyServcie); - let activeEditorListener: IDisposable; + let activeEditorListener = new MutableDisposable(); const observeActiveEditor = () => { - dispose(activeEditorListener); + activeEditorListener.clear(); const activeEditor = this._group.activeEditor; if (activeEditor) { groupActiveEditorDirtyContextKey.set(activeEditor.isDirty()); - activeEditorListener = activeEditor.onDidChangeDirty(() => groupActiveEditorDirtyContextKey.set(activeEditor.isDirty())); + activeEditorListener.value = activeEditor.onDidChangeDirty(() => groupActiveEditorDirtyContextKey.set(activeEditor.isDirty())); } else { groupActiveEditorDirtyContextKey.set(false); } @@ -321,13 +321,16 @@ export class EditorGroupView extends Themable implements IEditorGroupView { // Fill in contributed actions const actions: IAction[] = []; - createAndFillInContextMenuActions(menu, undefined, actions, this.contextMenuService); + const actionsDisposable = createAndFillInContextMenuActions(menu, undefined, actions, this.contextMenuService); // Show it this.contextMenuService.showContextMenu({ getAnchor: () => anchor, getActions: () => actions, - onHide: () => this.focus() + onHide: () => { + this.focus(); + dispose(actionsDisposable); + } }); } diff --git a/src/vs/workbench/browser/parts/editor/editorPart.ts b/src/vs/workbench/browser/parts/editor/editorPart.ts index aa10002efb7..810b2aa3ab7 100644 --- a/src/vs/workbench/browser/parts/editor/editorPart.ts +++ b/src/vs/workbench/browser/parts/editor/editorPart.ts @@ -19,7 +19,7 @@ import { distinct, coalesce } from 'vs/base/common/arrays'; import { IEditorGroupsAccessor, IEditorGroupView, getEditorPartOptions, impactsEditorPartOptions, IEditorPartOptionsChangeEvent, IEditorPartCreationOptions } from 'vs/workbench/browser/parts/editor/editor'; import { EditorGroupView } from 'vs/workbench/browser/parts/editor/editorGroupView'; import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; -import { IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose, toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { assign } from 'vs/base/common/objects'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { ISerializedEditorGroup, isSerializedEditorGroup } from 'vs/workbench/common/editor/editorGroup'; @@ -521,13 +521,13 @@ export class EditorPart extends Part implements IEditorGroupsService, IEditorGro this.groupViews.set(groupView.id, groupView); // Track focus - let groupDisposables: IDisposable[] = []; - groupDisposables.push(groupView.onDidFocus(() => { + let groupDisposables = new DisposableStore(); + groupDisposables.add(groupView.onDidFocus(() => { this.doSetGroupActive(groupView); })); // Track editor change - groupDisposables.push(groupView.onDidGroupChange(e => { + groupDisposables.add(groupView.onDidGroupChange(e => { if (e.kind === GroupChangeKind.EDITOR_ACTIVE) { this.updateContainer(); } @@ -535,7 +535,7 @@ export class EditorPart extends Part implements IEditorGroupsService, IEditorGro // Track dispose Event.once(groupView.onWillDispose)(() => { - groupDisposables = dispose(groupDisposables); + dispose(groupDisposables); this.groupViews.delete(groupView.id); this.doUpdateMostRecentActive(groupView); }); diff --git a/src/vs/workbench/browser/parts/editor/editorStatus.ts b/src/vs/workbench/browser/parts/editor/editorStatus.ts index f05599325a6..9fc2e6ca564 100644 --- a/src/vs/workbench/browser/parts/editor/editorStatus.ts +++ b/src/vs/workbench/browser/parts/editor/editorStatus.ts @@ -14,7 +14,7 @@ import { Action } from 'vs/base/common/actions'; import { Language } from 'vs/base/common/platform'; import { UntitledEditorInput } from 'vs/workbench/common/editor/untitledEditorInput'; import { IFileEditorInput, EncodingMode, IEncodingSupport, toResource, SideBySideEditorInput, IEditor as IBaseEditor, IEditorInput, SideBySideEditor, IModeSupport } from 'vs/workbench/common/editor'; -import { IDisposable, dispose, Disposable, MutableDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, MutableDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; import { IEditorAction } from 'vs/editor/common/editorCommon'; import { EndOfLineSequence } from 'vs/editor/common/model'; @@ -286,8 +286,8 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution { private readonly metadataElement = this._register(new MutableDisposable()); private readonly state = new State(); - private readonly activeEditorListeners: IDisposable[] = []; - private delayedRender: IDisposable | null = null; + private readonly activeEditorListeners = this._register(new DisposableStore()); + private readonly delayedRender = this._register(new MutableDisposable()); private toRender: StateChange | null = null; private screenReaderNotification: INotificationHandle | null = null; private promptedScreenReader: boolean = false; @@ -514,8 +514,9 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution { if (!this.toRender) { this.toRender = changed; - this.delayedRender = runAtThisOrScheduleAtNextAnimationFrame(() => { - this.delayedRender = null; + this.delayedRender.value = runAtThisOrScheduleAtNextAnimationFrame(() => { + this.delayedRender.clear(); + const toRender = this.toRender; this.toRender = null; if (toRender) { @@ -576,30 +577,30 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution { this.onMetadataChange(activeControl); // Dispose old active editor listeners - dispose(this.activeEditorListeners); + this.activeEditorListeners.clear(); // Attach new listeners to active editor if (activeCodeEditor) { // Hook Listener for Configuration changes - this.activeEditorListeners.push(activeCodeEditor.onDidChangeConfiguration((event: IConfigurationChangedEvent) => { + this.activeEditorListeners.add(activeCodeEditor.onDidChangeConfiguration((event: IConfigurationChangedEvent) => { if (event.accessibilitySupport) { this.onScreenReaderModeChange(activeCodeEditor); } })); // Hook Listener for Selection changes - this.activeEditorListeners.push(activeCodeEditor.onDidChangeCursorPosition((event: ICursorPositionChangedEvent) => { + this.activeEditorListeners.add(activeCodeEditor.onDidChangeCursorPosition((event: ICursorPositionChangedEvent) => { this.onSelectionChange(activeCodeEditor); })); // Hook Listener for mode changes - this.activeEditorListeners.push(activeCodeEditor.onDidChangeModelLanguage((event: IModelLanguageChangedEvent) => { + this.activeEditorListeners.add(activeCodeEditor.onDidChangeModelLanguage((event: IModelLanguageChangedEvent) => { this.onModeChange(activeCodeEditor); })); // Hook Listener for content changes - this.activeEditorListeners.push(activeCodeEditor.onDidChangeModelContent((e) => { + this.activeEditorListeners.add(activeCodeEditor.onDidChangeModelContent((e) => { this.onEOLChange(activeCodeEditor); const selections = activeCodeEditor.getSelections(); @@ -614,7 +615,7 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution { })); // Hook Listener for content options changes - this.activeEditorListeners.push(activeCodeEditor.onDidChangeModelOptions((event: IModelOptionsChangedEvent) => { + this.activeEditorListeners.add(activeCodeEditor.onDidChangeModelOptions((event: IModelOptionsChangedEvent) => { this.onIndentationChange(activeCodeEditor); })); } @@ -637,11 +638,11 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution { } binaryEditors.forEach(editor => { - this.activeEditorListeners.push(editor.onMetadataChanged(metadata => { + this.activeEditorListeners.add(editor.onMetadataChanged(metadata => { this.onMetadataChange(activeControl); })); - this.activeEditorListeners.push(editor.onDidOpenInPlace(() => { + this.activeEditorListeners.add(editor.onDidOpenInPlace(() => { this.updateStatusBar(); })); }); @@ -812,15 +813,6 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution { return !!activeControl && activeControl === control; } - - dispose(): void { - super.dispose(); - - if (this.delayedRender) { - this.delayedRender.dispose(); - this.delayedRender = null; - } - } } function isWritableCodeEditor(codeEditor: ICodeEditor | undefined): boolean { diff --git a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts index 7578bda2fc2..667ec403730 100644 --- a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts +++ b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts @@ -20,7 +20,7 @@ import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IMenuService } from 'vs/platform/actions/common/actions'; import { TitleControl } from 'vs/workbench/browser/parts/editor/titleControl'; import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; -import { IDisposable, dispose, DisposableStore, combinedDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose, DisposableStore, combinedDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { ScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement'; import { ScrollbarVisibility } from 'vs/base/common/scrollable'; import { getOrSet } from 'vs/base/common/map'; @@ -64,7 +64,7 @@ export class TabsTitleControl extends TitleControl { private tabDisposeables: IDisposable[] = []; private dimension: Dimension; - private layoutScheduled?: IDisposable; + private readonly layoutScheduled = this._register(new MutableDisposable()); private blockRevealActiveTab: boolean; constructor( @@ -996,10 +996,10 @@ export class TabsTitleControl extends TitleControl { // The layout of tabs can be an expensive operation because we access DOM properties // that can result in the browser doing a full page layout to validate them. To buffer // this a little bit we try at least to schedule this work on the next animation frame. - if (!this.layoutScheduled) { - this.layoutScheduled = scheduleAtNextAnimationFrame(() => { + if (!this.layoutScheduled.value) { + this.layoutScheduled.value = scheduleAtNextAnimationFrame(() => { this.doLayout(this.dimension); - this.layoutScheduled = undefined; + this.layoutScheduled.clear(); }); } } @@ -1149,8 +1149,7 @@ export class TabsTitleControl extends TitleControl { dispose(): void { super.dispose(); - dispose(this.layoutScheduled); - this.layoutScheduled = undefined; + this.tabDisposeables = dispose(this.tabDisposeables); } } diff --git a/src/vs/workbench/browser/parts/editor/textDiffEditor.ts b/src/vs/workbench/browser/parts/editor/textDiffEditor.ts index 3c7045c94a3..ac833ec7818 100644 --- a/src/vs/workbench/browser/parts/editor/textDiffEditor.ts +++ b/src/vs/workbench/browser/parts/editor/textDiffEditor.ts @@ -22,7 +22,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ITextFileService, TextFileOperationError, TextFileOperationResult } from 'vs/workbench/services/textfile/common/textfiles'; import { ScrollType, IDiffEditorViewState, IDiffEditorModel } from 'vs/editor/common/editorCommon'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { DisposableStore } from 'vs/base/common/lifecycle'; import { Registry } from 'vs/platform/registry/common/platform'; import { URI } from 'vs/base/common/uri'; import { Event } from 'vs/base/common/event'; @@ -40,7 +40,7 @@ export class TextDiffEditor extends BaseTextEditor implements ITextDiffEditor { static readonly ID = TEXT_DIFF_EDITOR_ID; private diffNavigator: DiffNavigator; - private diffNavigatorDisposables: IDisposable[] = []; + private readonly diffNavigatorDisposables = this._register(new DisposableStore()); constructor( @ITelemetryService telemetryService: ITelemetryService, @@ -75,7 +75,7 @@ export class TextDiffEditor extends BaseTextEditor implements ITextDiffEditor { async setInput(input: EditorInput, options: EditorOptions, token: CancellationToken): Promise { // Dispose previous diff navigator - this.diffNavigatorDisposables = dispose(this.diffNavigatorDisposables); + this.diffNavigatorDisposables.clear(); // Remember view settings if input changes this.saveTextDiffEditorViewState(this.input); @@ -117,7 +117,7 @@ export class TextDiffEditor extends BaseTextEditor implements ITextDiffEditor { this.diffNavigator = new DiffNavigator(diffEditor, { alwaysRevealFirst: !optionsGotApplied && !hasPreviousViewState // only reveal first change if we had no options or viewstate }); - this.diffNavigatorDisposables.push(this.diffNavigator); + this.diffNavigatorDisposables.add(this.diffNavigator); // Readonly flag diffEditor.updateOptions({ readOnly: resolvedDiffEditorModel.isReadonly() }); @@ -238,7 +238,7 @@ export class TextDiffEditor extends BaseTextEditor implements ITextDiffEditor { clearInput(): void { // Dispose previous diff navigator - this.diffNavigatorDisposables = dispose(this.diffNavigatorDisposables); + this.diffNavigatorDisposables.clear(); // Keep editor view state in settings to restore when coming back this.saveTextDiffEditorViewState(this.input); @@ -330,10 +330,4 @@ export class TextDiffEditor extends BaseTextEditor implements ITextDiffEditor { // create a URI that is the Base64 concatenation of original + modified resource return URI.from({ scheme: 'diff', path: `${btoa(original.toString())}${btoa(modified.toString())}` }); } - - dispose(): void { - this.diffNavigatorDisposables = dispose(this.diffNavigatorDisposables); - - super.dispose(); - } } diff --git a/src/vs/workbench/browser/parts/editor/titleControl.ts b/src/vs/workbench/browser/parts/editor/titleControl.ts index c0934ae5f06..6bd8f1f83d7 100644 --- a/src/vs/workbench/browser/parts/editor/titleControl.ts +++ b/src/vs/workbench/browser/parts/editor/titleControl.ts @@ -11,7 +11,7 @@ import { ToolBar } from 'vs/base/browser/ui/toolbar/toolbar'; import { IAction, IRunEvent } from 'vs/base/common/actions'; import * as arrays from 'vs/base/common/arrays'; import { ResolvedKeybinding } from 'vs/base/common/keyCodes'; -import { dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { dispose, DisposableStore } from 'vs/base/common/lifecycle'; import 'vs/css!./media/titlecontrol'; import { getCodeEditor } from 'vs/editor/browser/editorBrowser'; import { localize } from 'vs/nls'; @@ -56,12 +56,13 @@ export abstract class TitleControl extends Themable { private currentPrimaryEditorActionIds: string[] = []; private currentSecondaryEditorActionIds: string[] = []; + protected editorActionsToolbar: ToolBar; private resourceContext: ResourceContextKey; private editorPinnedContext: IContextKey; - private editorToolBarMenuDisposables: IDisposable[] = []; + private readonly editorToolBarMenuDisposables = this._register(new DisposableStore()); private contextMenu: IMenu; @@ -222,7 +223,7 @@ export abstract class TitleControl extends Themable { const secondary: IAction[] = []; // Dispose previous listeners - this.editorToolBarMenuDisposables = dispose(this.editorToolBarMenuDisposables); + this.editorToolBarMenuDisposables.clear(); // Update contexts this.resourceContext.set(this.group.activeEditor ? withUndefinedAsNull(toResource(this.group.activeEditor, { supportSideBySide: SideBySideEditor.MASTER })) : null); @@ -234,12 +235,12 @@ export abstract class TitleControl extends Themable { const codeEditor = getCodeEditor(activeControl.getControl()); const scopedContextKeyService = codeEditor && codeEditor.invokeWithinContext(accessor => accessor.get(IContextKeyService)) || this.contextKeyService; const titleBarMenu = this.menuService.createMenu(MenuId.EditorTitle, scopedContextKeyService); - this.editorToolBarMenuDisposables.push(titleBarMenu); - this.editorToolBarMenuDisposables.push(titleBarMenu.onDidChange(() => { + this.editorToolBarMenuDisposables.add(titleBarMenu); + this.editorToolBarMenuDisposables.add(titleBarMenu.onDidChange(() => { this.updateEditorActionsToolbar(); // Update editor toolbar whenever contributed actions change })); - createAndFillInActionBarActions(titleBarMenu, { arg: this.resourceContext.get(), shouldForwardArgs: true }, { primary, secondary }); + this.editorToolBarMenuDisposables.add(createAndFillInActionBarActions(titleBarMenu, { arg: this.resourceContext.get(), shouldForwardArgs: true }, { primary, secondary })); } return { primary, secondary }; @@ -306,7 +307,7 @@ export abstract class TitleControl extends Themable { // Fill in contributed actions const actions: IAction[] = []; - createAndFillInContextMenuActions(this.contextMenu, { shouldForwardArgs: true, arg: this.resourceContext.get() }, actions, this.contextMenuService); + const actionsDisposable = createAndFillInContextMenuActions(this.contextMenu, { shouldForwardArgs: true, arg: this.resourceContext.get() }, actions, this.contextMenuService); // Show it this.contextMenuService.showContextMenu({ @@ -322,6 +323,9 @@ export abstract class TitleControl extends Themable { // restore focus to active group this.accessor.activeGroup.focus(); + + // Cleanup + dispose(actionsDisposable); } }); } @@ -373,7 +377,6 @@ export abstract class TitleControl extends Themable { dispose(): void { dispose(this.breadcrumbsControl); this.breadcrumbsControl = undefined; - this.editorToolBarMenuDisposables = dispose(this.editorToolBarMenuDisposables); super.dispose(); } diff --git a/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts b/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts index 707ce0440ea..26b7cebe885 100644 --- a/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts +++ b/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts @@ -5,7 +5,7 @@ import 'vs/css!./media/notificationsToasts'; import { INotificationsModel, NotificationChangeType, INotificationChangeEvent, INotificationViewItem, NotificationViewItemLabelKind } from 'vs/workbench/common/notifications'; -import { IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose, toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { addClass, removeClass, isAncestor, addDisposableListener, EventType, Dimension } from 'vs/base/browser/dom'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { NotificationsList } from 'vs/workbench/browser/parts/notifications/notificationsList'; @@ -29,7 +29,7 @@ interface INotificationToast { list: NotificationsList; container: HTMLElement; toast: HTMLElement; - disposeables: IDisposable[]; + toDispose: DisposableStore; } enum ToastVisibility { @@ -135,7 +135,7 @@ export class NotificationsToasts extends Themable { // Make Visible addClass(this.notificationsToastsContainer, 'visible'); - const itemDisposeables: IDisposable[] = []; + const itemDisposeables = new DisposableStore(); // Container const notificationToastContainer = document.createElement('div'); @@ -158,12 +158,12 @@ export class NotificationsToasts extends Themable { ariaLabel: localize('notificationsToast', "Notification Toast"), verticalScrollMode: ScrollbarVisibility.Hidden }); - itemDisposeables.push(notificationList); + itemDisposeables.add(notificationList); - const toast: INotificationToast = { item, list: notificationList, container: notificationToastContainer, toast: notificationToast, disposeables: itemDisposeables }; + const toast: INotificationToast = { item, list: notificationList, container: notificationToastContainer, toast: notificationToast, toDispose: itemDisposeables }; this.mapNotificationToToast.set(item, toast); - itemDisposeables.push(toDisposable(() => { + itemDisposeables.add(toDisposable(() => { if (this.isVisible(toast)) { this.notificationsToastsContainer.removeChild(toast.container); } @@ -184,12 +184,12 @@ export class NotificationsToasts extends Themable { this.layoutContainer(maxDimensions.height); // Update when item height changes due to expansion - itemDisposeables.push(item.onDidExpansionChange(() => { + itemDisposeables.add(item.onDidExpansionChange(() => { notificationList.updateNotificationsList(0, 1, [item]); })); // Update when item height potentially changes due to label changes - itemDisposeables.push(item.onDidLabelChange(e => { + itemDisposeables.add(item.onDidLabelChange(e => { if (!item.expanded) { return; // dynamic height only applies to expanded notifications } @@ -215,18 +215,18 @@ export class NotificationsToasts extends Themable { // Animate in addClass(notificationToast, 'notification-fade-in'); - itemDisposeables.push(addDisposableListener(notificationToast, 'transitionend', () => { + itemDisposeables.add(addDisposableListener(notificationToast, 'transitionend', () => { removeClass(notificationToast, 'notification-fade-in'); addClass(notificationToast, 'notification-fade-in-done'); })); } - private purgeNotification(item: INotificationViewItem, notificationToastContainer: HTMLElement, notificationList: NotificationsList, disposables: IDisposable[]): void { + private purgeNotification(item: INotificationViewItem, notificationToastContainer: HTMLElement, notificationList: NotificationsList, disposables: DisposableStore): void { // Track mouse over item let isMouseOverToast = false; - disposables.push(addDisposableListener(notificationToastContainer, EventType.MOUSE_OVER, () => isMouseOverToast = true)); - disposables.push(addDisposableListener(notificationToastContainer, EventType.MOUSE_OUT, () => isMouseOverToast = false)); + disposables.add(addDisposableListener(notificationToastContainer, EventType.MOUSE_OVER, () => isMouseOverToast = true)); + disposables.add(addDisposableListener(notificationToastContainer, EventType.MOUSE_OUT, () => isMouseOverToast = false)); // Install Timers to Purge Notification let purgeTimeoutHandle: any; @@ -248,7 +248,7 @@ export class NotificationsToasts extends Themable { hideAfterTimeout(); } }); - disposables.push(listener); + disposables.add(listener); } } @@ -267,7 +267,7 @@ export class NotificationsToasts extends Themable { hideAfterTimeout(); - disposables.push(toDisposable(() => clearTimeout(purgeTimeoutHandle))); + disposables.add(toDisposable(() => clearTimeout(purgeTimeoutHandle))); } private removeToast(item: INotificationViewItem): void { @@ -280,7 +280,7 @@ export class NotificationsToasts extends Themable { } // Listeners - dispose(notificationToast.disposeables); + dispose(notificationToast.toDispose); // Remove from Map this.mapNotificationToToast.delete(item); @@ -303,7 +303,7 @@ export class NotificationsToasts extends Themable { } private removeToasts(): void { - this.mapNotificationToToast.forEach(toast => dispose(toast.disposeables)); + this.mapNotificationToToast.forEach(toast => dispose(toast.toDispose)); this.mapNotificationToToast.clear(); this.doHide(); diff --git a/src/vs/workbench/browser/parts/notifications/notificationsViewer.ts b/src/vs/workbench/browser/parts/notifications/notificationsViewer.ts index 918fafdc244..24a1c8ca822 100644 --- a/src/vs/workbench/browser/parts/notifications/notificationsViewer.ts +++ b/src/vs/workbench/browser/parts/notifications/notificationsViewer.ts @@ -14,7 +14,7 @@ import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { IAction, IActionRunner } from 'vs/base/common/actions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { dispose, DisposableStore, Disposable } from 'vs/base/common/lifecycle'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { DropdownMenuActionViewItem } from 'vs/base/browser/ui/dropdown/dropdown'; import { INotificationViewItem, NotificationViewItem, NotificationViewItemLabelKind, INotificationMessage, ChoiceAction } from 'vs/workbench/common/notifications'; @@ -111,7 +111,7 @@ export class NotificationsListDelegate implements IListVirtualDelegate void; - disposeables: IDisposable[]; + toDispose: DisposableStore; } class NotificationMessageRenderer { @@ -157,7 +157,7 @@ class NotificationMessageRenderer { anchor.href = link.href; if (actionHandler) { - actionHandler.disposeables.push(addDisposableListener(anchor, 'click', () => actionHandler.callback(link.href))); + actionHandler.toDispose.add(addDisposableListener(anchor, EventType.CLICK, () => actionHandler.callback(link.href))); } messageContainer.appendChild(anchor); @@ -194,7 +194,7 @@ export class NotificationRenderer implements IListRenderer { if (action && action instanceof ConfigureNotificationAction) { const item = new DropdownMenuActionViewItem(action, action.configurationActions, this.contextMenuService, undefined, this.actionRunner, undefined, action.class); - data.toDispose.push(item); + data.toDispose.add(item); return item; } @@ -232,7 +232,7 @@ export class NotificationRenderer implements IListRenderer = ['info', 'warning', 'error']; - private inputDisposeables: IDisposable[] = []; + private readonly inputDisposeables = this._register(new DisposableStore()); constructor( private template: INotificationTemplateData, @@ -298,6 +298,8 @@ export class NotificationTemplateRenderer { @IThemeService private readonly themeService: IThemeService, @IKeybindingService private readonly keybindingService: IKeybindingService ) { + super(); + if (!NotificationTemplateRenderer.closeNotificationAction) { NotificationTemplateRenderer.closeNotificationAction = instantiationService.createInstance(ClearNotificationAction, ClearNotificationAction.ID, ClearNotificationAction.LABEL); NotificationTemplateRenderer.expandNotificationAction = instantiationService.createInstance(ExpandNotificationAction, ExpandNotificationAction.ID, ExpandNotificationAction.LABEL); @@ -306,7 +308,7 @@ export class NotificationTemplateRenderer { } setInput(notification: INotificationViewItem): void { - this.inputDisposeables = dispose(this.inputDisposeables); + this.inputDisposeables.clear(); this.render(notification); } @@ -315,7 +317,7 @@ export class NotificationTemplateRenderer { // Container toggleClass(this.template.container, 'expanded', notification.expanded); - this.inputDisposeables.push(addDisposableListener(this.template.container, EventType.MOUSE_UP, e => { + this.inputDisposeables.add(addDisposableListener(this.template.container, EventType.MOUSE_UP, e => { if (e.button === 1 /* Middle Button */) { EventHelper.stop(e); @@ -342,7 +344,7 @@ export class NotificationTemplateRenderer { this.renderProgress(notification); // Label Change Events - this.inputDisposeables.push(notification.onDidLabelChange(event => { + this.inputDisposeables.add(notification.onDidLabelChange(event => { switch (event.kind) { case NotificationViewItemLabelKind.SEVERITY: this.renderSeverity(notification); @@ -368,7 +370,7 @@ export class NotificationTemplateRenderer { clearNode(this.template.message); this.template.message.appendChild(NotificationMessageRenderer.render(notification.message, { callback: link => this.openerService.open(URI.parse(link)), - disposeables: this.inputDisposeables + toDispose: this.inputDisposeables })); const messageOverflows = notification.canCollapse && !notification.expanded && this.template.message.scrollWidth > this.template.message.clientWidth; @@ -393,7 +395,7 @@ export class NotificationTemplateRenderer { if (isNonEmptyArray(notification.actions.secondary)) { const configureNotificationAction = this.instantiationService.createInstance(ConfigureNotificationAction, ConfigureNotificationAction.ID, ConfigureNotificationAction.LABEL, notification.actions.secondary); actions.push(configureNotificationAction); - this.inputDisposeables.push(configureNotificationAction); + this.inputDisposeables.add(configureNotificationAction); } // Expand / Collapse @@ -439,7 +441,7 @@ export class NotificationTemplateRenderer { const action = notification.actions.primary![index]; button.label = action.label; - this.inputDisposeables.push(button.onDidClick(e => { + this.inputDisposeables.add(button.onDidClick(e => { EventHelper.stop(e, true); // Run action @@ -451,10 +453,10 @@ export class NotificationTemplateRenderer { } })); - this.inputDisposeables.push(attachButtonStyler(button, this.themeService)); + this.inputDisposeables.add(attachButtonStyler(button, this.themeService)); }); - this.inputDisposeables.push(buttonGroup); + this.inputDisposeables.add(buttonGroup); } } @@ -506,8 +508,4 @@ export class NotificationTemplateRenderer { return keybinding ? keybinding.getLabel() : null; } - - dispose(): void { - this.inputDisposeables = dispose(this.inputDisposeables); - } } diff --git a/src/vs/workbench/browser/parts/panel/panelActions.ts b/src/vs/workbench/browser/parts/panel/panelActions.ts index 7eee50158c4..904f8a364ba 100644 --- a/src/vs/workbench/browser/parts/panel/panelActions.ts +++ b/src/vs/workbench/browser/parts/panel/panelActions.ts @@ -5,7 +5,7 @@ import 'vs/css!./media/panelpart'; import * as nls from 'vs/nls'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { DisposableStore } from 'vs/base/common/lifecycle'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { Action } from 'vs/base/common/actions'; import { Registry } from 'vs/platform/registry/common/platform'; @@ -96,7 +96,7 @@ export class TogglePanelPositionAction extends Action { static readonly MOVE_TO_RIGHT_LABEL = nls.localize('moveToRight', "Move Panel Right"); static readonly MOVE_TO_BOTTOM_LABEL = nls.localize('moveToBottom', "Move Panel to Bottom"); - private toDispose: IDisposable[]; + private readonly toDispose = this._register(new DisposableStore()); constructor( id: string, @@ -106,15 +106,13 @@ export class TogglePanelPositionAction extends Action { ) { super(id, label, layoutService.getPanelPosition() === Position.RIGHT ? 'move-panel-to-bottom' : 'move-panel-to-right'); - this.toDispose = []; - const setClassAndLabel = () => { const positionRight = this.layoutService.getPanelPosition() === Position.RIGHT; this.class = positionRight ? 'move-panel-to-bottom' : 'move-panel-to-right'; this.label = positionRight ? TogglePanelPositionAction.MOVE_TO_BOTTOM_LABEL : TogglePanelPositionAction.MOVE_TO_RIGHT_LABEL; }; - this.toDispose.push(editorGroupsService.onDidLayout(() => setClassAndLabel())); + this.toDispose.add(editorGroupsService.onDidLayout(() => setClassAndLabel())); setClassAndLabel(); } @@ -125,12 +123,6 @@ export class TogglePanelPositionAction extends Action { this.layoutService.setPanelPosition(position === Position.BOTTOM ? Position.RIGHT : Position.BOTTOM); return Promise.resolve(); } - - dispose(): void { - super.dispose(); - - this.toDispose = dispose(this.toDispose); - } } export class ToggleMaximizedPanelAction extends Action { @@ -141,7 +133,7 @@ export class ToggleMaximizedPanelAction extends Action { private static readonly MAXIMIZE_LABEL = nls.localize('maximizePanel', "Maximize Panel Size"); private static readonly RESTORE_LABEL = nls.localize('minimizePanel', "Restore Panel Size"); - private toDispose: IDisposable[]; + private readonly toDispose = this._register(new DisposableStore()); constructor( id: string, @@ -151,9 +143,7 @@ export class ToggleMaximizedPanelAction extends Action { ) { super(id, label, layoutService.isPanelMaximized() ? 'minimize-panel-action' : 'maximize-panel-action'); - this.toDispose = []; - - this.toDispose.push(editorGroupsService.onDidLayout(() => { + this.toDispose.add(editorGroupsService.onDidLayout(() => { const maximized = this.layoutService.isPanelMaximized(); this.class = maximized ? 'minimize-panel-action' : 'maximize-panel-action'; this.label = maximized ? ToggleMaximizedPanelAction.RESTORE_LABEL : ToggleMaximizedPanelAction.MAXIMIZE_LABEL; @@ -168,12 +158,6 @@ export class ToggleMaximizedPanelAction extends Action { this.layoutService.toggleMaximizedPanel(); return Promise.resolve(); } - - dispose(): void { - super.dispose(); - - this.toDispose = dispose(this.toDispose); - } } export class PanelActivityAction extends ActivityAction { diff --git a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts index 80af760a4df..0ac5cb6681c 100644 --- a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts +++ b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts @@ -15,7 +15,7 @@ import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import { IAction, Action } from 'vs/base/common/actions'; import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { DisposableStore } from 'vs/base/common/lifecycle'; import * as nls from 'vs/nls'; import { EditorInput, toResource, Verbosity, SideBySideEditor } from 'vs/workbench/common/editor'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; @@ -75,8 +75,8 @@ export class TitlebarPart extends Part implements ITitleService { private isInactive: boolean; - private properties: ITitleProperties; - private activeEditorListeners: IDisposable[]; + private readonly properties: ITitleProperties = { isPure: true, isAdmin: false }; + private readonly activeEditorListeners = this._register(new DisposableStore()); private titleUpdater: RunOnceScheduler = this._register(new RunOnceScheduler(() => this.doUpdateTitle(), 0)); @@ -96,9 +96,6 @@ export class TitlebarPart extends Part implements ITitleService { ) { super(Parts.TITLEBAR_PART, { hasTitle: false }, themeService, storageService, layoutService); - this.properties = { isPure: true, isAdmin: false }; - this.activeEditorListeners = []; - this.registerListeners(); } @@ -162,8 +159,7 @@ export class TitlebarPart extends Part implements ITitleService { private onActiveEditorChange(): void { // Dispose old listeners - dispose(this.activeEditorListeners); - this.activeEditorListeners = []; + this.activeEditorListeners.clear(); // Calculate New Window Title this.titleUpdater.schedule(); @@ -171,8 +167,8 @@ export class TitlebarPart extends Part implements ITitleService { // Apply listener for dirty and label changes const activeEditor = this.editorService.activeEditor; if (activeEditor instanceof EditorInput) { - this.activeEditorListeners.push(activeEditor.onDidChangeDirty(() => this.titleUpdater.schedule())); - this.activeEditorListeners.push(activeEditor.onDidChangeLabel(() => this.titleUpdater.schedule())); + this.activeEditorListeners.add(activeEditor.onDidChangeDirty(() => this.titleUpdater.schedule())); + this.activeEditorListeners.add(activeEditor.onDidChangeLabel(() => this.titleUpdater.schedule())); } // Represented File Name diff --git a/src/vs/workbench/browser/parts/views/customView.ts b/src/vs/workbench/browser/parts/views/customView.ts index ce0f5ee31b7..5a758eb786f 100644 --- a/src/vs/workbench/browser/parts/views/customView.ts +++ b/src/vs/workbench/browser/parts/views/customView.ts @@ -5,7 +5,7 @@ import 'vs/css!./media/views'; import { Event, Emitter } from 'vs/base/common/event'; -import { IDisposable, dispose, Disposable, toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { IDisposable, Disposable, toDisposable, DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IAction, IActionViewItem, ActionRunner, Action } from 'vs/base/common/actions'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; @@ -100,14 +100,13 @@ export class CustomTreeViewPanel extends ViewletPanel { } } -class TitleMenus implements IDisposable { +class TitleMenus extends Disposable { - private disposables: IDisposable[] = []; - private titleDisposable: IDisposable = Disposable.None; private titleActions: IAction[] = []; + private readonly titleActionsDisposable = this._register(new MutableDisposable()); private titleSecondaryActions: IAction[] = []; - private _onDidChangeTitle = new Emitter(); + private _onDidChangeTitle = this._register(new Emitter()); get onDidChangeTitle(): Event { return this._onDidChangeTitle.event; } constructor( @@ -115,32 +114,26 @@ class TitleMenus implements IDisposable { @IContextKeyService private readonly contextKeyService: IContextKeyService, @IMenuService private readonly menuService: IMenuService, ) { - if (this.titleDisposable) { - this.titleDisposable.dispose(); - this.titleDisposable = Disposable.None; - } + super(); - const _contextKeyService = this.contextKeyService.createScoped(); - _contextKeyService.createKey('view', id); + const scopedContextKeyService = this._register(this.contextKeyService.createScoped()); + scopedContextKeyService.createKey('view', id); - const titleMenu = this.menuService.createMenu(MenuId.ViewTitle, _contextKeyService); + const titleMenu = this._register(this.menuService.createMenu(MenuId.ViewTitle, scopedContextKeyService)); const updateActions = () => { this.titleActions = []; this.titleSecondaryActions = []; - createAndFillInActionBarActions(titleMenu, undefined, { primary: this.titleActions, secondary: this.titleSecondaryActions }); + this.titleActionsDisposable.value = createAndFillInActionBarActions(titleMenu, undefined, { primary: this.titleActions, secondary: this.titleSecondaryActions }); this._onDidChangeTitle.fire(); }; - const listener = titleMenu.onDidChange(updateActions); + this._register(titleMenu.onDidChange(updateActions)); updateActions(); - this.titleDisposable = toDisposable(() => { - listener.dispose(); - titleMenu.dispose(); - _contextKeyService.dispose(); + this._register(toDisposable(() => { this.titleActions = []; this.titleSecondaryActions = []; - }); + })); } getTitleActions(): IAction[] { @@ -150,10 +143,6 @@ class TitleMenus implements IDisposable { getTitleSecondaryActions(): IAction[] { return this.titleSecondaryActions; } - - dispose(): void { - this.disposables = dispose(this.disposables); - } } class Root implements ITreeItem { diff --git a/src/vs/workbench/common/editor/editorGroup.ts b/src/vs/workbench/common/editor/editorGroup.ts index 0618c153440..7d4ca0c5e52 100644 --- a/src/vs/workbench/common/editor/editorGroup.ts +++ b/src/vs/workbench/common/editor/editorGroup.ts @@ -8,7 +8,7 @@ import { Extensions, IEditorInputFactoryRegistry, EditorInput, toResource, IEdit import { URI } from 'vs/base/common/uri'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; -import { dispose, IDisposable, Disposable } from 'vs/base/common/lifecycle'; +import { dispose, Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { Registry } from 'vs/platform/registry/common/platform'; import { ResourceMap } from 'vs/base/common/map'; import { coalesce } from 'vs/base/common/arrays'; @@ -270,30 +270,30 @@ export class EditorGroup extends Disposable { } private registerEditorListeners(editor: EditorInput): void { - const unbind: IDisposable[] = []; + const listeners = new DisposableStore(); // Re-emit disposal of editor input as our own event const onceDispose = Event.once(editor.onDispose); - unbind.push(onceDispose(() => { + listeners.add(onceDispose(() => { if (this.indexOf(editor) >= 0) { this._onDidEditorDispose.fire(editor); } })); // Re-Emit dirty state changes - unbind.push(editor.onDidChangeDirty(() => { + listeners.add(editor.onDidChangeDirty(() => { this._onDidEditorBecomeDirty.fire(editor); })); // Re-Emit label changes - unbind.push(editor.onDidChangeLabel(() => { + listeners.add(editor.onDidChangeLabel(() => { this._onDidEditorLabelChange.fire(editor); })); // Clean up dispose listeners once the editor gets closed - unbind.push(this.onDidEditorClose(event => { + listeners.add(this.onDidEditorClose(event => { if (event.editor.matches(editor)) { - dispose(unbind); + dispose(listeners); } })); } diff --git a/src/vs/workbench/common/editor/textEditorModel.ts b/src/vs/workbench/common/editor/textEditorModel.ts index a098901ca66..239fd95cc28 100644 --- a/src/vs/workbench/common/editor/textEditorModel.ts +++ b/src/vs/workbench/common/editor/textEditorModel.ts @@ -9,7 +9,7 @@ import { URI } from 'vs/base/common/uri'; import { ITextEditorModel, IResolvedTextEditorModel } from 'vs/editor/common/services/resolverService'; import { IModeService, ILanguageSelection } from 'vs/editor/common/services/modeService'; import { IModelService } from 'vs/editor/common/services/modelService'; -import { IDisposable } from 'vs/base/common/lifecycle'; +import { MutableDisposable } from 'vs/base/common/lifecycle'; import { PLAINTEXT_MODE_ID } from 'vs/editor/common/modes/modesRegistry'; import { withUndefinedAsNull } from 'vs/base/common/types'; @@ -20,7 +20,7 @@ export abstract class BaseTextEditorModel extends EditorModel implements ITextEd protected textEditorModelHandle: URI | null; private createdEditorModel: boolean; - private modelDisposeListener: IDisposable | null; + private readonly modelDisposeListener = this._register(new MutableDisposable()); constructor( @IModelService protected modelService: IModelService, @@ -49,11 +49,7 @@ export abstract class BaseTextEditorModel extends EditorModel implements ITextEd } private registerModelDisposeListener(model: ITextModel): void { - if (this.modelDisposeListener) { - this.modelDisposeListener.dispose(); - } - - this.modelDisposeListener = model.onWillDispose(() => { + this.modelDisposeListener.value = model.onWillDispose(() => { this.textEditorModelHandle = null; // make sure we do not dispose code editor model again this.dispose(); }); @@ -166,10 +162,7 @@ export abstract class BaseTextEditorModel extends EditorModel implements ITextEd } dispose(): void { - if (this.modelDisposeListener) { - this.modelDisposeListener.dispose(); // dispose this first because it will trigger another dispose() otherwise - this.modelDisposeListener = null; - } + this.modelDisposeListener.dispose(); // dispose this first because it will trigger another dispose() otherwise if (this.textEditorModelHandle && this.createdEditorModel) { this.modelService.destroyModel(this.textEditorModelHandle); diff --git a/src/vs/workbench/contrib/debug/browser/callStackView.ts b/src/vs/workbench/contrib/debug/browser/callStackView.ts index 3fffff2d139..6d94222b5b8 100644 --- a/src/vs/workbench/contrib/debug/browser/callStackView.ts +++ b/src/vs/workbench/contrib/debug/browser/callStackView.ts @@ -29,6 +29,7 @@ import { onUnexpectedError } from 'vs/base/common/errors'; import { HighlightedLabel } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel'; import { createMatches, FuzzyScore } from 'vs/base/common/filters'; import { Event } from 'vs/base/common/event'; +import { dispose } from 'vs/base/common/lifecycle'; const $ = dom.$; @@ -296,14 +297,14 @@ export class CallStackView extends ViewletPanel { this.callStackItemType.reset(); } + const actions: IAction[] = []; + const actionsDisposable = createAndFillInContextMenuActions(this.contributedContextMenu, { arg: this.getContextForContributedActions(element), shouldForwardArgs: true }, actions, this.contextMenuService); + this.contextMenuService.showContextMenu({ getAnchor: () => e.anchor, - getActions: () => { - const actions: IAction[] = []; - createAndFillInContextMenuActions(this.contributedContextMenu, { arg: this.getContextForContributedActions(element), shouldForwardArgs: true }, actions, this.contextMenuService); - return actions; - }, - getActionsContext: () => element + getActions: () => actions, + getActionsContext: () => element, + onHide: () => dispose(actionsDisposable) }); } diff --git a/src/vs/workbench/contrib/files/browser/editors/textFileEditor.ts b/src/vs/workbench/contrib/files/browser/editors/textFileEditor.ts index f7a188eb798..1021cb40834 100644 --- a/src/vs/workbench/contrib/files/browser/editors/textFileEditor.ts +++ b/src/vs/workbench/contrib/files/browser/editors/textFileEditor.ts @@ -31,7 +31,7 @@ import { IEditorGroupsService, IEditorGroup } from 'vs/workbench/services/editor import { CancellationToken } from 'vs/base/common/cancellation'; import { IEditorGroupView } from 'vs/workbench/browser/parts/editor/editor'; import { createErrorWithActions } from 'vs/base/common/errorsWithActions'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { MutableDisposable } from 'vs/base/common/lifecycle'; /** * An implementation of editor for file system resources. @@ -41,7 +41,7 @@ export class TextFileEditor extends BaseTextEditor { static readonly ID = TEXT_FILE_EDITOR_ID; private restoreViewState: boolean; - private groupListener: IDisposable; + private readonly groupListener = this._register(new MutableDisposable()); constructor( @ITelemetryService telemetryService: ITelemetryService, @@ -99,8 +99,7 @@ export class TextFileEditor extends BaseTextEditor { // React to editors closing to preserve or clear view state. This needs to happen // in the onWillCloseEditor because at that time the editor has not yet // been disposed and we can safely persist the view state still as needed. - dispose(this.groupListener); - this.groupListener = ((group as IEditorGroupView).onWillCloseEditor(e => this.onWillCloseEditorInGroup(e))); + this.groupListener.value = ((group as IEditorGroupView).onWillCloseEditor(e => this.onWillCloseEditorInGroup(e))); } private onWillCloseEditorInGroup(e: IEditorCloseEvent): void { @@ -295,10 +294,4 @@ export class TextFileEditor extends BaseTextEditor { this.saveTextEditorViewState(input.getResource()); } } - - dispose(): void { - dispose(this.groupListener); - - super.dispose(); - } } diff --git a/src/vs/workbench/contrib/files/browser/views/explorerView.ts b/src/vs/workbench/contrib/files/browser/views/explorerView.ts index 957c1bae15c..4fb9af476f5 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerView.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerView.ts @@ -49,6 +49,7 @@ import { values } from 'vs/base/common/map'; import { first } from 'vs/base/common/arrays'; import { withNullAsUndefined } from 'vs/base/common/types'; import { IFileService, FileSystemProviderCapabilities } from 'vs/platform/files/common/files'; +import { dispose } from 'vs/base/common/lifecycle'; export class ExplorerView extends ViewletPanel { static readonly ID: string = 'workbench.explorer.fileView'; @@ -384,20 +385,21 @@ export class ExplorerView extends ViewletPanel { this.setContextKeys(stat); const selection = this.tree.getSelection(); + + const actions: IAction[] = []; + const roots = this.explorerService.roots; // If the click is outside of the elements pass the root resource if there is only one root. If there are multiple roots pass empty object. + const arg = stat instanceof ExplorerItem ? stat.resource : roots.length === 1 ? roots[0].resource : {}; + const actionsDisposable = createAndFillInContextMenuActions(this.contributedContextMenu, { arg, shouldForwardArgs: true }, actions, this.contextMenuService); + this.contextMenuService.showContextMenu({ getAnchor: () => e.anchor, - getActions: () => { - const actions: IAction[] = []; - // If the click is outside of the elements pass the root resource if there is only one root. If there are multiple roots pass empty object. - const roots = this.explorerService.roots; - const arg = stat instanceof ExplorerItem ? stat.resource : roots.length === 1 ? roots[0].resource : {}; - createAndFillInContextMenuActions(this.contributedContextMenu, { arg, shouldForwardArgs: true }, actions, this.contextMenuService); - return actions; - }, + getActions: () => actions, onHide: (wasCancelled?: boolean) => { if (wasCancelled) { this.tree.domFocus(); } + + dispose(actionsDisposable); }, getActionsContext: () => stat && selection && selection.indexOf(stat) >= 0 ? selection.map((fs: ExplorerItem) => fs.resource) diff --git a/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts b/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts index 239e8f0ceb2..46b7957388c 100644 --- a/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts +++ b/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts @@ -371,14 +371,14 @@ export class OpenEditorsView extends ViewletPanel { } const element = e.element; + const actions: IAction[] = []; + const actionsDisposable = createAndFillInContextMenuActions(this.contributedContextMenu, { shouldForwardArgs: true, arg: element instanceof OpenEditor ? element.editor.getResource() : {} }, actions, this.contextMenuService); + this.contextMenuService.showContextMenu({ getAnchor: () => e.anchor, - getActions: () => { - const actions: IAction[] = []; - createAndFillInContextMenuActions(this.contributedContextMenu, { shouldForwardArgs: true, arg: element instanceof OpenEditor ? element.editor.getResource() : {} }, actions, this.contextMenuService); - return actions; - }, - getActionsContext: () => element instanceof OpenEditor ? { groupId: element.groupId, editorIndex: element.editorIndex } : { groupId: element.id } + getActions: () => actions, + getActionsContext: () => element instanceof OpenEditor ? { groupId: element.groupId, editorIndex: element.editorIndex } : { groupId: element.id }, + onHide: () => dispose(actionsDisposable) }); } diff --git a/src/vs/workbench/contrib/files/common/dirtyFilesTracker.ts b/src/vs/workbench/contrib/files/common/dirtyFilesTracker.ts index 201452f8d45..49ef8b18505 100644 --- a/src/vs/workbench/contrib/files/common/dirtyFilesTracker.ts +++ b/src/vs/workbench/contrib/files/common/dirtyFilesTracker.ts @@ -10,7 +10,7 @@ import { TextFileModelChangeEvent, ITextFileService, AutoSaveMode, ModelState } import { platform, Platform } from 'vs/base/common/platform'; import { IWindowService } from 'vs/platform/windows/common/windows'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; -import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; +import { Disposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { IActivityService, NumberBadge } from 'vs/workbench/services/activity/common/activity'; import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; @@ -20,7 +20,7 @@ import { IEditorService, ACTIVE_GROUP } from 'vs/workbench/services/editor/commo export class DirtyFilesTracker extends Disposable implements IWorkbenchContribution { private isDocumentedEdited: boolean; private lastDirtyCount: number; - private badgeHandle: IDisposable; + private readonly badgeHandle = this._register(new MutableDisposable()); constructor( @ITextFileService private readonly textFileService: ITextFileService, @@ -126,9 +126,9 @@ export class DirtyFilesTracker extends Disposable implements IWorkbenchContribut private updateActivityBadge(): void { const dirtyCount = this.textFileService.getDirty().length; this.lastDirtyCount = dirtyCount; - dispose(this.badgeHandle); + this.badgeHandle.clear(); if (dirtyCount > 0) { - this.badgeHandle = this.activityService.showActivity(VIEWLET_ID, new NumberBadge(dirtyCount, num => num === 1 ? nls.localize('dirtyFile', "1 unsaved file") : nls.localize('dirtyFiles', "{0} unsaved files", dirtyCount)), 'explorer-viewlet-label'); + this.badgeHandle.value = this.activityService.showActivity(VIEWLET_ID, new NumberBadge(dirtyCount, num => num === 1 ? nls.localize('dirtyFile', "1 unsaved file") : nls.localize('dirtyFiles', "{0} unsaved files", dirtyCount)), 'explorer-viewlet-label'); } } diff --git a/src/vs/workbench/contrib/files/common/files.ts b/src/vs/workbench/contrib/files/common/files.ts index fe6d95e6bcc..e60fda6cf31 100644 --- a/src/vs/workbench/contrib/files/common/files.ts +++ b/src/vs/workbench/contrib/files/common/files.ts @@ -9,7 +9,7 @@ import { IWorkbenchEditorConfiguration, IEditorIdentifier, IEditorInput, toResou import { IFilesConfiguration, FileChangeType, IFileService } from 'vs/platform/files/common/files'; import { ContextKeyExpr, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { ITextModelContentProvider } from 'vs/editor/common/services/resolverService'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { Disposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { ITextModel } from 'vs/editor/common/model'; import { Event } from 'vs/base/common/event'; import { IModelService } from 'vs/editor/common/services/modelService'; @@ -133,15 +133,17 @@ export const SortOrderConfiguration = { export type SortOrder = 'default' | 'mixed' | 'filesFirst' | 'type' | 'modified'; -export class TextFileContentProvider implements ITextModelContentProvider { - private fileWatcherDisposable: IDisposable | undefined; +export class TextFileContentProvider extends Disposable implements ITextModelContentProvider { + private readonly fileWatcherDisposable = this._register(new MutableDisposable()); constructor( @ITextFileService private readonly textFileService: ITextFileService, @IFileService private readonly fileService: IFileService, @IModeService private readonly modeService: IModeService, @IModelService private readonly modelService: IModelService - ) { } + ) { + super(); + } static async open(resource: URI, scheme: string, label: string, editorService: IEditorService, options?: ITextEditorOptions): Promise { await editorService.openEditor({ @@ -167,18 +169,15 @@ export class TextFileContentProvider implements ITextModelContentProvider { const codeEditorModel = await this.resolveEditorModel(resource); // Make sure to keep contents up to date when it changes - if (!this.fileWatcherDisposable) { - this.fileWatcherDisposable = this.fileService.onFileChanges(changes => { + if (!this.fileWatcherDisposable.value) { + this.fileWatcherDisposable.value = this.fileService.onFileChanges(changes => { if (changes.contains(savedFileResource, FileChangeType.UPDATED)) { this.resolveEditorModel(resource, false /* do not create if missing */); // update model when resource changes } }); if (codeEditorModel) { - once(codeEditorModel.onWillDispose)(() => { - dispose(this.fileWatcherDisposable); - this.fileWatcherDisposable = undefined; - }); + once(codeEditorModel.onWillDispose)(() => this.fileWatcherDisposable.clear()); } } @@ -210,11 +209,6 @@ export class TextFileContentProvider implements ITextModelContentProvider { return codeEditorModel; } - - dispose(): void { - dispose(this.fileWatcherDisposable); - this.fileWatcherDisposable = undefined; - } } export class OpenEditor implements IEditorIdentifier { diff --git a/src/vs/workbench/contrib/quickopen/browser/commandsHandler.ts b/src/vs/workbench/contrib/quickopen/browser/commandsHandler.ts index 67fa33738d1..0904b286f7c 100644 --- a/src/vs/workbench/contrib/quickopen/browser/commandsHandler.ts +++ b/src/vs/workbench/contrib/quickopen/browser/commandsHandler.ts @@ -30,7 +30,7 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; -import { Disposable, DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore, IDisposable, toDisposable, dispose } from 'vs/base/common/lifecycle'; import { timeout } from 'vs/base/common/async'; export const ALL_COMMANDS_PREFIX = '>'; @@ -385,6 +385,7 @@ export class CommandsHandler extends QuickOpenHandler implements IDisposable { private readonly commandsHistory: CommandsHistory; private readonly disposables = new DisposableStore(); + private readonly disposeOnClose = new DisposableStore(); private waitedForExtensionsRegistered: boolean; @@ -449,6 +450,7 @@ export class CommandsHandler extends QuickOpenHandler implements IDisposable { const menuActions = menu.getActions().reduce((r, [, actions]) => [...r, ...actions], []).filter(action => action instanceof MenuItemAction) as MenuItemAction[]; const commandEntries = this.menuItemActionsToEntries(menuActions, searchValue); menu.dispose(); + this.disposeOnClose.add(toDisposable(() => dispose(menuActions))); // Concat let entries = [...editorEntries, ...commandEntries]; @@ -591,8 +593,15 @@ export class CommandsHandler extends QuickOpenHandler implements IDisposable { return nls.localize('noCommandsMatching', "No commands matching"); } + onClose(canceled: boolean): void { + super.onClose(canceled); + + this.disposeOnClose.clear(); + } + dispose() { this.disposables.dispose(); + this.disposeOnClose.dispose(); } } diff --git a/src/vs/workbench/contrib/search/browser/searchView.ts b/src/vs/workbench/contrib/search/browser/searchView.ts index 4f26edf3d17..f51fd06cb9d 100644 --- a/src/vs/workbench/contrib/search/browser/searchView.ts +++ b/src/vs/workbench/contrib/search/browser/searchView.ts @@ -694,14 +694,14 @@ export class SearchView extends ViewletPanel { e.browserEvent.preventDefault(); e.browserEvent.stopPropagation(); + const actions: IAction[] = []; + const actionsDisposable = createAndFillInContextMenuActions(this.contextMenu, { shouldForwardArgs: true }, actions, this.contextMenuService); + this.contextMenuService.showContextMenu({ getAnchor: () => e.anchor, - getActions: () => { - const actions: IAction[] = []; - createAndFillInContextMenuActions(this.contextMenu, { shouldForwardArgs: true }, actions, this.contextMenuService); - return actions; - }, - getActionsContext: () => e.element + getActions: () => actions, + getActionsContext: () => e.element, + onHide: () => dispose(actionsDisposable) }); } diff --git a/src/vs/workbench/electron-browser/window.ts b/src/vs/workbench/electron-browser/window.ts index 8eaf6da6275..a1001064bfc 100644 --- a/src/vs/workbench/electron-browser/window.ts +++ b/src/vs/workbench/electron-browser/window.ts @@ -369,7 +369,7 @@ export class ElectronWindow extends Disposable { const actions: Array = []; // Fill actions into groups respecting order - createAndFillInActionBarActions(this.touchBarMenu, undefined, actions); + this.touchBarDisposables.add(createAndFillInActionBarActions(this.touchBarMenu, undefined, actions)); // Convert into command action multi array const items: ICommandAction[][] = []; diff --git a/src/vs/workbench/services/editor/browser/editorService.ts b/src/vs/workbench/services/editor/browser/editorService.ts index 683b344b9dd..1aff720e6e3 100644 --- a/src/vs/workbench/services/editor/browser/editorService.ts +++ b/src/vs/workbench/services/editor/browser/editorService.ts @@ -21,7 +21,7 @@ import { localize } from 'vs/nls'; import { IEditorGroupsService, IEditorGroup, GroupsOrder, IEditorReplacement, GroupChangeKind, preferredSideBySideGroupDirection } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IResourceEditor, ACTIVE_GROUP_TYPE, SIDE_GROUP_TYPE, SIDE_GROUP, IResourceEditorReplacement, IOpenEditorOverrideHandler, IVisibleEditor, IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { Disposable, IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, IDisposable, dispose, toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { coalesce } from 'vs/base/common/arrays'; import { isCodeEditor, isDiffEditor, ICodeEditor, IDiffEditor } from 'vs/editor/browser/editorBrowser'; import { IEditorGroupView, IEditorOpeningEvent, EditorServiceImpl } from 'vs/workbench/browser/parts/editor/editor'; @@ -118,24 +118,24 @@ export class EditorService extends Disposable implements EditorServiceImpl { } private registerGroupListeners(group: IEditorGroupView): void { - const groupDisposeables: IDisposable[] = []; + const groupDisposeables = new DisposableStore(); - groupDisposeables.push(group.onDidGroupChange(e => { + groupDisposeables.add(group.onDidGroupChange(e => { if (e.kind === GroupChangeKind.EDITOR_ACTIVE) { this.handleActiveEditorChange(group); this._onDidVisibleEditorsChange.fire(); } })); - groupDisposeables.push(group.onDidCloseEditor(event => { + groupDisposeables.add(group.onDidCloseEditor(event => { this._onDidCloseEditor.fire(event); })); - groupDisposeables.push(group.onWillOpenEditor(event => { + groupDisposeables.add(group.onWillOpenEditor(event => { this.onGroupWillOpenEditor(group, event); })); - groupDisposeables.push(group.onDidOpenEditorFail(editor => { + groupDisposeables.add(group.onDidOpenEditorFail(editor => { this._onDidOpenEditorFail.fire({ editor, groupId: group.id }); })); diff --git a/src/vs/workbench/services/files/common/fileService.ts b/src/vs/workbench/services/files/common/fileService.ts index 8631b019133..fd0a0d9f4e9 100644 --- a/src/vs/workbench/services/files/common/fileService.ts +++ b/src/vs/workbench/services/files/common/fileService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Disposable, IDisposable, toDisposable, dispose } from 'vs/base/common/lifecycle'; +import { Disposable, IDisposable, toDisposable, dispose, DisposableStore } from 'vs/base/common/lifecycle'; import { IFileService, IResolveFileOptions, FileChangesEvent, FileOperationEvent, IFileSystemProviderRegistrationEvent, IFileSystemProvider, IFileStat, IResolveFileResult, ICreateFileOptions, IFileSystemProviderActivationEvent, FileOperationError, FileOperationResult, FileOperation, FileSystemProviderCapabilities, FileType, toFileSystemProviderErrorCode, FileSystemProviderErrorCode, IStat, IFileStatWithMetadata, IResolveMetadataFileOptions, etag, hasReadWriteCapability, hasFileFolderCopyCapability, hasOpenReadWriteCloseCapability, toFileOperationResult, IFileSystemProviderWithOpenReadWriteCloseCapability, IFileSystemProviderWithFileReadWriteCapability, IResolveFileResultWithMetadata, IWatchOptions, IWriteFileOptions, IReadFileOptions, IFileStreamContent, IFileContent, ETAG_DISABLED } from 'vs/platform/files/common/files'; import { URI } from 'vs/base/common/uri'; import { Event, Emitter } from 'vs/base/common/event'; @@ -49,10 +49,10 @@ export class FileService extends Disposable implements IFileService { this._onDidChangeFileSystemProviderRegistrations.fire({ added: true, scheme, provider }); // Forward events from provider - const providerDisposables: IDisposable[] = []; - providerDisposables.push(provider.onDidChangeFile(changes => this._onFileChanges.fire(new FileChangesEvent(changes)))); + const providerDisposables = new DisposableStore(); + providerDisposables.add(provider.onDidChangeFile(changes => this._onFileChanges.fire(new FileChangesEvent(changes)))); if (typeof provider.onDidErrorOccur === 'function') { - providerDisposables.push(provider.onDidErrorOccur(error => this._onError.fire(error))); + providerDisposables.add(provider.onDidErrorOccur(error => this._onError.fire(error))); } return toDisposable(() => { diff --git a/src/vs/workbench/services/history/browser/history.ts b/src/vs/workbench/services/history/browser/history.ts index 192ab79c021..5296da44a56 100644 --- a/src/vs/workbench/services/history/browser/history.ts +++ b/src/vs/workbench/services/history/browser/history.ts @@ -13,7 +13,7 @@ import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { FileChangesEvent, IFileService, FileChangeType, FILES_EXCLUDE_CONFIG } from 'vs/platform/files/common/files'; import { Selection } from 'vs/editor/common/core/selection'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { IDisposable, dispose, Disposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { dispose, Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { Registry } from 'vs/platform/registry/common/platform'; import { Event } from 'vs/base/common/event'; @@ -108,8 +108,8 @@ export class HistoryService extends Disposable implements IHistoryService { private readonly activeEditorListeners = this._register(new DisposableStore()); private lastActiveEditor?: IEditorIdentifier; - private readonly editorHistoryListeners: Map = new Map(); - private readonly editorStackListeners: Map = new Map(); + private readonly editorHistoryListeners: Map = new Map(); + private readonly editorStackListeners: Map = new Map(); private stack: IStackEntry[]; private index: number; @@ -475,19 +475,19 @@ export class HistoryService extends Disposable implements IHistoryService { } } - private onEditorDispose(editor: EditorInput, listener: Function, mapEditorToDispose: Map): void { + private onEditorDispose(editor: EditorInput, listener: Function, mapEditorToDispose: Map): void { const toDispose = Event.once(editor.onDispose)(() => listener()); let disposables = mapEditorToDispose.get(editor); if (!disposables) { - disposables = []; + disposables = new DisposableStore(); mapEditorToDispose.set(editor, disposables); } - disposables.push(toDispose); + disposables.add(toDispose); } - private clearOnEditorDispose(editor: IEditorInput | IResourceInput | FileChangesEvent, mapEditorToDispose: Map): void { + private clearOnEditorDispose(editor: IEditorInput | IResourceInput | FileChangesEvent, mapEditorToDispose: Map): void { if (editor instanceof EditorInput) { const disposables = mapEditorToDispose.get(editor); if (disposables) { diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts index dc6f69145e7..9a70fd94b6a 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts @@ -25,7 +25,7 @@ import { ITextBufferFactory } from 'vs/editor/common/model'; import { hash } from 'vs/base/common/hash'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { isLinux } from 'vs/base/common/platform'; -import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { toDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { ILogService } from 'vs/platform/log/common/log'; import { isEqual, isEqualOrParent, extname, basename, joinPath } from 'vs/base/common/resources'; import { onUnexpectedError } from 'vs/base/common/errors'; @@ -75,7 +75,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil private autoSaveAfterMillies?: number; private autoSaveAfterMilliesEnabled: boolean; - private autoSaveDisposable?: IDisposable; + private readonly autoSaveDisposable = this._register(new MutableDisposable()); private saveSequentializer: SaveSequentializer; private lastSaveAttemptTime: number; @@ -243,7 +243,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil } // Cancel any running auto-save - this.cancelPendingAutoSave(); + this.autoSaveDisposable.clear(); // Unset flags const undo = this.setDirty(false); @@ -567,7 +567,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil this.logService.trace(`doAutoSave() - enter for versionId ${versionId}`, this.resource); // Cancel any currently running auto saves to make this the one that succeeds - this.cancelPendingAutoSave(); + this.autoSaveDisposable.clear(); // Create new save timer and store it for disposal as needed const handle = setTimeout(() => { @@ -578,25 +578,18 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil } }, this.autoSaveAfterMillies); - this.autoSaveDisposable = toDisposable(() => clearTimeout(handle)); + this.autoSaveDisposable.value = toDisposable(() => clearTimeout(handle)); } - private cancelPendingAutoSave(): void { - if (this.autoSaveDisposable) { - this.autoSaveDisposable.dispose(); - this.autoSaveDisposable = undefined; - } - } - - save(options: ISaveOptions = Object.create(null)): Promise { + async save(options: ISaveOptions = Object.create(null)): Promise { if (!this.isResolved()) { - return Promise.resolve(); + return; } this.logService.trace('save() - enter', this.resource); // Cancel any currently running auto saves to make this the one that succeeds - this.cancelPendingAutoSave(); + this.autoSaveDisposable.clear(); return this.doSave(this.versionId, options); } @@ -1038,8 +1031,6 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil this.inOrphanMode = false; this.inErrorMode = false; - this.cancelPendingAutoSave(); - super.dispose(); } } From 770c8d50efaeacb78e78bc6e43b1321416b3fc7e Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 17 Jun 2019 09:41:33 +0200 Subject: [PATCH 0219/1449] global settings - align with preferences menu --- .../electron-browser/extensions.contribution.ts | 9 +++++++++ .../preferences/browser/preferences.contribution.ts | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts index 2daeb24e399..aa632ac96e9 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts @@ -301,6 +301,15 @@ MenuRegistry.appendMenuItem(MenuId.MenubarPreferencesMenu, { order: 2 }); +MenuRegistry.appendMenuItem(MenuId.GlobalActivity, { + group: '2_keybindings', + command: { + id: ShowRecommendedKeymapExtensionsAction.ID, + title: localize('miOpenKeymapExtensions2', "Keymaps") + }, + order: 2 +}); + MenuRegistry.appendMenuItem(MenuId.MenubarPreferencesMenu, { group: '1_settings', command: { diff --git a/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts b/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts index b48b2815f65..20c9985f632 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts @@ -802,12 +802,12 @@ MenuRegistry.appendMenuItem(MenuId.MenubarPreferencesMenu, { }); MenuRegistry.appendMenuItem(MenuId.GlobalActivity, { - group: '2_configuration', + group: '2_keybindings', command: { id: OpenGlobalKeybindingsAction.ID, title: nls.localize('keyboardShortcuts', "Keyboard Shortcuts") }, - order: 4 + order: 1 }); // Editor tool items From c255f9efba131c52f34d0ff84ca333ce8b131d37 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 17 Jun 2019 10:02:50 +0200 Subject: [PATCH 0220/1449] web - first cut API --- package.json | 2 +- src/buildfile.js | 2 +- src/vs/code/browser/workbench/workbench.html | 9 ++-- src/vs/code/browser/workbench/workbench.js | 47 +++++++------------- src/vs/platform/sign/browser/signService.ts | 6 ++- src/vs/workbench/browser/web.main.ts | 41 +++++++++-------- src/vs/workbench/workbench.web.api.ts | 31 +++++++++++++ tslint.json | 1 + 8 files changed, 79 insertions(+), 60 deletions(-) create mode 100644 src/vs/workbench/workbench.web.api.ts diff --git a/package.json b/package.json index 7f64838dee7..0a7864db4e0 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "8a2c96a9296c1b8112a4d0e74c0b10063c1a8d44", + "distro": "5fc996cf23a90ee6ea8d55df47948fcccfd7b613", "author": { "name": "Microsoft Corporation" }, diff --git a/src/buildfile.js b/src/buildfile.js index a7c0376985e..62b2f30c0e4 100644 --- a/src/buildfile.js +++ b/src/buildfile.js @@ -12,7 +12,7 @@ exports.base = [{ }]; exports.workbench = require('./vs/workbench/buildfile').collectModules(['vs/workbench/workbench.main']); -exports.workbenchWeb = require('./vs/workbench/buildfile').collectModules(['vs/workbench/workbench.web.main']); +exports.workbenchWeb = require('./vs/workbench/buildfile').collectModules(['vs/workbench/workbench.web.api']); exports.code = require('./vs/code/buildfile').collectModules(); diff --git a/src/vs/code/browser/workbench/workbench.html b/src/vs/code/browser/workbench/workbench.html index 8a35fe1ee16..316826eea67 100644 --- a/src/vs/code/browser/workbench/workbench.html +++ b/src/vs/code/browser/workbench/workbench.html @@ -10,14 +10,17 @@ - + + + + diff --git a/src/vs/code/browser/workbench/workbench.js b/src/vs/code/browser/workbench/workbench.js index 17ac4fef8ad..8809f830a5a 100644 --- a/src/vs/code/browser/workbench/workbench.js +++ b/src/vs/code/browser/workbench/workbench.js @@ -8,39 +8,22 @@ (function () { - function loadScript(path, callback) { - let script = document.createElement('script'); - script.onload = callback; - script.async = true; - script.type = 'text/javascript'; - script.src = path; - document.head.appendChild(script); - } - - loadScript('./out/vs/loader.js', function () { + // @ts-ignore + require.config({ + baseUrl: `${window.location.origin}/out`, + paths: { + 'vscode-textmate': `${window.location.origin}/node_modules/vscode-textmate/release/main`, + 'onigasm-umd': `${window.location.origin}/node_modules/onigasm-umd/release/main`, + 'xterm': `${window.location.origin}/node_modules/xterm/lib/xterm.js`, + 'xterm-addon-search': `${window.location.origin}/node_modules/xterm-addon-search/lib/xterm-addon-search.js`, + 'xterm-addon-web-links': `${window.location.origin}/node_modules/xterm-addon-web-links/lib/xterm-addon-web-links.js`, + } + }); + // @ts-ignore + require(['vs/workbench/workbench.web.api'], function () { // @ts-ignore - require.config({ - baseUrl: `${window.location.origin}/out`, - paths: { - 'vscode-textmate': `${window.location.origin}/node_modules/vscode-textmate/release/main`, - 'onigasm-umd': `${window.location.origin}/node_modules/onigasm-umd/release/main`, - 'xterm': `${window.location.origin}/node_modules/xterm/lib/xterm.js`, - 'xterm-addon-search': `${window.location.origin}/node_modules/xterm-addon-search/lib/xterm-addon-search.js`, - 'xterm-addon-web-links': `${window.location.origin}/node_modules/xterm-addon-web-links/lib/xterm-addon-web-links.js`, - } - }); - - // @ts-ignore - require([ - 'vs/workbench/workbench.web.main', - 'vs/nls!vs/workbench/workbench.web.main', - 'vs/css!vs/workbench/workbench.web.main' - ], - // @ts-ignore - function () { - // @ts-ignore - require('vs/workbench/browser/web.main').main(self['WINDOW_CONFIGURATION']).then(undefined, console.error); - }); + // eslint-disable-next-line no-undef + monaco.workbench.create(document.body, self.WINDOW_CONFIGURATION); }); })(); \ No newline at end of file diff --git a/src/vs/platform/sign/browser/signService.ts b/src/vs/platform/sign/browser/signService.ts index 20ee67f6064..46447b5e923 100644 --- a/src/vs/platform/sign/browser/signService.ts +++ b/src/vs/platform/sign/browser/signService.ts @@ -4,11 +4,13 @@ *--------------------------------------------------------------------------------------------*/ import { ISignService } from 'vs/platform/sign/common/sign'; +import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; export class SignService implements ISignService { - _serviceBrand: any; + + _serviceBrand: ServiceIdentifier; async sign(value: string): Promise { - return Promise.resolve((self).CONNECTION_AUTH_TOKEN); + return Promise.resolve((self).WINDOW_CONFIGURATION.connectionAuthToken); } } \ No newline at end of file diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index ec54aaab3e8..4c03d31203d 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -24,7 +24,7 @@ import { Schemas } from 'vs/base/common/network'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { onUnexpectedError } from 'vs/base/common/errors'; -import { URI, UriComponents } from 'vs/base/common/uri'; +import { URI } from 'vs/base/common/uri'; import { IWorkspaceInitializationPayload } from 'vs/platform/workspaces/common/workspaces'; import { WorkspaceService } from 'vs/workbench/services/configuration/browser/configurationService'; import { ConfigurationCache } from 'vs/workbench/services/configuration/browser/configurationCache'; @@ -34,21 +34,27 @@ import { ISignService } from 'vs/platform/sign/common/sign'; import { SignService } from 'vs/platform/sign/browser/signService'; import { hash } from 'vs/base/common/hash'; import { joinPath } from 'vs/base/common/resources'; +import { IWorkbenchConstructionOptions } from 'vs/workbench/workbench.web.api'; interface IWindowConfiguration { remoteAuthority: string; userDataUri: URI; + + webviewEndpoint?: string; + folderUri?: URI; workspaceUri?: URI; - webviewEndpoint?: string; } class CodeRendererMain extends Disposable { private workbench: Workbench; - constructor(private readonly configuration: IWindowConfiguration) { + constructor( + private readonly domElement: HTMLElement, + private readonly configuration: IWindowConfiguration + ) { super(); } @@ -60,7 +66,7 @@ class CodeRendererMain extends Disposable { // Create Workbench this.workbench = new Workbench( - document.body, + this.domElement, services.serviceCollection, services.logService ); @@ -186,23 +192,16 @@ class CodeRendererMain extends Disposable { } } -export interface IWindowConfigurationContents { - authority: string; - userDataUri: UriComponents; - folderUri?: UriComponents; - workspaceUri?: UriComponents; - webviewEndpoint?: string; -} +export function main(domElement: HTMLElement, options: IWorkbenchConstructionOptions): Promise { + const renderer = new CodeRendererMain( + domElement, + { + userDataUri: URI.revive(options.userDataUri), + remoteAuthority: options.remoteAuthority, + webviewEndpoint: options.webviewEndpoint, + folderUri: options.folderUri ? URI.revive(options.folderUri) : undefined, + workspaceUri: options.workspaceUri ? URI.revive(options.workspaceUri) : undefined, + }); -export function main(windowConfigurationContents: IWindowConfigurationContents): Promise { - const windowConfiguration: IWindowConfiguration = { - userDataUri: URI.revive(windowConfigurationContents.userDataUri), - remoteAuthority: windowConfigurationContents.authority, - folderUri: windowConfigurationContents.folderUri ? URI.revive(windowConfigurationContents.folderUri) : undefined, - workspaceUri: windowConfigurationContents.workspaceUri ? URI.revive(windowConfigurationContents.workspaceUri) : undefined, - webviewEndpoint: windowConfigurationContents.webviewEndpoint - }; - - const renderer = new CodeRendererMain(windowConfiguration); return renderer.open(); } \ No newline at end of file diff --git a/src/vs/workbench/workbench.web.api.ts b/src/vs/workbench/workbench.web.api.ts new file mode 100644 index 00000000000..3085d6a4875 --- /dev/null +++ b/src/vs/workbench/workbench.web.api.ts @@ -0,0 +1,31 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import 'vs/workbench/workbench.web.main'; +import { main } from 'vs/workbench/browser/web.main'; +import { UriComponents } from 'vs/base/common/uri'; + +export interface IWorkbenchConstructionOptions { + remoteAuthority: string; + + userDataUri: UriComponents; + + webviewEndpoint?: string; + + folderUri?: UriComponents; + workspaceUri?: UriComponents; +} + +function create(domElement: HTMLElement, options: IWorkbenchConstructionOptions): Promise { + return main(domElement, options); +} + +const api: any = self; + +api.monaco = { + workbench: { + create + } +}; \ No newline at end of file diff --git a/tslint.json b/tslint.json index 2b9cbdbbb02..844f1999999 100644 --- a/tslint.json +++ b/tslint.json @@ -364,6 +364,7 @@ "**/vs/platform/*/{common,browser}/**", "**/vs/editor/{common,browser}/**", "**/vs/editor/contrib/**", // editor/contrib is equivalent to /browser/ by convention + "**/vs/workbench/workbench.web.api", "**/vs/workbench/{common,browser}/**", "**/vs/workbench/services/*/{common,browser}/**", "assert" From 952e604fde39b60f73a417a5de5d97ad2eb1401e Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 17 Jun 2019 10:16:08 +0200 Subject: [PATCH 0221/1449] fix smoke test after problems view css change --- test/smoke/src/areas/problems/problems.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/smoke/src/areas/problems/problems.ts b/test/smoke/src/areas/problems/problems.ts index c71b7d33791..e0499151dcb 100644 --- a/test/smoke/src/areas/problems/problems.ts +++ b/test/smoke/src/areas/problems/problems.ts @@ -39,7 +39,7 @@ export class Problems { } public static getSelectorInProblemsView(problemType: ProblemSeverity): string { - let selector = problemType === ProblemSeverity.WARNING ? 'warning' : 'error'; + let selector = problemType === ProblemSeverity.WARNING ? 'severity-warning' : 'severity-error'; return `div[id="workbench.panel.markers"] .monaco-tl-contents .marker-icon.${selector}`; } From 17f79701455de1e2152fa2cde3952f3b3908790d Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 17 Jun 2019 10:50:46 +0200 Subject: [PATCH 0222/1449] fix #74815 --- src/vs/workbench/browser/panel.ts | 7 +++++++ .../browser/parts/panel/panelPart.ts | 6 +++--- .../services/panel/common/panelService.ts | 19 +++++++++++++---- .../progress/browser/progressService.ts | 21 +++++++++++++++++-- .../services/viewlet/browser/viewlet.ts | 9 ++++---- .../workbench/test/workbenchTestServices.ts | 8 +++++++ 6 files changed, 57 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/browser/panel.ts b/src/vs/workbench/browser/panel.ts index b6d4ae353d0..889c107932f 100644 --- a/src/vs/workbench/browser/panel.ts +++ b/src/vs/workbench/browser/panel.ts @@ -41,6 +41,13 @@ export class PanelRegistry extends CompositeRegistry { super.deregisterComposite(id); } + /** + * Returns a panel by id. + */ + getPanel(id: string): PanelDescriptor | null { + return this.getComposite(id); + } + /** * Returns an array of registered panels known to the platform. */ diff --git a/src/vs/workbench/browser/parts/panel/panelPart.ts b/src/vs/workbench/browser/parts/panel/panelPart.ts index 48495ca2e64..506e6f876d7 100644 --- a/src/vs/workbench/browser/parts/panel/panelPart.ts +++ b/src/vs/workbench/browser/parts/panel/panelPart.ts @@ -30,7 +30,7 @@ import { Dimension, trackFocus } from 'vs/base/browser/dom'; import { localize } from 'vs/nls'; import { IDisposable } from 'vs/base/common/lifecycle'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { isUndefinedOrNull, withUndefinedAsNull } from 'vs/base/common/types'; +import { isUndefinedOrNull, withUndefinedAsNull, withNullAsUndefined } from 'vs/base/common/types'; import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { LayoutPriority } from 'vs/base/browser/ui/grid/gridview'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; @@ -229,8 +229,8 @@ export class PanelPart extends CompositePart implements IPanelService { return this.compositeBar.showActivity(panelId, badge, clazz); } - private getPanel(panelId: string): IPanelIdentifier | undefined { - return this.getPanels().filter(p => p.id === panelId).pop(); + getPanel(panelId: string): IPanelIdentifier | undefined { + return withNullAsUndefined(Registry.as(PanelExtensions.Panels).getPanel(panelId)); } getPanels(): PanelDescriptor[] { diff --git a/src/vs/workbench/services/panel/common/panelService.ts b/src/vs/workbench/services/panel/common/panelService.ts index 4609cb5d2bd..501f6f8df8c 100644 --- a/src/vs/workbench/services/panel/common/panelService.ts +++ b/src/vs/workbench/services/panel/common/panelService.ts @@ -8,6 +8,7 @@ import { IPanel } from 'vs/workbench/common/panel'; import { createDecorator, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; import { IBadge } from 'vs/workbench/services/activity/common/activity'; import { IDisposable } from 'vs/base/common/lifecycle'; +import { ILocalProgressService } from 'vs/platform/progress/common/progress'; export const IPanelService = createDecorator('panelService'); @@ -18,11 +19,11 @@ export interface IPanelIdentifier { } export interface IPanelService { + _serviceBrand: ServiceIdentifier; - onDidPanelOpen: Event<{ panel: IPanel, focus: boolean }>; - - onDidPanelClose: Event; + readonly onDidPanelOpen: Event<{ panel: IPanel, focus: boolean }>; + readonly onDidPanelClose: Event; /** * Opens a panel with the given identifier and pass keyboard focus to it if specified. @@ -35,7 +36,12 @@ export interface IPanelService { getActivePanel(): IPanel | null; /** - * Returns all built-in panels following the default order (Problems - Output - Debug Console - Terminal) + * Returns the panel by id. + */ + getPanel(id: string): IPanelIdentifier | undefined; + + /** + * Returns all built-in panels following the default order */ getPanels(): IPanelIdentifier[]; @@ -44,6 +50,11 @@ export interface IPanelService { */ getPinnedPanels(): IPanelIdentifier[]; + /** + * Returns the progress indicator for the panel bar. + */ + getProgressIndicator(id: string): ILocalProgressService | null; + /** * Show an activity in a panel. */ diff --git a/src/vs/workbench/services/progress/browser/progressService.ts b/src/vs/workbench/services/progress/browser/progressService.ts index a5dbd5190e2..a17a5bd3662 100644 --- a/src/vs/workbench/services/progress/browser/progressService.ts +++ b/src/vs/workbench/services/progress/browser/progressService.ts @@ -24,6 +24,7 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { EventHelper } from 'vs/base/browser/dom'; import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; +import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; export class ProgressService implements IProgressService, IDisposable { @@ -35,6 +36,7 @@ export class ProgressService implements IProgressService, IDisposable { constructor( @IActivityService private readonly _activityBar: IActivityService, @IViewletService private readonly _viewletService: IViewletService, + @IPanelService private readonly _panelService: IPanelService, @INotificationService private readonly _notificationService: INotificationService, @IStatusbarService private readonly _statusbarService: IStatusbarService, @ILayoutService private readonly _layoutService: ILayoutService, @@ -49,11 +51,14 @@ export class ProgressService implements IProgressService, IDisposable { withProgress(options: IProgressOptions, task: (progress: IProgress) => Promise, onDidCancel?: () => void): Promise { const { location } = options; if (typeof location === 'string') { - const viewlet = this._viewletService.getViewlet(location); - if (viewlet) { + if (this._viewletService.getProgressIndicator(location)) { return this._withViewletProgress(location, task, { ...options, location }); } + if (this._panelService.getProgressIndicator(location)) { + return this._withPanelProgress(location, task, { ...options, location }); + } + return Promise.reject(new Error(`Bad progress location: ${location}`)); } @@ -281,6 +286,18 @@ export class ProgressService implements IProgressService, IDisposable { return promise; } + private _withPanelProgress

, R = unknown>(panelid: string, task: (progress: IProgress<{ message?: string }>) => P, options: IProgressCompositeOptions): P { + const promise = task(emptyProgress); + + // show in panel + const panelProgress = this._panelService.getProgressIndicator(panelid); + if (panelProgress) { + panelProgress.showWhile(promise, options.delay); + } + + return promise; + } + private _withDialogProgress

, R = unknown>(options: IProgressOptions, task: (progress: IProgress<{ message?: string, increment?: number }>) => P, onDidCancel?: () => void): P { const disposables = new DisposableStore(); const allowableCommands = [ diff --git a/src/vs/workbench/services/viewlet/browser/viewlet.ts b/src/vs/workbench/services/viewlet/browser/viewlet.ts index 2567f4cacea..a20befa6940 100644 --- a/src/vs/workbench/services/viewlet/browser/viewlet.ts +++ b/src/vs/workbench/services/viewlet/browser/viewlet.ts @@ -12,12 +12,13 @@ import { ILocalProgressService } from 'vs/platform/progress/common/progress'; export const IViewletService = createDecorator('viewletService'); export interface IViewletService { + _serviceBrand: ServiceIdentifier; - onDidViewletRegister: Event; - onDidViewletDeregister: Event; - onDidViewletOpen: Event; - onDidViewletClose: Event; + readonly onDidViewletRegister: Event; + readonly onDidViewletDeregister: Event; + readonly onDidViewletOpen: Event; + readonly onDidViewletClose: Event; /** * Opens a viewlet with the given identifier and pass keyboard focus to it if specified. diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index 09b4ed6f217..35d2c045b22 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -620,6 +620,10 @@ export class TestPanelService implements IPanelService { return null!; } + public getPanel(id: string): any { + return activeViewlet; + } + public getPanels(): any[] { return []; } @@ -641,6 +645,10 @@ export class TestPanelService implements IPanelService { throw new Error('Method not implemented.'); } + public getProgressIndicator(id: string) { + return null!; + } + public hideActivePanel(): void { } public getLastActivePanelId(): string { From 8cb79b297f5729baf023fa89867270ea4396e136 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Mon, 17 Jun 2019 11:26:02 +0200 Subject: [PATCH 0223/1449] Tasks for web (#75619) * Refactored task service. Still need to remove semver * Fix process conditions * bash.exe to bash for default shell * Fix URI for windows remote in terminal task system and fix variable resolver so it doesn't have an error on Windows * Remove semver from task service in browser * Version and engine compatibility --- .../workbench/browser/web.simpleservices.ts | 36 -- .../abstractTaskService.ts} | 485 ++---------------- .../runAutomaticTasks.ts | 0 .../tasks/browser/task.contribution.ts | 297 +++++++++++ .../contrib/tasks/browser/taskService.ts | 51 ++ .../terminalTaskSystem.ts | 6 +- .../tasks/electron-browser/taskService.ts | 151 ++++++ .../common/variableResolver.ts | 2 +- src/vs/workbench/workbench.main.ts | 5 +- src/vs/workbench/workbench.web.main.ts | 6 +- 10 files changed, 564 insertions(+), 475 deletions(-) rename src/vs/workbench/contrib/tasks/{electron-browser/task.contribution.ts => browser/abstractTaskService.ts} (79%) rename src/vs/workbench/contrib/tasks/{electron-browser => browser}/runAutomaticTasks.ts (100%) create mode 100644 src/vs/workbench/contrib/tasks/browser/task.contribution.ts create mode 100644 src/vs/workbench/contrib/tasks/browser/taskService.ts rename src/vs/workbench/contrib/tasks/{electron-browser => browser}/terminalTaskSystem.ts (99%) create mode 100644 src/vs/workbench/contrib/tasks/electron-browser/taskService.ts diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index 92493e0c8da..b9eb0073a01 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -44,10 +44,6 @@ import { State as DebugState, IDebugService, IDebugSession, IConfigurationManage // tslint:disable-next-line: import-patterns import { IExtensionsWorkbenchService, IExtension as IExtension2 } from 'vs/workbench/contrib/extensions/common/extensions'; // tslint:disable-next-line: import-patterns -import { ITaskService } from 'vs/workbench/contrib/tasks/common/taskService'; -// tslint:disable-next-line: import-patterns -import { TaskEvent } from 'vs/workbench/contrib/tasks/common/tasks'; -// tslint:disable-next-line: import-patterns import { ICommentService, IResourceCommentThreadEvent, IWorkspaceCommentThreadsEvent } from 'vs/workbench/contrib/comments/browser/commentService'; // tslint:disable-next-line: import-patterns import { ICommentThreadChangedEvent } from 'vs/workbench/contrib/comments/common/commentModel'; @@ -404,38 +400,6 @@ export class SimpleExtensionsWorkbenchService implements IExtensionsWorkbenchSer registerSingleton(IExtensionsWorkbenchService, SimpleExtensionsWorkbenchService, true); //#endregion -//#region ITaskService -export class SimpleTaskService implements ITaskService { - _serviceBrand: any; - onDidStateChange: Event = Event.None; - supportsMultipleTaskExecutions: boolean; - configureAction: any; - build: any; - runTest: any; - run: any; - inTerminal: any; - isActive: any; - getActiveTasks: any; - restart: any; - terminate: any; - terminateAll: any; - tasks: any; - getWorkspaceTasks: any; - getTask: any; - getTasksForGroup: any; - getRecentlyUsedTasks: any; - createSorter: any; - needsFolderQualification: any; - canCustomize: any; - customize: any; - openConfig: any; - registerTaskProvider() { return Disposable.None; } - registerTaskSystem() { } - extensionCallbackTaskComplete: any; -} -registerSingleton(ITaskService, SimpleTaskService, true); -//#endregion - //#region ICommentService export class SimpleCommentService implements ICommentService { _serviceBrand: any; diff --git a/src/vs/workbench/contrib/tasks/electron-browser/task.contribution.ts b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts similarity index 79% rename from src/vs/workbench/contrib/tasks/electron-browser/task.contribution.ts rename to src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts index c7302065496..9db06160e9e 100644 --- a/src/vs/workbench/contrib/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts @@ -3,12 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import 'vs/css!../common/media/task.contribution'; - import * as nls from 'vs/nls'; -import * as semver from 'semver'; - -import { QuickOpenHandler } from 'vs/workbench/contrib/tasks/browser/taskQuickOpen'; import Severity from 'vs/base/common/severity'; import * as Objects from 'vs/base/common/objects'; import { URI } from 'vs/base/common/uri'; @@ -25,10 +20,7 @@ import * as UUID from 'vs/base/common/uuid'; import * as Platform from 'vs/base/common/platform'; import { LinkedMap, Touch } from 'vs/base/common/map'; -import { Registry } from 'vs/platform/registry/common/platform'; -import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; -import { MenuRegistry, MenuId, SyncActionDescriptor } from 'vs/platform/actions/common/actions'; -import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { IMarkerService } from 'vs/platform/markers/common/markers'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; @@ -47,12 +39,6 @@ import { IDialogService, IConfirmationResult } from 'vs/platform/dialogs/common/ import { IModelService } from 'vs/editor/common/services/modelService'; -import * as jsonContributionRegistry from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; -import { IJSONSchema } from 'vs/base/common/jsonSchema'; - -import { StatusbarAlignment, IStatusbarService, IStatusbarEntryAccessor, IStatusbarEntry } from 'vs/platform/statusbar/common/statusbar'; -import { IQuickOpenRegistry, Extensions as QuickOpenExtensions, QuickOpenHandlerDescriptor } from 'vs/workbench/browser/quickopen'; - import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import Constants from 'vs/workbench/contrib/markers/browser/constants'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; @@ -61,15 +47,14 @@ import { IConfigurationResolverService } from 'vs/workbench/services/configurati import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; -import { IOutputService, IOutputChannelRegistry, Extensions as OutputExt, IOutputChannel } from 'vs/workbench/contrib/output/common/output'; -import { Scope, IActionBarRegistry, Extensions as ActionBarExtensions } from 'vs/workbench/browser/actions'; +import { IOutputService, IOutputChannel } from 'vs/workbench/contrib/output/common/output'; import { ITerminalService } from 'vs/workbench/contrib/terminal/common/terminal'; import { ITaskSystem, ITaskResolver, ITaskSummary, TaskExecuteKind, TaskError, TaskErrors, TaskTerminateResponse, TaskSystemInfo, ITaskExecuteResult } from 'vs/workbench/contrib/tasks/common/taskSystem'; import { Task, CustomTask, ConfiguringTask, ContributedTask, InMemoryTask, TaskEvent, - TaskEventKind, TaskSet, TaskGroup, GroupType, ExecutionEngine, JsonSchemaVersion, TaskSourceKind, + TaskSet, TaskGroup, GroupType, ExecutionEngine, JsonSchemaVersion, TaskSourceKind, TaskSorter, TaskIdentifier, KeyedTaskIdentifier, TASK_RUNNING_STATE, TaskRunSource, KeyedTaskIdentifier as NKeyedTaskIdentifier, TaskDefinition } from 'vs/workbench/contrib/tasks/common/tasks'; @@ -77,144 +62,22 @@ import { ITaskService, ITaskProvider, ProblemMatcherRunOptions, CustomizationPro import { getTemplates as getTaskTemplates } from 'vs/workbench/contrib/tasks/common/taskTemplates'; import * as TaskConfig from '../common/taskConfiguration'; -import { ProcessTaskSystem } from 'vs/workbench/contrib/tasks/node/processTaskSystem'; import { TerminalTaskSystem } from './terminalTaskSystem'; -import { ProcessRunnerDetector } from 'vs/workbench/contrib/tasks/node/processRunnerDetector'; -import { QuickOpenActionContributor } from '../browser/quickOpen'; import { IQuickInputService, IQuickPickItem, QuickPickInput } from 'vs/platform/quickinput/common/quickInput'; import { TaskDefinitionRegistry } from 'vs/workbench/contrib/tasks/common/taskDefinitionRegistry'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry, IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; -import { RunAutomaticTasks, AllowAutomaticTaskRunning, DisallowAutomaticTaskRunning } from 'vs/workbench/contrib/tasks/electron-browser/runAutomaticTasks'; +import { RunAutomaticTasks } from 'vs/workbench/contrib/tasks/browser/runAutomaticTasks'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal'; -let tasksCategory = nls.localize('tasksCategory', "Tasks"); - -const workbenchRegistry = Registry.as(WorkbenchExtensions.Workbench); -workbenchRegistry.registerWorkbenchContribution(RunAutomaticTasks, LifecyclePhase.Eventually); - -const actionRegistry = Registry.as(ActionExtensions.WorkbenchActions); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(AllowAutomaticTaskRunning, AllowAutomaticTaskRunning.ID, AllowAutomaticTaskRunning.LABEL), 'Tasks: Allow Automatic Tasks in Folder', tasksCategory); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(DisallowAutomaticTaskRunning, DisallowAutomaticTaskRunning.ID, DisallowAutomaticTaskRunning.LABEL), 'Tasks: Disallow Automatic Tasks in Folder', tasksCategory); - -namespace ConfigureTaskAction { +export namespace ConfigureTaskAction { export const ID = 'workbench.action.tasks.configureTaskRunner'; export const TEXT = nls.localize('ConfigureTaskRunnerAction.label', "Configure Task"); } -export class TaskStatusBarContributions extends Disposable implements IWorkbenchContribution { - private runningTasksStatusItem: IStatusbarEntryAccessor | undefined; - private activeTasksCount: number = 0; - - constructor( - @ITaskService private readonly taskService: ITaskService, - @IStatusbarService private readonly statusbarService: IStatusbarService, - @IProgressService private readonly progressService: IProgressService - ) { - super(); - this.registerListeners(); - } - - private registerListeners(): void { - let promise: Promise | undefined = undefined; - let resolver: (value?: void | Thenable) => void; - this.taskService.onDidStateChange(event => { - if (event.kind === TaskEventKind.Changed) { - this.updateRunningTasksStatus(); - } - - if (!this.ignoreEventForUpdateRunningTasksCount(event)) { - switch (event.kind) { - case TaskEventKind.Active: - this.activeTasksCount++; - if (this.activeTasksCount === 1) { - if (!promise) { - promise = new Promise((resolve) => { - resolver = resolve; - }); - } - } - break; - case TaskEventKind.Inactive: - // Since the exiting of the sub process is communicated async we can't order inactive and terminate events. - // So try to treat them accordingly. - if (this.activeTasksCount > 0) { - this.activeTasksCount--; - if (this.activeTasksCount === 0) { - if (promise && resolver!) { - resolver!(); - } - } - } - break; - case TaskEventKind.Terminated: - if (this.activeTasksCount !== 0) { - this.activeTasksCount = 0; - if (promise && resolver!) { - resolver!(); - } - } - break; - } - } - - if (promise && (event.kind === TaskEventKind.Active) && (this.activeTasksCount === 1)) { - this.progressService.withProgress({ location: ProgressLocation.Window }, progress => { - progress.report({ message: nls.localize('building', 'Building...') }); - return promise!; - }).then(() => { - promise = undefined; - }); - } - }); - } - - private async updateRunningTasksStatus(): Promise { - const tasks = await this.taskService.getActiveTasks(); - if (tasks.length === 0) { - if (this.runningTasksStatusItem) { - this.runningTasksStatusItem.dispose(); - this.runningTasksStatusItem = undefined; - } - } else { - const itemProps: IStatusbarEntry = { - text: `$(tools) ${tasks.length}`, - tooltip: nls.localize('runningTasks', "Show Running Tasks"), - command: 'workbench.action.tasks.showTasks', - }; - - if (!this.runningTasksStatusItem) { - this.runningTasksStatusItem = this.statusbarService.addEntry(itemProps, 'status.runningTasks', nls.localize('status.runningTasks', "Running Tasks"), StatusbarAlignment.LEFT, 50 /* Medium Priority */); - } else { - this.runningTasksStatusItem.update(itemProps); - } - } - } - - private ignoreEventForUpdateRunningTasksCount(event: TaskEvent): boolean { - if (!this.taskService.inTerminal()) { - return false; - } - - if (event.group !== TaskGroup.Build) { - return true; - } - - if (!event.__task) { - return false; - } - - return event.__task.configurationProperties.problemMatchers === undefined || event.__task.configurationProperties.problemMatchers.length === 0; - } -} - -workbenchRegistry.registerWorkbenchContribution(TaskStatusBarContributions, LifecyclePhase.Restored); - class ProblemReporter implements TaskConfig.IProblemReporter { private _validationStatus: ValidationStatus; @@ -248,7 +111,7 @@ class ProblemReporter implements TaskConfig.IProblemReporter { } } -interface WorkspaceFolderConfigurationResult { +export interface WorkspaceFolderConfigurationResult { workspaceFolder: IWorkspaceFolder; config: TaskConfig.ExternalTaskRunnerConfiguration | undefined; hasErrors: boolean; @@ -297,7 +160,7 @@ interface TaskQuickPickEntry extends IQuickPickItem { task: Task | undefined | null; } -class TaskService extends Disposable implements ITaskService { +export abstract class AbstractTaskService extends Disposable implements ITaskService { // private static autoDetectTelemetryName: string = 'taskServer.autoDetect'; private static readonly RecentlyUsedTasks_Key = 'workbench.tasks.recentlyUsedTasks'; @@ -312,41 +175,40 @@ class TaskService extends Disposable implements ITaskService { private static nextHandle: number = 0; - private _configHasErrors: boolean; private _schemaVersion: JsonSchemaVersion; private _executionEngine: ExecutionEngine; private _workspaceFolders: IWorkspaceFolder[]; private _ignoredWorkspaceFolders: IWorkspaceFolder[]; private _showIgnoreMessage?: boolean; private _providers: Map; - private _taskSystemInfos: Map; + protected _taskSystemInfos: Map; - private _workspaceTasksPromise?: Promise>; + protected _workspaceTasksPromise?: Promise>; - private _taskSystem?: ITaskSystem; - private _taskSystemListener?: IDisposable; + protected _taskSystem?: ITaskSystem; + protected _taskSystemListener?: IDisposable; private _recentlyUsedTasks: LinkedMap; - private _taskRunningState: IContextKey; + protected _taskRunningState: IContextKey; - private _outputChannel: IOutputChannel; - private readonly _onDidStateChange: Emitter; + protected _outputChannel: IOutputChannel; + protected readonly _onDidStateChange: Emitter; constructor( @IConfigurationService private readonly configurationService: IConfigurationService, - @IMarkerService private readonly markerService: IMarkerService, - @IOutputService private readonly outputService: IOutputService, + @IMarkerService protected readonly markerService: IMarkerService, + @IOutputService protected readonly outputService: IOutputService, @IPanelService private readonly panelService: IPanelService, @IEditorService private readonly editorService: IEditorService, - @IFileService private readonly fileService: IFileService, - @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, - @ITelemetryService private readonly telemetryService: ITelemetryService, + @IFileService protected readonly fileService: IFileService, + @IWorkspaceContextService protected readonly contextService: IWorkspaceContextService, + @ITelemetryService protected readonly telemetryService: ITelemetryService, @ITextFileService private readonly textFileService: ITextFileService, @ILifecycleService lifecycleService: ILifecycleService, - @IModelService private readonly modelService: IModelService, + @IModelService protected readonly modelService: IModelService, @IExtensionService private readonly extensionService: IExtensionService, @IQuickInputService private readonly quickInputService: IQuickInputService, - @IConfigurationResolverService private readonly configurationResolverService: IConfigurationResolverService, + @IConfigurationResolverService protected readonly configurationResolverService: IConfigurationResolverService, @ITerminalService private readonly terminalService: ITerminalService, @IStorageService private readonly storageService: IStorageService, @IProgressService private readonly progressService: IProgressService, @@ -361,11 +223,10 @@ class TaskService extends Disposable implements ITaskService { ) { super(); - this._configHasErrors = false; this._workspaceTasksPromise = undefined; this._taskSystem = undefined; this._taskSystemListener = undefined; - this._outputChannel = this.outputService.getChannel(TaskService.OutputChannelId)!; + this._outputChannel = this.outputService.getChannel(AbstractTaskService.OutputChannelId)!; this._providers = new Map(); this._taskSystemInfos = new Map(); this._register(this.contextService.onDidChangeWorkspaceFolders(() => { @@ -517,7 +378,7 @@ class TaskService extends Disposable implements ITaskService { return this._ignoredWorkspaceFolders; } - private get executionEngine(): ExecutionEngine { + protected get executionEngine(): ExecutionEngine { if (this._executionEngine === undefined) { this.updateSetup(); } @@ -533,7 +394,7 @@ class TaskService extends Disposable implements ITaskService { private get showIgnoreMessage(): boolean { if (this._showIgnoreMessage === undefined) { - this._showIgnoreMessage = !this.storageService.getBoolean(TaskService.IgnoreTask010DonotShowAgain_key, StorageScope.WORKSPACE, false); + this._showIgnoreMessage = !this.storageService.getBoolean(AbstractTaskService.IgnoreTask010DonotShowAgain_key, StorageScope.WORKSPACE, false); } return this._showIgnoreMessage; } @@ -562,7 +423,7 @@ class TaskService extends Disposable implements ITaskService { this._schemaVersion = setup[3]; } - private showOutput(runSource: TaskRunSource = TaskRunSource.User): void { + protected showOutput(runSource: TaskRunSource = TaskRunSource.User): void { if (runSource === TaskRunSource.User) { this.notificationService.prompt(Severity.Warning, nls.localize('taskServiceOutputPrompt', 'There are task errors. See the output for details.'), [{ @@ -586,7 +447,7 @@ class TaskService extends Disposable implements ITaskService { dispose: () => { } }; } - let handle = TaskService.nextHandle++; + let handle = AbstractTaskService.nextHandle++; this._providers.set(handle, provider); return { dispose: () => { @@ -632,11 +493,10 @@ class TaskService extends Disposable implements ITaskService { }); } - public tasks(filter?: TaskFilter): Promise { - let range = filter && filter.version ? filter.version : undefined; - let engine = this.executionEngine; + protected abstract versionAndEngineCompatible(filter?: TaskFilter): boolean; - if (range && ((semver.satisfies('0.1.0', range) && engine === ExecutionEngine.Terminal) || (semver.satisfies('2.0.0', range) && engine === ExecutionEngine.Process))) { + public tasks(filter?: TaskFilter): Promise { + if (!this.versionAndEngineCompatible(filter)) { return Promise.resolve([]); } return this.getGroupedTasks().then((map) => { @@ -687,7 +547,7 @@ class TaskService extends Disposable implements ITaskService { return this._recentlyUsedTasks; } this._recentlyUsedTasks = new LinkedMap(); - let storageValue = this.storageService.get(TaskService.RecentlyUsedTasks_Key, StorageScope.WORKSPACE); + let storageValue = this.storageService.get(AbstractTaskService.RecentlyUsedTasks_Key, StorageScope.WORKSPACE); if (storageValue) { try { let values: string[] = JSON.parse(storageValue); @@ -711,7 +571,7 @@ class TaskService extends Disposable implements ITaskService { if (values.length > 30) { values = values.slice(0, 30); } - this.storageService.store(TaskService.RecentlyUsedTasks_Key, JSON.stringify(values), StorageScope.WORKSPACE); + this.storageService.store(AbstractTaskService.RecentlyUsedTasks_Key, JSON.stringify(values), StorageScope.WORKSPACE); } private openDocumentation(): void { @@ -994,7 +854,7 @@ class TaskService extends Disposable implements ITaskService { "properties" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } } */ - this.telemetryService.publicLog(TaskService.CustomizationTelemetryEventName, event); + this.telemetryService.publicLog(AbstractTaskService.CustomizationTelemetryEventName, event); if (openConfig) { let resource = workspaceFolder.toResource('.vscode/tasks.json'); this.editorService.openEditor({ @@ -1228,40 +1088,23 @@ class TaskService extends Disposable implements ITaskService { return this._taskSystem.terminateAll(); } - private getTaskSystem(): ITaskSystem { - if (this._taskSystem) { - return this._taskSystem; - } - if (this.executionEngine === ExecutionEngine.Terminal) { - this._taskSystem = new TerminalTaskSystem( - this.terminalService, this.outputService, this.panelService, this.markerService, - this.modelService, this.configurationResolverService, this.telemetryService, - this.contextService, this.environmentService, - TaskService.OutputChannelId, this.fileService, this.terminalInstanceService, - (workspaceFolder: IWorkspaceFolder) => { - if (!workspaceFolder) { - return undefined; - } - return this._taskSystemInfos.get(workspaceFolder.uri.scheme); + protected createTerminalTaskSystem(): ITaskSystem { + return new TerminalTaskSystem( + this.terminalService, this.outputService, this.panelService, this.markerService, + this.modelService, this.configurationResolverService, this.telemetryService, + this.contextService, this.environmentService, + AbstractTaskService.OutputChannelId, this.fileService, this.terminalInstanceService, + (workspaceFolder: IWorkspaceFolder) => { + if (!workspaceFolder) { + return undefined; } - ); - } else { - let system = new ProcessTaskSystem( - this.markerService, this.modelService, this.telemetryService, this.outputService, - this.configurationResolverService, TaskService.OutputChannelId, - ); - system.hasErrors(this._configHasErrors); - this._taskSystem = system; - } - this._taskSystemListener = this._taskSystem!.onDidStateChange((event) => { - if (this._taskSystem) { - this._taskRunningState.set(this._taskSystem.isActiveSync()); + return this._taskSystemInfos.get(workspaceFolder.uri.scheme); } - this._onDidStateChange.fire(event); - }); - return this._taskSystem!; + ); } + protected abstract getTaskSystem(): ITaskSystem; + private getGroupedTasks(): Promise { return Promise.all([this.extensionService.activateByEvent('onCommand:workbench.action.tasks.runTask'), TaskDefinitionRegistry.onReady()]).then(() => { let validTypes: IStringDictionary = Object.create(null); @@ -1442,20 +1285,9 @@ class TaskService extends Disposable implements ITaskService { return this._workspaceTasksPromise!; } - private updateWorkspaceTasks(runSource: TaskRunSource = TaskRunSource.User): void { - this._workspaceTasksPromise = this.computeWorkspaceTasks(runSource).then(value => { - if (this.executionEngine === ExecutionEngine.Process && this._taskSystem instanceof ProcessTaskSystem) { - // We can only have a process engine if we have one folder. - value.forEach((value) => { - this._configHasErrors = value.hasErrors; - (this._taskSystem as ProcessTaskSystem).hasErrors(this._configHasErrors); - }); - } - return value; - }); - } + protected abstract updateWorkspaceTasks(runSource: TaskRunSource | void): void; - private computeWorkspaceTasks(runSource: TaskRunSource = TaskRunSource.User): Promise> { + protected computeWorkspaceTasks(runSource: TaskRunSource = TaskRunSource.User): Promise> { if (this.workspaceFolders.length === 0) { return Promise.resolve(new Map()); } else { @@ -1515,52 +1347,7 @@ class TaskService extends Disposable implements ITaskService { return Promise.resolve({ workspaceFolder, config, hasErrors: hasParseErrors }); } - private computeLegacyConfiguration(workspaceFolder: IWorkspaceFolder): Promise { - let { config, hasParseErrors } = this.getConfiguration(workspaceFolder); - if (hasParseErrors) { - return Promise.resolve({ workspaceFolder: workspaceFolder, hasErrors: true, config: undefined }); - } - if (config) { - if (this.hasDetectorSupport(config)) { - return new ProcessRunnerDetector(workspaceFolder, this.fileService, this.contextService, this.configurationResolverService, config).detect(true).then((value): WorkspaceFolderConfigurationResult => { - let hasErrors = this.printStderr(value.stderr); - let detectedConfig = value.config; - if (!detectedConfig) { - return { workspaceFolder, config, hasErrors }; - } - let result: TaskConfig.ExternalTaskRunnerConfiguration = Objects.deepClone(config)!; - let configuredTasks: IStringDictionary = Object.create(null); - const resultTasks = result.tasks; - if (!resultTasks) { - if (detectedConfig.tasks) { - result.tasks = detectedConfig.tasks; - } - } else { - resultTasks.forEach(task => { - if (task.taskName) { - configuredTasks[task.taskName] = task; - } - }); - if (detectedConfig.tasks) { - detectedConfig.tasks.forEach((task) => { - if (task.taskName && !configuredTasks[task.taskName]) { - resultTasks.push(task); - } - }); - } - } - return { workspaceFolder, config: result, hasErrors }; - }); - } else { - return Promise.resolve({ workspaceFolder, config, hasErrors: false }); - } - } else { - return new ProcessRunnerDetector(workspaceFolder, this.fileService, this.contextService, this.configurationResolverService).detect(true).then((value) => { - let hasErrors = this.printStderr(value.stderr); - return { workspaceFolder, config: value.config!, hasErrors }; - }); - } - } + protected abstract computeLegacyConfiguration(workspaceFolder: IWorkspaceFolder): Promise; private computeWorkspaceFolderSetup(): [IWorkspaceFolder[], IWorkspaceFolder[], ExecutionEngine, JsonSchemaVersion] { let workspaceFolders: IWorkspaceFolder[] = []; @@ -1605,7 +1392,7 @@ class TaskService extends Disposable implements ITaskService { return TaskConfig.JsonSchemaVersion.from(config); } - private getConfiguration(workspaceFolder: IWorkspaceFolder): { config: TaskConfig.ExternalTaskRunnerConfiguration | undefined; hasParseErrors: boolean } { + protected getConfiguration(workspaceFolder: IWorkspaceFolder): { config: TaskConfig.ExternalTaskRunnerConfiguration | undefined; hasParseErrors: boolean } { let result = this.contextService.getWorkbenchState() !== WorkbenchState.EMPTY ? Objects.deepClone(this.configurationService.getValue('tasks', { resource: workspaceFolder.uri })) : undefined; @@ -1630,18 +1417,6 @@ class TaskService extends Disposable implements ITaskService { return { config: result, hasParseErrors: false }; } - private printStderr(stderr: string[]): boolean { - let result = false; - if (stderr && stderr.length > 0) { - stderr.forEach((line) => { - result = true; - this._outputChannel.append(line + '\n'); - }); - this.showOutput(); - } - return result; - } - public inTerminal(): boolean { if (this._taskSystem) { return this._taskSystem instanceof TerminalTaskSystem; @@ -1649,15 +1424,8 @@ class TaskService extends Disposable implements ITaskService { return this.executionEngine === ExecutionEngine.Terminal; } - private hasDetectorSupport(config: TaskConfig.ExternalTaskRunnerConfiguration): boolean { - if (!config.command || this.contextService.getWorkbenchState() === WorkbenchState.EMPTY) { - return false; - } - return ProcessRunnerDetector.supports(TaskConfig.CommandString.value(config.command)); - } - public configureAction(): Action { - const thisCapture: TaskService = this; + const thisCapture: AbstractTaskService = this; return new class extends Action { constructor() { super(ConfigureTaskAction.ID, ConfigureTaskAction.TEXT, undefined, true, () => { thisCapture.runConfigureTasks(); return Promise.resolve(undefined); }); @@ -1893,7 +1661,7 @@ class TaskService extends Disposable implements ITaskService { label: nls.localize('TaskService.notAgain', "Don't Show Again"), isSecondary: true, run: () => { - this.storageService.store(TaskService.IgnoreTask010DonotShowAgain_key, true, StorageScope.WORKSPACE); + this.storageService.store(AbstractTaskService.IgnoreTask010DonotShowAgain_key, true, StorageScope.WORKSPACE); this._showIgnoreMessage = false; } }] @@ -2249,7 +2017,7 @@ class TaskService extends Disposable implements ITaskService { } */ return this.textFileService.create(resource, content).then((result): URI => { - this.telemetryService.publicLog(TaskService.TemplateTelemetryEventName, { + this.telemetryService.publicLog(AbstractTaskService.TemplateTelemetryEventName, { templateId: selection.id, autoDetect: selection.autoDetect }); @@ -2474,151 +2242,4 @@ class TaskService extends Disposable implements ITaskService { this._taskSystem!.revealTask(task); }); } -} - -MenuRegistry.appendMenuItem(MenuId.MenubarTerminalMenu, { - group: '2_run', - command: { - id: 'workbench.action.tasks.runTask', - title: nls.localize({ key: 'miRunTask', comment: ['&& denotes a mnemonic'] }, "&&Run Task...") - }, - order: 1 -}); - -MenuRegistry.appendMenuItem(MenuId.MenubarTerminalMenu, { - group: '2_run', - command: { - id: 'workbench.action.tasks.build', - title: nls.localize({ key: 'miBuildTask', comment: ['&& denotes a mnemonic'] }, "Run &&Build Task...") - }, - order: 2 -}); - -// Manage Tasks -MenuRegistry.appendMenuItem(MenuId.MenubarTerminalMenu, { - group: '3_manage', - command: { - precondition: TASK_RUNNING_STATE, - id: 'workbench.action.tasks.showTasks', - title: nls.localize({ key: 'miRunningTask', comment: ['&& denotes a mnemonic'] }, "Show Runnin&&g Tasks...") - }, - order: 1 -}); - -MenuRegistry.appendMenuItem(MenuId.MenubarTerminalMenu, { - group: '3_manage', - command: { - precondition: TASK_RUNNING_STATE, - id: 'workbench.action.tasks.restartTask', - title: nls.localize({ key: 'miRestartTask', comment: ['&& denotes a mnemonic'] }, "R&&estart Running Task...") - }, - order: 2 -}); - -MenuRegistry.appendMenuItem(MenuId.MenubarTerminalMenu, { - group: '3_manage', - command: { - precondition: TASK_RUNNING_STATE, - id: 'workbench.action.tasks.terminate', - title: nls.localize({ key: 'miTerminateTask', comment: ['&& denotes a mnemonic'] }, "&&Terminate Task...") - }, - order: 3 -}); - -// Configure Tasks -MenuRegistry.appendMenuItem(MenuId.MenubarTerminalMenu, { - group: '4_configure', - command: { - id: 'workbench.action.tasks.configureTaskRunner', - title: nls.localize({ key: 'miConfigureTask', comment: ['&& denotes a mnemonic'] }, "&&Configure Tasks...") - }, - order: 1 -}); - -MenuRegistry.appendMenuItem(MenuId.MenubarTerminalMenu, { - group: '4_configure', - command: { - id: 'workbench.action.tasks.configureDefaultBuildTask', - title: nls.localize({ key: 'miConfigureBuildTask', comment: ['&& denotes a mnemonic'] }, "Configure De&&fault Build Task...") - }, - order: 2 -}); - - -MenuRegistry.addCommand({ id: ConfigureTaskAction.ID, title: { value: ConfigureTaskAction.TEXT, original: 'Configure Task' }, category: { value: tasksCategory, original: 'Tasks' } }); -MenuRegistry.addCommand({ id: 'workbench.action.tasks.showLog', title: { value: nls.localize('ShowLogAction.label', "Show Task Log"), original: 'Show Task Log' }, category: { value: tasksCategory, original: 'Tasks' } }); -MenuRegistry.addCommand({ id: 'workbench.action.tasks.runTask', title: { value: nls.localize('RunTaskAction.label', "Run Task"), original: 'Run Task' }, category: { value: tasksCategory, original: 'Tasks' } }); -MenuRegistry.addCommand({ id: 'workbench.action.tasks.reRunTask', title: { value: nls.localize('ReRunTaskAction.label', "Rerun Last Task"), original: 'Rerun Last Task' }, category: { value: tasksCategory, original: 'Tasks' } }); -MenuRegistry.addCommand({ id: 'workbench.action.tasks.restartTask', title: { value: nls.localize('RestartTaskAction.label', "Restart Running Task"), original: 'Restart Running Task' }, category: { value: tasksCategory, original: 'Tasks' } }); -MenuRegistry.addCommand({ id: 'workbench.action.tasks.showTasks', title: { value: nls.localize('ShowTasksAction.label', "Show Running Tasks"), original: 'Show Running Tasks' }, category: { value: tasksCategory, original: 'Tasks' } }); -MenuRegistry.addCommand({ id: 'workbench.action.tasks.terminate', title: { value: nls.localize('TerminateAction.label', "Terminate Task"), original: 'Terminate Task' }, category: { value: tasksCategory, original: 'Tasks' } }); -MenuRegistry.addCommand({ id: 'workbench.action.tasks.build', title: { value: nls.localize('BuildAction.label', "Run Build Task"), original: 'Run Build Task' }, category: { value: tasksCategory, original: 'Tasks' } }); -MenuRegistry.addCommand({ id: 'workbench.action.tasks.test', title: { value: nls.localize('TestAction.label', "Run Test Task"), original: 'Run Test Task' }, category: { value: tasksCategory, original: 'Tasks' } }); -MenuRegistry.addCommand({ id: 'workbench.action.tasks.configureDefaultBuildTask', title: { value: nls.localize('ConfigureDefaultBuildTask.label', "Configure Default Build Task"), original: 'Configure Default Build Task' }, category: { value: tasksCategory, original: 'Tasks' } }); -MenuRegistry.addCommand({ id: 'workbench.action.tasks.configureDefaultTestTask', title: { value: nls.localize('ConfigureDefaultTestTask.label', "Configure Default Test Task"), original: 'Configure Default Test Task' }, category: { value: tasksCategory, original: 'Tasks' } }); -// MenuRegistry.addCommand( { id: 'workbench.action.tasks.rebuild', title: nls.localize('RebuildAction.label', 'Run Rebuild Task'), category: tasksCategory }); -// MenuRegistry.addCommand( { id: 'workbench.action.tasks.clean', title: nls.localize('CleanAction.label', 'Run Clean Task'), category: tasksCategory }); - -// Tasks Output channel. Register it before using it in Task Service. -let outputChannelRegistry = Registry.as(OutputExt.OutputChannels); -outputChannelRegistry.registerChannel({ id: TaskService.OutputChannelId, label: TaskService.OutputChannelLabel, log: false }); - -// Task Service -registerSingleton(ITaskService, TaskService, true); - -// Register Quick Open -const quickOpenRegistry = (Registry.as(QuickOpenExtensions.Quickopen)); -const tasksPickerContextKey = 'inTasksPicker'; - -quickOpenRegistry.registerQuickOpenHandler( - new QuickOpenHandlerDescriptor( - QuickOpenHandler, - QuickOpenHandler.ID, - 'task ', - tasksPickerContextKey, - nls.localize('quickOpen.task', "Run Task") - ) -); - -const actionBarRegistry = Registry.as(ActionBarExtensions.Actionbar); -actionBarRegistry.registerActionBarContributor(Scope.VIEWER, QuickOpenActionContributor); - -// tasks.json validation -let schemaId = 'vscode://schemas/tasks'; -let schema: IJSONSchema = { - id: schemaId, - description: 'Task definition file', - type: 'object', - default: { - version: '2.0.0', - tasks: [ - { - label: 'My Task', - command: 'echo hello', - type: 'shell', - args: [], - problemMatcher: ['$tsc'], - presentation: { - reveal: 'always' - }, - group: 'build' - } - ] - } -}; - -import schemaVersion1 from '../common/jsonSchema_v1'; -import schemaVersion2, { updateProblemMatchers } from '../common/jsonSchema_v2'; -schema.definitions = { - ...schemaVersion1.definitions, - ...schemaVersion2.definitions, -}; -schema.oneOf = [...(schemaVersion2.oneOf || []), ...(schemaVersion1.oneOf || [])]; - -let jsonRegistry = Registry.as(jsonContributionRegistry.Extensions.JSONContribution); -jsonRegistry.registerSchema(schemaId, schema); - -ProblemMatcherRegistry.onMatcherChanged(() => { - updateProblemMatchers(); - jsonRegistry.notifySchemaChanged(schemaId); -}); +} \ No newline at end of file diff --git a/src/vs/workbench/contrib/tasks/electron-browser/runAutomaticTasks.ts b/src/vs/workbench/contrib/tasks/browser/runAutomaticTasks.ts similarity index 100% rename from src/vs/workbench/contrib/tasks/electron-browser/runAutomaticTasks.ts rename to src/vs/workbench/contrib/tasks/browser/runAutomaticTasks.ts diff --git a/src/vs/workbench/contrib/tasks/browser/task.contribution.ts b/src/vs/workbench/contrib/tasks/browser/task.contribution.ts new file mode 100644 index 00000000000..0488015562e --- /dev/null +++ b/src/vs/workbench/contrib/tasks/browser/task.contribution.ts @@ -0,0 +1,297 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import 'vs/css!../common/media/task.contribution'; + +import * as nls from 'vs/nls'; + +import { QuickOpenHandler } from 'vs/workbench/contrib/tasks/browser/taskQuickOpen'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; +import { MenuRegistry, MenuId, SyncActionDescriptor } from 'vs/platform/actions/common/actions'; + +import { ProblemMatcherRegistry } from 'vs/workbench/contrib/tasks/common/problemMatcher'; +import { IProgressService, ProgressLocation } from 'vs/platform/progress/common/progress'; + +import * as jsonContributionRegistry from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; +import { IJSONSchema } from 'vs/base/common/jsonSchema'; + +import { StatusbarAlignment, IStatusbarService, IStatusbarEntryAccessor, IStatusbarEntry } from 'vs/platform/statusbar/common/statusbar'; +import { IQuickOpenRegistry, Extensions as QuickOpenExtensions, QuickOpenHandlerDescriptor } from 'vs/workbench/browser/quickopen'; + +import { IOutputChannelRegistry, Extensions as OutputExt } from 'vs/workbench/contrib/output/common/output'; +import { Scope, IActionBarRegistry, Extensions as ActionBarExtensions } from 'vs/workbench/browser/actions'; + +import { TaskEvent, TaskEventKind, TaskGroup, TASK_RUNNING_STATE } from 'vs/workbench/contrib/tasks/common/tasks'; +import { ITaskService } from 'vs/workbench/contrib/tasks/common/taskService'; + +import { QuickOpenActionContributor } from '../browser/quickOpen'; + +import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry, IWorkbenchContribution } from 'vs/workbench/common/contributions'; +import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; +import { RunAutomaticTasks, AllowAutomaticTaskRunning, DisallowAutomaticTaskRunning } from 'vs/workbench/contrib/tasks/browser/runAutomaticTasks'; + +let tasksCategory = nls.localize('tasksCategory', "Tasks"); + +const workbenchRegistry = Registry.as(WorkbenchExtensions.Workbench); +workbenchRegistry.registerWorkbenchContribution(RunAutomaticTasks, LifecyclePhase.Eventually); + +const actionRegistry = Registry.as(ActionExtensions.WorkbenchActions); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(AllowAutomaticTaskRunning, AllowAutomaticTaskRunning.ID, AllowAutomaticTaskRunning.LABEL), 'Tasks: Allow Automatic Tasks in Folder', tasksCategory); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(DisallowAutomaticTaskRunning, DisallowAutomaticTaskRunning.ID, DisallowAutomaticTaskRunning.LABEL), 'Tasks: Disallow Automatic Tasks in Folder', tasksCategory); + +export class TaskStatusBarContributions extends Disposable implements IWorkbenchContribution { + private runningTasksStatusItem: IStatusbarEntryAccessor | undefined; + private activeTasksCount: number = 0; + + constructor( + @ITaskService private readonly taskService: ITaskService, + @IStatusbarService private readonly statusbarService: IStatusbarService, + @IProgressService private readonly progressService: IProgressService + ) { + super(); + this.registerListeners(); + } + + private registerListeners(): void { + let promise: Promise | undefined = undefined; + let resolver: (value?: void | Thenable) => void; + this.taskService.onDidStateChange(event => { + if (event.kind === TaskEventKind.Changed) { + this.updateRunningTasksStatus(); + } + + if (!this.ignoreEventForUpdateRunningTasksCount(event)) { + switch (event.kind) { + case TaskEventKind.Active: + this.activeTasksCount++; + if (this.activeTasksCount === 1) { + if (!promise) { + promise = new Promise((resolve) => { + resolver = resolve; + }); + } + } + break; + case TaskEventKind.Inactive: + // Since the exiting of the sub process is communicated async we can't order inactive and terminate events. + // So try to treat them accordingly. + if (this.activeTasksCount > 0) { + this.activeTasksCount--; + if (this.activeTasksCount === 0) { + if (promise && resolver!) { + resolver!(); + } + } + } + break; + case TaskEventKind.Terminated: + if (this.activeTasksCount !== 0) { + this.activeTasksCount = 0; + if (promise && resolver!) { + resolver!(); + } + } + break; + } + } + + if (promise && (event.kind === TaskEventKind.Active) && (this.activeTasksCount === 1)) { + this.progressService.withProgress({ location: ProgressLocation.Window }, progress => { + progress.report({ message: nls.localize('building', 'Building...') }); + return promise!; + }).then(() => { + promise = undefined; + }); + } + }); + } + + private async updateRunningTasksStatus(): Promise { + const tasks = await this.taskService.getActiveTasks(); + if (tasks.length === 0) { + if (this.runningTasksStatusItem) { + this.runningTasksStatusItem.dispose(); + this.runningTasksStatusItem = undefined; + } + } else { + const itemProps: IStatusbarEntry = { + text: `$(tools) ${tasks.length}`, + tooltip: nls.localize('runningTasks', "Show Running Tasks"), + command: 'workbench.action.tasks.showTasks', + }; + + if (!this.runningTasksStatusItem) { + this.runningTasksStatusItem = this.statusbarService.addEntry(itemProps, 'status.runningTasks', nls.localize('status.runningTasks', "Running Tasks"), StatusbarAlignment.LEFT, 50 /* Medium Priority */); + } else { + this.runningTasksStatusItem.update(itemProps); + } + } + } + + private ignoreEventForUpdateRunningTasksCount(event: TaskEvent): boolean { + if (!this.taskService.inTerminal()) { + return false; + } + + if (event.group !== TaskGroup.Build) { + return true; + } + + if (!event.__task) { + return false; + } + + return event.__task.configurationProperties.problemMatchers === undefined || event.__task.configurationProperties.problemMatchers.length === 0; + } +} + +workbenchRegistry.registerWorkbenchContribution(TaskStatusBarContributions, LifecyclePhase.Restored); + +MenuRegistry.appendMenuItem(MenuId.MenubarTerminalMenu, { + group: '2_run', + command: { + id: 'workbench.action.tasks.runTask', + title: nls.localize({ key: 'miRunTask', comment: ['&& denotes a mnemonic'] }, "&&Run Task...") + }, + order: 1 +}); + +MenuRegistry.appendMenuItem(MenuId.MenubarTerminalMenu, { + group: '2_run', + command: { + id: 'workbench.action.tasks.build', + title: nls.localize({ key: 'miBuildTask', comment: ['&& denotes a mnemonic'] }, "Run &&Build Task...") + }, + order: 2 +}); + +// Manage Tasks +MenuRegistry.appendMenuItem(MenuId.MenubarTerminalMenu, { + group: '3_manage', + command: { + precondition: TASK_RUNNING_STATE, + id: 'workbench.action.tasks.showTasks', + title: nls.localize({ key: 'miRunningTask', comment: ['&& denotes a mnemonic'] }, "Show Runnin&&g Tasks...") + }, + order: 1 +}); + +MenuRegistry.appendMenuItem(MenuId.MenubarTerminalMenu, { + group: '3_manage', + command: { + precondition: TASK_RUNNING_STATE, + id: 'workbench.action.tasks.restartTask', + title: nls.localize({ key: 'miRestartTask', comment: ['&& denotes a mnemonic'] }, "R&&estart Running Task...") + }, + order: 2 +}); + +MenuRegistry.appendMenuItem(MenuId.MenubarTerminalMenu, { + group: '3_manage', + command: { + precondition: TASK_RUNNING_STATE, + id: 'workbench.action.tasks.terminate', + title: nls.localize({ key: 'miTerminateTask', comment: ['&& denotes a mnemonic'] }, "&&Terminate Task...") + }, + order: 3 +}); + +// Configure Tasks +MenuRegistry.appendMenuItem(MenuId.MenubarTerminalMenu, { + group: '4_configure', + command: { + id: 'workbench.action.tasks.configureTaskRunner', + title: nls.localize({ key: 'miConfigureTask', comment: ['&& denotes a mnemonic'] }, "&&Configure Tasks...") + }, + order: 1 +}); + +MenuRegistry.appendMenuItem(MenuId.MenubarTerminalMenu, { + group: '4_configure', + command: { + id: 'workbench.action.tasks.configureDefaultBuildTask', + title: nls.localize({ key: 'miConfigureBuildTask', comment: ['&& denotes a mnemonic'] }, "Configure De&&fault Build Task...") + }, + order: 2 +}); + + +MenuRegistry.addCommand({ id: ConfigureTaskAction.ID, title: { value: ConfigureTaskAction.TEXT, original: 'Configure Task' }, category: { value: tasksCategory, original: 'Tasks' } }); +MenuRegistry.addCommand({ id: 'workbench.action.tasks.showLog', title: { value: nls.localize('ShowLogAction.label', "Show Task Log"), original: 'Show Task Log' }, category: { value: tasksCategory, original: 'Tasks' } }); +MenuRegistry.addCommand({ id: 'workbench.action.tasks.runTask', title: { value: nls.localize('RunTaskAction.label', "Run Task"), original: 'Run Task' }, category: { value: tasksCategory, original: 'Tasks' } }); +MenuRegistry.addCommand({ id: 'workbench.action.tasks.reRunTask', title: { value: nls.localize('ReRunTaskAction.label', "Rerun Last Task"), original: 'Rerun Last Task' }, category: { value: tasksCategory, original: 'Tasks' } }); +MenuRegistry.addCommand({ id: 'workbench.action.tasks.restartTask', title: { value: nls.localize('RestartTaskAction.label', "Restart Running Task"), original: 'Restart Running Task' }, category: { value: tasksCategory, original: 'Tasks' } }); +MenuRegistry.addCommand({ id: 'workbench.action.tasks.showTasks', title: { value: nls.localize('ShowTasksAction.label', "Show Running Tasks"), original: 'Show Running Tasks' }, category: { value: tasksCategory, original: 'Tasks' } }); +MenuRegistry.addCommand({ id: 'workbench.action.tasks.terminate', title: { value: nls.localize('TerminateAction.label', "Terminate Task"), original: 'Terminate Task' }, category: { value: tasksCategory, original: 'Tasks' } }); +MenuRegistry.addCommand({ id: 'workbench.action.tasks.build', title: { value: nls.localize('BuildAction.label', "Run Build Task"), original: 'Run Build Task' }, category: { value: tasksCategory, original: 'Tasks' } }); +MenuRegistry.addCommand({ id: 'workbench.action.tasks.test', title: { value: nls.localize('TestAction.label', "Run Test Task"), original: 'Run Test Task' }, category: { value: tasksCategory, original: 'Tasks' } }); +MenuRegistry.addCommand({ id: 'workbench.action.tasks.configureDefaultBuildTask', title: { value: nls.localize('ConfigureDefaultBuildTask.label', "Configure Default Build Task"), original: 'Configure Default Build Task' }, category: { value: tasksCategory, original: 'Tasks' } }); +MenuRegistry.addCommand({ id: 'workbench.action.tasks.configureDefaultTestTask', title: { value: nls.localize('ConfigureDefaultTestTask.label', "Configure Default Test Task"), original: 'Configure Default Test Task' }, category: { value: tasksCategory, original: 'Tasks' } }); +// MenuRegistry.addCommand( { id: 'workbench.action.tasks.rebuild', title: nls.localize('RebuildAction.label', 'Run Rebuild Task'), category: tasksCategory }); +// MenuRegistry.addCommand( { id: 'workbench.action.tasks.clean', title: nls.localize('CleanAction.label', 'Run Clean Task'), category: tasksCategory }); + +// Tasks Output channel. Register it before using it in Task Service. +let outputChannelRegistry = Registry.as(OutputExt.OutputChannels); +outputChannelRegistry.registerChannel({ id: AbstractTaskService.OutputChannelId, label: AbstractTaskService.OutputChannelLabel, log: false }); + +// Register Quick Open +const quickOpenRegistry = (Registry.as(QuickOpenExtensions.Quickopen)); +const tasksPickerContextKey = 'inTasksPicker'; + +quickOpenRegistry.registerQuickOpenHandler( + new QuickOpenHandlerDescriptor( + QuickOpenHandler, + QuickOpenHandler.ID, + 'task ', + tasksPickerContextKey, + nls.localize('quickOpen.task', "Run Task") + ) +); + +const actionBarRegistry = Registry.as(ActionBarExtensions.Actionbar); +actionBarRegistry.registerActionBarContributor(Scope.VIEWER, QuickOpenActionContributor); + +// tasks.json validation +let schemaId = 'vscode://schemas/tasks'; +let schema: IJSONSchema = { + id: schemaId, + description: 'Task definition file', + type: 'object', + default: { + version: '2.0.0', + tasks: [ + { + label: 'My Task', + command: 'echo hello', + type: 'shell', + args: [], + problemMatcher: ['$tsc'], + presentation: { + reveal: 'always' + }, + group: 'build' + } + ] + } +}; + +import schemaVersion1 from '../common/jsonSchema_v1'; +import schemaVersion2, { updateProblemMatchers } from '../common/jsonSchema_v2'; +import { AbstractTaskService, ConfigureTaskAction } from 'vs/workbench/contrib/tasks/browser/abstractTaskService'; +schema.definitions = { + ...schemaVersion1.definitions, + ...schemaVersion2.definitions, +}; +schema.oneOf = [...(schemaVersion2.oneOf || []), ...(schemaVersion1.oneOf || [])]; + +let jsonRegistry = Registry.as(jsonContributionRegistry.Extensions.JSONContribution); +jsonRegistry.registerSchema(schemaId, schema); + +ProblemMatcherRegistry.onMatcherChanged(() => { + updateProblemMatchers(); + jsonRegistry.notifySchemaChanged(schemaId); +}); diff --git a/src/vs/workbench/contrib/tasks/browser/taskService.ts b/src/vs/workbench/contrib/tasks/browser/taskService.ts new file mode 100644 index 00000000000..17442169909 --- /dev/null +++ b/src/vs/workbench/contrib/tasks/browser/taskService.ts @@ -0,0 +1,51 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as nls from 'vs/nls'; +import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; +import { ITaskSystem } from 'vs/workbench/contrib/tasks/common/taskSystem'; +import { ExecutionEngine, TaskRunSource } from 'vs/workbench/contrib/tasks/common/tasks'; +import { TerminalTaskSystem } from './terminalTaskSystem'; +import { AbstractTaskService, WorkspaceFolderConfigurationResult } from 'vs/workbench/contrib/tasks/browser/abstractTaskService'; +import { TaskFilter } from 'vs/workbench/contrib/tasks/common/taskService'; + +export class TaskService extends AbstractTaskService { + private static readonly ProcessTaskSystemSupportMessage = nls.localize('taskService.processTaskSystem', 'Process task system is not support in the web.'); + + protected getTaskSystem(): ITaskSystem { + if (this._taskSystem) { + return this._taskSystem; + } + if (this.executionEngine === ExecutionEngine.Terminal) { + this._taskSystem = this.createTerminalTaskSystem(); + } else { + throw new Error(TaskService.ProcessTaskSystemSupportMessage); + } + this._taskSystemListener = this._taskSystem!.onDidStateChange((event) => { + if (this._taskSystem) { + this._taskRunningState.set(this._taskSystem.isActiveSync()); + } + this._onDidStateChange.fire(event); + }); + return this._taskSystem!; + } + + protected updateWorkspaceTasks(runSource: TaskRunSource = TaskRunSource.User): void { + this._workspaceTasksPromise = this.computeWorkspaceTasks(runSource).then(value => { + if (this.executionEngine !== ExecutionEngine.Terminal || ((this._taskSystem !== undefined) && !(this._taskSystem instanceof TerminalTaskSystem))) { + throw new Error(TaskService.ProcessTaskSystemSupportMessage); + } + return value; + }); + } + + protected computeLegacyConfiguration(workspaceFolder: IWorkspaceFolder): Promise { + throw new Error(TaskService.ProcessTaskSystemSupportMessage); + } + + protected versionAndEngineCompatible(filter?: TaskFilter): boolean { + return this.executionEngine === ExecutionEngine.Terminal; + } +} \ No newline at end of file diff --git a/src/vs/workbench/contrib/tasks/electron-browser/terminalTaskSystem.ts b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts similarity index 99% rename from src/vs/workbench/contrib/tasks/electron-browser/terminalTaskSystem.ts rename to src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts index 789b395e34b..fc0fea48fa4 100644 --- a/src/vs/workbench/contrib/tasks/electron-browser/terminalTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts @@ -38,7 +38,6 @@ import { ITaskSystem, ITaskSummary, ITaskExecuteResult, TaskExecuteKind, TaskError, TaskErrors, ITaskResolver, TelemetryEvent, Triggers, TaskTerminateResponse, TaskSystemInfoResolver, TaskSystemInfo, ResolveSet, ResolvedVariables } from 'vs/workbench/contrib/tasks/common/taskSystem'; -import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; import { URI } from 'vs/base/common/uri'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { Schemas } from 'vs/base/common/network'; @@ -764,7 +763,7 @@ export class TerminalTaskSystem implements ITaskSystem { if (platform === Platform.Platform.Windows) { defaultShell = 'cmd.exe'; } else { - defaultShell = 'bash.exe'; + defaultShell = 'bash'; } console.warn('Cannot get the default shell.'); } @@ -896,8 +895,7 @@ export class TerminalTaskSystem implements ITaskSystem { } } // This must be normalized to the OS - const authority = this.environmentService.configuration.remoteAuthority; - shellLaunchConfig.cwd = URI.from({ scheme: authority ? REMOTE_HOST_SCHEME : Schemas.file, authority: authority, path: cwd }); + shellLaunchConfig.cwd = resources.toLocalResource(URI.from({ scheme: Schemas.file, path: cwd }), this.environmentService.configuration.remoteAuthority); } if (options.env) { shellLaunchConfig.env = options.env; diff --git a/src/vs/workbench/contrib/tasks/electron-browser/taskService.ts b/src/vs/workbench/contrib/tasks/electron-browser/taskService.ts new file mode 100644 index 00000000000..388846988a3 --- /dev/null +++ b/src/vs/workbench/contrib/tasks/electron-browser/taskService.ts @@ -0,0 +1,151 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as nls from 'vs/nls'; +import * as Objects from 'vs/base/common/objects'; +import * as semver from 'semver'; +import { IStringDictionary } from 'vs/base/common/collections'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; +import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; +import { WorkbenchState, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; +import { ITaskSystem } from 'vs/workbench/contrib/tasks/common/taskSystem'; +import { ExecutionEngine, TaskRunSource } from 'vs/workbench/contrib/tasks/common/tasks'; +import * as TaskConfig from '../common/taskConfiguration'; +import { ProcessTaskSystem } from 'vs/workbench/contrib/tasks/node/processTaskSystem'; +import { ProcessRunnerDetector } from 'vs/workbench/contrib/tasks/node/processRunnerDetector'; +import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; +import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; +import { RunAutomaticTasks, AllowAutomaticTaskRunning, DisallowAutomaticTaskRunning } from 'vs/workbench/contrib/tasks/browser/runAutomaticTasks'; +import { AbstractTaskService } from 'vs/workbench/contrib/tasks/browser/abstractTaskService'; +import { TaskFilter } from 'vs/workbench/contrib/tasks/common/taskService'; + +let tasksCategory = nls.localize('tasksCategory', "Tasks"); + +const workbenchRegistry = Registry.as(WorkbenchExtensions.Workbench); +workbenchRegistry.registerWorkbenchContribution(RunAutomaticTasks, LifecyclePhase.Eventually); + +const actionRegistry = Registry.as(ActionExtensions.WorkbenchActions); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(AllowAutomaticTaskRunning, AllowAutomaticTaskRunning.ID, AllowAutomaticTaskRunning.LABEL), 'Tasks: Allow Automatic Tasks in Folder', tasksCategory); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(DisallowAutomaticTaskRunning, DisallowAutomaticTaskRunning.ID, DisallowAutomaticTaskRunning.LABEL), 'Tasks: Disallow Automatic Tasks in Folder', tasksCategory); + +interface WorkspaceFolderConfigurationResult { + workspaceFolder: IWorkspaceFolder; + config: TaskConfig.ExternalTaskRunnerConfiguration | undefined; + hasErrors: boolean; +} + +export class TaskService extends AbstractTaskService { + private _configHasErrors: boolean = false; + + protected getTaskSystem(): ITaskSystem { + if (this._taskSystem) { + return this._taskSystem; + } + if (this.executionEngine === ExecutionEngine.Terminal) { + this._taskSystem = this.createTerminalTaskSystem(); + } else { + let system = new ProcessTaskSystem( + this.markerService, this.modelService, this.telemetryService, this.outputService, + this.configurationResolverService, TaskService.OutputChannelId, + ); + system.hasErrors(this._configHasErrors); + this._taskSystem = system; + } + this._taskSystemListener = this._taskSystem!.onDidStateChange((event) => { + if (this._taskSystem) { + this._taskRunningState.set(this._taskSystem.isActiveSync()); + } + this._onDidStateChange.fire(event); + }); + return this._taskSystem!; + } + + protected updateWorkspaceTasks(runSource: TaskRunSource = TaskRunSource.User): void { + this._workspaceTasksPromise = this.computeWorkspaceTasks(runSource).then(value => { + if (this.executionEngine === ExecutionEngine.Process && this._taskSystem instanceof ProcessTaskSystem) { + // We can only have a process engine if we have one folder. + value.forEach((value) => { + this._configHasErrors = value.hasErrors; + (this._taskSystem as ProcessTaskSystem).hasErrors(this._configHasErrors); + }); + } + return value; + }); + } + + private hasDetectorSupport(config: TaskConfig.ExternalTaskRunnerConfiguration): boolean { + if (!config.command || this.contextService.getWorkbenchState() === WorkbenchState.EMPTY) { + return false; + } + return ProcessRunnerDetector.supports(TaskConfig.CommandString.value(config.command)); + } + + protected computeLegacyConfiguration(workspaceFolder: IWorkspaceFolder): Promise { + let { config, hasParseErrors } = this.getConfiguration(workspaceFolder); + if (hasParseErrors) { + return Promise.resolve({ workspaceFolder: workspaceFolder, hasErrors: true, config: undefined }); + } + if (config) { + if (this.hasDetectorSupport(config)) { + return new ProcessRunnerDetector(workspaceFolder, this.fileService, this.contextService, this.configurationResolverService, config).detect(true).then((value): WorkspaceFolderConfigurationResult => { + let hasErrors = this.printStderr(value.stderr); + let detectedConfig = value.config; + if (!detectedConfig) { + return { workspaceFolder, config, hasErrors }; + } + let result: TaskConfig.ExternalTaskRunnerConfiguration = Objects.deepClone(config)!; + let configuredTasks: IStringDictionary = Object.create(null); + const resultTasks = result.tasks; + if (!resultTasks) { + if (detectedConfig.tasks) { + result.tasks = detectedConfig.tasks; + } + } else { + resultTasks.forEach(task => { + if (task.taskName) { + configuredTasks[task.taskName] = task; + } + }); + if (detectedConfig.tasks) { + detectedConfig.tasks.forEach((task) => { + if (task.taskName && !configuredTasks[task.taskName]) { + resultTasks.push(task); + } + }); + } + } + return { workspaceFolder, config: result, hasErrors }; + }); + } else { + return Promise.resolve({ workspaceFolder, config, hasErrors: false }); + } + } else { + return new ProcessRunnerDetector(workspaceFolder, this.fileService, this.contextService, this.configurationResolverService).detect(true).then((value) => { + let hasErrors = this.printStderr(value.stderr); + return { workspaceFolder, config: value.config!, hasErrors }; + }); + } + } + + protected versionAndEngineCompatible(filter?: TaskFilter): boolean { + let range = filter && filter.version ? filter.version : undefined; + let engine = this.executionEngine; + + return (range === undefined) || ((semver.satisfies('0.1.0', range) && engine === ExecutionEngine.Process) || (semver.satisfies('2.0.0', range) && engine === ExecutionEngine.Terminal)); + } + + private printStderr(stderr: string[]): boolean { + let result = false; + if (stderr && stderr.length > 0) { + stderr.forEach((line) => { + result = true; + this._outputChannel.append(line + '\n'); + }); + this.showOutput(); + } + return result; + } +} \ No newline at end of file diff --git a/src/vs/workbench/services/configurationResolver/common/variableResolver.ts b/src/vs/workbench/services/configurationResolver/common/variableResolver.ts index 3d1e2a813c7..43d8013dc31 100644 --- a/src/vs/workbench/services/configurationResolver/common/variableResolver.ts +++ b/src/vs/workbench/services/configurationResolver/common/variableResolver.ts @@ -35,7 +35,7 @@ export class AbstractVariableResolverService implements IConfigurationResolverSe private _context: IVariableResolveContext, private _envVariables: IProcessEnvironment ) { - if (isWindows) { + if (isWindows && _envVariables) { this._envVariables = Object.create(null); Object.keys(_envVariables).forEach(key => { this._envVariables[key.toLowerCase()] = _envVariables[key]; diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index eebc044d28d..aaf84484bbf 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -268,7 +268,10 @@ import 'vs/workbench/contrib/terminal/browser/terminalPanel'; import 'vs/workbench/contrib/relauncher/electron-browser/relauncher.contribution'; // Tasks -import 'vs/workbench/contrib/tasks/electron-browser/task.contribution'; +import 'vs/workbench/contrib/tasks/browser/task.contribution'; +import { TaskService } from 'vs/workbench/contrib/tasks/electron-browser/taskService'; +import { ITaskService } from 'vs/workbench/contrib/tasks/common/taskService'; +registerSingleton(ITaskService, TaskService, true); // Remote import 'vs/workbench/contrib/remote/electron-browser/remote.contribution'; diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index ea19e1a09d4..01446dd7279 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -284,7 +284,11 @@ registerSingleton(ITerminalInstanceService, TerminalInstanceService, true); // import 'vs/workbench/contrib/relauncher/electron-browser/relauncher.contribution'; // Tasks -// import 'vs/workbench/contrib/tasks/electron-browser/task.contribution'; +import 'vs/workbench/contrib/tasks/browser/task.contribution'; +import { TaskService } from 'vs/workbench/contrib/tasks/browser/taskService'; +import { ITaskService } from 'vs/workbench/contrib/tasks/common/taskService'; +registerSingleton(ITaskService, TaskService, true); + // Remote // import 'vs/workbench/contrib/remote/electron-browser/remote.contribution'; From f50edc3f327b09b87a28a4fe942d7f94f737c945 Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 17 Jun 2019 11:34:56 +0200 Subject: [PATCH 0224/1449] explorer: add download command --- .../files/browser/fileActions.contribution.ts | 15 ++++++++- .../contrib/files/browser/fileActions.ts | 32 ++++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts index d0b0b89a049..7602efe8eaa 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts @@ -5,7 +5,7 @@ import * as nls from 'vs/nls'; import { Registry } from 'vs/platform/registry/common/platform'; -import { ToggleAutoSaveAction, GlobalNewUntitledFileAction, ShowOpenedFileInNewWindow, FocusFilesExplorer, GlobalCompareResourcesAction, SaveAllAction, ShowActiveFileInExplorer, CollapseExplorerView, RefreshExplorerView, CompareWithClipboardAction, NEW_FILE_COMMAND_ID, NEW_FILE_LABEL, NEW_FOLDER_COMMAND_ID, NEW_FOLDER_LABEL, TRIGGER_RENAME_LABEL, MOVE_FILE_TO_TRASH_LABEL, COPY_FILE_LABEL, PASTE_FILE_LABEL, FileCopiedContext, renameHandler, moveFileToTrashHandler, copyFileHandler, pasteFileHandler, deleteFileHandler, cutFileHandler } from 'vs/workbench/contrib/files/browser/fileActions'; +import { ToggleAutoSaveAction, GlobalNewUntitledFileAction, ShowOpenedFileInNewWindow, FocusFilesExplorer, GlobalCompareResourcesAction, SaveAllAction, ShowActiveFileInExplorer, CollapseExplorerView, RefreshExplorerView, CompareWithClipboardAction, NEW_FILE_COMMAND_ID, NEW_FILE_LABEL, NEW_FOLDER_COMMAND_ID, NEW_FOLDER_LABEL, TRIGGER_RENAME_LABEL, MOVE_FILE_TO_TRASH_LABEL, COPY_FILE_LABEL, PASTE_FILE_LABEL, FileCopiedContext, renameHandler, moveFileToTrashHandler, copyFileHandler, pasteFileHandler, deleteFileHandler, cutFileHandler, DOWNLOAD_COMMAND_ID } from 'vs/workbench/contrib/files/browser/fileActions'; import { revertLocalChangesCommand, acceptLocalChangesCommand, CONFLICT_RESOLUTION_CONTEXT } from 'vs/workbench/contrib/files/browser/saveErrorHandler'; import { SyncActionDescriptor, MenuId, MenuRegistry, ILocalizedString } from 'vs/platform/actions/common/actions'; import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; @@ -195,6 +195,8 @@ function appendToCommandPalette(id: string, title: ILocalizedString, category: I when }); } + +const downloadLabel = nls.localize('download', "Download"); appendToCommandPalette(COPY_PATH_COMMAND_ID, { value: nls.localize('copyPathOfActive', "Copy Path of Active File"), original: 'Copy Path of Active File' }, category); appendToCommandPalette(COPY_RELATIVE_PATH_COMMAND_ID, { value: nls.localize('copyRelativePathOfActive', "Copy Relative Path of Active File"), original: 'Copy Relative Path of Active File' }, category); appendToCommandPalette(SAVE_FILE_COMMAND_ID, { value: SAVE_FILE_LABEL, original: 'Save' }, category); @@ -208,6 +210,7 @@ appendToCommandPalette(SAVE_FILE_AS_COMMAND_ID, { value: SAVE_FILE_AS_LABEL, ori appendToCommandPalette(CLOSE_EDITOR_COMMAND_ID, { value: nls.localize('closeEditor', "Close Editor"), original: 'Close Editor' }, { value: nls.localize('view', "View"), original: 'View' }); appendToCommandPalette(NEW_FILE_COMMAND_ID, { value: NEW_FILE_LABEL, original: 'New File' }, category); appendToCommandPalette(NEW_FOLDER_COMMAND_ID, { value: NEW_FOLDER_LABEL, original: 'New Folder' }, category); +appendToCommandPalette(DOWNLOAD_COMMAND_ID, { value: downloadLabel, original: 'Download' }, category, ResourceContextKey.Scheme.isEqualTo(Schemas.vscodeRemote)); // Menu registration - open editors @@ -459,6 +462,16 @@ MenuRegistry.appendMenuItem(MenuId.ExplorerContext, { when: ExplorerFolderContext }); +MenuRegistry.appendMenuItem(MenuId.ExplorerContext, { + group: '5_cutcopypaste', + order: 30, + command: { + id: DOWNLOAD_COMMAND_ID, + title: downloadLabel, + }, + when: ResourceContextKey.Scheme.isEqualTo(Schemas.vscodeRemote) +}); + MenuRegistry.appendMenuItem(MenuId.ExplorerContext, { group: '6_copypath', order: 30, diff --git a/src/vs/workbench/contrib/files/browser/fileActions.ts b/src/vs/workbench/contrib/files/browser/fileActions.ts index ca8d73b9e92..093714c6f71 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.ts @@ -36,7 +36,7 @@ import { ICommandService, CommandsRegistry } from 'vs/platform/commands/common/c import { IListService, ListWidget } from 'vs/platform/list/browser/listService'; import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { Schemas } from 'vs/base/common/network'; -import { IDialogService, IConfirmationResult, getConfirmMessage } from 'vs/platform/dialogs/common/dialogs'; +import { IDialogService, IConfirmationResult, getConfirmMessage, IFileDialogService } from 'vs/platform/dialogs/common/dialogs'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { Constants } from 'vs/editor/common/core/uint'; @@ -45,6 +45,8 @@ import { coalesce } from 'vs/base/common/arrays'; import { AsyncDataTree } from 'vs/base/browser/ui/tree/asyncDataTree'; import { ExplorerItem, NewExplorerItem } from 'vs/workbench/contrib/files/common/explorerModel'; import { onUnexpectedError } from 'vs/base/common/errors'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { join, basename } from 'vs/base/common/path'; export const NEW_FILE_COMMAND_ID = 'explorer.newFile'; export const NEW_FILE_LABEL = nls.localize('newFile', "New File"); @@ -974,6 +976,34 @@ export const cutFileHandler = (accessor: ServicesAccessor) => { } }; +export const DOWNLOAD_COMMAND_ID = 'explorer.download'; +const downloadFileHandler = (accessor: ServicesAccessor) => { + const listService = accessor.get(IListService); + if (!listService.lastFocusedList) { + return; + } + const explorerContext = getContext(listService.lastFocusedList); + const textFileService = accessor.get(ITextFileService); + const fileDialogService = accessor.get(IFileDialogService); + const environmentService = accessor.get(IEnvironmentService); + + if (explorerContext.stat) { + const stats = explorerContext.selection.length > 1 ? explorerContext.selection : [explorerContext.stat]; + stats.forEach(async s => { + const resource = await fileDialogService.showSaveDialog({ + defaultUri: URI.file(join(environmentService.userHome, basename(s.resource.path))) + }); + if (resource) { + await textFileService.saveAs(s.resource, resource); + } + }); + } +}; +CommandsRegistry.registerCommand({ + id: DOWNLOAD_COMMAND_ID, + handler: downloadFileHandler +}); + export const pasteFileHandler = (accessor: ServicesAccessor) => { const listService = accessor.get(IListService); const clipboardService = accessor.get(IClipboardService); From 8e38e56f891da56e9622b0957d2856fa072ac2d7 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 17 Jun 2019 12:06:10 +0200 Subject: [PATCH 0225/1449] make isEqual case sensitive for non-file URIs --- src/vs/base/common/resources.ts | 2 +- src/vs/platform/files/common/files.ts | 5 ++--- src/vs/workbench/api/common/extHostWorkspace.ts | 3 +-- .../contrib/files/browser/editors/fileEditorTracker.ts | 7 +++---- src/vs/workbench/contrib/files/browser/fileActions.ts | 6 +++--- .../contrib/files/browser/views/explorerViewer.ts | 7 ++++--- .../preferences/common/preferencesContribution.ts | 3 +-- .../electron-browser/relauncher.contribution.ts | 4 ++-- .../configuration/browser/configurationService.ts | 9 +-------- .../services/textfile/common/textFileEditorModel.ts | 7 +++---- .../services/textfile/common/textFileService.ts | 6 +++--- .../workbench/services/textfile/node/textFileService.ts | 4 ++-- 12 files changed, 26 insertions(+), 37 deletions(-) diff --git a/src/vs/base/common/resources.ts b/src/vs/base/common/resources.ts index 521a02a4b57..67d82599d28 100644 --- a/src/vs/base/common/resources.ts +++ b/src/vs/base/common/resources.ts @@ -20,7 +20,7 @@ export function getComparisonKey(resource: URI): string { export function hasToIgnoreCase(resource: URI | undefined): boolean { // A file scheme resource is in the same platform as code, so ignore case for non linux platforms // Resource can be from another platform. Lowering the case as an hack. Should come from File system provider - return resource && resource.scheme === Schemas.file ? !isLinux : true; + return resource && resource.scheme === Schemas.file ? !isLinux : false; } export function basenameOrAuthority(resource: URI): string { diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index ac73dd3de19..c843856851e 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -6,7 +6,6 @@ import { sep } from 'vs/base/common/path'; import { URI } from 'vs/base/common/uri'; import * as glob from 'vs/base/common/glob'; -import { isLinux } from 'vs/base/common/platform'; import { createDecorator, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; import { Event } from 'vs/base/common/event'; import { startsWithIgnoreCase } from 'vs/base/common/strings'; @@ -429,10 +428,10 @@ export class FileChangesEvent { // For deleted also return true when deleted folder is parent of target path if (change.type === FileChangeType.DELETED) { - return isEqualOrParent(resource, change.resource, !isLinux /* ignorecase */); + return isEqualOrParent(resource, change.resource); } - return isEqual(resource, change.resource, !isLinux /* ignorecase */); + return isEqual(resource, change.resource); }); } diff --git a/src/vs/workbench/api/common/extHostWorkspace.ts b/src/vs/workbench/api/common/extHostWorkspace.ts index bf8abf0eab9..f6d9c59a1b6 100644 --- a/src/vs/workbench/api/common/extHostWorkspace.ts +++ b/src/vs/workbench/api/common/extHostWorkspace.ts @@ -9,7 +9,6 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { Emitter, Event } from 'vs/base/common/event'; import { TernarySearchTree } from 'vs/base/common/map'; import { Counter } from 'vs/base/common/numbers'; -import { isLinux } from 'vs/base/common/platform'; import { basenameOrAuthority, dirname, isEqual, relativePath, basename } from 'vs/base/common/resources'; import { compare } from 'vs/base/common/strings'; import { URI } from 'vs/base/common/uri'; @@ -34,7 +33,7 @@ export interface IExtHostWorkspaceProvider { } function isFolderEqual(folderA: URI, folderB: URI): boolean { - return isEqual(folderA, folderB, !isLinux); + return isEqual(folderA, folderB); } function compareWorkspaceFolderByUri(a: vscode.WorkspaceFolder, b: vscode.WorkspaceFolder): number { diff --git a/src/vs/workbench/contrib/files/browser/editors/fileEditorTracker.ts b/src/vs/workbench/contrib/files/browser/editors/fileEditorTracker.ts index 04fa2d58140..c04d6638e87 100644 --- a/src/vs/workbench/contrib/files/browser/editors/fileEditorTracker.ts +++ b/src/vs/workbench/contrib/files/browser/editors/fileEditorTracker.ts @@ -16,7 +16,6 @@ import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; import { distinct, coalesce } from 'vs/base/common/arrays'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { isLinux } from 'vs/base/common/platform'; import { ResourceMap } from 'vs/base/common/map'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { isCodeEditor } from 'vs/editor/browser/editorBrowser'; @@ -221,7 +220,7 @@ export class FileEditorTracker extends Disposable implements IWorkbenchContribut if (oldResource.toString() === resource.toString()) { reopenFileResource = newResource; // file got moved } else { - const index = this.getIndexOfPath(resource.path, oldResource.path); + const index = this.getIndexOfPath(resource.path, oldResource.path, resources.hasToIgnoreCase(resource)); reopenFileResource = resources.joinPath(newResource, resource.path.substr(index + oldResource.path.length + 1)); // parent folder got moved } @@ -244,7 +243,7 @@ export class FileEditorTracker extends Disposable implements IWorkbenchContribut }); } - private getIndexOfPath(path: string, candidate: string): number { + private getIndexOfPath(path: string, candidate: string, ignoreCase: boolean): number { if (candidate.length > path.length) { return -1; } @@ -253,7 +252,7 @@ export class FileEditorTracker extends Disposable implements IWorkbenchContribut return 0; } - if (!isLinux /* ignore case */) { + if (ignoreCase) { path = path.toLowerCase(); candidate = candidate.toLowerCase(); } diff --git a/src/vs/workbench/contrib/files/browser/fileActions.ts b/src/vs/workbench/contrib/files/browser/fileActions.ts index 4b0a0547dc9..9fd612b3801 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.ts @@ -6,7 +6,7 @@ import 'vs/css!./media/fileactions'; import * as nls from 'vs/nls'; import * as types from 'vs/base/common/types'; -import { isWindows, isLinux } from 'vs/base/common/platform'; +import { isWindows } from 'vs/base/common/platform'; import * as extpath from 'vs/base/common/extpath'; import * as resources from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; @@ -152,7 +152,7 @@ function deleteFiles(textFileService: ITextFileService, dialogService: IDialogSe // Handle dirty let confirmDirtyPromise: Promise = Promise.resolve(true); - const dirty = textFileService.getDirty().filter(d => distinctElements.some(e => resources.isEqualOrParent(d, e.resource, !isLinux /* ignorecase */))); + const dirty = textFileService.getDirty().filter(d => distinctElements.some(e => resources.isEqualOrParent(d, e.resource))); if (dirty.length) { let message: string; if (distinctElements.length > 1) { @@ -1031,7 +1031,7 @@ export const pasteFileHandler = (accessor: ServicesAccessor) => { // Check if target is ancestor of pasted folder Promise.all(toPaste.map(fileToPaste => { - if (element.resource.toString() !== fileToPaste.toString() && resources.isEqualOrParent(element.resource, fileToPaste, !isLinux /* ignorecase */)) { + if (element.resource.toString() !== fileToPaste.toString() && resources.isEqualOrParent(element.resource, fileToPaste)) { throw new Error(nls.localize('fileIsAncestor', "File to paste is an ancestor of the destination folder")); } diff --git a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts index 76fab053275..515f5737463 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts @@ -35,7 +35,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { IDragAndDropData, DataTransfers } from 'vs/base/browser/dnd'; import { Schemas } from 'vs/base/common/network'; import { DesktopDragAndDropData, ExternalElementsDragAndDropData, ElementsDragAndDropData } from 'vs/base/browser/ui/list/listView'; -import { isMacintosh, isLinux } from 'vs/base/common/platform'; +import { isMacintosh } from 'vs/base/common/platform'; import { IDialogService, IConfirmationResult, IConfirmation, getConfirmMessage } from 'vs/platform/dialogs/common/dialogs'; import { ITextFileService, ITextFileOperationResult } from 'vs/workbench/services/textfile/common/textfiles'; import { IWindowService } from 'vs/platform/windows/common/windows'; @@ -515,7 +515,7 @@ export class FileDragAndDrop implements ITreeDragAndDrop { return true; // Can not move a file to the same parent unless we copy } - if (isEqualOrParent(target.resource, source.resource, !isLinux /* ignorecase */)) { + if (isEqualOrParent(target.resource, source.resource)) { return true; // Can not move a parent folder into one of its children } @@ -655,8 +655,9 @@ export class FileDragAndDrop implements ITreeDragAndDrop { // Check for name collisions const targetNames = new Set(); if (targetStat.children) { + const ignoreCase = hasToIgnoreCase(target.resource); targetStat.children.forEach(child => { - targetNames.add(isLinux ? child.name : child.name.toLowerCase()); + targetNames.add(ignoreCase ? child.name : child.name.toLowerCase()); }); } diff --git a/src/vs/workbench/contrib/preferences/common/preferencesContribution.ts b/src/vs/workbench/contrib/preferences/common/preferencesContribution.ts index 246eaf2ed11..6e7f43ffcfa 100644 --- a/src/vs/workbench/contrib/preferences/common/preferencesContribution.ts +++ b/src/vs/workbench/contrib/preferences/common/preferencesContribution.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import { dispose, IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; -import { isLinux } from 'vs/base/common/platform'; import { isEqual } from 'vs/base/common/resources'; import { endsWith } from 'vs/base/common/strings'; import { URI } from 'vs/base/common/uri'; @@ -79,7 +78,7 @@ export class PreferencesContribution implements IWorkbenchContribution { } // Global User Settings File - if (isEqual(resource, this.environmentService.settingsResource, !isLinux)) { + if (isEqual(resource, this.environmentService.settingsResource)) { return { override: this.preferencesService.openGlobalSettings(true, options, group) }; } diff --git a/src/vs/workbench/contrib/relauncher/electron-browser/relauncher.contribution.ts b/src/vs/workbench/contrib/relauncher/electron-browser/relauncher.contribution.ts index 16e10299bd0..d0a81408c10 100644 --- a/src/vs/workbench/contrib/relauncher/electron-browser/relauncher.contribution.ts +++ b/src/vs/workbench/contrib/relauncher/electron-browser/relauncher.contribution.ts @@ -15,7 +15,7 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten import { RunOnceScheduler } from 'vs/base/common/async'; import { URI } from 'vs/base/common/uri'; import { isEqual } from 'vs/base/common/resources'; -import { isLinux, isMacintosh } from 'vs/base/common/platform'; +import { isMacintosh } from 'vs/base/common/platform'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; @@ -207,7 +207,7 @@ export class WorkspaceChangeExtHostRelauncher extends Disposable implements IWor // Restart extension host if first root folder changed (impact on deprecated workspace.rootPath API) const newFirstFolderResource = workspace.folders.length > 0 ? workspace.folders[0].uri : undefined; - if (!isEqual(this.firstFolderResource, newFirstFolderResource, !isLinux)) { + if (!isEqual(this.firstFolderResource, newFirstFolderResource)) { this.firstFolderResource = newFirstFolderResource; this.extensionHostRestarter.schedule(); // buffer calls to extension host restart diff --git a/src/vs/workbench/services/configuration/browser/configurationService.ts b/src/vs/workbench/services/configuration/browser/configurationService.ts index 618fb0bc326..d9c009c0a55 100644 --- a/src/vs/workbench/services/configuration/browser/configurationService.ts +++ b/src/vs/workbench/services/configuration/browser/configurationService.ts @@ -11,7 +11,6 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { Queue, Barrier } from 'vs/base/common/async'; import { IJSONContributionRegistry, Extensions as JSONExtensions } from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; import { IWorkspaceContextService, Workspace, WorkbenchState, IWorkspaceFolder, toWorkspaceFolders, IWorkspaceFoldersChangeEvent, WorkspaceFolder, toWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; -import { isLinux } from 'vs/base/common/platform'; import { ConfigurationChangeEvent, ConfigurationModel, DefaultConfigurationModel } from 'vs/platform/configuration/common/configurationModels'; import { IConfigurationChangeEvent, ConfigurationTarget, IConfigurationOverrides, keyFromOverrideIdentifier, isConfigurationOverrides, IConfigurationData, IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { Configuration, WorkspaceConfigurationChangeEvent, AllKeysConfigurationChangeEvent } from 'vs/workbench/services/configuration/common/configurationModels'; @@ -225,13 +224,7 @@ export class WorkspaceService extends Disposable implements IConfigurationServic } private contains(resources: URI[], toCheck: URI): boolean { - return resources.some(resource => { - if (isLinux) { - return resource.toString() === toCheck.toString(); - } - - return resource.toString().toLowerCase() === toCheck.toString().toLowerCase(); - }); + return resources.some(resource => isEqual(resource, toCheck)); } // Workspace Configuration Service Impl diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts index 9a70fd94b6a..b27c3277d70 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts @@ -24,7 +24,6 @@ import { RunOnceScheduler, timeout } from 'vs/base/common/async'; import { ITextBufferFactory } from 'vs/editor/common/model'; import { hash } from 'vs/base/common/hash'; import { INotificationService } from 'vs/platform/notification/common/notification'; -import { isLinux } from 'vs/base/common/platform'; import { toDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { ILogService } from 'vs/platform/log/common/log'; import { isEqual, isEqualOrParent, extname, basename, joinPath } from 'vs/base/common/resources'; @@ -775,17 +774,17 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil } // Check for global settings file - if (isEqual(this.resource, this.environmentService.settingsResource, !isLinux)) { + if (isEqual(this.resource, this.environmentService.settingsResource)) { return 'global-settings'; } // Check for keybindings file - if (isEqual(this.resource, this.environmentService.keybindingsResource, !isLinux)) { + if (isEqual(this.resource, this.environmentService.keybindingsResource)) { return 'keybindings'; } // Check for locale file - if (isEqual(this.resource, joinPath(this.environmentService.appSettingsHome, 'locale.json'), !isLinux)) { + if (isEqual(this.resource, joinPath(this.environmentService.appSettingsHome, 'locale.json'))) { return 'locale'; } diff --git a/src/vs/workbench/services/textfile/common/textFileService.ts b/src/vs/workbench/services/textfile/common/textFileService.ts index 9b1c25db695..657d38bc817 100644 --- a/src/vs/workbench/services/textfile/common/textFileService.ts +++ b/src/vs/workbench/services/textfile/common/textFileService.ts @@ -436,7 +436,7 @@ export abstract class TextFileService extends Disposable implements ITextFileSer } async delete(resource: URI, options?: { useTrash?: boolean, recursive?: boolean }): Promise { - const dirtyFiles = this.getDirty().filter(dirty => isEqualOrParent(dirty, resource, !platform.isLinux /* ignorecase */)); + const dirtyFiles = this.getDirty().filter(dirty => isEqualOrParent(dirty, resource)); await this.revertAll(dirtyFiles, { soft: true }); @@ -467,7 +467,7 @@ export abstract class TextFileService extends Disposable implements ITextFileSer } // Handle dirty source models if existing (if source URI is a folder, this can be multiple) - const dirtySourceModels = this.getDirtyFileModels().filter(model => isEqualOrParent(model.getResource(), source, !platform.isLinux /* ignorecase */)); + const dirtySourceModels = this.getDirtyFileModels().filter(model => isEqualOrParent(model.getResource(), source)); const dirtyTargetModelUris: URI[] = []; if (dirtySourceModels.length) { await Promise.all(dirtySourceModels.map(async sourceModel => { @@ -475,7 +475,7 @@ export abstract class TextFileService extends Disposable implements ITextFileSer let targetModelResource: URI; // If the source is the actual model, just use target as new resource - if (isEqual(sourceModelResource, source, !platform.isLinux /* ignorecase */)) { + if (isEqual(sourceModelResource, source)) { targetModelResource = target; } diff --git a/src/vs/workbench/services/textfile/node/textFileService.ts b/src/vs/workbench/services/textfile/node/textFileService.ts index 242aadab987..a9c2a222a8f 100644 --- a/src/vs/workbench/services/textfile/node/textFileService.ts +++ b/src/vs/workbench/services/textfile/node/textFileService.ts @@ -13,7 +13,7 @@ import { IFileStatWithMetadata, ICreateFileOptions, FileOperationError, FileOper import { Schemas } from 'vs/base/common/network'; import { exists, stat, chmod, rimraf, MAX_FILE_SIZE, MAX_HEAP_SIZE } from 'vs/base/node/pfs'; import { join, dirname } from 'vs/base/common/path'; -import { isMacintosh, isLinux } from 'vs/base/common/platform'; +import { isMacintosh } from 'vs/base/common/platform'; import product from 'vs/platform/product/node/product'; import { ITextResourceConfigurationService } from 'vs/editor/common/services/resourceConfiguration'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; @@ -490,7 +490,7 @@ export class EncodingOracle extends Disposable implements IResourceEncodings { for (const override of this.encodingOverrides) { // check if the resource is child of encoding override path - if (override.parent && isEqualOrParent(resource, override.parent, !isLinux /* ignorecase */)) { + if (override.parent && isEqualOrParent(resource, override.parent)) { return override.encoding; } From f14e0912121e1763f35c7f4fcb06b9597cfac2a9 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 17 Jun 2019 10:16:08 +0200 Subject: [PATCH 0226/1449] fix smoke test after problems view css change --- test/smoke/src/areas/problems/problems.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/smoke/src/areas/problems/problems.ts b/test/smoke/src/areas/problems/problems.ts index c71b7d33791..e0499151dcb 100644 --- a/test/smoke/src/areas/problems/problems.ts +++ b/test/smoke/src/areas/problems/problems.ts @@ -39,7 +39,7 @@ export class Problems { } public static getSelectorInProblemsView(problemType: ProblemSeverity): string { - let selector = problemType === ProblemSeverity.WARNING ? 'warning' : 'error'; + let selector = problemType === ProblemSeverity.WARNING ? 'severity-warning' : 'severity-error'; return `div[id="workbench.panel.markers"] .monaco-tl-contents .marker-icon.${selector}`; } From 405e4f0a9e8b164851e8089c32fa42a343f2a04b Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 17 Jun 2019 12:14:15 +0200 Subject: [PATCH 0227/1449] duplicate definition of basename --- src/vs/workbench/contrib/files/browser/fileActions.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/files/browser/fileActions.ts b/src/vs/workbench/contrib/files/browser/fileActions.ts index 093714c6f71..7cb75872a90 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.ts @@ -8,7 +8,7 @@ import * as nls from 'vs/nls'; import * as types from 'vs/base/common/types'; import { isWindows, isLinux } from 'vs/base/common/platform'; import * as extpath from 'vs/base/common/extpath'; -import { extname, basename } from 'vs/base/common/path'; +import { extname, basename, join } from 'vs/base/common/path'; import * as resources from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { toErrorMessage } from 'vs/base/common/errorMessage'; @@ -46,7 +46,6 @@ import { AsyncDataTree } from 'vs/base/browser/ui/tree/asyncDataTree'; import { ExplorerItem, NewExplorerItem } from 'vs/workbench/contrib/files/common/explorerModel'; import { onUnexpectedError } from 'vs/base/common/errors'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { join, basename } from 'vs/base/common/path'; export const NEW_FILE_COMMAND_ID = 'explorer.newFile'; export const NEW_FILE_LABEL = nls.localize('newFile', "New File"); From 553e8d60efb69d4c821ce5a0269111ab997ebb76 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 17 Jun 2019 13:04:26 +0200 Subject: [PATCH 0228/1449] progress - allow to report total/worked in viewlets/panels --- src/vs/platform/progress/common/progress.ts | 2 - .../progress/browser/progressService.ts | 130 ++++++++++-------- 2 files changed, 72 insertions(+), 60 deletions(-) diff --git a/src/vs/platform/progress/common/progress.ts b/src/vs/platform/progress/common/progress.ts index ac1259c91d2..1f5b8f08a30 100644 --- a/src/vs/platform/progress/common/progress.ts +++ b/src/vs/platform/progress/common/progress.ts @@ -92,8 +92,6 @@ export interface IProgress { report(item: T): void; } -export const emptyProgress: IProgress = Object.freeze({ report() { } }); - export class Progress implements IProgress { private _callback: (data: T) => void; diff --git a/src/vs/workbench/services/progress/browser/progressService.ts b/src/vs/workbench/services/progress/browser/progressService.ts index a17a5bd3662..afa9ad7dc76 100644 --- a/src/vs/workbench/services/progress/browser/progressService.ts +++ b/src/vs/workbench/services/progress/browser/progressService.ts @@ -6,8 +6,8 @@ import 'vs/css!./media/progressService'; import { localize } from 'vs/nls'; -import { IDisposable, dispose, DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle'; -import { IProgressService, IProgressOptions, IProgressStep, ProgressLocation, IProgress, emptyProgress, Progress, IProgressCompositeOptions, IProgressNotificationOptions } from 'vs/platform/progress/common/progress'; +import { IDisposable, dispose, DisposableStore, MutableDisposable, Disposable } from 'vs/base/common/lifecycle'; +import { IProgressService, IProgressOptions, IProgressStep, ProgressLocation, IProgress, Progress, IProgressCompositeOptions, IProgressNotificationOptions, IProgressRunner, ILocalProgressService } from 'vs/platform/progress/common/progress'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { StatusbarAlignment, IStatusbarService } from 'vs/platform/statusbar/common/statusbar'; import { timeout } from 'vs/base/common/async'; @@ -26,37 +26,35 @@ import { EventHelper } from 'vs/base/browser/dom'; import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; -export class ProgressService implements IProgressService, IDisposable { +export class ProgressService extends Disposable implements IProgressService { _serviceBrand: ServiceIdentifier; - private readonly _stack: [IProgressOptions, Progress][] = []; - private readonly _globalStatusEntry = new MutableDisposable(); + private readonly stack: [IProgressOptions, Progress][] = []; + private readonly globalStatusEntry = this._register(new MutableDisposable()); constructor( - @IActivityService private readonly _activityBar: IActivityService, - @IViewletService private readonly _viewletService: IViewletService, - @IPanelService private readonly _panelService: IPanelService, - @INotificationService private readonly _notificationService: INotificationService, - @IStatusbarService private readonly _statusbarService: IStatusbarService, - @ILayoutService private readonly _layoutService: ILayoutService, - @IThemeService private readonly _themeService: IThemeService, - @IKeybindingService private readonly _keybindingService: IKeybindingService - ) { } - - dispose() { - this._globalStatusEntry.dispose(); + @IActivityService private readonly activityService: IActivityService, + @IViewletService private readonly viewletService: IViewletService, + @IPanelService private readonly panelService: IPanelService, + @INotificationService private readonly notificationService: INotificationService, + @IStatusbarService private readonly statusbarService: IStatusbarService, + @ILayoutService private readonly layoutService: ILayoutService, + @IThemeService private readonly themeService: IThemeService, + @IKeybindingService private readonly keybindingService: IKeybindingService + ) { + super(); } withProgress(options: IProgressOptions, task: (progress: IProgress) => Promise, onDidCancel?: () => void): Promise { const { location } = options; if (typeof location === 'string') { - if (this._viewletService.getProgressIndicator(location)) { - return this._withViewletProgress(location, task, { ...options, location }); + if (this.viewletService.getProgressIndicator(location)) { + return this.withViewletProgress(location, task, { ...options, location }); } - if (this._panelService.getProgressIndicator(location)) { - return this._withPanelProgress(location, task, { ...options, location }); + if (this.panelService.getProgressIndicator(location)) { + return this.withPanelProgress(location, task, { ...options, location }); } return Promise.reject(new Error(`Bad progress location: ${location}`)); @@ -64,40 +62,40 @@ export class ProgressService implements IProgressService, IDisposable { switch (location) { case ProgressLocation.Notification: - return this._withNotificationProgress({ ...options, location }, task, onDidCancel); + return this.withNotificationProgress({ ...options, location }, task, onDidCancel); case ProgressLocation.Window: - return this._withWindowProgress(options, task); + return this.withWindowProgress(options, task); case ProgressLocation.Explorer: - return this._withViewletProgress('workbench.view.explorer', task, { ...options, location }); + return this.withViewletProgress('workbench.view.explorer', task, { ...options, location }); case ProgressLocation.Scm: - return this._withViewletProgress('workbench.view.scm', task, { ...options, location }); + return this.withViewletProgress('workbench.view.scm', task, { ...options, location }); case ProgressLocation.Extensions: - return this._withViewletProgress('workbench.view.extensions', task, { ...options, location }); + return this.withViewletProgress('workbench.view.extensions', task, { ...options, location }); case ProgressLocation.Dialog: - return this._withDialogProgress(options, task, onDidCancel); + return this.withDialogProgress(options, task, onDidCancel); default: return Promise.reject(new Error(`Bad progress location: ${location}`)); } } - private _withWindowProgress(options: IProgressOptions, callback: (progress: IProgress<{ message?: string }>) => Promise): Promise { - const task: [IProgressOptions, Progress] = [options, new Progress(() => this._updateWindowProgress())]; + private withWindowProgress(options: IProgressOptions, callback: (progress: IProgress<{ message?: string }>) => Promise): Promise { + const task: [IProgressOptions, Progress] = [options, new Progress(() => this.updateWindowProgress())]; const promise = callback(task[1]); let delayHandle: any = setTimeout(() => { delayHandle = undefined; - this._stack.unshift(task); - this._updateWindowProgress(); + this.stack.unshift(task); + this.updateWindowProgress(); // show progress for at least 150ms Promise.all([ timeout(150), promise ]).finally(() => { - const idx = this._stack.indexOf(task); - this._stack.splice(idx, 1); - this._updateWindowProgress(); + const idx = this.stack.indexOf(task); + this.stack.splice(idx, 1); + this.updateWindowProgress(); }); }, 150); @@ -105,11 +103,11 @@ export class ProgressService implements IProgressService, IDisposable { return promise.finally(() => clearTimeout(delayHandle)); } - private _updateWindowProgress(idx: number = 0) { - this._globalStatusEntry.clear(); + private updateWindowProgress(idx: number = 0) { + this.globalStatusEntry.clear(); - if (idx < this._stack.length) { - const [options, progress] = this._stack[idx]; + if (idx < this.stack.length) { + const [options, progress] = this.stack[idx]; let progressTitle = options.title; let progressMessage = progress.value && progress.value.message; @@ -133,18 +131,18 @@ export class ProgressService implements IProgressService, IDisposable { } else { // no title, no message -> no progress. try with next on stack - this._updateWindowProgress(idx + 1); + this.updateWindowProgress(idx + 1); return; } - this._globalStatusEntry.value = this._statusbarService.addEntry({ + this.globalStatusEntry.value = this.statusbarService.addEntry({ text: `$(sync~spin) ${text}`, tooltip: title }, 'status.progress', localize('status.progress', "Progress Message"), StatusbarAlignment.LEFT); } } - private _withNotificationProgress

, R = unknown>(options: IProgressNotificationOptions, callback: (progress: IProgress<{ message?: string, increment?: number }>) => P, onDidCancel?: () => void): P { + private withNotificationProgress

, R = unknown>(options: IProgressNotificationOptions, callback: (progress: IProgress<{ message?: string, increment?: number }>) => P, onDidCancel?: () => void): P { const toDispose = new DisposableStore(); const createNotification = (message: string | undefined, increment?: number): INotificationHandle | undefined => { @@ -174,7 +172,7 @@ export class ProgressService implements IProgressService, IDisposable { } const actions: INotificationActions = { primary: primaryActions, secondary: secondaryActions }; - const handle = this._notificationService.notify({ + const handle = this.notificationService.notify({ severity: Severity.Info, message, source: options.source, @@ -241,21 +239,17 @@ export class ProgressService implements IProgressService, IDisposable { return promise; } - private _withViewletProgress

, R = unknown>(viewletId: string, task: (progress: IProgress<{ message?: string }>) => P, options: IProgressCompositeOptions): P { - const promise = task(emptyProgress); + private withViewletProgress

, R = unknown>(viewletId: string, task: (progress: IProgress) => P, options: IProgressCompositeOptions): P { // show in viewlet - const viewletProgress = this._viewletService.getProgressIndicator(viewletId); - if (viewletProgress) { - viewletProgress.showWhile(promise, options.delay); - } + const promise = this.withCompositeProgress(this.viewletService.getProgressIndicator(viewletId), task, options); // show activity bar let activityProgress: IDisposable; let delayHandle: any = setTimeout(() => { delayHandle = undefined; - const handle = this._activityBar.showActivity( + const handle = this.activityService.showActivity( viewletId, new ProgressBadge(() => ''), 'progress-badge', @@ -286,19 +280,39 @@ export class ProgressService implements IProgressService, IDisposable { return promise; } - private _withPanelProgress

, R = unknown>(panelid: string, task: (progress: IProgress<{ message?: string }>) => P, options: IProgressCompositeOptions): P { - const promise = task(emptyProgress); + private withPanelProgress

, R = unknown>(panelid: string, task: (progress: IProgress) => P, options: IProgressCompositeOptions): P { // show in panel - const panelProgress = this._panelService.getProgressIndicator(panelid); - if (panelProgress) { - panelProgress.showWhile(promise, options.delay); + return this.withCompositeProgress(this.panelService.getProgressIndicator(panelid), task, options); + } + + private withCompositeProgress

, R = unknown>(compositeProgressService: ILocalProgressService | null, task: (progress: IProgress) => P, options: IProgressCompositeOptions): P { + let progressRunner: IProgressRunner | undefined = undefined; + + const promise = task({ + report: progress => { + if (!progressRunner) { + return; + } + + if (typeof progress.increment === 'number') { + progressRunner.worked(progress.increment); + } + } + }); + + if (compositeProgressService) { + if (typeof options.total === 'number') { + progressRunner = compositeProgressService.show(options.total, options.delay); + } else { + compositeProgressService.showWhile(promise, options.delay); + } } return promise; } - private _withDialogProgress

, R = unknown>(options: IProgressOptions, task: (progress: IProgress<{ message?: string, increment?: number }>) => P, onDidCancel?: () => void): P { + private withDialogProgress

, R = unknown>(options: IProgressOptions, task: (progress: IProgress) => P, onDidCancel?: () => void): P { const disposables = new DisposableStore(); const allowableCommands = [ 'workbench.action.quit', @@ -309,13 +323,13 @@ export class ProgressService implements IProgressService, IDisposable { const createDialog = (message: string) => { dialog = new Dialog( - this._layoutService.container, + this.layoutService.container, message, [options.cancellable ? localize('cancel', "Cancel") : localize('dismiss', "Dismiss")], { type: 'pending', keyEventProcessor: (event: StandardKeyboardEvent) => { - const resolved = this._keybindingService.softDispatch(event, this._layoutService.container); + const resolved = this.keybindingService.softDispatch(event, this.layoutService.container); if (resolved && resolved.commandId) { if (allowableCommands.indexOf(resolved.commandId) === -1) { EventHelper.stop(event, true); @@ -326,7 +340,7 @@ export class ProgressService implements IProgressService, IDisposable { ); disposables.add(dialog); - disposables.add(attachDialogStyler(dialog, this._themeService)); + disposables.add(attachDialogStyler(dialog, this.themeService)); dialog.show().then(() => { if (typeof onDidCancel === 'function') { From 9b8401da2d36a256e5d8cfb4e369bf485135d2f1 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 17 Jun 2019 15:06:47 +0200 Subject: [PATCH 0229/1449] fix #74290 --- .../browser/services/bulkEditService.ts | 4 ++-- src/vs/platform/progress/common/progress.ts | 3 +++ .../contrib/search/browser/replaceService.ts | 10 ++++------ .../contrib/search/browser/searchView.ts | 19 ++++++++++++------- .../contrib/search/common/replace.ts | 4 ++-- .../contrib/search/common/searchModel.ts | 6 +++--- .../bulkEdit/browser/bulkEditService.ts | 15 +++++++-------- .../progress/browser/progressService.ts | 5 +++++ 8 files changed, 38 insertions(+), 28 deletions(-) diff --git a/src/vs/editor/browser/services/bulkEditService.ts b/src/vs/editor/browser/services/bulkEditService.ts index 9411568fc79..1bbda5bf6ef 100644 --- a/src/vs/editor/browser/services/bulkEditService.ts +++ b/src/vs/editor/browser/services/bulkEditService.ts @@ -6,14 +6,14 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { WorkspaceEdit } from 'vs/editor/common/modes'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { IProgressRunner } from 'vs/platform/progress/common/progress'; +import { IProgress, IProgressStep } from 'vs/platform/progress/common/progress'; export const IBulkEditService = createDecorator('IWorkspaceEditService'); export interface IBulkEditOptions { editor?: ICodeEditor; - progress?: IProgressRunner; + progress?: IProgress; } export interface IBulkEditResult { diff --git a/src/vs/platform/progress/common/progress.ts b/src/vs/platform/progress/common/progress.ts index 1f5b8f08a30..1e1162f640f 100644 --- a/src/vs/platform/progress/common/progress.ts +++ b/src/vs/platform/progress/common/progress.ts @@ -74,6 +74,7 @@ export interface IProgressCompositeOptions extends IProgressOptions { export interface IProgressStep { message?: string; increment?: number; + total?: number; } export interface IProgressRunner { @@ -82,6 +83,8 @@ export interface IProgressRunner { done(): void; } +export const emptyProgress: IProgress = { report: () => { } }; + export const emptyProgressRunner: IProgressRunner = Object.freeze({ total() { }, worked() { }, diff --git a/src/vs/workbench/contrib/search/browser/replaceService.ts b/src/vs/workbench/contrib/search/browser/replaceService.ts index 763ae2aa453..71d38344f4c 100644 --- a/src/vs/workbench/contrib/search/browser/replaceService.ts +++ b/src/vs/workbench/contrib/search/browser/replaceService.ts @@ -13,7 +13,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { IModelService } from 'vs/editor/common/services/modelService'; import { IModeService } from 'vs/editor/common/services/modeService'; import { Match, FileMatch, FileMatchOrMatch, ISearchWorkbenchService } from 'vs/workbench/contrib/search/common/searchModel'; -import { IProgressRunner } from 'vs/platform/progress/common/progress'; +import { IProgress, IProgressStep } from 'vs/platform/progress/common/progress'; import { ITextModelService, ITextModelContentProvider } from 'vs/editor/common/services/resolverService'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { ScrollType } from 'vs/editor/common/editorCommon'; @@ -101,13 +101,11 @@ export class ReplaceService implements IReplaceService { ) { } replace(match: Match): Promise; - replace(files: FileMatch[], progress?: IProgressRunner): Promise; - replace(match: FileMatchOrMatch, progress?: IProgressRunner, resource?: URI): Promise; - replace(arg: any, progress: IProgressRunner | undefined = undefined, resource: URI | null = null): Promise { - + replace(files: FileMatch[], progress?: IProgress): Promise; + replace(match: FileMatchOrMatch, progress?: IProgress, resource?: URI): Promise; + replace(arg: any, progress: IProgress | undefined = undefined, resource: URI | null = null): Promise { const edits: ResourceTextEdit[] = this.createEdits(arg, resource); return this.bulkEditorService.apply({ edits }, { progress }).then(() => this.textFileService.saveAll(edits.map(e => e.resource))); - } openReplacePreview(element: FileMatchOrMatch, preserveFocus?: boolean, sideBySide?: boolean, pinned?: boolean): Promise { diff --git a/src/vs/workbench/contrib/search/browser/searchView.ts b/src/vs/workbench/contrib/search/browser/searchView.ts index f51fd06cb9d..35bc6bf882b 100644 --- a/src/vs/workbench/contrib/search/browser/searchView.ts +++ b/src/vs/workbench/contrib/search/browser/searchView.ts @@ -33,7 +33,7 @@ import { FileChangesEvent, FileChangeType, IFileService } from 'vs/platform/file import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { TreeResourceNavigator2, WorkbenchObjectTree, getSelectionKeyboardEvent } from 'vs/platform/list/browser/listService'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; -import { ILocalProgressService, IProgressService } from 'vs/platform/progress/common/progress'; +import { IProgressService, IProgressStep, IProgress } from 'vs/platform/progress/common/progress'; import { IPatternInfo, ISearchComplete, ISearchConfiguration, ISearchConfigurationProperties, ITextQuery, SearchErrorCode, VIEW_ID, VIEWLET_ID } from 'vs/workbench/services/search/common/search'; import { ISearchHistoryService, ISearchHistoryValues } from 'vs/workbench/contrib/search/common/searchHistoryService'; import { diffInserted, diffInsertedOutline, diffRemoved, diffRemovedOutline, editorFindMatchHighlight, editorFindMatchHighlightBorder, listActiveSelectionForeground } from 'vs/platform/theme/common/colorRegistry'; @@ -129,7 +129,6 @@ export class SearchView extends ViewletPanel { options: IViewletPanelOptions, @IFileService private readonly fileService: IFileService, @IEditorService private readonly editorService: IEditorService, - @ILocalProgressService private readonly localProgressService: ILocalProgressService, @IProgressService private readonly progressService: IProgressService, @INotificationService private readonly notificationService: INotificationService, @IDialogService private readonly dialogService: IDialogService, @@ -518,13 +517,19 @@ export class SearchView extends ViewletPanel { return; } - const progressRunner = this.localProgressService.show(100); - const occurrences = this.viewModel.searchResult.count(); const fileCount = this.viewModel.searchResult.fileCount(); const replaceValue = this.searchWidget.getReplaceValue() || ''; const afterReplaceAllMessage = this.buildAfterReplaceAllMessage(occurrences, fileCount, replaceValue); + let progressComplete: () => void; + let progressReporter: IProgress; + this.progressService.withProgress({ location: VIEWLET_ID, delay: 100, total: occurrences }, p => { + progressReporter = p; + + return new Promise(resolve => progressComplete = resolve); + }); + const confirmation: IConfirmation = { title: nls.localize('replaceAll.confirmation.title', "Replace All"), message: this.buildReplaceAllConfirmationMessage(occurrences, fileCount, replaceValue), @@ -535,12 +540,12 @@ export class SearchView extends ViewletPanel { this.dialogService.confirm(confirmation).then(res => { if (res.confirmed) { this.searchWidget.setReplaceAllActionState(false); - this.viewModel.searchResult.replaceAll(progressRunner).then(() => { - progressRunner.done(); + this.viewModel.searchResult.replaceAll(progressReporter).then(() => { + progressComplete(); const messageEl = this.clearMessage(); dom.append(messageEl, $('p', undefined, afterReplaceAllMessage)); }, (error) => { - progressRunner.done(); + progressComplete(); errors.isPromiseCanceledError(error); this.notificationService.error(error); }); diff --git a/src/vs/workbench/contrib/search/common/replace.ts b/src/vs/workbench/contrib/search/common/replace.ts index 13db8de0277..f66493dc466 100644 --- a/src/vs/workbench/contrib/search/common/replace.ts +++ b/src/vs/workbench/contrib/search/common/replace.ts @@ -5,7 +5,7 @@ import { Match, FileMatch, FileMatchOrMatch } from 'vs/workbench/contrib/search/common/searchModel'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { IProgressRunner } from 'vs/platform/progress/common/progress'; +import { IProgress, IProgressStep } from 'vs/platform/progress/common/progress'; export const IReplaceService = createDecorator('replaceService'); @@ -22,7 +22,7 @@ export interface IReplaceService { * Replace all the matches from the given file matches in the files * You can also pass the progress runner to update the progress of replacing. */ - replace(files: FileMatch[], progress?: IProgressRunner): Promise; + replace(files: FileMatch[], progress?: IProgress): Promise; /** * Opens the replace preview for given file match or match diff --git a/src/vs/workbench/contrib/search/common/searchModel.ts b/src/vs/workbench/contrib/search/common/searchModel.ts index 040e86f87fd..8ef400154d6 100644 --- a/src/vs/workbench/contrib/search/common/searchModel.ts +++ b/src/vs/workbench/contrib/search/common/searchModel.ts @@ -18,7 +18,7 @@ import { FindMatch, IModelDeltaDecoration, ITextModel, OverviewRulerLane, Tracke import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; import { IModelService } from 'vs/editor/common/services/modelService'; import { createDecorator, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IProgressRunner } from 'vs/platform/progress/common/progress'; +import { IProgress, IProgressStep } from 'vs/platform/progress/common/progress'; import { ReplacePattern } from 'vs/workbench/services/search/common/replace'; import { IFileMatch, IPatternInfo, ISearchComplete, ISearchProgressItem, ISearchService, ITextQuery, ITextSearchPreviewOptions, ITextSearchMatch, ITextSearchStats, resultIsMatch, ISearchRange, OneLineRange } from 'vs/workbench/services/search/common/search'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -736,10 +736,10 @@ export class SearchResult extends Disposable { return this.getFolderMatch(match.resource()).replace(match); } - replaceAll(progressRunner: IProgressRunner): Promise { + replaceAll(progress: IProgress): Promise { this.replacingAll = true; - const promise = this.replaceService.replace(this.matches(), progressRunner); + const promise = this.replaceService.replace(this.matches(), progress); const onDone = Event.stopwatch(Event.fromPromise(promise)); /* __GDPR__ "replaceAll.started" : { diff --git a/src/vs/workbench/services/bulkEdit/browser/bulkEditService.ts b/src/vs/workbench/services/bulkEdit/browser/bulkEditService.ts index 079e00df824..f698782a600 100644 --- a/src/vs/workbench/services/bulkEdit/browser/bulkEditService.ts +++ b/src/vs/workbench/services/bulkEdit/browser/bulkEditService.ts @@ -18,7 +18,7 @@ import { localize } from 'vs/nls'; import { IFileService, FileSystemProviderCapabilities } from 'vs/platform/files/common/files'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ILogService } from 'vs/platform/log/common/log'; -import { emptyProgressRunner, IProgress, IProgressRunner } from 'vs/platform/progress/common/progress'; +import { IProgress, IProgressStep, emptyProgress } from 'vs/platform/progress/common/progress'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { ILabelService } from 'vs/platform/label/common/label'; @@ -231,11 +231,11 @@ export class BulkEdit { private _edits: Edit[] = []; private _editor: ICodeEditor | undefined; - private _progress?: IProgressRunner; + private _progress: IProgress; constructor( editor: ICodeEditor | undefined, - progress: IProgressRunner | undefined, + progress: IProgress | undefined, @ILogService private readonly _logService: ILogService, @ITextModelService private readonly _textModelService: ITextModelService, @IFileService private readonly _fileService: IFileService, @@ -244,7 +244,7 @@ export class BulkEdit { @IConfigurationService private readonly _configurationService: IConfigurationService ) { this._editor = editor; - this._progress = progress || emptyProgressRunner; + this._progress = progress || emptyProgress; } add(edits: Edit[] | Edit): void { @@ -294,10 +294,9 @@ export class BulkEdit { // define total work and progress callback // for child operations - if (this._progress) { - this._progress.total(total); - } - let progress: IProgress = { report: _ => this._progress && this._progress.worked(1) }; + this._progress.report({ total }); + + let progress: IProgress = { report: _ => this._progress.report({ increment: 1 }) }; // do it. for (const group of groups) { diff --git a/src/vs/workbench/services/progress/browser/progressService.ts b/src/vs/workbench/services/progress/browser/progressService.ts index afa9ad7dc76..852faf28a93 100644 --- a/src/vs/workbench/services/progress/browser/progressService.ts +++ b/src/vs/workbench/services/progress/browser/progressService.ts @@ -298,12 +298,17 @@ export class ProgressService extends Disposable implements IProgressService { if (typeof progress.increment === 'number') { progressRunner.worked(progress.increment); } + + if (typeof progress.total === 'number') { + progressRunner.total(progress.total); + } } }); if (compositeProgressService) { if (typeof options.total === 'number') { progressRunner = compositeProgressService.show(options.total, options.delay); + promise.catch(() => undefined /* ignore */).finally(() => progressRunner ? progressRunner.done() : undefined); } else { compositeProgressService.showWhile(promise, options.delay); } From 466c132f5b4362b3be485a1f7a624b3a7316ddb8 Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 17 Jun 2019 16:18:12 +0200 Subject: [PATCH 0230/1449] polish download action --- src/vs/platform/dialogs/common/dialogs.ts | 5 +++++ .../contrib/files/browser/fileActions.contribution.ts | 6 +++--- src/vs/workbench/contrib/files/browser/fileActions.ts | 7 +++---- .../services/dialogs/browser/fileDialogService.ts | 2 +- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/vs/platform/dialogs/common/dialogs.ts b/src/vs/platform/dialogs/common/dialogs.ts index f1b576222ec..c86051170e0 100644 --- a/src/vs/platform/dialogs/common/dialogs.ts +++ b/src/vs/platform/dialogs/common/dialogs.ts @@ -59,6 +59,11 @@ export interface ISaveDialogOptions { */ defaultUri?: URI; + /** + * If the defaultUri is not provided use the default file name. + */ + defaultFileName?: string; + /** * A set of file filters that are used by the dialog. Each entry is a human readable label, * like "TypeScript", and an array of extensions. diff --git a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts index 7602efe8eaa..1f20e01c590 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts @@ -23,7 +23,7 @@ import { ResourceContextKey } from 'vs/workbench/common/resources'; import { WorkbenchListDoubleSelection } from 'vs/platform/list/browser/listService'; import { URI } from 'vs/base/common/uri'; import { Schemas } from 'vs/base/common/network'; -import { SupportsWorkspacesContext } from 'vs/workbench/browser/contextkeys'; +import { SupportsWorkspacesContext, IsWebContext } from 'vs/workbench/browser/contextkeys'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; // Contribute Global Actions @@ -210,7 +210,7 @@ appendToCommandPalette(SAVE_FILE_AS_COMMAND_ID, { value: SAVE_FILE_AS_LABEL, ori appendToCommandPalette(CLOSE_EDITOR_COMMAND_ID, { value: nls.localize('closeEditor', "Close Editor"), original: 'Close Editor' }, { value: nls.localize('view', "View"), original: 'View' }); appendToCommandPalette(NEW_FILE_COMMAND_ID, { value: NEW_FILE_LABEL, original: 'New File' }, category); appendToCommandPalette(NEW_FOLDER_COMMAND_ID, { value: NEW_FOLDER_LABEL, original: 'New Folder' }, category); -appendToCommandPalette(DOWNLOAD_COMMAND_ID, { value: downloadLabel, original: 'Download' }, category, ResourceContextKey.Scheme.isEqualTo(Schemas.vscodeRemote)); +appendToCommandPalette(DOWNLOAD_COMMAND_ID, { value: downloadLabel, original: 'Download' }, category, ContextKeyExpr.and(IsWebContext.toNegated(), ResourceContextKey.Scheme.notEqualsTo(Schemas.file))); // Menu registration - open editors @@ -469,7 +469,7 @@ MenuRegistry.appendMenuItem(MenuId.ExplorerContext, { id: DOWNLOAD_COMMAND_ID, title: downloadLabel, }, - when: ResourceContextKey.Scheme.isEqualTo(Schemas.vscodeRemote) + when: ContextKeyExpr.and(IsWebContext.toNegated(), ResourceContextKey.Scheme.notEqualsTo(Schemas.file)) }); MenuRegistry.appendMenuItem(MenuId.ExplorerContext, { diff --git a/src/vs/workbench/contrib/files/browser/fileActions.ts b/src/vs/workbench/contrib/files/browser/fileActions.ts index 7cb75872a90..e65deb03e95 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.ts @@ -8,7 +8,7 @@ import * as nls from 'vs/nls'; import * as types from 'vs/base/common/types'; import { isWindows, isLinux } from 'vs/base/common/platform'; import * as extpath from 'vs/base/common/extpath'; -import { extname, basename, join } from 'vs/base/common/path'; +import { extname, basename } from 'vs/base/common/path'; import * as resources from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { toErrorMessage } from 'vs/base/common/errorMessage'; @@ -45,7 +45,6 @@ import { coalesce } from 'vs/base/common/arrays'; import { AsyncDataTree } from 'vs/base/browser/ui/tree/asyncDataTree'; import { ExplorerItem, NewExplorerItem } from 'vs/workbench/contrib/files/common/explorerModel'; import { onUnexpectedError } from 'vs/base/common/errors'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; export const NEW_FILE_COMMAND_ID = 'explorer.newFile'; export const NEW_FILE_LABEL = nls.localize('newFile', "New File"); @@ -984,13 +983,13 @@ const downloadFileHandler = (accessor: ServicesAccessor) => { const explorerContext = getContext(listService.lastFocusedList); const textFileService = accessor.get(ITextFileService); const fileDialogService = accessor.get(IFileDialogService); - const environmentService = accessor.get(IEnvironmentService); if (explorerContext.stat) { const stats = explorerContext.selection.length > 1 ? explorerContext.selection : [explorerContext.stat]; stats.forEach(async s => { const resource = await fileDialogService.showSaveDialog({ - defaultUri: URI.file(join(environmentService.userHome, basename(s.resource.path))) + availableFileSystems: [Schemas.file], + defaultFileName: basename(s.resource.path) }); if (resource) { await textFileService.saveAs(s.resource, resource); diff --git a/src/vs/workbench/services/dialogs/browser/fileDialogService.ts b/src/vs/workbench/services/dialogs/browser/fileDialogService.ts index c5792b4a904..e46f242e947 100644 --- a/src/vs/workbench/services/dialogs/browser/fileDialogService.ts +++ b/src/vs/workbench/services/dialogs/browser/fileDialogService.ts @@ -189,7 +189,7 @@ export class FileDialogService implements IFileDialogService { private toNativeSaveDialogOptions(options: ISaveDialogOptions): Electron.SaveDialogOptions { return { - defaultPath: options.defaultUri && options.defaultUri.fsPath, + defaultPath: options.defaultUri && options.defaultUri.fsPath || options.defaultFileName, buttonLabel: options.saveLabel, filters: options.filters, title: options.title From d59da643f3e72dc87f0afc21020584fe882bbd0c Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 17 Jun 2019 16:43:43 +0200 Subject: [PATCH 0231/1449] debug.console.wordWrap fixes #72210 --- src/vs/workbench/contrib/debug/browser/repl.ts | 13 +++++++++---- src/vs/workbench/contrib/debug/common/debug.ts | 1 + .../debug/electron-browser/debug.contribution.ts | 5 +++++ .../electron-browser/relauncher.contribution.ts | 8 ++++++++ 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/debug/browser/repl.ts b/src/vs/workbench/contrib/debug/browser/repl.ts index 5e5a60653c1..ea36e337eaf 100644 --- a/src/vs/workbench/contrib/debug/browser/repl.ts +++ b/src/vs/workbench/contrib/debug/browser/repl.ts @@ -375,6 +375,7 @@ export class Repl extends Panel implements IPrivateReplService, IHistoryNavigati this.createReplInput(this.container); this.replDelegate = new ReplDelegate(this.configurationService); + const wordWrap = this.configurationService.getValue('debug').console.wordWrap; this.tree = this.instantiationService.createInstance(WorkbenchAsyncDataTree, treeContainer, this.replDelegate, [ this.instantiationService.createInstance(VariablesRenderer), this.instantiationService.createInstance(ReplSimpleElementsRenderer), @@ -386,11 +387,10 @@ export class Repl extends Panel implements IPrivateReplService, IHistoryNavigati identityProvider: { getId: (element: IReplElement) => element.getId() }, mouseSupport: false, keyboardNavigationLabelProvider: { getKeyboardNavigationLabel: (e: IReplElement) => e }, - horizontalScrolling: false, + horizontalScrolling: !wordWrap, setRowLineHeight: false, - supportDynamicHeights: true + supportDynamicHeights: wordWrap }) as WorkbenchAsyncDataTree; - this._register(this.tree.onContextMenu(e => this.onContextMenu(e))); let lastSelectedString: string; this._register(this.tree.onMouseClick(() => { @@ -742,8 +742,13 @@ class ReplDelegate implements IListVirtualDelegate { const countNumberOfLines = (str: string) => Math.max(1, (str.match(/\r\n|\n/g) || []).length); // Give approximate heights. Repl has dynamic height so the tree will measure the actual height on its own. - const fontSize = this.configurationService.getValue('debug').console.fontSize; + const config = this.configurationService.getValue('debug'); + const fontSize = config.console.fontSize; const rowHeight = Math.ceil(1.4 * fontSize); + const wordWrap = config.console.wordWrap; + if (!wordWrap) { + return element instanceof Expression ? 2 * rowHeight : rowHeight; + } // In order to keep scroll position we need to give a good approximation to the tree // For every 150 characters increase the number of lines needed diff --git a/src/vs/workbench/contrib/debug/common/debug.ts b/src/vs/workbench/contrib/debug/common/debug.ts index 1bff71b9e9c..ff5f06503ee 100644 --- a/src/vs/workbench/contrib/debug/common/debug.ts +++ b/src/vs/workbench/contrib/debug/common/debug.ts @@ -437,6 +437,7 @@ export interface IDebugConfiguration { fontSize: number; fontFamily: string; lineHeight: number; + wordWrap: boolean; }; } diff --git a/src/vs/workbench/contrib/debug/electron-browser/debug.contribution.ts b/src/vs/workbench/contrib/debug/electron-browser/debug.contribution.ts index eee7b27c4af..f15f7fd393e 100644 --- a/src/vs/workbench/contrib/debug/electron-browser/debug.contribution.ts +++ b/src/vs/workbench/contrib/debug/electron-browser/debug.contribution.ts @@ -249,6 +249,11 @@ configurationRegistry.registerConfiguration({ description: nls.localize('debug.console.lineHeight', "Controls the line height in pixels in the debug console. Use 0 to compute the line height from the font size."), default: 0 }, + 'debug.console.wordWrap': { + type: 'boolean', + description: nls.localize('debug.console.wordWrap', "Controls if the lines should wrap in the debug console."), + default: true + }, 'launch': { type: 'object', description: nls.localize({ comment: ['This is the description for a setting'], key: 'launch' }, "Global debug launch configuration. Should be used as an alternative to 'launch.json' that is shared across workspaces."), diff --git a/src/vs/workbench/contrib/relauncher/electron-browser/relauncher.contribution.ts b/src/vs/workbench/contrib/relauncher/electron-browser/relauncher.contribution.ts index 16e10299bd0..dc4f08e446e 100644 --- a/src/vs/workbench/contrib/relauncher/electron-browser/relauncher.contribution.ts +++ b/src/vs/workbench/contrib/relauncher/electron-browser/relauncher.contribution.ts @@ -25,6 +25,7 @@ interface IConfiguration extends IWindowsConfiguration { telemetry: { enableCrashReporter: boolean }; keyboard: { touchbar: { enabled: boolean } }; workbench: { list: { horizontalScrolling: boolean }, useExperimentalGridLayout: boolean }; + debug: { console: { wordWrap: boolean } }; } export class SettingsChangeRelauncher extends Disposable implements IWorkbenchContribution { @@ -38,6 +39,7 @@ export class SettingsChangeRelauncher extends Disposable implements IWorkbenchCo private touchbarEnabled: boolean; private treeHorizontalScrolling: boolean; private useGridLayout: boolean; + private debugConsoleWordWrap: boolean; constructor( @IWindowsService private readonly windowsService: IWindowsService, @@ -109,6 +111,12 @@ export class SettingsChangeRelauncher extends Disposable implements IWorkbenchCo changed = true; } + // Debug console word wrap + if (config.debug && typeof config.debug.console.wordWrap === 'boolean' && config.debug.console.wordWrap !== this.debugConsoleWordWrap) { + this.debugConsoleWordWrap = config.debug.console.wordWrap; + changed = true; + } + // Notify only when changed and we are the focused window (avoids notification spam across windows) if (notify && changed) { this.doConfirm( From fdb7bd5caac58ec975f9d977aa3f4c0a9d195e24 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 17 Jun 2019 16:44:23 +0200 Subject: [PATCH 0232/1449] sharp svgs --- src/vs/base/browser/ui/tree/abstractTree.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index d50166ad7d7..8a4f178c301 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -446,7 +446,7 @@ class TreeRenderer implements IListRenderer${lines.join('')}`; + const svg = `${lines.join('')}`; templateData.indent.innerHTML = svg; } From e8bdab05840584553924dc3e58ea8f17b06f39f6 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 17 Jun 2019 16:45:27 +0200 Subject: [PATCH 0233/1449] active indent guide --- src/vs/base/browser/ui/tree/abstractTree.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index 8a4f178c301..f26454951c8 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -1349,7 +1349,8 @@ export abstract class AbstractTree implements IDisposable const content: string[] = []; if (styles.treeIndentGuidesStroke) { - content.push(`.monaco-list${suffix} .monaco-tl-indent > svg > line { stroke: ${styles.treeIndentGuidesStroke}; }`); + content.push(`.monaco-list${suffix} .monaco-tl-indent > svg > line { stroke: ${styles.treeIndentGuidesStroke.transparent(0.3)}; }`); + content.push(`.monaco-list${suffix} .monaco-tl-indent > svg > line.active { stroke: ${styles.treeIndentGuidesStroke}; }`); } const newStyles = content.join('\n'); From 7638bf115684aa3b4ee0ffb4e16f1106b603cbf8 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Mon, 17 Jun 2019 07:46:14 -0700 Subject: [PATCH 0234/1449] Fix #75504, remove duplicate rule --- src/vs/workbench/browser/media/icons.css | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/media/icons.css b/src/vs/workbench/browser/media/icons.css index 9393c1d303e..3d85363cc91 100644 --- a/src/vs/workbench/browser/media/icons.css +++ b/src/vs/workbench/browser/media/icons.css @@ -700,8 +700,7 @@ body[data-exploration="icon-exploration"] .extensions-viewlet > .extensions .ext Panels ****************/ -body[data-exploration="icon-exploration"] .monaco-workbench .hide-panel-action, -.hc-black .monaco-workbench .hide-panel-action { +body[data-exploration="icon-exploration"] .monaco-workbench .hide-panel-action { -webkit-mask-image: url("images/panel/close-alt1.svg"); } From 5466f27d95c52e8d7c34ed445c682b5d71f049d9 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Mon, 17 Jun 2019 07:46:35 -0700 Subject: [PATCH 0235/1449] Fix broken css rule for icon exploration --- src/vs/workbench/browser/media/icons.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/media/icons.css b/src/vs/workbench/browser/media/icons.css index 3d85363cc91..1c3d507dbe4 100644 --- a/src/vs/workbench/browser/media/icons.css +++ b/src/vs/workbench/browser/media/icons.css @@ -946,7 +946,7 @@ body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.operato background-color: var(--blue); } -ody[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.type-parameter::before { +body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.type-parameter::before { -webkit-mask-image: url("images/intellisense/parameter-alt1.svg"); } From 9ac764093a147d40d98d1b18975207dce72d3e4c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 17 Jun 2019 16:55:33 +0200 Subject: [PATCH 0236/1449] remove indent modes --- src/vs/base/browser/ui/tree/abstractTree.ts | 135 +------------------- 1 file changed, 7 insertions(+), 128 deletions(-) diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index f26454951c8..f37d318f11e 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -197,66 +197,11 @@ interface ITreeRendererOptions { readonly indent?: number; } -enum IndentGuide { - None, - First, - Middle, - Last -} - -function getLastVisibleChild(node: ITreeNode): ITreeNode | undefined { - for (let i = 0; i < node.children.length; i++) { - const child = node.children[node.children.length - i - 1]; - - if (child.visible) { - return child; - } - } - - return undefined; -} - -function getLastVisibleDescendant(node: ITreeNode): ITreeNode | undefined { - if (node.collapsed) { - return node; - } - - for (let i = 0; i < node.children.length; i++) { - const child = node.children[node.children.length - i - 1]; - - if (child.visible) { - return getLastVisibleDescendant(child); - } - } - - return undefined; -} - -function hasVisibleChildren(node: ITreeNode): boolean { - for (let i = 0; i < node.children.length; i++) { - if (node.children[i].visible) { - return true; - } - } - - return false; -} - interface IRenderData { templateData: ITreeListTemplateData; height: number; } -//********************************************* DEMO ************************* -enum Mode { - Brackets, - SubtreeBrackets, - Editor -} - -const mode: Mode = Mode.Editor; -//********************************************* DEMO ************************* - class TreeRenderer implements IListRenderer, ITreeListTemplateData> { private static DefaultIndent = 8; @@ -373,80 +318,14 @@ class TreeRenderer implements IListRenderer, templateData: ITreeListTemplateData, height: number): void { - let parent: ITreeNode | undefined; - const guides: IndentGuide[] = []; + private renderIndentGuides(node: ITreeNode, templateData: ITreeListTemplateData, height: number): void { + const lines = range(1, node.depth).map(i => { + const x = Math.floor((node.depth - i - 1) * this.indent) + 6; + return ``; + }); - if (target && target.collapsible && !target.collapsed && hasVisibleChildren(target)) { - guides.push(IndentGuide.First); - } else { - guides.push(IndentGuide.None); - } - - let node: ITreeNode | undefined = target; - - while (node) { - parent = node.parent; - - if (!parent || !parent.parent) { - break; - } - - switch (mode) { - case Mode.Brackets: - if (getLastVisibleChild(parent) === node) { - if (node === target) { - guides.push(IndentGuide.Last); - } else { - guides.push(IndentGuide.None); - } - } else { - guides.push(IndentGuide.Middle); - } - break; - case Mode.SubtreeBrackets: - if (getLastVisibleDescendant(parent) === target) { - guides.push(IndentGuide.Last); - } else { - guides.push(IndentGuide.Middle); - } - break; - case Mode.Editor: - guides.push(IndentGuide.Middle); - break; - } - - node = parent; - } - - const lines: string[] = []; - const halfHeight = Math.floor(height / 2); - - for (let i = 0; i < guides.length; i++) { - const x1 = Math.floor((guides.length - i - 1) * this.indent) + (mode === Mode.Editor ? 6 : 0); - const x2 = x1 + this.indent - Math.min(Math.floor(this.indent * 0.5), 4); - - switch (guides[i]) { - case IndentGuide.First: - if (mode === Mode.Editor) { - lines.push(``); - } else { - lines.push(``); - lines.push(``); - } - break; - case IndentGuide.Middle: - lines.push(``); - break; - case IndentGuide.Last: - lines.push(``); - lines.push(``); - break; - } - } - - const width = this.indent * guides.length; - const svg = `${lines.join('')}`; + const width = this.indent * node.depth; + const svg = `${lines}`; templateData.indent.innerHTML = svg; } From 0ad6f54ca20b18a2ed8ff409d37647ee93073617 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 17 Jun 2019 16:55:37 +0200 Subject: [PATCH 0237/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0a7864db4e0..4176b32d5cb 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "5fc996cf23a90ee6ea8d55df47948fcccfd7b613", + "distro": "0293a04fc4ec308a7770025ead5660e2fb9667a9", "author": { "name": "Microsoft Corporation" }, From 0ff18b817070264f9636fd0375643f03f82cd97c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 17 Jun 2019 17:16:41 +0200 Subject: [PATCH 0238/1449] hover feedback --- src/vs/base/browser/ui/tree/abstractTree.ts | 4 ++-- src/vs/base/browser/ui/tree/media/tree.css | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index f37d318f11e..8ca3217e6f3 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -1228,8 +1228,8 @@ export abstract class AbstractTree implements IDisposable const content: string[] = []; if (styles.treeIndentGuidesStroke) { - content.push(`.monaco-list${suffix} .monaco-tl-indent > svg > line { stroke: ${styles.treeIndentGuidesStroke.transparent(0.3)}; }`); - content.push(`.monaco-list${suffix} .monaco-tl-indent > svg > line.active { stroke: ${styles.treeIndentGuidesStroke}; }`); + content.push(`.monaco-list${suffix}:hover .monaco-tl-indent > svg > line { stroke: ${styles.treeIndentGuidesStroke.transparent(0.3)}; }`); + content.push(`.monaco-list${suffix}:hover .monaco-tl-indent > svg > line.active { stroke: ${styles.treeIndentGuidesStroke}; }`); } const newStyles = content.join('\n'); diff --git a/src/vs/base/browser/ui/tree/media/tree.css b/src/vs/base/browser/ui/tree/media/tree.css index 1fcd3853819..f19695f2fcb 100644 --- a/src/vs/base/browser/ui/tree/media/tree.css +++ b/src/vs/base/browser/ui/tree/media/tree.css @@ -78,4 +78,9 @@ .hc-black .monaco-tl-twistie.loading { background-image: url("loading-hc.svg"); +} + +.monaco-list .monaco-tl-indent > svg > line { + stroke: transparent; + transition: stroke 0.15s linear; } \ No newline at end of file From 82548c0a2648b0ed4e878acbbbea961ab39a1668 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 17 Jun 2019 17:18:46 +0200 Subject: [PATCH 0239/1449] :lipstick: --- src/vs/base/browser/ui/tree/abstractTree.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index 8ca3217e6f3..230a1322702 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -1064,7 +1064,6 @@ export abstract class AbstractTree implements IDisposable get filterOnType(): boolean { return !!this._options.filterOnType; } get onDidChangeTypeFilterPattern(): Event { return this.typeFilterController ? this.typeFilterController.onDidChangePattern : Event.None; } - // Options TODO@joao expose options only, not Optional<> get openOnSingleClick(): boolean { return typeof this._options.openOnSingleClick === 'undefined' ? true : this._options.openOnSingleClick; } get expandOnlyOnTwistieClick(): boolean | ((e: T) => boolean) { return typeof this._options.expandOnlyOnTwistieClick === 'undefined' ? false : this._options.expandOnlyOnTwistieClick; } From 2e2a17035405e723648f2b67c2a479485a7d83c6 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 17 Jun 2019 17:21:14 +0200 Subject: [PATCH 0240/1449] remove extra event data from bracket indents --- src/vs/base/browser/ui/tree/abstractTree.ts | 8 +------- src/vs/base/browser/ui/tree/indexTreeModel.ts | 2 +- src/vs/base/browser/ui/tree/tree.ts | 1 - 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index 230a1322702..c35f43d8eea 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -214,7 +214,6 @@ class TreeRenderer implements IListRenderer, - onDidSplice: Event>, onDidChangeCollapseState: Event>, options: ITreeRendererOptions = {} ) { @@ -223,9 +222,6 @@ class TreeRenderer implements IListRenderer e.node)(this.onDidChangeNodeTwistieState, this, this.disposables); - // TODO: only do iff indent guides are enabled - Event.map(onDidSplice, e => e.parentNode)(this.onDidChangeNodeTwistieState, this, this.disposables); - if (renderer.onDidChangeTwistieState) { renderer.onDidChangeTwistieState(this.onDidChangeTwistieState, this, this.disposables); } @@ -1080,9 +1076,8 @@ export abstract class AbstractTree implements IDisposable ) { const treeDelegate = new ComposedTreeDelegate>(delegate); - const onDidSplice = new Relay>(); const onDidChangeCollapseStateRelay = new Relay>(); - this.renderers = renderers.map(r => new TreeRenderer(r, onDidSplice.event, onDidChangeCollapseStateRelay.event, _options)); + this.renderers = renderers.map(r => new TreeRenderer(r, onDidChangeCollapseStateRelay.event, _options)); this.disposables.push(...this.renderers); let filter: TypeFilter | undefined; @@ -1098,7 +1093,6 @@ export abstract class AbstractTree implements IDisposable this.view = new TreeNodeList(container, treeDelegate, this.renderers, this.focus, this.selection, { ...asListOptions(() => this.model, _options), tree: this }); this.model = this.createModel(this.view, _options); - onDidSplice.input = this.model.onDidSplice; onDidChangeCollapseStateRelay.input = this.model.onDidChangeCollapseState; this.model.onDidSplice(e => { diff --git a/src/vs/base/browser/ui/tree/indexTreeModel.ts b/src/vs/base/browser/ui/tree/indexTreeModel.ts index 33e5e8c31d6..a568881e7c2 100644 --- a/src/vs/base/browser/ui/tree/indexTreeModel.ts +++ b/src/vs/base/browser/ui/tree/indexTreeModel.ts @@ -171,7 +171,7 @@ export class IndexTreeModel, TFilterData = voi } const result = Iterator.map(Iterator.fromArray(deletedNodes), treeNodeToElement); - this._onDidSplice.fire({ parentNode, insertedNodes: nodesToInsert, deletedNodes }); + this._onDidSplice.fire({ insertedNodes: nodesToInsert, deletedNodes }); return result; } diff --git a/src/vs/base/browser/ui/tree/tree.ts b/src/vs/base/browser/ui/tree/tree.ts index b6f7a556101..80b30fa4c55 100644 --- a/src/vs/base/browser/ui/tree/tree.ts +++ b/src/vs/base/browser/ui/tree/tree.ts @@ -98,7 +98,6 @@ export interface ICollapseStateChangeEvent { } export interface ITreeModelSpliceEvent { - parentNode: ITreeNode; insertedNodes: ITreeNode[]; deletedNodes: ITreeNode[]; } From 1f97407f41ea8eb0b9a4cd9bed107c7a27b07ba6 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 17 Jun 2019 17:23:05 +0200 Subject: [PATCH 0241/1449] :lipstick: --- src/vs/base/browser/ui/tree/abstractTree.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index c35f43d8eea..c7ee020168f 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -315,10 +315,9 @@ class TreeRenderer implements IListRenderer, templateData: ITreeListTemplateData, height: number): void { - const lines = range(1, node.depth).map(i => { - const x = Math.floor((node.depth - i - 1) * this.indent) + 6; - return ``; - }); + const lines = range(1, node.depth) + .map(i => Math.floor((node.depth - i - 1) * this.indent) + 6) + .map(x => ``); const width = this.indent * node.depth; const svg = `${lines}`; From 44674775e4e2ac92960312fba3ff5806b57bb7a3 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Mon, 17 Jun 2019 17:33:02 +0200 Subject: [PATCH 0242/1449] Add show local option for Save As on remote Fixes https://github.com/microsoft/vscode-remote-release/issues/712 --- src/vs/platform/dialogs/common/dialogs.ts | 5 +++++ .../browser/actions/workspaceActions.ts | 18 ++++++++++++++++++ .../electron-browser/main.contribution.ts | 3 ++- .../dialogs/browser/fileDialogService.ts | 19 +++++++++++++++++++ .../dialogs/browser/remoteFileDialog.ts | 14 +++++++++++--- .../textfile/common/textFileService.ts | 2 +- .../workbench/test/workbenchTestServices.ts | 3 +++ 7 files changed, 59 insertions(+), 5 deletions(-) diff --git a/src/vs/platform/dialogs/common/dialogs.ts b/src/vs/platform/dialogs/common/dialogs.ts index c86051170e0..cb2181914e7 100644 --- a/src/vs/platform/dialogs/common/dialogs.ts +++ b/src/vs/platform/dialogs/common/dialogs.ts @@ -206,6 +206,11 @@ export interface IFileDialogService { */ pickWorkspaceAndOpen(options: IPickAndOpenOptions): Promise; + /** + * Shows a save file file dialog and save the file at the chosen file URI. + */ + pickFileToSave(options: ISaveDialogOptions): Promise; + /** * Shows a save file dialog and returns the chosen file URI. */ diff --git a/src/vs/workbench/browser/actions/workspaceActions.ts b/src/vs/workbench/browser/actions/workspaceActions.ts index ceacc925f41..2c7298ebcdd 100644 --- a/src/vs/workbench/browser/actions/workspaceActions.ts +++ b/src/vs/workbench/browser/actions/workspaceActions.ts @@ -54,6 +54,24 @@ export class OpenLocalFileAction extends Action { } } +export class SaveLocalFileAction extends Action { + + static readonly ID = 'workbench.action.files.saveLocalFile'; + static LABEL = nls.localize('saveLocalFile', "Save Local File..."); + + constructor( + id: string, + label: string, + @IFileDialogService private readonly dialogService: IFileDialogService + ) { + super(id, label); + } + + run(event?: any, data?: ITelemetryData): Promise { + return this.dialogService.pickFileToSave({ availableFileSystems: [Schemas.file] }); + } +} + export class OpenFolderAction extends Action { static readonly ID = 'workbench.action.files.openFolder'; diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index 5ea030c654a..140f2039603 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -14,7 +14,7 @@ import { isWindows, isLinux, isMacintosh } from 'vs/base/common/platform'; import { KeybindingsReferenceAction, OpenDocumentationUrlAction, OpenIntroductoryVideosUrlAction, OpenTipsAndTricksUrlAction, OpenTwitterUrlAction, OpenRequestFeatureUrlAction, OpenPrivacyStatementUrlAction, OpenLicenseUrlAction, OpenNewsletterSignupUrlAction } from 'vs/workbench/electron-browser/actions/helpActions'; import { ToggleSharedProcessAction, InspectContextKeysAction, ToggleScreencastModeAction, ToggleDevToolsAction } from 'vs/workbench/electron-browser/actions/developerActions'; import { ShowAboutDialogAction, ZoomResetAction, ZoomOutAction, ZoomInAction, ToggleFullScreenAction, CloseCurrentWindowAction, SwitchWindow, NewWindowAction, QuickSwitchWindow, QuickOpenRecentAction, inRecentFilesPickerContextKey, OpenRecentAction, ReloadWindowWithExtensionsDisabledAction, NewWindowTabHandler, ReloadWindowAction, ShowPreviousWindowTabHandler, ShowNextWindowTabHandler, MoveWindowTabToNewWindowHandler, MergeWindowTabsHandlerHandler, ToggleWindowTabsBarHandler } from 'vs/workbench/electron-browser/actions/windowActions'; -import { AddRootFolderAction, GlobalRemoveRootFolderAction, OpenWorkspaceAction, SaveWorkspaceAsAction, OpenWorkspaceConfigFileAction, DuplicateWorkspaceInNewWindowAction, OpenFileFolderAction, OpenFileAction, OpenFolderAction, CloseWorkspaceAction, OpenLocalFileAction, OpenLocalFolderAction, OpenLocalFileFolderAction } from 'vs/workbench/browser/actions/workspaceActions'; +import { AddRootFolderAction, GlobalRemoveRootFolderAction, OpenWorkspaceAction, SaveWorkspaceAsAction, OpenWorkspaceConfigFileAction, DuplicateWorkspaceInNewWindowAction, OpenFileFolderAction, OpenFileAction, OpenFolderAction, CloseWorkspaceAction, OpenLocalFileAction, OpenLocalFolderAction, OpenLocalFileFolderAction, SaveLocalFileAction } from 'vs/workbench/browser/actions/workspaceActions'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { inQuickOpenContext, getQuickNavigateHandler } from 'vs/workbench/browser/parts/quickopen/quickopen'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; @@ -45,6 +45,7 @@ import product from 'vs/platform/product/node/product'; registry.registerWorkbenchAction(new SyncActionDescriptor(OpenLocalFolderAction, OpenLocalFolderAction.ID, OpenLocalFolderAction.LABEL, { primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.KEY_O) }, RemoteFileDialogContext), 'File: Open Local Folder...', fileCategory); } + registry.registerWorkbenchAction(new SyncActionDescriptor(SaveLocalFileAction, SaveLocalFileAction.ID, SaveLocalFileAction.LABEL, { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_S }, RemoteFileDialogContext), 'File: Save Local File...', fileCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(QuickOpenRecentAction, QuickOpenRecentAction.ID, QuickOpenRecentAction.LABEL), 'File: Quick Open Recent...', fileCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(OpenRecentAction, OpenRecentAction.ID, OpenRecentAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.KEY_R, mac: { primary: KeyMod.WinCtrl | KeyCode.KEY_R } }), 'File: Open Recent...', fileCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(CloseWorkspaceAction, CloseWorkspaceAction.ID, CloseWorkspaceAction.LABEL, { primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyCode.KEY_F) }), 'File: Close Workspace', fileCategory); diff --git a/src/vs/workbench/services/dialogs/browser/fileDialogService.ts b/src/vs/workbench/services/dialogs/browser/fileDialogService.ts index e46f242e947..fefbf28bc6e 100644 --- a/src/vs/workbench/services/dialogs/browser/fileDialogService.ts +++ b/src/vs/workbench/services/dialogs/browser/fileDialogService.ts @@ -187,6 +187,25 @@ export class FileDialogService implements IFileDialogService { return this.windowService.pickWorkspaceAndOpen(this.toNativeOpenDialogOptions(options)); } + async pickFileToSave(options: ISaveDialogOptions): Promise { + const schema = this.getFileSystemSchema(options); + if (this.shouldUseSimplified(schema)) { + if (!options.availableFileSystems) { + options.availableFileSystems = this.ensureFileSchema(schema); // always allow file as well + } + + options.title = nls.localize('saveFileAs.title', 'Save As'); + return this.saveRemoteResource(options); + } + + const result = await this.windowService.showSaveDialog(this.toNativeSaveDialogOptions(options)); + if (result) { + return URI.file(result); + } + + return; + } + private toNativeSaveDialogOptions(options: ISaveDialogOptions): Electron.SaveDialogOptions { return { defaultPath: options.defaultUri && options.defaultUri.fsPath || options.defaultFileName, diff --git a/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts b/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts index f3cdff21d80..06ae69f7b9c 100644 --- a/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts +++ b/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts @@ -23,7 +23,7 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/ import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { equalsIgnoreCase, format, startsWithIgnoreCase } from 'vs/base/common/strings'; -import { OpenLocalFileAction, OpenLocalFileFolderAction, OpenLocalFolderAction } from 'vs/workbench/browser/actions/workspaceActions'; +import { OpenLocalFileAction, OpenLocalFileFolderAction, OpenLocalFolderAction, SaveLocalFileAction } from 'vs/workbench/browser/actions/workspaceActions'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IRemoteAgentEnvironment } from 'vs/platform/remote/common/remoteAgentEnvironment'; import { isValidBasename } from 'vs/base/common/extpath'; @@ -211,7 +211,12 @@ export class RemoteFileDialog { if (this.options && this.options.availableFileSystems && (this.options.availableFileSystems.length > 1)) { this.filePickBox.customButton = true; this.filePickBox.customLabel = nls.localize('remoteFileDialog.local', 'Show Local'); - const action = this.allowFileSelection ? (this.allowFolderSelection ? OpenLocalFileFolderAction : OpenLocalFileAction) : OpenLocalFolderAction; + let action; + if (isSave) { + action = SaveLocalFileAction; + } else { + action = this.allowFileSelection ? (this.allowFolderSelection ? OpenLocalFileFolderAction : OpenLocalFileAction) : OpenLocalFolderAction; + } const keybinding = this.keybindingService.lookupKeybinding(action.ID); if (keybinding) { const label = keybinding.getLabel(); @@ -251,7 +256,10 @@ export class RemoteFileDialog { } this.options.defaultUri = undefined; this.filePickBox.hide(); - if (this.requiresTrailing) { + if (isSave) { + // Remove defaultUri and filters to get a consistant experience with the keybinding. + this.options.defaultUri = undefined; + this.options.filters = undefined; return this.fileDialogService.showSaveDialog(this.options).then(result => { doResolve(this, result); }); diff --git a/src/vs/workbench/services/textfile/common/textFileService.ts b/src/vs/workbench/services/textfile/common/textFileService.ts index 9b1c25db695..4c092ee588b 100644 --- a/src/vs/workbench/services/textfile/common/textFileService.ts +++ b/src/vs/workbench/services/textfile/common/textFileService.ts @@ -653,7 +653,7 @@ export abstract class TextFileService extends Disposable implements ITextFileSer // Help user to find a name for the file by opening it first await this.editorService.openEditor({ resource, options: { revealIfOpened: true, preserveFocus: true, } }); - return this.fileDialogService.showSaveDialog(this.getSaveDialogOptions(defaultUri)); + return this.fileDialogService.pickFileToSave(this.getSaveDialogOptions(defaultUri)); } private getSaveDialogOptions(defaultUri: URI): ISaveDialogOptions { diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index 35d2c045b22..c33ab89e631 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -439,6 +439,9 @@ export class TestFileDialogService implements IFileDialogService { public pickWorkspaceAndOpen(_options: IPickAndOpenOptions): Promise { return Promise.resolve(0); } + public pickFileToSave(_options: ISaveDialogOptions): Promise { + return Promise.resolve(undefined); + } public showSaveDialog(_options: ISaveDialogOptions): Promise { return Promise.resolve(undefined); } From a4ac3aa289ec50008c2bab712a5d095731bdf8b9 Mon Sep 17 00:00:00 2001 From: Patrick Burke Date: Fri, 14 Jun 2019 22:02:14 +0200 Subject: [PATCH 0243/1449] Makes status zoom button a IStatusbarEntry #74454 ZoomStatusbarItem can now be instantiated, which is done in InlineImageView, which it uses to update the status bar. The needed services are passed down via constructors, starting in BaseBinaryResourceEditor. Removes padding from CSS which was necessary because of previous implementation. --- .../browser/parts/editor/binaryEditor.ts | 8 +- .../parts/editor/editor.contribution.ts | 13 --- .../parts/editor/media/resourceviewer.css | 4 - .../browser/parts/editor/resourceViewer.ts | 103 ++++++++---------- .../browser/parts/statusbar/statusbarPart.ts | 1 + .../files/browser/editors/binaryFileEditor.ts | 6 + 6 files changed, 58 insertions(+), 77 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/binaryEditor.ts b/src/vs/workbench/browser/parts/editor/binaryEditor.ts index b8a8325af39..fd12b0179c1 100644 --- a/src/vs/workbench/browser/parts/editor/binaryEditor.ts +++ b/src/vs/workbench/browser/parts/editor/binaryEditor.ts @@ -20,6 +20,8 @@ import { dispose } from 'vs/base/common/lifecycle'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IFileService } from 'vs/platform/files/common/files'; +import { IStatusbarService } from 'vs/platform/statusbar/common/statusbar'; +import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; export interface IOpenCallbacks { openInternal: (input: EditorInput, options: EditorOptions) => Promise; @@ -50,7 +52,9 @@ export abstract class BaseBinaryResourceEditor extends BaseEditor { themeService: IThemeService, @IFileService private readonly fileService: IFileService, @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, - @IStorageService storageService: IStorageService + @IStorageService storageService: IStorageService, + @IStatusbarService private readonly statusbarService: IStatusbarService, + @IContextMenuService private readonly contextMenuService: IContextMenuService ) { super(id, telemetryService, themeService, storageService); @@ -97,7 +101,7 @@ export abstract class BaseBinaryResourceEditor extends BaseEditor { openInternalClb: () => this.handleOpenInternalCallback(input, options), openExternalClb: this.environmentService.configuration.remoteAuthority ? undefined : resource => this.callbacks.openExternal(resource), metadataClb: meta => this.handleMetadataChanged(meta) - }); + }, this.statusbarService, this.contextMenuService); } private async handleOpenInternalCallback(input: EditorInput, options: EditorOptions): Promise { diff --git a/src/vs/workbench/browser/parts/editor/editor.contribution.ts b/src/vs/workbench/browser/parts/editor/editor.contribution.ts index 5c37926ade2..82e919d0d2a 100644 --- a/src/vs/workbench/browser/parts/editor/editor.contribution.ts +++ b/src/vs/workbench/browser/parts/editor/editor.contribution.ts @@ -8,8 +8,6 @@ import * as nls from 'vs/nls'; import { URI, UriComponents } from 'vs/base/common/uri'; import { Action, IAction } from 'vs/base/common/actions'; import { IEditorQuickOpenEntry, IQuickOpenRegistry, Extensions as QuickOpenExtensions, QuickOpenHandlerDescriptor } from 'vs/workbench/browser/quickopen'; -import { StatusbarItemDescriptor, IStatusbarRegistry, Extensions as StatusExtensions } from 'vs/workbench/browser/parts/statusbar/statusbar'; -import { StatusbarAlignment } from 'vs/platform/statusbar/common/statusbar'; import { IEditorRegistry, EditorDescriptor, Extensions as EditorExtensions } from 'vs/workbench/browser/editor'; import { EditorInput, IEditorInputFactory, SideBySideEditorInput, IEditorInputFactoryRegistry, Extensions as EditorInputExtensions, TextCompareEditorActiveContext, EditorPinnedContext, EditorGroupEditorsCountContext } from 'vs/workbench/common/editor'; import { TextResourceEditor } from 'vs/workbench/browser/parts/editor/textResourceEditor'; @@ -49,7 +47,6 @@ import { isMacintosh } from 'vs/base/common/platform'; import { AllEditorsPicker, ActiveEditorGroupPicker } from 'vs/workbench/browser/parts/editor/editorPicker'; import { registerEditorContribution } from 'vs/editor/browser/editorExtensions'; import { OpenWorkspaceButtonContribution } from 'vs/workbench/browser/parts/editor/editorWidgets'; -import { ZoomStatusbarItem } from 'vs/workbench/browser/parts/editor/resourceViewer'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { toLocalResource } from 'vs/base/common/resources'; import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; @@ -224,16 +221,6 @@ registerEditorContribution(OpenWorkspaceButtonContribution); // Register Editor Status Registry.as(WorkbenchExtensions.Workbench).registerWorkbenchContribution(EditorStatus, LifecyclePhase.Ready); -// Register Zoom Status -const statusBar = Registry.as(StatusExtensions.Statusbar); -statusBar.registerStatusbarItem(new StatusbarItemDescriptor( - ZoomStatusbarItem, - 'status.imageZoom', - nls.localize('status.imageZoom', "Image Zoom"), - StatusbarAlignment.RIGHT, - 101 /* to the left of editor status (100) */) -); - // Register Status Actions const registry = Registry.as(ActionExtensions.WorkbenchActions); registry.registerWorkbenchAction(new SyncActionDescriptor(ChangeModeAction, ChangeModeAction.ID, ChangeModeAction.LABEL, { primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyCode.KEY_M) }), 'Change Language Mode'); diff --git a/src/vs/workbench/browser/parts/editor/media/resourceviewer.css b/src/vs/workbench/browser/parts/editor/media/resourceviewer.css index af8cc51704a..b6f7b107db7 100644 --- a/src/vs/workbench/browser/parts/editor/media/resourceviewer.css +++ b/src/vs/workbench/browser/parts/editor/media/resourceviewer.css @@ -58,10 +58,6 @@ cursor: zoom-out; } -.monaco-workbench .part.statusbar > .items-container > .statusbar-item > a.zoom-statusbar-item { - padding: 0 5px 0 5px; -} - .monaco-resource-viewer .embedded-link, .monaco-resource-viewer .embedded-link:hover { cursor: pointer; diff --git a/src/vs/workbench/browser/parts/editor/resourceViewer.ts b/src/vs/workbench/browser/parts/editor/resourceViewer.ts index 65b7706e60d..a3772c915a9 100644 --- a/src/vs/workbench/browser/parts/editor/resourceViewer.ts +++ b/src/vs/workbench/browser/parts/editor/resourceViewer.ts @@ -12,16 +12,13 @@ import { DomScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableEle import { LRUCache } from 'vs/base/common/map'; import { Schemas } from 'vs/base/common/network'; import { clamp } from 'vs/base/common/numbers'; -import { Themable } from 'vs/workbench/common/theme'; -import { IStatusbarItem } from 'vs/workbench/browser/parts/statusbar/statusbar'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IDisposable, Disposable, toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; import { Action } from 'vs/base/common/actions'; -import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { memoize } from 'vs/base/common/decorators'; import * as platform from 'vs/base/common/platform'; import { IFileService } from 'vs/platform/files/common/files'; +import { IStatusbarEntry, IStatusbarEntryAccessor, IStatusbarService, StatusbarAlignment } from 'vs/platform/statusbar/common/statusbar'; export interface IResourceDescriptor { readonly resource: URI; @@ -81,7 +78,9 @@ export class ResourceViewer { fileService: IFileService, container: HTMLElement, scrollbar: DomScrollableElement, - delegate: ResourceViewerDelegate + delegate: ResourceViewerDelegate, + statusbarService: IStatusbarService, + contextMenuService: IContextMenuService ): ResourceViewerContext { // Ensure CSS class @@ -89,7 +88,7 @@ export class ResourceViewer { // Images if (ResourceViewer.isImageResource(descriptor)) { - return ImageView.create(container, descriptor, fileService, scrollbar, delegate); + return ImageView.create(container, descriptor, fileService, scrollbar, delegate, statusbarService, contextMenuService); } // Large Files @@ -120,10 +119,12 @@ class ImageView { descriptor: IResourceDescriptor, fileService: IFileService, scrollbar: DomScrollableElement, - delegate: ResourceViewerDelegate + delegate: ResourceViewerDelegate, + statusbarService: IStatusbarService, + contextMenuService: IContextMenuService ): ResourceViewerContext { if (ImageView.shouldShowImageInline(descriptor)) { - return InlineImageView.create(container, descriptor, fileService, scrollbar, delegate); + return InlineImageView.create(container, descriptor, fileService, scrollbar, delegate, statusbarService, contextMenuService); } return LargeImageView.create(container, descriptor, delegate); @@ -234,71 +235,52 @@ class FileSeemsBinaryFileView { type Scale = number | 'fit'; -export class ZoomStatusbarItem extends Themable implements IStatusbarItem { +export class ZoomStatusbarItem extends Disposable { - static instance: ZoomStatusbarItem; + private statusbarItem: IStatusbarEntryAccessor; - private showTimeout: any; - - private statusBarItem: HTMLElement; - private onSelectScale?: (scale: Scale) => void; + onSelectScale?: (scale: Scale) => void; constructor( - @IContextMenuService private readonly contextMenuService: IContextMenuService, - @IEditorService editorService: IEditorService, - @IThemeService themeService: IThemeService + private readonly contextMenuService: IContextMenuService, + private readonly statusbarService: IStatusbarService ) { - super(themeService); - - ZoomStatusbarItem.instance = this; - - this._register(editorService.onDidActiveEditorChange(() => this.onActiveEditorChanged())); + super(); } - private onActiveEditorChanged(): void { - this.hide(); - this.onSelectScale = undefined; - } + updateStatusbar(scale: Scale, onSelectScale?: (scale: Scale) => void): void { + const entry: IStatusbarEntry = { + text: this.zoomLabel(scale) + }; - show(scale: Scale, onSelectScale: (scale: number) => void) { - clearTimeout(this.showTimeout); - this.showTimeout = setTimeout(() => { + if (onSelectScale) { this.onSelectScale = onSelectScale; - this.statusBarItem.style.display = 'block'; - this.updateLabel(scale); - }, 0); - } - - hide() { - this.statusBarItem.style.display = 'none'; - } - - render(container: HTMLElement): IDisposable { - if (!this.statusBarItem && container) { - this.statusBarItem = DOM.append(container, DOM.$('a.zoom-statusbar-item')); - this.statusBarItem.setAttribute('role', 'button'); - this.statusBarItem.style.display = 'none'; - - DOM.addDisposableListener(this.statusBarItem, DOM.EventType.CLICK, () => { - this.contextMenuService.showContextMenu({ - getAnchor: () => container, - getActions: () => this.zoomActions - }); - }); } - return this; - } + if (!this.statusbarItem) { + this.statusbarItem = this.statusbarService.addEntry(entry, 'status.imageZoom', nls.localize('status.imageZoom', "Image Zoom"), StatusbarAlignment.RIGHT, 101 /* to the left of editor status (100) */); - private updateLabel(scale: Scale) { - this.statusBarItem.textContent = ZoomStatusbarItem.zoomLabel(scale); + this._register(this.statusbarItem); + + const element = document.getElementById('status.imageZoom')!; + + this._register(DOM.addDisposableListener(element, DOM.EventType.CLICK, (e: MouseEvent) => { + this.contextMenuService.showContextMenu({ + getAnchor: () => element, + getActions: () => this.zoomActions + }); + })); + } else { + this.statusbarItem.update(entry); + } } @memoize private get zoomActions(): Action[] { const scales: Scale[] = [10, 5, 2, 1, 0.5, 0.2, 'fit']; return scales.map(scale => - new Action(`zoom.${scale}`, ZoomStatusbarItem.zoomLabel(scale), undefined, undefined, () => { + new Action(`zoom.${scale}`, this.zoomLabel(scale), undefined, undefined, () => { + this.updateStatusbar(scale); if (this.onSelectScale) { this.onSelectScale(scale); } @@ -307,7 +289,7 @@ export class ZoomStatusbarItem extends Themable implements IStatusbarItem { })); } - private static zoomLabel(scale: Scale): string { + private zoomLabel(scale: Scale): string { return scale === 'fit' ? nls.localize('zoom.action.fit.label', 'Whole Image') : `${Math.round(scale * 100)}%`; @@ -361,10 +343,15 @@ class InlineImageView { descriptor: IResourceDescriptor, fileService: IFileService, scrollbar: DomScrollableElement, - delegate: ResourceViewerDelegate + delegate: ResourceViewerDelegate, + statusbarService: IStatusbarService, + contextMenuService: IContextMenuService ) { const disposables = new DisposableStore(); + const zoomStatusbarItem = new ZoomStatusbarItem(contextMenuService, statusbarService); + disposables.add(zoomStatusbarItem); + const context: ResourceViewerContext = { layout(dimension: DOM.Dimension) { }, dispose: () => disposables.dispose() @@ -423,7 +410,7 @@ class InlineImageView { InlineImageView.imageStateCache.set(cacheKey, { scale: scale, offsetX: newScrollLeft, offsetY: newScrollTop }); } - ZoomStatusbarItem.instance.show(scale, updateScale); + zoomStatusbarItem.updateStatusbar(scale, updateScale); scrollbar.scanDomNode(); } diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts index e4117106882..dcc9d5da3de 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts @@ -604,6 +604,7 @@ export class StatusbarPart extends Part implements IStatusbarService { private doCreateStatusItem(id: string, name: string, alignment: StatusbarAlignment, priority: number = 0, ...extraClasses: string[]): HTMLElement { const itemContainer = document.createElement('div'); itemContainer.title = name; + itemContainer.id = id; addClass(itemContainer, 'statusbar-item'); if (extraClasses) { diff --git a/src/vs/workbench/contrib/files/browser/editors/binaryFileEditor.ts b/src/vs/workbench/contrib/files/browser/editors/binaryFileEditor.ts index f9719911f6c..6402c9fb414 100644 --- a/src/vs/workbench/contrib/files/browser/editors/binaryFileEditor.ts +++ b/src/vs/workbench/contrib/files/browser/editors/binaryFileEditor.ts @@ -16,6 +16,8 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { IStorageService } from 'vs/platform/storage/common/storage'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IFileService } from 'vs/platform/files/common/files'; +import { IStatusbarService } from 'vs/platform/statusbar/common/statusbar'; +import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; /** * An implementation of editor for binary files like images. @@ -32,6 +34,8 @@ export class BinaryFileEditor extends BaseBinaryResourceEditor { @IStorageService storageService: IStorageService, @IFileService fileService: IFileService, @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, + @IStatusbarService statusbarService: IStatusbarService, + @IContextMenuService contextMenuService: IContextMenuService ) { super( BinaryFileEditor.ID, @@ -44,6 +48,8 @@ export class BinaryFileEditor extends BaseBinaryResourceEditor { fileService, environmentService, storageService, + statusbarService, + contextMenuService ); } From 3f6640e451546b53fe3773287fd82ff8de5040be Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 17 Jun 2019 17:49:54 +0200 Subject: [PATCH 0244/1449] use DOM instead of innerHTML --- src/vs/base/browser/dom.ts | 27 ++++++++++++++++++--- src/vs/base/browser/ui/tree/abstractTree.ts | 21 +++++++++------- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index c5f49f198e5..8aad714eb99 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -987,14 +987,28 @@ export function prepend(parent: HTMLElement, child: T): T { const SELECTOR_REGEX = /([\w\-]+)?(#([\w\-]+))?((.([\w\-]+))*)/; -export function $(description: string, attrs?: { [key: string]: any; }, ...children: Array): T { +export enum Namespace { + HTML = 'http://www.w3.org/1999/xhtml', + SVG = 'http://www.w3.org/2000/svg' +} + +function _$(namespace: Namespace, description: string, attrs?: { [key: string]: any; }, ...children: Array): T { let match = SELECTOR_REGEX.exec(description); if (!match) { throw new Error('Bad use of emmet'); } - let result = document.createElement(match[1] || 'div'); + attrs = { ...(attrs || {}) }; + + let tagName = match[1] || 'div'; + let result: T; + + if (namespace !== Namespace.HTML) { + result = document.createElementNS(namespace as string, tagName) as T; + } else { + result = document.createElement(tagName) as unknown as T; + } if (match[3]) { result.id = match[3]; @@ -1003,7 +1017,6 @@ export function $(description: string, attrs?: { [key: st result.className = match[4].replace(/\./g, ' ').trim(); } - attrs = attrs || {}; Object.keys(attrs).forEach(name => { const value = attrs![name]; if (/^on\w+$/.test(name)) { @@ -1030,6 +1043,14 @@ export function $(description: string, attrs?: { [key: st return result as T; } +export function $(description: string, attrs?: { [key: string]: any; }, ...children: Array): T { + return _$(Namespace.HTML, description, attrs, ...children); +} + +$.SVG = (description: string, attrs?: { [key: string]: any; }, ...children: Array) => { + return _$(Namespace.SVG, description, attrs, ...children); +}; + export function join(nodes: Node[], separator: Node | string): Node[] { const result: Node[] = []; diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index c7ee020168f..da09754d37d 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -7,7 +7,7 @@ import 'vs/css!./media/tree'; import { IDisposable, dispose, Disposable, toDisposable } from 'vs/base/common/lifecycle'; import { IListOptions, List, IListStyles, mightProducePrintableCharacter, MouseController } from 'vs/base/browser/ui/list/listWidget'; import { IListVirtualDelegate, IListRenderer, IListMouseEvent, IListEvent, IListContextMenuEvent, IListDragAndDrop, IListDragOverReaction, IKeyboardNavigationLabelProvider, IIdentityProvider } from 'vs/base/browser/ui/list/list'; -import { append, $, toggleClass, getDomNodePagePosition, removeClass, addClass, hasClass, hasParentWithClass, createStyleSheet } from 'vs/base/browser/dom'; +import { append, $, toggleClass, getDomNodePagePosition, removeClass, addClass, hasClass, hasParentWithClass, createStyleSheet, clearNode } from 'vs/base/browser/dom'; import { Event, Relay, Emitter, EventBufferer } from 'vs/base/common/event'; import { StandardKeyboardEvent, IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { KeyCode } from 'vs/base/common/keyCodes'; @@ -313,16 +313,19 @@ class TreeRenderer implements IListRenderer, templateData: ITreeListTemplateData, height: number): void { - const lines = range(1, node.depth) - .map(i => Math.floor((node.depth - i - 1) * this.indent) + 6) - .map(x => ``); - const width = this.indent * node.depth; - const svg = `${lines}`; + const svg = $.SVG('svg', { 'shape-rendering': 'crispEdges', width: `${width}`, height: `${height}`, viewBox: `0 0 ${width} ${height}` }); - templateData.indent.innerHTML = svg; + for (let i = 1; i < node.depth; i++) { + const x = Math.floor((node.depth - i - 1) * this.indent) + 6; + const line = $.SVG('line', { x1: x, y1: 0, x2: x, y2: height }); + svg.appendChild(line); + } + + clearNode(templateData.indent); + templateData.indent.appendChild(svg); } dispose(): void { @@ -1221,7 +1224,7 @@ export abstract class AbstractTree implements IDisposable if (styles.treeIndentGuidesStroke) { content.push(`.monaco-list${suffix}:hover .monaco-tl-indent > svg > line { stroke: ${styles.treeIndentGuidesStroke.transparent(0.3)}; }`); - content.push(`.monaco-list${suffix}:hover .monaco-tl-indent > svg > line.active { stroke: ${styles.treeIndentGuidesStroke}; }`); + content.push(`.monaco-list${suffix} .monaco-tl-indent > svg > line.active { stroke: ${styles.treeIndentGuidesStroke}; }`); } const newStyles = content.join('\n'); From 36d08742e013d50236a1472f8aafd531d8b5de56 Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Fri, 14 Jun 2019 15:20:11 +0200 Subject: [PATCH 0245/1449] use ProductService --- .../contrib/debug/electron-browser/debugSession.ts | 7 ++++--- .../contrib/debug/test/electron-browser/debugModel.test.ts | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/debug/electron-browser/debugSession.ts b/src/vs/workbench/contrib/debug/electron-browser/debugSession.ts index 3652a5d81e6..e4be32e26e1 100644 --- a/src/vs/workbench/contrib/debug/electron-browser/debugSession.ts +++ b/src/vs/workbench/contrib/debug/electron-browser/debugSession.ts @@ -17,7 +17,7 @@ import { Source } from 'vs/workbench/contrib/debug/common/debugSource'; import { mixin } from 'vs/base/common/objects'; import { Thread, ExpressionContainer, DebugModel } from 'vs/workbench/contrib/debug/common/debugModel'; import { RawDebugSession } from 'vs/workbench/contrib/debug/electron-browser/rawDebugSession'; -import product from 'vs/platform/product/node/product'; +import { IProductService } from 'vs/platform/product/common/product'; import { IWorkspaceFolder, IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { RunOnceScheduler } from 'vs/base/common/async'; @@ -68,7 +68,8 @@ export class DebugSession implements IDebugSession { @IWorkspaceContextService private readonly workspaceContextService: IWorkspaceContextService, @IEnvironmentService private readonly environmentService: IEnvironmentService, @INotificationService private readonly notificationService: INotificationService, - @ISignService private readonly signService: ISignService + @ISignService private readonly signService: ISignService, + @IProductService private readonly productService: IProductService ) { this.id = generateUuid(); this.repl = new ReplModel(this); @@ -177,7 +178,7 @@ export class DebugSession implements IDebugSession { return this.raw!.initialize({ clientID: 'vscode', - clientName: product.nameLong, + clientName: this.productService.nameLong, adapterID: this.configuration.type, pathFormat: 'path', linesStartAt1: true, diff --git a/src/vs/workbench/contrib/debug/test/electron-browser/debugModel.test.ts b/src/vs/workbench/contrib/debug/test/electron-browser/debugModel.test.ts index 0a31e7a0b92..4702c3cd3af 100644 --- a/src/vs/workbench/contrib/debug/test/electron-browser/debugModel.test.ts +++ b/src/vs/workbench/contrib/debug/test/electron-browser/debugModel.test.ts @@ -15,7 +15,7 @@ import { ReplModel } from 'vs/workbench/contrib/debug/common/replModel'; import { IBreakpointUpdateData } from 'vs/workbench/contrib/debug/common/debug'; function createMockSession(model: DebugModel, name = 'mockSession', parentSession?: DebugSession | undefined): DebugSession { - return new DebugSession({ resolved: { name, type: 'node', request: 'launch' }, unresolved: undefined }, undefined!, model, parentSession, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!); + return new DebugSession({ resolved: { name, type: 'node', request: 'launch' }, unresolved: undefined }, undefined!, model, parentSession, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!); } suite('Debug - Model', () => { @@ -437,7 +437,7 @@ suite('Debug - Model', () => { // Repl output test('repl output', () => { - const session = new DebugSession({ resolved: { name: 'mockSession', type: 'node', request: 'launch' }, unresolved: undefined }, undefined!, model, undefined, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!); + const session = new DebugSession({ resolved: { name: 'mockSession', type: 'node', request: 'launch' }, unresolved: undefined }, undefined!, model, undefined, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!, undefined!); const repl = new ReplModel(session); repl.appendToRepl('first line\n', severity.Error); repl.appendToRepl('second line ', severity.Error); From e20b2637d99f9b9e31c9b4bbe52290a197e369b2 Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Mon, 17 Jun 2019 15:49:08 +0200 Subject: [PATCH 0246/1449] web - first cut of debugger --- .../debug.contribution.ts | 2 +- .../debugConfigurationManager.ts | 9 +- .../debugService.ts | 4 +- .../debugSession.ts | 10 +- .../contrib/debug/browser/debugUIService.ts | 30 ++++ .../media/continue-tb.png | Bin .../media/continue-without-debugging-tb.png | Bin .../media/pause-tb.png | Bin .../media/restart-tb.png | Bin .../media/stepinto-tb.png | Bin .../media/stepout-tb.png | Bin .../media/stepover-tb.png | Bin .../media/stop-tb.png | Bin .../rawDebugSession.ts | 101 +------------- .../workbench/contrib/debug/common/debugUI.ts | 37 +++++ .../debug/{node => common}/debugger.ts | 25 +--- .../contrib/debug/node/debugUIService.ts | 132 ++++++++++++++++++ .../terminalSupport.ts | 0 .../debugModel.test.ts | 2 +- .../contrib/debug/test/node/debugger.test.ts | 4 +- src/vs/workbench/workbench.main.ts | 3 +- src/vs/workbench/workbench.web.main.ts | 12 +- 22 files changed, 233 insertions(+), 138 deletions(-) rename src/vs/workbench/contrib/debug/{electron-browser => browser}/debug.contribution.ts (99%) rename src/vs/workbench/contrib/debug/{electron-browser => browser}/debugConfigurationManager.ts (98%) rename src/vs/workbench/contrib/debug/{electron-browser => browser}/debugService.ts (99%) rename src/vs/workbench/contrib/debug/{electron-browser => browser}/debugSession.ts (98%) create mode 100644 src/vs/workbench/contrib/debug/browser/debugUIService.ts rename src/vs/workbench/contrib/debug/{electron-browser => browser}/media/continue-tb.png (100%) rename src/vs/workbench/contrib/debug/{electron-browser => browser}/media/continue-without-debugging-tb.png (100%) rename src/vs/workbench/contrib/debug/{electron-browser => browser}/media/pause-tb.png (100%) rename src/vs/workbench/contrib/debug/{electron-browser => browser}/media/restart-tb.png (100%) rename src/vs/workbench/contrib/debug/{electron-browser => browser}/media/stepinto-tb.png (100%) rename src/vs/workbench/contrib/debug/{electron-browser => browser}/media/stepout-tb.png (100%) rename src/vs/workbench/contrib/debug/{electron-browser => browser}/media/stepover-tb.png (100%) rename src/vs/workbench/contrib/debug/{electron-browser => browser}/media/stop-tb.png (100%) rename src/vs/workbench/contrib/debug/{electron-browser => browser}/rawDebugSession.ts (86%) create mode 100644 src/vs/workbench/contrib/debug/common/debugUI.ts rename src/vs/workbench/contrib/debug/{node => common}/debugger.ts (93%) create mode 100644 src/vs/workbench/contrib/debug/node/debugUIService.ts rename src/vs/workbench/contrib/debug/{electron-browser => node}/terminalSupport.ts (100%) rename src/vs/workbench/contrib/debug/test/{electron-browser => browser}/debugModel.test.ts (99%) diff --git a/src/vs/workbench/contrib/debug/electron-browser/debug.contribution.ts b/src/vs/workbench/contrib/debug/browser/debug.contribution.ts similarity index 99% rename from src/vs/workbench/contrib/debug/electron-browser/debug.contribution.ts rename to src/vs/workbench/contrib/debug/browser/debug.contribution.ts index f15f7fd393e..88b70660848 100644 --- a/src/vs/workbench/contrib/debug/electron-browser/debug.contribution.ts +++ b/src/vs/workbench/contrib/debug/browser/debug.contribution.ts @@ -27,7 +27,7 @@ import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { DebugEditorModelManager } from 'vs/workbench/contrib/debug/browser/debugEditorModelManager'; import { StartAction, AddFunctionBreakpointAction, ConfigureAction, DisableAllBreakpointsAction, EnableAllBreakpointsAction, RemoveAllBreakpointsAction, RunAction, ReapplyBreakpointsAction, SelectAndStartAction } from 'vs/workbench/contrib/debug/browser/debugActions'; import { DebugToolBar } from 'vs/workbench/contrib/debug/browser/debugToolBar'; -import * as service from 'vs/workbench/contrib/debug/electron-browser/debugService'; +import * as service from 'vs/workbench/contrib/debug/browser/debugService'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { registerCommands, ADD_CONFIGURATION_ID, TOGGLE_INLINE_BREAKPOINT_ID, COPY_STACK_TRACE_ID, REVERSE_CONTINUE_ID, STEP_BACK_ID, RESTART_SESSION_ID, TERMINATE_THREAD_ID, STEP_OVER_ID, STEP_INTO_ID, STEP_OUT_ID, PAUSE_ID, DISCONNECT_ID, STOP_ID, RESTART_FRAME_ID, CONTINUE_ID, FOCUS_REPL_ID, JUMP_TO_CURSOR_ID } from 'vs/workbench/contrib/debug/browser/debugCommands'; import { IQuickOpenRegistry, Extensions as QuickOpenExtensions, QuickOpenHandlerDescriptor } from 'vs/workbench/browser/quickopen'; diff --git a/src/vs/workbench/contrib/debug/electron-browser/debugConfigurationManager.ts b/src/vs/workbench/contrib/debug/browser/debugConfigurationManager.ts similarity index 98% rename from src/vs/workbench/contrib/debug/electron-browser/debugConfigurationManager.ts rename to src/vs/workbench/contrib/debug/browser/debugConfigurationManager.ts index baf0537d834..28eae251da8 100644 --- a/src/vs/workbench/contrib/debug/electron-browser/debugConfigurationManager.ts +++ b/src/vs/workbench/contrib/debug/browser/debugConfigurationManager.ts @@ -22,12 +22,11 @@ import { IWorkspaceContextService, IWorkspaceFolder, WorkbenchState } from 'vs/p import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IDebugConfigurationProvider, ICompound, IDebugConfiguration, IConfig, IGlobalConfig, IConfigurationManager, ILaunch, IDebugAdapterDescriptorFactory, IDebugAdapter, ITerminalSettings, ITerminalLauncher, IDebugSession, IAdapterDescriptor, CONTEXT_DEBUG_CONFIGURATION_TYPE, IDebugAdapterFactory, IDebugService } from 'vs/workbench/contrib/debug/common/debug'; -import { Debugger } from 'vs/workbench/contrib/debug/node/debugger'; +import { Debugger } from 'vs/workbench/contrib/debug/common/debugger'; import { IEditorService, ACTIVE_GROUP, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { isCodeEditor } from 'vs/editor/browser/editorBrowser'; import { launchSchemaId } from 'vs/workbench/services/configuration/common/configuration'; import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; -import { TerminalLauncher } from 'vs/workbench/contrib/debug/electron-browser/terminalSupport'; import { Registry } from 'vs/platform/registry/common/platform'; import { IJSONContributionRegistry, Extensions as JSONExtensions } from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; import { launchSchema, debuggersExtPoint, breakpointsExtPoint } from 'vs/workbench/contrib/debug/common/debugSchemas'; @@ -35,6 +34,7 @@ import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { onUnexpectedError } from 'vs/base/common/errors'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; +import { IDebugUIService } from 'vs/workbench/contrib/debug/common/debugUI'; const jsonRegistry = Registry.as(JSONExtensions.JSONContribution); jsonRegistry.registerSchema(launchSchemaId, launchSchema); @@ -67,7 +67,8 @@ export class ConfigurationManager implements IConfigurationManager { @IStorageService private readonly storageService: IStorageService, @ILifecycleService lifecycleService: ILifecycleService, @IExtensionService private readonly extensionService: IExtensionService, - @IContextKeyService contextKeyService: IContextKeyService + @IContextKeyService contextKeyService: IContextKeyService, + @IDebugUIService private readonly debugUIService: IDebugUIService ) { this.configProviders = []; this.adapterDescriptorFactories = []; @@ -114,7 +115,7 @@ export class ConfigurationManager implements IConfigurationManager { let tl: ITerminalLauncher | undefined = this.debugAdapterFactories.get(debugType); if (!tl) { if (!this.terminalLauncher) { - this.terminalLauncher = this.instantiationService.createInstance(TerminalLauncher); + this.terminalLauncher = this.debugUIService.createTerminalLauncher(this.instantiationService); } tl = this.terminalLauncher; } diff --git a/src/vs/workbench/contrib/debug/electron-browser/debugService.ts b/src/vs/workbench/contrib/debug/browser/debugService.ts similarity index 99% rename from src/vs/workbench/contrib/debug/electron-browser/debugService.ts rename to src/vs/workbench/contrib/debug/browser/debugService.ts index c625b6b686c..3a1d1b36ed6 100644 --- a/src/vs/workbench/contrib/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/contrib/debug/browser/debugService.ts @@ -21,7 +21,7 @@ import { IStorageService, StorageScope } from 'vs/platform/storage/common/storag import { DebugModel, ExceptionBreakpoint, FunctionBreakpoint, Breakpoint, Expression } from 'vs/workbench/contrib/debug/common/debugModel'; import { ViewModel } from 'vs/workbench/contrib/debug/common/debugViewModel'; import * as debugactions from 'vs/workbench/contrib/debug/browser/debugActions'; -import { ConfigurationManager } from 'vs/workbench/contrib/debug/electron-browser/debugConfigurationManager'; +import { ConfigurationManager } from 'vs/workbench/contrib/debug/browser/debugConfigurationManager'; import Constants from 'vs/workbench/contrib/markers/browser/constants'; import { ITaskService, ITaskSummary } from 'vs/workbench/contrib/tasks/common/taskService'; import { TaskError } from 'vs/workbench/contrib/tasks/common/taskSystem'; @@ -39,7 +39,7 @@ import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IAction, Action } from 'vs/base/common/actions'; import { deepClone, equals } from 'vs/base/common/objects'; -import { DebugSession } from 'vs/workbench/contrib/debug/electron-browser/debugSession'; +import { DebugSession } from 'vs/workbench/contrib/debug/browser/debugSession'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { IDebugService, State, IDebugSession, CONTEXT_DEBUG_TYPE, CONTEXT_DEBUG_STATE, CONTEXT_IN_DEBUG_MODE, IThread, IDebugConfiguration, VIEWLET_ID, REPL_ID, IConfig, ILaunch, IViewModel, IConfigurationManager, IDebugModel, IEnablement, IBreakpoint, IBreakpointData, ICompound, IGlobalConfig, IStackFrame, AdapterEndEvent, getStateLabel } from 'vs/workbench/contrib/debug/common/debug'; import { isExtensionHostDebugging } from 'vs/workbench/contrib/debug/common/debugUtils'; diff --git a/src/vs/workbench/contrib/debug/electron-browser/debugSession.ts b/src/vs/workbench/contrib/debug/browser/debugSession.ts similarity index 98% rename from src/vs/workbench/contrib/debug/electron-browser/debugSession.ts rename to src/vs/workbench/contrib/debug/browser/debugSession.ts index e4be32e26e1..259dd7a13a0 100644 --- a/src/vs/workbench/contrib/debug/electron-browser/debugSession.ts +++ b/src/vs/workbench/contrib/debug/browser/debugSession.ts @@ -16,7 +16,7 @@ import { IDebugSession, IConfig, IThread, IRawModelUpdate, IDebugService, IRawSt import { Source } from 'vs/workbench/contrib/debug/common/debugSource'; import { mixin } from 'vs/base/common/objects'; import { Thread, ExpressionContainer, DebugModel } from 'vs/workbench/contrib/debug/common/debugModel'; -import { RawDebugSession } from 'vs/workbench/contrib/debug/electron-browser/rawDebugSession'; +import { RawDebugSession } from 'vs/workbench/contrib/debug/browser/rawDebugSession'; import { IProductService } from 'vs/platform/product/common/product'; import { IWorkspaceFolder, IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; @@ -30,9 +30,9 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { ReplModel } from 'vs/workbench/contrib/debug/common/replModel'; import { onUnexpectedError } from 'vs/base/common/errors'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { ISignService } from 'vs/platform/sign/common/sign'; +import { IDebugUIService } from 'vs/workbench/contrib/debug/common/debugUI'; export class DebugSession implements IDebugSession { @@ -66,10 +66,10 @@ export class DebugSession implements IDebugSession { @IConfigurationService private readonly configurationService: IConfigurationService, @IViewletService private readonly viewletService: IViewletService, @IWorkspaceContextService private readonly workspaceContextService: IWorkspaceContextService, - @IEnvironmentService private readonly environmentService: IEnvironmentService, @INotificationService private readonly notificationService: INotificationService, @ISignService private readonly signService: ISignService, - @IProductService private readonly productService: IProductService + @IProductService private readonly productService: IProductService, + @IDebugUIService private readonly debugUIService: IDebugUIService ) { this.id = generateUuid(); this.repl = new ReplModel(this); @@ -170,7 +170,7 @@ export class DebugSession implements IDebugSession { return dbgr.createDebugAdapter(this).then(debugAdapter => { - this.raw = new RawDebugSession(debugAdapter, dbgr, this.telemetryService, customTelemetryService, this.environmentService, this.signService); + this.raw = new RawDebugSession(debugAdapter, dbgr, this.telemetryService, customTelemetryService, this.signService, this.debugUIService); return this.raw!.start().then(() => { diff --git a/src/vs/workbench/contrib/debug/browser/debugUIService.ts b/src/vs/workbench/contrib/debug/browser/debugUIService.ts new file mode 100644 index 00000000000..a2a939c03f7 --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/debugUIService.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. + *--------------------------------------------------------------------------------------------*/ + +import { ServiceIdentifier, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { ITerminalLauncher } from 'vs/workbench/contrib/debug/common/debug'; +import { TelemetryService } from 'vs/platform/telemetry/common/telemetryService'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IDebugUIService, ILaunchVSCodeArguments } from 'vs/workbench/contrib/debug/common/debugUI'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; + +export class BrowserDebugUIService implements IDebugUIService { + + _serviceBrand: ServiceIdentifier; + + createTerminalLauncher(instantiationService: IInstantiationService): ITerminalLauncher { + throw new Error('Method createTerminalLauncher not implemented.'); + } + + launchVsCode(vscodeArgs: ILaunchVSCodeArguments): Promise { + throw new Error('Method launchVsCode not implemented.'); + } + + createTelemetryService(configurationService: IConfigurationService, args: string[]): TelemetryService | undefined { + return undefined; + } +} + +registerSingleton(IDebugUIService, BrowserDebugUIService); \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/electron-browser/media/continue-tb.png b/src/vs/workbench/contrib/debug/browser/media/continue-tb.png similarity index 100% rename from src/vs/workbench/contrib/debug/electron-browser/media/continue-tb.png rename to src/vs/workbench/contrib/debug/browser/media/continue-tb.png diff --git a/src/vs/workbench/contrib/debug/electron-browser/media/continue-without-debugging-tb.png b/src/vs/workbench/contrib/debug/browser/media/continue-without-debugging-tb.png similarity index 100% rename from src/vs/workbench/contrib/debug/electron-browser/media/continue-without-debugging-tb.png rename to src/vs/workbench/contrib/debug/browser/media/continue-without-debugging-tb.png diff --git a/src/vs/workbench/contrib/debug/electron-browser/media/pause-tb.png b/src/vs/workbench/contrib/debug/browser/media/pause-tb.png similarity index 100% rename from src/vs/workbench/contrib/debug/electron-browser/media/pause-tb.png rename to src/vs/workbench/contrib/debug/browser/media/pause-tb.png diff --git a/src/vs/workbench/contrib/debug/electron-browser/media/restart-tb.png b/src/vs/workbench/contrib/debug/browser/media/restart-tb.png similarity index 100% rename from src/vs/workbench/contrib/debug/electron-browser/media/restart-tb.png rename to src/vs/workbench/contrib/debug/browser/media/restart-tb.png diff --git a/src/vs/workbench/contrib/debug/electron-browser/media/stepinto-tb.png b/src/vs/workbench/contrib/debug/browser/media/stepinto-tb.png similarity index 100% rename from src/vs/workbench/contrib/debug/electron-browser/media/stepinto-tb.png rename to src/vs/workbench/contrib/debug/browser/media/stepinto-tb.png diff --git a/src/vs/workbench/contrib/debug/electron-browser/media/stepout-tb.png b/src/vs/workbench/contrib/debug/browser/media/stepout-tb.png similarity index 100% rename from src/vs/workbench/contrib/debug/electron-browser/media/stepout-tb.png rename to src/vs/workbench/contrib/debug/browser/media/stepout-tb.png diff --git a/src/vs/workbench/contrib/debug/electron-browser/media/stepover-tb.png b/src/vs/workbench/contrib/debug/browser/media/stepover-tb.png similarity index 100% rename from src/vs/workbench/contrib/debug/electron-browser/media/stepover-tb.png rename to src/vs/workbench/contrib/debug/browser/media/stepover-tb.png diff --git a/src/vs/workbench/contrib/debug/electron-browser/media/stop-tb.png b/src/vs/workbench/contrib/debug/browser/media/stop-tb.png similarity index 100% rename from src/vs/workbench/contrib/debug/electron-browser/media/stop-tb.png rename to src/vs/workbench/contrib/debug/browser/media/stop-tb.png diff --git a/src/vs/workbench/contrib/debug/electron-browser/rawDebugSession.ts b/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts similarity index 86% rename from src/vs/workbench/contrib/debug/electron-browser/rawDebugSession.ts rename to src/vs/workbench/contrib/debug/browser/rawDebugSession.ts index fc272dd2d6f..53b3dab14ba 100644 --- a/src/vs/workbench/contrib/debug/electron-browser/rawDebugSession.ts +++ b/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts @@ -9,27 +9,12 @@ import * as objects from 'vs/base/common/objects'; import { Action } from 'vs/base/common/actions'; import * as errors from 'vs/base/common/errors'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { formatPII, isUri } from 'vs/workbench/contrib/debug/common/debugUtils'; +import { formatPII } from 'vs/workbench/contrib/debug/common/debugUtils'; import { IDebugAdapter, IConfig, AdapterEndEvent, IDebugger } from 'vs/workbench/contrib/debug/common/debug'; import { createErrorWithActions } from 'vs/base/common/errorsWithActions'; -import * as cp from 'child_process'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { ISignService } from 'vs/platform/sign/common/sign'; +import { IDebugUIService, ILaunchVSCodeArguments } from 'vs/workbench/contrib/debug/common/debugUI'; -/** - * This interface represents a single command line argument split into a "prefix" and a "path" half. - * The optional "prefix" contains arbitrary text and the optional "path" contains a file system path. - * Concatenating both results in the original command line argument. - */ -export interface ILaunchVSCodeArgument { - prefix?: string; - path?: string; -} - -export interface ILaunchVSCodeArguments { - args: ILaunchVSCodeArgument[]; - env?: { [key: string]: string | null; }; -} /** * Encapsulates the DebugAdapter lifecycle and some idiosyncrasies of the Debug Adapter Protocol. @@ -72,8 +57,8 @@ export class RawDebugSession { dbgr: IDebugger, private readonly telemetryService: ITelemetryService, public readonly customTelemetryService: ITelemetryService | undefined, - private readonly environmentService: IEnvironmentService, - private readonly signService: ISignService + private readonly signService: ISignService, + private readonly debugUIService: IDebugUIService ) { this.debugAdapter = debugAdapter; this._capabilities = Object.create(null); @@ -520,7 +505,7 @@ export class RawDebugSession { switch (request.command) { case 'launchVSCode': - this.launchVsCode(request.arguments).then(pid => { + this.debugUIService.launchVsCode(request.arguments).then(pid => { response.body = { processId: pid }; @@ -566,82 +551,6 @@ export class RawDebugSession { } } - private launchVsCode(vscodeArgs: ILaunchVSCodeArguments): Promise { - - const spawnOpts: cp.SpawnOptions = { - detached: false // https://github.com/Microsoft/vscode/issues/57018 - }; - - if (vscodeArgs.env) { - // merge environment variables into a copy of the process.env - const envArgs = objects.mixin(objects.mixin({}, process.env), vscodeArgs.env); - // and delete some if necessary - Object.keys(envArgs).filter(k => envArgs[k] === null).forEach(key => delete envArgs[key]); - spawnOpts.env = envArgs; - } - - let spawnArgs = vscodeArgs.args.map(a => { - if ((a.prefix === '--file-uri=' || a.prefix === '--folder-uri=') && !isUri(a.path)) { - return (a.path || ''); - } - return (a.prefix || '') + (a.path || ''); - }); - - let runtimeExecutable = this.environmentService['execPath']; - if (!runtimeExecutable) { - return Promise.reject(new Error(`VS Code executable unknown`)); - } - - // if VS Code runs out of sources, add the VS Code workspace path as the first argument so that Electron turns into VS Code - const electronIdx = runtimeExecutable.indexOf(process.platform === 'win32' ? '\\.build\\electron\\' : '/.build/electron/'); - if (electronIdx > 0) { - // guess the VS Code workspace path from the executable - const vscodeWorkspacePath = runtimeExecutable.substr(0, electronIdx); - - // only add VS Code workspace path if user hasn't already added that path as a (folder) argument - const x = spawnArgs.filter(a => a.indexOf(vscodeWorkspacePath) === 0); - if (x.length === 0) { - spawnArgs.unshift(vscodeWorkspacePath); - } - } - - // Workaround for bug Microsoft/vscode#45832 - if (process.platform === 'win32' && runtimeExecutable.indexOf(' ') > 0) { - let foundArgWithSpace = false; - - // check whether there is one arg with a space - const args: string[] = []; - for (const a of spawnArgs) { - if (a.indexOf(' ') > 0) { - args.push(`"${a}"`); - foundArgWithSpace = true; - } else { - args.push(a); - } - } - - if (foundArgWithSpace) { - spawnArgs = args; - runtimeExecutable = `"${runtimeExecutable}"`; - spawnOpts.shell = true; - } - } - - return new Promise((resolve, reject) => { - const process = cp.spawn(runtimeExecutable, spawnArgs, spawnOpts); - process.on('error', error => { - reject(error); - }); - process.on('exit', code => { - if (code === 0) { - resolve(process.pid); - } else { - reject(new Error(`VS Code exited with ${code}`)); - } - }); - }); - } - private send(command: string, args: any, timeout?: number): Promise { return new Promise((completeDispatch, errorDispatch) => { if (!this.debugAdapter) { diff --git a/src/vs/workbench/contrib/debug/common/debugUI.ts b/src/vs/workbench/contrib/debug/common/debugUI.ts new file mode 100644 index 00000000000..775b0dee09c --- /dev/null +++ b/src/vs/workbench/contrib/debug/common/debugUI.ts @@ -0,0 +1,37 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { createDecorator, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { ITerminalLauncher } from 'vs/workbench/contrib/debug/common/debug'; +import { TelemetryService } from 'vs/platform/telemetry/common/telemetryService'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; + +export const DEBUGUI_SERVICE_ID = 'debugUIService'; +export const IDebugUIService = createDecorator(DEBUGUI_SERVICE_ID); + +/** + * This interface represents a single command line argument split into a "prefix" and a "path" half. + * The optional "prefix" contains arbitrary text and the optional "path" contains a file system path. + * Concatenating both results in the original command line argument. + */ +export interface ILaunchVSCodeArgument { + prefix?: string; + path?: string; +} + +export interface ILaunchVSCodeArguments { + args: ILaunchVSCodeArgument[]; + env?: { [key: string]: string | null; }; +} + +export interface IDebugUIService { + _serviceBrand: any; + + createTerminalLauncher(instantiationService: IInstantiationService): ITerminalLauncher; + + launchVsCode(vscodeArgs: ILaunchVSCodeArguments): Promise; + + createTelemetryService(configurationService: IConfigurationService, args: string[]): TelemetryService | undefined; +} diff --git a/src/vs/workbench/contrib/debug/node/debugger.ts b/src/vs/workbench/contrib/debug/common/debugger.ts similarity index 93% rename from src/vs/workbench/contrib/debug/node/debugger.ts rename to src/vs/workbench/contrib/debug/common/debugger.ts index e0b78a4b4f2..0d2f50c79e5 100644 --- a/src/vs/workbench/contrib/debug/node/debugger.ts +++ b/src/vs/workbench/contrib/debug/common/debugger.ts @@ -4,11 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import * as nls from 'vs/nls'; -import { Client as TelemetryClient } from 'vs/base/parts/ipc/node/ipc.cp'; import * as strings from 'vs/base/common/strings'; import * as objects from 'vs/base/common/objects'; import { isObject } from 'vs/base/common/types'; -import { TelemetryAppenderClient } from 'vs/platform/telemetry/node/telemetryIpc'; import { IJSONSchema, IJSONSchemaSnippet } from 'vs/base/common/jsonSchema'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { IConfig, IDebuggerContribution, INTERNAL_CONSOLE_OPTIONS_SCHEMA, IConfigurationManager, IDebugAdapter, ITerminalSettings, IDebugger, IDebugSession } from 'vs/workbench/contrib/debug/common/debug'; @@ -19,12 +17,12 @@ import { TelemetryService } from 'vs/platform/telemetry/common/telemetryService' import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { memoize } from 'vs/base/common/decorators'; import { TaskDefinitionRegistry } from 'vs/workbench/contrib/tasks/common/taskDefinitionRegistry'; -import { getPathFromAmdModule } from 'vs/base/common/amd'; import { ITextResourcePropertiesService } from 'vs/editor/common/services/resourceConfiguration'; import { URI } from 'vs/base/common/uri'; import { Schemas } from 'vs/base/common/network'; import { isDebuggerMainContribution } from 'vs/workbench/contrib/debug/common/debugUtils'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { IDebugUIService } from 'vs/workbench/contrib/debug/common/debugUI'; export class Debugger implements IDebugger { @@ -37,6 +35,7 @@ export class Debugger implements IDebugger { @ITextResourcePropertiesService private readonly resourcePropertiesService: ITextResourcePropertiesService, @IConfigurationResolverService private readonly configurationResolverService: IConfigurationResolverService, @ITelemetryService private readonly telemetryService: ITelemetryService, + @IDebugUIService private readonly debugUIService: IDebugUIService ) { this.debuggerContribution = { type: dbgContribution.type }; this.merge(dbgContribution, extensionDescription); @@ -193,24 +192,8 @@ export class Debugger implements IDebugger { telemetryInfo['common.vscodesessionid'] = info.sessionId; return telemetryInfo; }).then(data => { - const client = new TelemetryClient( - getPathFromAmdModule(require, 'bootstrap-fork'), - { - serverName: 'Debug Telemetry', - timeout: 1000 * 60 * 5, - args: [`${this.getMainExtensionDescriptor().publisher}.${this.type}`, JSON.stringify(data), aiKey], - env: { - ELECTRON_RUN_AS_NODE: 1, - PIPE_LOGGING: 'true', - AMD_ENTRYPOINT: 'vs/workbench/contrib/debug/node/telemetryApp' - } - } - ); - - const channel = client.getChannel('telemetryAppender'); - const appender = new TelemetryAppenderClient(channel); - - return new TelemetryService({ appender }, this.configurationService); + const args = [`${this.getMainExtensionDescriptor().publisher}.${this.type}`, JSON.stringify(data), aiKey]; + return this.debugUIService.createTelemetryService(this.configurationService, args); }); } diff --git a/src/vs/workbench/contrib/debug/node/debugUIService.ts b/src/vs/workbench/contrib/debug/node/debugUIService.ts new file mode 100644 index 00000000000..7fad721771c --- /dev/null +++ b/src/vs/workbench/contrib/debug/node/debugUIService.ts @@ -0,0 +1,132 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as objects from 'vs/base/common/objects'; +import { isUri } from 'vs/workbench/contrib/debug/common/debugUtils'; +import * as cp from 'child_process'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { TerminalLauncher } from 'vs/workbench/contrib/debug/node/terminalSupport'; +import { ITerminalLauncher } from 'vs/workbench/contrib/debug/common/debug'; +import { Client as TelemetryClient } from 'vs/base/parts/ipc/node/ipc.cp'; +import { TelemetryAppenderClient } from 'vs/platform/telemetry/node/telemetryIpc'; +import { getPathFromAmdModule } from 'vs/base/common/amd'; +import { TelemetryService } from 'vs/platform/telemetry/common/telemetryService'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IDebugUIService, ILaunchVSCodeArguments } from 'vs/workbench/contrib/debug/common/debugUI'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; + +export class NodeDebugUIService implements IDebugUIService { + _serviceBrand: any; + + constructor( + @IEnvironmentService private readonly environmentService: IEnvironmentService + ) { + } + + createTerminalLauncher(instantiationService: IInstantiationService): ITerminalLauncher { + return instantiationService.createInstance(TerminalLauncher); + } + + launchVsCode(vscodeArgs: ILaunchVSCodeArguments): Promise { + + const spawnOpts: cp.SpawnOptions = { + detached: false // https://github.com/Microsoft/vscode/issues/57018 + }; + + if (vscodeArgs.env) { + // merge environment variables into a copy of the process.env + const envArgs = objects.mixin(objects.mixin({}, process.env), vscodeArgs.env); + // and delete some if necessary + Object.keys(envArgs).filter(k => envArgs[k] === null).forEach(key => delete envArgs[key]); + spawnOpts.env = envArgs; + } + + let spawnArgs = vscodeArgs.args.map(a => { + if ((a.prefix === '--file-uri=' || a.prefix === '--folder-uri=') && !isUri(a.path)) { + return (a.path || ''); + } + return (a.prefix || '') + (a.path || ''); + }); + + let runtimeExecutable = this.environmentService['execPath']; + if (!runtimeExecutable) { + return Promise.reject(new Error(`VS Code executable unknown`)); + } + + // if VS Code runs out of sources, add the VS Code workspace path as the first argument so that Electron turns into VS Code + const electronIdx = runtimeExecutable.indexOf(process.platform === 'win32' ? '\\.build\\electron\\' : '/.build/electron/'); + if (electronIdx > 0) { + // guess the VS Code workspace path from the executable + const vscodeWorkspacePath = runtimeExecutable.substr(0, electronIdx); + + // only add VS Code workspace path if user hasn't already added that path as a (folder) argument + const x = spawnArgs.filter(a => a.indexOf(vscodeWorkspacePath) === 0); + if (x.length === 0) { + spawnArgs.unshift(vscodeWorkspacePath); + } + } + + // Workaround for bug Microsoft/vscode#45832 + if (process.platform === 'win32' && runtimeExecutable.indexOf(' ') > 0) { + let foundArgWithSpace = false; + + // check whether there is one arg with a space + const args: string[] = []; + for (const a of spawnArgs) { + if (a.indexOf(' ') > 0) { + args.push(`"${a}"`); + foundArgWithSpace = true; + } else { + args.push(a); + } + } + + if (foundArgWithSpace) { + spawnArgs = args; + runtimeExecutable = `"${runtimeExecutable}"`; + spawnOpts.shell = true; + } + } + + return new Promise((resolve, reject) => { + const process = cp.spawn(runtimeExecutable, spawnArgs, spawnOpts); + process.on('error', error => { + reject(error); + }); + process.on('exit', code => { + if (code === 0) { + resolve(process.pid); + } else { + reject(new Error(`VS Code exited with ${code}`)); + } + }); + }); + } + + createTelemetryService(configurationService: IConfigurationService, args: string[]): TelemetryService | undefined { + + const client = new TelemetryClient( + getPathFromAmdModule(require, 'bootstrap-fork'), + { + serverName: 'Debug Telemetry', + timeout: 1000 * 60 * 5, + args: args, + env: { + ELECTRON_RUN_AS_NODE: 1, + PIPE_LOGGING: 'true', + AMD_ENTRYPOINT: 'vs/workbench/contrib/debug/node/telemetryApp' + } + } + ); + + const channel = client.getChannel('telemetryAppender'); + const appender = new TelemetryAppenderClient(channel); + + return new TelemetryService({ appender }, configurationService); + } +} + +registerSingleton(IDebugUIService, NodeDebugUIService); \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/electron-browser/terminalSupport.ts b/src/vs/workbench/contrib/debug/node/terminalSupport.ts similarity index 100% rename from src/vs/workbench/contrib/debug/electron-browser/terminalSupport.ts rename to src/vs/workbench/contrib/debug/node/terminalSupport.ts diff --git a/src/vs/workbench/contrib/debug/test/electron-browser/debugModel.test.ts b/src/vs/workbench/contrib/debug/test/browser/debugModel.test.ts similarity index 99% rename from src/vs/workbench/contrib/debug/test/electron-browser/debugModel.test.ts rename to src/vs/workbench/contrib/debug/test/browser/debugModel.test.ts index 4702c3cd3af..47ea24bf5bf 100644 --- a/src/vs/workbench/contrib/debug/test/electron-browser/debugModel.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/debugModel.test.ts @@ -10,7 +10,7 @@ import { SimpleReplElement, DebugModel, Expression, RawObjectReplElement, StackF import * as sinon from 'sinon'; import { MockRawSession } from 'vs/workbench/contrib/debug/test/common/mockDebug'; import { Source } from 'vs/workbench/contrib/debug/common/debugSource'; -import { DebugSession } from 'vs/workbench/contrib/debug/electron-browser/debugSession'; +import { DebugSession } from 'vs/workbench/contrib/debug/browser/debugSession'; import { ReplModel } from 'vs/workbench/contrib/debug/common/replModel'; import { IBreakpointUpdateData } from 'vs/workbench/contrib/debug/common/debug'; 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 b5a5fa9f8bb..ee7eba706fd 100644 --- a/src/vs/workbench/contrib/debug/test/node/debugger.test.ts +++ b/src/vs/workbench/contrib/debug/test/node/debugger.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { join, normalize } from 'vs/base/common/path'; import * as platform from 'vs/base/common/platform'; import { IDebugAdapterExecutable, IConfigurationManager, IConfig, IDebugSession } from 'vs/workbench/contrib/debug/common/debug'; -import { Debugger } from 'vs/workbench/contrib/debug/node/debugger'; +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'; @@ -130,7 +130,7 @@ suite('Debug - Debugger', () => { const testResourcePropertiesService = new TestTextResourcePropertiesService(configurationService); setup(() => { - _debugger = new Debugger(configurationManager, debuggerContribution, extensionDescriptor0, configurationService, testResourcePropertiesService, undefined!, undefined!); + _debugger = new Debugger(configurationManager, debuggerContribution, extensionDescriptor0, configurationService, testResourcePropertiesService, undefined!, undefined!, undefined!); }); teardown(() => { diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index aaf84484bbf..7d36f913001 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -230,11 +230,12 @@ import 'vs/workbench/contrib/scm/browser/scm.contribution'; import 'vs/workbench/contrib/scm/browser/scmViewlet'; // Debug -import 'vs/workbench/contrib/debug/electron-browser/debug.contribution'; +import 'vs/workbench/contrib/debug/browser/debug.contribution'; import 'vs/workbench/contrib/debug/browser/debugQuickOpen'; import 'vs/workbench/contrib/debug/browser/debugEditorContribution'; import 'vs/workbench/contrib/debug/browser/repl'; import 'vs/workbench/contrib/debug/browser/debugViewlet'; +import 'vs/workbench/contrib/debug/node/debugUIService'; // Markers import 'vs/workbench/contrib/markers/browser/markers.contribution'; diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index 01446dd7279..e89d766d149 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -234,11 +234,13 @@ import 'vs/workbench/contrib/scm/browser/scm.contribution'; import 'vs/workbench/contrib/scm/browser/scmViewlet'; // Debug -// import 'vs/workbench/contrib/debug/electron-browser/debug.contribution'; -// import 'vs/workbench/contrib/debug/browser/debugQuickOpen'; -// import 'vs/workbench/contrib/debug/browser/debugEditorContribution'; -// import 'vs/workbench/contrib/debug/browser/repl'; -// import 'vs/workbench/contrib/debug/browser/debugViewlet'; +import 'vs/workbench/contrib/debug/browser/debug.contribution'; +import 'vs/workbench/contrib/debug/browser/debugQuickOpen'; +import 'vs/workbench/contrib/debug/browser/debugEditorContribution'; +import 'vs/workbench/contrib/debug/browser/repl'; +import 'vs/workbench/contrib/debug/browser/debugViewlet'; +import 'vs/workbench/contrib/debug/browser/debugUIService'; + // Markers import 'vs/workbench/contrib/markers/browser/markers.contribution'; From e12dff9fe5dda1ef36c2edfd353974ee5cb55aeb Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Mon, 17 Jun 2019 16:25:31 +0200 Subject: [PATCH 0247/1449] Better name for temporary DebugUIService --- .../browser/debugConfigurationManager.ts | 7 ++-- ...ebugUIService.ts => debugHelperService.ts} | 9 ++--- .../contrib/debug/browser/debugSession.ts | 5 +-- .../contrib/debug/browser/rawDebugSession.ts | 6 +-- .../workbench/contrib/debug/common/debug.ts | 33 ++++++++++++++++- .../workbench/contrib/debug/common/debugUI.ts | 37 ------------------- .../contrib/debug/common/debugger.ts | 7 ++-- ...ebugUIService.ts => debugHelperService.ts} | 7 ++-- src/vs/workbench/workbench.main.ts | 2 +- src/vs/workbench/workbench.web.main.ts | 2 +- 10 files changed, 51 insertions(+), 64 deletions(-) rename src/vs/workbench/contrib/debug/browser/{debugUIService.ts => debugHelperService.ts} (76%) delete mode 100644 src/vs/workbench/contrib/debug/common/debugUI.ts rename src/vs/workbench/contrib/debug/node/{debugUIService.ts => debugHelperService.ts} (93%) diff --git a/src/vs/workbench/contrib/debug/browser/debugConfigurationManager.ts b/src/vs/workbench/contrib/debug/browser/debugConfigurationManager.ts index 28eae251da8..af9817c9807 100644 --- a/src/vs/workbench/contrib/debug/browser/debugConfigurationManager.ts +++ b/src/vs/workbench/contrib/debug/browser/debugConfigurationManager.ts @@ -21,7 +21,7 @@ import { IFileService } from 'vs/platform/files/common/files'; import { IWorkspaceContextService, IWorkspaceFolder, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ICommandService } from 'vs/platform/commands/common/commands'; -import { IDebugConfigurationProvider, ICompound, IDebugConfiguration, IConfig, IGlobalConfig, IConfigurationManager, ILaunch, IDebugAdapterDescriptorFactory, IDebugAdapter, ITerminalSettings, ITerminalLauncher, IDebugSession, IAdapterDescriptor, CONTEXT_DEBUG_CONFIGURATION_TYPE, IDebugAdapterFactory, IDebugService } from 'vs/workbench/contrib/debug/common/debug'; +import { IDebugConfigurationProvider, ICompound, IDebugConfiguration, IConfig, IGlobalConfig, IConfigurationManager, ILaunch, IDebugAdapterDescriptorFactory, IDebugAdapter, ITerminalSettings, ITerminalLauncher, IDebugSession, IAdapterDescriptor, CONTEXT_DEBUG_CONFIGURATION_TYPE, IDebugAdapterFactory, IDebugService, IDebugHelperService } from 'vs/workbench/contrib/debug/common/debug'; import { Debugger } from 'vs/workbench/contrib/debug/common/debugger'; import { IEditorService, ACTIVE_GROUP, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { isCodeEditor } from 'vs/editor/browser/editorBrowser'; @@ -34,7 +34,6 @@ import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { onUnexpectedError } from 'vs/base/common/errors'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; -import { IDebugUIService } from 'vs/workbench/contrib/debug/common/debugUI'; const jsonRegistry = Registry.as(JSONExtensions.JSONContribution); jsonRegistry.registerSchema(launchSchemaId, launchSchema); @@ -68,7 +67,7 @@ export class ConfigurationManager implements IConfigurationManager { @ILifecycleService lifecycleService: ILifecycleService, @IExtensionService private readonly extensionService: IExtensionService, @IContextKeyService contextKeyService: IContextKeyService, - @IDebugUIService private readonly debugUIService: IDebugUIService + @IDebugHelperService private readonly debugHelperService: IDebugHelperService ) { this.configProviders = []; this.adapterDescriptorFactories = []; @@ -115,7 +114,7 @@ export class ConfigurationManager implements IConfigurationManager { let tl: ITerminalLauncher | undefined = this.debugAdapterFactories.get(debugType); if (!tl) { if (!this.terminalLauncher) { - this.terminalLauncher = this.debugUIService.createTerminalLauncher(this.instantiationService); + this.terminalLauncher = this.debugHelperService.createTerminalLauncher(this.instantiationService); } tl = this.terminalLauncher; } diff --git a/src/vs/workbench/contrib/debug/browser/debugUIService.ts b/src/vs/workbench/contrib/debug/browser/debugHelperService.ts similarity index 76% rename from src/vs/workbench/contrib/debug/browser/debugUIService.ts rename to src/vs/workbench/contrib/debug/browser/debugHelperService.ts index a2a939c03f7..c7fa5b96cd1 100644 --- a/src/vs/workbench/contrib/debug/browser/debugUIService.ts +++ b/src/vs/workbench/contrib/debug/browser/debugHelperService.ts @@ -4,15 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import { ServiceIdentifier, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ITerminalLauncher } from 'vs/workbench/contrib/debug/common/debug'; +import { ITerminalLauncher, IDebugHelperService, ILaunchVSCodeArguments } from 'vs/workbench/contrib/debug/common/debug'; import { TelemetryService } from 'vs/platform/telemetry/common/telemetryService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IDebugUIService, ILaunchVSCodeArguments } from 'vs/workbench/contrib/debug/common/debugUI'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -export class BrowserDebugUIService implements IDebugUIService { +export class BrowserDebugHelperService implements IDebugHelperService { - _serviceBrand: ServiceIdentifier; + _serviceBrand: ServiceIdentifier; createTerminalLauncher(instantiationService: IInstantiationService): ITerminalLauncher { throw new Error('Method createTerminalLauncher not implemented.'); @@ -27,4 +26,4 @@ export class BrowserDebugUIService implements IDebugUIService { } } -registerSingleton(IDebugUIService, BrowserDebugUIService); \ No newline at end of file +registerSingleton(IDebugHelperService, BrowserDebugHelperService); \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/debugSession.ts b/src/vs/workbench/contrib/debug/browser/debugSession.ts index 259dd7a13a0..da945a8ee9f 100644 --- a/src/vs/workbench/contrib/debug/browser/debugSession.ts +++ b/src/vs/workbench/contrib/debug/browser/debugSession.ts @@ -12,7 +12,7 @@ import { Event, Emitter } from 'vs/base/common/event'; import { CompletionItem, completionKindFromString } from 'vs/editor/common/modes'; import { Position } from 'vs/editor/common/core/position'; import * as aria from 'vs/base/browser/ui/aria/aria'; -import { IDebugSession, IConfig, IThread, IRawModelUpdate, IDebugService, IRawStoppedDetails, State, LoadedSourceEvent, IFunctionBreakpoint, IExceptionBreakpoint, IBreakpoint, IExceptionInfo, AdapterEndEvent, IDebugger, VIEWLET_ID, IDebugConfiguration, IReplElement, IStackFrame, IExpression, IReplElementSource } from 'vs/workbench/contrib/debug/common/debug'; +import { IDebugSession, IConfig, IThread, IRawModelUpdate, IDebugService, IRawStoppedDetails, State, LoadedSourceEvent, IFunctionBreakpoint, IExceptionBreakpoint, IBreakpoint, IExceptionInfo, AdapterEndEvent, IDebugger, VIEWLET_ID, IDebugConfiguration, IReplElement, IStackFrame, IExpression, IReplElementSource, IDebugHelperService } from 'vs/workbench/contrib/debug/common/debug'; import { Source } from 'vs/workbench/contrib/debug/common/debugSource'; import { mixin } from 'vs/base/common/objects'; import { Thread, ExpressionContainer, DebugModel } from 'vs/workbench/contrib/debug/common/debugModel'; @@ -32,7 +32,6 @@ import { ReplModel } from 'vs/workbench/contrib/debug/common/replModel'; import { onUnexpectedError } from 'vs/base/common/errors'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { ISignService } from 'vs/platform/sign/common/sign'; -import { IDebugUIService } from 'vs/workbench/contrib/debug/common/debugUI'; export class DebugSession implements IDebugSession { @@ -69,7 +68,7 @@ export class DebugSession implements IDebugSession { @INotificationService private readonly notificationService: INotificationService, @ISignService private readonly signService: ISignService, @IProductService private readonly productService: IProductService, - @IDebugUIService private readonly debugUIService: IDebugUIService + @IDebugHelperService private readonly debugUIService: IDebugHelperService ) { this.id = generateUuid(); this.repl = new ReplModel(this); diff --git a/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts b/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts index 53b3dab14ba..3eb52275d43 100644 --- a/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts +++ b/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts @@ -10,11 +10,9 @@ import { Action } from 'vs/base/common/actions'; import * as errors from 'vs/base/common/errors'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { formatPII } from 'vs/workbench/contrib/debug/common/debugUtils'; -import { IDebugAdapter, IConfig, AdapterEndEvent, IDebugger } from 'vs/workbench/contrib/debug/common/debug'; +import { IDebugAdapter, IConfig, AdapterEndEvent, IDebugger, IDebugHelperService, ILaunchVSCodeArguments } from 'vs/workbench/contrib/debug/common/debug'; import { createErrorWithActions } from 'vs/base/common/errorsWithActions'; import { ISignService } from 'vs/platform/sign/common/sign'; -import { IDebugUIService, ILaunchVSCodeArguments } from 'vs/workbench/contrib/debug/common/debugUI'; - /** * Encapsulates the DebugAdapter lifecycle and some idiosyncrasies of the Debug Adapter Protocol. @@ -58,7 +56,7 @@ export class RawDebugSession { private readonly telemetryService: ITelemetryService, public readonly customTelemetryService: ITelemetryService | undefined, private readonly signService: ISignService, - private readonly debugUIService: IDebugUIService + private readonly debugUIService: IDebugHelperService ) { this.debugAdapter = debugAdapter; this._capabilities = Object.create(null); diff --git a/src/vs/workbench/contrib/debug/common/debug.ts b/src/vs/workbench/contrib/debug/common/debug.ts index ff5f06503ee..de7ba55bf0f 100644 --- a/src/vs/workbench/contrib/debug/common/debug.ts +++ b/src/vs/workbench/contrib/debug/common/debug.ts @@ -8,7 +8,7 @@ import { URI as uri } from 'vs/base/common/uri'; import severity from 'vs/base/common/severity'; import { Event } from 'vs/base/common/event'; import { IJSONSchemaSnippet } from 'vs/base/common/jsonSchema'; -import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { createDecorator, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { ITextModel as EditorIModel } from 'vs/editor/common/model'; import { IEditor, ITextEditor } from 'vs/workbench/common/editor'; @@ -25,6 +25,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { TaskIdentifier } from 'vs/workbench/contrib/tasks/common/tasks'; import { TelemetryService } from 'vs/platform/telemetry/common/telemetryService'; import { ITerminalConfiguration } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; export const VIEWLET_ID = 'workbench.view.debug'; export const VIEW_CONTAINER: ViewContainer = Registry.as(ViewContainerExtensions.ViewContainersRegistry).registerViewContainer(VIEWLET_ID); @@ -835,3 +836,33 @@ export interface IDebugEditorContribution extends IEditorContribution { closeBreakpointWidget(): void; addLaunchConfiguration(): Promise; } + +// temporary debug helper service + +export const DEBUG_HELPER_SERVICE_ID = 'debugHelperService'; +export const IDebugHelperService = createDecorator(DEBUG_HELPER_SERVICE_ID); + +/** + * This interface represents a single command line argument split into a "prefix" and a "path" half. + * The optional "prefix" contains arbitrary text and the optional "path" contains a file system path. + * Concatenating both results in the original command line argument. + */ +export interface ILaunchVSCodeArgument { + prefix?: string; + path?: string; +} + +export interface ILaunchVSCodeArguments { + args: ILaunchVSCodeArgument[]; + env?: { [key: string]: string | null; }; +} + +export interface IDebugHelperService { + _serviceBrand: any; + + createTerminalLauncher(instantiationService: IInstantiationService): ITerminalLauncher; + + launchVsCode(vscodeArgs: ILaunchVSCodeArguments): Promise; + + createTelemetryService(configurationService: IConfigurationService, args: string[]): TelemetryService | undefined; +} diff --git a/src/vs/workbench/contrib/debug/common/debugUI.ts b/src/vs/workbench/contrib/debug/common/debugUI.ts deleted file mode 100644 index 775b0dee09c..00000000000 --- a/src/vs/workbench/contrib/debug/common/debugUI.ts +++ /dev/null @@ -1,37 +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 { createDecorator, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ITerminalLauncher } from 'vs/workbench/contrib/debug/common/debug'; -import { TelemetryService } from 'vs/platform/telemetry/common/telemetryService'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; - -export const DEBUGUI_SERVICE_ID = 'debugUIService'; -export const IDebugUIService = createDecorator(DEBUGUI_SERVICE_ID); - -/** - * This interface represents a single command line argument split into a "prefix" and a "path" half. - * The optional "prefix" contains arbitrary text and the optional "path" contains a file system path. - * Concatenating both results in the original command line argument. - */ -export interface ILaunchVSCodeArgument { - prefix?: string; - path?: string; -} - -export interface ILaunchVSCodeArguments { - args: ILaunchVSCodeArgument[]; - env?: { [key: string]: string | null; }; -} - -export interface IDebugUIService { - _serviceBrand: any; - - createTerminalLauncher(instantiationService: IInstantiationService): ITerminalLauncher; - - launchVsCode(vscodeArgs: ILaunchVSCodeArguments): Promise; - - createTelemetryService(configurationService: IConfigurationService, args: string[]): TelemetryService | undefined; -} diff --git a/src/vs/workbench/contrib/debug/common/debugger.ts b/src/vs/workbench/contrib/debug/common/debugger.ts index 0d2f50c79e5..4034a6c9596 100644 --- a/src/vs/workbench/contrib/debug/common/debugger.ts +++ b/src/vs/workbench/contrib/debug/common/debugger.ts @@ -9,7 +9,7 @@ import * as objects from 'vs/base/common/objects'; import { isObject } from 'vs/base/common/types'; import { IJSONSchema, IJSONSchemaSnippet } from 'vs/base/common/jsonSchema'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; -import { IConfig, IDebuggerContribution, INTERNAL_CONSOLE_OPTIONS_SCHEMA, IConfigurationManager, IDebugAdapter, ITerminalSettings, IDebugger, IDebugSession } from 'vs/workbench/contrib/debug/common/debug'; +import { IConfig, IDebuggerContribution, INTERNAL_CONSOLE_OPTIONS_SCHEMA, IConfigurationManager, IDebugAdapter, ITerminalSettings, IDebugger, IDebugSession, IDebugHelperService } from 'vs/workbench/contrib/debug/common/debug'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; import * as ConfigurationResolverUtils from 'vs/workbench/services/configurationResolver/common/configurationResolverUtils'; @@ -22,7 +22,6 @@ import { URI } from 'vs/base/common/uri'; import { Schemas } from 'vs/base/common/network'; import { isDebuggerMainContribution } from 'vs/workbench/contrib/debug/common/debugUtils'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; -import { IDebugUIService } from 'vs/workbench/contrib/debug/common/debugUI'; export class Debugger implements IDebugger { @@ -35,7 +34,7 @@ export class Debugger implements IDebugger { @ITextResourcePropertiesService private readonly resourcePropertiesService: ITextResourcePropertiesService, @IConfigurationResolverService private readonly configurationResolverService: IConfigurationResolverService, @ITelemetryService private readonly telemetryService: ITelemetryService, - @IDebugUIService private readonly debugUIService: IDebugUIService + @IDebugHelperService private readonly debugHelperService: IDebugHelperService ) { this.debuggerContribution = { type: dbgContribution.type }; this.merge(dbgContribution, extensionDescription); @@ -193,7 +192,7 @@ export class Debugger implements IDebugger { return telemetryInfo; }).then(data => { const args = [`${this.getMainExtensionDescriptor().publisher}.${this.type}`, JSON.stringify(data), aiKey]; - return this.debugUIService.createTelemetryService(this.configurationService, args); + return this.debugHelperService.createTelemetryService(this.configurationService, args); }); } diff --git a/src/vs/workbench/contrib/debug/node/debugUIService.ts b/src/vs/workbench/contrib/debug/node/debugHelperService.ts similarity index 93% rename from src/vs/workbench/contrib/debug/node/debugUIService.ts rename to src/vs/workbench/contrib/debug/node/debugHelperService.ts index 7fad721771c..cfbc3539189 100644 --- a/src/vs/workbench/contrib/debug/node/debugUIService.ts +++ b/src/vs/workbench/contrib/debug/node/debugHelperService.ts @@ -9,16 +9,15 @@ import * as cp from 'child_process'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { TerminalLauncher } from 'vs/workbench/contrib/debug/node/terminalSupport'; -import { ITerminalLauncher } from 'vs/workbench/contrib/debug/common/debug'; +import { ITerminalLauncher, IDebugHelperService, ILaunchVSCodeArguments } from 'vs/workbench/contrib/debug/common/debug'; import { Client as TelemetryClient } from 'vs/base/parts/ipc/node/ipc.cp'; import { TelemetryAppenderClient } from 'vs/platform/telemetry/node/telemetryIpc'; import { getPathFromAmdModule } from 'vs/base/common/amd'; import { TelemetryService } from 'vs/platform/telemetry/common/telemetryService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IDebugUIService, ILaunchVSCodeArguments } from 'vs/workbench/contrib/debug/common/debugUI'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -export class NodeDebugUIService implements IDebugUIService { +export class NodeDebugHelperService implements IDebugHelperService { _serviceBrand: any; constructor( @@ -129,4 +128,4 @@ export class NodeDebugUIService implements IDebugUIService { } } -registerSingleton(IDebugUIService, NodeDebugUIService); \ No newline at end of file +registerSingleton(IDebugHelperService, NodeDebugHelperService); \ No newline at end of file diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index 7d36f913001..412d58fbb2e 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -235,7 +235,7 @@ import 'vs/workbench/contrib/debug/browser/debugQuickOpen'; import 'vs/workbench/contrib/debug/browser/debugEditorContribution'; import 'vs/workbench/contrib/debug/browser/repl'; import 'vs/workbench/contrib/debug/browser/debugViewlet'; -import 'vs/workbench/contrib/debug/node/debugUIService'; +import 'vs/workbench/contrib/debug/node/debugHelperService'; // Markers import 'vs/workbench/contrib/markers/browser/markers.contribution'; diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index e89d766d149..09dc32edf03 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -239,7 +239,7 @@ import 'vs/workbench/contrib/debug/browser/debugQuickOpen'; import 'vs/workbench/contrib/debug/browser/debugEditorContribution'; import 'vs/workbench/contrib/debug/browser/repl'; import 'vs/workbench/contrib/debug/browser/debugViewlet'; -import 'vs/workbench/contrib/debug/browser/debugUIService'; +import 'vs/workbench/contrib/debug/browser/debugHelperService'; // Markers From a7412fbb2b2d1518c7d4e7c441e8ffabe3f8bced Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 17 Jun 2019 09:32:07 -0700 Subject: [PATCH 0248/1449] Pass cwd through to main --- src/vs/workbench/api/browser/mainThreadTerminalService.ts | 4 ++-- src/vs/workbench/api/common/extHost.protocol.ts | 2 +- src/vs/workbench/api/node/extHostTerminalService.ts | 2 +- src/vs/workbench/contrib/terminal/common/terminal.ts | 2 +- .../contrib/terminal/common/terminalProcessExtHostProxy.ts | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index 3dcabc3718b..a68310bb3ee 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -247,8 +247,8 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape this._terminalProcesses[terminalId].emitData(data); } - public $sendProcessPid(terminalId: number, pid: number): void { - this._terminalProcesses[terminalId].emitPid(pid); + public $sendProcessReady(terminalId: number, pid: number, cwd: string): void { + this._terminalProcesses[terminalId].emitReady(pid, cwd); } public $sendProcessExit(terminalId: number, exitCode: number): void { diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 0109dda3dec..bb93e419568 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -400,7 +400,7 @@ export interface MainThreadTerminalServiceShape extends IDisposable { // Process $sendProcessTitle(terminalId: number, title: string): void; $sendProcessData(terminalId: number, data: string): void; - $sendProcessPid(terminalId: number, pid: number): void; + $sendProcessReady(terminalId: number, pid: number, cwd: string): void; $sendProcessExit(terminalId: number, exitCode: number): void; $sendProcessInitialCwd(terminalId: number, cwd: string): void; $sendProcessCwd(terminalId: number, initialCwd: string): void; diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 353bcdd3d0a..f0dd94833f7 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -535,7 +535,7 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { // Fork the process and listen for messages this._logService.debug(`Terminal process launching on ext host`, shellLaunchConfig, initialCwd, cols, rows, env); const p = new TerminalProcess(shellLaunchConfig, initialCwd, cols, rows, env, terminalConfig.get('windowsEnableConpty') as boolean, this._logService); - p.onProcessReady((e: { pid: number, cwd: string }) => this._proxy.$sendProcessPid(id, e.pid)); + p.onProcessReady((e: { pid: number, cwd: string }) => this._proxy.$sendProcessReady(id, e.pid, e.cwd)); p.onProcessTitleChanged(title => this._proxy.$sendProcessTitle(id, title)); p.onProcessData(data => this._proxy.$sendProcessData(id, data)); p.onProcessExit(exitCode => this._onProcessExit(id, exitCode)); diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index 61164ac3e9f..c66a35797f0 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -723,7 +723,7 @@ export interface ITerminalProcessExtHostProxy extends IDisposable { emitData(data: string): void; emitTitle(title: string): void; - emitPid(pid: number): void; + emitReady(pid: number, cwd: string): void; emitExit(exitCode: number): void; emitInitialCwd(initialCwd: string): void; emitCwd(cwd: string): void; diff --git a/src/vs/workbench/contrib/terminal/common/terminalProcessExtHostProxy.ts b/src/vs/workbench/contrib/terminal/common/terminalProcessExtHostProxy.ts index 8346a90cd46..097d3b3145d 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalProcessExtHostProxy.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalProcessExtHostProxy.ts @@ -71,8 +71,8 @@ export class TerminalProcessExtHostProxy extends Disposable implements ITerminal this._onProcessTitleChanged.fire(title); } - public emitPid(pid: number): void { - this._onProcessReady.fire({ pid, cwd: '' }); + public emitReady(pid: number, cwd: string): void { + this._onProcessReady.fire({ pid, cwd }); } public emitExit(exitCode: number): void { From 0bb42e1c67c93b1e4c49f55b5a471e590d27541a Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 17 Jun 2019 10:00:04 -0700 Subject: [PATCH 0249/1449] Update remote node-pty --- remote/package.json | 8 ++++---- remote/yarn.lock | 17 ++++++----------- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/remote/package.json b/remote/package.json index da17913e867..acf5412a080 100644 --- a/remote/package.json +++ b/remote/package.json @@ -12,7 +12,7 @@ "keytar": "4.2.1", "minimist": "1.2.0", "native-watchdog": "1.0.0", - "node-pty": "0.8.1", + "node-pty": "0.9.0-beta17", "onigasm-umd": "^2.2.2", "semver": "^5.5.0", "spdlog": "^0.9.0", @@ -21,11 +21,11 @@ "vscode-proxy-agent": "0.4.0", "vscode-ripgrep": "^1.2.5", "vscode-textmate": "^4.1.1", - "yauzl": "^2.9.2", - "yazl": "^2.4.3", "xterm": "3.15.0-beta34", "xterm-addon-search": "0.1.0-beta6", - "xterm-addon-web-links": "0.1.0-beta10" + "xterm-addon-web-links": "0.1.0-beta10", + "yauzl": "^2.9.2", + "yazl": "^2.4.3" }, "optionalDependencies": { "vscode-windows-ca-certs": "0.1.0" diff --git a/remote/yarn.lock b/remote/yarn.lock index 11db8ed16fb..e5f73a8d3e6 100644 --- a/remote/yarn.lock +++ b/remote/yarn.lock @@ -599,11 +599,6 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -nan@2.12.1: - version "2.12.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" - integrity sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw== - nan@2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" @@ -614,7 +609,7 @@ nan@^2.10.0: resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.0.tgz#574e360e4d954ab16966ec102c0c049fd961a099" integrity sha512-F4miItu2rGnV2ySkXOQoA8FKz/SR2Q2sWP0sbTxNxz/tuokeC8WxOhPMcwi0qIyGtVn/rrSeLbvVkznqCdwYnw== -nan@^2.12.1, nan@^2.14.0: +nan@^2.12.1, nan@^2.13.2, nan@^2.14.0: version "2.14.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== @@ -636,12 +631,12 @@ node-addon-api@1.6.2: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.6.2.tgz#d8aad9781a5cfc4132cc2fecdbdd982534265217" integrity sha512-479Bjw9nTE5DdBSZZWprFryHGjUaQC31y1wHo19We/k0BZlrmhqQitWoUL0cD8+scljCbIUL+E58oRDEakdGGA== -node-pty@0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-0.8.1.tgz#94b457bec013e7a09b8d9141f63b0787fa25c23f" - integrity sha512-j+/g0Q5dR+vkELclpJpz32HcS3O/3EdPSGPvDXJZVJQLCvgG0toEbfmymxAEyQyZEpaoKHAcoL+PvKM+4N9nlw== +node-pty@0.9.0-beta17: + version "0.9.0-beta17" + resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-0.9.0-beta17.tgz#9b490df86a8124dea595e9fbedeaaf4b2eedbbcb" + integrity sha512-E94XwIs3JxLKAboquHY9Kytbbj/T/tJtRpQoAUdfPE7UXRta/NV+xdmRNhZkeU9jCji+plm656GbYFievgNPkQ== dependencies: - nan "2.12.1" + nan "^2.13.2" noop-logger@^0.1.1: version "0.1.1" From 908e350569cf8d685893f64a1e5641a4571393f5 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Mon, 17 Jun 2019 10:19:36 -0700 Subject: [PATCH 0250/1449] Add checkmark icon --- src/vs/workbench/browser/media/icons.css | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/vs/workbench/browser/media/icons.css b/src/vs/workbench/browser/media/icons.css index 1c3d507dbe4..1d000db29a0 100644 --- a/src/vs/workbench/browser/media/icons.css +++ b/src/vs/workbench/browser/media/icons.css @@ -184,6 +184,7 @@ body[data-exploration^="icon-exploration"] .monaco-editor .find-widget .monaco-c } /* Before elements */ +body[data-exploration="icon-exploration"] .settings-editor > .settings-body > .settings-tree-container .setting-item-bool .setting-value-checkbox.checked::before, body[data-exploration^="icon-exploration"] .search-view .search-widget .toggle-replace-button.collapse::before, body[data-exploration^="icon-exploration"] .search-view .search-widget .toggle-replace-button.expand::before, body[data-exploration^="icon-exploration"] .monaco-panel-view .panel > .panel-header::before, @@ -206,6 +207,7 @@ body[data-exploration^="icon-exploration"] .keybindings-editor .monaco-action-ba } /* For icons that are a custom checkbox and use focus */ +body[data-exploration="icon-exploration"] .settings-editor > .settings-body > .settings-tree-container .setting-item-bool .setting-value-checkbox.checked, body[data-exploration^="icon-exploration"] .monaco-findInput > .controls .monaco-custom-checkbox, body[data-exploration^="icon-exploration"] .markers-panel-action-filter > .markers-panel-filter-controls > .markers-panel-filter-filesExclude, body[data-exploration^="icon-exploration"] .monaco-panel-view .panel > .panel-header, @@ -213,6 +215,7 @@ body[data-exploration^="icon-exploration"] .keybindings-editor .monaco-action-ba background-image: none !important; } +body[data-exploration="icon-exploration"] .settings-editor > .settings-body > .settings-tree-container .setting-item-bool .setting-value-checkbox.checked::before, body[data-exploration^="icon-exploration"] .monaco-findInput > .controls .monaco-custom-checkbox::before, body[data-exploration^="icon-exploration"] .markers-panel .monaco-tl-contents .multiline-actions .action-label.octicon-chevron-up::before, body[data-exploration^="icon-exploration"] .markers-panel .monaco-tl-contents .multiline-actions .action-label.octicon-chevron-down::before, @@ -387,6 +390,7 @@ body[data-exploration="icon-exploration"] .monaco-workbench .part > .title > .ti -webkit-mask-image: url("images/git/initialze.svg"); } +body[data-exploration="icon-exploration"] .settings-editor > .settings-body > .settings-tree-container .setting-item-bool .setting-value-checkbox.checked::before, body[data-exploration="icon-exploration"] .monaco-workbench .part > .title > .title-actions .action-label[data-title="git.commit"], body[data-exploration="icon-exploration"] .monaco-panel-view .panel > .panel-header > .actions .action-label.icon[data-title="git.commit"] { -webkit-mask-image: url("images/git/check-alt1.svg"); @@ -1251,4 +1255,8 @@ body[data-exploration="icon-exploration"] .monaco-editor .margin-view-overlays . body[data-exploration="icon-exploration"] .monaco-editor .find-widget .matchesCount { margin-right: 0; padding-right: 0; +} + +body[data-exploration="icon-exploration"] .settings-editor > .settings-body > .settings-tree-container .setting-item-bool .setting-value-checkbox.checked::before { + -webkit-mask-size: 14px; } \ No newline at end of file From a321476b277d6ce727e8a200b42ef7b4932be5de Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 17 Jun 2019 10:47:50 -0700 Subject: [PATCH 0251/1449] Disable shell selector on remote --- .../contrib/terminal/browser/terminal.contribution.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts index 2ab913b9cfc..dfefd249327 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts @@ -370,7 +370,8 @@ actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ClearTerminalAct primary: 0, mac: { primary: KeyMod.CtrlCmd | KeyCode.KEY_K } }, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KeybindingWeight.WorkbenchContrib + 1), 'Terminal: Clear', category); -if (platform.isWindows) { +// TODO: Web should support this as well, the shell query needs to go to the ext host though +if (platform.isWindows && !platform.isWeb) { actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(SelectDefaultShellWindowsTerminalAction, SelectDefaultShellWindowsTerminalAction.ID, SelectDefaultShellWindowsTerminalAction.LABEL), 'Terminal: Select Default Shell', category); } actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(AllowWorkspaceShellTerminalCommand, AllowWorkspaceShellTerminalCommand.ID, AllowWorkspaceShellTerminalCommand.LABEL), 'Terminal: Allow Workspace Shell Configuration', category); From 7dfbccb8e213f93618206ae0799ee181b8464155 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 17 Jun 2019 10:48:03 -0700 Subject: [PATCH 0252/1449] Disable conpty on remote --- src/vs/workbench/api/node/extHostTerminalService.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index f0dd94833f7..eadd6cbdf7d 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -534,7 +534,9 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { // Fork the process and listen for messages this._logService.debug(`Terminal process launching on ext host`, shellLaunchConfig, initialCwd, cols, rows, env); - const p = new TerminalProcess(shellLaunchConfig, initialCwd, cols, rows, env, terminalConfig.get('windowsEnableConpty') as boolean, this._logService); + // TODO: Support conpty on remote, it doesn't seem to work for some reason? + const enableConpty = false; //terminalConfig.get('windowsEnableConpty') as boolean; + const p = new TerminalProcess(shellLaunchConfig, initialCwd, cols, rows, env, enableConpty, this._logService); p.onProcessReady((e: { pid: number, cwd: string }) => this._proxy.$sendProcessReady(id, e.pid, e.cwd)); p.onProcessTitleChanged(title => this._proxy.$sendProcessTitle(id, title)); p.onProcessData(data => this._proxy.$sendProcessData(id, data)); From 36860775463e18159c26e3a4bb0e1edd8d43c03d Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 17 Jun 2019 20:13:06 +0200 Subject: [PATCH 0253/1449] web - unblock selfhost with simple storage service that works --- .../workbench/browser/web.simpleservices.ts | 188 ++++++++++-------- 1 file changed, 103 insertions(+), 85 deletions(-) diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index b9eb0073a01..3654c72f7ae 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -9,7 +9,7 @@ import { ITextSnapshot } from 'vs/editor/common/model'; import { createTextBufferFactoryFromSnapshot } from 'vs/editor/common/model/textModel'; import { keys } from 'vs/base/common/map'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { Event } from 'vs/base/common/event'; +import { Emitter, Event } from 'vs/base/common/event'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; // tslint:disable-next-line: import-patterns no-standalone-editor @@ -26,7 +26,7 @@ import { ILogService, LogLevel, ConsoleLogService } from 'vs/platform/log/common import { ShutdownReason, ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { IProductService } from 'vs/platform/product/common/product'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; -import { InMemoryStorageService, IStorageService } from 'vs/platform/storage/common/storage'; +import { IStorageService, IWorkspaceStorageChangeEvent, StorageScope, IWillSaveStateEvent, WillSaveStateReason } from 'vs/platform/storage/common/storage'; import { IUpdateService, State } from 'vs/platform/update/common/update'; import { IWindowConfiguration, IPath, IPathsToWaitFor, IWindowService, INativeOpenDialogOptions, IEnterWorkspaceResult, IURIToOpen, IMessageBoxResult, IWindowsService, IOpenSettings } from 'vs/platform/windows/common/windows'; import { IProcessEnvironment } from 'vs/base/common/platform'; @@ -40,7 +40,6 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/ import { IReloadSessionEvent, IExtensionHostDebugService, ICloseSessionEvent, IAttachSessionEvent, ILogToSessionEvent, ITerminateSessionEvent } from 'vs/workbench/services/extensions/common/extensionHostDebug'; import { IRemoteConsoleLog } from 'vs/base/common/console'; // tslint:disable-next-line: import-patterns -import { State as DebugState, IDebugService, IDebugSession, IConfigurationManager, IStackFrame, IThread, IViewModel, IExpression, IFunctionBreakpoint } from 'vs/workbench/contrib/debug/common/debug'; // tslint:disable-next-line: import-patterns import { IExtensionsWorkbenchService, IExtension as IExtension2 } from 'vs/workbench/contrib/extensions/common/extensions'; // tslint:disable-next-line: import-patterns @@ -49,6 +48,8 @@ import { ICommentService, IResourceCommentThreadEvent, IWorkspaceCommentThreadsE import { ICommentThreadChangedEvent } from 'vs/workbench/contrib/comments/common/commentModel'; import { CommentingRanges } from 'vs/editor/common/modes'; import { Range } from 'vs/editor/common/core/range'; +import { isUndefinedOrNull } from 'vs/base/common/types'; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; //#region Backup File @@ -298,86 +299,6 @@ registerSingleton(IExtensionGalleryService, SimpleExtensionGalleryService, true) //#endregion -//#region IDebugService -export class SimpleDebugService implements IDebugService { - _serviceBrand: any; - state: DebugState; - onDidChangeState: Event = Event.None; - onDidNewSession: Event = Event.None; - onWillNewSession: Event = Event.None; - onDidEndSession: Event = Event.None; - getConfigurationManager(): IConfigurationManager { - return new class implements IConfigurationManager { - canSetBreakpointsIn: any; - selectedConfiguration: any; - selectConfiguration: any; - getLaunches: any; - getLaunch: any; - onDidSelectConfiguration: Event; - activateDebuggers: any; - hasDebugConfigurationProvider: any; - registerDebugConfigurationProvider: any; - unregisterDebugConfigurationProvider: any; - registerDebugAdapterDescriptorFactory: any; - unregisterDebugAdapterDescriptorFactory: any; - resolveConfigurationByProviders: any; - getDebugAdapterDescriptor: any; - registerDebugAdapterFactory() { return Disposable.None; } - createDebugAdapter: any; - substituteVariables: any; - runInTerminal: any; - }; - } - focusStackFrame: any; - addBreakpoints: any; - updateBreakpoints: any; - enableOrDisableBreakpoints: any; - setBreakpointsActivated: any; - removeBreakpoints: any; - addFunctionBreakpoint: any; - renameFunctionBreakpoint: any; - removeFunctionBreakpoints: any; - sendAllBreakpoints: any; - addWatchExpression: any; - renameWatchExpression: any; - moveWatchExpression: any; - removeWatchExpressions: any; - startDebugging: any; - restartSession: any; - stopSession: any; - sourceIsNotAvailable: any; - getModel: any; - getViewModel(): IViewModel { - return new class implements IViewModel { - focusedSession: IDebugSession | undefined; - focusedThread: IThread | undefined; - focusedStackFrame: IStackFrame | undefined; - getSelectedExpression(): IExpression | undefined { - throw new Error('Method not implemented.'); - } - getSelectedFunctionBreakpoint(): IFunctionBreakpoint | undefined { - throw new Error('Method not implemented.'); - } - setSelectedExpression(expression: IExpression | undefined): void { - throw new Error('Method not implemented.'); - } - setSelectedFunctionBreakpoint(functionBreakpoint: IFunctionBreakpoint | undefined): void { - throw new Error('Method not implemented.'); - } - isMultiSessionView(): boolean { - throw new Error('Method not implemented.'); - } - onDidFocusSession: Event = Event.None; - onDidFocusStackFrame: Event<{ stackFrame: IStackFrame | undefined; explicit: boolean; }> = Event.None; - onDidSelectExpression: Event = Event.None; - getId(): string { - throw new Error('Method not implemented.'); - } - }; - } -} -registerSingleton(IDebugService, SimpleDebugService, true); - //#endregion IExtensionsWorkbenchService export class SimpleExtensionsWorkbenchService implements IExtensionsWorkbenchService { _serviceBrand: any; @@ -748,9 +669,106 @@ export class SimpleRequestService implements IRequestService { //#region Storage -export class SimpleStorageService extends InMemoryStorageService { } +export class LocalStorageService extends Disposable implements IStorageService { + _serviceBrand = undefined; -registerSingleton(IStorageService, SimpleStorageService); + private readonly _onDidChangeStorage: Emitter = this._register(new Emitter()); + get onDidChangeStorage(): Event { return this._onDidChangeStorage.event; } + + private readonly _onWillSaveState: Emitter = this._register(new Emitter()); + get onWillSaveState(): Event { return this._onWillSaveState.event; } + + constructor( + @IWorkspaceContextService private workspaceContextService: IWorkspaceContextService, + @ILifecycleService lifecycleService: ILifecycleService + ) { + super(); + + this._register(lifecycleService.onBeforeShutdown(() => this._onWillSaveState.fire({ reason: WillSaveStateReason.SHUTDOWN }))); + } + + private toKey(key: string, scope: StorageScope): string { + if (scope === StorageScope.GLOBAL) { + return `global://${key}`; + } + + return `workspace://${this.workspaceContextService.getWorkspace().id}/${key}`; + } + + get(key: string, scope: StorageScope, fallbackValue: string): string; + get(key: string, scope: StorageScope, fallbackValue?: string): string | undefined { + const value = window.localStorage.getItem(this.toKey(key, scope)); + + if (isUndefinedOrNull(value)) { + return fallbackValue; + } + + return value; + } + + getBoolean(key: string, scope: StorageScope, fallbackValue: boolean): boolean; + getBoolean(key: string, scope: StorageScope, fallbackValue?: boolean): boolean | undefined { + const value = window.localStorage.getItem(this.toKey(key, scope)); + + if (isUndefinedOrNull(value)) { + return fallbackValue; + } + + return value === 'true'; + } + + getNumber(key: string, scope: StorageScope, fallbackValue: number): number; + getNumber(key: string, scope: StorageScope, fallbackValue?: number): number | undefined { + const value = window.localStorage.getItem(this.toKey(key, scope)); + + if (isUndefinedOrNull(value)) { + return fallbackValue; + } + + return parseInt(value, 10); + } + + store(key: string, value: string | boolean | number | undefined | null, scope: StorageScope): Promise { + + // We remove the key for undefined/null values + if (isUndefinedOrNull(value)) { + return this.remove(key, scope); + } + + // Otherwise, convert to String and store + const valueStr = String(value); + + // Return early if value already set + const currentValue = window.localStorage.getItem(this.toKey(key, scope)); + if (currentValue === valueStr) { + return Promise.resolve(); + } + + // Update in cache + window.localStorage.setItem(this.toKey(key, scope), valueStr); + + // Events + this._onDidChangeStorage.fire({ scope, key }); + + return Promise.resolve(); + } + + remove(key: string, scope: StorageScope): Promise { + const wasDeleted = window.localStorage.getItem(this.toKey(key, scope)); + window.localStorage.removeItem(this.toKey(key, scope)); + + if (!wasDeleted) { + return Promise.resolve(); // Return early if value already deleted + } + + // Events + this._onDidChangeStorage.fire({ scope, key }); + + return Promise.resolve(); + } +} + +registerSingleton(IStorageService, LocalStorageService); //#endregion From de3728acd45e2de22a4490d36fc0148fbaebab78 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Mon, 17 Jun 2019 11:15:45 -0700 Subject: [PATCH 0254/1449] Add open editor actions --- .../browser/actions/media/actions.css | 11 ++-- .../actions/media/editor-layout-inverse.svg | 1 - .../browser/actions/media/editor-layout.svg | 1 - .../browser/actions/media/layout-dark.svg | 3 + .../browser/actions/media/layout-hc.svg | 3 + .../browser/actions/media/layout-light.svg | 3 + .../files/browser/media/add-file-dark.svg | 5 ++ .../files/browser/media/add-file-hc.svg | 5 ++ .../files/browser/media/add-file-light.svg | 5 ++ .../files/browser/media/close-all-dark.svg | 4 ++ .../files/browser/media/close-all-hc.svg | 4 ++ .../files/browser/media/close-all-light.svg | 4 ++ .../files/browser/media/fileactions.css | 63 +++++++++++-------- .../files/browser/media/save-all-dark.svg | 6 ++ .../files/browser/media/save-all-hc.svg | 6 ++ .../files/browser/media/save-all-light.svg | 6 ++ .../files/browser/media/saveall_inverse.svg | 1 - 17 files changed, 99 insertions(+), 32 deletions(-) delete mode 100644 src/vs/workbench/browser/actions/media/editor-layout-inverse.svg delete mode 100644 src/vs/workbench/browser/actions/media/editor-layout.svg create mode 100644 src/vs/workbench/browser/actions/media/layout-dark.svg create mode 100644 src/vs/workbench/browser/actions/media/layout-hc.svg create mode 100644 src/vs/workbench/browser/actions/media/layout-light.svg create mode 100644 src/vs/workbench/contrib/files/browser/media/add-file-dark.svg create mode 100644 src/vs/workbench/contrib/files/browser/media/add-file-hc.svg create mode 100644 src/vs/workbench/contrib/files/browser/media/add-file-light.svg create mode 100644 src/vs/workbench/contrib/files/browser/media/close-all-dark.svg create mode 100644 src/vs/workbench/contrib/files/browser/media/close-all-hc.svg create mode 100644 src/vs/workbench/contrib/files/browser/media/close-all-light.svg create mode 100644 src/vs/workbench/contrib/files/browser/media/save-all-dark.svg create mode 100644 src/vs/workbench/contrib/files/browser/media/save-all-hc.svg create mode 100644 src/vs/workbench/contrib/files/browser/media/save-all-light.svg delete mode 100644 src/vs/workbench/contrib/files/browser/media/saveall_inverse.svg diff --git a/src/vs/workbench/browser/actions/media/actions.css b/src/vs/workbench/browser/actions/media/actions.css index 8edf1d21a2f..d67d1623514 100644 --- a/src/vs/workbench/browser/actions/media/actions.css +++ b/src/vs/workbench/browser/actions/media/actions.css @@ -4,10 +4,13 @@ *--------------------------------------------------------------------------------------------*/ .vs .monaco-workbench .flip-editor-layout { - background-image: url('editor-layout.svg'); + background-image: url('layout-light.svg'); } -.vs-dark .monaco-workbench .flip-editor-layout, -.hc-black .monaco-workbench .flip-editor-layout { - background-image: url('editor-layout-inverse.svg') !important; +.vs-dark .monaco-workbench .flip-editor-layout { + background-image: url('layout-dark.svg'); } + +.hc-black .monaco-workbench .flip-editor-layout { + background-image: url('layout-hc.svg'); +} \ No newline at end of file diff --git a/src/vs/workbench/browser/actions/media/editor-layout-inverse.svg b/src/vs/workbench/browser/actions/media/editor-layout-inverse.svg deleted file mode 100644 index fe5c9d7b3ee..00000000000 --- a/src/vs/workbench/browser/actions/media/editor-layout-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/browser/actions/media/editor-layout.svg b/src/vs/workbench/browser/actions/media/editor-layout.svg deleted file mode 100644 index 8d127ec737d..00000000000 --- a/src/vs/workbench/browser/actions/media/editor-layout.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/browser/actions/media/layout-dark.svg b/src/vs/workbench/browser/actions/media/layout-dark.svg new file mode 100644 index 00000000000..f7e50f481be --- /dev/null +++ b/src/vs/workbench/browser/actions/media/layout-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/actions/media/layout-hc.svg b/src/vs/workbench/browser/actions/media/layout-hc.svg new file mode 100644 index 00000000000..40c1b46b197 --- /dev/null +++ b/src/vs/workbench/browser/actions/media/layout-hc.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/actions/media/layout-light.svg b/src/vs/workbench/browser/actions/media/layout-light.svg new file mode 100644 index 00000000000..1f5e31274ec --- /dev/null +++ b/src/vs/workbench/browser/actions/media/layout-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/files/browser/media/add-file-dark.svg b/src/vs/workbench/contrib/files/browser/media/add-file-dark.svg new file mode 100644 index 00000000000..f365b0fdf69 --- /dev/null +++ b/src/vs/workbench/contrib/files/browser/media/add-file-dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/workbench/contrib/files/browser/media/add-file-hc.svg b/src/vs/workbench/contrib/files/browser/media/add-file-hc.svg new file mode 100644 index 00000000000..37891831f7b --- /dev/null +++ b/src/vs/workbench/contrib/files/browser/media/add-file-hc.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/workbench/contrib/files/browser/media/add-file-light.svg b/src/vs/workbench/contrib/files/browser/media/add-file-light.svg new file mode 100644 index 00000000000..9a2d2956e28 --- /dev/null +++ b/src/vs/workbench/contrib/files/browser/media/add-file-light.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/workbench/contrib/files/browser/media/close-all-dark.svg b/src/vs/workbench/contrib/files/browser/media/close-all-dark.svg new file mode 100644 index 00000000000..9f36d92bef7 --- /dev/null +++ b/src/vs/workbench/contrib/files/browser/media/close-all-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/files/browser/media/close-all-hc.svg b/src/vs/workbench/contrib/files/browser/media/close-all-hc.svg new file mode 100644 index 00000000000..e72191af0a1 --- /dev/null +++ b/src/vs/workbench/contrib/files/browser/media/close-all-hc.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/files/browser/media/close-all-light.svg b/src/vs/workbench/contrib/files/browser/media/close-all-light.svg new file mode 100644 index 00000000000..13873698045 --- /dev/null +++ b/src/vs/workbench/contrib/files/browser/media/close-all-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/files/browser/media/fileactions.css b/src/vs/workbench/contrib/files/browser/media/fileactions.css index 2eb68b32b03..228c7ec02ce 100644 --- a/src/vs/workbench/contrib/files/browser/media/fileactions.css +++ b/src/vs/workbench/contrib/files/browser/media/fileactions.css @@ -3,85 +3,98 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +/* Close all */ .monaco-workbench .explorer-viewlet .action-close-all-files { - background: url("closeall.svg") center center no-repeat; + background: url("close-all-light.svg") center center no-repeat; +} + +.vs-dark .monaco-workbench .explorer-viewlet .action-close-all-files { + background: url("close-all-dark.svg") center center no-repeat; } -.vs-dark .monaco-workbench .explorer-viewlet .action-close-all-files, .hc-black .monaco-workbench .explorer-viewlet .action-close-all-files { - background: url("closeall_inverse.svg") center center no-repeat; -} - -.monaco-workbench .explorer-action.new-file { - background: url('AddFile.svg') center center no-repeat; + background: url("close-all-light.svg") center center no-repeat; } +/* Save all */ .monaco-workbench .explorer-action.save-all { - background: url('saveall.svg') center center no-repeat; + background: url("save-all-light.svg") center center no-repeat; +} + +.vs-dark .monaco-workbench .explorer-action.save-all { + background: url("save-all-dark.svg") center center no-repeat; } -.vs-dark .monaco-workbench .explorer-action.save-all, .hc-black .monaco-workbench .explorer-action.save-all { - background: url('saveall_inverse.svg') center center no-repeat; + background: url("save-all-hc.svg") center center no-repeat; +} + +/* Add file */ +.monaco-workbench .explorer-action.new-file { + background: url("add-file-light.svg") center center no-repeat; +} + +.vs-dark .monaco-workbench .explorer-action.new-file { + background: url("add-file-dark.svg") center center no-repeat; } -.vs-dark .monaco-workbench .explorer-action.new-file, .hc-black .monaco-workbench .explorer-action.new-file { - background: url('AddFile_inverse.svg') center center no-repeat; + background: url("add-file-hc.svg") center center no-repeat; } +/* Add Folder */ .monaco-workbench .explorer-action.new-folder { - background: url('AddFolder.svg') center center no-repeat; + background: url("AddFolder.svg") center center no-repeat; } .vs-dark .monaco-workbench .explorer-action.new-folder, .hc-black .monaco-workbench .explorer-action.new-folder { - background: url('AddFolder_inverse.svg') center center no-repeat; + background: url("AddFolder_inverse.svg") center center no-repeat; } .monaco-workbench .explorer-action.refresh-explorer { - background: url('Refresh.svg') center center no-repeat; + background: url("Refresh.svg") center center no-repeat; } .vs-dark .monaco-workbench .explorer-action.refresh-explorer, .hc-black .monaco-workbench .explorer-action.refresh-explorer { - background: url('Refresh_inverse.svg') center center no-repeat; + background: url("Refresh_inverse.svg") center center no-repeat; } .monaco-workbench .explorer-action.collapse-explorer { - background: url('CollapseAll.svg') center center no-repeat; + background: url("CollapseAll.svg") center center no-repeat; } .vs-dark .monaco-workbench .explorer-action.collapse-explorer, .hc-black .monaco-workbench .explorer-action.collapse-explorer { - background: url('CollapseAll_inverse.svg') center center no-repeat; + background: url("CollapseAll_inverse.svg") center center no-repeat; } .monaco-workbench .quick-open-sidebyside-vertical { - background-image: url('split-editor-vertical.svg'); + background-image: url("split-editor-vertical.svg"); } .vs-dark .monaco-workbench .quick-open-sidebyside-vertical, .hc-black .monaco-workbench .quick-open-sidebyside-vertical { - background-image: url('split-editor-vertical-inverse.svg'); + background-image: url("split-editor-vertical-inverse.svg"); } .monaco-workbench .quick-open-sidebyside-horizontal { - background-image: url('split-editor-horizontal.svg'); + background-image: url("split-editor-horizontal.svg"); } .vs-dark .monaco-workbench .quick-open-sidebyside-horizontal, .hc-black .monaco-workbench .quick-open-sidebyside-horizontal { - background-image: url('split-editor-horizontal-inverse.svg'); + background-image: url("split-editor-horizontal-inverse.svg"); } .monaco-workbench .file-editor-action.action-open-preview { - background: url('Preview.svg') center center no-repeat; + background: url("Preview.svg") center center no-repeat; } -.vs-dark .monaco-workbench .file-editor-action.action-open-preview , +.vs-dark .monaco-workbench .file-editor-action.action-open-preview, .hc-black .monaco-workbench .file-editor-action.action-open-preview { - background: url('Preview_inverse.svg') center center no-repeat; + background: url("Preview_inverse.svg") center center no-repeat; } .explorer-viewlet .explorer-open-editors .close-editor-action { diff --git a/src/vs/workbench/contrib/files/browser/media/save-all-dark.svg b/src/vs/workbench/contrib/files/browser/media/save-all-dark.svg new file mode 100644 index 00000000000..991dc07db90 --- /dev/null +++ b/src/vs/workbench/contrib/files/browser/media/save-all-dark.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/vs/workbench/contrib/files/browser/media/save-all-hc.svg b/src/vs/workbench/contrib/files/browser/media/save-all-hc.svg new file mode 100644 index 00000000000..5756795cb42 --- /dev/null +++ b/src/vs/workbench/contrib/files/browser/media/save-all-hc.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/vs/workbench/contrib/files/browser/media/save-all-light.svg b/src/vs/workbench/contrib/files/browser/media/save-all-light.svg new file mode 100644 index 00000000000..27ac41d28fd --- /dev/null +++ b/src/vs/workbench/contrib/files/browser/media/save-all-light.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/vs/workbench/contrib/files/browser/media/saveall_inverse.svg b/src/vs/workbench/contrib/files/browser/media/saveall_inverse.svg deleted file mode 100644 index 6b395b40d6f..00000000000 --- a/src/vs/workbench/contrib/files/browser/media/saveall_inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file From 18ba826e675f0b0b008d951b3d131062bf92af62 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 17 Jun 2019 11:19:06 -0700 Subject: [PATCH 0255/1449] Markdown previews should be able to load resources from next to where they are running Add `'self'` to some content security policies for the preview --- .../src/features/previewContentProvider.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/markdown-language-features/src/features/previewContentProvider.ts b/extensions/markdown-language-features/src/features/previewContentProvider.ts index 486ce5d9db7..8a3b55a2f3c 100644 --- a/extensions/markdown-language-features/src/features/previewContentProvider.ts +++ b/extensions/markdown-language-features/src/features/previewContentProvider.ts @@ -197,17 +197,17 @@ export class MarkdownContentProvider { private getCspForResource(resource: vscode.Uri, nonce: string): string { switch (this.cspArbiter.getSecurityLevelForResource(resource)) { case MarkdownPreviewSecurityLevel.AllowInsecureContent: - return ``; + return ``; case MarkdownPreviewSecurityLevel.AllowInsecureLocalContent: - return ``; + return ``; case MarkdownPreviewSecurityLevel.AllowScriptsAndAllContent: return ''; case MarkdownPreviewSecurityLevel.Strict: default: - return ``; + return ``; } } } From ef5326f10edfc7cd788b84318ad1684125c58e3f Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 17 Jun 2019 11:19:55 -0700 Subject: [PATCH 0256/1449] More html text preprocessing into vscode process This does not need to happen in the webview itself --- .../workbench/contrib/webview/browser/pre/index.html | 3 --- src/vs/workbench/contrib/webview/browser/pre/main.js | 3 +-- .../contrib/webview/browser/webviewElement.ts | 10 +++++++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/index.html b/src/vs/workbench/contrib/webview/browser/pre/index.html index 4b247552399..c16fc30b938 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/index.html +++ b/src/vs/workbench/contrib/webview/browser/pre/index.html @@ -45,9 +45,6 @@ }, onMessage: (channel, handler) => { handlers[channel] = handler; - }, - preProcessHtml: (text) => { - return text.replace(/(?:["'])vscode-resource:([^\s'"]+)(?:["'])/gi, '/vscode-resource$1'); } }); }()); diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index 2b706c812da..783f109ffc3 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -99,7 +99,6 @@ * postMessage: (channel: string, data?: any) => void, * onMessage: (channel: string, handler: any) => void, * injectHtml?: (document: HTMLDocument) => void, - * preProcessHtml?: (text: string) => void, * focusIframeOnCreate?: boolean * }} HostCommunications */ @@ -263,7 +262,7 @@ host.onMessage('content', (_event, data) => { const options = data.options; - const text = host.preProcessHtml ? host.preProcessHtml(data.contents) : data.contents; + const text = data.contents; const newDocument = new DOMParser().parseFromString(text, 'text/html'); newDocument.querySelectorAll('a').forEach(a => { diff --git a/src/vs/workbench/contrib/webview/browser/webviewElement.ts b/src/vs/workbench/contrib/webview/browser/webviewElement.ts index 52936cb045c..cc16f1be6f7 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewElement.ts @@ -152,19 +152,23 @@ export class IFrameWebview extends Disposable implements Webview { public set html(value: string) { this.content = { - html: value, + html: this.preprocessHtml(value), options: this.content.options, state: this.content.state, }; this.doUpdateContent(); } + private preprocessHtml(value: string): string { + return value.replace(/(?:["'])vscode-resource:([^\s'"]+)(?:["'])/gi, '/vscode-resource$1'); + } + public update(html: string, options: WebviewContentOptions, retainContextWhenHidden: boolean) { if (retainContextWhenHidden && html === this.content.html && areWebviewInputOptionsEqual(options, this.content.options)) { return; } this.content = { - html: html, + html: this.preprocessHtml(html), options: options, state: this.content.state, }; @@ -209,7 +213,6 @@ export class IFrameWebview extends Disposable implements Webview { this._send('message', data); } - layout(): void { // noop } @@ -217,6 +220,7 @@ export class IFrameWebview extends Disposable implements Webview { focus(): void { this.element.focus(); } + dispose(): void { if (this.element) { if (this.element.parentElement) { From 238e53462725672b03dab88e774731d8ef26712b Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 17 Jun 2019 11:20:11 -0700 Subject: [PATCH 0257/1449] Fix iframe based webview scroll bars --- src/vs/workbench/contrib/webview/browser/pre/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/index.html b/src/vs/workbench/contrib/webview/browser/pre/index.html index c16fc30b938..036d8efde57 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/index.html +++ b/src/vs/workbench/contrib/webview/browser/pre/index.html @@ -1,5 +1,5 @@ - + @@ -11,7 +11,7 @@ Virtual Document - + ${this.getStyles(sourceUri, nonce, config, state)} - + ${body} @@ -108,8 +110,7 @@ export class MarkdownContentProvider { } private extensionResourcePath(mediaFile: string): string { - return vscode.Uri.file(this.context.asAbsolutePath(path.join('media', mediaFile))) - .with({ scheme: 'vscode-resource' }) + return toResoruceUri(vscode.Uri.file(this.context.asAbsolutePath(path.join('media', mediaFile)))) .toString(); } @@ -124,23 +125,17 @@ export class MarkdownContentProvider { // Assume it must be a local file if (path.isAbsolute(href)) { - return vscode.Uri.file(href) - .with({ scheme: 'vscode-resource' }) - .toString(); + return toResoruceUri(vscode.Uri.file(href)).toString(); } // Use a workspace relative path if there is a workspace const root = vscode.workspace.getWorkspaceFolder(resource); if (root) { - return vscode.Uri.file(path.join(root.uri.fsPath, href)) - .with({ scheme: 'vscode-resource' }) - .toString(); + return toResoruceUri(vscode.Uri.file(path.join(root.uri.fsPath, href))).toString(); } // Otherwise look relative to the markdown file - return vscode.Uri.file(path.join(path.dirname(resource.fsPath), href)) - .with({ scheme: 'vscode-resource' }) - .toString(); + return toResoruceUri(vscode.Uri.file(path.join(path.dirname(resource.fsPath), href))).toString(); } private computeCustomStyleSheetIncludes(resource: vscode.Uri, config: MarkdownPreviewConfiguration): string { @@ -197,17 +192,17 @@ export class MarkdownContentProvider { private getCspForResource(resource: vscode.Uri, nonce: string): string { switch (this.cspArbiter.getSecurityLevelForResource(resource)) { case MarkdownPreviewSecurityLevel.AllowInsecureContent: - return ``; + return ``; case MarkdownPreviewSecurityLevel.AllowInsecureLocalContent: - return ``; + return ``; case MarkdownPreviewSecurityLevel.AllowScriptsAndAllContent: return ''; case MarkdownPreviewSecurityLevel.Strict: default: - return ``; + return ``; } } } diff --git a/extensions/markdown-language-features/src/markdownExtensions.ts b/extensions/markdown-language-features/src/markdownExtensions.ts index 65899874f5a..ffbdc3054b8 100644 --- a/extensions/markdown-language-features/src/markdownExtensions.ts +++ b/extensions/markdown-language-features/src/markdownExtensions.ts @@ -7,10 +7,10 @@ import * as vscode from 'vscode'; import * as path from 'path'; import { Disposable } from './util/dispose'; import * as arrays from './util/arrays'; +import { toResoruceUri } from './util/resources'; const resolveExtensionResource = (extension: vscode.Extension, resourcePath: string): vscode.Uri => { - return vscode.Uri.file(path.join(extension.extensionPath, resourcePath)) - .with({ scheme: 'vscode-resource' }); + return toResoruceUri(vscode.Uri.file(path.join(extension.extensionPath, resourcePath))); }; const resolveExtensionResources = (extension: vscode.Extension, resourcePaths: unknown): vscode.Uri[] => { diff --git a/extensions/markdown-language-features/src/util/resources.ts b/extensions/markdown-language-features/src/util/resources.ts new file mode 100644 index 00000000000..f7133f5a0c4 --- /dev/null +++ b/extensions/markdown-language-features/src/util/resources.ts @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as vscode from 'vscode'; + +const rootUri = vscode.Uri.parse(vscode.env.webviewResourceRoot); + +export function toResoruceUri(uri: vscode.Uri): vscode.Uri { + return rootUri.with({ + path: rootUri.path + uri.path, + query: uri.query, + fragment: uri.fragment, + }); +} diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/webview.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/webview.test.ts index 3cc1cb3863b..01e8b460efa 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/webview.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/webview.test.ts @@ -251,7 +251,7 @@ suite('Webview tests', () => { }); `); - const workspaceRootUri = vscode.Uri.file(vscode.workspace.rootPath!).with({ scheme: 'vscode-resource' }); + const workspaceRootUri = vscode.env.webviewResourceRoot + vscode.Uri.file(vscode.workspace.rootPath!).path; { const imagePath = workspaceRootUri.toString() + '/image.png'; diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index b2d41431207..1555f4f9dd5 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -153,4 +153,5 @@ export interface IEnvironmentService { driverVerbose: boolean; webviewEndpoint?: string; + readonly webviewResourceRoot: string; } diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts index b4f9e1c2061..63f75996133 100644 --- a/src/vs/platform/environment/node/environmentService.ts +++ b/src/vs/platform/environment/node/environmentService.ts @@ -266,6 +266,10 @@ export class EnvironmentService implements IEnvironmentService { get driverHandle(): string | undefined { return this._args['driver']; } get driverVerbose(): boolean { return !!this._args['driver-verbose']; } + get webviewResourceRoot(): string { + return 'vscode-resource:'; + } + constructor(private _args: ParsedArgs, private _execPath: string) { if (!process.env['VSCODE_LOGS']) { const key = toLocalISOString(new Date()).replace(/-|:|\.\d+Z$/g, ''); diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 13e1da3d9dc..16e52984ff9 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1464,4 +1464,18 @@ declare module 'vscode' { } //#endregion + + //#region Webview Resource Roots + + export namespace env { + /** + * Root url from which local resources are loaded inside of webviews. + * + * This is `vscode-resource:` when vscode is run on the desktop. When vscode is run + * on the web, this points to a server endpoint. + */ + export const webviewResourceRoot: string; + } + + //#endregion } diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index bcd55cea583..2ce482060be 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -58,6 +58,7 @@ export interface IEnvironment { extensionTestsLocationURI?: URI; globalStorageHome: URI; userHome: URI; + webviewResourceRoot: string; } export interface IStaticWorkspaceData { diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index e86d15a4751..9b23ac7027e 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -259,7 +259,11 @@ export function createApiFactory( }, openExternal(uri: URI) { return extHostWindow.openUri(uri, { allowTunneling: !!initData.remoteAuthority }); - } + }, + get webviewResourceRoot() { + checkProposedApiEnabled(extension); + return initData.environment.webviewResourceRoot; + }, }; if (!initData.environment.extensionTestsLocationURI) { // allow to patch env-function when running tests diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts index a865a77a203..765a2703f72 100644 --- a/src/vs/workbench/services/environment/browser/environmentService.ts +++ b/src/vs/workbench/services/environment/browser/environmentService.ts @@ -133,4 +133,8 @@ export class BrowserWorkbenchEnvironmentService implements IEnvironmentService { driverHandle?: string; driverVerbose: boolean; webviewEndpoint?: string; + + get webviewResourceRoot(): string { + return this.webviewEndpoint ? this.webviewEndpoint + '/vscode-resource' : 'vscode-resource:'; + } } diff --git a/src/vs/workbench/services/extensions/common/remoteExtensionHostClient.ts b/src/vs/workbench/services/extensions/common/remoteExtensionHostClient.ts index 75ca5ef552a..f21711a4168 100644 --- a/src/vs/workbench/services/extensions/common/remoteExtensionHostClient.ts +++ b/src/vs/workbench/services/extensions/common/remoteExtensionHostClient.ts @@ -189,7 +189,8 @@ export class RemoteExtensionHostClient extends Disposable implements IExtensionH extensionDevelopmentLocationURI: this._environmentService.extensionDevelopmentLocationURI, extensionTestsLocationURI: this._environmentService.extensionTestsLocationURI, globalStorageHome: remoteExtensionHostData.globalStorageHome, - userHome: remoteExtensionHostData.userHome + userHome: remoteExtensionHostData.userHome, + webviewResourceRoot: this._environmentService.webviewResourceRoot, }, workspace: this._contextService.getWorkbenchState() === WorkbenchState.EMPTY ? null : { configuration: workspace.configuration, diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts index 0a153bff244..efe66b8579c 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts @@ -394,7 +394,8 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter { extensionDevelopmentLocationURI: this._environmentService.extensionDevelopmentLocationURI, extensionTestsLocationURI: this._environmentService.extensionTestsLocationURI, globalStorageHome: URI.file(this._environmentService.globalStorageHome), - userHome: URI.file(this._environmentService.userHome) + userHome: URI.file(this._environmentService.userHome), + webviewResourceRoot: this._environmentService.webviewResourceRoot, }, workspace: this._contextService.getWorkbenchState() === WorkbenchState.EMPTY ? undefined : { configuration: withNullAsUndefined(workspace.configuration), From 50bbabba55397c73ffd344846f5b598b0caa4287 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 19 Jun 2019 07:45:22 +0200 Subject: [PATCH 0339/1449] web - configure menu settings --- src/vs/workbench/browser/main.contribution.ts | 53 ------------------- .../browser/workbench.contribution.ts | 30 ++++++++++- .../electron-browser/main.contribution.ts | 28 ---------- src/vs/workbench/workbench.web.main.ts | 1 - 4 files changed, 29 insertions(+), 83 deletions(-) delete mode 100644 src/vs/workbench/browser/main.contribution.ts diff --git a/src/vs/workbench/browser/main.contribution.ts b/src/vs/workbench/browser/main.contribution.ts deleted file mode 100644 index 9b19dedcf17..00000000000 --- a/src/vs/workbench/browser/main.contribution.ts +++ /dev/null @@ -1,53 +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 nls from 'vs/nls'; -import { Registry } from 'vs/platform/registry/common/platform'; -import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; -import { isWindows, isLinux } from 'vs/base/common/platform'; - - -// Configuration -(function registerConfiguration(): void { - const registry = Registry.as(ConfigurationExtensions.Configuration); - - // Window - registry.registerConfiguration({ - 'id': 'window', - 'order': 8, - 'title': nls.localize('windowConfigurationTitle', "Window"), - 'type': 'object', - 'properties': { - 'window.menuBarVisibility': { - 'type': 'string', - 'enum': ['default', 'visible', 'toggle', 'hidden'], - 'enumDescriptions': [ - nls.localize('window.menuBarVisibility.default', "Menu is only hidden in full screen mode."), - nls.localize('window.menuBarVisibility.visible', "Menu is always visible even in full screen mode."), - nls.localize('window.menuBarVisibility.toggle', "Menu is hidden but can be displayed via Alt key."), - nls.localize('window.menuBarVisibility.hidden', "Menu is always hidden.") - ], - 'default': 'default', - 'scope': ConfigurationScope.APPLICATION, - 'description': nls.localize('menuBarVisibility', "Control the visibility of the menu bar. A setting of 'toggle' means that the menu bar is hidden and a single press of the Alt key will show it. By default, the menu bar will be visible, unless the window is full screen."), - 'included': isWindows || isLinux - }, - 'window.enableMenuBarMnemonics': { - 'type': 'boolean', - 'default': true, - 'scope': ConfigurationScope.APPLICATION, - 'description': nls.localize('enableMenuBarMnemonics', "If enabled, the main menus can be opened via Alt-key shortcuts. Disabling mnemonics allows to bind these Alt-key shortcuts to editor commands instead."), - 'included': isWindows || isLinux - }, - 'window.disableCustomMenuBarAltFocus': { - 'type': 'boolean', - 'default': false, - 'scope': ConfigurationScope.APPLICATION, - 'markdownDescription': nls.localize('disableCustomMenuBarAltFocus', "If enabled, disables the ability to focus the menu bar with the Alt-key when not set to toggle."), - 'included': isWindows || isLinux - } - } - }); -})(); \ No newline at end of file diff --git a/src/vs/workbench/browser/workbench.contribution.ts b/src/vs/workbench/browser/workbench.contribution.ts index 07fe800bd64..5b46af70bad 100644 --- a/src/vs/workbench/browser/workbench.contribution.ts +++ b/src/vs/workbench/browser/workbench.contribution.ts @@ -6,7 +6,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import * as nls from 'vs/nls'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; -import { isMacintosh } from 'vs/base/common/platform'; +import { isMacintosh, isWindows, isLinux, isWeb } from 'vs/base/common/platform'; // Configuration (function registerConfiguration(): void { @@ -278,6 +278,34 @@ import { isMacintosh } from 'vs/base/common/platform'; 'type': 'string', 'default': isMacintosh ? '${activeEditorShort}${separator}${rootName}' : '${dirty}${activeEditorShort}${separator}${rootName}${separator}${appName}', 'markdownDescription': windowTitleDescription + }, + 'window.menuBarVisibility': { + 'type': 'string', + 'enum': ['default', 'visible', 'toggle', 'hidden'], + 'enumDescriptions': [ + nls.localize('window.menuBarVisibility.default', "Menu is only hidden in full screen mode."), + nls.localize('window.menuBarVisibility.visible', "Menu is always visible even in full screen mode."), + nls.localize('window.menuBarVisibility.toggle', "Menu is hidden but can be displayed via Alt key."), + nls.localize('window.menuBarVisibility.hidden', "Menu is always hidden.") + ], + 'default': 'default', + 'scope': ConfigurationScope.APPLICATION, + 'description': nls.localize('menuBarVisibility', "Control the visibility of the menu bar. A setting of 'toggle' means that the menu bar is hidden and a single press of the Alt key will show it. By default, the menu bar will be visible, unless the window is full screen."), + 'included': isWindows || isLinux || isWeb + }, + 'window.enableMenuBarMnemonics': { + 'type': 'boolean', + 'default': true, + 'scope': ConfigurationScope.APPLICATION, + 'description': nls.localize('enableMenuBarMnemonics', "If enabled, the main menus can be opened via Alt-key shortcuts. Disabling mnemonics allows to bind these Alt-key shortcuts to editor commands instead."), + 'included': isWindows || isLinux || isWeb + }, + 'window.disableCustomMenuBarAltFocus': { + 'type': 'boolean', + 'default': false, + 'scope': ConfigurationScope.APPLICATION, + 'markdownDescription': nls.localize('disableCustomMenuBarAltFocus', "If enabled, disables the ability to focus the menu bar with the Alt-key when not set to toggle."), + 'included': isWindows || isLinux || isWeb } } }); diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index 52d70f2049b..a38fbde646d 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -591,34 +591,6 @@ import product from 'vs/platform/product/node/product'; 'default': false, 'description': nls.localize('closeWhenEmpty', "Controls whether closing the last editor should also close the window. This setting only applies for windows that do not show folders.") }, - 'window.menuBarVisibility': { - 'type': 'string', - 'enum': ['default', 'visible', 'toggle', 'hidden'], - 'enumDescriptions': [ - nls.localize('window.menuBarVisibility.default', "Menu is only hidden in full screen mode."), - nls.localize('window.menuBarVisibility.visible', "Menu is always visible even in full screen mode."), - nls.localize('window.menuBarVisibility.toggle', "Menu is hidden but can be displayed via Alt key."), - nls.localize('window.menuBarVisibility.hidden', "Menu is always hidden.") - ], - 'default': 'default', - 'scope': ConfigurationScope.APPLICATION, - 'description': nls.localize('menuBarVisibility', "Control the visibility of the menu bar. A setting of 'toggle' means that the menu bar is hidden and a single press of the Alt key will show it. By default, the menu bar will be visible, unless the window is full screen."), - 'included': isWindows || isLinux - }, - 'window.enableMenuBarMnemonics': { - 'type': 'boolean', - 'default': true, - 'scope': ConfigurationScope.APPLICATION, - 'description': nls.localize('enableMenuBarMnemonics', "If enabled, the main menus can be opened via Alt-key shortcuts. Disabling mnemonics allows to bind these Alt-key shortcuts to editor commands instead."), - 'included': isWindows || isLinux - }, - 'window.disableCustomMenuBarAltFocus': { - 'type': 'boolean', - 'default': false, - 'scope': ConfigurationScope.APPLICATION, - 'markdownDescription': nls.localize('disableCustomMenuBarAltFocus', "If enabled, disables the ability to focus the menu bar with the Alt-key when not set to toggle."), - 'included': isWindows || isLinux - }, 'window.autoDetectHighContrast': { 'type': 'boolean', 'default': true, diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index 562cc9ae8d2..b7c880a0105 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -9,7 +9,6 @@ import 'vs/editor/editor.all'; import 'vs/workbench/api/browser/extensionHost.contribution'; -import 'vs/workbench/browser/main.contribution'; import 'vs/workbench/browser/workbench.contribution'; import 'vs/workbench/browser/web.main'; From a9b3a096f0c91283f85c103f8a0aedf53d64b2ee Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Wed, 19 Jun 2019 07:57:08 +0200 Subject: [PATCH 0340/1449] Adding a11y team --- .github/commands.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/commands.yml b/.github/commands.yml index f20079caab8..c9279232529 100644 --- a/.github/commands.yml +++ b/.github/commands.yml @@ -105,7 +105,7 @@ { type: 'comment', name: 'a11ymas', - allowUsers: ['AccessibilityTestingTeam-TCS'], + allowUsers: ['AccessibilityTestingTeam-TCS', 'dixitsonali95', 'Mohini78', 'ChitrarupaSharma', 'mspatil110', 'umasarath52', 'v-umnaik'], action: 'updateLabels', addLabel: 'a11ymas' }, From 0a9ba2cadd47a37c57a3efb2c22c076284342dad Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 18 Jun 2019 23:38:44 -0700 Subject: [PATCH 0341/1449] Extract port mapping to class so it can be reused Also removes telemetry on which extensions were using localhost resources as it is no longer required --- .../contrib/webview/common/portMapping.ts | 78 ++++++++++++++++ .../electron-browser/webviewElement.ts | 90 ++----------------- 2 files changed, 87 insertions(+), 81 deletions(-) create mode 100644 src/vs/workbench/contrib/webview/common/portMapping.ts diff --git a/src/vs/workbench/contrib/webview/common/portMapping.ts b/src/vs/workbench/contrib/webview/common/portMapping.ts new file mode 100644 index 00000000000..877cfaed13c --- /dev/null +++ b/src/vs/workbench/contrib/webview/common/portMapping.ts @@ -0,0 +1,78 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Disposable } from 'vs/base/common/lifecycle'; +import { URI } from 'vs/base/common/uri'; +import * as modes from 'vs/editor/common/modes'; +import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; +import { ITunnelService, RemoteTunnel } from 'vs/platform/remote/common/tunnel'; + +export class WebviewPortMappingManager extends Disposable { + + private readonly _tunnels = new Map>(); + + constructor( + private readonly extensionLocation: URI | undefined, + private readonly mappings: () => ReadonlyArray, + private readonly tunnelService: ITunnelService + ) { + super(); + } + + public async getRedirect(url: string): Promise { + const uri = URI.parse(url); + if (uri.scheme !== 'http' && uri.scheme !== 'https') { + return undefined; + } + + const localhostMatch = /^localhost:(\d+)$/.exec(uri.authority); + if (!localhostMatch) { + return undefined; + } + + const port = +localhostMatch[1]; + for (const mapping of this.mappings()) { + if (mapping.webviewPort === port) { + if (this.extensionLocation && this.extensionLocation.scheme === REMOTE_HOST_SCHEME) { + const tunnel = await this.getOrCreateTunnel(mapping.extensionHostPort); + if (tunnel) { + return url.replace( + new RegExp(`^${uri.scheme}://localhost:${mapping.webviewPort}/`), + `${uri.scheme}://localhost:${tunnel.tunnelLocalPort}/`); + } + } + + if (mapping.webviewPort !== mapping.extensionHostPort) { + return url.replace( + new RegExp(`^${uri.scheme}://localhost:${mapping.webviewPort}/`), + `${uri.scheme}://localhost:${mapping.extensionHostPort}/`); + } + } + } + + return undefined; + } + + dispose() { + super.dispose(); + + for (const tunnel of this._tunnels.values()) { + tunnel.then(tunnel => tunnel.dispose()); + } + this._tunnels.clear(); + } + + private getOrCreateTunnel(remotePort: number): Promise | undefined { + const existing = this._tunnels.get(remotePort); + if (existing) { + return existing; + } + const tunnel = this.tunnelService.openTunnel(remotePort); + if (tunnel) { + this._tunnels.set(remotePort, tunnel); + } + return tunnel; + } +} \ No newline at end of file diff --git a/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts index b86e3120d00..f0f599d1049 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts @@ -13,19 +13,17 @@ import { endsWith } from 'vs/base/common/strings'; import { URI } from 'vs/base/common/uri'; import * as modes from 'vs/editor/common/modes'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { IFileService } from 'vs/platform/files/common/files'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; -import { ITunnelService, RemoteTunnel } from 'vs/platform/remote/common/tunnel'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { ITunnelService } from 'vs/platform/remote/common/tunnel'; import { ITheme, IThemeService } from 'vs/platform/theme/common/themeService'; +import { WebviewPortMappingManager } from 'vs/workbench/contrib/webview/common/portMapping'; +import { getWebviewThemeData } from 'vs/workbench/contrib/webview/common/themeing'; import { Webview, WebviewContentOptions, WebviewOptions, WebviewResourceScheme } from 'vs/workbench/contrib/webview/common/webview'; import { registerFileProtocol } from 'vs/workbench/contrib/webview/electron-browser/webviewProtocols'; import { areWebviewInputOptionsEqual } from '../browser/webviewEditorService'; import { WebviewFindWidget } from '../browser/webviewFindWidget'; -import { getWebviewThemeData } from 'vs/workbench/contrib/webview/common/themeing'; export interface WebviewPortMapping { readonly port: number; @@ -141,88 +139,22 @@ class WebviewProtocolProvider extends Disposable { class WebviewPortMappingProvider extends Disposable { - private readonly _tunnels = new Map>(); + private readonly _manager: WebviewPortMappingManager; constructor( session: WebviewSession, extensionLocation: URI | undefined, mappings: () => ReadonlyArray, - private readonly tunnelService: ITunnelService, - extensionId: ExtensionIdentifier | undefined, - @ITelemetryService telemetryService: ITelemetryService + tunnelService: ITunnelService, ) { super(); + this._manager = this._register(new WebviewPortMappingManager(extensionLocation, mappings, tunnelService)); - let hasLogged = false; - - session.onBeforeRequest(async (details) => { - const uri = URI.parse(details.url); - if (uri.scheme !== 'http' && uri.scheme !== 'https') { - return undefined; - } - - const localhostMatch = /^localhost:(\d+)$/.exec(uri.authority); - if (localhostMatch) { - if (!hasLogged && extensionId) { - hasLogged = true; - - /* __GDPR__ - "webview.accessLocalhost" : { - "extension" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - telemetryService.publicLog('webview.accessLocalhost', { extension: extensionId.value }); - } - - const port = +localhostMatch[1]; - for (const mapping of mappings()) { - if (mapping.webviewPort === port) { - if (extensionLocation && extensionLocation.scheme === REMOTE_HOST_SCHEME) { - const tunnel = await this.getOrCreateTunnel(mapping.extensionHostPort); - if (tunnel) { - return { - redirectURL: details.url.replace( - new RegExp(`^${uri.scheme}://localhost:${mapping.webviewPort}/`), - `${uri.scheme}://localhost:${tunnel.tunnelLocalPort}/`) - }; - } - } - - if (mapping.webviewPort !== mapping.extensionHostPort) { - return { - redirectURL: details.url.replace( - new RegExp(`^${uri.scheme}://localhost:${mapping.webviewPort}/`), - `${uri.scheme}://localhost:${mapping.extensionHostPort}/`) - }; - } - } - } - } - - return undefined; + session.onBeforeRequest(async details => { + const redirect = await this._manager.getRedirect(details.url); + return redirect ? { redirectURL: redirect } : undefined; }); } - - dispose() { - super.dispose(); - - for (const tunnel of this._tunnels.values()) { - tunnel.then(tunnel => tunnel.dispose()); - } - this._tunnels.clear(); - } - - private getOrCreateTunnel(remotePort: number): Promise | undefined { - const existing = this._tunnels.get(remotePort); - if (existing) { - return existing; - } - const tunnel = this.tunnelService.openTunnel(remotePort); - if (tunnel) { - this._tunnels.set(remotePort, tunnel); - } - return tunnel; - } } class SvgBlocker extends Disposable { @@ -370,10 +302,8 @@ export class WebviewElement extends Disposable implements Webview { contentOptions: WebviewContentOptions, @IInstantiationService instantiationService: IInstantiationService, @IThemeService themeService: IThemeService, - @IEnvironmentService environmentService: IEnvironmentService, @IFileService fileService: IFileService, @ITunnelService tunnelService: ITunnelService, - @ITelemetryService telemetryService: ITelemetryService, @IConfigurationService private readonly _configurationService: IConfigurationService, ) { super(); @@ -420,8 +350,6 @@ export class WebviewElement extends Disposable implements Webview { _options.extension ? _options.extension.location : undefined, () => (this.content.options.portMappings || []), tunnelService, - _options.extension ? _options.extension.id : undefined, - telemetryService )); if (!this._options.allowSvgs) { From 29c0595809c3f1a8b1642157f5ca798287cc3fe9 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 19 Jun 2019 00:26:48 -0700 Subject: [PATCH 0342/1449] Add experimental port mapping support inside of iframed based webviews Hooks up a prototype of how we could support some types of port mapping inside of webviews. It uses the same service-worker based approach that we use for loading local resources inside of webviews. This does not work for loading iframes however as iframe `src` requests go to the service worker of the `src` origin (not the service worker of the parent that contains the iframe). Not sure if this can be worked around. Two alternatives if we can't: * Add api for getting the mapped port. * Dynamically rewrite the input html Both are not ideal as they may require eagerly opening tunnels (we open them lazily at the moment) --- .../contrib/webview/browser/pre/main.js | 10 +- .../webview/browser/pre/service-worker.js | 189 +++++++++++++----- .../contrib/webview/browser/webviewElement.ts | 28 ++- .../contrib/webview/common/portMapping.ts | 8 +- 4 files changed, 180 insertions(+), 55 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index d41618e6192..5f4def45064 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -126,12 +126,20 @@ host.onMessage('loaded-resource', event => { registration.active.postMessage({ channel: 'loaded-resource', data: event.data.args }); }); + + host.onMessage('loaded-localhost', event => { + registration.active.postMessage({ channel: 'loaded-localhost', data: event.data.args }); + }); }); navigator.serviceWorker.addEventListener('message', event => { switch (event.data.channel) { case 'load-resource': - host.postMessage('load-resource', { path: event.data.path }); + host.postMessage('load-resource', event.data); + return; + + case 'load-localhost': + host.postMessage('load-localhost', event.data); return; } }); diff --git a/src/vs/workbench/contrib/webview/browser/pre/service-worker.js b/src/vs/workbench/contrib/webview/browser/pre/service-worker.js index 6c28c8ea02f..ba8072a784d 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/service-worker.js +++ b/src/vs/workbench/contrib/webview/browser/pre/service-worker.js @@ -8,25 +8,26 @@ const resourceRoot = '/vscode-resource'; /** + * @template T * @typedef {{ * resolve: () => void, - * promise: Promise - * }} ResourcePathEntry + * promise: Promise + * }} RequestStoreEntry */ /** - * Map of requested paths to responses. + * @template T */ -const resourceRequestManager = new class ResourceRequestManager { +class RequestStore { constructor() { - /** @type {Map} */ + /** @type {Map>} */ this.map = new Map(); } /** * @param {string} webviewId * @param {string} path - * @return {ResourcePathEntry | undefined} + * @return {RequestStoreEntry | undefined} */ get(webviewId, path) { return this.map.get(this._key(webviewId, path)); @@ -44,7 +45,7 @@ const resourceRequestManager = new class ResourceRequestManager { /** * @param {string} webviewId * @param {string} path - * @param {ResourcePathEntry} entry + * @param {RequestStoreEntry} entry */ set(webviewId, path, entry) { this.map.set(this._key(webviewId, path), entry); @@ -58,19 +59,34 @@ const resourceRequestManager = new class ResourceRequestManager { _key(webviewId, path) { return `${webviewId}@@@${path}`; } -}(); +} + +/** + * Map of requested paths to responses. + * + * @type {RequestStore} + */ +const resourceRequestStore = new RequestStore(); + +/** + * Map of requested paths to responses. + * + * @type {RequestStore} + */ +const localhostRequestStore = new RequestStore(); const notFoundResponse = new Response('Not Found', { status: 404, }); + self.addEventListener('message', (event) => { switch (event.data.channel) { case 'loaded-resource': { const webviewId = getWebviewIdForClient(event.source); const data = event.data.data; - const target = resourceRequestManager.get(webviewId, data.path); + const target = resourceRequestStore.get(webviewId, data.path); if (!target) { console.log('Loaded unknown resource', data.path); return; @@ -86,6 +102,20 @@ self.addEventListener('message', (event) => { } return; } + + case 'loaded-localhost': + { + const webviewId = getWebviewIdForClient(event.source); + const data = event.data.data; + const target = localhostRequestStore.get(webviewId, data.origin); + if (!target) { + console.log('Loaded unknown localhost', data.origin); + return; + } + + target.resolve(data.location); + return; + } } console.log('Unknown message'); @@ -93,48 +123,17 @@ self.addEventListener('message', (event) => { self.addEventListener('fetch', (event) => { const requestUrl = new URL(event.request.url); + console.log(requestUrl.host); - if (!requestUrl.pathname.startsWith(resourceRoot + '/')) { - return event.respondWith(fetch(event.request)); + // See if it's a resource request + if (requestUrl.origin === self.origin && requestUrl.pathname.startsWith(resourceRoot + '/')) { + return event.respondWith(processResourceRequest(event, requestUrl)); } - event.respondWith((async () => { - const client = await self.clients.get(event.clientId); - if (!client) { - console.log('Could not find inner client for request'); - return notFoundResponse.clone(); - } - - const webviewId = getWebviewIdForClient(client); - const resourcePath = requestUrl.pathname.replace(resourceRoot, ''); - - const allClients = await self.clients.matchAll({ includeUncontrolled: true }); - - // Check if we've already resolved this request - const existing = resourceRequestManager.get(webviewId, resourcePath); - if (existing) { - return existing.promise.then(r => r.clone()); - } - - // Find parent iframe - for (const client of allClients) { - const clientUrl = new URL(client.url); - if (clientUrl.pathname === '/' && clientUrl.search.match(new RegExp('\\bid=' + webviewId))) { - client.postMessage({ - channel: 'load-resource', - path: resourcePath - }); - - let resolve; - const promise = new Promise(r => resolve = r); - resourceRequestManager.set(webviewId, resourcePath, { resolve, promise }); - return promise.then(r => r.clone()); - } - } - - console.log('Could not find parent client for request'); - return notFoundResponse.clone(); - })()); + // See if it's a localhost request + if (requestUrl.origin !== self.origin && requestUrl.host.match(/^localhost:(\d+)$/)) { + return event.respondWith(processLocalhostRequest(event, requestUrl)); + } }); self.addEventListener('install', (event) => { @@ -145,6 +144,100 @@ self.addEventListener('activate', (event) => { event.waitUntil(self.clients.claim()); // Become available to all pages }); +async function processResourceRequest(event, requestUrl) { + const client = await self.clients.get(event.clientId); + if (!client) { + // This is expected when requesting resources on other localhost ports + // that are not spawned by vs code + console.log('Could not find inner client for request'); + return notFoundResponse.clone(); + } + + const webviewId = getWebviewIdForClient(client); + const resourcePath = requestUrl.pathname.replace(resourceRoot, ''); + + const allClients = await self.clients.matchAll({ includeUncontrolled: true }); + + // Check if we've already resolved this request + const existing = resourceRequestStore.get(webviewId, resourcePath); + if (existing) { + return existing.promise.then(r => r.clone()); + } + + // Find parent iframe + for (const client of allClients) { + const clientUrl = new URL(client.url); + if (clientUrl.pathname === '/' && clientUrl.search.match(new RegExp('\\bid=' + webviewId))) { + client.postMessage({ + channel: 'load-resource', + path: resourcePath + }); + + let resolve; + const promise = new Promise(r => resolve = r); + resourceRequestStore.set(webviewId, resourcePath, { resolve, promise, resolved: false }); + return promise.then(r => r.clone()); + } + } + + console.log('Could not find parent client for request'); + return notFoundResponse.clone(); +} + +/** + * @param {*} event + * @param {URL} requestUrl + */ +async function processLocalhostRequest(event, requestUrl) { + const client = await self.clients.get(event.clientId); + if (!client) { + // This is expected when requesting resources on other localhost ports + // that are not spawned by vs code + return undefined; + } + const webviewId = getWebviewIdForClient(client); + const origin = requestUrl.origin; + + const resolveRedirect = redirectOrigin => { + if (!redirectOrigin) { + return fetch(event.request); + } + const location = event.request.url.replace(new RegExp(`^${requestUrl.origin}(/|$)`), `${redirectOrigin}$1`); + return new Response(null, { + status: 302, + headers: { + Location: location + } + }); + }; + + const allClients = await self.clients.matchAll({ includeUncontrolled: true }); + + // Check if we've already resolved this request + const existing = localhostRequestStore.get(webviewId, origin); + if (existing) { + return existing.promise.then(resolveRedirect); + } + + // Find parent iframe + for (const client of allClients) { + const clientUrl = new URL(client.url); + if (clientUrl.pathname === '/' && clientUrl.search.match(new RegExp('\\bid=' + webviewId))) { + client.postMessage({ + channel: 'load-localhost', + origin: origin + }); + + let resolve; + const promise = new Promise(r => resolve = r); + localhostRequestStore.set(webviewId, origin, { resolve, promise }); + return promise.then(resolveRedirect); + } + } + + console.log('Could not find parent client for request'); + return notFoundResponse.clone(); +} function getWebviewIdForClient(client) { const requesterClientUrl = new URL(client.url); diff --git a/src/vs/workbench/contrib/webview/browser/webviewElement.ts b/src/vs/workbench/contrib/webview/browser/webviewElement.ts index 4e2f29a1997..43bbf29ffc7 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewElement.ts @@ -15,6 +15,8 @@ import { addDisposableListener, addClass } from 'vs/base/browser/dom'; import { getWebviewThemeData } from 'vs/workbench/contrib/webview/common/themeing'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { loadLocalResource } from 'vs/workbench/contrib/webview/common/resourceLoader'; +import { WebviewPortMappingManager } from 'vs/workbench/contrib/webview/common/portMapping'; +import { ITunnelService } from 'vs/platform/remote/common/tunnel'; interface WebviewContent { readonly html: string; @@ -32,11 +34,14 @@ export class IFrameWebview extends Disposable implements Webview { private readonly id: string; + private readonly _portMappingManager: WebviewPortMappingManager; + constructor( private _options: WebviewOptions, contentOptions: WebviewContentOptions, @IThemeService themeService: IThemeService, @IEnvironmentService environmentService: IEnvironmentService, + @ITunnelService tunnelService: ITunnelService, @IFileService private readonly fileService: IFileService, @IConfigurationService private readonly _configurationService: IConfigurationService, ) { @@ -45,6 +50,12 @@ export class IFrameWebview extends Disposable implements Webview { throw new Error('To use iframe based webviews, you must configure `environmentService.webviewEndpoint`'); } + this._portMappingManager = this._register(new WebviewPortMappingManager( + this._options.extension ? this._options.extension.location : undefined, + () => this.content.options.portMappings || [], + tunnelService + )); + this.content = { html: '', options: contentOptions, @@ -103,11 +114,16 @@ export class IFrameWebview extends Disposable implements Webview { case 'load-resource': { - const path = e.data.data.path; - const uri = URI.file(path); + const uri = URI.file(e.data.data.path); this.loadResource(uri); return; } + + case 'load-localhost': + { + this.localLocalhost(e.data.data.origin); + return; + } } })); @@ -305,5 +321,13 @@ export class IFrameWebview extends Disposable implements Webview { path: uri.path }); } + + private async localLocalhost(origin: string) { + const redirect = await this._portMappingManager.getRedirect(origin); + return this._send('loaded-localhost', { + origin, + location: redirect + }); + } } diff --git a/src/vs/workbench/contrib/webview/common/portMapping.ts b/src/vs/workbench/contrib/webview/common/portMapping.ts index 877cfaed13c..3a9b8ee056a 100644 --- a/src/vs/workbench/contrib/webview/common/portMapping.ts +++ b/src/vs/workbench/contrib/webview/common/portMapping.ts @@ -39,15 +39,15 @@ export class WebviewPortMappingManager extends Disposable { const tunnel = await this.getOrCreateTunnel(mapping.extensionHostPort); if (tunnel) { return url.replace( - new RegExp(`^${uri.scheme}://localhost:${mapping.webviewPort}/`), - `${uri.scheme}://localhost:${tunnel.tunnelLocalPort}/`); + new RegExp(`^${uri.scheme}://localhost:${mapping.webviewPort}(/|$)`), + `${uri.scheme}://localhost:${tunnel.tunnelLocalPort}$1`); } } if (mapping.webviewPort !== mapping.extensionHostPort) { return url.replace( - new RegExp(`^${uri.scheme}://localhost:${mapping.webviewPort}/`), - `${uri.scheme}://localhost:${mapping.extensionHostPort}/`); + new RegExp(`^${uri.scheme}://localhost:${mapping.webviewPort}(/|$)`), + `${uri.scheme}://localhost:${mapping.extensionHostPort}$1`); } } } From 01fe3fe6c1ff682e338d9abb6cc46e535e256ed3 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 19 Jun 2019 01:09:44 -0700 Subject: [PATCH 0343/1449] Cleaning up service-worker impl - Reducing duplicated code - Clearer event names - Extract methods - Store data instead of requests --- .../contrib/webview/browser/pre/main.js | 24 ++- .../webview/browser/pre/service-worker.js | 140 +++++++++--------- .../contrib/webview/browser/webviewElement.ts | 6 +- 3 files changed, 83 insertions(+), 87 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index 5f4def45064..971cbc0de23 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -123,24 +123,18 @@ navigator.serviceWorker.register('service-worker.js'); navigator.serviceWorker.ready.then(registration => { - host.onMessage('loaded-resource', event => { - registration.active.postMessage({ channel: 'loaded-resource', data: event.data.args }); - }); - - host.onMessage('loaded-localhost', event => { - registration.active.postMessage({ channel: 'loaded-localhost', data: event.data.args }); - }); + function forwardFromHostToWorker(channel) { + host.onMessage(channel, event => { + registration.active.postMessage({ channel: channel, data: event.data.args }); + }); + } + forwardFromHostToWorker('did-load-resource'); + forwardFromHostToWorker('did-load-localhost'); }); navigator.serviceWorker.addEventListener('message', event => { - switch (event.data.channel) { - case 'load-resource': - host.postMessage('load-resource', event.data); - return; - - case 'load-localhost': - host.postMessage('load-localhost', event.data); - return; + if (['load-resource', 'load-localhost'].includes(event.data.channel)) { + host.postMessage(event.data.channel, event.data); } }); } diff --git a/src/vs/workbench/contrib/webview/browser/pre/service-worker.js b/src/vs/workbench/contrib/webview/browser/pre/service-worker.js index ba8072a784d..d6154ba645d 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/service-worker.js +++ b/src/vs/workbench/contrib/webview/browser/pre/service-worker.js @@ -10,7 +10,7 @@ const resourceRoot = '/vscode-resource'; /** * @template T * @typedef {{ - * resolve: () => void, + * resolve: (x: T) => void, * promise: Promise * }} RequestStoreEntry */ @@ -36,19 +36,31 @@ class RequestStore { /** * @param {string} webviewId * @param {string} path - * @return {boolean} */ - has(webviewId, path) { - return this.map.has(this._key(webviewId, path)); + create(webviewId, path) { + const existing = this.get(webviewId, path); + if (existing) { + return existing.promise; + } + let resolve; + const promise = new Promise(r => resolve = r); + this.map.set(this._key(webviewId, path), { resolve, promise }); + return promise; } /** * @param {string} webviewId * @param {string} path - * @param {RequestStoreEntry} entry + * @param {T} result + * @return {boolean} */ - set(webviewId, path, entry) { - this.map.set(this._key(webviewId, path), entry); + resolve(webviewId, path, result) { + const entry = this.get(webviewId, path); + if (!entry) { + return false; + } + entry.resolve(result); + return true; } /** @@ -64,12 +76,12 @@ class RequestStore { /** * Map of requested paths to responses. * - * @type {RequestStore} + * @type {RequestStore<{ body: any, mime: string } | undefined>} */ const resourceRequestStore = new RequestStore(); /** - * Map of requested paths to responses. + * Map of requested localhost origins to optional redirects. * * @type {RequestStore} */ @@ -82,38 +94,27 @@ const notFoundResponse = new Response('Not Found', { self.addEventListener('message', (event) => { switch (event.data.channel) { - case 'loaded-resource': + case 'did-load-resource': { const webviewId = getWebviewIdForClient(event.source); const data = event.data.data; - const target = resourceRequestStore.get(webviewId, data.path); - if (!target) { - console.log('Loaded unknown resource', data.path); - return; - } + const response = data.status === 200 + ? { body: data.data, mime: data.mime } + : undefined; - if (data.status === 200) { - target.resolve(new Response(data.data, { - status: 200, - headers: { 'Content-Type': data.mime }, - })); - } else { - target.resolve(notFoundResponse.clone()); + if (!resourceRequestStore.resolve(webviewId, data.path, response)) { + console.log('Could not resolve unknown resource', data.path); } return; } - case 'loaded-localhost': + case 'did-load-localhost': { const webviewId = getWebviewIdForClient(event.source); const data = event.data.data; - const target = localhostRequestStore.get(webviewId, data.origin); - if (!target) { - console.log('Loaded unknown localhost', data.origin); - return; + if (!localhostRequestStore.resolve(webviewId, data.origin, data.location)) { + console.log('Could not resolve unknown localhost', data.origin); } - - target.resolve(data.location); return; } } @@ -123,7 +124,6 @@ self.addEventListener('message', (event) => { self.addEventListener('fetch', (event) => { const requestUrl = new URL(event.request.url); - console.log(requestUrl.host); // See if it's a resource request if (requestUrl.origin === self.origin && requestUrl.pathname.startsWith(resourceRoot + '/')) { @@ -147,8 +147,6 @@ self.addEventListener('activate', (event) => { async function processResourceRequest(event, requestUrl) { const client = await self.clients.get(event.clientId); if (!client) { - // This is expected when requesting resources on other localhost ports - // that are not spawned by vs code console.log('Could not find inner client for request'); return notFoundResponse.clone(); } @@ -156,32 +154,35 @@ async function processResourceRequest(event, requestUrl) { const webviewId = getWebviewIdForClient(client); const resourcePath = requestUrl.pathname.replace(resourceRoot, ''); - const allClients = await self.clients.matchAll({ includeUncontrolled: true }); + function resolveResourceEntry(entry) { + if (!entry) { + return notFoundResponse.clone(); + } + return new Response(entry.body, { + status: 200, + headers: { 'Content-Type': entry.mime } + }); + } + + const parentClient = await getOuterIframeClient(webviewId); + if (!parentClient) { + console.log('Could not find parent client for request'); + return notFoundResponse.clone(); + } // Check if we've already resolved this request const existing = resourceRequestStore.get(webviewId, resourcePath); if (existing) { - return existing.promise.then(r => r.clone()); + return existing.promise.then(resolveResourceEntry); } - // Find parent iframe - for (const client of allClients) { - const clientUrl = new URL(client.url); - if (clientUrl.pathname === '/' && clientUrl.search.match(new RegExp('\\bid=' + webviewId))) { - client.postMessage({ - channel: 'load-resource', - path: resourcePath - }); + parentClient.postMessage({ + channel: 'load-resource', + path: resourcePath + }); - let resolve; - const promise = new Promise(r => resolve = r); - resourceRequestStore.set(webviewId, resourcePath, { resolve, promise, resolved: false }); - return promise.then(r => r.clone()); - } - } - - console.log('Could not find parent client for request'); - return notFoundResponse.clone(); + return resourceRequestStore.create(webviewId, resourcePath) + .then(resolveResourceEntry); } /** @@ -211,7 +212,11 @@ async function processLocalhostRequest(event, requestUrl) { }); }; - const allClients = await self.clients.matchAll({ includeUncontrolled: true }); + const parentClient = await getOuterIframeClient(webviewId); + if (!parentClient) { + console.log('Could not find parent client for request'); + return notFoundResponse.clone(); + } // Check if we've already resolved this request const existing = localhostRequestStore.get(webviewId, origin); @@ -219,27 +224,24 @@ async function processLocalhostRequest(event, requestUrl) { return existing.promise.then(resolveRedirect); } - // Find parent iframe - for (const client of allClients) { - const clientUrl = new URL(client.url); - if (clientUrl.pathname === '/' && clientUrl.search.match(new RegExp('\\bid=' + webviewId))) { - client.postMessage({ - channel: 'load-localhost', - origin: origin - }); + parentClient.postMessage({ + channel: 'load-localhost', + origin: origin + }); - let resolve; - const promise = new Promise(r => resolve = r); - localhostRequestStore.set(webviewId, origin, { resolve, promise }); - return promise.then(resolveRedirect); - } - } - - console.log('Could not find parent client for request'); - return notFoundResponse.clone(); + return localhostRequestStore.create(webviewId, origin) + .then(resolveRedirect); } function getWebviewIdForClient(client) { const requesterClientUrl = new URL(client.url); return requesterClientUrl.search.match(/\bid=([a-z0-9-]+)/i)[1]; } + +async function getOuterIframeClient(webviewId) { + const allClients = await self.clients.matchAll({ includeUncontrolled: true }); + return allClients.find(client => { + const clientUrl = new URL(client.url); + return clientUrl.pathname === '/' && clientUrl.search.match(new RegExp('\\bid=' + webviewId)); + }); +} \ No newline at end of file diff --git a/src/vs/workbench/contrib/webview/browser/webviewElement.ts b/src/vs/workbench/contrib/webview/browser/webviewElement.ts index 43bbf29ffc7..98cfb4c0891 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewElement.ts @@ -305,7 +305,7 @@ export class IFrameWebview extends Disposable implements Webview { () => (this.content.options.localResourceRoots || [])); if (result.type === 'success') { - return this._send('loaded-resource', { + return this._send('did-load-resource', { status: 200, path: uri.path, mime: result.mimeType, @@ -316,7 +316,7 @@ export class IFrameWebview extends Disposable implements Webview { // noop } - return this._send('loaded-resource', { + return this._send('did-load-resource', { status: 404, path: uri.path }); @@ -324,7 +324,7 @@ export class IFrameWebview extends Disposable implements Webview { private async localLocalhost(origin: string) { const redirect = await this._portMappingManager.getRedirect(origin); - return this._send('loaded-localhost', { + return this._send('did-load-localhost', { origin, location: redirect }); From a409cd27a50d73e21b2828eb96f0a750934a24bb Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 19 Jun 2019 10:55:57 +0200 Subject: [PATCH 0344/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 88789b3c9e3..5abd54506f5 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "c1ec2234fb5dc62f2bf9689f41dc1cd0a507a581", + "distro": "49dcd26b8ebc282667351ed832ed309ace05c8ce", "author": { "name": "Microsoft Corporation" }, From c8843e3b0d84995a7d8493f9c932500476975c98 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 19 Jun 2019 10:58:12 +0200 Subject: [PATCH 0345/1449] final touch at heap service removal, #74846 --- .../workbench/api/common/extHostCommands.ts | 36 +------------------ .../workbench/api/common/extHostComments.ts | 14 ++++---- .../api/common/extHostLanguageFeatures.ts | 10 +++--- src/vs/workbench/api/common/extHostSCM.ts | 4 +-- .../workbench/api/common/extHostTreeViews.ts | 2 +- 5 files changed, 16 insertions(+), 50 deletions(-) diff --git a/src/vs/workbench/api/common/extHostCommands.ts b/src/vs/workbench/api/common/extHostCommands.ts index 5173ebb176c..3d0840068b0 100644 --- a/src/vs/workbench/api/common/extHostCommands.ts +++ b/src/vs/workbench/api/common/extHostCommands.ts @@ -210,7 +210,7 @@ export class CommandsConverter { this._commands.registerCommand(true, this._delegatingCommandId, this._executeConvertedCommand, this); } - toInternal2(command: vscode.Command | undefined, disposables: DisposableStore): CommandDto | undefined { + toInternal(command: vscode.Command | undefined, disposables: DisposableStore): CommandDto | undefined { if (!command) { return undefined; @@ -240,40 +240,6 @@ export class CommandsConverter { return result; } - toInternal(command: vscode.Command): CommandDto; - toInternal(command: undefined): undefined; - toInternal(command: vscode.Command | undefined): CommandDto | undefined; - toInternal(command: vscode.Command | undefined): CommandDto | undefined { - - if (!command) { - return undefined; - } - - const result: CommandDto = { - $ident: undefined, - id: command.command, - title: command.title, - }; - - if (command.command && isNonEmptyArray(command.arguments)) { - // we have a contributed command with arguments. that - // means we don't want to send the arguments around - - const id = ++this._cachIdPool; - this._cache.set(id, command); - result.$ident = id; - - result.id = this._delegatingCommandId; - result.arguments = [id]; - } - - if (command.tooltip) { - result.tooltip = command.tooltip; - } - - return result; - } - fromInternal(command: modes.Command): vscode.Command | undefined { const id = ObjectIdentifier.of(command); diff --git a/src/vs/workbench/api/common/extHostComments.ts b/src/vs/workbench/api/common/extHostComments.ts index 4b76a7bece0..93b58afbd08 100644 --- a/src/vs/workbench/api/common/extHostComments.ts +++ b/src/vs/workbench/api/common/extHostComments.ts @@ -650,9 +650,9 @@ export class ExtHostCommentThread implements vscode.CommentThread { const label = this.label; const contextValue = this.contextValue; const comments = this._comments.map(cmt => { return convertToModeComment2(this, this._commentController, cmt, this._commandsConverter, this._commentsMap, this._acceptInputDisposables.value!); }); - const acceptInputCommand = this._acceptInputCommand ? this._commandsConverter.toInternal2(this._acceptInputCommand, this._acceptInputDisposables.value) : undefined; - const additionalCommands = (this._additionalCommands ? this._additionalCommands.map(x => this._commandsConverter.toInternal2(x, this._acceptInputDisposables.value!)) : []) as CommandDto[]; - const deleteCommand = this._deleteCommand ? this._commandsConverter.toInternal2(this._deleteCommand, this._acceptInputDisposables.value) : undefined; + const acceptInputCommand = this._acceptInputCommand ? this._commandsConverter.toInternal(this._acceptInputCommand, this._acceptInputDisposables.value) : undefined; + const additionalCommands = (this._additionalCommands ? this._additionalCommands.map(x => this._commandsConverter.toInternal(x, this._acceptInputDisposables.value!)) : []) as CommandDto[]; + const deleteCommand = this._deleteCommand ? this._commandsConverter.toInternal(this._deleteCommand, this._acceptInputDisposables.value) : undefined; const collapsibleState = convertToCollapsibleState(this._collapseState); this._proxy.$updateCommentThread( @@ -951,9 +951,9 @@ function convertToModeComment2(thread: ExtHostCommentThread, commentController: userName: vscodeComment.author ? vscodeComment.author.name : vscodeComment.userName, userIconPath: iconPath, isDraft: vscodeComment.isDraft, - selectCommand: vscodeComment.selectCommand ? commandsConverter.toInternal2(vscodeComment.selectCommand, disposables) : undefined, - editCommand: vscodeComment.editCommand ? commandsConverter.toInternal2(vscodeComment.editCommand, disposables) : undefined, - deleteCommand: vscodeComment.deleteCommand ? commandsConverter.toInternal2(vscodeComment.deleteCommand, disposables) : undefined, + selectCommand: vscodeComment.selectCommand ? commandsConverter.toInternal(vscodeComment.selectCommand, disposables) : undefined, + editCommand: vscodeComment.editCommand ? commandsConverter.toInternal(vscodeComment.editCommand, disposables) : undefined, + deleteCommand: vscodeComment.deleteCommand ? commandsConverter.toInternal(vscodeComment.deleteCommand, disposables) : undefined, label: vscodeComment.label, commentReactions: reactions ? reactions.map(reaction => convertToReaction2(commentController.reactionProvider, reaction)) : undefined }; @@ -971,7 +971,7 @@ function convertToComment(provider: vscode.DocumentCommentProvider | vscode.Work userIconPath: iconPath, canEdit: canEdit, canDelete: canDelete, - selectCommand: vscodeComment.command ? commandsConverter.toInternal2(vscodeComment.command, disposables) : undefined, + selectCommand: vscodeComment.command ? commandsConverter.toInternal(vscodeComment.command, disposables) : undefined, isDraft: vscodeComment.isDraft, commentReactions: vscodeComment.commentReactions ? vscodeComment.commentReactions.map(reaction => convertToReaction(provider, reaction)) : undefined }; diff --git a/src/vs/workbench/api/common/extHostLanguageFeatures.ts b/src/vs/workbench/api/common/extHostLanguageFeatures.ts index 661e98948c9..4aefb1cc5d6 100644 --- a/src/vs/workbench/api/common/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/common/extHostLanguageFeatures.ts @@ -133,7 +133,7 @@ class CodeLensAdapter { result.lenses.push({ cacheId: [cacheId, i], range: typeConvert.Range.from(lenses[i].range), - command: this._commands.toInternal2(lenses[i].command, disposables) + command: this._commands.toInternal(lenses[i].command, disposables) }); } @@ -167,7 +167,7 @@ class CodeLensAdapter { } newLens = newLens || lens; - symbol.command = this._commands.toInternal2(newLens.command || CodeLensAdapter._badCmd, disposables); + symbol.command = this._commands.toInternal(newLens.command || CodeLensAdapter._badCmd, disposables); return symbol; }); } @@ -368,7 +368,7 @@ class CodeActionAdapter { actions.push({ _isSynthetic: true, title: candidate.title, - command: this._commands.toInternal2(candidate, disposables), + command: this._commands.toInternal(candidate, disposables), }); } else { if (codeActionContext.only) { @@ -382,7 +382,7 @@ class CodeActionAdapter { // new school: convert code action actions.push({ title: candidate.title, - command: candidate.command && this._commands.toInternal2(candidate.command, disposables), + command: candidate.command && this._commands.toInternal(candidate.command, disposables), diagnostics: candidate.diagnostics && candidate.diagnostics.map(typeConvert.Diagnostic.from), edit: candidate.edit && typeConvert.WorkspaceEdit.from(candidate.edit), kind: candidate.kind && candidate.kind.value, @@ -735,7 +735,7 @@ class SuggestAdapter { i: item.keepWhitespace ? modes.CompletionItemInsertTextRule.KeepWhitespace : 0, k: item.commitCharacters, l: item.additionalTextEdits && item.additionalTextEdits.map(typeConvert.TextEdit.from), - m: this._commands.toInternal2(item.command, disposables), + m: this._commands.toInternal(item.command, disposables), }; // 'insertText'-logic diff --git a/src/vs/workbench/api/common/extHostSCM.ts b/src/vs/workbench/api/common/extHostSCM.ts index 5ae57de0204..675201e622f 100644 --- a/src/vs/workbench/api/common/extHostSCM.ts +++ b/src/vs/workbench/api/common/extHostSCM.ts @@ -427,7 +427,7 @@ class ExtHostSourceControl implements vscode.SourceControl { this._acceptInputCommand = acceptInputCommand; - const internal = this._commands.converter.toInternal2(acceptInputCommand, this._acceptInputDisposables.value); + const internal = this._commands.converter.toInternal(acceptInputCommand, this._acceptInputDisposables.value); this._proxy.$updateSourceControl(this.handle, { acceptInputCommand: internal }); } @@ -447,7 +447,7 @@ class ExtHostSourceControl implements vscode.SourceControl { this._statusBarCommands = statusBarCommands; - const internal = (statusBarCommands || []).map(c => this._commands.converter.toInternal2(c, this._statusBarDisposables.value!)) as CommandDto[]; + const internal = (statusBarCommands || []).map(c => this._commands.converter.toInternal(c, this._statusBarDisposables.value!)) as CommandDto[]; this._proxy.$updateSourceControl(this.handle, { statusBarCommands: internal }); } diff --git a/src/vs/workbench/api/common/extHostTreeViews.ts b/src/vs/workbench/api/common/extHostTreeViews.ts index ac0c9878b0e..0524871953a 100644 --- a/src/vs/workbench/api/common/extHostTreeViews.ts +++ b/src/vs/workbench/api/common/extHostTreeViews.ts @@ -452,7 +452,7 @@ class ExtHostTreeView extends Disposable { description: extensionTreeItem.description, resourceUri: extensionTreeItem.resourceUri, tooltip: typeof extensionTreeItem.tooltip === 'string' ? extensionTreeItem.tooltip : undefined, - command: extensionTreeItem.command ? this.commands.toInternal2(extensionTreeItem.command, disposable) : undefined, + command: extensionTreeItem.command ? this.commands.toInternal(extensionTreeItem.command, disposable) : undefined, contextValue: extensionTreeItem.contextValue, icon, iconDark: this.getDarkIconPath(extensionTreeItem) || icon, From 300e4bdf2ad42c4b54643dc668d2fac9c7c6cc47 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 19 Jun 2019 11:18:32 +0200 Subject: [PATCH 0346/1449] fix #75746 --- src/vs/workbench/api/common/extHostApiCommands.ts | 13 ++++++++++--- .../electron-browser/api/extHostApiCommands.test.ts | 4 ++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/api/common/extHostApiCommands.ts b/src/vs/workbench/api/common/extHostApiCommands.ts index 2da50e9c3f4..4d78f9c67f3 100644 --- a/src/vs/workbench/api/common/extHostApiCommands.ts +++ b/src/vs/workbench/api/common/extHostApiCommands.ts @@ -18,6 +18,7 @@ import { CustomCodeAction } from 'vs/workbench/api/common/extHostLanguageFeature import { ICommandsExecutor, OpenFolderAPICommand, DiffAPICommand, OpenAPICommand, RemoveFromRecentlyOpenedAPICommand, SetEditorLayoutAPICommand, OpenIssueReporter } from './apiCommands'; import { EditorGroupLayout } from 'vs/workbench/services/editor/common/editorGroupsService'; import { isFalsyOrEmpty } from 'vs/base/common/arrays'; +import { IRange } from 'vs/editor/common/core/range'; export class ExtHostApiCommands { @@ -414,15 +415,21 @@ export class ExtHostApiCommands { }); } - private _executeSelectionRangeProvider(resource: URI, positions: types.Position[]): Promise { + private _executeSelectionRangeProvider(resource: URI, positions: types.Position[]): Promise { const pos = positions.map(typeConverters.Position.from); const args = { resource, position: pos[0], positions: pos }; - return this._commands.executeCommand('_executeSelectionRangeProvider', args).then(result => { - return result.map(oneResult => oneResult.map(typeConverters.SelectionRange.to)); + return this._commands.executeCommand('_executeSelectionRangeProvider', args).then(result => { + return result.map(ranges => { + let node: types.SelectionRange | undefined; + for (const range of ranges.reverse()) { + node = new types.SelectionRange(typeConverters.Range.to(range), node); + } + return node!; + }); }); } diff --git a/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts b/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts index 047d78070f3..8eb327c11c7 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts @@ -796,9 +796,9 @@ suite('ExtHostLanguageFeatureCommands', function () { })); await rpcProtocol.sync(); - let value = await commands.executeCommand('vscode.executeSelectionRangeProvider', model.uri, [new types.Position(0, 10)]); + let value = await commands.executeCommand('vscode.executeSelectionRangeProvider', model.uri, [new types.Position(0, 10)]); assert.equal(value.length, 1); - assert.ok(value[0].length >= 2); + assert.ok(value[0].parent); }); }); From 613447d6b3f458ef7fee227e3876303bf5184580 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 19 Jun 2019 11:26:22 +0200 Subject: [PATCH 0347/1449] start to comment out tests (for #74898) --- scripts/test-integration.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/test-integration.sh b/scripts/test-integration.sh index 3d397ed204e..a9058442dce 100755 --- a/scripts/test-integration.sh +++ b/scripts/test-integration.sh @@ -21,9 +21,9 @@ cd $ROOT ./scripts/code.sh $ROOT/extensions/vscode-colorize-tests/test --extensionDevelopmentPath=$ROOT/extensions/vscode-colorize-tests --extensionTestsPath=$ROOT/extensions/vscode-colorize-tests/out --disable-extensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started ./scripts/code.sh $ROOT/extensions/markdown-language-features/test-fixtures --extensionDevelopmentPath=$ROOT/extensions/markdown-language-features --extensionTestsPath=$ROOT/extensions/markdown-language-features/out/test --disable-extensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started -mkdir -p $ROOT/extensions/emmet/test-fixtures -./scripts/code.sh $ROOT/extensions/emmet/test-fixtures --extensionDevelopmentPath=$ROOT/extensions/emmet --extensionTestsPath=$ROOT/extensions/emmet/out/test --disable-extensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started -rm -rf $ROOT/extensions/emmet/test-fixtures +# mkdir -p $ROOT/extensions/emmet/test-fixtures +# ./scripts/code.sh $ROOT/extensions/emmet/test-fixtures --extensionDevelopmentPath=$ROOT/extensions/emmet --extensionTestsPath=$ROOT/extensions/emmet/out/test --disable-extensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started +# rm -rf $ROOT/extensions/emmet/test-fixtures if [ -f ./resources/server/test/test-remote-integration.sh ]; then ./resources/server/test/test-remote-integration.sh From 659c8c00c83d5823969501b1af325836c59ed22f Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 19 Jun 2019 11:41:52 +0200 Subject: [PATCH 0348/1449] fixing the workbench html adopting to server --- src/vs/code/browser/workbench/workbench.html | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/vs/code/browser/workbench/workbench.html b/src/vs/code/browser/workbench/workbench.html index 679b872a315..581fe5c2667 100644 --- a/src/vs/code/browser/workbench/workbench.html +++ b/src/vs/code/browser/workbench/workbench.html @@ -6,6 +6,7 @@ + @@ -15,14 +16,7 @@ From 3bffb1561c7021c3abadd14273814ee5f37ba072 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 19 Jun 2019 11:43:56 +0200 Subject: [PATCH 0349/1449] code doesn't open in remote-wsl under WSL2. For microsoft/vscode-remote-release#714 --- resources/win32/bin/code.sh | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/resources/win32/bin/code.sh b/resources/win32/bin/code.sh index b1a0f7e4f3e..606fb108fe5 100644 --- a/resources/win32/bin/code.sh +++ b/resources/win32/bin/code.sh @@ -11,8 +11,18 @@ VSCODE_PATH="$(dirname "$(dirname "$(realpath "$0")")")" ELECTRON="$VSCODE_PATH/$NAME.exe" if grep -qi Microsoft /proc/version; then # in a wsl shell - WSL_BUILD=$(uname -r | sed -E 's/^.+-([0-9]+)-[Mm]icrosoft/\1/') - if [ $WSL_BUILD -ge 17063 ] 2> /dev/null; then + if ! [ -z "$WSL_DISTRO_NAME"]; then + # $WSL_DISTRO_NAME is available since WSL builds 18362, also for WSL2 + WSL_BUILD=18362 + else + WSL_BUILD=$(uname -r | sed -E 's/^.+-([0-9]+)-Microsoft/\1/') + if ! [ -z "$WSL_BUILD" ]; then + WSL_BUILD=0 + fi + fi + + if [ $WSL_BUILD -ge 17063 ]; then + # $WSL_DISTRO_NAME is available since WSL builds 18362, also for WSL2 # WSLPATH is available since WSL build 17046 # WSLENV is available since WSL build 17063 export WSLENV=ELECTRON_RUN_AS_NODE/w:$WSLENV From 4a7e7b5cefa231ef27e1db1698859b1d6aa734d2 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 19 Jun 2019 11:48:42 +0200 Subject: [PATCH 0350/1449] comment out more tests (#74898) --- .../src/singlefolder-tests/workspace.test.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.test.ts index dc700abdf1b..67059e58c50 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.test.ts @@ -513,28 +513,28 @@ suite('workspace-namespace', () => { }); }); - test('findFiles', () => { + (process.platform === 'win32' ? test.skip /* https://github.com/microsoft/vscode/issues/74898 */ : test)('findFiles', () => { return vscode.workspace.findFiles('**/*.png').then((res) => { assert.equal(res.length, 2); assert.equal(basename(vscode.workspace.asRelativePath(res[0])), 'image.png'); }); }); - test('findFiles - exclude', () => { + (process.platform === 'win32' ? test.skip /* https://github.com/microsoft/vscode/issues/74898 */ : test)('findFiles - exclude', () => { return vscode.workspace.findFiles('**/*.png').then((res) => { assert.equal(res.length, 2); assert.equal(basename(vscode.workspace.asRelativePath(res[0])), 'image.png'); }); }); - test('findFiles, exclude', () => { + (process.platform === 'win32' ? test.skip /* https://github.com/microsoft/vscode/issues/74898 */ : test)('findFiles, exclude', () => { return vscode.workspace.findFiles('**/*.png', '**/sub/**').then((res) => { assert.equal(res.length, 1); assert.equal(basename(vscode.workspace.asRelativePath(res[0])), 'image.png'); }); }); - test('findFiles, cancellation', () => { + (process.platform === 'win32' ? test.skip /* https://github.com/microsoft/vscode/issues/74898 */ : test)('findFiles, cancellation', () => { const source = new vscode.CancellationTokenSource(); const token = source.token; // just to get an instance first @@ -545,7 +545,7 @@ suite('workspace-namespace', () => { }); }); - test('findTextInFiles', async () => { + (process.platform === 'win32' ? test.skip /* https://github.com/microsoft/vscode/issues/74898 */ : test)('findTextInFiles', async () => { const options: vscode.FindTextInFilesOptions = { include: '*.ts', previewOptions: { @@ -565,7 +565,7 @@ suite('workspace-namespace', () => { assert.equal(vscode.workspace.asRelativePath(match.uri), '10linefile.ts'); }); - test('findTextInFiles, cancellation', async () => { + (process.platform === 'win32' ? suite.skip /* https://github.com/microsoft/vscode/issues/74898 */ : suite)('findTextInFiles, cancellation', async () => { const results: vscode.TextSearchResult[] = []; const cancellation = new vscode.CancellationTokenSource(); cancellation.cancel(); From 781e61bf568a5e99756597c21ae2e3d3d293b1a0 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 19 Jun 2019 11:52:35 +0200 Subject: [PATCH 0351/1449] fix double encoding issue, https://github.com/microsoft/vscode-azure-account/issues/142 --- src/vs/editor/browser/services/openerService.ts | 2 +- src/vs/workbench/api/browser/mainThreadWindow.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/browser/services/openerService.ts b/src/vs/editor/browser/services/openerService.ts index c175034f969..9cfeed27dd0 100644 --- a/src/vs/editor/browser/services/openerService.ts +++ b/src/vs/editor/browser/services/openerService.ts @@ -55,7 +55,7 @@ export class OpenerService implements IOpenerService { if (equalsIgnoreCase(scheme, Schemas.http) || equalsIgnoreCase(scheme, Schemas.https) || equalsIgnoreCase(scheme, Schemas.mailto)) { // open http or default mail application - dom.windowOpenNoOpener(encodeURI(resource.toString(true))); + dom.windowOpenNoOpener(resource.toString()); return Promise.resolve(true); } else if (equalsIgnoreCase(scheme, Schemas.command)) { diff --git a/src/vs/workbench/api/browser/mainThreadWindow.ts b/src/vs/workbench/api/browser/mainThreadWindow.ts index 4c5b038c231..c9a212e4863 100644 --- a/src/vs/workbench/api/browser/mainThreadWindow.ts +++ b/src/vs/workbench/api/browser/mainThreadWindow.ts @@ -59,7 +59,7 @@ export class MainThreadWindow implements MainThreadWindowShape { } } - return this.windowsService.openExternal(encodeURI(uri.toString(true))); + return this.windowsService.openExternal(uri.toString()); } private getLocalhostPort(uri: URI): number | undefined { From 021839444b8266714e232206348625e9884d1b7e Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 19 Jun 2019 11:54:27 +0200 Subject: [PATCH 0352/1449] take web related changes --- build/lib/standalone.ts | 1 + src/vs/code/browser/workbench/workbench.html | 37 +++++++++++--------- src/vs/web-configuration-init.js.js | 8 +++++ 3 files changed, 30 insertions(+), 16 deletions(-) create mode 100644 src/vs/web-configuration-init.js.js diff --git a/build/lib/standalone.ts b/build/lib/standalone.ts index 79cdeeb455c..44d89d22e5a 100644 --- a/build/lib/standalone.ts +++ b/build/lib/standalone.ts @@ -108,6 +108,7 @@ export function extractEditor(options: tss.ITreeShakingOptions & { destRoot: str 'vs/css.d.ts', 'vs/css.js', 'vs/loader.js', + 'vs/web-configuration-init.js', 'vs/nls.build.js', 'vs/nls.d.ts', 'vs/nls.js', diff --git a/src/vs/code/browser/workbench/workbench.html b/src/vs/code/browser/workbench/workbench.html index 581fe5c2667..e0a187ab401 100644 --- a/src/vs/code/browser/workbench/workbench.html +++ b/src/vs/code/browser/workbench/workbench.html @@ -1,24 +1,29 @@ - - - - - - - - + + - - + + - - + + + + + + + + + + + + + + + + - - \ No newline at end of file diff --git a/src/vs/web-configuration-init.js.js b/src/vs/web-configuration-init.js.js new file mode 100644 index 00000000000..6227c2ca922 --- /dev/null +++ b/src/vs/web-configuration-init.js.js @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +self.WORKBENCH_WEB_CONFIGURATION = JSON.parse(document.getElementById('vscode-workbench-web-configuration').getAttribute('data-settings')); From e3516139a5cd5142f0be228128d1c6f93d32b402 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 19 Jun 2019 12:00:47 +0200 Subject: [PATCH 0353/1449] fix file name --- .../{web-configuration-init.js.js => web-configuration-init.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/vs/{web-configuration-init.js.js => web-configuration-init.js} (100%) diff --git a/src/vs/web-configuration-init.js.js b/src/vs/web-configuration-init.js similarity index 100% rename from src/vs/web-configuration-init.js.js rename to src/vs/web-configuration-init.js From 70115766a64b236d0cb796badd06fd0535203f93 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 19 Jun 2019 12:03:28 +0200 Subject: [PATCH 0354/1449] update environment changes --- src/vs/platform/environment/common/environment.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index b2d41431207..30a8d1fd589 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -69,6 +69,7 @@ export interface ParsedArgs { 'driver-verbose'?: boolean; remote?: string; 'disable-user-env-probe'?: boolean; + 'enable-remote-auto-shutdown'?: boolean; } export const IEnvironmentService = createDecorator('environmentService'); From 4ac1c6fa7a5f21cfe60d6eeb06839c360572b187 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 19 Jun 2019 12:04:19 +0200 Subject: [PATCH 0355/1449] rename docker extension --- src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts b/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts index 57ec2510560..071c367c648 100644 --- a/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts +++ b/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts @@ -151,7 +151,7 @@ const extensionPacks: ExtensionSuggestion[] = [ // { name: localize('welcomePage.go', "Go"), id: 'lukehoban.go' }, { name: localize('welcomePage.php', "PHP"), id: 'felixfbecker.php-pack' }, { name: localize('welcomePage.azure', "Azure"), title: localize('welcomePage.showAzureExtensions', "Show Azure extensions"), id: 'workbench.extensions.action.showAzureExtensions', isCommand: true }, - { name: localize('welcomePage.docker', "Docker"), id: 'peterjausovec.vscode-docker' }, + { name: localize('welcomePage.docker', "Docker"), id: 'ms-azuretools.vscode-docker' }, ]; const keymapExtensions: ExtensionSuggestion[] = [ From 1db16ff18b63bf781a3c4df17895d6b443f7f522 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 19 Jun 2019 12:06:37 +0200 Subject: [PATCH 0356/1449] fix #75263 --- .../parts/editor/breadcrumbsControl.ts | 52 ++++++++++--------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts index 21cae306f4e..6590a90c12c 100644 --- a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts +++ b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts @@ -327,6 +327,7 @@ export class BreadcrumbsControl { // show picker let picker: BreadcrumbsPicker; + let pickerAnchor: { x: number; y: number }; let editor = this._getActiveCodeEditor(); let editorDecorations: string[] = []; let editorViewState: ICodeEditorViewState | undefined; @@ -393,34 +394,37 @@ export class BreadcrumbsControl { ); }, getAnchor: () => { - let maxInnerWidth = window.innerWidth - 8 /*a little less the full widget*/; - let maxHeight = Math.min(window.innerHeight * 0.7, 300); + if (!pickerAnchor) { + let maxInnerWidth = window.innerWidth - 8 /*a little less the full widget*/; + let maxHeight = Math.min(window.innerHeight * 0.7, 300); - let pickerWidth = Math.min(maxInnerWidth, Math.max(240, maxInnerWidth / 4.17)); - let pickerArrowSize = 8; - let pickerArrowOffset: number; + let pickerWidth = Math.min(maxInnerWidth, Math.max(240, maxInnerWidth / 4.17)); + let pickerArrowSize = 8; + let pickerArrowOffset: number; - let data = dom.getDomNodePagePosition(event.node.firstChild as HTMLElement); - let y = data.top + data.height + pickerArrowSize; - if (y + maxHeight >= window.innerHeight) { - maxHeight = window.innerHeight - y - 30 /* room for shadow and status bar*/; - } - let x = data.left; - if (x + pickerWidth >= maxInnerWidth) { - x = maxInnerWidth - pickerWidth; - } - if (event.payload instanceof StandardMouseEvent) { - let maxPickerArrowOffset = pickerWidth - 2 * pickerArrowSize; - pickerArrowOffset = event.payload.posx - x; - if (pickerArrowOffset > maxPickerArrowOffset) { - x = Math.min(maxInnerWidth - pickerWidth, x + pickerArrowOffset - maxPickerArrowOffset); - pickerArrowOffset = maxPickerArrowOffset; + let data = dom.getDomNodePagePosition(event.node.firstChild as HTMLElement); + let y = data.top + data.height + pickerArrowSize; + if (y + maxHeight >= window.innerHeight) { + maxHeight = window.innerHeight - y - 30 /* room for shadow and status bar*/; } - } else { - pickerArrowOffset = (data.left + (data.width * 0.3)) - x; + let x = data.left; + if (x + pickerWidth >= maxInnerWidth) { + x = maxInnerWidth - pickerWidth; + } + if (event.payload instanceof StandardMouseEvent) { + let maxPickerArrowOffset = pickerWidth - 2 * pickerArrowSize; + pickerArrowOffset = event.payload.posx - x; + if (pickerArrowOffset > maxPickerArrowOffset) { + x = Math.min(maxInnerWidth - pickerWidth, x + pickerArrowOffset - maxPickerArrowOffset); + pickerArrowOffset = maxPickerArrowOffset; + } + } else { + pickerArrowOffset = (data.left + (data.width * 0.3)) - x; + } + picker.show(element, maxHeight, pickerWidth, pickerArrowSize, Math.max(0, pickerArrowOffset)); + pickerAnchor = { x, y }; } - picker.show(element, maxHeight, pickerWidth, pickerArrowSize, Math.max(0, pickerArrowOffset)); - return { x, y }; + return pickerAnchor; }, onHide: (data) => { if (editor) { From 3f317783b63a56e1c17ca939cd6a54590252b199 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 19 Jun 2019 12:18:00 +0200 Subject: [PATCH 0357/1449] Move remote user data from web configuration --- src/vs/code/browser/workbench/workbench.html | 2 ++ src/vs/web-configuration-init.js | 1 + .../services/environment/browser/environmentService.ts | 2 +- src/vs/workbench/workbench.web.api.ts | 9 +++++++-- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/vs/code/browser/workbench/workbench.html b/src/vs/code/browser/workbench/workbench.html index e0a187ab401..17cef3a4f01 100644 --- a/src/vs/code/browser/workbench/workbench.html +++ b/src/vs/code/browser/workbench/workbench.html @@ -12,6 +12,8 @@ content="default-src 'none'; img-src 'self' https: data: blob: vscode-remote:; media-src 'none'; child-src 'self' {{WEBVIEW_ENDPOINT}}; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; connect-src 'self' https:; font-src 'self' blob: vscode-remote:;"> + + diff --git a/src/vs/web-configuration-init.js b/src/vs/web-configuration-init.js index 6227c2ca922..3a51acbee18 100644 --- a/src/vs/web-configuration-init.js +++ b/src/vs/web-configuration-init.js @@ -6,3 +6,4 @@ 'use strict'; self.WORKBENCH_WEB_CONFIGURATION = JSON.parse(document.getElementById('vscode-workbench-web-configuration').getAttribute('data-settings')); +self.REMOTE_USER_DATA_URI = JSON.parse(document.getElementById('vscode-remote-user-data-uri').getAttribute('data-settings')); diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts index a865a77a203..c975c0e2a08 100644 --- a/src/vs/workbench/services/environment/browser/environmentService.ts +++ b/src/vs/workbench/services/environment/browser/environmentService.ts @@ -70,7 +70,7 @@ export class BrowserWorkbenchEnvironmentService implements IEnvironmentService { this.configuration.remoteAuthority = configuration.remoteAuthority; - this.appSettingsHome = joinPath(URI.revive(configuration.userDataUri), 'User'); + this.appSettingsHome = joinPath(URI.revive((self).REMOTE_USER_DATA_URI), 'User'); this.settingsResource = joinPath(this.appSettingsHome, 'settings.json'); this.keybindingsResource = joinPath(this.appSettingsHome, 'keybindings.json'); diff --git a/src/vs/workbench/workbench.web.api.ts b/src/vs/workbench/workbench.web.api.ts index 326b1f485c3..d8070d0ce4c 100644 --- a/src/vs/workbench/workbench.web.api.ts +++ b/src/vs/workbench/workbench.web.api.ts @@ -6,16 +6,21 @@ import 'vs/workbench/workbench.web.main'; import { main } from 'vs/workbench/browser/web.main'; import { UriComponents } from 'vs/base/common/uri'; +import { Event } from 'vs/base/common/event'; export interface IWorkbenchConstructionOptions { remoteAuthority: string; - userDataUri: UriComponents; - webviewEndpoint?: string; folderUri?: UriComponents; workspaceUri?: UriComponents; + + userData?: { + read(key: string): Promise; + write(key: string, value: string): Promise; + onDidChange: Event; + }; } function create(domElement: HTMLElement, options: IWorkbenchConstructionOptions): Promise { From 25405607d9129c8be97d52e9a0673094b2785f37 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 19 Jun 2019 12:19:36 +0200 Subject: [PATCH 0358/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5abd54506f5..e26fd27ed24 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "49dcd26b8ebc282667351ed832ed309ace05c8ce", + "distro": "553b1cdbb30d86c59f5f7314acdc3508908cedac", "author": { "name": "Microsoft Corporation" }, From 664dacc8b2c0e52a62fc6244ab4c0e38382dc45e Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 19 Jun 2019 12:30:16 +0200 Subject: [PATCH 0359/1449] move connection auth token out of web configuration --- build/lib/standalone.ts | 1 - src/vs/code/browser/workbench/workbench.html | 5 ++--- src/vs/code/browser/workbench/workbench.js | 6 +----- src/vs/platform/sign/browser/signService.ts | 2 +- src/vs/web-configuration-init.js | 9 --------- .../services/environment/browser/environmentService.ts | 2 +- 6 files changed, 5 insertions(+), 20 deletions(-) delete mode 100644 src/vs/web-configuration-init.js diff --git a/build/lib/standalone.ts b/build/lib/standalone.ts index 44d89d22e5a..79cdeeb455c 100644 --- a/build/lib/standalone.ts +++ b/build/lib/standalone.ts @@ -108,7 +108,6 @@ export function extractEditor(options: tss.ITreeShakingOptions & { destRoot: str 'vs/css.d.ts', 'vs/css.js', 'vs/loader.js', - 'vs/web-configuration-init.js', 'vs/nls.build.js', 'vs/nls.d.ts', 'vs/nls.js', diff --git a/src/vs/code/browser/workbench/workbench.html b/src/vs/code/browser/workbench/workbench.html index 17cef3a4f01..dc3e933ec74 100644 --- a/src/vs/code/browser/workbench/workbench.html +++ b/src/vs/code/browser/workbench/workbench.html @@ -14,6 +14,8 @@ + + @@ -22,9 +24,6 @@ - - - diff --git a/src/vs/code/browser/workbench/workbench.js b/src/vs/code/browser/workbench/workbench.js index 3dfc2e31515..5915d0531cf 100644 --- a/src/vs/code/browser/workbench/workbench.js +++ b/src/vs/code/browser/workbench/workbench.js @@ -3,12 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -//@ts-check 'use strict'; (function () { - // @ts-ignore require.config({ baseUrl: `${window.location.origin}/out`, paths: { @@ -20,9 +18,7 @@ } }); - // @ts-ignore require(['vs/workbench/workbench.web.api'], function (api) { - // @ts-ignore - api.create(document.body, self.WORKBENCH_WEB_CONFIGURATION); + api.create(document.body, JSON.parse(document.getElementById('vscode-workbench-web-configuration').getAttribute('data-settings'))); }); })(); \ No newline at end of file diff --git a/src/vs/platform/sign/browser/signService.ts b/src/vs/platform/sign/browser/signService.ts index 5c1919ba88f..501ab8939d4 100644 --- a/src/vs/platform/sign/browser/signService.ts +++ b/src/vs/platform/sign/browser/signService.ts @@ -11,6 +11,6 @@ export class SignService implements ISignService { _serviceBrand: ServiceIdentifier; async sign(value: string): Promise { - return Promise.resolve((self).WORKBENCH_WEB_CONFIGURATION.connectionAuthToken); + return Promise.resolve(document.getElementById('vscode-remote-connection-token')!.getAttribute('data-settings')!); } } \ No newline at end of file diff --git a/src/vs/web-configuration-init.js b/src/vs/web-configuration-init.js deleted file mode 100644 index 3a51acbee18..00000000000 --- a/src/vs/web-configuration-init.js +++ /dev/null @@ -1,9 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -self.WORKBENCH_WEB_CONFIGURATION = JSON.parse(document.getElementById('vscode-workbench-web-configuration').getAttribute('data-settings')); -self.REMOTE_USER_DATA_URI = JSON.parse(document.getElementById('vscode-remote-user-data-uri').getAttribute('data-settings')); diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts index c975c0e2a08..8ef1e38761c 100644 --- a/src/vs/workbench/services/environment/browser/environmentService.ts +++ b/src/vs/workbench/services/environment/browser/environmentService.ts @@ -70,7 +70,7 @@ export class BrowserWorkbenchEnvironmentService implements IEnvironmentService { this.configuration.remoteAuthority = configuration.remoteAuthority; - this.appSettingsHome = joinPath(URI.revive((self).REMOTE_USER_DATA_URI), 'User'); + this.appSettingsHome = joinPath(URI.revive(JSON.parse(document.getElementById('vscode-remote-user-data-uri')!.getAttribute('data-settings')!)), 'User'); this.settingsResource = joinPath(this.appSettingsHome, 'settings.json'); this.keybindingsResource = joinPath(this.appSettingsHome, 'keybindings.json'); From a012a5929ea544c8625d36e050b25254a202be07 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 19 Jun 2019 12:30:52 +0200 Subject: [PATCH 0360/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e26fd27ed24..59ec4eafc4f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "553b1cdbb30d86c59f5f7314acdc3508908cedac", + "distro": "42a63f3c8b7d02f13b3af1f2666b293af0951c9a", "author": { "name": "Microsoft Corporation" }, From 8a34940782c1afe00a8709b39647dffbd74ecbe2 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 19 Jun 2019 12:43:18 +0200 Subject: [PATCH 0361/1449] revert fix #75354 --- src/vs/workbench/contrib/scm/browser/scmActivity.ts | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/vs/workbench/contrib/scm/browser/scmActivity.ts b/src/vs/workbench/contrib/scm/browser/scmActivity.ts index 2bcd79a66f8..de8d68429cf 100644 --- a/src/vs/workbench/contrib/scm/browser/scmActivity.ts +++ b/src/vs/workbench/contrib/scm/browser/scmActivity.ts @@ -189,20 +189,12 @@ export class StatusBarController implements IWorkbenchContribution { const disposables = new DisposableStore(); for (const c of commands) { - const statusId = `status.scm.${repository.provider.id}.${c.tooltip}`; // needs to be unique, but c.id is too random - let statusLabel: string; - if (c.tooltip) { - statusLabel = localize('status.scm', "Source Control ({0}): {1}", repository.provider.label, c.tooltip.replace('...', '')); - } else { - statusLabel = localize('status.scm.short', "Source Control ({0})", repository.provider.label); - } - disposables.add(this.statusbarService.addEntry({ text: c.title, tooltip: `${label} - ${c.tooltip}`, command: c.id, arguments: c.arguments - }, statusId, statusLabel, MainThreadStatusBarAlignment.LEFT, 10000)); + }, 'status.scm', localize('status.scm', "Source Control"), MainThreadStatusBarAlignment.LEFT, 10000)); } this.statusBarDisposable = disposables; From db21a9a803ee9e45ea0ee0c2e22440c17d86c18f Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 19 Jun 2019 12:50:31 +0200 Subject: [PATCH 0362/1449] separte log contributions for web --- .../contrib/logs/common/logs.contribution.ts | 71 ++----------------- .../electron-browser/logs.contribution.ts | 68 ++++++++++++++++++ .../remote/common/remote.contribution.ts | 20 +++++- src/vs/workbench/workbench.main.ts | 1 + 4 files changed, 92 insertions(+), 68 deletions(-) create mode 100644 src/vs/workbench/contrib/logs/electron-browser/logs.contribution.ts diff --git a/src/vs/workbench/contrib/logs/common/logs.contribution.ts b/src/vs/workbench/contrib/logs/common/logs.contribution.ts index 12347d6ea7e..fa261bc537b 100644 --- a/src/vs/workbench/contrib/logs/common/logs.contribution.ts +++ b/src/vs/workbench/contrib/logs/common/logs.contribution.ts @@ -4,74 +4,11 @@ *--------------------------------------------------------------------------------------------*/ import * as nls from 'vs/nls'; -import { join } from 'vs/base/common/path'; import { Registry } from 'vs/platform/registry/common/platform'; -import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions, IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import { IOutputChannelRegistry, Extensions as OutputExt, } from 'vs/workbench/contrib/output/common/output'; -import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { URI } from 'vs/base/common/uri'; -import * as Constants from 'vs/workbench/contrib/logs/common/logConstants'; import { IWorkbenchActionRegistry, Extensions as WorkbenchActionExtensions } from 'vs/workbench/common/actions'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; -import { OpenLogsFolderAction, SetLogLevelAction } from 'vs/workbench/contrib/logs/common/logsActions'; -import { ILogService, LogLevel } from 'vs/platform/log/common/log'; -import { IFileService, FileChangeType } from 'vs/platform/files/common/files'; -import { dirname, joinPath } from 'vs/base/common/resources'; -import { IRemoteAgentService, RemoteExtensionLogFileName } from 'vs/workbench/services/remote/common/remoteAgentService'; +import { SetLogLevelAction } from 'vs/workbench/contrib/logs/common/logsActions'; -class LogOutputChannels extends Disposable implements IWorkbenchContribution { - - constructor( - @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, - @ILogService logService: ILogService, - @IFileService private readonly fileService: IFileService, - @IRemoteAgentService remoteAgentService: IRemoteAgentService - ) { - super(); - this.registerLogChannel(Constants.mainLogChannelId, nls.localize('mainLog', "Main"), URI.file(join(environmentService.logsPath, `main.log`))); - this.registerLogChannel(Constants.sharedLogChannelId, nls.localize('sharedLog', "Shared"), URI.file(join(environmentService.logsPath, `sharedprocess.log`))); - this.registerLogChannel(Constants.rendererLogChannelId, nls.localize('rendererLog', "Window"), URI.file(join(environmentService.logsPath, `renderer${environmentService.configuration.windowId}.log`))); - remoteAgentService.getEnvironment().then(remoteEnv => { - if (remoteEnv) { - const outputChannelRegistry = Registry.as(OutputExt.OutputChannels); - outputChannelRegistry.registerChannel({ id: 'remoteExtensionLog', label: nls.localize('remoteExtensionLog', "Remote Server"), file: joinPath(remoteEnv.logsPath, `${RemoteExtensionLogFileName}.log`), log: true }); - } - }); - - const registerTelemetryChannel = (level: LogLevel) => { - if (level === LogLevel.Trace && !Registry.as(OutputExt.OutputChannels).getChannel(Constants.telemetryLogChannelId)) { - this.registerLogChannel(Constants.telemetryLogChannelId, nls.localize('telemetryLog', "Telemetry"), URI.file(join(environmentService.logsPath, `telemetry.log`))); - } - }; - registerTelemetryChannel(logService.getLevel()); - logService.onDidChangeLogLevel(registerTelemetryChannel); - - const workbenchActionsRegistry = Registry.as(WorkbenchActionExtensions.WorkbenchActions); - const devCategory = nls.localize('developer', "Developer"); - workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(OpenLogsFolderAction, OpenLogsFolderAction.ID, OpenLogsFolderAction.LABEL), 'Developer: Open Logs Folder', devCategory); - workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(SetLogLevelAction, SetLogLevelAction.ID, SetLogLevelAction.LABEL), 'Developer: Set Log Level...', devCategory); - } - - private async registerLogChannel(id: string, label: string, file: URI): Promise { - const outputChannelRegistry = Registry.as(OutputExt.OutputChannels); - const exists = await this.fileService.exists(file); - if (exists) { - outputChannelRegistry.registerChannel({ id, label, file, log: true }); - return; - } - - const watcher = this.fileService.watch(dirname(file)); - const disposable = this.fileService.onFileChanges(e => { - if (e.contains(file, FileChangeType.ADDED)) { - watcher.dispose(); - disposable.dispose(); - outputChannelRegistry.registerChannel({ id, label, file, log: true }); - } - }); - } - -} - -Registry.as(WorkbenchExtensions.Workbench).registerWorkbenchContribution(LogOutputChannels, LifecyclePhase.Restored); \ No newline at end of file +const workbenchActionsRegistry = Registry.as(WorkbenchActionExtensions.WorkbenchActions); +const devCategory = nls.localize('developer', "Developer"); +workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(SetLogLevelAction, SetLogLevelAction.ID, SetLogLevelAction.LABEL), 'Developer: Set Log Level...', devCategory); \ No newline at end of file diff --git a/src/vs/workbench/contrib/logs/electron-browser/logs.contribution.ts b/src/vs/workbench/contrib/logs/electron-browser/logs.contribution.ts new file mode 100644 index 00000000000..d8d381fa525 --- /dev/null +++ b/src/vs/workbench/contrib/logs/electron-browser/logs.contribution.ts @@ -0,0 +1,68 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as nls from 'vs/nls'; +import { join } from 'vs/base/common/path'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions, IWorkbenchContribution } from 'vs/workbench/common/contributions'; +import { IOutputChannelRegistry, Extensions as OutputExt, } from 'vs/workbench/contrib/output/common/output'; +import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; +import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { URI } from 'vs/base/common/uri'; +import * as Constants from 'vs/workbench/contrib/logs/common/logConstants'; +import { IWorkbenchActionRegistry, Extensions as WorkbenchActionExtensions } from 'vs/workbench/common/actions'; +import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; +import { OpenLogsFolderAction } from 'vs/workbench/contrib/logs/common/logsActions'; +import { ILogService, LogLevel } from 'vs/platform/log/common/log'; +import { IFileService, FileChangeType } from 'vs/platform/files/common/files'; +import { dirname } from 'vs/base/common/resources'; + +class LogOutputChannels extends Disposable implements IWorkbenchContribution { + + constructor( + @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, + @ILogService logService: ILogService, + @IFileService private readonly fileService: IFileService + ) { + super(); + this.registerLogChannel(Constants.mainLogChannelId, nls.localize('mainLog', "Main"), URI.file(join(environmentService.logsPath, `main.log`))); + this.registerLogChannel(Constants.sharedLogChannelId, nls.localize('sharedLog', "Shared"), URI.file(join(environmentService.logsPath, `sharedprocess.log`))); + this.registerLogChannel(Constants.rendererLogChannelId, nls.localize('rendererLog', "Window"), URI.file(join(environmentService.logsPath, `renderer${environmentService.configuration.windowId}.log`))); + + const registerTelemetryChannel = (level: LogLevel) => { + if (level === LogLevel.Trace && !Registry.as(OutputExt.OutputChannels).getChannel(Constants.telemetryLogChannelId)) { + this.registerLogChannel(Constants.telemetryLogChannelId, nls.localize('telemetryLog', "Telemetry"), URI.file(join(environmentService.logsPath, `telemetry.log`))); + } + }; + registerTelemetryChannel(logService.getLevel()); + logService.onDidChangeLogLevel(registerTelemetryChannel); + + const workbenchActionsRegistry = Registry.as(WorkbenchActionExtensions.WorkbenchActions); + const devCategory = nls.localize('developer', "Developer"); + workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(OpenLogsFolderAction, OpenLogsFolderAction.ID, OpenLogsFolderAction.LABEL), 'Developer: Open Logs Folder', devCategory); + } + + private async registerLogChannel(id: string, label: string, file: URI): Promise { + const outputChannelRegistry = Registry.as(OutputExt.OutputChannels); + const exists = await this.fileService.exists(file); + if (exists) { + outputChannelRegistry.registerChannel({ id, label, file, log: true }); + return; + } + + const watcher = this.fileService.watch(dirname(file)); + const disposable = this.fileService.onFileChanges(e => { + if (e.contains(file, FileChangeType.ADDED)) { + watcher.dispose(); + disposable.dispose(); + outputChannelRegistry.registerChannel({ id, label, file, log: true }); + } + }); + } + +} + +Registry.as(WorkbenchExtensions.Workbench).registerWorkbenchContribution(LogOutputChannels, LifecyclePhase.Restored); \ No newline at end of file diff --git a/src/vs/workbench/contrib/remote/common/remote.contribution.ts b/src/vs/workbench/contrib/remote/common/remote.contribution.ts index 1bfb9d2439a..f169fda95d1 100644 --- a/src/vs/workbench/contrib/remote/common/remote.contribution.ts +++ b/src/vs/workbench/contrib/remote/common/remote.contribution.ts @@ -10,9 +10,12 @@ import { ILabelService } from 'vs/platform/label/common/label'; import { isWeb, OperatingSystem } from 'vs/base/common/platform'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { Schemas } from 'vs/base/common/network'; -import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; +import { IRemoteAgentService, RemoteExtensionLogFileName } from 'vs/workbench/services/remote/common/remoteAgentService'; import { ILogService } from 'vs/platform/log/common/log'; import { LogLevelSetterChannel } from 'vs/platform/log/common/logIpc'; +import { IOutputChannelRegistry, Extensions as OutputExt, } from 'vs/workbench/contrib/output/common/output'; +import { localize } from 'vs/nls'; +import { joinPath } from 'vs/base/common/resources'; export class LabelContribution implements IWorkbenchContribution { constructor( @@ -54,6 +57,21 @@ class RemoteChannelsContribution implements IWorkbenchContribution { } } +class RemoteLogOutputChannels implements IWorkbenchContribution { + + constructor( + @IRemoteAgentService remoteAgentService: IRemoteAgentService + ) { + remoteAgentService.getEnvironment().then(remoteEnv => { + if (remoteEnv) { + const outputChannelRegistry = Registry.as(OutputExt.OutputChannels); + outputChannelRegistry.registerChannel({ id: 'remoteExtensionLog', label: localize('remoteExtensionLog', "Remote Server"), file: joinPath(remoteEnv.logsPath, `${RemoteExtensionLogFileName}.log`), log: true }); + } + }); + } +} + const workbenchContributionsRegistry = Registry.as(WorkbenchExtensions.Workbench); workbenchContributionsRegistry.registerWorkbenchContribution(LabelContribution, LifecyclePhase.Starting); workbenchContributionsRegistry.registerWorkbenchContribution(RemoteChannelsContribution, LifecyclePhase.Starting); +workbenchContributionsRegistry.registerWorkbenchContribution(RemoteLogOutputChannels, LifecyclePhase.Restored); diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index ee92df6ca32..b395f8f4997 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -203,6 +203,7 @@ registerSingleton(IPreferencesSearchService, PreferencesSearchService, true); // Logs import 'vs/workbench/contrib/logs/common/logs.contribution'; +import 'vs/workbench/contrib/logs/electron-browser/logs.contribution'; // Quick Open Handlers import 'vs/workbench/contrib/quickopen/browser/quickopen.contribution'; From b8914bcfc753d7149297f6c8a456fb6e1daf6698 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 19 Jun 2019 12:55:47 +0200 Subject: [PATCH 0363/1449] move install-server --- build/gulpfile.reh.js | 32 ++++++++++++++++++++++++++++++++ build/npm/install-server.js | 15 --------------- package.json | 3 +-- 3 files changed, 33 insertions(+), 17 deletions(-) delete mode 100644 build/npm/install-server.js diff --git a/build/gulpfile.reh.js b/build/gulpfile.reh.js index 83eebc9d69d..b0e919883c4 100644 --- a/build/gulpfile.reh.js +++ b/build/gulpfile.reh.js @@ -19,6 +19,8 @@ const untar = require('gulp-untar'); const File = require('vinyl'); const fs = require('fs'); +const cp = require('child_process'); + const REPO_ROOT = path.dirname(__dirname); const noop = () => { return Promise.resolve(); }; @@ -115,3 +117,33 @@ function nodejs(platform, arch) { })) ); } + +function mixinServer(watch) { + const packageJSONPath = path.join(path.dirname(__dirname), 'package.json'); + function exec(cmdLine) { + console.log(cmdLine); + cp.execSync(cmdLine, { stdio: "inherit" }); + } + function checkout() { + const packageJSON = JSON.parse(fs.readFileSync(packageJSONPath).toString()); + exec('git fetch distro'); + exec(`git checkout ${packageJSON['distro']} -- src/vs/server resources/server`); + exec('git reset HEAD src/vs/server resources/server'); + } + checkout(); + if (watch) { + console.log('Enter watch mode (observing package.json)'); + const watcher = fs.watch(packageJSONPath); + watcher.addListener('change', () => { + try { + checkout(); + } catch (e) { + console.log(e); + } + }); + } + return Promise.resolve(); +} + +gulp.task(task.define('mixin-server', () => mixinServer(false))); +gulp.task(task.define('mixin-server-watch', () => mixinServer(true))); diff --git a/build/npm/install-server.js b/build/npm/install-server.js deleted file mode 100644 index ffeec1fa30a..00000000000 --- a/build/npm/install-server.js +++ /dev/null @@ -1,15 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -const cp = require('child_process'); - -function exec(cmdLine) { - console.log(cmdLine); - cp.execSync(cmdLine, {stdio: "inherit"}); -} - -exec('git fetch distro'); -exec(`git checkout ${process.env['npm_package_distro']} -- src/vs/server resources/server`); -exec('git reset HEAD src/vs/server resources/server'); \ No newline at end of file diff --git a/package.json b/package.json index 59ec4eafc4f..81215e8740c 100644 --- a/package.json +++ b/package.json @@ -26,8 +26,7 @@ "monaco-compile-check": "tsc -p src/tsconfig.monaco.json --noEmit", "strict-initialization-watch": "tsc --watch -p src/tsconfig.json --noEmit --strictPropertyInitialization", "web": "node resources/server/bin-dev/code-web.js --port 9888", - "web-selfhost": "node resources/server/bin-dev/code-web.js --port 9777 --selfhost", - "install-server": "node build/npm/install-server.js" + "web-selfhost": "node resources/server/bin-dev/code-web.js --port 9777 --selfhost" }, "dependencies": { "applicationinsights": "1.0.8", From 39d2a648d27cfb3436de2412996df08bec2be08f Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 19 Jun 2019 14:31:24 +0200 Subject: [PATCH 0364/1449] web - unblock running --- src/vs/code/browser/workbench/workbench.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/code/browser/workbench/workbench.html b/src/vs/code/browser/workbench/workbench.html index dc3e933ec74..6126d1ea3cd 100644 --- a/src/vs/code/browser/workbench/workbench.html +++ b/src/vs/code/browser/workbench/workbench.html @@ -8,8 +8,8 @@ - + From 63d867d80403f6be290955e71a7b7e05ea414ba8 Mon Sep 17 00:00:00 2001 From: orange4glace Date: Wed, 19 Jun 2019 21:36:30 +0900 Subject: [PATCH 0365/1449] fix: code convention --- .../files/browser/views/explorerViewer.ts | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts index 3da1ae98039..184916e4ee5 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts @@ -218,8 +218,17 @@ export class FilesRenderer implements ITreeRenderer inputBox.focus(), 100); - inputBox.select({ start: 0, end: lastDot > 0 && !stat.isDirectory ? lastDot : value.length }); + + let isFinishableDisposeEvent = false; + setTimeout(() => { + // Check if disposed + if (!inputBox.inputElement) { + return; + } + inputBox.focus(); + inputBox.select({ start: 0, end: lastDot > 0 && !stat.isDirectory ? lastDot : value.length }); + isFinishableDisposeEvent = true; + }, 0); const done = once(async (success: boolean) => { label.element.style.display = 'none'; @@ -251,8 +260,12 @@ export class FilesRenderer implements ITreeRenderer { - blurDisposable.dispose(); - done(false); + if (isFinishableDisposeEvent) { + done(false); + } + else { + dispose(toDispose); + } }); } From a2a9aeb5f475f470a070025c9aaae45a1c991a1b Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 19 Jun 2019 14:54:18 +0200 Subject: [PATCH 0366/1449] fix #75318 --- src/vs/editor/contrib/documentSymbols/outlineTree.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/contrib/documentSymbols/outlineTree.ts b/src/vs/editor/contrib/documentSymbols/outlineTree.ts index 926d6a3da2f..dc34e90fcfb 100644 --- a/src/vs/editor/contrib/documentSymbols/outlineTree.ts +++ b/src/vs/editor/contrib/documentSymbols/outlineTree.ts @@ -225,11 +225,11 @@ export class OutlineItemComparator implements ITreeSorter { } else if (a instanceof OutlineElement && b instanceof OutlineElement) { if (this.type === OutlineSortOrder.ByKind) { - return a.symbol.kind - b.symbol.kind || a.symbol.name.localeCompare(b.symbol.name); + return a.symbol.kind - b.symbol.kind || a.symbol.name.localeCompare(b.symbol.name, undefined, { numeric: true }); } else if (this.type === OutlineSortOrder.ByName) { - return a.symbol.name.localeCompare(b.symbol.name) || Range.compareRangesUsingStarts(a.symbol.range, b.symbol.range); + return a.symbol.name.localeCompare(b.symbol.name, undefined, { numeric: true }) || Range.compareRangesUsingStarts(a.symbol.range, b.symbol.range); } else if (this.type === OutlineSortOrder.ByPosition) { - return Range.compareRangesUsingStarts(a.symbol.range, b.symbol.range) || a.symbol.name.localeCompare(b.symbol.name); + return Range.compareRangesUsingStarts(a.symbol.range, b.symbol.range) || a.symbol.name.localeCompare(b.symbol.name, undefined, { numeric: true }); } } return 0; From a6652b5df25afec4f43a4ff1c845a5e1f1f77b91 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 19 Jun 2019 14:56:13 +0200 Subject: [PATCH 0367/1449] gotoErrorWidget: do not focus the error widget, but use alert to read out message fixes #41356 --- src/vs/editor/contrib/gotoError/gotoErrorWidget.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/vs/editor/contrib/gotoError/gotoErrorWidget.ts b/src/vs/editor/contrib/gotoError/gotoErrorWidget.ts index 8f2bef91435..968fa5d44cb 100644 --- a/src/vs/editor/contrib/gotoError/gotoErrorWidget.ts +++ b/src/vs/editor/contrib/gotoError/gotoErrorWidget.ts @@ -25,7 +25,7 @@ import { basename } from 'vs/base/common/resources'; import { IAction } from 'vs/base/common/actions'; import { IActionBarOptions, ActionsOrientation } from 'vs/base/browser/ui/actionbar/actionbar'; import { peekViewTitleForeground, peekViewTitleInfoForeground } from 'vs/editor/contrib/referenceSearch/referencesWidget'; -import { AccessibilitySupport } from 'vs/platform/accessibility/common/accessibility'; +import * as aria from 'vs/base/browser/ui/aria/aria'; import { SeverityIcon } from 'vs/platform/severityIcon/common/severityIcon'; class MessageWidget { @@ -287,9 +287,7 @@ export class MarkerNavigationWidget extends PeekViewWidget { this.editor.revealPositionInCenter(position, ScrollType.Smooth); - if (this.editor.getConfiguration().accessibilitySupport !== AccessibilitySupport.Disabled) { - this.focus(); - } + aria.alert(marker.message); } updateMarker(marker: IMarker): void { From 912ad66a107488b558f8fef93d224a48cb2990b6 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 19 Jun 2019 14:56:13 +0200 Subject: [PATCH 0368/1449] fix indent guides in icon exploration --- src/vs/base/browser/ui/tree/media/tree.css | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/vs/base/browser/ui/tree/media/tree.css b/src/vs/base/browser/ui/tree/media/tree.css index 03f75d4e6e2..d194c7d5350 100644 --- a/src/vs/base/browser/ui/tree/media/tree.css +++ b/src/vs/base/browser/ui/tree/media/tree.css @@ -14,10 +14,15 @@ height: 100%; position: absolute; top: 0; - left: 16px; + left: 14px; pointer-events: none; } +/* TODO @misolori remove before shipping stable */ +body:not([data-exploration="icon-exploration"]) .monaco-tl-indent { + left: 16px; +} + .monaco-tl-indent > svg { overflow: visible; } From 930290cfbe94afa5fef3eb653400b557192f2e85 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 19 Jun 2019 15:12:10 +0200 Subject: [PATCH 0369/1449] explorero: file actions disablment no longer needed --- .../contrib/files/browser/fileActions.ts | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/vs/workbench/contrib/files/browser/fileActions.ts b/src/vs/workbench/contrib/files/browser/fileActions.ts index f12976ad42c..837f66be83b 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.ts @@ -85,15 +85,10 @@ export class NewFileAction extends Action { static readonly LABEL = nls.localize('createNewFile', "New File"); constructor( - @IExplorerService explorerService: IExplorerService, @ICommandService private commandService: ICommandService ) { super('explorer.newFile', NEW_FILE_LABEL); this.class = 'explorer-action new-file'; - this._register(explorerService.onDidChangeEditable(e => { - const elementIsBeingEdited = explorerService.isEditable(e); - this.enabled = !elementIsBeingEdited; - })); } run(): Promise { @@ -107,15 +102,10 @@ export class NewFolderAction extends Action { static readonly LABEL = nls.localize('createNewFolder', "New Folder"); constructor( - @IExplorerService explorerService: IExplorerService, @ICommandService private commandService: ICommandService ) { super('explorer.newFolder', NEW_FOLDER_LABEL); this.class = 'explorer-action new-folder'; - this._register(explorerService.onDidChangeEditable(e => { - const elementIsBeingEdited = explorerService.isEditable(e); - this.enabled = !elementIsBeingEdited; - })); } run(): Promise { @@ -609,10 +599,6 @@ export class CollapseExplorerView extends Action { @IExplorerService readonly explorerService: IExplorerService ) { super(id, label, 'explorer-action collapse-explorer'); - this._register(explorerService.onDidChangeEditable(e => { - const elementIsBeingEdited = explorerService.isEditable(e); - this.enabled = !elementIsBeingEdited; - })); } run(): Promise { @@ -637,10 +623,6 @@ export class RefreshExplorerView extends Action { @IExplorerService private readonly explorerService: IExplorerService ) { super(id, label, 'explorer-action refresh-explorer'); - this._register(explorerService.onDidChangeEditable(e => { - const elementIsBeingEdited = explorerService.isEditable(e); - this.enabled = !elementIsBeingEdited; - })); } public run(): Promise { From e8c370eb6c5cdc95107a5fa88e6095a3202b3dc9 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 19 Jun 2019 15:25:23 +0200 Subject: [PATCH 0370/1449] remove web scripts --- package.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/package.json b/package.json index 81215e8740c..5e48f5b06f3 100644 --- a/package.json +++ b/package.json @@ -24,9 +24,7 @@ "smoketest": "cd test/smoke && node test/index.js", "download-builtin-extensions": "node build/lib/builtInExtensions.js", "monaco-compile-check": "tsc -p src/tsconfig.monaco.json --noEmit", - "strict-initialization-watch": "tsc --watch -p src/tsconfig.json --noEmit --strictPropertyInitialization", - "web": "node resources/server/bin-dev/code-web.js --port 9888", - "web-selfhost": "node resources/server/bin-dev/code-web.js --port 9777 --selfhost" + "strict-initialization-watch": "tsc --watch -p src/tsconfig.json --noEmit --strictPropertyInitialization" }, "dependencies": { "applicationinsights": "1.0.8", From 29bdb65295ab0aa9b848b55f04838f94063d4f92 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 19 Jun 2019 15:36:07 +0200 Subject: [PATCH 0371/1449] fix missing remote server channels --- src/vs/workbench/workbench.main.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index b395f8f4997..3265cab58ce 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -277,6 +277,7 @@ import { ITaskService } from 'vs/workbench/contrib/tasks/common/taskService'; registerSingleton(ITaskService, TaskService, true); // Remote +import 'vs/workbench/contrib/remote/common/remote.contribution'; import 'vs/workbench/contrib/remote/electron-browser/remote.contribution'; // Emmet From 57044c615aad6d2fe1366f8aa8b08129a8baa3f1 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 19 Jun 2019 15:38:38 +0200 Subject: [PATCH 0372/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5e48f5b06f3..93dd6fac19b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "42a63f3c8b7d02f13b3af1f2666b293af0951c9a", + "distro": "f664f7661e70234cf4257fa5df73e635a98880a9", "author": { "name": "Microsoft Corporation" }, From c78bc4a4aca6436174c40edd11ef3fb6d1f6fea2 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 19 Jun 2019 15:40:08 +0200 Subject: [PATCH 0373/1449] flaky test (#75772) --- .../terminal/test/electron-browser/terminalConfigHelper.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/terminal/test/electron-browser/terminalConfigHelper.test.ts b/src/vs/workbench/contrib/terminal/test/electron-browser/terminalConfigHelper.test.ts index e0110601c82..3d2cf176549 100644 --- a/src/vs/workbench/contrib/terminal/test/electron-browser/terminalConfigHelper.test.ts +++ b/src/vs/workbench/contrib/terminal/test/electron-browser/terminalConfigHelper.test.ts @@ -16,7 +16,7 @@ suite('Workbench - TerminalConfigHelper', () => { fixture = document.body; }); - test('TerminalConfigHelper - getFont fontFamily', function () { + test.skip('TerminalConfigHelper - getFont fontFamily', function () { const configurationService = new TestConfigurationService(); configurationService.setUserConfiguration('editor', { fontFamily: 'foo' }); configurationService.setUserConfiguration('terminal', { integrated: { fontFamily: 'bar' } }); From 87285c4e79e280cdfe141c57e3f9959fbf48b68e Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 19 Jun 2019 15:40:52 +0200 Subject: [PATCH 0374/1449] introduce web user data dir for user data --- src/vs/platform/environment/node/environmentService.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts index b4f9e1c2061..c021bbb4000 100644 --- a/src/vs/platform/environment/node/environmentService.ts +++ b/src/vs/platform/environment/node/environmentService.ts @@ -104,6 +104,9 @@ export class EnvironmentService implements IEnvironmentService { return parseUserDataDir(this._args, process); } + @memoize + get webUserDataHome(): URI { return URI.file(parsePathArg(this._args['web-user-data-dir'], process) || this.userDataPath); } + get appNameLong(): string { return product.nameLong; } get appQuality(): string | undefined { return product.quality; } From 81865ae71155101ed99278bde03f9d9e706744e7 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 19 Jun 2019 15:46:12 +0200 Subject: [PATCH 0375/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 93dd6fac19b..d864657d096 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "f664f7661e70234cf4257fa5df73e635a98880a9", + "distro": "aae69b0c37c45dcdd6c220116ada3a742c859cfd", "author": { "name": "Microsoft Corporation" }, From b950554a2a773e5392fc96c7c93099aa8682845d Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 19 Jun 2019 16:09:24 +0200 Subject: [PATCH 0376/1449] debug config manager: first init launches then register listeners --- .../contrib/debug/browser/debugConfigurationManager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/debug/browser/debugConfigurationManager.ts b/src/vs/workbench/contrib/debug/browser/debugConfigurationManager.ts index af9817c9807..317b77e3e78 100644 --- a/src/vs/workbench/contrib/debug/browser/debugConfigurationManager.ts +++ b/src/vs/workbench/contrib/debug/browser/debugConfigurationManager.ts @@ -73,8 +73,8 @@ export class ConfigurationManager implements IConfigurationManager { this.adapterDescriptorFactories = []; this.debuggers = []; this.toDispose = []; - this.registerListeners(lifecycleService); this.initLaunches(); + this.registerListeners(lifecycleService); const previousSelectedRoot = this.storageService.get(DEBUG_SELECTED_ROOT, StorageScope.WORKSPACE); const previousSelectedLaunch = this.launches.filter(l => l.uri.toString() === previousSelectedRoot).pop(); this.debugConfigurationTypeContext = CONTEXT_DEBUG_CONFIGURATION_TYPE.bindTo(contextKeyService); From c76027bbf4532815facae5a2df4017d57f4be51a Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 19 Jun 2019 16:11:44 +0200 Subject: [PATCH 0377/1449] pixel perfect indent guides --- src/vs/base/browser/ui/tree/abstractTree.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index fadc69ed298..c3527a710b8 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -381,12 +381,14 @@ class TreeRenderer implements IListRenderer implements IListRenderer('line', { x1: x, y1: 0, x2: x, y2: height }); + const x = Math.floor((target.depth - i - 1) * this.indent * window.devicePixelRatio) + 2.5; + const line = $.SVG('line', { x1: x, y1: 0, x2: x, y2: virtualHeight }); if (this.activeParentNodes.has(parent)) { addClass(line, 'active'); From 8a0e33ad3dbb75d10e27c4e37aed1c15d4422928 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 19 Jun 2019 16:15:07 +0200 Subject: [PATCH 0378/1449] web - bring CSP back differently --- src/vs/code/browser/workbench/workbench.html | 36 ++++++++++---------- src/vs/code/browser/workbench/workbench.js | 4 ++- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/vs/code/browser/workbench/workbench.html b/src/vs/code/browser/workbench/workbench.html index 6126d1ea3cd..fedadf22ee6 100644 --- a/src/vs/code/browser/workbench/workbench.html +++ b/src/vs/code/browser/workbench/workbench.html @@ -1,30 +1,30 @@ + + - - + + - - + - + - - - - - - + + - - + + + - - + + - - + + + + \ No newline at end of file diff --git a/src/vs/code/browser/workbench/workbench.js b/src/vs/code/browser/workbench/workbench.js index 5915d0531cf..34f321f90df 100644 --- a/src/vs/code/browser/workbench/workbench.js +++ b/src/vs/code/browser/workbench/workbench.js @@ -19,6 +19,8 @@ }); require(['vs/workbench/workbench.web.api'], function (api) { - api.create(document.body, JSON.parse(document.getElementById('vscode-workbench-web-configuration').getAttribute('data-settings'))); + const options = JSON.parse(document.getElementById('vscode-workbench-web-configuration').getAttribute('data-settings')); + + api.create(document.body, options); }); })(); \ No newline at end of file From 5565ddd88c6350f90e1031be4ce0d6089ac73a57 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 19 Jun 2019 15:58:46 +0200 Subject: [PATCH 0379/1449] update style.textContent instead of calling insertRule, #75061 this change makes style changes visible to the mutation observer --- src/vs/base/browser/dom.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index 64fd5661495..265d69f85a2 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -804,8 +804,7 @@ export function createCSSRule(selector: string, cssText: string, style: HTMLStyl if (!style || !cssText) { return; } - - (style.sheet).insertRule(selector + '{' + cssText + '}', 0); + style.textContent = `${selector}{${cssText}}\n${style.textContent}`; } export function removeCSSRulesContainingSelector(ruleName: string, style: HTMLStyleElement = getSharedStyleSheet()): void { From 29c09c3c830f4a8ef40564bb19c2b996bcc5a2a2 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 19 Jun 2019 16:16:37 +0200 Subject: [PATCH 0380/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d864657d096..855edf7282e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "aae69b0c37c45dcdd6c220116ada3a742c859cfd", + "distro": "224180ef61f67fc894727cb89068881165b35a0f", "author": { "name": "Microsoft Corporation" }, From 0be038b24dafd06752659dabedba99bc811f2368 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 19 Jun 2019 16:21:49 +0200 Subject: [PATCH 0381/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 855edf7282e..f4b162d2c4f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "224180ef61f67fc894727cb89068881165b35a0f", + "distro": "09333a710f6609d785037c9edce88a4fda48bfb2", "author": { "name": "Microsoft Corporation" }, From b6341520000c2615b9f0cb4aad732216826d0bc4 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 19 Jun 2019 16:42:41 +0200 Subject: [PATCH 0382/1449] Revert "explorero: file actions disablment no longer needed" This reverts commit 930290cfbe94afa5fef3eb653400b557192f2e85. --- .../contrib/files/browser/fileActions.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/vs/workbench/contrib/files/browser/fileActions.ts b/src/vs/workbench/contrib/files/browser/fileActions.ts index 837f66be83b..f12976ad42c 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.ts @@ -85,10 +85,15 @@ export class NewFileAction extends Action { static readonly LABEL = nls.localize('createNewFile', "New File"); constructor( + @IExplorerService explorerService: IExplorerService, @ICommandService private commandService: ICommandService ) { super('explorer.newFile', NEW_FILE_LABEL); this.class = 'explorer-action new-file'; + this._register(explorerService.onDidChangeEditable(e => { + const elementIsBeingEdited = explorerService.isEditable(e); + this.enabled = !elementIsBeingEdited; + })); } run(): Promise { @@ -102,10 +107,15 @@ export class NewFolderAction extends Action { static readonly LABEL = nls.localize('createNewFolder', "New Folder"); constructor( + @IExplorerService explorerService: IExplorerService, @ICommandService private commandService: ICommandService ) { super('explorer.newFolder', NEW_FOLDER_LABEL); this.class = 'explorer-action new-folder'; + this._register(explorerService.onDidChangeEditable(e => { + const elementIsBeingEdited = explorerService.isEditable(e); + this.enabled = !elementIsBeingEdited; + })); } run(): Promise { @@ -599,6 +609,10 @@ export class CollapseExplorerView extends Action { @IExplorerService readonly explorerService: IExplorerService ) { super(id, label, 'explorer-action collapse-explorer'); + this._register(explorerService.onDidChangeEditable(e => { + const elementIsBeingEdited = explorerService.isEditable(e); + this.enabled = !elementIsBeingEdited; + })); } run(): Promise { @@ -623,6 +637,10 @@ export class RefreshExplorerView extends Action { @IExplorerService private readonly explorerService: IExplorerService ) { super(id, label, 'explorer-action refresh-explorer'); + this._register(explorerService.onDidChangeEditable(e => { + const elementIsBeingEdited = explorerService.isEditable(e); + this.enabled = !elementIsBeingEdited; + })); } public run(): Promise { From a05e05ca19f6e82d0d90c54029a8b76e4ed5896a Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 19 Jun 2019 16:49:10 +0200 Subject: [PATCH 0383/1449] Revert "Merge pull request #75695 from orange4glace/master" This reverts commit 28ab9ad9fe8db71dc9804985785f041272d9b545, reversing changes made to 912ad66a107488b558f8fef93d224a48cb2990b6. --- .../files/browser/views/explorerViewer.ts | 35 +++++++------------ 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts index 184916e4ee5..76fab053275 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts @@ -218,29 +218,22 @@ export class FilesRenderer implements ITreeRenderer 0 && !stat.isDirectory ? lastDot : value.length }); - let isFinishableDisposeEvent = false; - setTimeout(() => { - // Check if disposed - if (!inputBox.inputElement) { - return; - } - inputBox.focus(); - inputBox.select({ start: 0, end: lastDot > 0 && !stat.isDirectory ? lastDot : value.length }); - isFinishableDisposeEvent = true; - }, 0); - - const done = once(async (success: boolean) => { + const done = once(async (success: boolean, finishEditing: boolean) => { label.element.style.display = 'none'; const value = inputBox.value; dispose(toDispose); container.removeChild(label.element); - // Timeout: once done rendering only then re-render #70902 - setTimeout(() => editableData.onFinish(value, success), 0); + if (finishEditing) { + // Timeout: once done rendering only then re-render #70902 + setTimeout(() => editableData.onFinish(value, success), 0); + } }); const blurDisposable = DOM.addDisposableListener(inputBox.inputElement, DOM.EventType.BLUR, () => { - done(inputBox.isInputValid()); + done(inputBox.isInputValid(), true); }); const toDispose = [ @@ -248,10 +241,10 @@ export class FilesRenderer implements ITreeRenderer { if (e.equals(KeyCode.Enter)) { if (inputBox.validate()) { - done(true); + done(true, true); } } else if (e.equals(KeyCode.Escape)) { - done(false); + done(false, true); } }), blurDisposable, @@ -260,12 +253,8 @@ export class FilesRenderer implements ITreeRenderer { - if (isFinishableDisposeEvent) { - done(false); - } - else { - dispose(toDispose); - } + blurDisposable.dispose(); + done(false, false); }); } From 06230bedfe09a143a6e54828be019eb4139a309e Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 19 Jun 2019 17:07:40 +0200 Subject: [PATCH 0384/1449] web - cleanup main --- .../browser/configurationResolverService.ts | 7 +++++-- src/vs/workbench/services/search/common/searchService.ts | 2 ++ src/vs/workbench/workbench.main.ts | 4 +--- src/vs/workbench/workbench.web.main.ts | 9 ++------- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/vs/workbench/services/configurationResolver/browser/configurationResolverService.ts b/src/vs/workbench/services/configurationResolver/browser/configurationResolverService.ts index c9a8760aa96..bcf4b31cef9 100644 --- a/src/vs/workbench/services/configurationResolver/browser/configurationResolverService.ts +++ b/src/vs/workbench/services/configurationResolver/browser/configurationResolverService.ts @@ -19,8 +19,9 @@ import { AbstractVariableResolverService } from 'vs/workbench/services/configura import { isCodeEditor } from 'vs/editor/browser/editorBrowser'; import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; import { IQuickInputService, IInputOptions, IQuickPickItem, IPickOptions } from 'vs/platform/quickinput/common/quickInput'; -import { ConfiguredInput } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; +import { ConfiguredInput, IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; import { IProcessEnvironment } from 'vs/base/common/platform'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; export abstract class BaseConfigurationResolverService extends AbstractVariableResolverService { @@ -304,4 +305,6 @@ export class ConfigurationResolverService extends BaseConfigurationResolverServi ) { super(environmentService.configuration.userEnv, editorService, environmentService, configurationService, commandService, workspaceContextService, quickInputService); } -} \ No newline at end of file +} + +registerSingleton(IConfigurationResolverService, ConfigurationResolverService, true); \ No newline at end of file diff --git a/src/vs/workbench/services/search/common/searchService.ts b/src/vs/workbench/services/search/common/searchService.ts index 7051709d15f..8c793ca7a87 100644 --- a/src/vs/workbench/services/search/common/searchService.ts +++ b/src/vs/workbench/services/search/common/searchService.ts @@ -20,6 +20,7 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten import { deserializeSearchError, FileMatch, ICachedSearchStats, IFileMatch, IFileQuery, IFileSearchStats, IFolderQuery, IProgressMessage, ISearchComplete, ISearchEngineStats, ISearchProgressItem, ISearchQuery, ISearchResultProvider, ISearchService, ITextQuery, pathIncludedInQuery, QueryType, SearchError, SearchErrorCode, SearchProviderType, isFileMatch, isProgressMessage } from 'vs/workbench/services/search/common/search'; import { addContextToEditorMatches, editorMatchesToTextSearchResults } from 'vs/workbench/services/search/common/searchHelpers'; import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; export class SearchService extends Disposable implements ISearchService { _serviceBrand: any; @@ -421,3 +422,4 @@ export class RemoteSearchService extends SearchService { } } +registerSingleton(ISearchService, RemoteSearchService, true); diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index 3265cab58ce..b1130436d6d 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -90,8 +90,6 @@ import { IURLService } from 'vs/platform/url/common/url'; import { RelayURLService } from 'vs/platform/url/electron-browser/urlService'; import { ITunnelService } from 'vs/platform/remote/common/tunnel'; import { TunnelService } from 'vs/workbench/services/remote/node/tunnelService'; -import { ConfigurationResolverService } from 'vs/workbench/services/configurationResolver/electron-browser/configurationResolverService'; -import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; import { ICredentialsService } from 'vs/platform/credentials/common/credentials'; import { KeytarCredentialsService } from 'vs/platform/credentials/node/credentialsService'; @@ -136,6 +134,7 @@ import 'vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl'; import 'vs/workbench/services/notification/common/notificationService'; import 'vs/workbench/services/window/electron-browser/windowService'; import 'vs/workbench/services/telemetry/electron-browser/telemetryService'; +import 'vs/workbench/services/configurationResolver/electron-browser/configurationResolverService'; registerSingleton(IMenuService, MenuService, true); registerSingleton(IListService, ListService, true); @@ -163,7 +162,6 @@ registerSingleton(IWorkspacesService, WorkspacesService); registerSingleton(IMenubarService, MenubarService); registerSingleton(IURLService, RelayURLService); registerSingleton(ITunnelService, TunnelService, true); -registerSingleton(IConfigurationResolverService, ConfigurationResolverService, true); registerSingleton(ICredentialsService, KeytarCredentialsService, true); //#endregion diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index b7c880a0105..2582af51644 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -89,10 +89,6 @@ import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; // import { RelayURLService } from 'vs/platform/url/electron-browser/urlService'; // import { ITunnelService } from 'vs/platform/remote/common/tunnel'; // import { TunnelService } from 'vs/workbench/services/remote/node/tunnelService'; -import { ConfigurationResolverService } from 'vs/workbench/services/configurationResolver/browser/configurationResolverService'; -import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; -import { ISearchService } from 'vs/workbench/services/search/common/search'; -import { RemoteSearchService } from 'vs/workbench/services/search/common/searchService'; import 'vs/platform/dialogs/browser/dialogService'; import 'vs/workbench/services/bulkEdit/browser/bulkEditService'; // import 'vs/workbench/services/integrity/node/integrityService'; @@ -101,7 +97,7 @@ import 'vs/workbench/services/textMate/browser/textMateService'; // import 'vs/workbench/services/workspace/electron-browser/workspaceEditingService'; // import 'vs/workbench/services/extensions/electron-browser/inactiveExtensionUrlHandler'; import 'vs/workbench/services/decorations/browser/decorationsService'; -// import 'vs/workbench/services/search/node/searchService'; +import 'vs/workbench/services/search/common/searchService'; import 'vs/workbench/services/progress/browser/progressService'; import 'vs/workbench/services/editor/browser/codeEditorService'; // import 'vs/workbench/services/extensions/electron-browser/extensionHostDebugService'; @@ -134,6 +130,7 @@ import 'vs/workbench/services/label/common/labelService'; import 'vs/workbench/services/notification/common/notificationService'; // import 'vs/workbench/services/window/electron-browser/windowService'; // import 'vs/workbench/services/telemetry/electron-browser/telemetryService'; +import 'vs/workbench/services/configurationResolver/browser/configurationResolverService'; import 'vs/workbench/browser/web.simpleservices'; @@ -162,9 +159,7 @@ registerSingleton(ILifecycleService, BrowserLifecycleService); // registerSingleton(IWorkspacesService, WorkspacesService); // registerSingleton(IMenubarService, MenubarService); // registerSingleton(IURLService, RelayURLService); -registerSingleton(ISearchService, RemoteSearchService, true); registerSingleton(IContextMenuService, ContextMenuService); -registerSingleton(IConfigurationResolverService, ConfigurationResolverService, true); //#endregion From 771328d713bdab1cdea2dea60bf2cfd1cf7b66a1 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 19 Jun 2019 17:17:52 +0200 Subject: [PATCH 0385/1449] :lipstick: main files --- src/vs/platform/dialogs/browser/dialogService.ts | 3 --- src/vs/workbench/workbench.main.ts | 3 +++ src/vs/workbench/workbench.web.main.ts | 13 ++++++++++--- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/vs/platform/dialogs/browser/dialogService.ts b/src/vs/platform/dialogs/browser/dialogService.ts index d5cc82af884..5a906768029 100644 --- a/src/vs/platform/dialogs/browser/dialogService.ts +++ b/src/vs/platform/dialogs/browser/dialogService.ts @@ -9,7 +9,6 @@ import { ILayoutService } from 'vs/platform/layout/browser/layoutService'; import { ILogService } from 'vs/platform/log/common/log'; import Severity from 'vs/base/common/severity'; import { Dialog } from 'vs/base/browser/ui/dialog/dialog'; -import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { attachDialogStyler } from 'vs/platform/theme/common/styler'; import { DisposableStore } from 'vs/base/common/lifecycle'; @@ -93,5 +92,3 @@ export class DialogService implements IDialogService { return choice; } } - -registerSingleton(IDialogService, DialogService, true); diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index b1130436d6d..a6c31adbe64 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -71,6 +71,8 @@ import { IRequestService } from 'vs/platform/request/node/request'; import { RequestService } from 'vs/platform/request/electron-browser/requestService'; import { LifecycleService } from 'vs/platform/lifecycle/electron-browser/lifecycleService'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; +import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; +import { DialogService } from 'vs/platform/dialogs/browser/dialogService'; import { ILocalizationsService } from 'vs/platform/localizations/common/localizations'; import { LocalizationsService } from 'vs/platform/localizations/electron-browser/localizationsService'; import { ISharedProcessService, SharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; @@ -136,6 +138,7 @@ import 'vs/workbench/services/window/electron-browser/windowService'; import 'vs/workbench/services/telemetry/electron-browser/telemetryService'; import 'vs/workbench/services/configurationResolver/electron-browser/configurationResolverService'; +registerSingleton(IDialogService, DialogService, true); registerSingleton(IMenuService, MenuService, true); registerSingleton(IListService, ListService, true); registerSingleton(IOpenerService, OpenerService, true); diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index 2582af51644..7bdf1ac3687 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -62,14 +62,15 @@ import { ITextResourceConfigurationService } from 'vs/editor/common/services/res import { TextResourceConfigurationService } from 'vs/editor/common/services/resourceConfigurationImpl'; import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility'; import { BrowserAccessibilityService } from 'vs/platform/accessibility/common/accessibilityService'; -import { IContextViewService, IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { ContextMenuService } from 'vs/platform/contextview/browser/contextMenuService'; +// import { IExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { ContextViewService } from 'vs/platform/contextview/browser/contextViewService'; // import { ExtensionGalleryService } from 'vs/platform/extensionManagement/node/extensionGalleryService'; // import { IRequestService } from 'vs/platform/request/node/request'; // import { RequestService } from 'vs/platform/request/electron-browser/requestService'; import { BrowserLifecycleService } from 'vs/platform/lifecycle/browser/lifecycleService'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; +import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; +import { DialogService } from 'vs/platform/dialogs/browser/dialogService'; // import { ILocalizationsService } from 'vs/platform/localizations/common/localizations'; // import { LocalizationsService } from 'vs/platform/localizations/electron-browser/localizationsService'; // import { ISharedProcessService, SharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; @@ -89,7 +90,8 @@ import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; // import { RelayURLService } from 'vs/platform/url/electron-browser/urlService'; // import { ITunnelService } from 'vs/platform/remote/common/tunnel'; // import { TunnelService } from 'vs/workbench/services/remote/node/tunnelService'; -import 'vs/platform/dialogs/browser/dialogService'; +// import { ICredentialsService } from 'vs/platform/credentials/common/credentials'; +// import { KeytarCredentialsService } from 'vs/platform/credentials/node/credentialsService'; import 'vs/workbench/services/bulkEdit/browser/bulkEditService'; // import 'vs/workbench/services/integrity/node/integrityService'; import 'vs/workbench/services/keybinding/common/keybindingEditing'; @@ -131,9 +133,12 @@ import 'vs/workbench/services/notification/common/notificationService'; // import 'vs/workbench/services/window/electron-browser/windowService'; // import 'vs/workbench/services/telemetry/electron-browser/telemetryService'; import 'vs/workbench/services/configurationResolver/browser/configurationResolverService'; +import { IContextViewService, IContextMenuService } from 'vs/platform/contextview/browser/contextView'; +import { ContextMenuService } from 'vs/platform/contextview/browser/contextMenuService'; import 'vs/workbench/browser/web.simpleservices'; +registerSingleton(IDialogService, DialogService, true); registerSingleton(IMenuService, MenuService, true); registerSingleton(IListService, ListService, true); registerSingleton(IOpenerService, OpenerService, true); @@ -159,6 +164,8 @@ registerSingleton(ILifecycleService, BrowserLifecycleService); // registerSingleton(IWorkspacesService, WorkspacesService); // registerSingleton(IMenubarService, MenubarService); // registerSingleton(IURLService, RelayURLService); +// registerSingleton(ITunnelService, TunnelService, true); +// registerSingleton(ICredentialsService, KeytarCredentialsService, true); registerSingleton(IContextMenuService, ContextMenuService); //#endregion From 79f5f1a48de44c372e8ec6b35a5d8b4a205df1dd Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 19 Jun 2019 17:18:43 +0200 Subject: [PATCH 0386/1449] fixes #75773 --- src/vs/base/browser/ui/tree/media/tree.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/base/browser/ui/tree/media/tree.css b/src/vs/base/browser/ui/tree/media/tree.css index d194c7d5350..564d5505e41 100644 --- a/src/vs/base/browser/ui/tree/media/tree.css +++ b/src/vs/base/browser/ui/tree/media/tree.css @@ -18,6 +18,10 @@ pointer-events: none; } +.hide-arrows .monaco-tl-indent { + left: 10px; +} + /* TODO @misolori remove before shipping stable */ body:not([data-exploration="icon-exploration"]) .monaco-tl-indent { left: 16px; From 8f3ba7e312e236b6f935978477b8de269bd7b71d Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Wed, 19 Jun 2019 10:17:10 -0700 Subject: [PATCH 0387/1449] keyboard layout picker --- .../browser/keyboardLayoutPicker.ts | 56 +++++++++-- .../environment/browser/environmentService.ts | 3 +- .../keybinding/browser/keybindingService.ts | 5 +- .../browser/keyboardLayoutProvider.ts | 39 +++++++- .../browser/keyboardLayoutService.ts | 93 +++++++++++++++---- .../keybinding/common/keymapService.ts | 24 +++++ 6 files changed, 182 insertions(+), 38 deletions(-) diff --git a/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts b/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts index a5ad35624d0..6536b626fa7 100644 --- a/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts +++ b/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts @@ -6,7 +6,7 @@ import * as nls from 'vs/nls'; import { StatusbarAlignment, IStatusbarService, IStatusbarEntryAccessor } from 'vs/platform/statusbar/common/statusbar'; import { Disposable, MutableDisposable } from 'vs/base/common/lifecycle'; -import { IKeymapService } from 'vs/workbench/services/keybinding/common/keymapService'; +import { IKeymapService, areKeyboardLayoutsEqual } from 'vs/workbench/services/keybinding/common/keymapService'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as WorkbenchExtensions, IWorkbenchContribution, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; @@ -17,6 +17,11 @@ import { isWeb, isMacintosh, isWindows } from 'vs/base/common/platform'; import { QuickPickInput, IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { IFileService } from 'vs/platform/files/common/files'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { VSBuffer } from 'vs/base/common/buffer'; +import { IEditor } from 'vs/workbench/common/editor'; export class KeyboardLayoutPickerContribution extends Disposable implements IWorkbenchContribution { private readonly pickerElement = this._register(new MutableDisposable()); @@ -46,7 +51,8 @@ export class KeyboardLayoutPickerContribution extends Disposable implements IWor let layoutInfo = (layout).text || (layout).lang || (layout).model; this.pickerElement.value.update({ - text: `Layout: ${layoutInfo}` + text: `Layout: ${layoutInfo}`, + command: KEYBOARD_LAYOUT_OPEN_PICKER }); } })); @@ -61,12 +67,23 @@ export class KeyboardLayoutPickerAction extends Action { static readonly ID = KEYBOARD_LAYOUT_OPEN_PICKER; static readonly LABEL = nls.localize('keyboard.chooseLayout', "Change keyboard layout"); + private static DEFAULT_CONTENT: string = [ + `// ${nls.localize('displayLanguage', 'Defines the keyboard layout used in VS Code in the browser environment.')}`, + `// ${nls.localize('doc', 'See {0} for how to generate keyboard layout information.', 'https://go.microsoft.com/fwlink/?LinkId=761051')}`, + ``, + `// Once you have the keyboard layout info, please paste it below.`, + '\n' + ].join('\n'); + constructor( actionId: string, actionLabel: string, + @IFileService private readonly fileService: IFileService, @IQuickInputService private readonly quickInputService: IQuickInputService, @IKeymapService private readonly keymapService: IKeymapService, - @IConfigurationService private readonly configurationService: IConfigurationService + @IConfigurationService private readonly configurationService: IConfigurationService, + @IEnvironmentService private readonly environmentService: IEnvironmentService, + @IEditorService private readonly editorService: IEditorService ) { super(actionId, actionLabel); @@ -75,11 +92,16 @@ export class KeyboardLayoutPickerAction extends Action { async run(): Promise { let layouts = this.keymapService.getAllKeyboardLayouts(); + let currentLayout = this.keymapService.getCurrentKeyboardLayout(); + let layoutConfig = this.configurationService.getValue('keyboard.layout'); + let isAutoDetect = layoutConfig === 'autodetect'; const picks: QuickPickInput[] = layouts.map(layout => { + const picked = !isAutoDetect && areKeyboardLayoutsEqual(currentLayout, layout); return { label: (layout).text || (layout).lang || (layout).layout, - description: (layout).id || undefined + description: ((layout).id || '') + (picked ? ' (Current selection)' : ''), + picked: !isAutoDetect && areKeyboardLayoutsEqual(currentLayout, layout) }; }); @@ -88,13 +110,15 @@ export class KeyboardLayoutPickerAction extends Action { picks.unshift({ type: 'separator', label: nls.localize('layoutPicks', "Keyboard Layouts ({0})", platform) }); } - let configureKeyboardLayout: IQuickPickItem = { label: nls.localize('configureKeyboardLayout', "Configure KeyboardLayout") }; + let configureKeyboardLayout: IQuickPickItem = { label: nls.localize('configureKeyboardLayout', "Configure Keyboard Layout") }; picks.unshift(configureKeyboardLayout); // Offer to "Auto Detect" const autoDetectMode: IQuickPickItem = { - label: nls.localize('autoDetect', "Auto Detect") + label: nls.localize('autoDetect', "Auto Detect"), + description: isAutoDetect ? `(Current: ${(currentLayout).text || (currentLayout).lang || (currentLayout).layout})` : undefined, + picked: isAutoDetect ? true : undefined }; picks.unshift(autoDetectMode); @@ -111,7 +135,23 @@ export class KeyboardLayoutPickerAction extends Action { } if (pick === configureKeyboardLayout) { - return; + const file = this.environmentService.keyboardLayoutResource; + + await this.fileService.resolve(file).then(undefined, (error) => { + return this.fileService.createFile(file, VSBuffer.fromString(KeyboardLayoutPickerAction.DEFAULT_CONTENT)); + }).then((stat): Promise | null => { + if (!stat) { + return null; + } + return this.editorService.openEditor({ + resource: stat.resource, + mode: 'jsonc' + }); + }, (error) => { + throw new Error(nls.localize('fail.createSettings', "Unable to create '{0}' ({1}).", file.toString(), error)); + }); + + return Promise.resolve(); } this.configurationService.updateValue('keyboard.layout', pick.label); @@ -119,4 +159,4 @@ export class KeyboardLayoutPickerAction extends Action { } const registry = Registry.as(ActionExtensions.WorkbenchActions); -registry.registerWorkbenchAction(new SyncActionDescriptor(KeyboardLayoutPickerAction, KeyboardLayoutPickerAction.ID, KeyboardLayoutPickerAction.LABEL, { }), 'Change Language Mode'); +registry.registerWorkbenchAction(new SyncActionDescriptor(KeyboardLayoutPickerAction, KeyboardLayoutPickerAction.ID, KeyboardLayoutPickerAction.LABEL, {}), 'Change Language Mode'); diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts index a865a77a203..d224fa7383b 100644 --- a/src/vs/workbench/services/environment/browser/environmentService.ts +++ b/src/vs/workbench/services/environment/browser/environmentService.ts @@ -58,7 +58,6 @@ export class BrowserWindowConfiguration implements IWindowConfiguration { } export class BrowserWorkbenchEnvironmentService implements IEnvironmentService { - _serviceBrand: ServiceIdentifier; readonly configuration: IWindowConfiguration = new BrowserWindowConfiguration(); @@ -73,6 +72,7 @@ export class BrowserWorkbenchEnvironmentService implements IEnvironmentService { this.appSettingsHome = joinPath(URI.revive(configuration.userDataUri), 'User'); this.settingsResource = joinPath(this.appSettingsHome, 'settings.json'); this.keybindingsResource = joinPath(this.appSettingsHome, 'keybindings.json'); + this.keyboardLayoutResource = joinPath(this.appSettingsHome, 'keyboardLayout.json'); this.logsPath = '/web/logs'; @@ -97,6 +97,7 @@ export class BrowserWorkbenchEnvironmentService implements IEnvironmentService { appSettingsHome: URI; settingsResource: URI; keybindingsResource: URI; + keyboardLayoutResource: URI; machineSettingsHome: URI; machineSettingsResource: URI; settingsSearchBuildId?: number; diff --git a/src/vs/workbench/services/keybinding/browser/keybindingService.ts b/src/vs/workbench/services/keybinding/browser/keybindingService.ts index 56591386c3f..9a5369924c4 100644 --- a/src/vs/workbench/services/keybinding/browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/browser/keybindingService.ts @@ -46,7 +46,6 @@ import * as objects from 'vs/base/common/objects'; import { IKeymapService } from 'vs/workbench/services/keybinding/common/keymapService'; import { getDispatchConfig } from 'vs/workbench/services/keybinding/common/dispatchConfig'; import { isArray } from 'vs/base/common/types'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { INavigatorWithKeyboard } from 'vs/workbench/services/keybinding/common/navigatorKeyboard'; interface ContributedKeyBinding { @@ -149,7 +148,6 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { private _keyboardMapper: IKeyboardMapper; private _cachedResolver: KeybindingResolver | null; private userKeybindings: UserKeybindings; - private _statusBarDisposable: IDisposable = Disposable.None; constructor( @IContextKeyService contextKeyService: IContextKeyService, @@ -161,8 +159,7 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { @IWindowService private readonly windowService: IWindowService, @IExtensionService extensionService: IExtensionService, @IFileService fileService: IFileService, - @IKeymapService private readonly keymapService: IKeymapService, - @IInstantiationService private readonly instantiationService: IInstantiationService + @IKeymapService private readonly keymapService: IKeymapService ) { super(contextKeyService, commandService, telemetryService, notificationService); diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayoutProvider.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayoutProvider.ts index 7ad61056378..8057f5180b3 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayoutProvider.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayoutProvider.ts @@ -67,17 +67,26 @@ interface ISerializedMapping { export class KeyboardLayoutInfo { value: IKeyboardMapping; + isUserKeyboardLayout: boolean; - constructor(public layout: IKeyboardLayoutInfo, public secondaryLayouts: IKeyboardLayoutInfo[], keyboardMapping: ISerializedMapping) { + constructor(public layout: IKeyboardLayoutInfo, public secondaryLayouts: IKeyboardLayoutInfo[], keyboardMapping: ISerializedMapping, isUserKeyboardLayout?: boolean) { this.value = deserializeMapping(keyboardMapping); + this.isUserKeyboardLayout = !!isUserKeyboardLayout; } - static createKeyboardLayoutFromDebugInfo(layout: IKeyboardLayoutInfo, value: IKeyboardMapping): KeyboardLayoutInfo { - let keyboardLayoutInfo = new KeyboardLayoutInfo(layout, [], {}); + static createKeyboardLayoutFromDebugInfo(layout: IKeyboardLayoutInfo, value: IKeyboardMapping, isUserKeyboardLayout?: boolean): KeyboardLayoutInfo { + let keyboardLayoutInfo = new KeyboardLayoutInfo(layout, [], {}, true); keyboardLayoutInfo.value = value; return keyboardLayoutInfo; } + update(other: KeyboardLayoutInfo) { + this.layout = other.layout; + this.secondaryLayouts = other.secondaryLayouts; + this.value = other.value; + this.isUserKeyboardLayout = other.isUserKeyboardLayout; + } + fuzzyEqual(other: IKeyboardMapping): boolean { for (let key in other) { if (isWindows && (key === 'Backslash' || key === 'KeyQ')) { @@ -265,6 +274,19 @@ export class KeyboardLayoutProvider { this._mru.unshift(this._active); } + setActive2(layout: KeyboardLayoutInfo) { + this._active = layout; + + const index = this._mru.indexOf(this._active); + + if (index === 0) { + return; + } + + this._mru.splice(index, 1); + this._mru.unshift(this._active); + } + getMatchedKeyboardLayout(keymap: IKeyboardMapping): KeyboardLayoutInfo | null { // TODO go through mru list instead of _layoutInfos for (let i = 0; i < this._mru.length; i++) { @@ -276,7 +298,14 @@ export class KeyboardLayoutProvider { return null; } - getKeyboardLayouts(): IKeyboardLayoutInfo[] { - return this._layoutInfos.map(info => info.layout); + getKeyboardLayouts(): KeyboardLayoutInfo[] { + return this._layoutInfos; + } + + removeKeyboardLayout(layout: KeyboardLayoutInfo): void { + let index = this._mru.indexOf(layout); + this._mru.splice(index, 1); + index = this._layoutInfos.indexOf(layout); + this._layoutInfos.splice(index, 1); } } diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts index 940d5a126a7..8bdc394d035 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts @@ -6,11 +6,11 @@ import * as nls from 'vs/nls'; import { Emitter, Event } from 'vs/base/common/event'; import { Disposable, toDisposable, IDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; -import { IKeymapService, IKeyboardLayoutInfo, IKeyboardMapping, IWindowsKeyboardMapping } from 'vs/workbench/services/keybinding/common/keymapService'; +import { IKeymapService, IKeyboardLayoutInfo, IKeyboardMapping, IWindowsKeyboardMapping, IWindowsKeyboardLayoutInfo, IMacKeyboardLayoutInfo, ILinuxKeyboardLayoutInfo } from 'vs/workbench/services/keybinding/common/keymapService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { DispatchConfig } from 'vs/workbench/services/keybinding/common/dispatchConfig'; import { IKeyboardMapper, CachedKeyboardMapper } from 'vs/workbench/services/keybinding/common/keyboardMapper'; -import { OS, OperatingSystem, isMacintosh, isWindows } from 'vs/base/common/platform'; +import { OS, OperatingSystem, isMacintosh, isWindows, isLinux } from 'vs/base/common/platform'; import { WindowsKeyboardMapper } from 'vs/workbench/services/keybinding/common/windowsKeyboardMapper'; import { MacLinuxFallbackKeyboardMapper } from 'vs/workbench/services/keybinding/common/macLinuxFallbackKeyboardMapper'; import { IKeyboardEvent } from 'vs/platform/keybinding/common/keybinding'; @@ -49,7 +49,7 @@ export class BrowserKeyboardMapperFactory { import('vs/workbench/services/keybinding/browser/keyboardlayouts/layout.contribution.' + platform).then(() => { this._initialized = true; - this._onKeyboardLayoutChanged(); + this.onKeyboardLayoutChanged(); }); if ((navigator).keyboard && (navigator).keyboard.addEventListener) { @@ -60,13 +60,13 @@ export class BrowserKeyboardMapperFactory { return; } - this._onKeyboardLayoutChanged(); + this.onKeyboardLayoutChanged(); }); }); } } - private _onKeyboardLayoutChanged(): void { + public onKeyboardLayoutChanged(): void { this._updateKeyboardLayoutAsync(this._initialized); } @@ -109,7 +109,7 @@ export class BrowserKeyboardMapperFactory { } public getAllKeyboardLayouts(): IKeyboardLayoutInfo[] { - return KeyboardLayoutProvider.INSTANCE.getKeyboardLayouts(); + return KeyboardLayoutProvider.INSTANCE.getKeyboardLayouts().map(info => info.layout); } public validateCurrentKeyboardMapping(keyboardEvent: IKeyboardEvent): void { @@ -152,7 +152,7 @@ export class BrowserKeyboardMapperFactory { return; } - this._onKeyboardLayoutChanged(); + this.onKeyboardLayoutChanged(); }); }, 350); } @@ -187,6 +187,36 @@ export class BrowserKeyboardMapperFactory { return this._rawMapping; } + public setKeyboardLayout(layoutName: string) { + let allKeyboardLayouts = KeyboardLayoutProvider.INSTANCE.getKeyboardLayouts(); + let matchedLayouts: KeyboardLayoutInfo[] = []; + if (isWindows) { + matchedLayouts = allKeyboardLayouts.filter(layout => (layout.layout).name === layoutName); + } + + if (isMacintosh) { + // todo, probably we should use layout.id? + matchedLayouts = allKeyboardLayouts.filter(layout => (layout.layout).lang === layoutName); + } + + if (isLinux) { + // todo, probably we should use layout.id? + matchedLayouts = allKeyboardLayouts.filter(layout => (layout.layout).layout === layoutName); + } + + if (matchedLayouts.length > 0) { + KeyboardLayoutProvider.INSTANCE.setActive2(matchedLayouts[0]); + + let currentKeyboardLayout = KeyboardLayoutProvider.INSTANCE.activeKeyboardLayout; + + if (currentKeyboardLayout) { + this._setKeyboardData(currentKeyboardLayout.layout, currentKeyboardLayout.value); + + return; + } + } + } + private _setKeyboardData(layoutInfo: IKeyboardLayoutInfo, rawMapping: IKeyboardMapping): void { this._layoutInfo = layoutInfo; this._initialized = true; @@ -343,6 +373,12 @@ class UserKeyboardLayout extends Disposable { })); } + async initialize(): Promise { + const exists = await this.fileService.exists(this.keyboardLayoutResource); + this.onResourceExists(exists); + await this.reload(); + } + private async reload(): Promise { const existing = this._keyboardLayout; try { @@ -350,7 +386,7 @@ class UserKeyboardLayout extends Disposable { const value = parse(content.value.toString()); const layoutInfo = value.layout; const mappings = value.rawMapping; - this._keyboardLayout = KeyboardLayoutInfo.createKeyboardLayoutFromDebugInfo(layoutInfo, mappings); + this._keyboardLayout = KeyboardLayoutInfo.createKeyboardLayoutFromDebugInfo(layoutInfo, mappings, true); } catch (e) { this._keyboardLayout = null; } @@ -427,15 +463,14 @@ class BrowserKeymapService extends Disposable implements IKeymapService { @IFileService fileService: IFileService, ) { super(); - - this._userKeyboardLayout = new UserKeyboardLayout(environmentService.keyboardLayoutResource, fileService); const keyboardConfig = configurationService.getValue<{ layout: string }>('keyboard'); const layout = keyboardConfig.layout; - if (layout === 'autodetect') { + if (!layout || layout === 'autodetect') { this.registerKeyboardListener(); } else { // set keyboard layout + BrowserKeyboardMapperFactory.INSTANCE.setKeyboardLayout(layout); } this._register(configurationService.onDidChangeConfiguration(e => { @@ -445,19 +480,40 @@ class BrowserKeymapService extends Disposable implements IKeymapService { if (layout === 'autodetect') { this.registerKeyboardListener(); - // trigger an update - console.log('auto'); + BrowserKeyboardMapperFactory.INSTANCE.onKeyboardLayoutChanged(); } else { - this.layoutChangeListener.clear(); - // set current layout - console.log(layout); + BrowserKeyboardMapperFactory.INSTANCE.setKeyboardLayout(layout); } } })); + + this._userKeyboardLayout = new UserKeyboardLayout(environmentService.keyboardLayoutResource, fileService); + this._userKeyboardLayout.initialize(); + + if (this._userKeyboardLayout.keyboardLayout) { + KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout(this._userKeyboardLayout.keyboardLayout); + } + + this._register(this._userKeyboardLayout.onDidChange(() => { + let userKeyboardLayouts = KeyboardLayoutProvider.INSTANCE.getKeyboardLayouts().filter(layout => layout.isUserKeyboardLayout); + + if (userKeyboardLayouts.length) { + if (this._userKeyboardLayout.keyboardLayout) { + userKeyboardLayouts[0].update(this._userKeyboardLayout.keyboardLayout); + } else { + KeyboardLayoutProvider.INSTANCE.removeKeyboardLayout(userKeyboardLayouts[0]); + } + } else { + if (this._userKeyboardLayout.keyboardLayout) { + KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout(this._userKeyboardLayout.keyboardLayout); + } + } + + // TODO: trigger keymap update + })); } registerKeyboardListener() { - this.layoutChangeListener.clear(); this.layoutChangeListener.value = BrowserKeyboardMapperFactory.INSTANCE.onDidChangeKeyboardMapper(() => { this._onDidChangeKeyboardMapper.fire(); }); @@ -472,9 +528,6 @@ class BrowserKeymapService extends Disposable implements IKeymapService { } public getAllKeyboardLayouts(): IKeyboardLayoutInfo[] { - if (this._userKeyboardLayout.keyboardLayout) { - return [this._userKeyboardLayout.keyboardLayout.layout, ...BrowserKeyboardMapperFactory.INSTANCE.getAllKeyboardLayouts()]; - } return BrowserKeyboardMapperFactory.INSTANCE.getAllKeyboardLayouts(); } diff --git a/src/vs/workbench/services/keybinding/common/keymapService.ts b/src/vs/workbench/services/keybinding/common/keymapService.ts index ee5b8acab8e..19a73c5b7d6 100644 --- a/src/vs/workbench/services/keybinding/common/keymapService.ts +++ b/src/vs/workbench/services/keybinding/common/keymapService.ts @@ -98,3 +98,27 @@ export interface IKeymapService { getRawKeyboardMapping(): IKeyboardMapping | null; validateCurrentKeyboardMapping(keyboardEvent: IKeyboardEvent): void; } + +export function areKeyboardLayoutsEqual(a: IKeyboardLayoutInfo | null, b: IKeyboardLayoutInfo | null): boolean { + if (!a || !b) { + return false; + } + + if ((a).name && (b).name && (a).name === (b).name) { + return true; + } + + if ((a).id && (b).id && (a).id === (b).id) { + return true; + } + + if ((a).model && + (b).model && + (a).model === (b).model && + (a).layout === (b).layout + ) { + return true; + } + + return false; +} From 9481d84b0d5318aa02fe9da81f816e4cc6b8d201 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Wed, 19 Jun 2019 10:35:53 -0700 Subject: [PATCH 0388/1449] Fix #75784, only target specific icons for exploration --- src/vs/workbench/browser/media/icons.css | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/media/icons.css b/src/vs/workbench/browser/media/icons.css index 1d000db29a0..05465d73aa3 100644 --- a/src/vs/workbench/browser/media/icons.css +++ b/src/vs/workbench/browser/media/icons.css @@ -67,8 +67,13 @@ body[data-exploration^="icon-exploration"] .monaco-workbench .part > .title > .t body[data-exploration^="icon-exploration"] .monaco-workbench .part > .title > .title-actions .actions-container[aria-label="Source Control: Git actions"] .icon[data-title="git.refresh"], body[data-exploration^="icon-exploration"] .monaco-workbench .part > .title > .title-actions .actions-container[aria-label="Debug actions"] .icon, body[data-exploration^="icon-exploration"] .monaco-workbench .part > .title > .title-actions .actions-container[aria-label^="Extensions"] .icon, -body[data-exploration^="icon-exploration"] .scm-viewlet .monaco-list-row > .resource-group > .actions .action-label[data-title^="git."], -body[data-exploration^="icon-exploration"] .scm-viewlet .monaco-list-row > .resource > .name > .monaco-icon-label > .actions .action-label, +body[data-exploration^="icon-exploration"] .scm-viewlet .monaco-list-row > .resource > .name > .monaco-icon-label > .actions .action-label[data-title^="git.unstage"], +body[data-exploration^="icon-exploration"] .scm-viewlet .monaco-list-row > .resource > .name > .monaco-icon-label > .actions .action-label[data-title^="git.stage"], +body[data-exploration^="icon-exploration"] .scm-viewlet .monaco-list-row > .resource > .name > .monaco-icon-label > .actions .action-label[data-title^="git.openChange"], +body[data-exploration^="icon-exploration"] .scm-viewlet .monaco-list-row > .resource > .name > .monaco-icon-label > .actions .action-label[data-title^="git.clean"], +body[data-exploration^="icon-exploration"] .scm-viewlet .monaco-list-row > .resource-group > .actions .action-label[data-title="git.cleanAll"], +body[data-exploration^="icon-exploration"] .scm-viewlet .monaco-list-row > .resource-group > .actions .action-label[data-title="git.stageAll"], +body[data-exploration^="icon-exploration"] .scm-viewlet .monaco-list-row > .resource-group > .actions .action-label[data-title="git.unstageAll"], body[data-exploration^="icon-exploration"] .monaco-workbench .part > .content > .debug-viewlet .actions .action-label.icon, body[data-exploration^="icon-exploration"] .monaco-workbench .debug-toolbar .drag-area, body[data-exploration^="icon-exploration"] .monaco-workbench .debug-toolbar .action-label, From 40bbb20c6006e619e47f29c337ff62a9585b18bd Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 19 Jun 2019 11:03:14 -0700 Subject: [PATCH 0389/1449] Update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f4b162d2c4f..6916b4088ec 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "09333a710f6609d785037c9edce88a4fda48bfb2", + "distro": "26125d2b5b10bac3b3de09f4ee565ea4d5c1c7bc", "author": { "name": "Microsoft Corporation" }, From 3ccdd1e63d4819349903e17019264b954e56db44 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 19 Jun 2019 11:55:53 -0700 Subject: [PATCH 0390/1449] Add (Local) to the local terminal title Part of microsoft/vscode-remote-release#730 --- src/vs/workbench/contrib/terminal/node/terminalRemote.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/vs/workbench/contrib/terminal/node/terminalRemote.ts b/src/vs/workbench/contrib/terminal/node/terminalRemote.ts index 9b849a12833..e264cdfdd5d 100644 --- a/src/vs/workbench/contrib/terminal/node/terminalRemote.ts +++ b/src/vs/workbench/contrib/terminal/node/terminalRemote.ts @@ -34,6 +34,15 @@ export class CreateNewLocalTerminalAction extends Action { if (!instance) { return Promise.resolve(undefined); } + + // Append (Local) to the first title that comes back, the title will then become static + const disposable = instance.onTitleChanged(() => { + if (instance.title && instance.title.trim().length > 0) { + disposable.dispose(); + instance.setTitle(`${instance.title} (Local)`, false); + } + }); + this.terminalService.setActiveInstance(instance); return this.terminalService.showPanel(true); } From a24d186db848a902e38ca2556096583ad443e067 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Wed, 19 Jun 2019 12:01:06 -0700 Subject: [PATCH 0391/1449] refactor, move keyboard layout provider into keymapper factory --- .../browser/keyboardLayoutPicker.ts | 41 ++- .../browser/keyboardLayoutProvider.ts | 311 ------------------ .../browser/keyboardLayouts/_.contribution.ts | 23 ++ .../browser/keyboardLayouts/cz.win.ts | 5 +- .../browser/keyboardLayouts/de-swiss.win.ts | 5 +- .../browser/keyboardLayouts/de.darwin.ts | 5 +- .../browser/keyboardLayouts/de.linux.ts | 5 +- .../browser/keyboardLayouts/de.win.ts | 5 +- .../browser/keyboardLayouts/dk.win.ts | 5 +- .../browser/keyboardLayouts/en-belgian.win.ts | 5 +- .../browser/keyboardLayouts/en-ext.darwin.ts | 5 +- .../browser/keyboardLayouts/en-in.win.ts | 5 +- .../browser/keyboardLayouts/en-intl.darwin.ts | 5 +- .../browser/keyboardLayouts/en-intl.win.ts | 5 +- .../browser/keyboardLayouts/en-uk.darwin.ts | 5 +- .../browser/keyboardLayouts/en-uk.win.ts | 5 +- .../browser/keyboardLayouts/en.darwin.ts | 5 +- .../browser/keyboardLayouts/en.linux.ts | 5 +- .../browser/keyboardLayouts/en.win.ts | 5 +- .../browser/keyboardLayouts/es-latin.win.ts | 5 +- .../browser/keyboardLayouts/es.darwin.ts | 5 +- .../browser/keyboardLayouts/es.linux.ts | 5 +- .../browser/keyboardLayouts/es.win.ts | 5 +- .../browser/keyboardLayouts/fr.darwin.ts | 5 +- .../browser/keyboardLayouts/fr.linux.ts | 5 +- .../browser/keyboardLayouts/fr.win.ts | 5 +- .../browser/keyboardLayouts/hu.win.ts | 5 +- .../browser/keyboardLayouts/it.darwin.ts | 5 +- .../browser/keyboardLayouts/it.win.ts | 5 +- .../keyboardLayouts/jp-roman.darwin.ts | 5 +- .../browser/keyboardLayouts/jp.darwin.ts | 5 +- .../browser/keyboardLayouts/ko.darwin.ts | 5 +- .../browser/keyboardLayouts/no.win.ts | 5 +- .../browser/keyboardLayouts/pl.darwin.ts | 5 +- .../browser/keyboardLayouts/pl.win.ts | 5 +- .../browser/keyboardLayouts/pt-br.win.ts | 5 +- .../browser/keyboardLayouts/pt.darwin.ts | 5 +- .../browser/keyboardLayouts/pt.win.ts | 5 +- .../browser/keyboardLayouts/ru.darwin.ts | 5 +- .../browser/keyboardLayouts/ru.linux.ts | 5 +- .../browser/keyboardLayouts/ru.win.ts | 5 +- .../browser/keyboardLayouts/sv.darwin.ts | 5 +- .../browser/keyboardLayouts/sv.win.ts | 5 +- .../browser/keyboardLayouts/thai.win.ts | 5 +- .../browser/keyboardLayouts/tr.win.ts | 5 +- .../browser/keyboardLayouts/zh-hans.darwin.ts | 5 +- ...boardLayoutService.ts => keymapService.ts} | 300 ++++++++++------- .../services/keybinding/common/keymapInfo.ts | 110 +++++++ src/vs/workbench/workbench.web.main.ts | 2 +- 49 files changed, 469 insertions(+), 533 deletions(-) delete mode 100644 src/vs/workbench/services/keybinding/browser/keyboardLayoutProvider.ts create mode 100644 src/vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution.ts rename src/vs/workbench/services/keybinding/browser/{keyboardLayoutService.ts => keymapService.ts} (78%) create mode 100644 src/vs/workbench/services/keybinding/common/keymapInfo.ts diff --git a/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts b/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts index 6536b626fa7..b05c5974a98 100644 --- a/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts +++ b/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts @@ -33,27 +33,40 @@ export class KeyboardLayoutPickerContribution extends Disposable implements IWor super(); let layout = this.keymapService.getCurrentKeyboardLayout(); - let layoutInfo = (layout).text || (layout).lang || (layout).model; - this.pickerElement.value = this.statusbarService.addEntry( - { - text: `Layout: ${layoutInfo}`, - // tooltip: nls.localize('keyboard.layout.tooltip', "If you are not using a Screen Reader, please change the setting `editor.accessibilitySupport` to \"off\"."), - command: KEYBOARD_LAYOUT_OPEN_PICKER - }, - 'status.editor.screenReaderMode', - nls.localize('status.editor.screenReaderMode', "Screen Reader Mode"), - StatusbarAlignment.RIGHT - ); + if (layout) { + let layoutInfo = (layout).text || (layout).lang || (layout).model; + this.pickerElement.value = this.statusbarService.addEntry( + { + text: `Layout: ${layoutInfo}`, + // tooltip: nls.localize('keyboard.layout.tooltip', "If you are not using a Screen Reader, please change the setting `editor.accessibilitySupport` to \"off\"."), + command: KEYBOARD_LAYOUT_OPEN_PICKER + }, + 'status.editor.screenReaderMode', + nls.localize('status.editor.screenReaderMode', "Screen Reader Mode"), + StatusbarAlignment.RIGHT + ); + } this._register(keymapService.onDidChangeKeyboardMapper(() => { - if (this.pickerElement.value) { - let layout = this.keymapService.getCurrentKeyboardLayout(); - let layoutInfo = (layout).text || (layout).lang || (layout).model; + let layout = this.keymapService.getCurrentKeyboardLayout(); + let layoutInfo = (layout).text || (layout).lang || (layout).model; + if (this.pickerElement.value) { this.pickerElement.value.update({ text: `Layout: ${layoutInfo}`, command: KEYBOARD_LAYOUT_OPEN_PICKER }); + } else { + this.pickerElement.value = this.statusbarService.addEntry( + { + text: `Layout: ${layoutInfo}`, + // tooltip: nls.localize('keyboard.layout.tooltip', "If you are not using a Screen Reader, please change the setting `editor.accessibilitySupport` to \"off\"."), + command: KEYBOARD_LAYOUT_OPEN_PICKER + }, + 'status.editor.screenReaderMode', + nls.localize('status.editor.screenReaderMode', "Screen Reader Mode"), + StatusbarAlignment.RIGHT + ); } })); } diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayoutProvider.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayoutProvider.ts deleted file mode 100644 index 8057f5180b3..00000000000 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayoutProvider.ts +++ /dev/null @@ -1,311 +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 { IKeyboardLayoutInfo } from 'vs/workbench/services/keybinding/common/keymapService'; -import { isWindows } from 'vs/base/common/platform'; - -function deserializeMapping(serializedMapping: ISerializedMapping) { - let mapping = serializedMapping; - - let ret = {}; - for (let key in mapping) { - let result: (string | number)[] = mapping[key]; - if (result.length) { - let value = result[0]; - let withShift = result[1]; - let withAltGr = result[2]; - let withShiftAltGr = result[3]; - let mask = Number(result[4]); - let vkey = result.length === 6 ? result[5] : undefined; - ret[key] = { - 'value': value, - 'vkey': vkey, - 'withShift': withShift, - 'withAltGr': withAltGr, - 'withShiftAltGr': withShiftAltGr, - 'valueIsDeadKey': (mask & 1) > 0, - 'withShiftIsDeadKey': (mask & 2) > 0, - 'withAltGrIsDeadKey': (mask & 4) > 0, - 'withShiftAltGrIsDeadKey': (mask & 8) > 0 - }; - } else { - ret[key] = { - 'value': '', - 'valueIsDeadKey': false, - 'withShift': '', - 'withShiftIsDeadKey': false, - 'withAltGr': '', - 'withAltGrIsDeadKey': false, - 'withShiftAltGr': '', - 'withShiftAltGrIsDeadKey': false - }; - } - } - - return ret; -} - -interface IKeyboardMapping { - [key: string]: { - value: string, - withShift: string; - withAltGr: string; - withShiftAltGr: string; - valueIsDeadKey?: boolean; - withShiftIsDeadKey?: boolean; - withAltGrIsDeadKey?: boolean; - withShiftAltGrIsDeadKey?: boolean; - - }; -} - -interface ISerializedMapping { - [key: string]: (string | number)[]; -} - -export class KeyboardLayoutInfo { - value: IKeyboardMapping; - isUserKeyboardLayout: boolean; - - constructor(public layout: IKeyboardLayoutInfo, public secondaryLayouts: IKeyboardLayoutInfo[], keyboardMapping: ISerializedMapping, isUserKeyboardLayout?: boolean) { - this.value = deserializeMapping(keyboardMapping); - this.isUserKeyboardLayout = !!isUserKeyboardLayout; - } - - static createKeyboardLayoutFromDebugInfo(layout: IKeyboardLayoutInfo, value: IKeyboardMapping, isUserKeyboardLayout?: boolean): KeyboardLayoutInfo { - let keyboardLayoutInfo = new KeyboardLayoutInfo(layout, [], {}, true); - keyboardLayoutInfo.value = value; - return keyboardLayoutInfo; - } - - update(other: KeyboardLayoutInfo) { - this.layout = other.layout; - this.secondaryLayouts = other.secondaryLayouts; - this.value = other.value; - this.isUserKeyboardLayout = other.isUserKeyboardLayout; - } - - fuzzyEqual(other: IKeyboardMapping): boolean { - for (let key in other) { - if (isWindows && (key === 'Backslash' || key === 'KeyQ')) { - // keymap from Chromium is probably wrong. - continue; - } - if (this.value[key] === undefined) { - return false; - } - - let currentMapping = this.value[key]; - let otherMapping = other[key]; - - if (currentMapping.value !== otherMapping.value) { - return false; - } - } - - return true; - } -} - -export const EN_US = new KeyboardLayoutInfo( - { id: 'com.apple.keylayout.US', lang: 'en' }, - [], - { - KeyA: ['a', 'A', 'å', 'Å', 0], - KeyB: ['b', 'B', '∫', 'ı', 0], - KeyC: ['c', 'C', 'ç', 'Ç', 0], - KeyD: ['d', 'D', '∂', 'Î', 0], - KeyE: ['e', 'E', '´', '´', 4], - KeyF: ['f', 'F', 'ƒ', 'Ï', 0], - KeyG: ['g', 'G', '©', '˝', 0], - KeyH: ['h', 'H', '˙', 'Ó', 0], - KeyI: ['i', 'I', 'ˆ', 'ˆ', 4], - KeyJ: ['j', 'J', '∆', 'Ô', 0], - KeyK: ['k', 'K', '˚', '', 0], - KeyL: ['l', 'L', '¬', 'Ò', 0], - KeyM: ['m', 'M', 'µ', 'Â', 0], - KeyN: ['n', 'N', '˜', '˜', 4], - KeyO: ['o', 'O', 'ø', 'Ø', 0], - KeyP: ['p', 'P', 'π', '∏', 0], - KeyQ: ['q', 'Q', 'œ', 'Œ', 0], - KeyR: ['r', 'R', '®', '‰', 0], - KeyS: ['s', 'S', 'ß', 'Í', 0], - KeyT: ['t', 'T', '†', 'ˇ', 0], - KeyU: ['u', 'U', '¨', '¨', 4], - KeyV: ['v', 'V', '√', '◊', 0], - KeyW: ['w', 'W', '∑', '„', 0], - KeyX: ['x', 'X', '≈', '˛', 0], - KeyY: ['y', 'Y', '¥', 'Á', 0], - KeyZ: ['z', 'Z', 'Ω', '¸', 0], - Digit1: ['1', '!', '¡', '⁄', 0], - Digit2: ['2', '@', '™', '€', 0], - Digit3: ['3', '#', '£', '‹', 0], - Digit4: ['4', '$', '¢', '›', 0], - Digit5: ['5', '%', '∞', 'fi', 0], - Digit6: ['6', '^', '§', 'fl', 0], - Digit7: ['7', '&', '¶', '‡', 0], - Digit8: ['8', '*', '•', '°', 0], - Digit9: ['9', '(', 'ª', '·', 0], - Digit0: ['0', ')', 'º', '‚', 0], - Enter: [], - Escape: [], - Backspace: [], - Tab: [], - Space: [' ', ' ', ' ', ' ', 0], - Minus: ['-', '_', '–', '—', 0], - Equal: ['=', '+', '≠', '±', 0], - BracketLeft: ['[', '{', '“', '”', 0], - BracketRight: [']', '}', '‘', '’', 0], - Backslash: ['\\', '|', '«', '»', 0], - Semicolon: [';', ':', '…', 'Ú', 0], - Quote: ['\'', '"', 'æ', 'Æ', 0], - Backquote: ['`', '~', '`', '`', 4], - Comma: [',', '<', '≤', '¯', 0], - Period: ['.', '>', '≥', '˘', 0], - Slash: ['/', '?', '÷', '¿', 0], - CapsLock: [], - F1: [], - F2: [], - F3: [], - F4: [], - F5: [], - F6: [], - F7: [], - F8: [], - F9: [], - F10: [], - F11: [], - F12: [], - Insert: [], - Home: [], - PageUp: [], - Delete: [], - End: [], - PageDown: [], - ArrowRight: [], - ArrowLeft: [], - ArrowDown: [], - ArrowUp: [], - NumLock: [], - NumpadDivide: ['/', '/', '/', '/', 0], - NumpadMultiply: ['*', '*', '*', '*', 0], - NumpadSubtract: ['-', '-', '-', '-', 0], - NumpadAdd: ['+', '+', '+', '+', 0], - NumpadEnter: [], - Numpad1: ['1', '1', '1', '1', 0], - Numpad2: ['2', '2', '2', '2', 0], - Numpad3: ['3', '3', '3', '3', 0], - Numpad4: ['4', '4', '4', '4', 0], - Numpad5: ['5', '5', '5', '5', 0], - Numpad6: ['6', '6', '6', '6', 0], - Numpad7: ['7', '7', '7', '7', 0], - Numpad8: ['8', '8', '8', '8', 0], - Numpad9: ['9', '9', '9', '9', 0], - Numpad0: ['0', '0', '0', '0', 0], - NumpadDecimal: ['.', '.', '.', '.', 0], - IntlBackslash: ['§', '±', '§', '±', 0], - ContextMenu: [], - NumpadEqual: ['=', '=', '=', '=', 0], - F13: [], - F14: [], - F15: [], - F16: [], - F17: [], - F18: [], - F19: [], - F20: [], - AudioVolumeMute: [], - AudioVolumeUp: ['', '=', '', '=', 0], - AudioVolumeDown: [], - NumpadComma: [], - IntlRo: [], - KanaMode: [], - IntlYen: [], - ControlLeft: [], - ShiftLeft: [], - AltLeft: [], - MetaLeft: [], - ControlRight: [], - ShiftRight: [], - AltRight: [], - MetaRight: [] - } -); - -export class KeyboardLayoutProvider { - public static readonly INSTANCE: KeyboardLayoutProvider = new KeyboardLayoutProvider(); - - private _layoutInfos: KeyboardLayoutInfo[] = []; - private _mru: KeyboardLayoutInfo[] = []; - private _active: KeyboardLayoutInfo | null; - - private constructor() { - this._active = null; - } - - registerKeyboardLayout(layout: KeyboardLayoutInfo) { - this._layoutInfos.push(layout); - this._mru = this._layoutInfos; - } - - get activeKeyboardLayout() { - return this._active; - } - - isActive(keymap: IKeyboardMapping) { - return this._active && this._active.fuzzyEqual(keymap); - } - - setActive(keymap: IKeyboardMapping) { - this._active = this.getMatchedKeyboardLayout(keymap); - - if (!this._active) { - return; - } - const index = this._mru.indexOf(this._active); - - if (index === 0) { - return; - } - - this._mru.splice(index, 1); - this._mru.unshift(this._active); - } - - setActive2(layout: KeyboardLayoutInfo) { - this._active = layout; - - const index = this._mru.indexOf(this._active); - - if (index === 0) { - return; - } - - this._mru.splice(index, 1); - this._mru.unshift(this._active); - } - - getMatchedKeyboardLayout(keymap: IKeyboardMapping): KeyboardLayoutInfo | null { - // TODO go through mru list instead of _layoutInfos - for (let i = 0; i < this._mru.length; i++) { - if (this._mru[i].fuzzyEqual(keymap)) { - return this._mru[i]; - } - } - - return null; - } - - getKeyboardLayouts(): KeyboardLayoutInfo[] { - return this._layoutInfos; - } - - removeKeyboardLayout(layout: KeyboardLayoutInfo): void { - let index = this._mru.indexOf(layout); - this._mru.splice(index, 1); - index = this._layoutInfos.indexOf(layout); - this._layoutInfos.splice(index, 1); - } -} diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution.ts new file mode 100644 index 00000000000..846b6023774 --- /dev/null +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution.ts @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; + +export class KeyboardLayoutContribution { + public static readonly INSTANCE: KeyboardLayoutContribution = new KeyboardLayoutContribution(); + + private _layoutInfos: KeymapInfo[] = []; + + get layoutInfos() { + return this._layoutInfos; + } + + private constructor() { + } + + registerKeyboardLayout(layout: KeymapInfo) { + this._layoutInfos.push(layout); + } +} \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/cz.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/cz.win.ts index 1908441eceb..8d560875c61 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/cz.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/cz.win.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( { name: '00000405', id: '', text: 'Czech' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de-swiss.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de-swiss.win.ts index 44d82a33db5..b7d6467220a 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de-swiss.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de-swiss.win.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( { name: '00000807', id: '', text: 'Swiss German' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.darwin.ts index aa796ffa236..573f8094664 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.darwin.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout(new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( { id: 'com.apple.keylayout.German', lang: 'de' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.linux.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.linux.ts index 780c2785ac4..2f7f85af3ca 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.linux.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.linux.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout(new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( { model: 'pc104', layout: 'de', variant: '', options: '', rules: 'base' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.win.ts index 5f304096a0e..0bf3c61618e 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.win.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( { name: '00000407', id: '', text: 'German' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/dk.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/dk.win.ts index f75d21328df..34f7f3103a7 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/dk.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/dk.win.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( { name: '00000406', id: '', text: 'Danish' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-belgian.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-belgian.win.ts index 19b8f554303..6e5cae52518 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-belgian.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-belgian.win.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( { name: '00000813', id: '', text: 'Belgian (Period)' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-ext.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-ext.darwin.ts index 3409ffa2469..91bc1741acf 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-ext.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-ext.darwin.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout(new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( { id: 'com.apple.keylayout.USExtended', lang: 'en' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-in.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-in.win.ts index 7cd020c8087..d3ad3786dcb 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-in.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-in.win.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( { name: '00004009', id: '', text: 'India' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-intl.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-intl.darwin.ts index 8b740fd65d8..cdbcf3bcfd2 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-intl.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-intl.darwin.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout(new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( { id: 'com.apple.keylayout.USInternational-PC', lang: 'en' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-intl.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-intl.win.ts index 019d09d7f67..ce5ade144e2 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-intl.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-intl.win.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( { name: '00020409', id: '0001', text: 'United States-International' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-uk.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-uk.darwin.ts index 444c61e111a..e50f8830397 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-uk.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-uk.darwin.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout(new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( { id: 'com.apple.keylayout.British', lang: 'en' }, [], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-uk.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-uk.win.ts index f8b26f6493a..d3aa6995fb9 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-uk.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-uk.win.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( { name: '00000809', id: '', text: 'United Kingdom' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.darwin.ts index 54b5f4f135b..fabf23b5864 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.darwin.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout(new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( { id: 'com.apple.keylayout.US', lang: 'en' }, [ { id: 'com.apple.keylayout.ABC', lang: 'en' }, diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.linux.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.linux.ts index 6c56ce8e50d..ae5e356006a 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.linux.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.linux.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout(new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( { model: 'pc105', layout: 'us', variant: '', options: '', rules: 'evdev' }, [ { model: 'pc105', layout: 'cn', variant: '', options: '', rules: 'evdev' }, diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.win.ts index cfb7709c627..cb7e8e42da2 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.win.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( { name: '00000409', id: '', text: 'US' }, [ { name: '00000804', id: '', text: 'Chinese (Simplified) - US Keyboard' }, diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es-latin.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es-latin.win.ts index b7a0251226f..6234c454280 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es-latin.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es-latin.win.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( { name: '0000080A', id: '', text: 'Latin American' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.darwin.ts index 8f78ab6957d..ecc0004d078 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.darwin.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout(new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( { id: 'com.apple.keylayout.Spanish-ISO', lang: 'es' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.linux.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.linux.ts index 7d522fa9eb0..1b4f4d94858 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.linux.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.linux.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout(new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( { model: 'pc105', layout: 'es', variant: '', options: '', rules: 'evdev' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.win.ts index 7902f93b24b..8fea58dc872 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.win.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( { name: '0000040A', id: '', text: 'Spanish' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.darwin.ts index b1c4f4e95dc..6b47127cec6 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.darwin.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout(new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( { id: 'com.apple.keylayout.French', lang: 'fr' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.linux.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.linux.ts index 683a59a9b8e..7c857332595 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.linux.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.linux.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout(new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( { model: 'pc104', layout: 'fr', variant: '', options: '', rules: 'base' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.win.ts index 6f3e5882160..b056c38ff2d 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.win.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( { name: '0000040C', id: '', text: 'French' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/hu.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/hu.win.ts index fb069ab561b..ebcce4786fd 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/hu.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/hu.win.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( { name: '0000040E', id: '', text: 'Hungarian' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/it.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/it.darwin.ts index 4d1b13922e5..8cb9dc8f995 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/it.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/it.darwin.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout(new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( { id: 'com.apple.keylayout.Italian-Pro', lang: 'it' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/it.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/it.win.ts index 88de00a2ccc..1b0636f02ab 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/it.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/it.win.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( { name: '00000410', id: '', text: 'Italian' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/jp-roman.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/jp-roman.darwin.ts index e0efe49090f..8f90af0bea9 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/jp-roman.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/jp-roman.darwin.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout(new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( { id: 'com.google.inputmethod.Japanese.Roman', lang: 'en' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/jp.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/jp.darwin.ts index d50fcfb98b9..a48e202b4fb 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/jp.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/jp.darwin.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout(new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( { id: 'com.apple.inputmethod.Kotoeri.Japanese', lang: 'ja' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ko.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ko.darwin.ts index 683a0620dd4..d79920103d6 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ko.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ko.darwin.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout(new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( { id: 'com.apple.inputmethod.Korean.2SetKorean', lang: 'ko' }, [], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/no.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/no.win.ts index da7134a5516..7183b0fbe9f 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/no.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/no.win.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( { name: '00000414', id: '', text: 'Norwegian' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pl.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pl.darwin.ts index 7d97909583d..75bac351170 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pl.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pl.darwin.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout(new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( { id: 'com.apple.keylayout.PolishPro', lang: 'pl' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pl.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pl.win.ts index 8d91f5cf72a..9d0576fc4f2 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pl.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pl.win.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( { name: '00000415', id: '', text: 'Polish (Programmers)' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt-br.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt-br.win.ts index 5007c43b7d3..b5886ffc968 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt-br.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt-br.win.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( { name: '00000416', id: '', text: 'Portuguese (Brazilian ABNT)' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt.darwin.ts index 6f5356ddb8f..9a0baec47d2 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt.darwin.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout(new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( { id: 'com.apple.keylayout.Brazilian-Pro', lang: 'pt' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt.win.ts index 74dfa547d94..2d1c72c89b9 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt.win.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( { name: '00000816', id: '', text: 'Portuguese' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.darwin.ts index 7a68e2536bb..afecb02810d 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.darwin.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout(new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( { id: 'com.apple.keylayout.Russian', lang: 'ru' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.linux.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.linux.ts index a1203ca2870..c086909149a 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.linux.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.linux.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout(new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( { model: 'pc104', layout: 'ru', variant: ',', options: '', rules: 'base' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.win.ts index cfc3ac1631f..dfe753aacb0 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.win.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( { name: '00000419', id: '', text: 'Russian' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/sv.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/sv.darwin.ts index 512d940e437..e5b57ab30a3 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/sv.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/sv.darwin.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout(new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( { id: 'com.apple.keylayout.Swedish-Pro', lang: 'sv' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/sv.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/sv.win.ts index 74f52703c99..729d9a13bb0 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/sv.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/sv.win.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( { name: '0000041D', id: '', text: 'Swedish' }, [ { name: '0000040B', id: '', text: 'Finnish' } diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/thai.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/thai.win.ts index 36a05f22e41..013b7ac64f7 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/thai.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/thai.win.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( { name: '0000041E', id: '', text: 'Thai Kedmanee' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/tr.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/tr.win.ts index 9708d7e6622..058ef5592ae 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/tr.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/tr.win.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout((new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( { name: '0000041F', id: '', text: 'Turkish Q' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/zh-hans.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/zh-hans.darwin.ts index 30d7246fa0d..cf8bfbf0ac6 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/zh-hans.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/zh-hans.darwin.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout(new KeyboardLayoutInfo( +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( { id: 'com.apple.inputmethod.SCIM.ITABC', lang: 'zh-Hans' }, [], { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts b/src/vs/workbench/services/keybinding/browser/keymapService.ts similarity index 78% rename from src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts rename to src/vs/workbench/services/keybinding/browser/keymapService.ts index 8bdc394d035..bd005db83b8 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts +++ b/src/vs/workbench/services/keybinding/browser/keymapService.ts @@ -17,7 +17,6 @@ import { IKeyboardEvent } from 'vs/platform/keybinding/common/keybinding'; import { KeyCodeUtils, KeyCode } from 'vs/base/common/keyCodes'; import { IMacLinuxKeyboardMapping, MacLinuxKeyboardMapper } from 'vs/workbench/services/keybinding/common/macLinuxKeyboardMapper'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import { KeyboardLayoutProvider, KeyboardLayoutInfo } from 'vs/workbench/services/keybinding/browser/keyboardLayoutProvider'; import { URI } from 'vs/base/common/uri'; import { IFileService, FileChangesEvent, FileChangeType } from 'vs/platform/files/common/files'; import { RunOnceScheduler } from 'vs/base/common/async'; @@ -29,25 +28,58 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as ConfigExtensions, IConfigurationRegistry, IConfigurationNode } from 'vs/platform/configuration/common/configurationRegistry'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { INavigatorWithKeyboard } from 'vs/workbench/services/keybinding/common/navigatorKeyboard'; +import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; +import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; export class BrowserKeyboardMapperFactory { public static readonly INSTANCE = new BrowserKeyboardMapperFactory(); - private _layoutInfo: IKeyboardLayoutInfo | null; - private _rawMapping: IKeyboardMapping | null; - private _keyboardMapper: IKeyboardMapper | null; + // keyboard mapper private _initialized: boolean; + private _keyboardMapper: IKeyboardMapper | null; private readonly _onDidChangeKeyboardMapper = new Emitter(); public readonly onDidChangeKeyboardMapper: Event = this._onDidChangeKeyboardMapper.event; + // keymap infos + private _keymapInfos: KeymapInfo[]; + private _mru: KeymapInfo[]; + private _activeKeymapInfo: KeymapInfo | null; + + get keymapInfos(): KeymapInfo[] { + return this._keymapInfos; + } + + get activeKeyboardLayout(): IKeyboardLayoutInfo | null { + if (!this._initialized) { + return null; + } + + return this._activeKeymapInfo && this._activeKeymapInfo.layout; + } + + get activeKeyMapping(): IKeyboardMapping | null { + if (!this._initialized) { + return null; + } + + return this._activeKeymapInfo && this._activeKeymapInfo.mapping; + } + + get keyboardLayouts(): IKeyboardLayoutInfo[] { + return this._keymapInfos.map(keymapInfo => keymapInfo.layout); + } + private constructor() { - this._layoutInfo = null; - this._rawMapping = null; this._keyboardMapper = null; this._initialized = false; + this._keymapInfos = []; + this._mru = []; + this._activeKeymapInfo = null; const platform = isWindows ? 'win' : isMacintosh ? 'darwin' : 'linux'; - import('vs/workbench/services/keybinding/browser/keyboardlayouts/layout.contribution.' + platform).then(() => { + import('vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.' + platform).then(() => { + this._keymapInfos.push(...KeyboardLayoutContribution.INSTANCE.layoutInfos); + this._mru = this._keymapInfos; this._initialized = true; this.onKeyboardLayoutChanged(); }); @@ -55,8 +87,8 @@ export class BrowserKeyboardMapperFactory { if ((navigator).keyboard && (navigator).keyboard.addEventListener) { (navigator).keyboard.addEventListener!('layoutchange', () => { // Update user keyboard map settings - this.getBrowserKeyMap().then((keymap: IKeyboardMapping) => { - if (KeyboardLayoutProvider.INSTANCE.isActive(keymap)) { + this._getBrowserKeyMapping().then((mapping: IKeyboardMapping) => { + if (this.isKeyMappingActive(mapping)) { return; } @@ -66,6 +98,62 @@ export class BrowserKeyboardMapperFactory { } } + registerKeyboardLayout(layout: KeymapInfo) { + this._keymapInfos.push(layout); + this._mru = this._keymapInfos; + } + + removeKeyboardLayout(layout: KeymapInfo): void { + let index = this._mru.indexOf(layout); + this._mru.splice(index, 1); + index = this._keymapInfos.indexOf(layout); + this._keymapInfos.splice(index, 1); + } + + getMatchedKeymapInfo(keyMapping: IKeyboardMapping): KeymapInfo | null { + for (let i = 0; i < this._mru.length; i++) { + if (this._mru[i].fuzzyEqual(keyMapping)) { + return this._mru[i]; + } + } + + return null; + } + + isKeyMappingActive(keymap: IKeyboardMapping) { + return this._activeKeymapInfo && this._activeKeymapInfo.fuzzyEqual(keymap); + } + + setActiveKeyMapping(keymap: IKeyboardMapping) { + this._activeKeymapInfo = this.getMatchedKeymapInfo(keymap); + + if (!this._activeKeymapInfo) { + return; + } + + const index = this._mru.indexOf(this._activeKeymapInfo); + + this._mru.splice(index, 1); + this._mru.unshift(this._activeKeymapInfo); + + this._setKeyboardData(this._activeKeymapInfo); + } + + setActiveKeymapInfo(keymapInfo: KeymapInfo) { + this._activeKeymapInfo = keymapInfo; + + const index = this._mru.indexOf(this._activeKeymapInfo); + + if (index === 0) { + return; + } + + this._mru.splice(index, 1); + this._mru.unshift(this._activeKeymapInfo); + + this._setKeyboardData(this._activeKeymapInfo); + } + public onKeyboardLayoutChanged(): void { this._updateKeyboardLayoutAsync(this._initialized); } @@ -75,17 +163,12 @@ export class BrowserKeyboardMapperFactory { return; } - this.getBrowserKeyMap().then(keyMap => { + this._getBrowserKeyMapping().then(keyMap => { // might be false positive - if (KeyboardLayoutProvider.INSTANCE.isActive(keyMap)) { + if (this.isKeyMappingActive(keyMap)) { return; } - KeyboardLayoutProvider.INSTANCE.setActive(keyMap); - let currentKeyboardLayout = KeyboardLayoutProvider.INSTANCE.activeKeyboardLayout; - - if (currentKeyboardLayout) { - this._setKeyboardData(currentKeyboardLayout.layout, keyMap); - } + this.setActiveKeyMapping(keyMap); }); } @@ -101,17 +184,6 @@ export class BrowserKeyboardMapperFactory { } - public getCurrentKeyboardLayout(): IKeyboardLayoutInfo | null { - if (!this._initialized) { - return null; - } - return this._layoutInfo; - } - - public getAllKeyboardLayouts(): IKeyboardLayoutInfo[] { - return KeyboardLayoutProvider.INSTANCE.getKeyboardLayouts().map(info => info.layout); - } - public validateCurrentKeyboardMapping(keyboardEvent: IKeyboardEvent): void { if (!this._initialized) { return; @@ -126,18 +198,75 @@ export class BrowserKeyboardMapperFactory { this._updateKeyboardLayoutAsync(true); } + public setKeyboardLayout(layoutName: string) { + let allKeyboardLayouts = this.keymapInfos; + let matchedLayouts: KeymapInfo[] = []; + if (isWindows) { + matchedLayouts = allKeyboardLayouts.filter(layout => (layout.layout).name === layoutName); + } + + if (isMacintosh) { + // todo, probably we should use layout.id? + matchedLayouts = allKeyboardLayouts.filter(layout => (layout.layout).lang === layoutName); + } + + if (isLinux) { + // todo, probably we should use layout.id? + matchedLayouts = allKeyboardLayouts.filter(layout => (layout.layout).layout === layoutName); + } + + if (matchedLayouts.length > 0) { + this.setActiveKeymapInfo(matchedLayouts[0]); + } + } + + private _setKeyboardData(keymapInfo: KeymapInfo): void { + this._initialized = true; + + this._keyboardMapper = new CachedKeyboardMapper(BrowserKeyboardMapperFactory._createKeyboardMapper(keymapInfo.mapping)); + this._onDidChangeKeyboardMapper.fire(); + } + + private static _isUSStandard(rawMapping: IKeyboardMapping): boolean { + for (let key in rawMapping) { + let str = rawMapping[key].value; + let keyCode = KeyCodeUtils.fromString(str); + let usKeyCode = US_SCANCODE_MAP[key]; + + if (keyCode !== usKeyCode) { + return false; + } + + } + return true; + } + + private static _createKeyboardMapper(rawMapping: IKeyboardMapping): IKeyboardMapper { + const isUSStandard = BrowserKeyboardMapperFactory._isUSStandard(rawMapping); + if (OS === OperatingSystem.Windows) { + return new WindowsKeyboardMapper(isUSStandard, rawMapping); + } + if (Object.keys(rawMapping).length === 0) { + // Looks like reading the mappings failed (most likely Mac + Japanese/Chinese keyboard layouts) + return new MacLinuxFallbackKeyboardMapper(OS); + } + + return new MacLinuxKeyboardMapper(isUSStandard, rawMapping, OS); + } + + //#region Browser API private _validateCurrentKeyboardMapping(keyboardEvent: IKeyboardEvent): boolean { if (!this._initialized) { return true; } const standardKeyboardEvent = keyboardEvent as StandardKeyboardEvent; - const currentKeymap = KeyboardLayoutProvider.INSTANCE.activeKeyboardLayout; + const currentKeymap = this._activeKeymapInfo; if (!currentKeymap) { return true; } - const mapping = currentKeymap.value[standardKeyboardEvent.code]; + const mapping = currentKeymap.mapping[standardKeyboardEvent.code]; if (!mapping) { return false; @@ -147,8 +276,8 @@ export class BrowserKeyboardMapperFactory { // we don't undetstand if (keyboardEvent.ctrlKey || keyboardEvent.metaKey) { setTimeout(() => { - this.getBrowserKeyMap().then((keymap: IKeyboardMapping) => { - if (KeyboardLayoutProvider.INSTANCE.isActive(keymap)) { + this._getBrowserKeyMapping().then((keymap: IKeyboardMapping) => { + if (this.isKeyMappingActive(keymap)) { return; } @@ -180,79 +309,7 @@ export class BrowserKeyboardMapperFactory { return true; } - public getRawKeyboardMapping(): IKeyboardMapping | null { - if (!this._initialized) { - return null; - } - return this._rawMapping; - } - - public setKeyboardLayout(layoutName: string) { - let allKeyboardLayouts = KeyboardLayoutProvider.INSTANCE.getKeyboardLayouts(); - let matchedLayouts: KeyboardLayoutInfo[] = []; - if (isWindows) { - matchedLayouts = allKeyboardLayouts.filter(layout => (layout.layout).name === layoutName); - } - - if (isMacintosh) { - // todo, probably we should use layout.id? - matchedLayouts = allKeyboardLayouts.filter(layout => (layout.layout).lang === layoutName); - } - - if (isLinux) { - // todo, probably we should use layout.id? - matchedLayouts = allKeyboardLayouts.filter(layout => (layout.layout).layout === layoutName); - } - - if (matchedLayouts.length > 0) { - KeyboardLayoutProvider.INSTANCE.setActive2(matchedLayouts[0]); - - let currentKeyboardLayout = KeyboardLayoutProvider.INSTANCE.activeKeyboardLayout; - - if (currentKeyboardLayout) { - this._setKeyboardData(currentKeyboardLayout.layout, currentKeyboardLayout.value); - - return; - } - } - } - - private _setKeyboardData(layoutInfo: IKeyboardLayoutInfo, rawMapping: IKeyboardMapping): void { - this._layoutInfo = layoutInfo; - this._initialized = true; - this._rawMapping = rawMapping; - this._keyboardMapper = new CachedKeyboardMapper(BrowserKeyboardMapperFactory._createKeyboardMapper(this._layoutInfo, this._rawMapping)); - this._onDidChangeKeyboardMapper.fire(); - } - - private static _isUSStandard(rawMapping: IKeyboardMapping): boolean { - for (let key in rawMapping) { - let str = rawMapping[key].value; - let keyCode = KeyCodeUtils.fromString(str); - let usKeyCode = US_SCANCODE_MAP[key]; - - if (keyCode !== usKeyCode) { - return false; - } - - } - return true; - } - - private static _createKeyboardMapper(layoutInfo: IKeyboardLayoutInfo, rawMapping: IKeyboardMapping): IKeyboardMapper { - const isUSStandard = BrowserKeyboardMapperFactory._isUSStandard(rawMapping); - if (OS === OperatingSystem.Windows) { - return new WindowsKeyboardMapper(isUSStandard, rawMapping); - } - if (Object.keys(rawMapping).length === 0) { - // Looks like reading the mappings failed (most likely Mac + Japanese/Chinese keyboard layouts) - return new MacLinuxFallbackKeyboardMapper(OS); - } - - return new MacLinuxKeyboardMapper(isUSStandard, rawMapping, OS); - } - - async getBrowserKeyMap() { + private async _getBrowserKeyMapping() { if ((navigator as any).keyboard) { try { return (navigator as any).keyboard.getLayoutMap().then((e: any) => { @@ -266,10 +323,10 @@ export class BrowserKeyboardMapperFactory { }; } - const matchedKeyboardLayout = KeyboardLayoutProvider.INSTANCE.getMatchedKeyboardLayout(ret); + const matchedKeyboardLayout = this.getMatchedKeymapInfo(ret); if (matchedKeyboardLayout) { - return matchedKeyboardLayout.value; + return matchedKeyboardLayout.mapping; } return {}; @@ -281,8 +338,9 @@ export class BrowserKeyboardMapperFactory { return {}; } -} + //#endregion +} export const US_SCANCODE_MAP: { [str: string]: KeyCode; } = {}; @@ -349,8 +407,8 @@ class UserKeyboardLayout extends Disposable { private fileWatcherDisposable: IDisposable = Disposable.None; private directoryWatcherDisposable: IDisposable = Disposable.None; - private _keyboardLayout: KeyboardLayoutInfo | null; - get keyboardLayout(): KeyboardLayoutInfo | null { return this._keyboardLayout; } + private _keyboardLayout: KeymapInfo | null; + get keyboardLayout(): KeymapInfo | null { return this._keyboardLayout; } constructor( private readonly keyboardLayoutResource: URI, @@ -386,7 +444,7 @@ class UserKeyboardLayout extends Disposable { const value = parse(content.value.toString()); const layoutInfo = value.layout; const mappings = value.rawMapping; - this._keyboardLayout = KeyboardLayoutInfo.createKeyboardLayoutFromDebugInfo(layoutInfo, mappings, true); + this._keyboardLayout = KeymapInfo.createKeyboardLayoutFromDebugInfo(layoutInfo, mappings, true); } catch (e) { this._keyboardLayout = null; } @@ -466,9 +524,9 @@ class BrowserKeymapService extends Disposable implements IKeymapService { const keyboardConfig = configurationService.getValue<{ layout: string }>('keyboard'); const layout = keyboardConfig.layout; - if (!layout || layout === 'autodetect') { - this.registerKeyboardListener(); - } else { + this.registerKeyboardListener(); + + if (layout && layout !== 'autodetect') { // set keyboard layout BrowserKeyboardMapperFactory.INSTANCE.setKeyboardLayout(layout); } @@ -491,21 +549,21 @@ class BrowserKeymapService extends Disposable implements IKeymapService { this._userKeyboardLayout.initialize(); if (this._userKeyboardLayout.keyboardLayout) { - KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout(this._userKeyboardLayout.keyboardLayout); + BrowserKeyboardMapperFactory.INSTANCE.registerKeyboardLayout(this._userKeyboardLayout.keyboardLayout); } this._register(this._userKeyboardLayout.onDidChange(() => { - let userKeyboardLayouts = KeyboardLayoutProvider.INSTANCE.getKeyboardLayouts().filter(layout => layout.isUserKeyboardLayout); + let userKeyboardLayouts = BrowserKeyboardMapperFactory.INSTANCE.keymapInfos.filter(layout => layout.isUserKeyboardLayout); if (userKeyboardLayouts.length) { if (this._userKeyboardLayout.keyboardLayout) { userKeyboardLayouts[0].update(this._userKeyboardLayout.keyboardLayout); } else { - KeyboardLayoutProvider.INSTANCE.removeKeyboardLayout(userKeyboardLayouts[0]); + BrowserKeyboardMapperFactory.INSTANCE.removeKeyboardLayout(userKeyboardLayouts[0]); } } else { if (this._userKeyboardLayout.keyboardLayout) { - KeyboardLayoutProvider.INSTANCE.registerKeyboardLayout(this._userKeyboardLayout.keyboardLayout); + BrowserKeyboardMapperFactory.INSTANCE.registerKeyboardLayout(this._userKeyboardLayout.keyboardLayout); } } @@ -524,15 +582,15 @@ class BrowserKeymapService extends Disposable implements IKeymapService { } public getCurrentKeyboardLayout(): IKeyboardLayoutInfo | null { - return BrowserKeyboardMapperFactory.INSTANCE.getCurrentKeyboardLayout(); + return BrowserKeyboardMapperFactory.INSTANCE.activeKeyboardLayout; } public getAllKeyboardLayouts(): IKeyboardLayoutInfo[] { - return BrowserKeyboardMapperFactory.INSTANCE.getAllKeyboardLayouts(); + return BrowserKeyboardMapperFactory.INSTANCE.keyboardLayouts; } public getRawKeyboardMapping(): IKeyboardMapping | null { - return BrowserKeyboardMapperFactory.INSTANCE.getRawKeyboardMapping(); + return BrowserKeyboardMapperFactory.INSTANCE.activeKeyMapping; } public validateCurrentKeyboardMapping(keyboardEvent: IKeyboardEvent): void { diff --git a/src/vs/workbench/services/keybinding/common/keymapInfo.ts b/src/vs/workbench/services/keybinding/common/keymapInfo.ts new file mode 100644 index 00000000000..7d2665d006d --- /dev/null +++ b/src/vs/workbench/services/keybinding/common/keymapInfo.ts @@ -0,0 +1,110 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IKeyboardLayoutInfo } from 'vs/workbench/services/keybinding/common/keymapService'; +import { isWindows } from 'vs/base/common/platform'; + +function deserializeMapping(serializedMapping: ISerializedMapping) { + let mapping = serializedMapping; + + let ret = {}; + for (let key in mapping) { + let result: (string | number)[] = mapping[key]; + if (result.length) { + let value = result[0]; + let withShift = result[1]; + let withAltGr = result[2]; + let withShiftAltGr = result[3]; + let mask = Number(result[4]); + let vkey = result.length === 6 ? result[5] : undefined; + ret[key] = { + 'value': value, + 'vkey': vkey, + 'withShift': withShift, + 'withAltGr': withAltGr, + 'withShiftAltGr': withShiftAltGr, + 'valueIsDeadKey': (mask & 1) > 0, + 'withShiftIsDeadKey': (mask & 2) > 0, + 'withAltGrIsDeadKey': (mask & 4) > 0, + 'withShiftAltGrIsDeadKey': (mask & 8) > 0 + }; + } else { + ret[key] = { + 'value': '', + 'valueIsDeadKey': false, + 'withShift': '', + 'withShiftIsDeadKey': false, + 'withAltGr': '', + 'withAltGrIsDeadKey': false, + 'withShiftAltGr': '', + 'withShiftAltGrIsDeadKey': false + }; + } + } + + return ret; +} + +interface IKeyboardMapping { + [key: string]: { + value: string, + withShift: string; + withAltGr: string; + withShiftAltGr: string; + valueIsDeadKey?: boolean; + withShiftIsDeadKey?: boolean; + withAltGrIsDeadKey?: boolean; + withShiftAltGrIsDeadKey?: boolean; + + }; +} + +interface ISerializedMapping { + [key: string]: (string | number)[]; +} + +export class KeymapInfo { + mapping: IKeyboardMapping; + isUserKeyboardLayout: boolean; + + constructor(public layout: IKeyboardLayoutInfo, public secondaryLayouts: IKeyboardLayoutInfo[], keyboardMapping: ISerializedMapping, isUserKeyboardLayout?: boolean) { + this.mapping = deserializeMapping(keyboardMapping); + this.isUserKeyboardLayout = !!isUserKeyboardLayout; + } + + static createKeyboardLayoutFromDebugInfo(layout: IKeyboardLayoutInfo, value: IKeyboardMapping, isUserKeyboardLayout?: boolean): KeymapInfo { + let keyboardLayoutInfo = new KeymapInfo(layout, [], {}, true); + keyboardLayoutInfo.mapping = value; + return keyboardLayoutInfo; + } + + update(other: KeymapInfo) { + this.layout = other.layout; + this.secondaryLayouts = other.secondaryLayouts; + this.mapping = other.mapping; + this.isUserKeyboardLayout = other.isUserKeyboardLayout; + } + + fuzzyEqual(other: IKeyboardMapping): boolean { + for (let key in other) { + if (isWindows && (key === 'Backslash' || key === 'KeyQ')) { + // keymap from Chromium is probably wrong. + continue; + } + if (this.mapping[key] === undefined) { + return false; + } + + let currentMapping = this.mapping[key]; + let otherMapping = other[key]; + + if (currentMapping.value !== otherMapping.value) { + return false; + } + } + + return true; + } +} diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index 47ce9781da6..30e1a0f9daa 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -118,7 +118,7 @@ import 'vs/workbench/services/editor/browser/editorService'; import 'vs/workbench/services/history/browser/history'; import 'vs/workbench/services/activity/browser/activityService'; import 'vs/workbench/browser/parts/views/views'; -import 'vs/workbench/services/keybinding/browser/keyboardLayoutService'; +import 'vs/workbench/services/keybinding/browser/keymapService'; import 'vs/workbench/services/keybinding/browser/keybindingService'; import 'vs/workbench/services/untitled/common/untitledEditorService'; import 'vs/workbench/services/textfile/common/textResourcePropertiesService'; From 8c08a1e523cc10d9608159ca39f53203e8bbc90f Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Wed, 19 Jun 2019 12:06:14 -0700 Subject: [PATCH 0392/1449] linux case senstivity --- .../services/keybinding/browser/keyboardLayoutService.ts | 2 +- .../browser/keyboardLayouts/layout.contribution.linux.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts index 4f2b427641c..7d6bb3dbefe 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts @@ -36,7 +36,7 @@ export class BrowserKeyboardMapperFactory { const platform = isWindows ? 'win' : isMacintosh ? 'darwin' : 'linux'; - import('vs/workbench/services/keybinding/browser/keyboardlayouts/layout.contribution.' + platform).then(() => { + import('vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.' + platform).then(() => { this._initialized = true; this._onKeyboardLayoutChanged(); }); diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.linux.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.linux.ts index a0181a65942..b1aeb2eafd5 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.linux.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.linux.ts @@ -7,4 +7,4 @@ import 'vs/workbench/services/keybinding/browser/keyboardLayouts/en.linux'; import 'vs/workbench/services/keybinding/browser/keyboardLayouts/es.linux'; import 'vs/workbench/services/keybinding/browser/keyboardLayouts/de.linux'; import 'vs/workbench/services/keybinding/browser/keyboardLayouts/fr.linux'; -import 'vs/workbench/services/keybinding/browser/keyboardLayouts/fu.linux'; +import 'vs/workbench/services/keybinding/browser/keyboardLayouts/ru.linux'; From 3c698386915e5bd1636256d9ff1a996a74521cfb Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Wed, 19 Jun 2019 12:07:12 -0700 Subject: [PATCH 0393/1449] no warnings anymore --- .../services/keybinding/browser/keybindingService.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/services/keybinding/browser/keybindingService.ts b/src/vs/workbench/services/keybinding/browser/keybindingService.ts index 74610ab901e..fdb6f43db9b 100644 --- a/src/vs/workbench/services/keybinding/browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/browser/keybindingService.ts @@ -366,31 +366,31 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { } if ((partModifiersMask & modifiersMask) === KeyMod.CtrlCmd && part.keyCode === KeyCode.KEY_W) { - console.warn('Ctrl/Cmd+W keybindings should not be used by default in web. Offender: ', kb.getHashCode(), ' for ', commandId); + // console.warn('Ctrl/Cmd+W keybindings should not be used by default in web. Offender: ', kb.getHashCode(), ' for ', commandId); return true; } if ((partModifiersMask & modifiersMask) === KeyMod.CtrlCmd && part.keyCode === KeyCode.KEY_N) { - console.warn('Ctrl/Cmd+N keybindings should not be used by default in web. Offender: ', kb.getHashCode(), ' for ', commandId); + // console.warn('Ctrl/Cmd+N keybindings should not be used by default in web. Offender: ', kb.getHashCode(), ' for ', commandId); return true; } if ((partModifiersMask & modifiersMask) === KeyMod.CtrlCmd && part.keyCode === KeyCode.KEY_T) { - console.warn('Ctrl/Cmd+T keybindings should not be used by default in web. Offender: ', kb.getHashCode(), ' for ', commandId); + // console.warn('Ctrl/Cmd+T keybindings should not be used by default in web. Offender: ', kb.getHashCode(), ' for ', commandId); return true; } if ((partModifiersMask & modifiersMask) === (KeyMod.CtrlCmd | KeyMod.Alt) && (part.keyCode === KeyCode.LeftArrow || part.keyCode === KeyCode.RightArrow)) { - console.warn('Ctrl/Cmd+Arrow keybindings should not be used by default in web. Offender: ', kb.getHashCode(), ' for ', commandId); + // console.warn('Ctrl/Cmd+Arrow keybindings should not be used by default in web. Offender: ', kb.getHashCode(), ' for ', commandId); return true; } if ((partModifiersMask & modifiersMask) === KeyMod.CtrlCmd && part.keyCode >= KeyCode.KEY_0 && part.keyCode <= KeyCode.KEY_9) { - console.warn('Ctrl/Cmd+Num keybindings should not be used by default in web. Offender: ', kb.getHashCode(), ' for ', commandId); + // console.warn('Ctrl/Cmd+Num keybindings should not be used by default in web. Offender: ', kb.getHashCode(), ' for ', commandId); return true; } From a4e9376c185c794e66afa3811f08a75b48e6e131 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 19 Jun 2019 12:23:09 -0700 Subject: [PATCH 0394/1449] Re-enable test and split it up Cannot reproduce the failure locally, additionally it was a timeout but it's not an async test... Fixes #75772 --- .../terminalConfigHelper.test.ts | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/test/electron-browser/terminalConfigHelper.test.ts b/src/vs/workbench/contrib/terminal/test/electron-browser/terminalConfigHelper.test.ts index 3d2cf176549..f1984496f23 100644 --- a/src/vs/workbench/contrib/terminal/test/electron-browser/terminalConfigHelper.test.ts +++ b/src/vs/workbench/contrib/terminal/test/electron-browser/terminalConfigHelper.test.ts @@ -16,27 +16,38 @@ suite('Workbench - TerminalConfigHelper', () => { fixture = document.body; }); - test.skip('TerminalConfigHelper - getFont fontFamily', function () { + test('TerminalConfigHelper - getFont fontFamily', function () { const configurationService = new TestConfigurationService(); configurationService.setUserConfiguration('editor', { fontFamily: 'foo' }); configurationService.setUserConfiguration('terminal', { integrated: { fontFamily: 'bar' } }); - - let configHelper = new TerminalConfigHelper(LinuxDistro.Unknown, configurationService, null!, null!, null!); + const configHelper = new TerminalConfigHelper(LinuxDistro.Unknown, configurationService, null!, null!, null!); configHelper.panelContainer = fixture; assert.equal(configHelper.getFont().fontFamily, 'bar', 'terminal.integrated.fontFamily should be selected over editor.fontFamily'); + }); + test('TerminalConfigHelper - getFont fontFamily (Linux Fedora)', function () { + const configurationService = new TestConfigurationService(); + configurationService.setUserConfiguration('editor', { fontFamily: 'foo' }); configurationService.setUserConfiguration('terminal', { integrated: { fontFamily: null } }); - - // Recreate config helper as onDidChangeConfiguration isn't implemented in TestConfigurationService - configHelper = new TerminalConfigHelper(LinuxDistro.Fedora, configurationService, null!, null!, null!); + const configHelper = new TerminalConfigHelper(LinuxDistro.Fedora, configurationService, null!, null!, null!); configHelper.panelContainer = fixture; assert.equal(configHelper.getFont().fontFamily, '\'DejaVu Sans Mono\', monospace', 'Fedora should have its font overridden when terminal.integrated.fontFamily not set'); + }); - configHelper = new TerminalConfigHelper(LinuxDistro.Ubuntu, configurationService, null!, null!, null!); + test('TerminalConfigHelper - getFont fontFamily (Linux Ubuntu)', function () { + const configurationService = new TestConfigurationService(); + configurationService.setUserConfiguration('editor', { fontFamily: 'foo' }); + configurationService.setUserConfiguration('terminal', { integrated: { fontFamily: null } }); + const configHelper = new TerminalConfigHelper(LinuxDistro.Ubuntu, configurationService, null!, null!, null!); configHelper.panelContainer = fixture; assert.equal(configHelper.getFont().fontFamily, '\'Ubuntu Mono\', monospace', 'Ubuntu should have its font overridden when terminal.integrated.fontFamily not set'); + }); - configHelper = new TerminalConfigHelper(LinuxDistro.Unknown, configurationService, null!, null!, null!); + test('TerminalConfigHelper - getFont fontFamily (Linux Unknown)', function () { + const configurationService = new TestConfigurationService(); + configurationService.setUserConfiguration('editor', { fontFamily: 'foo' }); + configurationService.setUserConfiguration('terminal', { integrated: { fontFamily: null } }); + const configHelper = new TerminalConfigHelper(LinuxDistro.Unknown, configurationService, null!, null!, null!); configHelper.panelContainer = fixture; assert.equal(configHelper.getFont().fontFamily, 'foo', 'editor.fontFamily should be the fallback when terminal.integrated.fontFamily not set'); }); From c62e57fed146f1a6d79e6e30e99d3455da64ec1c Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 19 Jun 2019 12:31:59 -0700 Subject: [PATCH 0395/1449] Remove unneeded isWeb check electron-browser/ will already prevent this --- .../terminal/electron-browser/terminalNativeService.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService.ts index 12406462f44..d8591bc6172 100644 --- a/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService.ts @@ -15,7 +15,6 @@ import { Emitter, Event } from 'vs/base/common/event'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { registerRemoteContributions } from 'vs/workbench/contrib/terminal/node/terminalRemote'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; -import { isWeb } from 'vs/base/common/platform'; export class TerminalNativeService implements ITerminalNativeService { public _serviceBrand: any; @@ -35,11 +34,9 @@ export class TerminalNativeService implements ITerminalNativeService { ipc.on('vscode:openFiles', (_event: any, request: IOpenFileRequest) => this._onOpenFileRequest.fire(request)); ipc.on('vscode:osResume', () => this._onOsResume.fire()); - if (!isWeb) { - const connection = remoteAgentService.getConnection(); - if (connection && connection.remoteAuthority) { - registerRemoteContributions(); - } + const connection = remoteAgentService.getConnection(); + if (connection && connection.remoteAuthority) { + registerRemoteContributions(); } } From 32da7fe41ecd0b44f48f913e02a890e967416462 Mon Sep 17 00:00:00 2001 From: SteVen Batten Date: Wed, 19 Jun 2019 19:35:25 +0000 Subject: [PATCH 0396/1449] fixes #75703 --- src/vs/workbench/browser/actions/layoutActions.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/actions/layoutActions.ts b/src/vs/workbench/browser/actions/layoutActions.ts index 9bffa5213e7..51962ccc1b8 100644 --- a/src/vs/workbench/browser/actions/layoutActions.ts +++ b/src/vs/workbench/browser/actions/layoutActions.ts @@ -18,7 +18,7 @@ import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation import { KeyMod, KeyCode, KeyChord } from 'vs/base/common/keyCodes'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { MenuBarVisibility } from 'vs/platform/windows/common/windows'; -import { isWindows, isLinux } from 'vs/base/common/platform'; +import { isWindows, isLinux, isWeb } from 'vs/base/common/platform'; import { IsMacNativeContext } from 'vs/workbench/browser/contextkeys'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { InEditorZenModeContext, IsCenteredLayoutContext } from 'vs/workbench/common/editor'; @@ -438,7 +438,7 @@ export class ToggleMenuBarAction extends Action { } } -if (isWindows || isLinux) { +if (isWindows || isLinux || isWeb) { registry.registerWorkbenchAction(new SyncActionDescriptor(ToggleMenuBarAction, ToggleMenuBarAction.ID, ToggleMenuBarAction.LABEL), 'View: Toggle Menu Bar', viewCategory); } From 87e16500d265d393a9e0f8ccd5c3ffcd61103f53 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 19 Jun 2019 12:57:26 -0700 Subject: [PATCH 0397/1449] Call getDefaultShell via ext host on web Part of #75795 --- .../api/browser/mainThreadTerminalService.ts | 17 +++++++++++++-- .../workbench/api/common/extHost.protocol.ts | 1 + .../api/node/extHostTerminalService.ts | 4 ++++ .../tasks/browser/terminalTaskSystem.ts | 21 +------------------ .../contrib/terminal/browser/terminal.ts | 6 +++++- .../browser/terminalInstanceService.ts | 8 +++++-- .../browser/terminalProcessManager.ts | 2 +- .../terminalInstanceService.ts | 10 +++++---- .../terminalLinkHandler.test.ts | 9 ++++---- 9 files changed, 44 insertions(+), 34 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index c37b7c685f0..270f8e332fd 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -9,6 +9,7 @@ import { ExtHostContext, ExtHostTerminalServiceShape, MainThreadTerminalServiceS import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { UriComponents, URI } from 'vs/base/common/uri'; import { StopWatch } from 'vs/base/common/stopwatch'; +import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal'; @extHostNamedCustomer(MainContext.MainThreadTerminalService) export class MainThreadTerminalService implements MainThreadTerminalServiceShape { @@ -22,10 +23,13 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape constructor( extHostContext: IExtHostContext, - @ITerminalService private readonly _terminalService: ITerminalService + @ITerminalService private readonly _terminalService: ITerminalService, + @ITerminalInstanceService readonly terminalInstanceService: ITerminalInstanceService ) { this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostTerminalService); this._remoteAuthority = extHostContext.remoteAuthority; + + // ITerminalService listeners this._toDispose.push(_terminalService.onInstanceCreated((instance) => { // Delay this message so the TerminalInstance constructor has a chance to finish and // return the ID normally to the extension host. The ID that is passed here will be used @@ -44,6 +48,11 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape this._toDispose.push(_terminalService.configHelper.onWorkspacePermissionsChanged(isAllowed => this._onWorkspacePermissionsChanged(isAllowed))); this._toDispose.push(_terminalService.onRequestAvailableShells(r => this._onRequestAvailableShells(r))); + // ITerminalInstanceService listeners + if (terminalInstanceService.onRequestDefaultShell) { + this._toDispose.push(terminalInstanceService.onRequestDefaultShell(r => this._onRequestDefaultShell(r))); + } + // Set initial ext host state this._terminalService.terminalInstances.forEach(t => { this._onTerminalOpened(t); @@ -278,6 +287,10 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape } private _onRequestAvailableShells(resolve: (shells: IShellDefinition[]) => void): void { - this._proxy.$requestAvailableShells().then(shells => resolve(shells)); + this._proxy.$requestAvailableShells().then(e => resolve(e)); + } + + private _onRequestDefaultShell(resolve: (defaultShell: string) => void): void { + this._proxy.$requestDefaultShell().then(e => resolve(e)); } } diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index bcd55cea583..f5c00e92830 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -1129,6 +1129,7 @@ export interface ExtHostTerminalServiceShape { $acceptProcessRequestLatency(id: number): number; $acceptWorkspacePermissionsChanged(isAllowed: boolean): void; $requestAvailableShells(): Promise; + $requestDefaultShell(): Promise; } export interface ExtHostSCMShape { diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 878127edcc5..9bcfd2d149f 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -579,6 +579,10 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { return detectAvailableShells(); } + public $requestDefaultShell(): Promise { + return Promise.resolve(getDefaultShell(platform.platform)); + } + private _onProcessExit(id: number, exitCode: number): void { // Remove listeners this._terminalProcesses[id].dispose(); diff --git a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts index a748fc70f71..6b7d6af46a0 100644 --- a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts @@ -763,25 +763,6 @@ export class TerminalTaskSystem implements ITaskSystem { return nls.localize('TerminalTaskSystem.terminalName', 'Task - {0}', needsFolderQualification ? task.getQualifiedLabel() : task.configurationProperties.name); } - private getDefaultShell(platform: Platform.Platform): string { - let defaultShell: string | undefined = undefined; - try { - defaultShell = this.terminalInstanceService.getDefaultShell(platform); - } catch { - // Do nothing - } - if (!defaultShell) { - // Make up a guess for the default shell. - if (platform === Platform.Platform.Windows) { - defaultShell = 'cmd.exe'; - } else { - defaultShell = 'bash'; - } - console.warn('Cannot get the default shell.'); - } - return defaultShell; - } - private async getUserHome(): Promise { const env = await this.remoteAgentService.getEnvironment(); if (env) { @@ -798,7 +779,7 @@ export class TerminalTaskSystem implements ITaskSystem { let originalCommand = task.command.name; if (isShellCommand) { shellLaunchConfig = { name: terminalName, executable: undefined, args: undefined, waitOnExit }; - this.terminalInstanceService.mergeDefaultShellPathAndArgs(shellLaunchConfig, this.getDefaultShell(platform), this.terminalService.configHelper, platform); + this.terminalInstanceService.mergeDefaultShellPathAndArgs(shellLaunchConfig, await this.terminalInstanceService.getDefaultShell(), this.terminalService.configHelper, platform); let shellSpecified: boolean = false; let shellOptions: ShellConfiguration | undefined = task.command.options && task.command.options.shell; if (shellOptions) { diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.ts b/src/vs/workbench/contrib/terminal/browser/terminal.ts index b7648c67e3c..806dcee37d6 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -9,6 +9,7 @@ import { SearchAddon as XTermSearchAddon } from 'xterm-addon-search'; import { ITerminalInstance, IWindowsShellHelper, ITerminalConfigHelper, ITerminalChildProcess, IShellLaunchConfig } from 'vs/workbench/contrib/terminal/common/terminal'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IProcessEnvironment, Platform } from 'vs/base/common/platform'; +import { Event } from 'vs/base/common/event'; export const ITerminalInstanceService = createDecorator('terminalInstanceService'); @@ -20,16 +21,19 @@ export const ITerminalInstanceService = createDecorator void>; + getXtermConstructor(): Promise; getXtermWebLinksConstructor(): Promise; getXtermSearchConstructor(): Promise; createWindowsShellHelper(shellProcessId: number, instance: ITerminalInstance, xterm: XTermTerminal): IWindowsShellHelper; createTerminalProcess(shellLaunchConfig: IShellLaunchConfig, cwd: string, cols: number, rows: number, env: IProcessEnvironment, windowsEnableConpty: boolean): ITerminalChildProcess; - getDefaultShell(p: Platform): string; /** * Merges the default shell path and args into the provided launch configuration */ mergeDefaultShellPathAndArgs(shell: IShellLaunchConfig, defaultShell: string, configHelper: ITerminalConfigHelper, platformOverride?: Platform): void; + + getDefaultShell(): Promise; getMainProcessParentEnv(): Promise; } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts index dbbb9313e12..d00843b80d6 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts @@ -9,6 +9,7 @@ import { Terminal as XTermTerminal } from 'xterm'; import { WebLinksAddon as XTermWebLinksAddon } from 'xterm-addon-web-links'; import { SearchAddon as XTermSearchAddon } from 'xterm-addon-search'; import { IProcessEnvironment } from 'vs/base/common/platform'; +import { Emitter, Event } from 'vs/base/common/event'; let Terminal: typeof XTermTerminal; let WebLinksAddon: typeof XTermWebLinksAddon; @@ -17,6 +18,9 @@ let SearchAddon: typeof XTermSearchAddon; export class TerminalInstanceService implements ITerminalInstanceService { public _serviceBrand: any; + private readonly _onRequestDefaultShell = new Emitter<(defaultShell: string) => void>(); + public get onRequestDefaultShell(): Event<(defaultShell: string) => void> { return this._onRequestDefaultShell.event; } + constructor() { } public async getXtermConstructor(): Promise { @@ -48,8 +52,8 @@ export class TerminalInstanceService implements ITerminalInstanceService { throw new Error('Not implemented'); } - public getDefaultShell(): string { - throw new Error('Not implemented'); + public getDefaultShell(): Promise { + return new Promise(r => this._onRequestDefaultShell.fire(r)); } public async getMainProcessParentEnv(): Promise { diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts index 3eca2ccd977..9977b972255 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts @@ -163,7 +163,7 @@ export class TerminalProcessManager implements ITerminalProcessManager { private async _launchProcess(shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number): Promise { if (!shellLaunchConfig.executable) { - this._terminalInstanceService.mergeDefaultShellPathAndArgs(shellLaunchConfig, this._terminalInstanceService.getDefaultShell(platform.platform), this._configHelper); + this._terminalInstanceService.mergeDefaultShellPathAndArgs(shellLaunchConfig, await this._terminalInstanceService.getDefaultShell(), this._configHelper); } const activeWorkspaceRootUri = this._historyService.getLastActiveWorkspaceRoot(Schemas.file); diff --git a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts index 357bd5dc736..6326711f628 100644 --- a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts @@ -62,10 +62,6 @@ export class TerminalInstanceService implements ITerminalInstanceService { return this._instantiationService.createInstance(TerminalProcess, shellLaunchConfig, cwd, cols, rows, env, windowsEnableConpty); } - public getDefaultShell(p: Platform): string { - return getDefaultShell(p); - } - public mergeDefaultShellPathAndArgs(shell: IShellLaunchConfig, defaultShell: string, configHelper: ITerminalConfigHelper, platformOverride: Platform = platform): void { const isWorkspaceShellAllowed = configHelper.checkWorkspaceShellPermissions(platformOverride === Platform.Windows ? OperatingSystem.Windows : (platformOverride === Platform.Mac ? OperatingSystem.Macintosh : OperatingSystem.Linux)); mergeDefaultShellPathAndArgs( @@ -79,6 +75,12 @@ export class TerminalInstanceService implements ITerminalInstanceService { ); } + public getDefaultShell(): Promise { + // Don't go via ext host as that would delay terminal start up until after the extension + // host is ready. + return Promise.resolve(getDefaultShell(platform)); + } + public async getMainProcessParentEnv(): Promise { if (this._mainProcessParentEnv) { return this._mainProcessParentEnv; diff --git a/src/vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts b/src/vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts index d6abc8d9ccf..99d4a6208b7 100644 --- a/src/vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts +++ b/src/vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { Platform, OperatingSystem } from 'vs/base/common/platform'; +import { OperatingSystem } from 'vs/base/common/platform'; import { TerminalLinkHandler, LineColumnInfo } from 'vs/workbench/contrib/terminal/browser/terminalLinkHandler'; import * as strings from 'vs/base/common/strings'; import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal'; @@ -30,6 +30,10 @@ class TestXterm { } class MockTerminalInstanceService implements ITerminalInstanceService { + onRequestDefaultShell: any; + getDefaultShell(): Promise { + throw new Error('Method not implemented.'); + } mergeDefaultShellPathAndArgs(): void { throw new Error('Method not implemented.'); } @@ -49,9 +53,6 @@ class MockTerminalInstanceService implements ITerminalInstanceService { createTerminalProcess(): any { throw new Error('Method not implemented.'); } - getDefaultShell(p: Platform): string { - throw new Error('Method not implemented.'); - } getMainProcessParentEnv(): any { throw new Error('Method not implemented.'); } From 05cfcaa8a87b1c8bc73b99c7e57611240a96593b Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Wed, 19 Jun 2019 13:05:42 -0700 Subject: [PATCH 0398/1449] Remove background for split buttons --- .../browser/parts/editor/media/split-editor-horizontal-light.svg | 1 - .../browser/parts/editor/media/split-editor-vertical-light.svg | 1 - 2 files changed, 2 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/media/split-editor-horizontal-light.svg b/src/vs/workbench/browser/parts/editor/media/split-editor-horizontal-light.svg index b9781ffcc9b..b7701615a9d 100644 --- a/src/vs/workbench/browser/parts/editor/media/split-editor-horizontal-light.svg +++ b/src/vs/workbench/browser/parts/editor/media/split-editor-horizontal-light.svg @@ -1,5 +1,4 @@ - diff --git a/src/vs/workbench/browser/parts/editor/media/split-editor-vertical-light.svg b/src/vs/workbench/browser/parts/editor/media/split-editor-vertical-light.svg index 8e5f8cfd6e8..e7eca812f95 100644 --- a/src/vs/workbench/browser/parts/editor/media/split-editor-vertical-light.svg +++ b/src/vs/workbench/browser/parts/editor/media/split-editor-vertical-light.svg @@ -1,5 +1,4 @@ - From 3c5977d06ee8b1459aacf8b0c36802598d67a38e Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 19 Jun 2019 22:15:34 +0200 Subject: [PATCH 0399/1449] #75079 Support multi root workspaces --- .../browser/configurationService.ts | 16 +++++++++------- .../environment/browser/environmentService.ts | 2 ++ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/services/configuration/browser/configurationService.ts b/src/vs/workbench/services/configuration/browser/configurationService.ts index 618fb0bc326..f0c0dfe0031 100644 --- a/src/vs/workbench/services/configuration/browser/configurationService.ts +++ b/src/vs/workbench/services/configuration/browser/configurationService.ts @@ -37,6 +37,7 @@ export class WorkspaceService extends Disposable implements IConfigurationServic private completeWorkspaceBarrier: Barrier; private readonly configurationCache: IConfigurationCache; private _configuration: Configuration; + private initialized: boolean = false; private defaultConfiguration: DefaultConfigurationModel; private localUserConfiguration: UserConfiguration | null = null; private remoteUserConfiguration: RemoteUserConfiguration | null = null; @@ -73,6 +74,8 @@ export class WorkspaceService extends Disposable implements IConfigurationServic this.completeWorkspaceBarrier = new Barrier(); this.defaultConfiguration = new DefaultConfigurationModel(); this.configurationCache = configurationCache; + this._configuration = new Configuration(this.defaultConfiguration, new ConfigurationModel(), new ConfigurationModel(), new ConfigurationModel(), new ResourceMap(), new ConfigurationModel(), new ResourceMap(), this.workspace); + this.cachedFolderConfigs = new ResourceMap(); if (userSettingsResource) { this.localUserConfiguration = this._register(new UserConfiguration(userSettingsResource, remoteAuthority ? LOCAL_MACHINE_SCOPES : undefined, configurationFileService)); this._register(this.localUserConfiguration.onDidChangeConfiguration(userConfiguration => this.onLocalUserConfigurationChanged(userConfiguration))); @@ -466,11 +469,12 @@ export class WorkspaceService extends Disposable implements IConfigurationServic const currentConfiguration = this._configuration; this._configuration = new Configuration(this.defaultConfiguration, userConfigurationModel, remoteUserConfigurationModel, workspaceConfiguration, folderConfigurationModels, new ConfigurationModel(), new ResourceMap(), this.workspace); - if (currentConfiguration) { + if (this.initialized) { const changedKeys = this._configuration.compare(currentConfiguration); this.triggerConfigurationChange(new ConfigurationChangeEvent().change(changedKeys), ConfigurationTarget.WORKSPACE); } else { this._onDidChangeConfiguration.fire(new AllKeysConfigurationChangeEvent(this._configuration, ConfigurationTarget.WORKSPACE, this.getTargetConfiguration(ConfigurationTarget.WORKSPACE))); + this.initialized = true; } }); } @@ -489,7 +493,7 @@ export class WorkspaceService extends Disposable implements IConfigurationServic private onDefaultConfigurationChanged(keys: string[]): void { this.defaultConfiguration = new DefaultConfigurationModel(); this.registerConfigurationSchemas(); - if (this.workspace && this._configuration) { + if (this.workspace) { this._configuration.updateDefaultConfiguration(this.defaultConfiguration); if (this.remoteUserConfiguration) { this._configuration.updateRemoteUserConfiguration(this.remoteUserConfiguration.reprocess()); @@ -545,14 +549,12 @@ export class WorkspaceService extends Disposable implements IConfigurationServic } private onRemoteUserConfigurationChanged(userConfiguration: ConfigurationModel): void { - if (this._configuration) { - const keys = this._configuration.compareAndUpdateRemoteUserConfiguration(userConfiguration); - this.triggerConfigurationChange(keys, ConfigurationTarget.USER); - } + const keys = this._configuration.compareAndUpdateRemoteUserConfiguration(userConfiguration); + this.triggerConfigurationChange(keys, ConfigurationTarget.USER); } private onWorkspaceConfigurationChanged(): Promise { - if (this.workspace && this.workspace.configuration && this._configuration) { + if (this.workspace && this.workspace.configuration) { const workspaceConfigurationChangeEvent = this._configuration.compareAndUpdateWorkspaceConfiguration(this.workspaceConfiguration.getConfiguration()); let configuredFolders = toWorkspaceFolders(this.workspaceConfiguration.getFolders(), this.workspace.configuration); const changes = this.compareFolders(this.workspace.folders, configuredFolders); diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts index 8ef1e38761c..d51cff0cb6f 100644 --- a/src/vs/workbench/services/environment/browser/environmentService.ts +++ b/src/vs/workbench/services/environment/browser/environmentService.ts @@ -13,6 +13,7 @@ import { ExportData } from 'vs/base/common/performance'; import { LogLevel } from 'vs/platform/log/common/log'; import { joinPath } from 'vs/base/common/resources'; import { IWorkbenchConstructionOptions } from 'vs/workbench/workbench.web.api'; +import { Schemas } from 'vs/base/common/network'; export class BrowserWindowConfiguration implements IWindowConfiguration { @@ -82,6 +83,7 @@ export class BrowserWorkbenchEnvironmentService implements IEnvironmentService { }; this.webviewEndpoint = configuration.webviewEndpoint; + this.untitledWorkspacesHome = URI.from({ scheme: Schemas.untitled, path: 'Workspaces' }); } untitledWorkspacesHome: URI; From 8fb99cd96755183910ed1bfd4d66fba2cb5104cd Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 19 Jun 2019 23:17:13 +0200 Subject: [PATCH 0400/1449] product service for web - get product configuration from server --- src/vs/code/browser/workbench/workbench.html | 3 + .../product/browser/productService.ts | 37 ++++++++ src/vs/platform/product/common/product.ts | 85 ++++++++++++++++++ src/vs/platform/product/node/product.ts | 86 +------------------ src/vs/workbench/browser/web.main.ts | 5 +- .../workbench/browser/web.simpleservices.ts | 18 ---- .../languageSurveys.contribution.ts | 3 +- .../userData/common/userDataService.ts | 27 ++++++ src/vs/workbench/workbench.web.main.ts | 1 - 9 files changed, 158 insertions(+), 107 deletions(-) create mode 100644 src/vs/platform/product/browser/productService.ts create mode 100644 src/vs/workbench/services/userData/common/userDataService.ts diff --git a/src/vs/code/browser/workbench/workbench.html b/src/vs/code/browser/workbench/workbench.html index fedadf22ee6..ff62e0a65a9 100644 --- a/src/vs/code/browser/workbench/workbench.html +++ b/src/vs/code/browser/workbench/workbench.html @@ -15,6 +15,9 @@ + + + diff --git a/src/vs/platform/product/browser/productService.ts b/src/vs/platform/product/browser/productService.ts new file mode 100644 index 00000000000..084144d009f --- /dev/null +++ b/src/vs/platform/product/browser/productService.ts @@ -0,0 +1,37 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IProductService, IProductConfiguration } from 'vs/platform/product/common/product'; +import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; + +export class ProductService implements IProductService { + + private readonly productConfiguration: IProductConfiguration | null; + + constructor() { + const element = document.getElementById('vscode-remote-product-configuration'); + this.productConfiguration = element ? JSON.parse(element.getAttribute('data-settings')!) : null; + } + + _serviceBrand: ServiceIdentifier; + + get version(): string { return '1.35.0'; } + + get commit(): string | undefined { return undefined; } + + get nameLong(): string { return ''; } + + get urlProtocol(): string { return ''; } + + get extensionAllowedProposedApi(): string[] { return this.productConfiguration ? this.productConfiguration.extensionAllowedProposedApi : []; } + + get uiExtensions(): string[] | undefined { return this.productConfiguration ? this.productConfiguration.uiExtensions : undefined; } + + get enableTelemetry(): boolean { return false; } + + get sendASmile(): { reportIssueUrl: string, requestFeatureUrl: string } | undefined { return this.productConfiguration ? this.productConfiguration.sendASmile : undefined; } + + get extensionsGallery() { return this.productConfiguration ? this.productConfiguration.extensionsGallery : undefined; } +} \ No newline at end of file diff --git a/src/vs/platform/product/common/product.ts b/src/vs/platform/product/common/product.ts index 2a35190f8ae..97f3fe3e5a4 100644 --- a/src/vs/platform/product/common/product.ts +++ b/src/vs/platform/product/common/product.ts @@ -30,4 +30,89 @@ export interface IProductService { reportIssueUrl: string; requestFeatureUrl: string; }; +} + +export interface IProductConfiguration { + nameShort: string; + nameLong: string; + applicationName: string; + win32AppId: string; + win32x64AppId: string; + win32UserAppId: string; + win32x64UserAppId: string; + win32AppUserModelId: string; + win32MutexName: string; + darwinBundleIdentifier: string; + urlProtocol: string; + dataFolderName: string; + downloadUrl: string; + updateUrl?: string; + quality?: string; + target?: string; + commit?: string; + settingsSearchBuildId?: number; + settingsSearchUrl?: string; + experimentsUrl?: string; + date: string; + extensionsGallery?: { + serviceUrl: string; + itemUrl: string; + controlUrl: string; + recommendationsUrl: string; + }; + extensionTips: { [id: string]: string; }; + extensionImportantTips: { [id: string]: { name: string; pattern: string; }; }; + exeBasedExtensionTips: { [id: string]: { friendlyName: string, windowsPath?: string, recommendations: string[] }; }; + extensionKeywords: { [extension: string]: string[]; }; + extensionAllowedBadgeProviders: string[]; + extensionAllowedProposedApi: string[]; + keymapExtensionTips: string[]; + crashReporter: { + companyName: string; + productName: string; + }; + welcomePage: string; + enableTelemetry: boolean; + aiConfig: { + asimovKey: string; + }; + sendASmile: { + reportIssueUrl: string, + requestFeatureUrl: string + }; + documentationUrl: string; + releaseNotesUrl: string; + keyboardShortcutsUrlMac: string; + keyboardShortcutsUrlLinux: string; + keyboardShortcutsUrlWin: string; + introductoryVideosUrl: string; + tipsAndTricksUrl: string; + newsletterSignupUrl: string; + twitterUrl: string; + requestFeatureUrl: string; + reportIssueUrl: string; + licenseUrl: string; + privacyStatementUrl: string; + telemetryOptOutUrl: string; + npsSurveyUrl: string; + surveys: ISurveyData[]; + checksums: { [path: string]: string; }; + checksumFailMoreInfoUrl: string; + hockeyApp: { + 'win32-ia32': string; + 'win32-x64': string; + 'linux-x64': string; + 'darwin': string; + }; + logUploaderUrl: string; + portable?: string; + uiExtensions?: string[]; +} + +export interface ISurveyData { + surveyId: string; + surveyUrl: string; + languageId: string; + editCount: number; + userProbability: number; } \ No newline at end of file diff --git a/src/vs/platform/product/node/product.ts b/src/vs/platform/product/node/product.ts index 6a5cf7880e8..08610d71a1a 100644 --- a/src/vs/platform/product/node/product.ts +++ b/src/vs/platform/product/node/product.ts @@ -5,91 +5,7 @@ import * as path from 'vs/base/common/path'; import { getPathFromAmdModule } from 'vs/base/common/amd'; - -export interface IProductConfiguration { - nameShort: string; - nameLong: string; - applicationName: string; - win32AppId: string; - win32x64AppId: string; - win32UserAppId: string; - win32x64UserAppId: string; - win32AppUserModelId: string; - win32MutexName: string; - darwinBundleIdentifier: string; - urlProtocol: string; - dataFolderName: string; - downloadUrl: string; - updateUrl?: string; - quality?: string; - target?: string; - commit?: string; - settingsSearchBuildId?: number; - settingsSearchUrl?: string; - experimentsUrl?: string; - date: string; - extensionsGallery?: { - serviceUrl: string; - itemUrl: string; - controlUrl: string; - recommendationsUrl: string; - }; - extensionTips: { [id: string]: string; }; - extensionImportantTips: { [id: string]: { name: string; pattern: string; }; }; - exeBasedExtensionTips: { [id: string]: { friendlyName: string, windowsPath?: string, recommendations: string[] }; }; - extensionKeywords: { [extension: string]: string[]; }; - extensionAllowedBadgeProviders: string[]; - extensionAllowedProposedApi: string[]; - keymapExtensionTips: string[]; - crashReporter: { - companyName: string; - productName: string; - }; - welcomePage: string; - enableTelemetry: boolean; - aiConfig: { - asimovKey: string; - }; - sendASmile: { - reportIssueUrl: string, - requestFeatureUrl: string - }; - documentationUrl: string; - releaseNotesUrl: string; - keyboardShortcutsUrlMac: string; - keyboardShortcutsUrlLinux: string; - keyboardShortcutsUrlWin: string; - introductoryVideosUrl: string; - tipsAndTricksUrl: string; - newsletterSignupUrl: string; - twitterUrl: string; - requestFeatureUrl: string; - reportIssueUrl: string; - licenseUrl: string; - privacyStatementUrl: string; - telemetryOptOutUrl: string; - npsSurveyUrl: string; - surveys: ISurveyData[]; - checksums: { [path: string]: string; }; - checksumFailMoreInfoUrl: string; - hockeyApp: { - 'win32-ia32': string; - 'win32-x64': string; - 'linux-x64': string; - 'darwin': string; - }; - logUploaderUrl: string; - portable?: string; - uiExtensions?: string[]; -} - -export interface ISurveyData { - surveyId: string; - surveyUrl: string; - languageId: string; - editCount: number; - userProbability: number; -} +import { IProductConfiguration } from 'vs/platform/product/common/product'; const rootPath = path.dirname(getPathFromAmdModule(require, '')); const productJsonPath = path.join(rootPath, 'product.json'); diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index d728c100011..6f1954ba252 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -8,7 +8,7 @@ import { domContentLoaded, addDisposableListener, EventType } from 'vs/base/brow import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { ILogService } from 'vs/platform/log/common/log'; import { Disposable } from 'vs/base/common/lifecycle'; -import { SimpleLogService, SimpleProductService } from 'vs/workbench/browser/web.simpleservices'; +import { SimpleLogService } from 'vs/workbench/browser/web.simpleservices'; import { BrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; import { Workbench } from 'vs/workbench/browser/workbench'; import { IChannel } from 'vs/base/parts/ipc/common/ipc'; @@ -35,6 +35,7 @@ import { ISignService } from 'vs/platform/sign/common/sign'; import { SignService } from 'vs/platform/sign/browser/signService'; import { hash } from 'vs/base/common/hash'; import { IWorkbenchConstructionOptions } from 'vs/workbench/workbench.web.api'; +import { ProductService } from 'vs/platform/product/browser/productService'; class CodeRendererMain extends Disposable { @@ -90,7 +91,7 @@ class CodeRendererMain extends Disposable { serviceCollection.set(IWorkbenchEnvironmentService, environmentService); // Product - const productService = new SimpleProductService(); + const productService = new ProductService(); serviceCollection.set(IProductService, productService); // Remote diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index 9298d9ce924..96d69910456 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -23,7 +23,6 @@ import { IURLHandler, IURLService } from 'vs/platform/url/common/url'; import { ITelemetryService, ITelemetryData, ITelemetryInfo } from 'vs/platform/telemetry/common/telemetry'; import { ConsoleLogService } from 'vs/platform/log/common/log'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; -import { IProductService } from 'vs/platform/product/common/product'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { IStorageService, IWorkspaceStorageChangeEvent, StorageScope, IWillSaveStateEvent, WillSaveStateReason } from 'vs/platform/storage/common/storage'; import { IUpdateService, State } from 'vs/platform/update/common/update'; @@ -517,23 +516,6 @@ export class SimpleMultiExtensionsManagementService implements IExtensionManagem //#endregion -//#region Product - -export class SimpleProductService implements IProductService { - - _serviceBrand: any; - - version: string = '1.35.0'; - commit?: string; - nameLong: string = ''; - urlProtocol: string = ''; - extensionAllowedProposedApi: string[] = []; - uiExtensions?: string[]; - enableTelemetry: boolean = false; -} - -//#endregion - //#region Request export const IRequestService = createDecorator('requestService'); diff --git a/src/vs/workbench/contrib/surveys/electron-browser/languageSurveys.contribution.ts b/src/vs/workbench/contrib/surveys/electron-browser/languageSurveys.contribution.ts index 447a3565881..ec9ac3fb2b7 100644 --- a/src/vs/workbench/contrib/surveys/electron-browser/languageSurveys.contribution.ts +++ b/src/vs/workbench/contrib/surveys/electron-browser/languageSurveys.contribution.ts @@ -11,7 +11,8 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import pkg from 'vs/platform/product/node/package'; -import product, { ISurveyData } from 'vs/platform/product/node/product'; +import product from 'vs/platform/product/node/product'; +import { ISurveyData } from 'vs/platform/product/common/product'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { Severity, INotificationService } from 'vs/platform/notification/common/notification'; import { ITextFileService, StateChange } from 'vs/workbench/services/textfile/common/textfiles'; diff --git a/src/vs/workbench/services/userData/common/userDataService.ts b/src/vs/workbench/services/userData/common/userDataService.ts new file mode 100644 index 00000000000..64fb82202a3 --- /dev/null +++ b/src/vs/workbench/services/userData/common/userDataService.ts @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { Event } from 'vs/base/common/event'; + +export const IUserDataService = createDecorator('userDataService'); + +export interface IUserDataService { + _serviceBrand: any; + + onDidChange: Event; + + read(key: string): Promise; + + write(key: string, value: string): Promise; +} + +export const IUserDataEditorService = createDecorator('userDataEditorService'); + +export interface IUserDataEditorService { + _serviceBrand: any; + + openInEditor(key: string): Promise; +} \ No newline at end of file diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index 7bdf1ac3687..025e107af2a 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -157,7 +157,6 @@ registerSingleton(IContextViewService, ContextViewService, true); registerSingleton(ILifecycleService, BrowserLifecycleService); // registerSingleton(ILocalizationsService, LocalizationsService); // registerSingleton(ISharedProcessService, SharedProcessService, true); -// registerSingleton(IProductService, ProductService, true); // registerSingleton(IWindowsService, WindowsService); // registerSingleton(IUpdateService, UpdateService); // registerSingleton(IIssueService, IssueService); From 7053a76da2cd7677ab3d33a80d377594cc0592d8 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 19 Jun 2019 23:19:21 +0200 Subject: [PATCH 0401/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6916b4088ec..194d5b8211e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "26125d2b5b10bac3b3de09f4ee565ea4d5c1c7bc", + "distro": "3e1131ebd0c20e1929317fcb7925e915007b1303", "author": { "name": "Microsoft Corporation" }, From aadad21f90f3cb71ac6e83baf3dfd5bf8b9c1625 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Wed, 19 Jun 2019 14:38:37 -0700 Subject: [PATCH 0402/1449] Update panel icons --- .../base/parts/tree/browser/CollapseAll.svg | 1 - .../tree/browser/CollapseAll_inverse.svg | 1 - .../parts/tree/browser/collapse-all-dark.svg | 4 + .../parts/tree/browser/collapse-all-hc.svg | 4 + .../parts/tree/browser/collapse-all-light.svg | 4 + src/vs/base/parts/tree/browser/tree.css | 9 +- .../parts/panel/media/chevron-down-dark.svg | 3 + .../parts/panel/media/chevron-down-hc.svg | 3 + .../parts/panel/media/chevron-down-light.svg | 3 + .../parts/panel/media/chevron-left-dark.svg | 3 + .../parts/panel/media/chevron-left-hc.svg | 3 + .../parts/panel/media/chevron-left-light.svg | 3 + .../parts/panel/media/chevron-right-dark.svg | 3 + .../parts/panel/media/chevron-right-hc.svg | 3 + .../parts/panel/media/chevron-right-light.svg | 3 + .../parts/panel/media/chevron-up-dark.svg | 3 + .../parts/panel/media/chevron-up-hc.svg | 3 + .../parts/panel/media/chevron-up-light.svg | 3 + .../browser/parts/panel/media/close-dark.svg | 4 + .../browser/parts/panel/media/close-hc.svg | 4 + .../parts/panel/media/close-inverse.svg | 1 - .../browser/parts/panel/media/close-light.svg | 4 + .../browser/parts/panel/media/close.svg | 1 - .../parts/panel/media/down-inverse.svg | 1 - .../browser/parts/panel/media/down.svg | 1 - .../parts/panel/media/ellipsis-dark.svg | 5 + .../browser/parts/panel/media/ellipsis-hc.svg | 5 + .../parts/panel/media/ellipsis-inverse.svg | 1 - .../parts/panel/media/ellipsis-light.svg | 5 + .../browser/parts/panel/media/ellipsis.svg | 1 - .../parts/panel/media/left-inverse.svg | 1 - .../browser/parts/panel/media/left.svg | 1 - .../browser/parts/panel/media/panelpart.css | 106 +++++++++++------- .../parts/panel/media/right-inverse.svg | 1 - .../browser/parts/panel/media/right.svg | 1 - .../browser/parts/panel/media/up-inverse.svg | 1 - .../browser/parts/panel/media/up.svg | 1 - .../debug/browser/media/clear-dark.svg | 7 ++ .../contrib/debug/browser/media/clear-hc.svg | 7 ++ .../debug/browser/media/clear-light.svg | 7 ++ .../browser/media/clear-repl-inverse.svg | 1 - .../debug/browser/media/clear-repl.svg | 1 - .../contrib/debug/browser/media/repl.css | 9 +- .../browser/media/exclude-settings-dark.svg | 4 + .../browser/media/exclude-settings-hc.svg | 4 + .../browser/media/exclude-settings-light.svg | 4 + .../browser/media/excludeSettings-dark.svg | 1 - .../markers/browser/media/excludeSettings.svg | 1 - .../browser/media/lightbulb-autofix-dark.svg | 10 +- .../browser/media/lightbulb-autofix-hc.svg | 4 + .../browser/media/lightbulb-autofix-light.svg | 4 + .../browser/media/lightbulb-autofix.svg | 10 -- .../markers/browser/media/lightbulb-dark.svg | 4 +- .../markers/browser/media/lightbulb-hc.svg | 3 + .../markers/browser/media/lightbulb-light.svg | 4 + .../markers/browser/media/lightbulb.svg | 1 - .../contrib/markers/browser/media/markers.css | 23 +++- .../output/browser/media/clear-dark.svg | 7 ++ .../contrib/output/browser/media/clear-hc.svg | 7 ++ .../output/browser/media/clear-light.svg | 7 ++ .../output/browser/media/clear_output.svg | 1 - .../browser/media/clear_output_inverse.svg | 1 - .../output/browser/media/locked-dark.svg | 3 + .../output/browser/media/locked-hc.svg | 3 + .../output/browser/media/locked-light.svg | 3 + .../output/browser/media/open-file-dark.svg | 5 + .../output/browser/media/open-file-hc.svg | 5 + .../output/browser/media/open-file-light.svg | 5 + .../output/browser/media/open_log_file.svg | 1 - .../browser/media/open_log_file_inverse.svg | 1 - .../contrib/output/browser/media/output.css | 38 ++++--- .../output/browser/media/output_lock.svg | 1 - .../browser/media/output_lock_inverse.svg | 1 - .../output/browser/media/output_unlock.svg | 1 - .../browser/media/output_unlock_inverse.svg | 1 - .../output/browser/media/unlocked-dark.svg | 3 + .../output/browser/media/unlocked-hc.svg | 3 + .../output/browser/media/unlocked-light.svg | 3 + .../terminal/browser/media/configure-dark.svg | 3 + .../terminal/browser/media/configure-hc.svg | 3 + .../browser/media/configure-inverse.svg | 1 - .../browser/media/configure-light.svg | 3 + .../terminal/browser/media/configure.svg | 1 - .../terminal/browser/media/kill-dark.svg | 8 ++ .../terminal/browser/media/kill-hc.svg | 8 ++ .../terminal/browser/media/kill-inverse.svg | 10 -- .../terminal/browser/media/kill-light.svg | 8 ++ .../contrib/terminal/browser/media/kill.svg | 10 -- .../terminal/browser/media/new-dark.svg | 3 + .../contrib/terminal/browser/media/new-hc.svg | 3 + .../terminal/browser/media/new-inverse.svg | 1 - .../terminal/browser/media/new-light.svg | 3 + .../contrib/terminal/browser/media/new.svg | 1 - .../media/split-editor-horizontal-dark.svg | 4 + .../media/split-editor-horizontal-hc.svg | 4 + .../media/split-editor-horizontal-light.svg | 4 + .../media/split-editor-vertical-dark.svg | 4 + .../media/split-editor-vertical-hc.svg | 4 + .../media/split-editor-vertical-light.svg | 4 + .../media/split-horizontal-inverse.svg | 1 - .../browser/media/split-horizontal.svg | 1 - .../terminal/browser/media/split-inverse.svg | 1 - .../contrib/terminal/browser/media/split.svg | 1 - .../terminal/browser/media/terminal.css | 36 +++--- 104 files changed, 390 insertions(+), 153 deletions(-) delete mode 100644 src/vs/base/parts/tree/browser/CollapseAll.svg delete mode 100644 src/vs/base/parts/tree/browser/CollapseAll_inverse.svg create mode 100644 src/vs/base/parts/tree/browser/collapse-all-dark.svg create mode 100644 src/vs/base/parts/tree/browser/collapse-all-hc.svg create mode 100644 src/vs/base/parts/tree/browser/collapse-all-light.svg create mode 100644 src/vs/workbench/browser/parts/panel/media/chevron-down-dark.svg create mode 100644 src/vs/workbench/browser/parts/panel/media/chevron-down-hc.svg create mode 100644 src/vs/workbench/browser/parts/panel/media/chevron-down-light.svg create mode 100644 src/vs/workbench/browser/parts/panel/media/chevron-left-dark.svg create mode 100644 src/vs/workbench/browser/parts/panel/media/chevron-left-hc.svg create mode 100644 src/vs/workbench/browser/parts/panel/media/chevron-left-light.svg create mode 100644 src/vs/workbench/browser/parts/panel/media/chevron-right-dark.svg create mode 100644 src/vs/workbench/browser/parts/panel/media/chevron-right-hc.svg create mode 100644 src/vs/workbench/browser/parts/panel/media/chevron-right-light.svg create mode 100644 src/vs/workbench/browser/parts/panel/media/chevron-up-dark.svg create mode 100644 src/vs/workbench/browser/parts/panel/media/chevron-up-hc.svg create mode 100644 src/vs/workbench/browser/parts/panel/media/chevron-up-light.svg create mode 100644 src/vs/workbench/browser/parts/panel/media/close-dark.svg create mode 100644 src/vs/workbench/browser/parts/panel/media/close-hc.svg delete mode 100644 src/vs/workbench/browser/parts/panel/media/close-inverse.svg create mode 100644 src/vs/workbench/browser/parts/panel/media/close-light.svg delete mode 100644 src/vs/workbench/browser/parts/panel/media/close.svg delete mode 100644 src/vs/workbench/browser/parts/panel/media/down-inverse.svg delete mode 100644 src/vs/workbench/browser/parts/panel/media/down.svg create mode 100644 src/vs/workbench/browser/parts/panel/media/ellipsis-dark.svg create mode 100644 src/vs/workbench/browser/parts/panel/media/ellipsis-hc.svg delete mode 100644 src/vs/workbench/browser/parts/panel/media/ellipsis-inverse.svg create mode 100644 src/vs/workbench/browser/parts/panel/media/ellipsis-light.svg delete mode 100644 src/vs/workbench/browser/parts/panel/media/ellipsis.svg delete mode 100755 src/vs/workbench/browser/parts/panel/media/left-inverse.svg delete mode 100755 src/vs/workbench/browser/parts/panel/media/left.svg delete mode 100755 src/vs/workbench/browser/parts/panel/media/right-inverse.svg delete mode 100755 src/vs/workbench/browser/parts/panel/media/right.svg delete mode 100644 src/vs/workbench/browser/parts/panel/media/up-inverse.svg delete mode 100644 src/vs/workbench/browser/parts/panel/media/up.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/clear-dark.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/clear-hc.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/clear-light.svg delete mode 100644 src/vs/workbench/contrib/debug/browser/media/clear-repl-inverse.svg delete mode 100644 src/vs/workbench/contrib/debug/browser/media/clear-repl.svg create mode 100644 src/vs/workbench/contrib/markers/browser/media/exclude-settings-dark.svg create mode 100644 src/vs/workbench/contrib/markers/browser/media/exclude-settings-hc.svg create mode 100644 src/vs/workbench/contrib/markers/browser/media/exclude-settings-light.svg delete mode 100755 src/vs/workbench/contrib/markers/browser/media/excludeSettings-dark.svg delete mode 100755 src/vs/workbench/contrib/markers/browser/media/excludeSettings.svg create mode 100644 src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix-hc.svg create mode 100644 src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix-light.svg delete mode 100644 src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix.svg create mode 100644 src/vs/workbench/contrib/markers/browser/media/lightbulb-hc.svg create mode 100644 src/vs/workbench/contrib/markers/browser/media/lightbulb-light.svg delete mode 100644 src/vs/workbench/contrib/markers/browser/media/lightbulb.svg create mode 100644 src/vs/workbench/contrib/output/browser/media/clear-dark.svg create mode 100644 src/vs/workbench/contrib/output/browser/media/clear-hc.svg create mode 100644 src/vs/workbench/contrib/output/browser/media/clear-light.svg delete mode 100644 src/vs/workbench/contrib/output/browser/media/clear_output.svg delete mode 100644 src/vs/workbench/contrib/output/browser/media/clear_output_inverse.svg create mode 100644 src/vs/workbench/contrib/output/browser/media/locked-dark.svg create mode 100644 src/vs/workbench/contrib/output/browser/media/locked-hc.svg create mode 100644 src/vs/workbench/contrib/output/browser/media/locked-light.svg create mode 100644 src/vs/workbench/contrib/output/browser/media/open-file-dark.svg create mode 100644 src/vs/workbench/contrib/output/browser/media/open-file-hc.svg create mode 100644 src/vs/workbench/contrib/output/browser/media/open-file-light.svg delete mode 100644 src/vs/workbench/contrib/output/browser/media/open_log_file.svg delete mode 100644 src/vs/workbench/contrib/output/browser/media/open_log_file_inverse.svg delete mode 100755 src/vs/workbench/contrib/output/browser/media/output_lock.svg delete mode 100755 src/vs/workbench/contrib/output/browser/media/output_lock_inverse.svg delete mode 100755 src/vs/workbench/contrib/output/browser/media/output_unlock.svg delete mode 100755 src/vs/workbench/contrib/output/browser/media/output_unlock_inverse.svg create mode 100644 src/vs/workbench/contrib/output/browser/media/unlocked-dark.svg create mode 100644 src/vs/workbench/contrib/output/browser/media/unlocked-hc.svg create mode 100644 src/vs/workbench/contrib/output/browser/media/unlocked-light.svg create mode 100644 src/vs/workbench/contrib/terminal/browser/media/configure-dark.svg create mode 100644 src/vs/workbench/contrib/terminal/browser/media/configure-hc.svg delete mode 100644 src/vs/workbench/contrib/terminal/browser/media/configure-inverse.svg create mode 100644 src/vs/workbench/contrib/terminal/browser/media/configure-light.svg delete mode 100644 src/vs/workbench/contrib/terminal/browser/media/configure.svg create mode 100644 src/vs/workbench/contrib/terminal/browser/media/kill-dark.svg create mode 100644 src/vs/workbench/contrib/terminal/browser/media/kill-hc.svg delete mode 100644 src/vs/workbench/contrib/terminal/browser/media/kill-inverse.svg create mode 100644 src/vs/workbench/contrib/terminal/browser/media/kill-light.svg delete mode 100644 src/vs/workbench/contrib/terminal/browser/media/kill.svg create mode 100644 src/vs/workbench/contrib/terminal/browser/media/new-dark.svg create mode 100644 src/vs/workbench/contrib/terminal/browser/media/new-hc.svg delete mode 100644 src/vs/workbench/contrib/terminal/browser/media/new-inverse.svg create mode 100644 src/vs/workbench/contrib/terminal/browser/media/new-light.svg delete mode 100644 src/vs/workbench/contrib/terminal/browser/media/new.svg create mode 100644 src/vs/workbench/contrib/terminal/browser/media/split-editor-horizontal-dark.svg create mode 100644 src/vs/workbench/contrib/terminal/browser/media/split-editor-horizontal-hc.svg create mode 100644 src/vs/workbench/contrib/terminal/browser/media/split-editor-horizontal-light.svg create mode 100644 src/vs/workbench/contrib/terminal/browser/media/split-editor-vertical-dark.svg create mode 100644 src/vs/workbench/contrib/terminal/browser/media/split-editor-vertical-hc.svg create mode 100644 src/vs/workbench/contrib/terminal/browser/media/split-editor-vertical-light.svg delete mode 100644 src/vs/workbench/contrib/terminal/browser/media/split-horizontal-inverse.svg delete mode 100644 src/vs/workbench/contrib/terminal/browser/media/split-horizontal.svg delete mode 100644 src/vs/workbench/contrib/terminal/browser/media/split-inverse.svg delete mode 100644 src/vs/workbench/contrib/terminal/browser/media/split.svg diff --git a/src/vs/base/parts/tree/browser/CollapseAll.svg b/src/vs/base/parts/tree/browser/CollapseAll.svg deleted file mode 100644 index 7d11a30f6e0..00000000000 --- a/src/vs/base/parts/tree/browser/CollapseAll.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/base/parts/tree/browser/CollapseAll_inverse.svg b/src/vs/base/parts/tree/browser/CollapseAll_inverse.svg deleted file mode 100644 index 46a65fff71a..00000000000 --- a/src/vs/base/parts/tree/browser/CollapseAll_inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/base/parts/tree/browser/collapse-all-dark.svg b/src/vs/base/parts/tree/browser/collapse-all-dark.svg new file mode 100644 index 00000000000..4a3ae7f6009 --- /dev/null +++ b/src/vs/base/parts/tree/browser/collapse-all-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/base/parts/tree/browser/collapse-all-hc.svg b/src/vs/base/parts/tree/browser/collapse-all-hc.svg new file mode 100644 index 00000000000..f2e0e5dd5f6 --- /dev/null +++ b/src/vs/base/parts/tree/browser/collapse-all-hc.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/base/parts/tree/browser/collapse-all-light.svg b/src/vs/base/parts/tree/browser/collapse-all-light.svg new file mode 100644 index 00000000000..cb5e5229717 --- /dev/null +++ b/src/vs/base/parts/tree/browser/collapse-all-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/base/parts/tree/browser/tree.css b/src/vs/base/parts/tree/browser/tree.css index a1ed6e311f7..2a3cb47ddbb 100644 --- a/src/vs/base/parts/tree/browser/tree.css +++ b/src/vs/base/parts/tree/browser/tree.css @@ -112,10 +112,13 @@ } .monaco-tree-action.collapse-all { - background: url('CollapseAll.svg') center center no-repeat; + background: url('collapse-all-light.svg') center center no-repeat; } -.hc-black .monaco-tree-action.collapse-all, .vs-dark .monaco-tree-action.collapse-all { - background: url('CollapseAll_inverse.svg') center center no-repeat; + background: url('collapse-all-dark.svg') center center no-repeat; +} + +.hc-black .monaco-tree-action.collapse-all { + background: url('collapse-all-hc.svg') center center no-repeat; } diff --git a/src/vs/workbench/browser/parts/panel/media/chevron-down-dark.svg b/src/vs/workbench/browser/parts/panel/media/chevron-down-dark.svg new file mode 100644 index 00000000000..64e67427103 --- /dev/null +++ b/src/vs/workbench/browser/parts/panel/media/chevron-down-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/panel/media/chevron-down-hc.svg b/src/vs/workbench/browser/parts/panel/media/chevron-down-hc.svg new file mode 100644 index 00000000000..a1085f2ad07 --- /dev/null +++ b/src/vs/workbench/browser/parts/panel/media/chevron-down-hc.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/panel/media/chevron-down-light.svg b/src/vs/workbench/browser/parts/panel/media/chevron-down-light.svg new file mode 100644 index 00000000000..169ce8a356a --- /dev/null +++ b/src/vs/workbench/browser/parts/panel/media/chevron-down-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/panel/media/chevron-left-dark.svg b/src/vs/workbench/browser/parts/panel/media/chevron-left-dark.svg new file mode 100644 index 00000000000..9367ad6e69f --- /dev/null +++ b/src/vs/workbench/browser/parts/panel/media/chevron-left-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/panel/media/chevron-left-hc.svg b/src/vs/workbench/browser/parts/panel/media/chevron-left-hc.svg new file mode 100644 index 00000000000..beedb2a1a61 --- /dev/null +++ b/src/vs/workbench/browser/parts/panel/media/chevron-left-hc.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/panel/media/chevron-left-light.svg b/src/vs/workbench/browser/parts/panel/media/chevron-left-light.svg new file mode 100644 index 00000000000..97a676e3d9d --- /dev/null +++ b/src/vs/workbench/browser/parts/panel/media/chevron-left-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/panel/media/chevron-right-dark.svg b/src/vs/workbench/browser/parts/panel/media/chevron-right-dark.svg new file mode 100644 index 00000000000..6cfda49f3b8 --- /dev/null +++ b/src/vs/workbench/browser/parts/panel/media/chevron-right-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/panel/media/chevron-right-hc.svg b/src/vs/workbench/browser/parts/panel/media/chevron-right-hc.svg new file mode 100644 index 00000000000..829e53760f2 --- /dev/null +++ b/src/vs/workbench/browser/parts/panel/media/chevron-right-hc.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/panel/media/chevron-right-light.svg b/src/vs/workbench/browser/parts/panel/media/chevron-right-light.svg new file mode 100644 index 00000000000..2da1410a45e --- /dev/null +++ b/src/vs/workbench/browser/parts/panel/media/chevron-right-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/panel/media/chevron-up-dark.svg b/src/vs/workbench/browser/parts/panel/media/chevron-up-dark.svg new file mode 100644 index 00000000000..69d9383d90a --- /dev/null +++ b/src/vs/workbench/browser/parts/panel/media/chevron-up-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/panel/media/chevron-up-hc.svg b/src/vs/workbench/browser/parts/panel/media/chevron-up-hc.svg new file mode 100644 index 00000000000..bba316df104 --- /dev/null +++ b/src/vs/workbench/browser/parts/panel/media/chevron-up-hc.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/panel/media/chevron-up-light.svg b/src/vs/workbench/browser/parts/panel/media/chevron-up-light.svg new file mode 100644 index 00000000000..9657f8034df --- /dev/null +++ b/src/vs/workbench/browser/parts/panel/media/chevron-up-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/panel/media/close-dark.svg b/src/vs/workbench/browser/parts/panel/media/close-dark.svg new file mode 100644 index 00000000000..e0475f7b85a --- /dev/null +++ b/src/vs/workbench/browser/parts/panel/media/close-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/browser/parts/panel/media/close-hc.svg b/src/vs/workbench/browser/parts/panel/media/close-hc.svg new file mode 100644 index 00000000000..64618b61760 --- /dev/null +++ b/src/vs/workbench/browser/parts/panel/media/close-hc.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/browser/parts/panel/media/close-inverse.svg b/src/vs/workbench/browser/parts/panel/media/close-inverse.svg deleted file mode 100644 index a174033d912..00000000000 --- a/src/vs/workbench/browser/parts/panel/media/close-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/panel/media/close-light.svg b/src/vs/workbench/browser/parts/panel/media/close-light.svg new file mode 100644 index 00000000000..3bd44674699 --- /dev/null +++ b/src/vs/workbench/browser/parts/panel/media/close-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/browser/parts/panel/media/close.svg b/src/vs/workbench/browser/parts/panel/media/close.svg deleted file mode 100644 index f4038b8bfa5..00000000000 --- a/src/vs/workbench/browser/parts/panel/media/close.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/panel/media/down-inverse.svg b/src/vs/workbench/browser/parts/panel/media/down-inverse.svg deleted file mode 100644 index 15349446dfb..00000000000 --- a/src/vs/workbench/browser/parts/panel/media/down-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/panel/media/down.svg b/src/vs/workbench/browser/parts/panel/media/down.svg deleted file mode 100644 index 7de26bd8749..00000000000 --- a/src/vs/workbench/browser/parts/panel/media/down.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/panel/media/ellipsis-dark.svg b/src/vs/workbench/browser/parts/panel/media/ellipsis-dark.svg new file mode 100644 index 00000000000..2c52e359f61 --- /dev/null +++ b/src/vs/workbench/browser/parts/panel/media/ellipsis-dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/workbench/browser/parts/panel/media/ellipsis-hc.svg b/src/vs/workbench/browser/parts/panel/media/ellipsis-hc.svg new file mode 100644 index 00000000000..3d7068f6b4c --- /dev/null +++ b/src/vs/workbench/browser/parts/panel/media/ellipsis-hc.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/workbench/browser/parts/panel/media/ellipsis-inverse.svg b/src/vs/workbench/browser/parts/panel/media/ellipsis-inverse.svg deleted file mode 100644 index e3337557a23..00000000000 --- a/src/vs/workbench/browser/parts/panel/media/ellipsis-inverse.svg +++ /dev/null @@ -1 +0,0 @@ -Ellipsis_bold_16x \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/panel/media/ellipsis-light.svg b/src/vs/workbench/browser/parts/panel/media/ellipsis-light.svg new file mode 100644 index 00000000000..883d2722ce3 --- /dev/null +++ b/src/vs/workbench/browser/parts/panel/media/ellipsis-light.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/workbench/browser/parts/panel/media/ellipsis.svg b/src/vs/workbench/browser/parts/panel/media/ellipsis.svg deleted file mode 100644 index e3f85623356..00000000000 --- a/src/vs/workbench/browser/parts/panel/media/ellipsis.svg +++ /dev/null @@ -1 +0,0 @@ -Ellipsis_bold_16x \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/panel/media/left-inverse.svg b/src/vs/workbench/browser/parts/panel/media/left-inverse.svg deleted file mode 100755 index c5c4f472b4d..00000000000 --- a/src/vs/workbench/browser/parts/panel/media/left-inverse.svg +++ /dev/null @@ -1 +0,0 @@ -CollapseChevronLeft_md_16x \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/panel/media/left.svg b/src/vs/workbench/browser/parts/panel/media/left.svg deleted file mode 100755 index 324ab15b1ec..00000000000 --- a/src/vs/workbench/browser/parts/panel/media/left.svg +++ /dev/null @@ -1 +0,0 @@ -CollapseChevronLeft_md_16x \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/panel/media/panelpart.css b/src/vs/workbench/browser/parts/panel/media/panelpart.css index ce309151e69..d73a1526f7f 100644 --- a/src/vs/workbench/browser/parts/panel/media/panelpart.css +++ b/src/vs/workbench/browser/parts/panel/media/panelpart.css @@ -37,7 +37,7 @@ /** Panel Switcher */ .monaco-workbench .part.panel > .title > .panel-switcher-container.composite-bar > .monaco-action-bar .action-label.toggle-more { - background-image: url('ellipsis.svg'); + background-image: url('ellipsis-light.svg'); display: block; height: 28px; min-width: 28px; @@ -48,6 +48,14 @@ background-position: center center; } +.vs-dark .monaco-workbench .part.panel > .title > .panel-switcher-container.composite-bar > .monaco-action-bar .action-label.toggle-more { + background-image: url('ellipsis-dark.svg'); +} + +.hc-black .monaco-workbench .part.panel > .title > .panel-switcher-container.composite-bar > .monaco-action-bar .action-label.toggle-more { + background-image: url('ellipsis-hc.svg'); +} + .monaco-workbench .part.panel > .title > .panel-switcher-container > .monaco-action-bar { line-height: 27px; /* matches panel titles in settings */ height: 35px; @@ -107,52 +115,68 @@ margin-right: 10px; } +/* Close */ .monaco-workbench .hide-panel-action { - background: url('close.svg') center center no-repeat; + background: url('close-light.svg') center center no-repeat; } -.monaco-workbench .maximize-panel-action { - background-image: url('up.svg'); +.vs-dark .monaco-workbench .hide-panel-action { + background: url('close-dark.svg') center center no-repeat; } -.monaco-workbench .panel.right .maximize-panel-action { - background-image: url('left.svg'); -} - -.vs-dark .monaco-workbench .maximize-panel-action, -.hc-black .monaco-workbench .maximize-panel-action { - background-image: url('up-inverse.svg'); -} - -.vs-dark .monaco-workbench .panel.right .maximize-panel-action, -.hc-black .monaco-workbench .panel.right .maximize-panel-action { - background-image: url('left-inverse.svg'); -} - -.monaco-workbench .minimize-panel-action { - background-image: url('down.svg'); -} - -.monaco-workbench .panel.right .minimize-panel-action { - background-image: url('right.svg'); -} - -.vs-dark .monaco-workbench .minimize-panel-action, -.hc-black .monaco-workbench .minimize-panel-action { - background-image: url('down-inverse.svg'); -} - -.vs-dark .monaco-workbench .panel.right .minimize-panel-action, -.hc-black .monaco-workbench .panel.right .minimize-panel-action { - background-image: url('right-inverse.svg'); -} - -.vs-dark .monaco-workbench .hide-panel-action, .hc-black .monaco-workbench .hide-panel-action { - background: url('close-inverse.svg') center center no-repeat; + background: url('close-hc.svg') center center no-repeat; } -.vs-dark .monaco-workbench .part.panel > .title > .panel-switcher-container.composite-bar > .monaco-action-bar .action-label.toggle-more, -.hc-black .monaco-workbench .part.panel > .title > .panel-switcher-container.composite-bar > .monaco-action-bar .action-label.toggle-more { - background-image: url('ellipsis-inverse.svg'); + +/* Up */ +.monaco-workbench .maximize-panel-action { + background-image: url('chevron-up-light.svg'); } + +.vs-dark .monaco-workbench .maximize-panel-action { + background-image: url('chevron-up-dark.svg'); +} + +.hc-black .monaco-workbench .maximize-panel-action { + background-image: url('chevron-up-hc.svg'); +} + +/* Down */ +.monaco-workbench .minimize-panel-action { + background-image: url('chevron-down-light.svg'); +} + +.vs-dark .monaco-workbench .minimize-panel-action { + background-image: url('chevron-down-dark.svg'); +} + +.hc-black .monaco-workbench .minimize-panel-action { + background-image: url('chevron-down-hc.svg'); +} + +/* Left */ +.monaco-workbench .panel.right .maximize-panel-action { + background-image: url('chevron-left-light.svg'); +} + +.vs-dark .monaco-workbench .panel.right .maximize-panel-action { + background-image: url('chevron-left-dark.svg'); +} + +.hc-black .monaco-workbench .panel.right .maximize-panel-action { + background-image: url('chevron-left-hc.svg'); +} + +/* Right */ +.monaco-workbench .panel.right .minimize-panel-action { + background-image: url('chevron-right-light.svg'); +} + +.vs-dark .monaco-workbench .panel.right .minimize-panel-action { + background-image: url('chevron-right-dark.svg'); +} + +.hc-black .monaco-workbench .panel.right .minimize-panel-action { + background-image: url('chevron-right-hc.svg'); +} \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/panel/media/right-inverse.svg b/src/vs/workbench/browser/parts/panel/media/right-inverse.svg deleted file mode 100755 index 80feab48cb7..00000000000 --- a/src/vs/workbench/browser/parts/panel/media/right-inverse.svg +++ /dev/null @@ -1 +0,0 @@ -ExpandChevronRight_md_16x \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/panel/media/right.svg b/src/vs/workbench/browser/parts/panel/media/right.svg deleted file mode 100755 index e647754a7a7..00000000000 --- a/src/vs/workbench/browser/parts/panel/media/right.svg +++ /dev/null @@ -1 +0,0 @@ -ExpandChevronRight_md_16x \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/panel/media/up-inverse.svg b/src/vs/workbench/browser/parts/panel/media/up-inverse.svg deleted file mode 100644 index e0c06e9fe9d..00000000000 --- a/src/vs/workbench/browser/parts/panel/media/up-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/panel/media/up.svg b/src/vs/workbench/browser/parts/panel/media/up.svg deleted file mode 100644 index 08165de8c52..00000000000 --- a/src/vs/workbench/browser/parts/panel/media/up.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/clear-dark.svg b/src/vs/workbench/contrib/debug/browser/media/clear-dark.svg new file mode 100644 index 00000000000..04d64ab41ca --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/clear-dark.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/clear-hc.svg b/src/vs/workbench/contrib/debug/browser/media/clear-hc.svg new file mode 100644 index 00000000000..44a41edd3b3 --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/clear-hc.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/clear-light.svg b/src/vs/workbench/contrib/debug/browser/media/clear-light.svg new file mode 100644 index 00000000000..f6a51c856f0 --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/clear-light.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/clear-repl-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/clear-repl-inverse.svg deleted file mode 100644 index 85e7ec4bdaf..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/clear-repl-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/clear-repl.svg b/src/vs/workbench/contrib/debug/browser/media/clear-repl.svg deleted file mode 100644 index ef02703e10b..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/clear-repl.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/repl.css b/src/vs/workbench/contrib/debug/browser/media/repl.css index ab9f53ecf2a..cc91935610c 100644 --- a/src/vs/workbench/contrib/debug/browser/media/repl.css +++ b/src/vs/workbench/contrib/debug/browser/media/repl.css @@ -85,12 +85,15 @@ /* Actions */ .debug-action.clear-repl { - background: url('clear-repl.svg') center center no-repeat; + background: url('clear-light.svg') center center no-repeat; +} + +.vs-dark .debug-action.clear-repl { + background: url('clear-dark.svg') center center no-repeat; } -.vs-dark .debug-action.clear-repl, .hc-black .debug-action.clear-repl { - background: url('clear-repl-inverse.svg') center center no-repeat; + background: url('clear-hc.svg') center center no-repeat; } /* Output coloring and styling */ diff --git a/src/vs/workbench/contrib/markers/browser/media/exclude-settings-dark.svg b/src/vs/workbench/contrib/markers/browser/media/exclude-settings-dark.svg new file mode 100644 index 00000000000..1bfca289bd7 --- /dev/null +++ b/src/vs/workbench/contrib/markers/browser/media/exclude-settings-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/markers/browser/media/exclude-settings-hc.svg b/src/vs/workbench/contrib/markers/browser/media/exclude-settings-hc.svg new file mode 100644 index 00000000000..ab06ba33068 --- /dev/null +++ b/src/vs/workbench/contrib/markers/browser/media/exclude-settings-hc.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/markers/browser/media/exclude-settings-light.svg b/src/vs/workbench/contrib/markers/browser/media/exclude-settings-light.svg new file mode 100644 index 00000000000..8adf3e518fc --- /dev/null +++ b/src/vs/workbench/contrib/markers/browser/media/exclude-settings-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/markers/browser/media/excludeSettings-dark.svg b/src/vs/workbench/contrib/markers/browser/media/excludeSettings-dark.svg deleted file mode 100755 index 3eeedcb41c6..00000000000 --- a/src/vs/workbench/contrib/markers/browser/media/excludeSettings-dark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/markers/browser/media/excludeSettings.svg b/src/vs/workbench/contrib/markers/browser/media/excludeSettings.svg deleted file mode 100755 index 79decb032b1..00000000000 --- a/src/vs/workbench/contrib/markers/browser/media/excludeSettings.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix-dark.svg b/src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix-dark.svg index 40678e79d7d..f74bffe92ad 100644 --- a/src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix-dark.svg +++ b/src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix-dark.svg @@ -1,10 +1,4 @@ - - - - - - - - + + diff --git a/src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix-hc.svg b/src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix-hc.svg new file mode 100644 index 00000000000..f74bffe92ad --- /dev/null +++ b/src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix-hc.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix-light.svg b/src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix-light.svg new file mode 100644 index 00000000000..7bddb1c563d --- /dev/null +++ b/src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix.svg b/src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix.svg deleted file mode 100644 index a4b4858e4dc..00000000000 --- a/src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/src/vs/workbench/contrib/markers/browser/media/lightbulb-dark.svg b/src/vs/workbench/contrib/markers/browser/media/lightbulb-dark.svg index 520f78f3e55..9a72cf90233 100644 --- a/src/vs/workbench/contrib/markers/browser/media/lightbulb-dark.svg +++ b/src/vs/workbench/contrib/markers/browser/media/lightbulb-dark.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/src/vs/workbench/contrib/markers/browser/media/lightbulb-hc.svg b/src/vs/workbench/contrib/markers/browser/media/lightbulb-hc.svg new file mode 100644 index 00000000000..9a72cf90233 --- /dev/null +++ b/src/vs/workbench/contrib/markers/browser/media/lightbulb-hc.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/markers/browser/media/lightbulb-light.svg b/src/vs/workbench/contrib/markers/browser/media/lightbulb-light.svg new file mode 100644 index 00000000000..4c2c0f8db96 --- /dev/null +++ b/src/vs/workbench/contrib/markers/browser/media/lightbulb-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/markers/browser/media/lightbulb.svg b/src/vs/workbench/contrib/markers/browser/media/lightbulb.svg deleted file mode 100644 index b3596046616..00000000000 --- a/src/vs/workbench/contrib/markers/browser/media/lightbulb.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/markers/browser/media/markers.css b/src/vs/workbench/contrib/markers/browser/media/markers.css index 1adb0c258bc..af371a13b18 100644 --- a/src/vs/workbench/contrib/markers/browser/media/markers.css +++ b/src/vs/workbench/contrib/markers/browser/media/markers.css @@ -57,12 +57,16 @@ } .vs .markers-panel-action-filter > .markers-panel-filter-controls > .markers-panel-filter-filesExclude { - background: url('excludeSettings.svg') center center no-repeat; + background: url('exclude-settings-light.svg') center center no-repeat; } .vs-dark .markers-panel-action-filter > .markers-panel-filter-controls > .markers-panel-filter-filesExclude, .hc-black .markers-panel-action-filter > .markers-panel-filter-controls > .markers-panel-filter-filesExclude { - background: url('excludeSettings-dark.svg') center center no-repeat; + background: url('exclude-settings-dark.svg') center center no-repeat; +} + +.hc-black .markers-panel-action-filter > .markers-panel-filter-controls > .markers-panel-filter-filesExclude { + background: url('exclude-settings-hc.svg') center center no-repeat; } .markers-panel .markers-panel-container { @@ -163,23 +167,30 @@ } .markers-panel .monaco-tl-contents .actions .action-label.icon.markers-panel-action-quickfix { - background: url('lightbulb.svg') center/80% no-repeat; + background: url('lightbulb-light.svg') center/80% no-repeat; margin-right: 0px; } .markers-panel .monaco-tl-contents .actions .action-label.icon.markers-panel-action-quickfix.autofixable { - background: url('lightbulb-autofix.svg') center center no-repeat; + background: url('lightbulb-autofix-light.svg') center center no-repeat; } .vs-dark .markers-panel .monaco-tl-contents .actions .action-label.icon.markers-panel-action-quickfix { background: url('lightbulb-dark.svg') center/80% no-repeat; } -.vs-dark .markers-panel .monaco-tl-contents .actions .action-label.icon.markers-panel-action-quickfix.autofixable, -.hc-black .markers-panel .monaco-tl-contents .actions .action-label.icon.markers-panel-action-quickfix.autofixable { +.hc-black .markers-panel .monaco-tl-contents .actions .action-label.icon.markers-panel-action-quickfix { + background: url('lightbulb-hc.svg') center/80% no-repeat; +} + +.vs-dark .markers-panel .monaco-tl-contents .actions .action-label.icon.markers-panel-action-quickfix.autofixable { background: url('lightbulb-autofix-dark.svg') center center no-repeat; } +.hc-black .markers-panel .monaco-tl-contents .actions .action-label.icon.markers-panel-action-quickfix.autofixable { + background: url('lightbulb-autofix-hc.svg') center center no-repeat; +} + .markers-panel .monaco-tl-contents .actions .monaco-action-bar { display: none; } diff --git a/src/vs/workbench/contrib/output/browser/media/clear-dark.svg b/src/vs/workbench/contrib/output/browser/media/clear-dark.svg new file mode 100644 index 00000000000..1062295b4e9 --- /dev/null +++ b/src/vs/workbench/contrib/output/browser/media/clear-dark.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/vs/workbench/contrib/output/browser/media/clear-hc.svg b/src/vs/workbench/contrib/output/browser/media/clear-hc.svg new file mode 100644 index 00000000000..f0c5bdc29d9 --- /dev/null +++ b/src/vs/workbench/contrib/output/browser/media/clear-hc.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/vs/workbench/contrib/output/browser/media/clear-light.svg b/src/vs/workbench/contrib/output/browser/media/clear-light.svg new file mode 100644 index 00000000000..295bb2ca62e --- /dev/null +++ b/src/vs/workbench/contrib/output/browser/media/clear-light.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/vs/workbench/contrib/output/browser/media/clear_output.svg b/src/vs/workbench/contrib/output/browser/media/clear_output.svg deleted file mode 100644 index ef02703e10b..00000000000 --- a/src/vs/workbench/contrib/output/browser/media/clear_output.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/output/browser/media/clear_output_inverse.svg b/src/vs/workbench/contrib/output/browser/media/clear_output_inverse.svg deleted file mode 100644 index 85e7ec4bdaf..00000000000 --- a/src/vs/workbench/contrib/output/browser/media/clear_output_inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/output/browser/media/locked-dark.svg b/src/vs/workbench/contrib/output/browser/media/locked-dark.svg new file mode 100644 index 00000000000..903d26b6043 --- /dev/null +++ b/src/vs/workbench/contrib/output/browser/media/locked-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/output/browser/media/locked-hc.svg b/src/vs/workbench/contrib/output/browser/media/locked-hc.svg new file mode 100644 index 00000000000..70d268965a0 --- /dev/null +++ b/src/vs/workbench/contrib/output/browser/media/locked-hc.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/output/browser/media/locked-light.svg b/src/vs/workbench/contrib/output/browser/media/locked-light.svg new file mode 100644 index 00000000000..6342c0a75da --- /dev/null +++ b/src/vs/workbench/contrib/output/browser/media/locked-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/output/browser/media/open-file-dark.svg b/src/vs/workbench/contrib/output/browser/media/open-file-dark.svg new file mode 100644 index 00000000000..5cebcad2a8d --- /dev/null +++ b/src/vs/workbench/contrib/output/browser/media/open-file-dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/workbench/contrib/output/browser/media/open-file-hc.svg b/src/vs/workbench/contrib/output/browser/media/open-file-hc.svg new file mode 100644 index 00000000000..aabfc34c3e4 --- /dev/null +++ b/src/vs/workbench/contrib/output/browser/media/open-file-hc.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/workbench/contrib/output/browser/media/open-file-light.svg b/src/vs/workbench/contrib/output/browser/media/open-file-light.svg new file mode 100644 index 00000000000..e5b2a034bf8 --- /dev/null +++ b/src/vs/workbench/contrib/output/browser/media/open-file-light.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/workbench/contrib/output/browser/media/open_log_file.svg b/src/vs/workbench/contrib/output/browser/media/open_log_file.svg deleted file mode 100644 index d23a23c6b5f..00000000000 --- a/src/vs/workbench/contrib/output/browser/media/open_log_file.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/output/browser/media/open_log_file_inverse.svg b/src/vs/workbench/contrib/output/browser/media/open_log_file_inverse.svg deleted file mode 100644 index f6302185aa4..00000000000 --- a/src/vs/workbench/contrib/output/browser/media/open_log_file_inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/output/browser/media/output.css b/src/vs/workbench/contrib/output/browser/media/output.css index ab91a10c66c..0f19102cc38 100644 --- a/src/vs/workbench/contrib/output/browser/media/output.css +++ b/src/vs/workbench/contrib/output/browser/media/output.css @@ -4,37 +4,49 @@ *--------------------------------------------------------------------------------------------*/ .monaco-workbench .output-action.clear-output { - background: url('clear_output.svg') center center no-repeat; + background: url('clear-light.svg') center center no-repeat; +} + +.vs-dark .monaco-workbench .output-action.clear-output { + background: url('clear-dark.svg') center center no-repeat; } -.vs-dark .monaco-workbench .output-action.clear-output, .hc-black .monaco-workbench .output-action.clear-output { - background: url('clear_output_inverse.svg') center center no-repeat; + background: url('clear-hc.svg') center center no-repeat; } .monaco-workbench .output-action.output-scroll-lock { - background: url('output_lock.svg') center center no-repeat; + background: url('locked-light.svg') center center no-repeat; +} + +.vs-dark .monaco-workbench .output-action.output-scroll-lock { + background: url('locked-dark.svg') center center no-repeat; } -.vs-dark .monaco-workbench .output-action.output-scroll-lock, .hc-black .monaco-workbench .output-action.output-scroll-lock { - background: url('output_lock_inverse.svg') center center no-repeat; + background: url('locked-hc.svg') center center no-repeat; } .monaco-workbench .output-action.output-scroll-unlock { - background: url('output_unlock.svg') center center no-repeat; + background: url('unlocked-light.svg') center center no-repeat; +} + +.vs-dark .monaco-workbench .output-action.output-scroll-unlock { + background: url('unlocked-dark.svg') center center no-repeat; } -.vs-dark .monaco-workbench .output-action.output-scroll-unlock, .hc-black .monaco-workbench .output-action.output-scroll-unlock { - background: url('output_unlock_inverse.svg') center center no-repeat; + background: url('unlocked-hc.svg') center center no-repeat; } .monaco-workbench .output-action.open-log-file { - background: url('open_log_file.svg') center center no-repeat; + background: url('open-file-light.svg') center center no-repeat; } -.vs-dark .monaco-workbench .output-action.open-log-file, -.hc-black .monaco-workbench .output-action.open-log-file { - background: url('open_log_file_inverse.svg') center center no-repeat; +.vs-dark .monaco-workbench .output-action.open-log-file { + background: url('open-file-dark.svg') center center no-repeat; +} + +.hc-black .monaco-workbench .output-action.open-log-file { + background: url('open-file-hc.svg') center center no-repeat; } diff --git a/src/vs/workbench/contrib/output/browser/media/output_lock.svg b/src/vs/workbench/contrib/output/browser/media/output_lock.svg deleted file mode 100755 index ad3968a7754..00000000000 --- a/src/vs/workbench/contrib/output/browser/media/output_lock.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/output/browser/media/output_lock_inverse.svg b/src/vs/workbench/contrib/output/browser/media/output_lock_inverse.svg deleted file mode 100755 index 876fe60e4f0..00000000000 --- a/src/vs/workbench/contrib/output/browser/media/output_lock_inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/output/browser/media/output_unlock.svg b/src/vs/workbench/contrib/output/browser/media/output_unlock.svg deleted file mode 100755 index 39933c43aa8..00000000000 --- a/src/vs/workbench/contrib/output/browser/media/output_unlock.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/output/browser/media/output_unlock_inverse.svg b/src/vs/workbench/contrib/output/browser/media/output_unlock_inverse.svg deleted file mode 100755 index 4827413fc76..00000000000 --- a/src/vs/workbench/contrib/output/browser/media/output_unlock_inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/output/browser/media/unlocked-dark.svg b/src/vs/workbench/contrib/output/browser/media/unlocked-dark.svg new file mode 100644 index 00000000000..6d234b718f8 --- /dev/null +++ b/src/vs/workbench/contrib/output/browser/media/unlocked-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/output/browser/media/unlocked-hc.svg b/src/vs/workbench/contrib/output/browser/media/unlocked-hc.svg new file mode 100644 index 00000000000..cf8268d37d2 --- /dev/null +++ b/src/vs/workbench/contrib/output/browser/media/unlocked-hc.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/output/browser/media/unlocked-light.svg b/src/vs/workbench/contrib/output/browser/media/unlocked-light.svg new file mode 100644 index 00000000000..7b10223810c --- /dev/null +++ b/src/vs/workbench/contrib/output/browser/media/unlocked-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/terminal/browser/media/configure-dark.svg b/src/vs/workbench/contrib/terminal/browser/media/configure-dark.svg new file mode 100644 index 00000000000..4d1909627a7 --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/media/configure-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/terminal/browser/media/configure-hc.svg b/src/vs/workbench/contrib/terminal/browser/media/configure-hc.svg new file mode 100644 index 00000000000..cb206a1fb99 --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/media/configure-hc.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/terminal/browser/media/configure-inverse.svg b/src/vs/workbench/contrib/terminal/browser/media/configure-inverse.svg deleted file mode 100644 index 61baaea2b8b..00000000000 --- a/src/vs/workbench/contrib/terminal/browser/media/configure-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/terminal/browser/media/configure-light.svg b/src/vs/workbench/contrib/terminal/browser/media/configure-light.svg new file mode 100644 index 00000000000..727a34f26f3 --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/media/configure-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/terminal/browser/media/configure.svg b/src/vs/workbench/contrib/terminal/browser/media/configure.svg deleted file mode 100644 index 3dec2ba50fd..00000000000 --- a/src/vs/workbench/contrib/terminal/browser/media/configure.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/terminal/browser/media/kill-dark.svg b/src/vs/workbench/contrib/terminal/browser/media/kill-dark.svg new file mode 100644 index 00000000000..64a4999969e --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/media/kill-dark.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/vs/workbench/contrib/terminal/browser/media/kill-hc.svg b/src/vs/workbench/contrib/terminal/browser/media/kill-hc.svg new file mode 100644 index 00000000000..bc448290732 --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/media/kill-hc.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/vs/workbench/contrib/terminal/browser/media/kill-inverse.svg b/src/vs/workbench/contrib/terminal/browser/media/kill-inverse.svg deleted file mode 100644 index c26674c56de..00000000000 --- a/src/vs/workbench/contrib/terminal/browser/media/kill-inverse.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - diff --git a/src/vs/workbench/contrib/terminal/browser/media/kill-light.svg b/src/vs/workbench/contrib/terminal/browser/media/kill-light.svg new file mode 100644 index 00000000000..62204f0a110 --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/media/kill-light.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/vs/workbench/contrib/terminal/browser/media/kill.svg b/src/vs/workbench/contrib/terminal/browser/media/kill.svg deleted file mode 100644 index 8338bc81874..00000000000 --- a/src/vs/workbench/contrib/terminal/browser/media/kill.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - diff --git a/src/vs/workbench/contrib/terminal/browser/media/new-dark.svg b/src/vs/workbench/contrib/terminal/browser/media/new-dark.svg new file mode 100644 index 00000000000..4d9389336b9 --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/media/new-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/terminal/browser/media/new-hc.svg b/src/vs/workbench/contrib/terminal/browser/media/new-hc.svg new file mode 100644 index 00000000000..fb50c6c2849 --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/media/new-hc.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/terminal/browser/media/new-inverse.svg b/src/vs/workbench/contrib/terminal/browser/media/new-inverse.svg deleted file mode 100644 index affd825ceed..00000000000 --- a/src/vs/workbench/contrib/terminal/browser/media/new-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/terminal/browser/media/new-light.svg b/src/vs/workbench/contrib/terminal/browser/media/new-light.svg new file mode 100644 index 00000000000..01a9de7d5ab --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/media/new-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/terminal/browser/media/new.svg b/src/vs/workbench/contrib/terminal/browser/media/new.svg deleted file mode 100644 index a03a290258c..00000000000 --- a/src/vs/workbench/contrib/terminal/browser/media/new.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/terminal/browser/media/split-editor-horizontal-dark.svg b/src/vs/workbench/contrib/terminal/browser/media/split-editor-horizontal-dark.svg new file mode 100644 index 00000000000..ac4121490eb --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/media/split-editor-horizontal-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/terminal/browser/media/split-editor-horizontal-hc.svg b/src/vs/workbench/contrib/terminal/browser/media/split-editor-horizontal-hc.svg new file mode 100644 index 00000000000..c92025ddd92 --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/media/split-editor-horizontal-hc.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/terminal/browser/media/split-editor-horizontal-light.svg b/src/vs/workbench/contrib/terminal/browser/media/split-editor-horizontal-light.svg new file mode 100644 index 00000000000..b7701615a9d --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/media/split-editor-horizontal-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/terminal/browser/media/split-editor-vertical-dark.svg b/src/vs/workbench/contrib/terminal/browser/media/split-editor-vertical-dark.svg new file mode 100644 index 00000000000..dfe68163a9e --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/media/split-editor-vertical-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/terminal/browser/media/split-editor-vertical-hc.svg b/src/vs/workbench/contrib/terminal/browser/media/split-editor-vertical-hc.svg new file mode 100644 index 00000000000..f407c08fa34 --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/media/split-editor-vertical-hc.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/terminal/browser/media/split-editor-vertical-light.svg b/src/vs/workbench/contrib/terminal/browser/media/split-editor-vertical-light.svg new file mode 100644 index 00000000000..e7eca812f95 --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/media/split-editor-vertical-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/terminal/browser/media/split-horizontal-inverse.svg b/src/vs/workbench/contrib/terminal/browser/media/split-horizontal-inverse.svg deleted file mode 100644 index 4969d2e7851..00000000000 --- a/src/vs/workbench/contrib/terminal/browser/media/split-horizontal-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/terminal/browser/media/split-horizontal.svg b/src/vs/workbench/contrib/terminal/browser/media/split-horizontal.svg deleted file mode 100644 index c307f0142b8..00000000000 --- a/src/vs/workbench/contrib/terminal/browser/media/split-horizontal.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/terminal/browser/media/split-inverse.svg b/src/vs/workbench/contrib/terminal/browser/media/split-inverse.svg deleted file mode 100644 index 4eab7536698..00000000000 --- a/src/vs/workbench/contrib/terminal/browser/media/split-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/terminal/browser/media/split.svg b/src/vs/workbench/contrib/terminal/browser/media/split.svg deleted file mode 100644 index 6eccccfa00b..00000000000 --- a/src/vs/workbench/contrib/terminal/browser/media/split.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/terminal/browser/media/terminal.css b/src/vs/workbench/contrib/terminal/browser/media/terminal.css index c5da665535e..4009bfe4cf5 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/terminal.css +++ b/src/vs/workbench/contrib/terminal/browser/media/terminal.css @@ -147,15 +147,22 @@ } /* Light theme */ -.monaco-workbench .terminal-action.kill { background: url('kill.svg') center center no-repeat; } -.monaco-workbench .terminal-action.new { background: url('new.svg') center center no-repeat; } -.monaco-workbench .terminal-action.split { background: url('split.svg') center center no-repeat; } -.monaco-workbench .panel.right .terminal-action.split { background: url('split-horizontal.svg') center center no-repeat; } -/* Dark theme / HC theme */ -.vs-dark .monaco-workbench .terminal-action.kill, .hc-black .monaco-workbench .terminal-action.kill { background: url('kill-inverse.svg') center center no-repeat; } -.vs-dark .monaco-workbench .terminal-action.new, .hc-black .monaco-workbench .terminal-action.new { background: url('new-inverse.svg') center center no-repeat; } -.vs-dark .monaco-workbench .terminal-action.split, .hc-black .monaco-workbench .terminal-action.split { background: url('split-inverse.svg') center center no-repeat; } -.vs-dark .monaco-workbench .panel.right .terminal-action.split, .hc-black .monaco-workbench .panel.right .terminal-action.split { background: url('split-horizontal-inverse.svg') center center no-repeat; } +.monaco-workbench .terminal-action.kill { background: url('kill-light.svg') center center no-repeat; } +.monaco-workbench .terminal-action.new { background: url('new-light.svg') center center no-repeat; } +.monaco-workbench .terminal-action.split { background: url('split-editor-horizontal-light.svg') center center no-repeat; } +.monaco-workbench .panel.right .terminal-action.split { background: url('split-editor-vertical-light.svg') center center no-repeat; } + +/* Dark theme */ +.vs-dark .monaco-workbench .terminal-action.kill, .hc-black .monaco-workbench .terminal-action.kill { background: url('kill-dark.svg') center center no-repeat; } +.vs-dark .monaco-workbench .terminal-action.new, .hc-black .monaco-workbench .terminal-action.new { background: url('new-dark.svg') center center no-repeat; } +.vs-dark .monaco-workbench .terminal-action.split, .hc-black .monaco-workbench .terminal-action.split { background: url('split-editor-horizontal-dark.svg') center center no-repeat; } +.vs-dark .monaco-workbench .panel.right .terminal-action.split, .hc-black .monaco-workbench .panel.right .terminal-action.split { background: url('split-editor-vertical-dark.svg') center center no-repeat; } + +/* HC theme */ +.hc-black .monaco-workbench .terminal-action.kill, .hc-black .monaco-workbench .terminal-action.kill { background: url('kill-hc.svg') center center no-repeat; } +.hc-black .monaco-workbench .terminal-action.new, .hc-black .monaco-workbench .terminal-action.new { background: url('new-hc.svg') center center no-repeat; } +.hc-black .monaco-workbench .terminal-action.split, .hc-black .monaco-workbench .terminal-action.split { background: url('split-editor-horizontal-hc.svg') center center no-repeat; } +.hc-black .monaco-workbench .panel.right .terminal-action.split, .hc-black .monaco-workbench .panel.right .terminal-action.split { background: url('split-editor-vertical-hc.svg') center center no-repeat; } .vs-dark .monaco-workbench.mac .panel.integrated-terminal .terminal-outer-container:not(.alt-active) .terminal:not(.enable-mouse-events), .hc-black .monaco-workbench.mac .panel.integrated-terminal .terminal-outer-container:not(.alt-active) .terminal:not(.enable-mouse-events) { @@ -163,10 +170,13 @@ } .monaco-workbench .quick-open-terminal-configure { - background-image: url('configure.svg'); + background-image: url('configure-light.svg'); } -.vs-dark .monaco-workbench .quick-open-terminal-configure, -.hc-black .monaco-workbench .quick-open-terminal-configure { - background-image: url('configure-inverse.svg'); +.vs-dark .monaco-workbench .quick-open-terminal-configure { + background-image: url('configure-dark.svg'); +} + +.hc-black .monaco-workbench .quick-open-terminal-configure { + background-image: url('configure-hc.svg'); } From 24cdcfa52aad0625925abec263712f813d5ab184 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Wed, 19 Jun 2019 14:44:39 -0700 Subject: [PATCH 0403/1449] perpare for bundling --- .../browser/keyboardLayouts/layout.contribution.darwin.ts | 4 +++- .../browser/keyboardLayouts/layout.contribution.linux.ts | 2 ++ .../browser/keyboardLayouts/layout.contribution.win.ts | 2 ++ .../workbench/services/keybinding/browser/keymapService.ts | 5 ++--- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.darwin.ts index 043b9e0261f..8de0fa205a3 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.darwin.ts @@ -17,4 +17,6 @@ import 'vs/workbench/services/keybinding/browser/keyboardLayouts/pl.darwin'; import 'vs/workbench/services/keybinding/browser/keyboardLayouts/it.darwin'; import 'vs/workbench/services/keybinding/browser/keyboardLayouts/ru.darwin'; import 'vs/workbench/services/keybinding/browser/keyboardLayouts/pt.darwin'; -import 'vs/workbench/services/keybinding/browser/keyboardLayouts/ko.darwin'; \ No newline at end of file +import 'vs/workbench/services/keybinding/browser/keyboardLayouts/ko.darwin'; + +export { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.linux.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.linux.ts index b1aeb2eafd5..6561501fce4 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.linux.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.linux.ts @@ -8,3 +8,5 @@ import 'vs/workbench/services/keybinding/browser/keyboardLayouts/es.linux'; import 'vs/workbench/services/keybinding/browser/keyboardLayouts/de.linux'; import 'vs/workbench/services/keybinding/browser/keyboardLayouts/fr.linux'; import 'vs/workbench/services/keybinding/browser/keyboardLayouts/ru.linux'; + +export { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.win.ts index 5bc8dd0c530..bb85b252f90 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.win.ts @@ -25,3 +25,5 @@ import 'vs/workbench/services/keybinding/browser/keyboardLayouts/hu.win'; import 'vs/workbench/services/keybinding/browser/keyboardLayouts/de-swiss.win'; import 'vs/workbench/services/keybinding/browser/keyboardLayouts/en-belgian.win'; import 'vs/workbench/services/keybinding/browser/keyboardLayouts/cz.win'; + +export { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keymapService.ts b/src/vs/workbench/services/keybinding/browser/keymapService.ts index bd005db83b8..12cae6abfae 100644 --- a/src/vs/workbench/services/keybinding/browser/keymapService.ts +++ b/src/vs/workbench/services/keybinding/browser/keymapService.ts @@ -29,7 +29,6 @@ import { Extensions as ConfigExtensions, IConfigurationRegistry, IConfigurationN import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { INavigatorWithKeyboard } from 'vs/workbench/services/keybinding/common/navigatorKeyboard'; import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; export class BrowserKeyboardMapperFactory { public static readonly INSTANCE = new BrowserKeyboardMapperFactory(); @@ -77,8 +76,8 @@ export class BrowserKeyboardMapperFactory { const platform = isWindows ? 'win' : isMacintosh ? 'darwin' : 'linux'; - import('vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.' + platform).then(() => { - this._keymapInfos.push(...KeyboardLayoutContribution.INSTANCE.layoutInfos); + import('vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.' + platform).then((m) => { + this._keymapInfos.push(...m.KeyboardLayoutContribution.INSTANCE.layoutInfos); this._mru = this._keymapInfos; this._initialized = true; this.onKeyboardLayoutChanged(); From 146eb0714a4f38eadf3129f74bcb6ff0179ec039 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 20 Jun 2019 00:08:27 +0200 Subject: [PATCH 0404/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 194d5b8211e..daad56f2151 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "3e1131ebd0c20e1929317fcb7925e915007b1303", + "distro": "2db0078dd120f831be4c40bf03fca6ad584f77d0", "author": { "name": "Microsoft Corporation" }, From 0aab08edf27db421b8a1a764e4f30ca4b8629255 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 19 Jun 2019 15:25:44 -0700 Subject: [PATCH 0405/1449] Add getDefaultShellAndArgs Also differentiate default from system shell --- .../api/browser/mainThreadTerminalService.ts | 17 ++++------- .../workbench/api/common/extHost.protocol.ts | 6 ++++ .../api/node/extHostTerminalService.ts | 29 +++++++++++++++---- .../workbench/contrib/debug/node/terminals.ts | 8 ++--- .../tasks/browser/terminalTaskSystem.ts | 4 +-- .../contrib/terminal/browser/terminal.ts | 4 ++- .../browser/terminalInstanceService.ts | 8 ++++- .../browser/terminalProcessManager.ts | 4 ++- .../contrib/terminal/common/terminal.ts | 4 +++ .../terminal/common/terminalEnvironment.ts | 3 +- .../electron-browser/terminal.contribution.ts | 4 +-- .../terminalInstanceService.ts | 23 +++++++++++++-- .../contrib/terminal/node/terminal.ts | 15 ++++++---- .../terminalLinkHandler.test.ts | 5 ++++ 14 files changed, 98 insertions(+), 36 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index 270f8e332fd..e730222d096 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { ITerminalService, ITerminalInstance, IShellLaunchConfig, ITerminalProcessExtHostProxy, ITerminalProcessExtHostRequest, ITerminalDimensions, EXT_HOST_CREATION_DELAY, IShellDefinition } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ITerminalService, ITerminalInstance, IShellLaunchConfig, ITerminalProcessExtHostProxy, ITerminalProcessExtHostRequest, ITerminalDimensions, EXT_HOST_CREATION_DELAY } from 'vs/workbench/contrib/terminal/common/terminal'; import { ExtHostContext, ExtHostTerminalServiceShape, MainThreadTerminalServiceShape, MainContext, IExtHostContext, ShellLaunchConfigDto } from 'vs/workbench/api/common/extHost.protocol'; import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { UriComponents, URI } from 'vs/base/common/uri'; @@ -46,11 +46,14 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape this._toDispose.push(_terminalService.onActiveInstanceChanged(instance => this._onActiveTerminalChanged(instance ? instance.id : null))); this._toDispose.push(_terminalService.onInstanceTitleChanged(instance => this._onTitleChanged(instance.id, instance.title))); this._toDispose.push(_terminalService.configHelper.onWorkspacePermissionsChanged(isAllowed => this._onWorkspacePermissionsChanged(isAllowed))); - this._toDispose.push(_terminalService.onRequestAvailableShells(r => this._onRequestAvailableShells(r))); + this._toDispose.push(_terminalService.onRequestAvailableShells(r => this._proxy.$requestAvailableShells().then(e => r(e)))); // ITerminalInstanceService listeners if (terminalInstanceService.onRequestDefaultShell) { - this._toDispose.push(terminalInstanceService.onRequestDefaultShell(r => this._onRequestDefaultShell(r))); + this._toDispose.push(terminalInstanceService.onRequestDefaultShell(r => this._proxy.$requestDefaultShell().then(e => r(e)))); + } + if (terminalInstanceService.onRequestDefaultShellAndArgs) { + this._toDispose.push(terminalInstanceService.onRequestDefaultShellAndArgs(r => this._proxy.$requestDefaultShellAndArgs().then(e => r(e.shell, e.args)))); } // Set initial ext host state @@ -285,12 +288,4 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape } this._terminalProcesses[terminalId].emitLatency(sum / COUNT); } - - private _onRequestAvailableShells(resolve: (shells: IShellDefinition[]) => void): void { - this._proxy.$requestAvailableShells().then(e => resolve(e)); - } - - private _onRequestDefaultShell(resolve: (defaultShell: string) => void): void { - this._proxy.$requestDefaultShell().then(e => resolve(e)); - } } diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index f5c00e92830..e3ceb14440a 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -1111,6 +1111,11 @@ export interface IShellDefinitionDto { path: string; } +export interface IShellAndArgsDto { + shell: string; + args: string[] | string | undefined; +} + export interface ExtHostTerminalServiceShape { $acceptTerminalClosed(id: number): void; $acceptTerminalOpened(id: number, name: string): void; @@ -1130,6 +1135,7 @@ export interface ExtHostTerminalServiceShape { $acceptWorkspacePermissionsChanged(isAllowed: boolean): void; $requestAvailableShells(): Promise; $requestDefaultShell(): Promise; + $requestDefaultShellAndArgs(): Promise; } export interface ExtHostSCMShape { diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 9bcfd2d149f..749487c88e1 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -10,7 +10,7 @@ import { URI, UriComponents } from 'vs/base/common/uri'; import * as platform from 'vs/base/common/platform'; import * as terminalEnvironment from 'vs/workbench/contrib/terminal/common/terminalEnvironment'; import { Event, Emitter } from 'vs/base/common/event'; -import { ExtHostTerminalServiceShape, MainContext, MainThreadTerminalServiceShape, IMainContext, ShellLaunchConfigDto, IShellDefinitionDto } from 'vs/workbench/api/common/extHost.protocol'; +import { ExtHostTerminalServiceShape, MainContext, MainThreadTerminalServiceShape, IMainContext, ShellLaunchConfigDto, IShellDefinitionDto, IShellAndArgsDto } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostConfiguration, ExtHostConfigProvider } from 'vs/workbench/api/common/extHostConfiguration'; import { ILogService } from 'vs/platform/log/common/log'; import { EXT_HOST_CREATION_DELAY, IShellLaunchConfig, ITerminalEnvironment } from 'vs/workbench/contrib/terminal/common/terminal'; @@ -20,7 +20,7 @@ import { ExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { ExtHostVariableResolverService } from 'vs/workbench/api/node/extHostDebugService'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; -import { getDefaultShell, detectAvailableShells } from 'vs/workbench/contrib/terminal/node/terminal'; +import { getSystemShell, detectAvailableShells } from 'vs/workbench/contrib/terminal/node/terminal'; const RENDERER_NO_PROCESS_ID = -1; @@ -338,12 +338,22 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { return terminalEnvironment.getDefaultShell( fetchSetting, this._isWorkspaceShellAllowed, - getDefaultShell(platform.platform), + getSystemShell(platform.platform), process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432'), process.env.windir ); } + private _getDefaultShellArgs(configProvider: ExtHostConfigProvider): string[] | string | undefined { + const fetchSetting = (key: string) => { + const setting = configProvider + .getConfiguration(key.substr(0, key.lastIndexOf('.'))) + .inspect(key.substr(key.lastIndexOf('.') + 1)); + return this._apiInspectConfigToPlain(setting); + }; + return terminalEnvironment.getDefaultShellArgs(fetchSetting, this._isWorkspaceShellAllowed); + } + public async resolveTerminalRenderer(id: number): Promise { // Check to see if the extension host already knows about this terminal. for (const terminalRenderer of this._terminalRenderers) { @@ -495,7 +505,7 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { shellLaunchConfig, fetchSetting, isWorkspaceShellAllowed || false, - getDefaultShell(platform.platform), + getSystemShell(platform.platform), process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432'), process.env.windir ); @@ -579,8 +589,17 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { return detectAvailableShells(); } + // TODO: Remove this once requestDefaultShellAndArgs is working public $requestDefaultShell(): Promise { - return Promise.resolve(getDefaultShell(platform.platform)); + return Promise.resolve(getSystemShell(platform.platform)); + } + + public async $requestDefaultShellAndArgs(): Promise { + const configProvider = await this._extHostConfiguration.getConfigProvider(); + return Promise.resolve({ + shell: this.getDefaultShell(configProvider), + args: this._getDefaultShellArgs(configProvider) + }); } private _onProcessExit(id: number, exitCode: number): void { diff --git a/src/vs/workbench/contrib/debug/node/terminals.ts b/src/vs/workbench/contrib/debug/node/terminals.ts index 300c738f0eb..164dd27a15a 100644 --- a/src/vs/workbench/contrib/debug/node/terminals.ts +++ b/src/vs/workbench/contrib/debug/node/terminals.ts @@ -10,7 +10,7 @@ import * as pfs from 'vs/base/node/pfs'; import { assign } from 'vs/base/common/objects'; import { ITerminalLauncher, ITerminalSettings } from 'vs/workbench/contrib/debug/common/debug'; import { getPathFromAmdModule } from 'vs/base/common/amd'; -import { getDefaultShell } from 'vs/workbench/contrib/terminal/node/terminal'; +import { getSystemShell } from 'vs/workbench/contrib/terminal/node/terminal'; const TERMINAL_TITLE = nls.localize('console.title', "VS Code Console"); @@ -315,13 +315,13 @@ export function prepareCommand(args: DebugProtocol.RunInTerminalRequestArguments let shell: string; const shell_config = config.integrated.shell; if (env.isWindows) { - shell = shell_config.windows || getDefaultShell(env.Platform.Windows); + shell = shell_config.windows || getSystemShell(env.Platform.Windows); shellType = ShellType.cmd; } else if (env.isLinux) { - shell = shell_config.linux || getDefaultShell(env.Platform.Linux); + shell = shell_config.linux || getSystemShell(env.Platform.Linux); shellType = ShellType.bash; } else if (env.isMacintosh) { - shell = shell_config.osx || getDefaultShell(env.Platform.Mac); + shell = shell_config.osx || getSystemShell(env.Platform.Mac); shellType = ShellType.bash; } else { throw new Error('Unknown platform'); diff --git a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts index 6b7d6af46a0..a481fcc0f69 100644 --- a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts @@ -778,8 +778,8 @@ export class TerminalTaskSystem implements ITaskSystem { let terminalName = this.createTerminalName(task); let originalCommand = task.command.name; if (isShellCommand) { - shellLaunchConfig = { name: terminalName, executable: undefined, args: undefined, waitOnExit }; - this.terminalInstanceService.mergeDefaultShellPathAndArgs(shellLaunchConfig, await this.terminalInstanceService.getDefaultShell(), this.terminalService.configHelper, platform); + const defaultConfig = await this.terminalInstanceService.getDefaultShellAndArgs(); + shellLaunchConfig = { name: terminalName, executable: defaultConfig.shell, args: defaultConfig.args, waitOnExit }; let shellSpecified: boolean = false; let shellOptions: ShellConfiguration | undefined = task.command.options && task.command.options.shell; if (shellOptions) { diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.ts b/src/vs/workbench/contrib/terminal/browser/terminal.ts index 806dcee37d6..bdc6f1e6171 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -6,7 +6,7 @@ import { Terminal as XTermTerminal } from 'xterm'; import { WebLinksAddon as XTermWebLinksAddon } from 'xterm-addon-web-links'; import { SearchAddon as XTermSearchAddon } from 'xterm-addon-search'; -import { ITerminalInstance, IWindowsShellHelper, ITerminalConfigHelper, ITerminalChildProcess, IShellLaunchConfig } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ITerminalInstance, IWindowsShellHelper, ITerminalConfigHelper, ITerminalChildProcess, IShellLaunchConfig, IDefaultShellAndArgsRequest } from 'vs/workbench/contrib/terminal/common/terminal'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IProcessEnvironment, Platform } from 'vs/base/common/platform'; import { Event } from 'vs/base/common/event'; @@ -22,6 +22,7 @@ export interface ITerminalInstanceService { _serviceBrand: any; onRequestDefaultShell?: Event<(defaultShell: string) => void>; + onRequestDefaultShellAndArgs?: Event; getXtermConstructor(): Promise; getXtermWebLinksConstructor(): Promise; @@ -34,6 +35,7 @@ export interface ITerminalInstanceService { mergeDefaultShellPathAndArgs(shell: IShellLaunchConfig, defaultShell: string, configHelper: ITerminalConfigHelper, platformOverride?: Platform): void; getDefaultShell(): Promise; + getDefaultShellAndArgs(): Promise<{ shell: string, args: string[] | string | undefined }>; getMainProcessParentEnv(): Promise; } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts index d00843b80d6..1b708b0e2e5 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal'; -import { IWindowsShellHelper, ITerminalChildProcess } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IWindowsShellHelper, ITerminalChildProcess, IDefaultShellAndArgsRequest } from 'vs/workbench/contrib/terminal/common/terminal'; import { Terminal as XTermTerminal } from 'xterm'; import { WebLinksAddon as XTermWebLinksAddon } from 'xterm-addon-web-links'; import { SearchAddon as XTermSearchAddon } from 'xterm-addon-search'; @@ -20,6 +20,8 @@ export class TerminalInstanceService implements ITerminalInstanceService { private readonly _onRequestDefaultShell = new Emitter<(defaultShell: string) => void>(); public get onRequestDefaultShell(): Event<(defaultShell: string) => void> { return this._onRequestDefaultShell.event; } + private readonly _onRequestDefaultShellAndArgs = new Emitter(); + public get onRequestDefaultShellAndArgs(): Event { return this._onRequestDefaultShellAndArgs.event; } constructor() { } @@ -56,6 +58,10 @@ export class TerminalInstanceService implements ITerminalInstanceService { return new Promise(r => this._onRequestDefaultShell.fire(r)); } + public getDefaultShellAndArgs(): Promise<{ shell: string, args: string[] | string | undefined }> { + return new Promise(r => this._onRequestDefaultShellAndArgs.fire((shell, args) => r({ shell, args }))); + } + public async getMainProcessParentEnv(): Promise { return {}; } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts index 9977b972255..723cbe41cd4 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts @@ -163,7 +163,9 @@ export class TerminalProcessManager implements ITerminalProcessManager { private async _launchProcess(shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number): Promise { if (!shellLaunchConfig.executable) { - this._terminalInstanceService.mergeDefaultShellPathAndArgs(shellLaunchConfig, await this._terminalInstanceService.getDefaultShell(), this._configHelper); + const defaultConfig = await this._terminalInstanceService.getDefaultShellAndArgs(); + shellLaunchConfig.executable = defaultConfig.shell; + shellLaunchConfig.args = defaultConfig.args; } const activeWorkspaceRootUri = this._historyService.getLastActiveWorkspaceRoot(Schemas.file); diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index 7c7d7824119..2c49b9dff8e 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -789,4 +789,8 @@ export interface ITerminalChildProcess { getInitialCwd(): Promise; getCwd(): Promise; getLatency(): Promise; +} + +export interface IDefaultShellAndArgsRequest { + (shell: string, args: string[] | string | undefined): void; } \ No newline at end of file diff --git a/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts b/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts index 78a6f0e734f..0ff17ebf440 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts @@ -192,7 +192,7 @@ export function getDefaultShell( return executable; } -function getDefaultShellArgs( +export function getDefaultShellArgs( fetchSetting: (key: string) => { user: string | string[] | undefined, value: string | string[] | undefined, default: string | string[] | undefined }, isWorkspaceShellAllowed: boolean, platformOverride: platform.Platform = platform.platform @@ -203,6 +203,7 @@ function getDefaultShellArgs( return args; } +// TODO: Remove this? export function mergeDefaultShellPathAndArgs( shell: IShellLaunchConfig, fetchSetting: (key: string) => { user: string | string[] | undefined, value: string | string[] | undefined, default: string | string[] | undefined }, diff --git a/src/vs/workbench/contrib/terminal/electron-browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminal.contribution.ts index 9937eea4c5b..f9dd46267ca 100644 --- a/src/vs/workbench/contrib/terminal/electron-browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminal.contribution.ts @@ -6,11 +6,11 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal'; import { TerminalInstanceService } from 'vs/workbench/contrib/terminal/electron-browser/terminalInstanceService'; -import { getDefaultShell } from 'vs/workbench/contrib/terminal/node/terminal'; +import { getSystemShell } from 'vs/workbench/contrib/terminal/node/terminal'; import { registerShellConfiguration } from 'vs/workbench/contrib/terminal/common/terminalShellConfig'; import { TerminalNativeService } from 'vs/workbench/contrib/terminal/electron-browser/terminalNativeService'; import { ITerminalNativeService } from 'vs/workbench/contrib/terminal/common/terminal'; -registerShellConfiguration(getDefaultShell); +registerShellConfiguration(getSystemShell); registerSingleton(ITerminalNativeService, TerminalNativeService, true); registerSingleton(ITerminalInstanceService, TerminalInstanceService, true); diff --git a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts index 6326711f628..cc8d96b81d5 100644 --- a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts @@ -9,14 +9,14 @@ import { WindowsShellHelper } from 'vs/workbench/contrib/terminal/node/windowsSh import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IProcessEnvironment, Platform, isLinux, isMacintosh, isWindows, OperatingSystem, platform } from 'vs/base/common/platform'; import { TerminalProcess } from 'vs/workbench/contrib/terminal/node/terminalProcess'; -import { getDefaultShell } from 'vs/workbench/contrib/terminal/node/terminal'; +import { getSystemShell } from 'vs/workbench/contrib/terminal/node/terminal'; import { Terminal as XTermTerminal } from 'xterm'; import { WebLinksAddon as XTermWebLinksAddon } from 'xterm-addon-web-links'; import { SearchAddon as XTermSearchAddon } from 'xterm-addon-search'; import { readFile } from 'vs/base/node/pfs'; import { basename } from 'vs/base/common/path'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { mergeDefaultShellPathAndArgs } from 'vs/workbench/contrib/terminal/common/terminalEnvironment'; +import { mergeDefaultShellPathAndArgs, getDefaultShell, getDefaultShellArgs } from 'vs/workbench/contrib/terminal/common/terminalEnvironment'; let Terminal: typeof XTermTerminal; let WebLinksAddon: typeof XTermWebLinksAddon; @@ -78,7 +78,24 @@ export class TerminalInstanceService implements ITerminalInstanceService { public getDefaultShell(): Promise { // Don't go via ext host as that would delay terminal start up until after the extension // host is ready. - return Promise.resolve(getDefaultShell(platform)); + return Promise.resolve(getSystemShell(platform)); + } + + public getDefaultShellAndArgs(): Promise<{ shell: string, args: string[] | string | undefined }> { + // TODO: Pull the workspace shell permissions setting + const isWorkspaceShellAllowed = false; // configHelper.checkWorkspaceShellPermissions(platform); + const shell = getDefaultShell( + (key) => this._configurationService.inspect(key), + isWorkspaceShellAllowed, + getSystemShell(platform), + process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432'), + process.env.windir + ); + const args = getDefaultShellArgs( + (key) => this._configurationService.inspect(key), + isWorkspaceShellAllowed + ); + return Promise.resolve({ shell, args }); } public async getMainProcessParentEnv(): Promise { diff --git a/src/vs/workbench/contrib/terminal/node/terminal.ts b/src/vs/workbench/contrib/terminal/node/terminal.ts index 195879eb52f..00cd0d8a33a 100644 --- a/src/vs/workbench/contrib/terminal/node/terminal.ts +++ b/src/vs/workbench/contrib/terminal/node/terminal.ts @@ -11,10 +11,15 @@ import { LinuxDistro, IShellDefinition } from 'vs/workbench/contrib/terminal/com import { coalesce } from 'vs/base/common/arrays'; import { normalize, basename } from 'vs/base/common/path'; -export function getDefaultShell(p: platform.Platform): string { +/** + * Gets the detected default shell for the _system_, not to be confused with VS Code's _default_ + * shell that the terminal uses by default. + * @param p The platform to detect the shell of. + */ +export function getSystemShell(p: platform.Platform): string { if (p === platform.Platform.Windows) { if (platform.isWindows) { - return getTerminalDefaultShellWindows(); + return getSystemShellWindows(); } // Don't detect Windows shell when not on Windows return processes.getWindowsShell(); @@ -23,11 +28,11 @@ export function getDefaultShell(p: platform.Platform): string { if (platform.isLinux && p === platform.Platform.Mac || platform.isMacintosh && p === platform.Platform.Linux) { return '/bin/bash'; } - return getTerminalDefaultShellUnixLike(); + return getSystemShellUnixLike(); } let _TERMINAL_DEFAULT_SHELL_UNIX_LIKE: string | null = null; -function getTerminalDefaultShellUnixLike(): string { +function getSystemShellUnixLike(): string { if (!_TERMINAL_DEFAULT_SHELL_UNIX_LIKE) { let unixLikeTerminal = 'sh'; if (!platform.isWindows && process.env.SHELL) { @@ -46,7 +51,7 @@ function getTerminalDefaultShellUnixLike(): string { } let _TERMINAL_DEFAULT_SHELL_WINDOWS: string | null = null; -function getTerminalDefaultShellWindows(): string { +function getSystemShellWindows(): string { if (!_TERMINAL_DEFAULT_SHELL_WINDOWS) { const isAtLeastWindows10 = platform.isWindows && parseFloat(os.release()) >= 10; const is32ProcessOn64Windows = process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432'); diff --git a/src/vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts b/src/vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts index 99d4a6208b7..1e5162d8f70 100644 --- a/src/vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts +++ b/src/vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts @@ -8,6 +8,7 @@ import { OperatingSystem } from 'vs/base/common/platform'; import { TerminalLinkHandler, LineColumnInfo } from 'vs/workbench/contrib/terminal/browser/terminalLinkHandler'; import * as strings from 'vs/base/common/strings'; import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal'; +import { Event } from 'vs/base/common/event'; class TestTerminalLinkHandler extends TerminalLinkHandler { public get localLinkRegex(): RegExp { @@ -30,6 +31,10 @@ class TestXterm { } class MockTerminalInstanceService implements ITerminalInstanceService { + onRequestDefaultShellAndArgs?: Event | undefined; + getDefaultShellAndArgs(): Promise<{ shell: string; args: string | string[] | undefined; }> { + throw new Error('Method not implemented.'); + } onRequestDefaultShell: any; getDefaultShell(): Promise { throw new Error('Method not implemented.'); From 994bfe2d6a7df0cc60867dd9acbd812636469f4b Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 19 Jun 2019 15:31:44 -0700 Subject: [PATCH 0406/1449] Remove getDefaultShell --- .../api/browser/mainThreadTerminalService.ts | 3 --- src/vs/workbench/api/common/extHost.protocol.ts | 1 - .../workbench/api/node/extHostTerminalService.ts | 5 ----- .../workbench/contrib/terminal/browser/terminal.ts | 2 -- .../terminal/browser/terminalInstanceService.ts | 6 ------ .../contrib/terminal/common/terminalShellConfig.ts | 14 +++++++------- .../electron-browser/terminalInstanceService.ts | 6 ------ .../electron-browser/terminalLinkHandler.test.ts | 4 ---- 8 files changed, 7 insertions(+), 34 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index e730222d096..ff3183d0712 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -49,9 +49,6 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape this._toDispose.push(_terminalService.onRequestAvailableShells(r => this._proxy.$requestAvailableShells().then(e => r(e)))); // ITerminalInstanceService listeners - if (terminalInstanceService.onRequestDefaultShell) { - this._toDispose.push(terminalInstanceService.onRequestDefaultShell(r => this._proxy.$requestDefaultShell().then(e => r(e)))); - } if (terminalInstanceService.onRequestDefaultShellAndArgs) { this._toDispose.push(terminalInstanceService.onRequestDefaultShellAndArgs(r => this._proxy.$requestDefaultShellAndArgs().then(e => r(e.shell, e.args)))); } diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index e3ceb14440a..9d7bb48a9ca 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -1134,7 +1134,6 @@ export interface ExtHostTerminalServiceShape { $acceptProcessRequestLatency(id: number): number; $acceptWorkspacePermissionsChanged(isAllowed: boolean): void; $requestAvailableShells(): Promise; - $requestDefaultShell(): Promise; $requestDefaultShellAndArgs(): Promise; } diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 749487c88e1..5a2aff7018d 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -589,11 +589,6 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { return detectAvailableShells(); } - // TODO: Remove this once requestDefaultShellAndArgs is working - public $requestDefaultShell(): Promise { - return Promise.resolve(getSystemShell(platform.platform)); - } - public async $requestDefaultShellAndArgs(): Promise { const configProvider = await this._extHostConfiguration.getConfigProvider(); return Promise.resolve({ diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.ts b/src/vs/workbench/contrib/terminal/browser/terminal.ts index bdc6f1e6171..36b30c70160 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -21,7 +21,6 @@ export const ITerminalInstanceService = createDecorator void>; onRequestDefaultShellAndArgs?: Event; getXtermConstructor(): Promise; @@ -34,7 +33,6 @@ export interface ITerminalInstanceService { */ mergeDefaultShellPathAndArgs(shell: IShellLaunchConfig, defaultShell: string, configHelper: ITerminalConfigHelper, platformOverride?: Platform): void; - getDefaultShell(): Promise; getDefaultShellAndArgs(): Promise<{ shell: string, args: string[] | string | undefined }>; getMainProcessParentEnv(): Promise; } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts index 1b708b0e2e5..099aaf41c5e 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts @@ -18,8 +18,6 @@ let SearchAddon: typeof XTermSearchAddon; export class TerminalInstanceService implements ITerminalInstanceService { public _serviceBrand: any; - private readonly _onRequestDefaultShell = new Emitter<(defaultShell: string) => void>(); - public get onRequestDefaultShell(): Event<(defaultShell: string) => void> { return this._onRequestDefaultShell.event; } private readonly _onRequestDefaultShellAndArgs = new Emitter(); public get onRequestDefaultShellAndArgs(): Event { return this._onRequestDefaultShellAndArgs.event; } @@ -54,10 +52,6 @@ export class TerminalInstanceService implements ITerminalInstanceService { throw new Error('Not implemented'); } - public getDefaultShell(): Promise { - return new Promise(r => this._onRequestDefaultShell.fire(r)); - } - public getDefaultShellAndArgs(): Promise<{ shell: string, args: string[] | string | undefined }> { return new Promise(r => this._onRequestDefaultShellAndArgs.fire((shell, args) => r({ shell, args }))); } diff --git a/src/vs/workbench/contrib/terminal/common/terminalShellConfig.ts b/src/vs/workbench/contrib/terminal/common/terminalShellConfig.ts index 6867fd01871..c08a6f47fe8 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalShellConfig.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalShellConfig.ts @@ -8,7 +8,7 @@ import { Extensions, IConfigurationRegistry } from 'vs/platform/configuration/co import { Registry } from 'vs/platform/registry/common/platform'; import { Platform } from 'vs/base/common/platform'; -export function registerShellConfiguration(getDefaultShell?: (p: Platform) => string): void { +export function registerShellConfiguration(getSystemShell?: (p: Platform) => string): void { const configurationRegistry = Registry.as(Extensions.Configuration); configurationRegistry.registerConfiguration({ id: 'terminal', @@ -18,24 +18,24 @@ export function registerShellConfiguration(getDefaultShell?: (p: Platform) => st properties: { 'terminal.integrated.shell.linux': { markdownDescription: - getDefaultShell - ? nls.localize('terminal.integrated.shell.linux', "The path of the shell that the terminal uses on Linux (default: {0}). [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration).", getDefaultShell(Platform.Linux)) + getSystemShell + ? nls.localize('terminal.integrated.shell.linux', "The path of the shell that the terminal uses on Linux (default: {0}). [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration).", getSystemShell(Platform.Linux)) : nls.localize('terminal.integrated.shell.linux.noDefault', "The path of the shell that the terminal uses on Linux. [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration)."), type: ['string', 'null'], default: null }, 'terminal.integrated.shell.osx': { markdownDescription: - getDefaultShell - ? nls.localize('terminal.integrated.shell.osx', "The path of the shell that the terminal uses on macOS (default: {0}). [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration).", getDefaultShell(Platform.Mac)) + getSystemShell + ? nls.localize('terminal.integrated.shell.osx', "The path of the shell that the terminal uses on macOS (default: {0}). [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration).", getSystemShell(Platform.Mac)) : nls.localize('terminal.integrated.shell.osx.noDefault', "The path of the shell that the terminal uses on macOS. [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration)."), type: ['string', 'null'], default: null }, 'terminal.integrated.shell.windows': { markdownDescription: - getDefaultShell - ? nls.localize('terminal.integrated.shell.windows', "The path of the shell that the terminal uses on Windows (default: {0}). [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration).", getDefaultShell(Platform.Windows)) + getSystemShell + ? nls.localize('terminal.integrated.shell.windows', "The path of the shell that the terminal uses on Windows (default: {0}). [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration).", getSystemShell(Platform.Windows)) : nls.localize('terminal.integrated.shell.windows.noDefault', "The path of the shell that the terminal uses on Windows. [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration)."), type: ['string', 'null'], default: null diff --git a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts index cc8d96b81d5..912580984b0 100644 --- a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts @@ -75,12 +75,6 @@ export class TerminalInstanceService implements ITerminalInstanceService { ); } - public getDefaultShell(): Promise { - // Don't go via ext host as that would delay terminal start up until after the extension - // host is ready. - return Promise.resolve(getSystemShell(platform)); - } - public getDefaultShellAndArgs(): Promise<{ shell: string, args: string[] | string | undefined }> { // TODO: Pull the workspace shell permissions setting const isWorkspaceShellAllowed = false; // configHelper.checkWorkspaceShellPermissions(platform); diff --git a/src/vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts b/src/vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts index 1e5162d8f70..e5b3f5d7f3c 100644 --- a/src/vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts +++ b/src/vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts @@ -35,10 +35,6 @@ class MockTerminalInstanceService implements ITerminalInstanceService { getDefaultShellAndArgs(): Promise<{ shell: string; args: string | string[] | undefined; }> { throw new Error('Method not implemented.'); } - onRequestDefaultShell: any; - getDefaultShell(): Promise { - throw new Error('Method not implemented.'); - } mergeDefaultShellPathAndArgs(): void { throw new Error('Method not implemented.'); } From 12afb8de03afa885d1b2ce29eceacfdbf850858a Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 19 Jun 2019 15:37:52 -0700 Subject: [PATCH 0407/1449] Get workspace shell permissions correctly --- .../electron-browser/terminalInstanceService.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts index 912580984b0..cfa3ec68b4d 100644 --- a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal'; -import { ITerminalInstance, IWindowsShellHelper, IShellLaunchConfig, ITerminalChildProcess, ITerminalConfigHelper } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ITerminalInstance, IWindowsShellHelper, IShellLaunchConfig, ITerminalChildProcess, ITerminalConfigHelper, IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY } from 'vs/workbench/contrib/terminal/common/terminal'; import { WindowsShellHelper } from 'vs/workbench/contrib/terminal/node/windowsShellHelper'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IProcessEnvironment, Platform, isLinux, isMacintosh, isWindows, OperatingSystem, platform } from 'vs/base/common/platform'; @@ -17,6 +17,7 @@ import { readFile } from 'vs/base/node/pfs'; import { basename } from 'vs/base/common/path'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { mergeDefaultShellPathAndArgs, getDefaultShell, getDefaultShellArgs } from 'vs/workbench/contrib/terminal/common/terminalEnvironment'; +import { StorageScope, IStorageService } from 'vs/platform/storage/common/storage'; let Terminal: typeof XTermTerminal; let WebLinksAddon: typeof XTermWebLinksAddon; @@ -29,7 +30,8 @@ export class TerminalInstanceService implements ITerminalInstanceService { constructor( @IInstantiationService private readonly _instantiationService: IInstantiationService, - @IConfigurationService private readonly _configurationService: IConfigurationService + @IConfigurationService private readonly _configurationService: IConfigurationService, + @IStorageService private readonly _storageService: IStorageService ) { } @@ -62,6 +64,10 @@ export class TerminalInstanceService implements ITerminalInstanceService { return this._instantiationService.createInstance(TerminalProcess, shellLaunchConfig, cwd, cols, rows, env, windowsEnableConpty); } + private _isWorkspaceShellAllowed(): boolean { + return this._storageService.getBoolean(IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY, StorageScope.WORKSPACE, false); + } + public mergeDefaultShellPathAndArgs(shell: IShellLaunchConfig, defaultShell: string, configHelper: ITerminalConfigHelper, platformOverride: Platform = platform): void { const isWorkspaceShellAllowed = configHelper.checkWorkspaceShellPermissions(platformOverride === Platform.Windows ? OperatingSystem.Windows : (platformOverride === Platform.Mac ? OperatingSystem.Macintosh : OperatingSystem.Linux)); mergeDefaultShellPathAndArgs( @@ -76,8 +82,7 @@ export class TerminalInstanceService implements ITerminalInstanceService { } public getDefaultShellAndArgs(): Promise<{ shell: string, args: string[] | string | undefined }> { - // TODO: Pull the workspace shell permissions setting - const isWorkspaceShellAllowed = false; // configHelper.checkWorkspaceShellPermissions(platform); + const isWorkspaceShellAllowed = this._isWorkspaceShellAllowed(); const shell = getDefaultShell( (key) => this._configurationService.inspect(key), isWorkspaceShellAllowed, From 7c127de60cb45884d5e925548360cbed84e97fff Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 19 Jun 2019 15:42:15 -0700 Subject: [PATCH 0408/1449] Remove mergeDefaultShellAndArgs --- .../api/node/extHostTerminalService.ts | 16 ++-------------- .../contrib/terminal/browser/terminal.ts | 6 +----- .../browser/terminalInstanceService.ts | 3 --- .../terminal/common/terminalEnvironment.ts | 14 -------------- .../terminalInstanceService.ts | 19 +++---------------- .../terminalLinkHandler.test.ts | 3 --- 6 files changed, 6 insertions(+), 55 deletions(-) diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 5a2aff7018d..e935ccdf20d 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -495,20 +495,8 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { const platformKey = platform.isWindows ? 'windows' : (platform.isMacintosh ? 'osx' : 'linux'); const configProvider = await this._extHostConfiguration.getConfigProvider(); if (!shellLaunchConfig.executable) { - const fetchSetting = (key: string) => { - const setting = configProvider - .getConfiguration(key.substr(0, key.lastIndexOf('.'))) - .inspect(key.substr(key.lastIndexOf('.') + 1)); - return this._apiInspectConfigToPlain(setting); - }; - terminalEnvironment.mergeDefaultShellPathAndArgs( - shellLaunchConfig, - fetchSetting, - isWorkspaceShellAllowed || false, - getSystemShell(platform.platform), - process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432'), - process.env.windir - ); + shellLaunchConfig.executable = this.getDefaultShell(configProvider); + shellLaunchConfig.args = this._getDefaultShellArgs(configProvider); } // Get the initial cwd diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.ts b/src/vs/workbench/contrib/terminal/browser/terminal.ts index 36b30c70160..e67c5dba924 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -8,7 +8,7 @@ import { WebLinksAddon as XTermWebLinksAddon } from 'xterm-addon-web-links'; import { SearchAddon as XTermSearchAddon } from 'xterm-addon-search'; import { ITerminalInstance, IWindowsShellHelper, ITerminalConfigHelper, ITerminalChildProcess, IShellLaunchConfig, IDefaultShellAndArgsRequest } from 'vs/workbench/contrib/terminal/common/terminal'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { IProcessEnvironment, Platform } from 'vs/base/common/platform'; +import { IProcessEnvironment } from 'vs/base/common/platform'; import { Event } from 'vs/base/common/event'; export const ITerminalInstanceService = createDecorator('terminalInstanceService'); @@ -28,10 +28,6 @@ export interface ITerminalInstanceService { getXtermSearchConstructor(): Promise; createWindowsShellHelper(shellProcessId: number, instance: ITerminalInstance, xterm: XTermTerminal): IWindowsShellHelper; createTerminalProcess(shellLaunchConfig: IShellLaunchConfig, cwd: string, cols: number, rows: number, env: IProcessEnvironment, windowsEnableConpty: boolean): ITerminalChildProcess; - /** - * Merges the default shell path and args into the provided launch configuration - */ - mergeDefaultShellPathAndArgs(shell: IShellLaunchConfig, defaultShell: string, configHelper: ITerminalConfigHelper, platformOverride?: Platform): void; getDefaultShellAndArgs(): Promise<{ shell: string, args: string[] | string | undefined }>; getMainProcessParentEnv(): Promise; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts index 099aaf41c5e..08980a94000 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts @@ -59,7 +59,4 @@ export class TerminalInstanceService implements ITerminalInstanceService { public async getMainProcessParentEnv(): Promise { return {}; } - - public mergeDefaultShellPathAndArgs(): void { - } } \ No newline at end of file diff --git a/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts b/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts index 0ff17ebf440..7309615c7fd 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts @@ -203,20 +203,6 @@ export function getDefaultShellArgs( return args; } -// TODO: Remove this? -export function mergeDefaultShellPathAndArgs( - shell: IShellLaunchConfig, - fetchSetting: (key: string) => { user: string | string[] | undefined, value: string | string[] | undefined, default: string | string[] | undefined }, - isWorkspaceShellAllowed: boolean, - defaultShell: string, - isWoW64: boolean, - windir: string | undefined, - platformOverride: platform.Platform = platform.platform -): void { - shell.executable = getDefaultShell(fetchSetting, isWorkspaceShellAllowed, defaultShell, isWoW64, windir, platformOverride); - shell.args = getDefaultShellArgs(fetchSetting, isWorkspaceShellAllowed, platformOverride); -} - export function createTerminalEnvironment( shellLaunchConfig: IShellLaunchConfig, lastActiveWorkspace: IWorkspaceFolder | null, diff --git a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts index cfa3ec68b4d..7b3a08d1978 100644 --- a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts @@ -4,10 +4,10 @@ *--------------------------------------------------------------------------------------------*/ import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal'; -import { ITerminalInstance, IWindowsShellHelper, IShellLaunchConfig, ITerminalChildProcess, ITerminalConfigHelper, IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ITerminalInstance, IWindowsShellHelper, IShellLaunchConfig, ITerminalChildProcess, IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY } from 'vs/workbench/contrib/terminal/common/terminal'; import { WindowsShellHelper } from 'vs/workbench/contrib/terminal/node/windowsShellHelper'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IProcessEnvironment, Platform, isLinux, isMacintosh, isWindows, OperatingSystem, platform } from 'vs/base/common/platform'; +import { IProcessEnvironment, isLinux, isMacintosh, isWindows, platform } from 'vs/base/common/platform'; import { TerminalProcess } from 'vs/workbench/contrib/terminal/node/terminalProcess'; import { getSystemShell } from 'vs/workbench/contrib/terminal/node/terminal'; import { Terminal as XTermTerminal } from 'xterm'; @@ -16,7 +16,7 @@ import { SearchAddon as XTermSearchAddon } from 'xterm-addon-search'; import { readFile } from 'vs/base/node/pfs'; import { basename } from 'vs/base/common/path'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { mergeDefaultShellPathAndArgs, getDefaultShell, getDefaultShellArgs } from 'vs/workbench/contrib/terminal/common/terminalEnvironment'; +import { getDefaultShell, getDefaultShellArgs } from 'vs/workbench/contrib/terminal/common/terminalEnvironment'; import { StorageScope, IStorageService } from 'vs/platform/storage/common/storage'; let Terminal: typeof XTermTerminal; @@ -68,19 +68,6 @@ export class TerminalInstanceService implements ITerminalInstanceService { return this._storageService.getBoolean(IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY, StorageScope.WORKSPACE, false); } - public mergeDefaultShellPathAndArgs(shell: IShellLaunchConfig, defaultShell: string, configHelper: ITerminalConfigHelper, platformOverride: Platform = platform): void { - const isWorkspaceShellAllowed = configHelper.checkWorkspaceShellPermissions(platformOverride === Platform.Windows ? OperatingSystem.Windows : (platformOverride === Platform.Mac ? OperatingSystem.Macintosh : OperatingSystem.Linux)); - mergeDefaultShellPathAndArgs( - shell, - (key) => this._configurationService.inspect(key), - isWorkspaceShellAllowed, - defaultShell, - process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432'), - process.env.windir, - platformOverride - ); - } - public getDefaultShellAndArgs(): Promise<{ shell: string, args: string[] | string | undefined }> { const isWorkspaceShellAllowed = this._isWorkspaceShellAllowed(); const shell = getDefaultShell( diff --git a/src/vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts b/src/vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts index e5b3f5d7f3c..96daea4ad44 100644 --- a/src/vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts +++ b/src/vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts @@ -35,9 +35,6 @@ class MockTerminalInstanceService implements ITerminalInstanceService { getDefaultShellAndArgs(): Promise<{ shell: string; args: string | string[] | undefined; }> { throw new Error('Method not implemented.'); } - mergeDefaultShellPathAndArgs(): void { - throw new Error('Method not implemented.'); - } _serviceBrand: any; getXtermConstructor(): Promise { throw new Error('Method not implemented.'); From a405e419d3f0469fc94fdaffb8dfc33038375e4c Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 19 Jun 2019 16:26:26 -0700 Subject: [PATCH 0409/1449] Update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index daad56f2151..770f731ec1b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "2db0078dd120f831be4c40bf03fca6ad584f77d0", + "distro": "555abb7db38aa08e0f905213c013f7bad0747ed2", "author": { "name": "Microsoft Corporation" }, From 850cd65951b1d6e550b0ec374df0603c8dfa4b66 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Wed, 19 Jun 2019 17:00:00 -0700 Subject: [PATCH 0410/1449] beautify macos keyboard layout label --- .../browser/keyboardLayoutPicker.ts | 16 ++++---- .../keybinding/common/keymapService.ts | 41 +++++++++++++++++++ 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts b/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts index b05c5974a98..92c47b46e75 100644 --- a/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts +++ b/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts @@ -6,7 +6,7 @@ import * as nls from 'vs/nls'; import { StatusbarAlignment, IStatusbarService, IStatusbarEntryAccessor } from 'vs/platform/statusbar/common/statusbar'; import { Disposable, MutableDisposable } from 'vs/base/common/lifecycle'; -import { IKeymapService, areKeyboardLayoutsEqual } from 'vs/workbench/services/keybinding/common/keymapService'; +import { IKeymapService, areKeyboardLayoutsEqual, parseKeyboardLayout } from 'vs/workbench/services/keybinding/common/keymapService'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as WorkbenchExtensions, IWorkbenchContribution, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; @@ -34,10 +34,10 @@ export class KeyboardLayoutPickerContribution extends Disposable implements IWor let layout = this.keymapService.getCurrentKeyboardLayout(); if (layout) { - let layoutInfo = (layout).text || (layout).lang || (layout).model; + let layoutInfo = parseKeyboardLayout(layout); this.pickerElement.value = this.statusbarService.addEntry( { - text: `Layout: ${layoutInfo}`, + text: `Layout: ${layoutInfo.label}`, // tooltip: nls.localize('keyboard.layout.tooltip', "If you are not using a Screen Reader, please change the setting `editor.accessibilitySupport` to \"off\"."), command: KEYBOARD_LAYOUT_OPEN_PICKER }, @@ -49,11 +49,11 @@ export class KeyboardLayoutPickerContribution extends Disposable implements IWor this._register(keymapService.onDidChangeKeyboardMapper(() => { let layout = this.keymapService.getCurrentKeyboardLayout(); - let layoutInfo = (layout).text || (layout).lang || (layout).model; + let layoutInfo = parseKeyboardLayout(layout); if (this.pickerElement.value) { this.pickerElement.value.update({ - text: `Layout: ${layoutInfo}`, + text: `Layout: ${layoutInfo.label}`, command: KEYBOARD_LAYOUT_OPEN_PICKER }); } else { @@ -111,9 +111,11 @@ export class KeyboardLayoutPickerAction extends Action { const picks: QuickPickInput[] = layouts.map(layout => { const picked = !isAutoDetect && areKeyboardLayoutsEqual(currentLayout, layout); + const layoutInfo = parseKeyboardLayout(layout); return { - label: (layout).text || (layout).lang || (layout).layout, - description: ((layout).id || '') + (picked ? ' (Current selection)' : ''), + label: layoutInfo.label, + id: (layout).text || (layout).lang || (layout).layout, + description: layoutInfo.description + (picked ? ' (Current selection)' : ''), picked: !isAutoDetect && areKeyboardLayoutsEqual(currentLayout, layout) }; }); diff --git a/src/vs/workbench/services/keybinding/common/keymapService.ts b/src/vs/workbench/services/keybinding/common/keymapService.ts index 19a73c5b7d6..f70f8f20bc8 100644 --- a/src/vs/workbench/services/keybinding/common/keymapService.ts +++ b/src/vs/workbench/services/keybinding/common/keymapService.ts @@ -122,3 +122,44 @@ export function areKeyboardLayoutsEqual(a: IKeyboardLayoutInfo | null, b: IKeybo return false; } + +export function parseKeyboardLayout(layout: IKeyboardLayoutInfo | null): { label: string, description: string } { + + + if ((layout).name) { + // windows + let windowsLayout = layout; + return { + label: windowsLayout.text, + description: '' + }; + } + + if ((layout).id) { + let macLayout = layout; + if (/^com\.apple\.keylayout\./.test(macLayout.id)) { + return { + label: macLayout.id.replace(/^com\.apple\.keylayout\./, '').replace(/-/, ' '), + description: '' + }; + } + if (/^.*inputmethod\./.test(macLayout.id)) { + return { + label: macLayout.id.replace(/^.*inputmethod\./, '').replace(/[-\.]/, ' '), + description: `Input Method (${macLayout.lang})` + }; + } + + return { + label: macLayout.lang, + description: '' + }; + } + + let linuxLayout = layout; + + return { + label: linuxLayout.layout, + description: '' + }; +} \ No newline at end of file From 03a5298536ed8046aeafda78104641735e67f585 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 19 Jun 2019 17:01:00 -0700 Subject: [PATCH 0411/1449] Open folders and workspaces in new windows --- .../workbench/browser/web.simpleservices.ts | 9 ++++ .../files/browser/fileActions.contribution.ts | 51 ++++++++++++++++++- .../electron-browser/main.contribution.ts | 41 +-------------- 3 files changed, 59 insertions(+), 42 deletions(-) diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index 96d69910456..055c006de7a 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -850,6 +850,15 @@ export class SimpleWindowService implements IWindowService { } openWindow(_uris: IURIToOpen[], _options?: IOpenSettings): Promise { + // TODO: SUpport window.openFoldersInNewWindow setting + _uris.forEach(uri => { + if ('folderUri' in uri) { + window.open(`${document.location.origin}/?folder=${uri.folderUri.path}`); + } + if ('workspaceUri' in uri) { + window.open(`${document.location.origin}/?folder=${uri.workspaceUri.path}`); + } + }); return Promise.resolve(); } diff --git a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts index 1f20e01c590..363a0c6233e 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts @@ -14,7 +14,7 @@ import { openWindowCommand, REVEAL_IN_OS_COMMAND_ID, COPY_PATH_COMMAND_ID, REVEA import { CommandsRegistry, ICommandHandler } from 'vs/platform/commands/common/commands'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { isWindows, isMacintosh } from 'vs/base/common/platform'; +import { isWindows, isMacintosh, isWeb } from 'vs/base/common/platform'; import { FilesExplorerFocusCondition, ExplorerRootContext, ExplorerFolderContext, ExplorerResourceNotReadonlyContext, ExplorerResourceCut, IExplorerService, ExplorerResourceMoveableToTrash } from 'vs/workbench/contrib/files/common/files'; import { ADD_ROOT_FOLDER_COMMAND_ID, ADD_ROOT_FOLDER_LABEL } from 'vs/workbench/browser/actions/workspaceCommands'; import { CLOSE_SAVED_EDITORS_COMMAND_ID, CLOSE_EDITORS_IN_GROUP_COMMAND_ID, CLOSE_EDITOR_COMMAND_ID, CLOSE_OTHER_EDITORS_IN_GROUP_COMMAND_ID } from 'vs/workbench/browser/parts/editor/editorCommands'; @@ -23,8 +23,9 @@ import { ResourceContextKey } from 'vs/workbench/common/resources'; import { WorkbenchListDoubleSelection } from 'vs/platform/list/browser/listService'; import { URI } from 'vs/base/common/uri'; import { Schemas } from 'vs/base/common/network'; -import { SupportsWorkspacesContext, IsWebContext } from 'vs/workbench/browser/contextkeys'; +import { SupportsWorkspacesContext, IsWebContext, RemoteFileDialogContext } from 'vs/workbench/browser/contextkeys'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { OpenFileFolderAction, OpenLocalFileFolderAction, OpenFileAction, OpenFolderAction, OpenLocalFileAction, OpenLocalFolderAction } from 'vs/workbench/browser/actions/workspaceActions'; // Contribute Global Actions const category = { value: nls.localize('filesCategory', "File"), original: 'File' }; @@ -41,6 +42,23 @@ registry.registerWorkbenchAction(new SyncActionDescriptor(ShowOpenedFileInNewWin registry.registerWorkbenchAction(new SyncActionDescriptor(CompareWithClipboardAction, CompareWithClipboardAction.ID, CompareWithClipboardAction.LABEL, { primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyCode.KEY_C) }), 'File: Compare Active File with Clipboard', category.value); registry.registerWorkbenchAction(new SyncActionDescriptor(ToggleAutoSaveAction, ToggleAutoSaveAction.ID, ToggleAutoSaveAction.LABEL), 'File: Toggle Auto Save', category.value); + +const fileCategory = nls.localize('file', "File"); + +if (isMacintosh) { + registry.registerWorkbenchAction(new SyncActionDescriptor(OpenFileFolderAction, OpenFileFolderAction.ID, OpenFileFolderAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.KEY_O }), 'File: Open...', fileCategory); + if (!isWeb) { + registry.registerWorkbenchAction(new SyncActionDescriptor(OpenLocalFileFolderAction, OpenLocalFileFolderAction.ID, OpenLocalFileFolderAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.KEY_O }, RemoteFileDialogContext), 'File: Open Local...', fileCategory); + } +} else { + registry.registerWorkbenchAction(new SyncActionDescriptor(OpenFileAction, OpenFileAction.ID, OpenFileAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.KEY_O }), 'File: Open File...', fileCategory); + registry.registerWorkbenchAction(new SyncActionDescriptor(OpenFolderAction, OpenFolderAction.ID, OpenFolderAction.LABEL, { primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.KEY_O) }), 'File: Open Folder...', fileCategory); + if (!isWeb) { + registry.registerWorkbenchAction(new SyncActionDescriptor(OpenLocalFileAction, OpenLocalFileAction.ID, OpenLocalFileAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.KEY_O }, RemoteFileDialogContext), 'File: Open Local File...', fileCategory); + registry.registerWorkbenchAction(new SyncActionDescriptor(OpenLocalFolderAction, OpenLocalFolderAction.ID, OpenLocalFolderAction.LABEL, { primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.KEY_O) }, RemoteFileDialogContext), 'File: Open Local Folder...', fileCategory); + } +} + // Commands CommandsRegistry.registerCommand('_files.windowOpen', openWindowCommand); CommandsRegistry.registerCommand('_files.newWindow', newWindowCommand); @@ -586,6 +604,35 @@ MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, { order: 3 }); +if (isMacintosh) { + MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, { + group: '2_open', + command: { + id: OpenFileFolderAction.ID, + title: nls.localize({ key: 'miOpen', comment: ['&& denotes a mnemonic'] }, "&&Open...") + }, + order: 1 + }); +} else { + MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, { + group: '2_open', + command: { + id: OpenFileAction.ID, + title: nls.localize({ key: 'miOpenFile', comment: ['&& denotes a mnemonic'] }, "&&Open File...") + }, + order: 1 + }); + + MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, { + group: '2_open', + command: { + id: OpenFolderAction.ID, + title: nls.localize({ key: 'miOpenFolder', comment: ['&& denotes a mnemonic'] }, "Open &&Folder...") + }, + order: 2 + }); +} + MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, { group: '5_autosave', command: { diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index a38fbde646d..5d2bf428184 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -14,7 +14,7 @@ import { isWindows, isLinux, isMacintosh } from 'vs/base/common/platform'; import { KeybindingsReferenceAction, OpenDocumentationUrlAction, OpenIntroductoryVideosUrlAction, OpenTipsAndTricksUrlAction, OpenTwitterUrlAction, OpenRequestFeatureUrlAction, OpenPrivacyStatementUrlAction, OpenLicenseUrlAction, OpenNewsletterSignupUrlAction } from 'vs/workbench/electron-browser/actions/helpActions'; import { ToggleSharedProcessAction, InspectContextKeysAction, ToggleScreencastModeAction, ToggleDevToolsAction } from 'vs/workbench/electron-browser/actions/developerActions'; import { ShowAboutDialogAction, ZoomResetAction, ZoomOutAction, ZoomInAction, CloseCurrentWindowAction, SwitchWindow, NewWindowAction, QuickSwitchWindow, QuickOpenRecentAction, inRecentFilesPickerContextKey, OpenRecentAction, ReloadWindowWithExtensionsDisabledAction, NewWindowTabHandler, ReloadWindowAction, ShowPreviousWindowTabHandler, ShowNextWindowTabHandler, MoveWindowTabToNewWindowHandler, MergeWindowTabsHandlerHandler, ToggleWindowTabsBarHandler } from 'vs/workbench/electron-browser/actions/windowActions'; -import { AddRootFolderAction, GlobalRemoveRootFolderAction, OpenWorkspaceAction, SaveWorkspaceAsAction, OpenWorkspaceConfigFileAction, DuplicateWorkspaceInNewWindowAction, OpenFileFolderAction, OpenFileAction, OpenFolderAction, CloseWorkspaceAction, OpenLocalFileAction, OpenLocalFolderAction, OpenLocalFileFolderAction, SaveLocalFileAction } from 'vs/workbench/browser/actions/workspaceActions'; +import { AddRootFolderAction, GlobalRemoveRootFolderAction, OpenWorkspaceAction, SaveWorkspaceAsAction, OpenWorkspaceConfigFileAction, DuplicateWorkspaceInNewWindowAction, CloseWorkspaceAction, SaveLocalFileAction } from 'vs/workbench/browser/actions/workspaceActions'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { inQuickOpenContext, getQuickNavigateHandler } from 'vs/workbench/browser/parts/quickopen/quickopen'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; @@ -35,16 +35,6 @@ import product from 'vs/platform/product/node/product'; (function registerFileActions(): void { const fileCategory = nls.localize('file', "File"); - if (isMacintosh) { - registry.registerWorkbenchAction(new SyncActionDescriptor(OpenFileFolderAction, OpenFileFolderAction.ID, OpenFileFolderAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.KEY_O }), 'File: Open...', fileCategory); - registry.registerWorkbenchAction(new SyncActionDescriptor(OpenLocalFileFolderAction, OpenLocalFileFolderAction.ID, OpenLocalFileFolderAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.KEY_O }, RemoteFileDialogContext), 'File: Open Local...', fileCategory); - } else { - registry.registerWorkbenchAction(new SyncActionDescriptor(OpenFileAction, OpenFileAction.ID, OpenFileAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.KEY_O }), 'File: Open File...', fileCategory); - registry.registerWorkbenchAction(new SyncActionDescriptor(OpenFolderAction, OpenFolderAction.ID, OpenFolderAction.LABEL, { primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.KEY_O) }), 'File: Open Folder...', fileCategory); - registry.registerWorkbenchAction(new SyncActionDescriptor(OpenLocalFileAction, OpenLocalFileAction.ID, OpenLocalFileAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.KEY_O }, RemoteFileDialogContext), 'File: Open Local File...', fileCategory); - registry.registerWorkbenchAction(new SyncActionDescriptor(OpenLocalFolderAction, OpenLocalFolderAction.ID, OpenLocalFolderAction.LABEL, { primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.KEY_O) }, RemoteFileDialogContext), 'File: Open Local Folder...', fileCategory); - } - registry.registerWorkbenchAction(new SyncActionDescriptor(SaveLocalFileAction, SaveLocalFileAction.ID, SaveLocalFileAction.LABEL, { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_S }, RemoteFileDialogContext), 'File: Save Local File...', fileCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(QuickOpenRecentAction, QuickOpenRecentAction.ID, QuickOpenRecentAction.LABEL), 'File: Quick Open Recent...', fileCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(OpenRecentAction, OpenRecentAction.ID, OpenRecentAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.KEY_R, mac: { primary: KeyMod.WinCtrl | KeyCode.KEY_R } }), 'File: Open Recent...', fileCategory); @@ -227,35 +217,6 @@ import product from 'vs/platform/product/node/product'; order: 2 }); - if (isMacintosh) { - MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, { - group: '2_open', - command: { - id: OpenFileFolderAction.ID, - title: nls.localize({ key: 'miOpen', comment: ['&& denotes a mnemonic'] }, "&&Open...") - }, - order: 1 - }); - } else { - MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, { - group: '2_open', - command: { - id: OpenFileAction.ID, - title: nls.localize({ key: 'miOpenFile', comment: ['&& denotes a mnemonic'] }, "&&Open File...") - }, - order: 1 - }); - - MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, { - group: '2_open', - command: { - id: OpenFolderAction.ID, - title: nls.localize({ key: 'miOpenFolder', comment: ['&& denotes a mnemonic'] }, "Open &&Folder...") - }, - order: 2 - }); - } - MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, { group: '2_open', command: { From 927cc54293df53c52b26879795b996e3695c37ee Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 19 Jun 2019 17:01:27 -0700 Subject: [PATCH 0412/1449] Basic file opening via Open File command --- src/vs/workbench/browser/web.simpleservices.ts | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index 055c006de7a..353e4506be8 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -45,6 +45,9 @@ import { CommentingRanges } from 'vs/editor/common/modes'; import { Range } from 'vs/editor/common/core/range'; import { isUndefinedOrNull } from 'vs/base/common/types'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { IEditorService, IResourceEditor } from 'vs/workbench/services/editor/common/editorService'; +import { pathsToEditors } from 'vs/workbench/common/editor'; +import { IFileService } from 'vs/platform/files/common/files'; //#region Backup File @@ -735,6 +738,12 @@ export class SimpleWindowService implements IWindowService { readonly windowId = 0; + constructor( + @IEditorService private readonly editorService: IEditorService, + @IFileService private readonly fileService: IFileService + ) { + } + isFocused(): Promise { return Promise.resolve(this.hasFocus); } @@ -849,15 +858,19 @@ export class SimpleWindowService implements IWindowService { return Promise.resolve(); } - openWindow(_uris: IURIToOpen[], _options?: IOpenSettings): Promise { + async openWindow(_uris: IURIToOpen[], _options?: IOpenSettings): Promise { // TODO: SUpport window.openFoldersInNewWindow setting - _uris.forEach(uri => { + _uris.forEach(async uri => { if ('folderUri' in uri) { window.open(`${document.location.origin}/?folder=${uri.folderUri.path}`); } if ('workspaceUri' in uri) { window.open(`${document.location.origin}/?folder=${uri.workspaceUri.path}`); } + if ('fileUri' in uri) { + const inputs: IResourceEditor[] = await pathsToEditors([uri], this.fileService); + this.editorService.openEditors(inputs); + } }); return Promise.resolve(); } From 21795f1f87fe34ba6e12a5e006263413d7435e8d Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Wed, 19 Jun 2019 17:13:05 -0700 Subject: [PATCH 0413/1449] Update auto detect layout info. --- .../contrib/preferences/browser/keyboardLayoutPicker.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts b/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts index 92c47b46e75..5b02583135d 100644 --- a/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts +++ b/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts @@ -115,7 +115,7 @@ export class KeyboardLayoutPickerAction extends Action { return { label: layoutInfo.label, id: (layout).text || (layout).lang || (layout).layout, - description: layoutInfo.description + (picked ? ' (Current selection)' : ''), + description: layoutInfo.description + (picked ? ' (Current layout)' : ''), picked: !isAutoDetect && areKeyboardLayoutsEqual(currentLayout, layout) }; }); @@ -132,7 +132,7 @@ export class KeyboardLayoutPickerAction extends Action { // Offer to "Auto Detect" const autoDetectMode: IQuickPickItem = { label: nls.localize('autoDetect', "Auto Detect"), - description: isAutoDetect ? `(Current: ${(currentLayout).text || (currentLayout).lang || (currentLayout).layout})` : undefined, + description: isAutoDetect ? `(Current: ${parseKeyboardLayout(currentLayout).label})` : undefined, picked: isAutoDetect ? true : undefined }; From 39d4aa8b2d4d990798cc3fd2dedcfcbcbd74376a Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 19 Jun 2019 17:17:44 -0700 Subject: [PATCH 0414/1449] Respect openFoldersInNewWindow setting for folders/workspaces --- .../workbench/browser/web.simpleservices.ts | 32 ++++++++++++++++--- .../browser/workbench.contribution.ts | 14 +++++++- .../electron-browser/main.contribution.ts | 12 ------- 3 files changed, 40 insertions(+), 18 deletions(-) diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index 353e4506be8..9c5e7f441d0 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -26,7 +26,7 @@ import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { IStorageService, IWorkspaceStorageChangeEvent, StorageScope, IWillSaveStateEvent, WillSaveStateReason } from 'vs/platform/storage/common/storage'; import { IUpdateService, State } from 'vs/platform/update/common/update'; -import { IWindowService, INativeOpenDialogOptions, IEnterWorkspaceResult, IURIToOpen, IMessageBoxResult, IWindowsService, IOpenSettings } from 'vs/platform/windows/common/windows'; +import { IWindowService, INativeOpenDialogOptions, IEnterWorkspaceResult, IURIToOpen, IMessageBoxResult, IWindowsService, IOpenSettings, IWindowSettings } from 'vs/platform/windows/common/windows'; import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, IWorkspaceFolderCreationData, IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { IRecentlyOpened, IRecent } from 'vs/platform/history/common/history'; import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; @@ -48,6 +48,7 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace import { IEditorService, IResourceEditor } from 'vs/workbench/services/editor/common/editorService'; import { pathsToEditors } from 'vs/workbench/common/editor'; import { IFileService } from 'vs/platform/files/common/files'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; //#region Backup File @@ -740,7 +741,8 @@ export class SimpleWindowService implements IWindowService { constructor( @IEditorService private readonly editorService: IEditorService, - @IFileService private readonly fileService: IFileService + @IFileService private readonly fileService: IFileService, + @IConfigurationService private readonly configurationService: IConfigurationService ) { } @@ -859,13 +861,23 @@ export class SimpleWindowService implements IWindowService { } async openWindow(_uris: IURIToOpen[], _options?: IOpenSettings): Promise { - // TODO: SUpport window.openFoldersInNewWindow setting + const { openFolderInNewWindow } = this.shouldOpenNewWindow(_options); _uris.forEach(async uri => { if ('folderUri' in uri) { - window.open(`${document.location.origin}/?folder=${uri.folderUri.path}`); + const newAddress = `${document.location.origin}/?folder=${uri.folderUri.path}`; + if (openFolderInNewWindow) { + window.open(newAddress); + } else { + window.location.href = newAddress; + } } if ('workspaceUri' in uri) { - window.open(`${document.location.origin}/?folder=${uri.workspaceUri.path}`); + const newAddress = `${document.location.origin}/?workspace=${uri.workspaceUri.path}`; + if (openFolderInNewWindow) { + window.open(newAddress); + } else { + window.location.href = newAddress; + } } if ('fileUri' in uri) { const inputs: IResourceEditor[] = await pathsToEditors([uri], this.fileService); @@ -875,6 +887,16 @@ export class SimpleWindowService implements IWindowService { return Promise.resolve(); } + private shouldOpenNewWindow(_options: IOpenSettings = {}): { openFolderInNewWindow: boolean } { + const windowConfig = this.configurationService.getValue('window'); + const openFolderInNewWindowConfig = (windowConfig && windowConfig.openFoldersInNewWindow) || 'default' /* default */; + let openFolderInNewWindow = !!_options.forceNewWindow && !_options.forceReuseWindow; + if (!_options.forceNewWindow && !_options.forceReuseWindow && (openFolderInNewWindowConfig === 'on' || openFolderInNewWindowConfig === 'off')) { + openFolderInNewWindow = (openFolderInNewWindowConfig === 'on'); + } + return { openFolderInNewWindow }; + } + closeWindow(): Promise { return Promise.resolve(); } diff --git a/src/vs/workbench/browser/workbench.contribution.ts b/src/vs/workbench/browser/workbench.contribution.ts index 5b46af70bad..597d73d3e5a 100644 --- a/src/vs/workbench/browser/workbench.contribution.ts +++ b/src/vs/workbench/browser/workbench.contribution.ts @@ -306,7 +306,19 @@ import { isMacintosh, isWindows, isLinux, isWeb } from 'vs/base/common/platform' 'scope': ConfigurationScope.APPLICATION, 'markdownDescription': nls.localize('disableCustomMenuBarAltFocus', "If enabled, disables the ability to focus the menu bar with the Alt-key when not set to toggle."), 'included': isWindows || isLinux || isWeb - } + }, + 'window.openFoldersInNewWindow': { + 'type': 'string', + 'enum': ['on', 'off', 'default'], + 'enumDescriptions': [ + nls.localize('window.openFoldersInNewWindow.on', "Folders will open in a new window."), + nls.localize('window.openFoldersInNewWindow.off', "Folders will replace the last active window."), + nls.localize('window.openFoldersInNewWindow.default', "Folders will open in a new window unless a folder is picked from within the application (e.g. via the File menu).") + ], + 'default': 'default', + 'scope': ConfigurationScope.APPLICATION, + 'markdownDescription': nls.localize('openFoldersInNewWindow', "Controls whether folders should open in a new window or replace the last active window.\nNote that there can still be cases where this setting is ignored (e.g. when using the `--new-window` or `--reuse-window` command line option).") + }, } }); diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index 5d2bf428184..e26745ef1ca 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -487,18 +487,6 @@ import product from 'vs/platform/product/node/product'; nls.localize('openFilesInNewWindowMac', "Controls whether files should open in a new window. \nNote that there can still be cases where this setting is ignored (e.g. when using the `--new-window` or `--reuse-window` command line option).") : nls.localize('openFilesInNewWindow', "Controls whether files should open in a new window.\nNote that there can still be cases where this setting is ignored (e.g. when using the `--new-window` or `--reuse-window` command line option).") }, - 'window.openFoldersInNewWindow': { - 'type': 'string', - 'enum': ['on', 'off', 'default'], - 'enumDescriptions': [ - nls.localize('window.openFoldersInNewWindow.on', "Folders will open in a new window."), - nls.localize('window.openFoldersInNewWindow.off', "Folders will replace the last active window."), - nls.localize('window.openFoldersInNewWindow.default', "Folders will open in a new window unless a folder is picked from within the application (e.g. via the File menu).") - ], - 'default': 'default', - 'scope': ConfigurationScope.APPLICATION, - 'markdownDescription': nls.localize('openFoldersInNewWindow', "Controls whether folders should open in a new window or replace the last active window.\nNote that there can still be cases where this setting is ignored (e.g. when using the `--new-window` or `--reuse-window` command line option).") - }, 'window.openWithoutArgumentsInNewWindow': { 'type': 'string', 'enum': ['on', 'off'], From 2ca61027e57930942c8f6da34031a3cc0009556c Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 19 Jun 2019 17:19:01 -0700 Subject: [PATCH 0415/1449] Make openWindow function resolve at right time --- src/vs/workbench/browser/web.simpleservices.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index 9c5e7f441d0..ad5ffe6a270 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -862,7 +862,8 @@ export class SimpleWindowService implements IWindowService { async openWindow(_uris: IURIToOpen[], _options?: IOpenSettings): Promise { const { openFolderInNewWindow } = this.shouldOpenNewWindow(_options); - _uris.forEach(async uri => { + for (let i = 0; i < _uris.length; i++) { + const uri = _uris[i]; if ('folderUri' in uri) { const newAddress = `${document.location.origin}/?folder=${uri.folderUri.path}`; if (openFolderInNewWindow) { @@ -883,7 +884,7 @@ export class SimpleWindowService implements IWindowService { const inputs: IResourceEditor[] = await pathsToEditors([uri], this.fileService); this.editorService.openEditors(inputs); } - }); + } return Promise.resolve(); } From b26ee54a3ce361973f264a80146b3a18f5c14162 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Wed, 19 Jun 2019 17:19:19 -0700 Subject: [PATCH 0416/1449] keyboard layout status bar item tooltip --- .../contrib/preferences/browser/keyboardLayoutPicker.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts b/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts index 5b02583135d..aeabf4a637f 100644 --- a/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts +++ b/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts @@ -63,8 +63,8 @@ export class KeyboardLayoutPickerContribution extends Disposable implements IWor // tooltip: nls.localize('keyboard.layout.tooltip', "If you are not using a Screen Reader, please change the setting `editor.accessibilitySupport` to \"off\"."), command: KEYBOARD_LAYOUT_OPEN_PICKER }, - 'status.editor.screenReaderMode', - nls.localize('status.editor.screenReaderMode', "Screen Reader Mode"), + 'status.workbench.keyboardLayout', + nls.localize('status.workbench.keyboardLayout', "Current keyboard layout"), StatusbarAlignment.RIGHT ); } From 960db12e86bcdc4ad61a8841052dbb956a23e8ac Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 19 Jun 2019 17:22:56 -0700 Subject: [PATCH 0417/1449] Move workspace menu and action to fileActions.contribution --- .../files/browser/fileActions.contribution.ts | 15 ++++++++++++++- .../electron-browser/main.contribution.ts | 13 +------------ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts index 363a0c6233e..8573f02c5a2 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts @@ -25,7 +25,7 @@ import { URI } from 'vs/base/common/uri'; import { Schemas } from 'vs/base/common/network'; import { SupportsWorkspacesContext, IsWebContext, RemoteFileDialogContext } from 'vs/workbench/browser/contextkeys'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { OpenFileFolderAction, OpenLocalFileFolderAction, OpenFileAction, OpenFolderAction, OpenLocalFileAction, OpenLocalFolderAction } from 'vs/workbench/browser/actions/workspaceActions'; +import { OpenFileFolderAction, OpenLocalFileFolderAction, OpenFileAction, OpenFolderAction, OpenLocalFileAction, OpenLocalFolderAction, OpenWorkspaceAction } from 'vs/workbench/browser/actions/workspaceActions'; // Contribute Global Actions const category = { value: nls.localize('filesCategory', "File"), original: 'File' }; @@ -59,6 +59,9 @@ if (isMacintosh) { } } +const workspacesCategory = nls.localize('workspaces', "Workspaces"); +registry.registerWorkbenchAction(new SyncActionDescriptor(OpenWorkspaceAction, OpenWorkspaceAction.ID, OpenWorkspaceAction.LABEL), 'Workspaces: Open Workspace...', workspacesCategory, SupportsWorkspacesContext); + // Commands CommandsRegistry.registerCommand('_files.windowOpen', openWindowCommand); CommandsRegistry.registerCommand('_files.newWindow', newWindowCommand); @@ -633,6 +636,16 @@ if (isMacintosh) { }); } +MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, { + group: '2_open', + command: { + id: OpenWorkspaceAction.ID, + title: nls.localize({ key: 'miOpenWorkspace', comment: ['&& denotes a mnemonic'] }, "Open Wor&&kspace...") + }, + order: 3, + when: SupportsWorkspacesContext +}); + MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, { group: '5_autosave', command: { diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index e26745ef1ca..aa6647f914f 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -14,7 +14,7 @@ import { isWindows, isLinux, isMacintosh } from 'vs/base/common/platform'; import { KeybindingsReferenceAction, OpenDocumentationUrlAction, OpenIntroductoryVideosUrlAction, OpenTipsAndTricksUrlAction, OpenTwitterUrlAction, OpenRequestFeatureUrlAction, OpenPrivacyStatementUrlAction, OpenLicenseUrlAction, OpenNewsletterSignupUrlAction } from 'vs/workbench/electron-browser/actions/helpActions'; import { ToggleSharedProcessAction, InspectContextKeysAction, ToggleScreencastModeAction, ToggleDevToolsAction } from 'vs/workbench/electron-browser/actions/developerActions'; import { ShowAboutDialogAction, ZoomResetAction, ZoomOutAction, ZoomInAction, CloseCurrentWindowAction, SwitchWindow, NewWindowAction, QuickSwitchWindow, QuickOpenRecentAction, inRecentFilesPickerContextKey, OpenRecentAction, ReloadWindowWithExtensionsDisabledAction, NewWindowTabHandler, ReloadWindowAction, ShowPreviousWindowTabHandler, ShowNextWindowTabHandler, MoveWindowTabToNewWindowHandler, MergeWindowTabsHandlerHandler, ToggleWindowTabsBarHandler } from 'vs/workbench/electron-browser/actions/windowActions'; -import { AddRootFolderAction, GlobalRemoveRootFolderAction, OpenWorkspaceAction, SaveWorkspaceAsAction, OpenWorkspaceConfigFileAction, DuplicateWorkspaceInNewWindowAction, CloseWorkspaceAction, SaveLocalFileAction } from 'vs/workbench/browser/actions/workspaceActions'; +import { AddRootFolderAction, GlobalRemoveRootFolderAction, SaveWorkspaceAsAction, OpenWorkspaceConfigFileAction, DuplicateWorkspaceInNewWindowAction, CloseWorkspaceAction, SaveLocalFileAction } from 'vs/workbench/browser/actions/workspaceActions'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { inQuickOpenContext, getQuickNavigateHandler } from 'vs/workbench/browser/parts/quickopen/quickopen'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; @@ -109,7 +109,6 @@ import product from 'vs/platform/product/node/product'; registry.registerWorkbenchAction(new SyncActionDescriptor(AddRootFolderAction, AddRootFolderAction.ID, AddRootFolderAction.LABEL), 'Workspaces: Add Folder to Workspace...', workspacesCategory, SupportsWorkspacesContext); registry.registerWorkbenchAction(new SyncActionDescriptor(GlobalRemoveRootFolderAction, GlobalRemoveRootFolderAction.ID, GlobalRemoveRootFolderAction.LABEL), 'Workspaces: Remove Folder from Workspace...', workspacesCategory); - registry.registerWorkbenchAction(new SyncActionDescriptor(OpenWorkspaceAction, OpenWorkspaceAction.ID, OpenWorkspaceAction.LABEL), 'Workspaces: Open Workspace...', workspacesCategory, SupportsWorkspacesContext); registry.registerWorkbenchAction(new SyncActionDescriptor(SaveWorkspaceAsAction, SaveWorkspaceAsAction.ID, SaveWorkspaceAsAction.LABEL), 'Workspaces: Save Workspace As...', workspacesCategory, SupportsWorkspacesContext); registry.registerWorkbenchAction(new SyncActionDescriptor(DuplicateWorkspaceInNewWindowAction, DuplicateWorkspaceInNewWindowAction.ID, DuplicateWorkspaceInNewWindowAction.LABEL), 'Workspaces: Duplicate Workspace in New Window', workspacesCategory); @@ -217,16 +216,6 @@ import product from 'vs/platform/product/node/product'; order: 2 }); - MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, { - group: '2_open', - command: { - id: OpenWorkspaceAction.ID, - title: nls.localize({ key: 'miOpenWorkspace', comment: ['&& denotes a mnemonic'] }, "Open Wor&&kspace...") - }, - order: 3, - when: SupportsWorkspacesContext - }); - MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, { title: nls.localize({ key: 'miOpenRecent', comment: ['&& denotes a mnemonic'] }, "Open &&Recent"), submenu: MenuId.MenubarRecentMenu, From 63bcdd8373390e97c957e0a4ed6d069669f09b59 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 19 Jun 2019 17:55:29 -0700 Subject: [PATCH 0418/1449] Add clarifying comment on instance service request events --- src/vs/workbench/contrib/terminal/browser/terminal.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.ts b/src/vs/workbench/contrib/terminal/browser/terminal.ts index e67c5dba924..312ea61b5d6 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -21,6 +21,7 @@ export const ITerminalInstanceService = createDecorator; getXtermConstructor(): Promise; From 3399d30c701a8f5569220fa6356a86e27f51345a Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Wed, 19 Jun 2019 18:54:54 -0700 Subject: [PATCH 0419/1449] Fullscreen change event. --- src/vs/base/browser/dom.ts | 1 + src/vs/workbench/browser/web.main.ts | 8 ++++++++ src/vs/workbench/browser/web.simpleservices.ts | 10 +++------- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index 265d69f85a2..3fb6d8b35fc 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -857,6 +857,7 @@ export const EventType = { ERROR: 'error', RESIZE: 'resize', SCROLL: 'scroll', + FULLSCREEN_CHANGE: 'fullscreenchange', // Form SELECT: 'select', CHANGE: 'change', diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index 6f1954ba252..d33b249cc98 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -36,6 +36,7 @@ import { SignService } from 'vs/platform/sign/browser/signService'; import { hash } from 'vs/base/common/hash'; import { IWorkbenchConstructionOptions } from 'vs/workbench/workbench.web.api'; import { ProductService } from 'vs/platform/product/browser/productService'; +import { setFullscreen } from 'vs/base/browser/browser'; class CodeRendererMain extends Disposable { @@ -63,6 +64,13 @@ class CodeRendererMain extends Disposable { // Layout this._register(addDisposableListener(window, EventType.RESIZE, () => this.workbench.layout())); + this._register(addDisposableListener(document, EventType.FULLSCREEN_CHANGE, () => { + if (document.fullscreenElement || (document).webkitFullscreenElement) { + setFullscreen(true); + } else { + setFullscreen(false); + } + })); // Resource Loading this._register(new WebResources(services.serviceCollection.get(IFileService))); diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index 96d69910456..fd3d7c637cc 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -788,17 +788,13 @@ export class SimpleWindowService implements IWindowService { if ((document).fullscreen !== undefined) { if (!(document).fullscreen) { - return (target).requestFullscreen().then(() => { - browser.setFullscreen(true); - }).catch(() => { + return (target).requestFullscreen().catch(() => { // if it fails, chromium throws an exception with error undefined. // re https://developer.mozilla.org/en-US/docs/Web/API/Element/requestFullscreen console.warn('Toggle Full Screen failed'); }); } else { - return document.exitFullscreen().then(() => { - browser.setFullscreen(false); - }).catch(() => { + return document.exitFullscreen().catch(() => { console.warn('Exit Full Screen failed'); }); } @@ -809,7 +805,7 @@ export class SimpleWindowService implements IWindowService { try { if (!(document).webkitIsFullScreen) { (target).webkitRequestFullscreen(); // it's async, but doesn't return a real promise. - browser.setFullscreen(true); + browser.setFullscreen(true); // we have to set this proactively because Safari doesn't emit fullscreenchange event. } else { (document).webkitExitFullscreen(); // it's async, but doesn't return a real promise. browser.setFullscreen(false); From c3fe2d8acde04e579880413ae4622a1f551efdcc Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 19 Jun 2019 11:22:39 -0700 Subject: [PATCH 0420/1449] Remove unneeded margin on settings editor scrollbar Fix #75724 --- .../contrib/preferences/browser/media/settingsEditor2.css | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css b/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css index 07a0d93e5a8..90f36055ccc 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css +++ b/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css @@ -237,8 +237,6 @@ } .settings-editor > .settings-body .settings-tree-container { - margin-right: 1px; - /* So the item doesn't blend into the edge of the view container */ margin-top: 14px; border-spacing: 0; border-collapse: separate; From 9c29fb87cd39d9a01ed7edfdad0f58dc65c78789 Mon Sep 17 00:00:00 2001 From: orange4glace Date: Thu, 20 Jun 2019 12:31:42 +0900 Subject: [PATCH 0421/1449] fix: #72626 --- src/vs/workbench/contrib/files/browser/views/explorerViewer.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts index 184916e4ee5..4592b3918ec 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts @@ -234,7 +234,7 @@ export class FilesRenderer implements ITreeRenderer editableData.onFinish(value, success), 0); }); @@ -265,6 +265,7 @@ export class FilesRenderer implements ITreeRenderer Date: Thu, 20 Jun 2019 09:34:03 +0200 Subject: [PATCH 0422/1449] Remove extra register of automatic tasks Fixes #75758 --- .../tasks/electron-browser/taskService.ts | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/vs/workbench/contrib/tasks/electron-browser/taskService.ts b/src/vs/workbench/contrib/tasks/electron-browser/taskService.ts index 388846988a3..631275db0d0 100644 --- a/src/vs/workbench/contrib/tasks/electron-browser/taskService.ts +++ b/src/vs/workbench/contrib/tasks/electron-browser/taskService.ts @@ -3,34 +3,18 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as nls from 'vs/nls'; import * as Objects from 'vs/base/common/objects'; import * as semver from 'semver'; import { IStringDictionary } from 'vs/base/common/collections'; -import { Registry } from 'vs/platform/registry/common/platform'; -import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; -import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { WorkbenchState, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { ITaskSystem } from 'vs/workbench/contrib/tasks/common/taskSystem'; import { ExecutionEngine, TaskRunSource } from 'vs/workbench/contrib/tasks/common/tasks'; import * as TaskConfig from '../common/taskConfiguration'; import { ProcessTaskSystem } from 'vs/workbench/contrib/tasks/node/processTaskSystem'; import { ProcessRunnerDetector } from 'vs/workbench/contrib/tasks/node/processRunnerDetector'; -import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; -import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; -import { RunAutomaticTasks, AllowAutomaticTaskRunning, DisallowAutomaticTaskRunning } from 'vs/workbench/contrib/tasks/browser/runAutomaticTasks'; import { AbstractTaskService } from 'vs/workbench/contrib/tasks/browser/abstractTaskService'; import { TaskFilter } from 'vs/workbench/contrib/tasks/common/taskService'; -let tasksCategory = nls.localize('tasksCategory', "Tasks"); - -const workbenchRegistry = Registry.as(WorkbenchExtensions.Workbench); -workbenchRegistry.registerWorkbenchContribution(RunAutomaticTasks, LifecyclePhase.Eventually); - -const actionRegistry = Registry.as(ActionExtensions.WorkbenchActions); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(AllowAutomaticTaskRunning, AllowAutomaticTaskRunning.ID, AllowAutomaticTaskRunning.LABEL), 'Tasks: Allow Automatic Tasks in Folder', tasksCategory); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(DisallowAutomaticTaskRunning, DisallowAutomaticTaskRunning.ID, DisallowAutomaticTaskRunning.LABEL), 'Tasks: Disallow Automatic Tasks in Folder', tasksCategory); - interface WorkspaceFolderConfigurationResult { workspaceFolder: IWorkspaceFolder; config: TaskConfig.ExternalTaskRunnerConfiguration | undefined; From a9672ad7463fb16a03d7e3d9b5ea401227e930c1 Mon Sep 17 00:00:00 2001 From: ozyx Date: Thu, 20 Jun 2019 00:36:34 -0700 Subject: [PATCH 0423/1449] remove trailing '/' from repo url for baseFolderName --- extensions/git/src/git.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index df9de2ad974..30348608dd0 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -339,7 +339,7 @@ export class Git { } async clone(url: string, parentPath: string, cancellationToken?: CancellationToken): Promise { - let baseFolderName = decodeURI(url).replace(/^.*\//, '').replace(/\.git$/, '') || 'repository'; + let baseFolderName = decodeURI(url).replace(/[\/]+$/, '').replace(/^.*\//, '').replace(/\.git$/, '') || 'repository'; let folderName = baseFolderName; let folderPath = path.join(parentPath, folderName); let count = 1; From 6c5bb443ac8c8233cabe3fab7d88a887bc9724f2 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 20 Jun 2019 09:38:42 +0200 Subject: [PATCH 0424/1449] handle style-attribute modifications, cache requests in addition to results, #75061 --- src/vs/workbench/browser/web.resources.ts | 100 +++++++++++++--------- 1 file changed, 58 insertions(+), 42 deletions(-) diff --git a/src/vs/workbench/browser/web.resources.ts b/src/vs/workbench/browser/web.resources.ts index 8d1d22a8264..ca6c82ef787 100644 --- a/src/vs/workbench/browser/web.resources.ts +++ b/src/vs/workbench/browser/web.resources.ts @@ -10,20 +10,25 @@ import { getMediaMime } from 'vs/base/common/mime'; export class WebResources { private readonly _regexp = /url\(('|")?(vscode-remote:\/\/.*?)\1\)/g; - private readonly _cache = new Map(); + private readonly _urlCache = new Map(); + private readonly _requestCache = new Map>(); private readonly _observer: MutationObserver; constructor(@IFileService private readonly _fileService: IFileService) { - this._observer = new MutationObserver(r => this._handleMutation(r)); - // todo@joh add observer to more than head-element // todo@joh explore alternative approach - this._observer.observe(document.head, { subtree: true, childList: true }); + this._observer = new MutationObserver(r => this._handleMutation(r)); + this._observer.observe(document, { + subtree: true, + childList: true, + attributes: true, + attributeFilter: ['style'] + }); } dispose(): void { this._observer.disconnect(); - this._cache.forEach(value => URL.revokeObjectURL(value)); + this._urlCache.forEach(value => URL.revokeObjectURL(value)); } private _handleMutation(records: MutationRecord[]): void { @@ -39,62 +44,73 @@ export class WebResources { this._handleStyleNode(node); } }); + } else if (record.type === 'attributes') { + // style-attribute + this._handleAttrMutation(record.target); } } } private _handleStyleNode(target: Node): void { - - if (!target.textContent) { - return; + if (target.textContent && target.textContent.indexOf('vscode-remote://') >= 0) { + const content = target.textContent; + this._rewriteUrls(content).then(value => { + if (content === target.textContent) { + target.textContent = value; + } + }).catch(e => { + console.error(e); + }); } + } + + private _handleAttrMutation(target: Node): void { + const styleValue = (target).getAttribute('style'); + if (styleValue && styleValue.indexOf('vscode-remote://') >= 0) { + this._rewriteUrls(styleValue).then(value => { + if (value !== styleValue) { + (target).setAttribute('style', value); + } + }).catch(e => { + console.error(e); + }); + } + } + + private async _rewriteUrls(textContent: string): Promise { const positions: number[] = []; const promises: Promise[] = []; let match: RegExpMatchArray | null = null; - while (match = this._regexp.exec(target.textContent)) { + while (match = this._regexp.exec(textContent)) { const remoteUrl = match[2]; positions.push(match.index! + 'url('.length + (typeof match[1] === 'string' ? match[1].length : 0)); positions.push(remoteUrl.length); - if (this._cache.has(remoteUrl)) { - promises.push(Promise.resolve()); - - } else { - const uri = URI.parse(remoteUrl, true); - promises.push(this._fileService.readFile(uri).then(file => { - this._cache.set(remoteUrl, URL.createObjectURL(new Blob( - [file.value.buffer], { type: getMediaMime(uri.path) } - ))); - })); + if (!this._urlCache.has(remoteUrl)) { + let request = this._requestCache.get(remoteUrl); + if (!request) { + const uri = URI.parse(remoteUrl, true); + request = this._fileService.readFile(uri).then(file => { + const blobUrl = URL.createObjectURL(new Blob([file.value.buffer], { type: getMediaMime(uri.path) })); + this._urlCache.set(remoteUrl, blobUrl); + }); + this._requestCache.set(remoteUrl, request); + } + promises.push(request); } } - if (promises.length === 0) { - return; + let content = textContent; + await Promise.all(promises); + for (let i = positions.length - 1; i >= 0; i -= 2) { + const start = positions[i - 1]; + const len = positions[i]; + const url = this._urlCache.get(content.substr(start, len)); + content = content.substring(0, start) + url + content.substring(start + len); } - - let content = target.textContent; - - Promise.all(promises).then(() => { - - if (target.textContent !== content) { - return; - } - - for (let i = positions.length - 1; i >= 0; i -= 2) { - const start = positions[i - 1]; - const len = positions[i]; - const url = this._cache.get(content.substr(start, len)); - content = content.substring(0, start) + url + content.substring(start + len); - } - - target.textContent = content; - - }).catch(e => { - console.error(e); - }); + return content; } } From 49e75c37a48b89df58409f4568409d3f0073d09d Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 20 Jun 2019 09:50:42 +0200 Subject: [PATCH 0425/1449] fix #75818 --- src/vs/editor/contrib/suggest/suggestWidget.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/suggest/suggestWidget.ts b/src/vs/editor/contrib/suggest/suggestWidget.ts index d3089cd1428..7dabc8b16a5 100644 --- a/src/vs/editor/contrib/suggest/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/suggestWidget.ts @@ -956,7 +956,7 @@ export class SuggestWidget implements IContentWidget, IListVirtualDelegate Date: Thu, 20 Jun 2019 09:51:21 +0200 Subject: [PATCH 0426/1449] fix bad tree guide indentation --- src/vs/base/browser/ui/tree/media/tree.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/vs/base/browser/ui/tree/media/tree.css b/src/vs/base/browser/ui/tree/media/tree.css index 564d5505e41..85dcafe22b1 100644 --- a/src/vs/base/browser/ui/tree/media/tree.css +++ b/src/vs/base/browser/ui/tree/media/tree.css @@ -27,6 +27,11 @@ body:not([data-exploration="icon-exploration"]) .monaco-tl-indent { left: 16px; } +/* TODO @misolori remove before shipping stable */ +body:not([data-exploration="icon-exploration"]) .hide-arrows .monaco-tl-indent { + left: 10px; +} + .monaco-tl-indent > svg { overflow: visible; } From 7e1418779cdc0536d08ae8e6ed21f347a32bffcb Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 20 Jun 2019 10:03:02 +0200 Subject: [PATCH 0427/1449] remove TODO --- src/vs/code/electron-main/app.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index c5e45863a06..a829266dc51 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -523,7 +523,7 @@ export class CodeApplication extends Disposable { this.lifecycleService.phase = LifecycleMainPhase.Ready; // Propagate to clients - const windowsMainService = this.windowsMainService = accessor.get(IWindowsMainService); // TODO@Joao: unfold this + const windowsMainService = this.windowsMainService = accessor.get(IWindowsMainService); // Create a URL handler which forwards to the last active window const activeWindowManager = new ActiveWindowManager(windowsService); From 05ba8ae885c75c321ce5beabdf28bcb6be75c464 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 20 Jun 2019 10:15:27 +0200 Subject: [PATCH 0428/1449] update eslint --- package.json | 2 +- yarn.lock | 379 ++++++++++++++++++--------------------------------- 2 files changed, 137 insertions(+), 244 deletions(-) diff --git a/package.json b/package.json index 770f731ec1b..2b16c7a34e8 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "debounce": "^1.0.0", "documentdb": "^1.5.1", "electron-mksnapshot": "~2.0.0", - "eslint": "^3.4.0", + "eslint": "^4.18.2", "event-stream": "3.3.4", "express": "^4.13.1", "fancy-log": "^1.3.3", diff --git a/yarn.lock b/yarn.lock index a48125a4d72..4d4f75a05f7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -303,10 +303,10 @@ acorn@^5.0.0, acorn@^5.6.2: resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" integrity sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ== -acorn@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.2.1.tgz#317ac7821826c22c702d66189ab8359675f135d7" - integrity sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w== +acorn@^5.5.0: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== acorn@^6.0.2: version "6.0.7" @@ -327,24 +327,16 @@ agent-base@~4.2.0: dependencies: es6-promisify "^5.0.0" -ajv-keywords@^1.0.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" - integrity sha1-MU3QpLM2j609/NxU7eYXG4htrzw= +ajv-keywords@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" + integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I= ajv-keywords@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" integrity sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo= -ajv@^4.7.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" - integrity sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY= - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" - ajv@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.3.0.tgz#4414ff74a50879c208ee5fdc826e32c303549eda" @@ -355,7 +347,7 @@ ajv@^5.1.0: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" -ajv@^5.3.0: +ajv@^5.2.3, ajv@^5.3.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= @@ -423,11 +415,6 @@ ansi-cyan@^0.1.1: dependencies: ansi-wrap "0.1.0" -ansi-escapes@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" - integrity sha1-06ioOzGapneTZisT52HHkRQiMG4= - ansi-escapes@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" @@ -828,7 +815,7 @@ azure-storage@^2.10.2: xml2js "0.2.8" xmlbuilder "^9.0.7" -babel-code-frame@^6.16.0: +babel-code-frame@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= @@ -1309,7 +1296,7 @@ chalk@2.3.1: escape-string-regexp "^1.0.5" supports-color "^5.2.0" -chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: +chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= @@ -1347,6 +1334,11 @@ chalk@^2.3.0: escape-string-regexp "^1.0.5" supports-color "^4.0.0" +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= + chardet@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.5.0.tgz#fe3ac73c00c3d865ffcc02a0682e2c20b6a06029" @@ -1473,13 +1465,6 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -cli-cursor@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" - integrity sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc= - dependencies: - restore-cursor "^1.0.1" - cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" @@ -1720,7 +1705,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@1.6.0, concat-stream@^1.5.2: +concat-stream@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" integrity sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc= @@ -1894,7 +1879,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" -cross-spawn@^5.0.1: +cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= @@ -2083,7 +2068,7 @@ debug@2.2.0: dependencies: ms "0.7.1" -debug@2.6.9, debug@^2.1.1, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3: +debug@2.6.9, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -2319,14 +2304,6 @@ dir-glob@^2.0.0: arrify "^1.0.1" path-type "^3.0.0" -doctrine@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" - integrity sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM= - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" @@ -2592,18 +2569,6 @@ es6-iterator@^2.0.1, es6-iterator@~2.0.1: es5-ext "^0.10.35" es6-symbol "^3.1.1" -es6-map@^0.1.3: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" - integrity sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA= - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-set "~0.1.5" - es6-symbol "~3.1.1" - event-emitter "~0.3.5" - es6-promise@^4.0.3: version "4.2.4" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" @@ -2616,18 +2581,7 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" -es6-set@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" - integrity sha1-0rPsXU2ADO2BjbU40ol02wpzzLE= - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-symbol "3.1.1" - event-emitter "~0.3.5" - -es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: +es6-symbol@^3.1.1, es6-symbol@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= @@ -2684,13 +2638,11 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" -escope@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" - integrity sha1-4Bl16BJ4GhY6ba392AOY3GTIicM= +eslint-scope@^3.7.1: + version "3.7.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535" + integrity sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA== dependencies: - es6-map "^0.1.3" - es6-weak-map "^2.0.1" esrecurse "^4.1.0" estraverse "^4.1.1" @@ -2712,46 +2664,49 @@ eslint-visitor-keys@^1.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== -eslint@^3.4.0: - version "3.19.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc" - integrity sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw= +eslint@^4.18.2: + version "4.19.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" + integrity sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ== dependencies: - babel-code-frame "^6.16.0" - chalk "^1.1.3" - concat-stream "^1.5.2" - debug "^2.1.1" - doctrine "^2.0.0" - escope "^3.6.0" - espree "^3.4.0" + ajv "^5.3.0" + babel-code-frame "^6.22.0" + chalk "^2.1.0" + concat-stream "^1.6.0" + cross-spawn "^5.1.0" + debug "^3.1.0" + doctrine "^2.1.0" + eslint-scope "^3.7.1" + eslint-visitor-keys "^1.0.0" + espree "^3.5.4" esquery "^1.0.0" - estraverse "^4.2.0" esutils "^2.0.2" file-entry-cache "^2.0.0" - glob "^7.0.3" - globals "^9.14.0" - ignore "^3.2.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.0.1" + ignore "^3.3.3" imurmurhash "^0.1.4" - inquirer "^0.12.0" - is-my-json-valid "^2.10.0" + inquirer "^3.0.6" is-resolvable "^1.0.0" - js-yaml "^3.5.1" - json-stable-stringify "^1.0.0" + js-yaml "^3.9.1" + json-stable-stringify-without-jsonify "^1.0.1" levn "^0.3.0" - lodash "^4.0.0" - mkdirp "^0.5.0" + lodash "^4.17.4" + minimatch "^3.0.2" + mkdirp "^0.5.1" natural-compare "^1.4.0" optionator "^0.8.2" - path-is-inside "^1.0.1" - pluralize "^1.2.1" - progress "^1.1.8" - require-uncached "^1.0.2" - shelljs "^0.7.5" - strip-bom "^3.0.0" + path-is-inside "^1.0.2" + pluralize "^7.0.0" + progress "^2.0.0" + regexpp "^1.0.1" + require-uncached "^1.0.3" + semver "^5.3.0" + strip-ansi "^4.0.0" strip-json-comments "~2.0.1" - table "^3.7.8" + table "4.0.2" text-table "~0.2.0" - user-home "^2.0.0" eslint@^5.0.1: version "5.13.0" @@ -2795,12 +2750,12 @@ eslint@^5.0.1: table "^5.0.2" text-table "^0.2.0" -espree@^3.4.0: - version "3.5.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.2.tgz#756ada8b979e9dcfcdb30aad8d1a9304a905e1ca" - integrity sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ== +espree@^3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" + integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A== dependencies: - acorn "^5.2.1" + acorn "^5.5.0" acorn-jsx "^3.0.0" espree@^5.0.0: @@ -2859,7 +2814,7 @@ estraverse@^1.9.1: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= @@ -2874,14 +2829,6 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -event-emitter@~0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= - dependencies: - d "1" - es5-ext "~0.10.14" - event-stream@3.3.4, event-stream@^3.3.4: version "3.3.4" resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" @@ -2939,11 +2886,6 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -exit-hook@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" - integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g= - expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" @@ -3051,6 +2993,15 @@ extend@^3.0.2, extend@~3.0.2: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== +external-editor@^2.0.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + external-editor@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.0.tgz#dc35c48c6f98a30ca27a20e9687d7f3c77704bb6" @@ -3177,14 +3128,6 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" -figures@^1.3.5: - version "1.7.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" - integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= - dependencies: - escape-string-regexp "^1.0.5" - object-assign "^4.1.0" - figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" @@ -3712,7 +3655,7 @@ glob@^6.0.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2: +glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, 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== @@ -3761,16 +3704,16 @@ global-prefix@^1.0.1: is-windows "^1.0.1" which "^1.2.14" +globals@^11.0.1: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + globals@^11.7.0: version "11.10.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.10.0.tgz#1e09776dffda5e01816b3bb4077c8b59c24eaa50" integrity sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ== -globals@^9.14.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== - globby@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" @@ -4393,7 +4336,7 @@ iconv-lite@0.4.23, iconv-lite@^0.4.22, iconv-lite@^0.4.4: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.4.24: +iconv-lite@^0.4.17, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -4417,12 +4360,7 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -ignore@^3.2.0: - version "3.3.7" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" - integrity sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA== - -ignore@^3.3.5: +ignore@^3.3.3, ignore@^3.3.5: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== @@ -4498,23 +4436,24 @@ innosetup@5.6.1: resolved "https://registry.yarnpkg.com/innosetup/-/innosetup-5.6.1.tgz#6e7031ba35b23e716e4f29686bc994052e0c278c" integrity sha512-Eit24N3JR8O0Wpuq/dMWCl2r550eiNP2124SbdbwOob43x89WPGL/SGpZG5EPHu20kV2N+4TwvHwFIM8pFUJ0g== -inquirer@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" - integrity sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34= +inquirer@^3.0.6: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== dependencies: - ansi-escapes "^1.1.0" - ansi-regex "^2.0.0" - chalk "^1.0.0" - cli-cursor "^1.0.1" + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" cli-width "^2.0.0" - figures "^1.3.5" + external-editor "^2.0.4" + figures "^2.0.0" lodash "^4.3.0" - readline2 "^1.0.1" - run-async "^0.1.0" - rx-lite "^3.1.2" - string-width "^1.0.1" - strip-ansi "^3.0.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" through "^2.3.6" inquirer@^6.0.0: @@ -4560,11 +4499,6 @@ int64-buffer@^0.1.9: resolved "https://registry.yarnpkg.com/int64-buffer/-/int64-buffer-0.1.9.tgz#9e039da043b24f78b196b283e04653ef5e990f61" integrity sha1-ngOdoEOyT3ixlrKD4EZT716ZD2E= -interpret@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.4.tgz#820cdd588b868ffb191a809506d6c9c8f212b1b0" - integrity sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA= - interpret@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" @@ -4762,7 +4696,7 @@ is-glob@^4.0.0: dependencies: is-extglob "^2.1.1" -is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: +is-my-json-valid@^2.12.4: version "2.16.1" resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz#5a846777e2c2620d1e69104e5d3a03b1f6088f11" integrity sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ== @@ -5056,7 +4990,7 @@ js-yaml@3.6.1: argparse "^1.0.7" esprima "^2.6.0" -js-yaml@3.x, js-yaml@^3.5.1: +js-yaml@3.x: version "3.10.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" integrity sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA== @@ -5072,7 +5006,7 @@ js-yaml@^3.12.0: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^3.13.0: +js-yaml@^3.13.0, js-yaml@^3.9.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -5145,7 +5079,7 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= -json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: +json-stable-stringify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= @@ -5439,7 +5373,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.0.0, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.3.0: +lodash@^4.13.1, lodash@^4.15.0, lodash@^4.3.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" integrity sha1-eCA6TRwyiuHYbcpkYONptX9AVa4= @@ -5965,11 +5899,6 @@ mute-stdout@^1.0.0: resolved "https://registry.yarnpkg.com/mute-stdout/-/mute-stdout-1.0.1.tgz#acb0300eb4de23a7ddeec014e3e96044b3472331" integrity sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg== -mute-stream@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" - integrity sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA= - mute-stream@0.0.7, mute-stream@~0.0.4: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" @@ -6384,11 +6313,6 @@ once@1.x, once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: dependencies: wrappy "1" -onetime@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" - integrity sha1-ofeDj4MUxRbwXs78vEzP4EtO14k= - onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" @@ -6847,10 +6771,10 @@ plugin-error@1.0.1, plugin-error@^1.0.1: arr-union "^3.1.0" extend-shallow "^3.0.2" -pluralize@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" - integrity sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU= +pluralize@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== portfinder@^1.0.13: version "1.0.20" @@ -7535,15 +7459,6 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" -readline2@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" - integrity sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - mute-stream "0.0.5" - rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" @@ -7591,6 +7506,11 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexpp@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" + integrity sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw== + regexpp@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" @@ -7769,7 +7689,7 @@ require-main-filename@^1.0.1: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= -require-uncached@^1.0.2: +require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= @@ -7843,14 +7763,6 @@ resolve@^1.4.0: dependencies: path-parse "^1.0.6" -restore-cursor@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" - integrity sha1-NGYfRohjJ/7SmRR5FSJS35LapUE= - dependencies: - exit-hook "^1.0.0" - onetime "^1.0.0" - restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -7905,13 +7817,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -run-async@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" - integrity sha1-yK1KXhEGYeQCp9IbUw4AnyX444k= - dependencies: - once "^1.3.0" - run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" @@ -7926,10 +7831,17 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rx-lite@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" - integrity sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI= +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= rxjs@^6.1.0: version "6.2.2" @@ -8126,15 +8038,6 @@ shebang-regex@^1.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= -shelljs@^0.7.5: - version "0.7.8" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" - integrity sha1-3svPh0sNHl+3LhSxZKloMEjprLM= - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - sigmund@^1.0.1, sigmund@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" @@ -8181,10 +8084,12 @@ slash@^1.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= -slice-ansi@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" - integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= +slice-ansi@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== + dependencies: + is-fullwidth-code-point "^2.0.0" slice-ansi@^2.0.0: version "2.1.0" @@ -8572,11 +8477,6 @@ strip-bom@^2.0.0: dependencies: is-utf8 "^0.2.0" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -8665,17 +8565,17 @@ svgo@^0.7.0: sax "~1.2.1" whet.extend "~0.9.9" -table@^3.7.8: - version "3.8.3" - resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" - integrity sha1-K7xULw/amGGnVdOUf+/Ys/UThV8= +table@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" + integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA== dependencies: - ajv "^4.7.0" - ajv-keywords "^1.0.0" - chalk "^1.1.1" - lodash "^4.0.0" - slice-ansi "0.0.4" - string-width "^2.0.0" + ajv "^5.2.3" + ajv-keywords "^2.1.0" + chalk "^2.1.0" + lodash "^4.17.4" + slice-ansi "1.0.0" + string-width "^2.1.1" table@^5.0.2: version "5.2.2" @@ -9279,13 +9179,6 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -user-home@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" - integrity sha1-nHC/2Babwdy/SGBODwS4tJzenp8= - dependencies: - os-homedir "^1.0.0" - util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" From 9d82f43b78eea79a9160fa7c338b64e3989b9993 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 20 Jun 2019 10:20:03 +0200 Subject: [PATCH 0429/1449] update distro fixes #73872 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2b16c7a34e8..892fac7ab0d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "555abb7db38aa08e0f905213c013f7bad0747ed2", + "distro": "cb7eed7b39c86ccca67c4359cba49df01709d5ed", "author": { "name": "Microsoft Corporation" }, From bbb45622d8b857fabb75631d66f2b21fc47f1095 Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 20 Jun 2019 10:26:48 +0200 Subject: [PATCH 0430/1449] Revert "Revert "Merge pull request #75695 from orange4glace/master"" This reverts commit a05e05ca19f6e82d0d90c54029a8b76e4ed5896a. --- .../files/browser/views/explorerViewer.ts | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts index 76fab053275..184916e4ee5 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts @@ -218,22 +218,29 @@ export class FilesRenderer implements ITreeRenderer 0 && !stat.isDirectory ? lastDot : value.length }); - const done = once(async (success: boolean, finishEditing: boolean) => { + let isFinishableDisposeEvent = false; + setTimeout(() => { + // Check if disposed + if (!inputBox.inputElement) { + return; + } + inputBox.focus(); + inputBox.select({ start: 0, end: lastDot > 0 && !stat.isDirectory ? lastDot : value.length }); + isFinishableDisposeEvent = true; + }, 0); + + const done = once(async (success: boolean) => { label.element.style.display = 'none'; const value = inputBox.value; dispose(toDispose); container.removeChild(label.element); - if (finishEditing) { - // Timeout: once done rendering only then re-render #70902 - setTimeout(() => editableData.onFinish(value, success), 0); - } + // Timeout: once done rendering only then re-render #70902 + setTimeout(() => editableData.onFinish(value, success), 0); }); const blurDisposable = DOM.addDisposableListener(inputBox.inputElement, DOM.EventType.BLUR, () => { - done(inputBox.isInputValid(), true); + done(inputBox.isInputValid()); }); const toDispose = [ @@ -241,10 +248,10 @@ export class FilesRenderer implements ITreeRenderer { if (e.equals(KeyCode.Enter)) { if (inputBox.validate()) { - done(true, true); + done(true); } } else if (e.equals(KeyCode.Escape)) { - done(false, true); + done(false); } }), blurDisposable, @@ -253,8 +260,12 @@ export class FilesRenderer implements ITreeRenderer { - blurDisposable.dispose(); - done(false, false); + if (isFinishableDisposeEvent) { + done(false); + } + else { + dispose(toDispose); + } }); } From db17c23a72e9dd57da6f7b53d006832f791369ed Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 20 Jun 2019 10:27:01 +0200 Subject: [PATCH 0431/1449] Revert "Revert "explorero: file actions disablment no longer needed"" This reverts commit b6341520000c2615b9f0cb4aad732216826d0bc4. --- .../contrib/files/browser/fileActions.ts | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/vs/workbench/contrib/files/browser/fileActions.ts b/src/vs/workbench/contrib/files/browser/fileActions.ts index f12976ad42c..837f66be83b 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.ts @@ -85,15 +85,10 @@ export class NewFileAction extends Action { static readonly LABEL = nls.localize('createNewFile', "New File"); constructor( - @IExplorerService explorerService: IExplorerService, @ICommandService private commandService: ICommandService ) { super('explorer.newFile', NEW_FILE_LABEL); this.class = 'explorer-action new-file'; - this._register(explorerService.onDidChangeEditable(e => { - const elementIsBeingEdited = explorerService.isEditable(e); - this.enabled = !elementIsBeingEdited; - })); } run(): Promise { @@ -107,15 +102,10 @@ export class NewFolderAction extends Action { static readonly LABEL = nls.localize('createNewFolder', "New Folder"); constructor( - @IExplorerService explorerService: IExplorerService, @ICommandService private commandService: ICommandService ) { super('explorer.newFolder', NEW_FOLDER_LABEL); this.class = 'explorer-action new-folder'; - this._register(explorerService.onDidChangeEditable(e => { - const elementIsBeingEdited = explorerService.isEditable(e); - this.enabled = !elementIsBeingEdited; - })); } run(): Promise { @@ -609,10 +599,6 @@ export class CollapseExplorerView extends Action { @IExplorerService readonly explorerService: IExplorerService ) { super(id, label, 'explorer-action collapse-explorer'); - this._register(explorerService.onDidChangeEditable(e => { - const elementIsBeingEdited = explorerService.isEditable(e); - this.enabled = !elementIsBeingEdited; - })); } run(): Promise { @@ -637,10 +623,6 @@ export class RefreshExplorerView extends Action { @IExplorerService private readonly explorerService: IExplorerService ) { super(id, label, 'explorer-action refresh-explorer'); - this._register(explorerService.onDidChangeEditable(e => { - const elementIsBeingEdited = explorerService.isEditable(e); - this.enabled = !elementIsBeingEdited; - })); } public run(): Promise { From 5c3bab92ac05e8e1fb33d77fad154f4314d39f14 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 20 Jun 2019 10:30:11 +0200 Subject: [PATCH 0432/1449] more code insets API tweaks, #66418 --- src/vs/vscode.proposed.d.ts | 5 +++-- .../workbench/api/browser/mainThreadCodeInsets.ts | 14 +++++++------- src/vs/workbench/api/common/extHost.protocol.ts | 2 +- src/vs/workbench/api/common/extHostCodeInsets.ts | 8 ++++---- src/vs/workbench/api/node/extHost.api.impl.ts | 4 ++-- 5 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 16e52984ff9..f7e2713eb47 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -139,14 +139,15 @@ declare module 'vscode' { export interface WebviewEditorInset { readonly editor: TextEditor; - readonly range: Range; + readonly line: number; + readonly height: number; readonly webview: Webview; readonly onDidDispose: Event; dispose(): void; } export namespace window { - export function createWebviewTextEditorInset(editor: TextEditor, range: Range, options?: WebviewOptions): WebviewEditorInset; + export function createWebviewTextEditorInset(editor: TextEditor, line: number, height: number, options?: WebviewOptions): WebviewEditorInset; } //#endregion diff --git a/src/vs/workbench/api/browser/mainThreadCodeInsets.ts b/src/vs/workbench/api/browser/mainThreadCodeInsets.ts index 8fb66ec1a55..378fb000ddb 100644 --- a/src/vs/workbench/api/browser/mainThreadCodeInsets.ts +++ b/src/vs/workbench/api/browser/mainThreadCodeInsets.ts @@ -7,7 +7,6 @@ import { UriComponents, URI } from 'vs/base/common/uri'; import * as modes from 'vs/editor/common/modes'; import { MainContext, MainThreadEditorInsetsShape, IExtHostContext, ExtHostEditorInsetsShape, ExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; import { extHostNamedCustomer } from '../common/extHostCustomers'; -import { IRange } from 'vs/editor/common/core/range'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { IWebviewService, Webview } from 'vs/workbench/contrib/webview/common/webview'; import { DisposableStore } from 'vs/base/common/lifecycle'; @@ -32,14 +31,15 @@ class EditorWebviewZone implements IViewZone { constructor( readonly editor: IActiveCodeEditor, - readonly range: IRange, + readonly line: number, + readonly height: number, readonly webview: Webview, ) { this.domNode = document.createElement('div'); this.domNode.style.zIndex = '10'; // without this, the webview is not interactive - this.afterLineNumber = range.startLineNumber; - this.afterColumn = range.startColumn; - this.heightInLines = range.endLineNumber - range.startLineNumber; + this.afterLineNumber = line; + this.afterColumn = 1; + this.heightInLines = height; editor.changeViewZones(accessor => this._id = accessor.addZone(this)); webview.mountTo(this.domNode); @@ -69,7 +69,7 @@ export class MainThreadEditorInsets implements MainThreadEditorInsetsShape { this._disposables.dispose(); } - async $createEditorInset(handle: number, id: string, uri: UriComponents, range: IRange, options: modes.IWebviewOptions, extensionId: ExtensionIdentifier, extensionLocation: UriComponents): Promise { + async $createEditorInset(handle: number, id: string, uri: UriComponents, line: number, height: number, options: modes.IWebviewOptions, extensionId: ExtensionIdentifier, extensionLocation: UriComponents): Promise { let editor: IActiveCodeEditor | undefined; id = id.substr(0, id.indexOf(',')); //todo@joh HACK @@ -97,7 +97,7 @@ export class MainThreadEditorInsets implements MainThreadEditorInsetsShape { localResourceRoots: options.localResourceRoots ? options.localResourceRoots.map(uri => URI.revive(uri)) : undefined }); - const webviewZone = new EditorWebviewZone(editor, range, webview); + const webviewZone = new EditorWebviewZone(editor, line, height, webview); const remove = () => { disposables.dispose(); diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 375d760db51..a26b979606e 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -511,7 +511,7 @@ export interface MainThreadTelemetryShape extends IDisposable { } export interface MainThreadEditorInsetsShape extends IDisposable { - $createEditorInset(handle: number, id: string, uri: UriComponents, range: IRange, options: modes.IWebviewOptions, extensionId: ExtensionIdentifier, extensionLocation: UriComponents): Promise; + $createEditorInset(handle: number, id: string, uri: UriComponents, line: number, height: number, options: modes.IWebviewOptions, extensionId: ExtensionIdentifier, extensionLocation: UriComponents): Promise; $disposeEditorInset(handle: number): void; $setHtml(handle: number, value: string): void; diff --git a/src/vs/workbench/api/common/extHostCodeInsets.ts b/src/vs/workbench/api/common/extHostCodeInsets.ts index 975f4ec205d..398afff564f 100644 --- a/src/vs/workbench/api/common/extHostCodeInsets.ts +++ b/src/vs/workbench/api/common/extHostCodeInsets.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import { Emitter } from 'vs/base/common/event'; -import * as typeConverters from 'vs/workbench/api/common/extHostTypeConverters'; import * as vscode from 'vscode'; import { MainThreadEditorInsetsShape } from './extHost.protocol'; import { ExtHostEditors } from 'vs/workbench/api/common/extHostTextEditors'; @@ -39,7 +38,7 @@ export class ExtHostEditorInsets implements ExtHostEditorInsets { this._disposables.dispose(); } - createWebviewEditorInset(editor: vscode.TextEditor, range: vscode.Range, options: vscode.WebviewOptions | undefined, extension: IExtensionDescription): vscode.WebviewEditorInset { + createWebviewEditorInset(editor: vscode.TextEditor, line: number, height: number, options: vscode.WebviewOptions | undefined, extension: IExtensionDescription): vscode.WebviewEditorInset { let apiEditor: ExtHostTextEditor | undefined; for (const candidate of this._editors.getVisibleTextEditors()) { @@ -92,7 +91,8 @@ export class ExtHostEditorInsets implements ExtHostEditorInsets { const inset = new class implements vscode.WebviewEditorInset { readonly editor: vscode.TextEditor = editor; - readonly range: vscode.Range = range; + readonly line: number = line; + readonly height: number = height; readonly webview: vscode.Webview = webview; readonly onDidDispose: vscode.Event = onDidDispose.event; @@ -109,7 +109,7 @@ export class ExtHostEditorInsets implements ExtHostEditorInsets { } }; - this._proxy.$createEditorInset(handle, apiEditor.id, apiEditor.document.uri, typeConverters.Range.from(range), options || {}, extension.identifier, extension.extensionLocation); + this._proxy.$createEditorInset(handle, apiEditor.id, apiEditor.document.uri, line + 1, height, options || {}, extension.identifier, extension.extensionLocation); this._insets.set(handle, { editor, inset, onDidReceiveMessage }); return inset; diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 9b23ac7027e..0c1ccf31890 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -505,9 +505,9 @@ export function createApiFactory( createWebviewPanel(viewType: string, title: string, showOptions: vscode.ViewColumn | { viewColumn: vscode.ViewColumn, preserveFocus?: boolean }, options: vscode.WebviewPanelOptions & vscode.WebviewOptions): vscode.WebviewPanel { return extHostWebviews.createWebviewPanel(extension, viewType, title, showOptions, options); }, - createWebviewTextEditorInset(editor: vscode.TextEditor, range: vscode.Range, options: vscode.WebviewOptions): vscode.WebviewEditorInset { + createWebviewTextEditorInset(editor: vscode.TextEditor, line: number, height: number, options: vscode.WebviewOptions): vscode.WebviewEditorInset { checkProposedApiEnabled(extension); - return extHostEditorInsets.createWebviewEditorInset(editor, range, options, extension); + return extHostEditorInsets.createWebviewEditorInset(editor, line, height, options, extension); }, createTerminal(nameOrOptions?: vscode.TerminalOptions | string, shellPath?: string, shellArgs?: string[] | string): vscode.Terminal { if (typeof nameOrOptions === 'object') { From c6a21162350f3aa71c06d9ed9cafff6de982ac5e Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 20 Jun 2019 10:45:10 +0200 Subject: [PATCH 0433/1449] Alpine build --- build/azure-pipelines/linux/build-alpine.sh | 3 + .../azure-pipelines/linux/prebuild-alpine.sh | 3 + .../linux/product-build-linux-alpine.yml | 65 +++++++++++++++++++ build/azure-pipelines/linux/publish-alpine.sh | 3 + build/azure-pipelines/product-build.yml | 11 ++++ build/gulpfile.reh.js | 14 ++++ 6 files changed, 99 insertions(+) create mode 100755 build/azure-pipelines/linux/build-alpine.sh create mode 100755 build/azure-pipelines/linux/prebuild-alpine.sh create mode 100644 build/azure-pipelines/linux/product-build-linux-alpine.yml create mode 100755 build/azure-pipelines/linux/publish-alpine.sh diff --git a/build/azure-pipelines/linux/build-alpine.sh b/build/azure-pipelines/linux/build-alpine.sh new file mode 100755 index 00000000000..4f01bc9a7e5 --- /dev/null +++ b/build/azure-pipelines/linux/build-alpine.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +echo 'noop' \ No newline at end of file diff --git a/build/azure-pipelines/linux/prebuild-alpine.sh b/build/azure-pipelines/linux/prebuild-alpine.sh new file mode 100755 index 00000000000..4f01bc9a7e5 --- /dev/null +++ b/build/azure-pipelines/linux/prebuild-alpine.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +echo 'noop' \ No newline at end of file diff --git a/build/azure-pipelines/linux/product-build-linux-alpine.yml b/build/azure-pipelines/linux/product-build-linux-alpine.yml new file mode 100644 index 00000000000..4beee37d1a0 --- /dev/null +++ b/build/azure-pipelines/linux/product-build-linux-alpine.yml @@ -0,0 +1,65 @@ +steps: +- task: NodeTool@0 + inputs: + versionSpec: "10.15.1" + +- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 + inputs: + versionSpec: "1.10.1" + +- task: AzureKeyVault@1 + displayName: 'Azure Key Vault: Get Secrets' + inputs: + azureSubscription: 'vscode-builds-subscription' + KeyVaultName: vscode + +- task: Docker@1 + displayName: 'Pull image' + inputs: + azureSubscriptionEndpoint: 'vscode-builds-subscription' + azureContainerRegistry: vscodehub.azurecr.io + command: 'Run an image' + imageName: 'vscode-linux-build-agent:alpine' + containerCommand: uname + +- script: | + set -e + + cat << EOF > ~/.netrc + machine monacotools.visualstudio.com + password $(devops-pat) + machine github.com + login vscode + password $(github-distro-mixin-password) + EOF + + git config user.email "vscode@microsoft.com" + git config user.name "VSCode" + git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git" + git fetch distro + git merge $(node -p "require('./package.json').distro") + + CHILD_CONCURRENCY=1 yarn + yarn gulp mixin + yarn gulp hygiene + yarn monaco-compile-check + ./build/azure-pipelines/linux/prebuild-alpine.sh + displayName: Prepare build + +- script: | + set -e + ./build/azure-pipelines/linux/build-alpine.sh + displayName: Build + +- script: | + set -e + AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ + AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ + VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ + VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ + ./build/azure-pipelines/linux/publish-alpine.sh + displayName: Publish + +- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 + displayName: 'Component Detection' + continueOnError: true \ No newline at end of file diff --git a/build/azure-pipelines/linux/publish-alpine.sh b/build/azure-pipelines/linux/publish-alpine.sh new file mode 100755 index 00000000000..4f01bc9a7e5 --- /dev/null +++ b/build/azure-pipelines/linux/publish-alpine.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -e +echo 'noop' \ No newline at end of file diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 590ac0dbed7..25c572cfd56 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -60,6 +60,16 @@ jobs: steps: - template: linux/product-build-linux-arm.yml +- job: LinuxAlpine + condition: eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true') + timeoutInMinutes: 120 + pool: + vmImage: 'Ubuntu-16.04' + variables: + VSCODE_ARCH: alpine + steps: + - template: linux/product-build-linux-alpine.yml + - job: macOS condition: eq(variables['VSCODE_BUILD_MACOS'], 'true') timeoutInMinutes: 120 @@ -79,6 +89,7 @@ jobs: - Linux - LinuxSnap - LinuxArmhf + - LinuxAlpine - macOS steps: - template: sync-mooncake.yml \ No newline at end of file diff --git a/build/gulpfile.reh.js b/build/gulpfile.reh.js index b0e919883c4..afdd7e36f4c 100644 --- a/build/gulpfile.reh.js +++ b/build/gulpfile.reh.js @@ -8,6 +8,7 @@ const gulp = require('gulp'); const path = require('path'); +const cp = require('child_process'); const es = require('event-stream'); const util = require('./lib/util'); const task = require('./lib/task'); @@ -30,6 +31,7 @@ gulp.task('vscode-reh-win32-x64-min', noop); gulp.task('vscode-reh-darwin-min', noop); gulp.task('vscode-reh-linux-x64-min', noop); gulp.task('vscode-reh-linux-armhf-min', noop); +gulp.task('vscode-reh-linux-alpine-min', noop); function getNodeVersion() { @@ -86,6 +88,18 @@ function nodejs(platform, arch) { ); } + if (arch === 'alpine') { + return es.readArray([ + new File({ + path: 'node', + contents: cp.execSync(`docker run --rm node:${VERSION}-alpine /bin/sh -c 'cat \`which node\`'`, { maxBuffer: 100 * 1024 * 1024, encoding: 'buffer' }), + stat: { + mode: parseInt('755', 8) + } + }) + ]); + } + if (platform === 'darwin') { arch = 'x64'; } From 1051f38c737187a944b982c7bcb2e3533d9bed7b Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 20 Jun 2019 10:56:30 +0200 Subject: [PATCH 0434/1449] Update distro hash --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 892fac7ab0d..7f473c58396 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "cb7eed7b39c86ccca67c4359cba49df01709d5ed", + "distro": "336a0c632c464d9c81e6fbff00154852967eaf02", "author": { "name": "Microsoft Corporation" }, From 0361e0504145957522e59c8e9338d6c3666d98ad Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 20 Jun 2019 11:01:34 +0200 Subject: [PATCH 0435/1449] Remove duplicate cp --- build/gulpfile.reh.js | 1 - 1 file changed, 1 deletion(-) diff --git a/build/gulpfile.reh.js b/build/gulpfile.reh.js index afdd7e36f4c..2773a8cb430 100644 --- a/build/gulpfile.reh.js +++ b/build/gulpfile.reh.js @@ -8,7 +8,6 @@ const gulp = require('gulp'); const path = require('path'); -const cp = require('child_process'); const es = require('event-stream'); const util = require('./lib/util'); const task = require('./lib/task'); From e82130da4bed64b76747ce56e5dceb6503ffc83e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20=C4=8C=C3=A1bera?= Date: Thu, 20 Jun 2019 11:13:15 +0200 Subject: [PATCH 0436/1449] shellscript: Add folding markers --- extensions/shellscript/language-configuration.json | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/extensions/shellscript/language-configuration.json b/extensions/shellscript/language-configuration.json index 01b6a8a2823..964623ac4cc 100644 --- a/extensions/shellscript/language-configuration.json +++ b/extensions/shellscript/language-configuration.json @@ -22,5 +22,11 @@ ["\"", "\""], ["'", "'"], ["`", "`"] - ] -} \ No newline at end of file + ], + "folding": { + "markers": { + "start": "^\\s*#\\s*#?region\\b.*", + "end": "^\\s*#\\s*#?endregion\\b.*" + } + } +} From 983069b176088a3b62fc19dcfd2228af9143b746 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 20 Jun 2019 11:47:09 +0200 Subject: [PATCH 0437/1449] fixes #75829 --- src/vs/platform/update/node/update.config.contribution.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/platform/update/node/update.config.contribution.ts b/src/vs/platform/update/node/update.config.contribution.ts index 541ae043f97..9d9507c6ce9 100644 --- a/src/vs/platform/update/node/update.config.contribution.ts +++ b/src/vs/platform/update/node/update.config.contribution.ts @@ -38,7 +38,8 @@ configurationRegistry.registerConfiguration({ type: 'boolean', default: true, scope: ConfigurationScope.APPLICATION, - description: localize('enableWindowsBackgroundUpdates', "Enables Windows background updates. The updates are fetched from a Microsoft online service."), + title: localize('enableWindowsBackgroundUpdatesTitle', "Enable Background Updates on Windows"), + description: localize('enableWindowsBackgroundUpdates', "Enable to download and install new VS Code Versions in the background on Windows"), tags: ['usesOnlineServices'] }, 'update.showReleaseNotes': { From 6326c5d6b6611ce09a6bf0037e284e56701c0059 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 20 Jun 2019 11:56:00 +0200 Subject: [PATCH 0438/1449] show setting on windows only --- src/vs/platform/update/node/update.config.contribution.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/platform/update/node/update.config.contribution.ts b/src/vs/platform/update/node/update.config.contribution.ts index 9d9507c6ce9..26e63ea0fe8 100644 --- a/src/vs/platform/update/node/update.config.contribution.ts +++ b/src/vs/platform/update/node/update.config.contribution.ts @@ -6,6 +6,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { localize } from 'vs/nls'; +import { isWindows } from 'vs/base/common/platform'; const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); configurationRegistry.registerConfiguration({ @@ -40,7 +41,8 @@ configurationRegistry.registerConfiguration({ scope: ConfigurationScope.APPLICATION, title: localize('enableWindowsBackgroundUpdatesTitle', "Enable Background Updates on Windows"), description: localize('enableWindowsBackgroundUpdates', "Enable to download and install new VS Code Versions in the background on Windows"), - tags: ['usesOnlineServices'] + tags: ['usesOnlineServices'], + included: isWindows }, 'update.showReleaseNotes': { type: 'boolean', From e1ac9a2490eff941c56f666800e29987c7276a67 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 20 Jun 2019 12:31:09 +0200 Subject: [PATCH 0439/1449] add ExtensionKind and remoteName propsed APIs, #74188 --- src/vs/vscode.proposed.d.ts | 48 +++++++++++++++++-- .../workbench/api/common/extHost.protocol.ts | 2 +- .../api/common/extHostExtensionActivator.ts | 5 +- src/vs/workbench/api/common/extHostMemento.ts | 10 ++-- src/vs/workbench/api/common/extHostTypes.ts | 5 ++ src/vs/workbench/api/node/extHost.api.impl.ts | 21 ++++++-- .../api/node/extHostExtensionService.ts | 11 +++-- .../common/remoteExtensionHostClient.ts | 5 +- .../electron-browser/extensionHost.ts | 4 ++ .../node/extensionHostProcessSetup.ts | 4 +- 10 files changed, 92 insertions(+), 23 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index f7e2713eb47..29764773871 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -17,18 +17,58 @@ declare module 'vscode' { //#region Joh - ExecutionContext - + // THIS is a deprecated proposal export enum ExtensionExecutionContext { Local = 1, Remote = 2 } + export interface ExtensionContext { + executionContext: ExtensionExecutionContext; + } + //#endregion + + //#region Joh - ExtensionKind, vscode.env.remoteKind + + /** + * In a remote window the extension kind describes if an extension + * runs where the UI (window) runs or if an extension runs remotely. + */ + export enum ExtensionKind { + + /** + * Extension runs where the UI runs. + */ + UI = 1, + + /** + * Extension runs where the remote extension host runs. + */ + Workspace = 2 + } export interface ExtensionContext { + /** - * Describes the context in which this extension is executed, e.g. - * a Node.js-context on the same machine or on a remote machine + * The extension kind describes if an extension runs where the UI runs + * or if an extension runs where the remote extension host runs. The extension kind + * if defined in the `package.json` file of extensions but can also be refined + * via the the `remote.extensionKind`-setting. When no remote extension host exists, + * the value is [`ExtensionKind.UI`](#ExtensionKind.UI). */ - executionContext: ExtensionExecutionContext; + extensionKind: ExtensionKind; + } + + export namespace env { + /** + * The name of a remote. Defined by extensions, popular samples are `wsl` for the Windows + * Subsystem for Linux or `ssh` for remotes using a secure shell. + * + * *Note* that the value is `undefined` when there is no remote extension host but that the + * value is defined in all extension hosts (local and remote) in case a remote extension host + * exists. Use [`ExtensionContext#extensionKind`](#ExtensionContext.extensionKind) to know if + * a specific extension runs remote or not. + */ + export const remoteName: string | undefined; } //#endregion diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index a26b979606e..df31280ffc8 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -85,7 +85,7 @@ export interface IInitData { logLevel: LogLevel; logsLocation: URI; autoStart: boolean; - remoteAuthority?: string | null; + remote: { isRemote: boolean; authority: string | undefined; }; } export interface IConfigurationInitData extends IConfigurationData { diff --git a/src/vs/workbench/api/common/extHostExtensionActivator.ts b/src/vs/workbench/api/common/extHostExtensionActivator.ts index 86d49261456..b38a447ab68 100644 --- a/src/vs/workbench/api/common/extHostExtensionActivator.ts +++ b/src/vs/workbench/api/common/extHostExtensionActivator.ts @@ -8,12 +8,14 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { ExtensionDescriptionRegistry } from 'vs/workbench/services/extensions/common/extensionDescriptionRegistry'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { ExtensionActivationError, MissingDependencyError } from 'vs/workbench/services/extensions/common/extensions'; +import { ExtensionKind } from 'vs/workbench/api/common/extHostTypes'; const NO_OP_VOID_PROMISE = Promise.resolve(undefined); export interface IExtensionMemento { + get(key: string): T | undefined; get(key: string, defaultValue: T): T; - update(key: string, value: any): Promise; + update(key: string, value: any): Promise; } export interface IExtensionContext { @@ -26,6 +28,7 @@ export interface IExtensionContext { asAbsolutePath(relativePath: string): string; readonly logPath: string; executionContext: number; + extensionKind: ExtensionKind; } /** diff --git a/src/vs/workbench/api/common/extHostMemento.ts b/src/vs/workbench/api/common/extHostMemento.ts index 3921d40d632..4502bacd671 100644 --- a/src/vs/workbench/api/common/extHostMemento.ts +++ b/src/vs/workbench/api/common/extHostMemento.ts @@ -38,7 +38,9 @@ export class ExtensionMemento implements IExtensionMemento { return this._init; } - get(key: string, defaultValue: T): T { + get(key: string): T | undefined; + get(key: string, defaultValue: T): T; + get(key: string, defaultValue?: T): T { let value = this._value[key]; if (typeof value === 'undefined') { value = defaultValue; @@ -46,11 +48,9 @@ export class ExtensionMemento implements IExtensionMemento { return value; } - update(key: string, value: any): Promise { + update(key: string, value: any): Promise { this._value[key] = value; - return this._storage - .setValue(this._shared, this._id, this._value) - .then(() => true); + return this._storage.setValue(this._shared, this._id, this._value); } dispose(): void { diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index 9c2bcd503a5..c8ed21e278d 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -2319,3 +2319,8 @@ export enum ExtensionExecutionContext { Local = 1, Remote = 2 } + +export enum ExtensionKind { + UI = 1, + Workspace = 2 +} diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 0c1ccf31890..9898fa25685 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -125,10 +125,10 @@ export function createApiFactory( const extHostProgress = rpcProtocol.set(ExtHostContext.ExtHostProgress, new ExtHostProgress(rpcProtocol.getProxy(MainContext.MainThreadProgress))); const extHostOutputService = rpcProtocol.set(ExtHostContext.ExtHostOutputService, new ExtHostOutputService(LogOutputChannelFactory, initData.logsLocation, rpcProtocol)); rpcProtocol.set(ExtHostContext.ExtHostStorage, extHostStorage); - if (initData.remoteAuthority) { + if (initData.remote.authority) { extHostTask.registerTaskSystem(Schemas.vscodeRemote, { scheme: Schemas.vscodeRemote, - authority: initData.remoteAuthority, + authority: initData.remote.authority, platform: process.platform }); @@ -150,7 +150,7 @@ export function createApiFactory( const extHostLanguages = new ExtHostLanguages(rpcProtocol, extHostDocuments); // Register an output channel for exthost log - const outputChannelName = initData.remoteAuthority ? nls.localize('remote extension host Log', "Remote Extension Host") : nls.localize('extension host Log', "Extension Host"); + const outputChannelName = initData.remote.isRemote ? nls.localize('remote extension host Log', "Remote Extension Host") : nls.localize('extension host Log', "Extension Host"); extHostOutputService.createOutputChannelFromLogFile(outputChannelName, extHostLogService.logFile); // Register API-ish commands @@ -258,12 +258,24 @@ export function createApiFactory( return extHostTerminalService.getDefaultShell(configProvider); }, openExternal(uri: URI) { - return extHostWindow.openUri(uri, { allowTunneling: !!initData.remoteAuthority }); + return extHostWindow.openUri(uri, { allowTunneling: !!initData.remote.isRemote }); }, get webviewResourceRoot() { checkProposedApiEnabled(extension); return initData.environment.webviewResourceRoot; }, + get remoteName() { + checkProposedApiEnabled(extension); + if (!initData.remote.authority) { + return undefined; + } + const pos = initData.remote.authority.indexOf('+'); + if (pos < 0) { + // funky? bad authority? + return initData.remote.authority; + } + return initData.remote.authority.substr(0, pos); + } }; if (!initData.environment.extensionTestsLocationURI) { // allow to patch env-function when running tests @@ -824,6 +836,7 @@ export function createApiFactory( EndOfLine: extHostTypes.EndOfLine, EventEmitter: Emitter, ExtensionExecutionContext: extHostTypes.ExtensionExecutionContext, + ExtensionKind: extHostTypes.ExtensionKind, CustomExecution: extHostTypes.CustomExecution, FileChangeType: extHostTypes.FileChangeType, FileSystemError: extHostTypes.FileSystemError, diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts index 5f4bd8be095..69d976b10d0 100644 --- a/src/vs/workbench/api/node/extHostExtensionService.ts +++ b/src/vs/workbench/api/node/extHostExtensionService.ts @@ -32,7 +32,7 @@ import { withNullAsUndefined } from 'vs/base/common/types'; import { VSBuffer } from 'vs/base/common/buffer'; import { ExtensionMemento } from 'vs/workbench/api/common/extHostMemento'; import { ExtensionStoragePaths } from 'vs/workbench/api/node/extHostStoragePaths'; -import { RemoteAuthorityResolverError, ExtensionExecutionContext } from 'vs/workbench/api/common/extHostTypes'; +import { RemoteAuthorityResolverError, ExtensionExecutionContext, ExtensionKind } from 'vs/workbench/api/common/extHostTypes'; import { IURITransformer } from 'vs/base/common/uriIpc'; interface ITestRunner { @@ -153,7 +153,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { const extensionPaths = await this.getExtensionPathIndex(); NodeModuleRequireInterceptor.INSTANCE.register(new VSCodeNodeModuleFactory(this._extensionApiFactory, extensionPaths, this._registry, configProvider)); NodeModuleRequireInterceptor.INSTANCE.register(new KeytarNodeModuleFactory(this._extHostContext.getProxy(MainContext.MainThreadKeytar), this._environment)); - if (this._initData.remoteAuthority) { + if (this._initData.remote.isRemote) { NodeModuleRequireInterceptor.INSTANCE.register(new OpenNodeModuleFactory( this._extHostContext.getProxy(MainContext.MainThreadWindow), this._extHostContext.getProxy(MainContext.MainThreadTelemetry), @@ -340,7 +340,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { }); } - private _loadExtensionContext(extensionDescription: IExtensionDescription): Promise { + private _loadExtensionContext(extensionDescription: IExtensionDescription): Promise { const globalState = new ExtensionMemento(extensionDescription.identifier.value, true, this._storage); const workspaceState = new ExtensionMemento(extensionDescription.identifier.value, false, this._storage); @@ -361,7 +361,8 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { globalStoragePath: this._storagePath.globalValue(extensionDescription), asAbsolutePath: (relativePath: string) => { return path.join(extensionDescription.extensionLocation.fsPath, relativePath); }, logPath: that._extHostLogService.getLogDirectory(extensionDescription.identifier), - executionContext: this._initData.remoteAuthority ? ExtensionExecutionContext.Remote : ExtensionExecutionContext.Local + executionContext: this._initData.remote.isRemote ? ExtensionExecutionContext.Remote : ExtensionExecutionContext.Local, + extensionKind: this._initData.remote.isRemote ? ExtensionKind.Workspace : ExtensionKind.UI }); }); } @@ -562,7 +563,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { // messages to the main process, we delay the exit() by some time setTimeout(() => { // If extension tests are running, give the exit code to the renderer - if (this._initData.remoteAuthority && !!this._initData.environment.extensionTestsLocationURI) { + if (this._initData.remote.isRemote && !!this._initData.environment.extensionTestsLocationURI) { this._mainThreadExtensionsProxy.$onExtensionHostExit(code); return; } diff --git a/src/vs/workbench/services/extensions/common/remoteExtensionHostClient.ts b/src/vs/workbench/services/extensions/common/remoteExtensionHostClient.ts index f21711a4168..5ab1b30e06c 100644 --- a/src/vs/workbench/services/extensions/common/remoteExtensionHostClient.ts +++ b/src/vs/workbench/services/extensions/common/remoteExtensionHostClient.ts @@ -197,6 +197,10 @@ export class RemoteExtensionHostClient extends Disposable implements IExtensionH id: workspace.id, name: this._labelService.getWorkspaceLabel(workspace) }, + remote: { + isRemote: true, + authority: this._initDataProvider.remoteAuthority + }, resolvedExtensions: resolvedExtensions, hostExtensions: hostExtensions, extensions: remoteExtensionHostData.extensions, @@ -204,7 +208,6 @@ export class RemoteExtensionHostClient extends Disposable implements IExtensionH logLevel: this._logService.getLevel(), logsLocation: remoteExtensionHostData.extensionHostLogsPath, autoStart: true, - remoteAuthority: this._initDataProvider.remoteAuthority, }; return r; }); diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts index efe66b8579c..bb552cc31d7 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts @@ -403,6 +403,10 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter { name: this._labelService.getWorkspaceLabel(workspace), isUntitled: workspace.configuration ? isEqualOrParent(workspace.configuration, this._environmentService.untitledWorkspacesHome) : false }, + remote: { + authority: this._environmentService.configuration.remoteAuthority, + isRemote: false + }, resolvedExtensions: [], hostExtensions: [], extensions: extensionDescriptions, diff --git a/src/vs/workbench/services/extensions/node/extensionHostProcessSetup.ts b/src/vs/workbench/services/extensions/node/extensionHostProcessSetup.ts index d7b8965f8ac..1a5822e645f 100644 --- a/src/vs/workbench/services/extensions/node/extensionHostProcessSetup.ts +++ b/src/vs/workbench/services/extensions/node/extensionHostProcessSetup.ts @@ -319,10 +319,10 @@ export async function startExtensionHostProcess(): Promise { // Attempt to load uri transformer let uriTransformer: IURITransformer | null = null; - if (initData.remoteAuthority && args.uriTransformerPath) { + if (initData.remote.authority && args.uriTransformerPath) { try { const rawURITransformerFactory = require.__$__nodeRequire(args.uriTransformerPath); - const rawURITransformer = rawURITransformerFactory(initData.remoteAuthority); + const rawURITransformer = rawURITransformerFactory(initData.remote.authority); uriTransformer = new URITransformer(rawURITransformer); } catch (e) { console.error(e); From 0bbe1399c7edac6d8d2db38f38490408ffa22d35 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 20 Jun 2019 12:36:24 +0200 Subject: [PATCH 0440/1449] debt - use file service based configuration file service --- src/vs/workbench/electron-browser/main.ts | 5 +- .../configuration/browser/configuration.ts | 44 +---------- .../configuration/common/configuration.ts | 7 +- .../node/configurationFileService.ts | 79 ------------------- .../configurationEditingService.test.ts | 11 ++- .../configurationService.test.ts | 22 ++---- 6 files changed, 18 insertions(+), 150 deletions(-) delete mode 100644 src/vs/workbench/services/configuration/node/configurationFileService.ts diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index 0ef9f9078d2..0bd39209ff8 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -47,10 +47,10 @@ import { IChannel } from 'vs/base/parts/ipc/common/ipc'; import { REMOTE_FILE_SYSTEM_CHANNEL_NAME, RemoteExtensionsFileSystemProvider } from 'vs/platform/remote/common/remoteAgentFileSystemChannel'; import { DefaultConfigurationExportHelper } from 'vs/workbench/services/configuration/node/configurationExportHelper'; import { ConfigurationCache } from 'vs/workbench/services/configuration/node/configurationCache'; -import { ConfigurationFileService } from 'vs/workbench/services/configuration/node/configurationFileService'; import { SpdLogService } from 'vs/platform/log/node/spdlogService'; import { SignService } from 'vs/platform/sign/node/signService'; import { ISignService } from 'vs/platform/sign/common/sign'; +import { ConfigurationFileService } from '../services/configuration/common/configuration'; class CodeRendererMain extends Disposable { @@ -306,8 +306,7 @@ class CodeRendererMain extends Disposable { } private async createWorkspaceService(payload: IWorkspaceInitializationPayload, environmentService: IWorkbenchEnvironmentService, fileService: FileService, remoteAgentService: IRemoteAgentService, logService: ILogService): Promise { - const configurationFileService = new ConfigurationFileService(); - configurationFileService.fileService = fileService; + const configurationFileService = new ConfigurationFileService(fileService); const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, remoteAuthority: this.configuration.remoteAuthority, configurationCache: new ConfigurationCache(environmentService) }, configurationFileService, remoteAgentService); diff --git a/src/vs/workbench/services/configuration/browser/configuration.ts b/src/vs/workbench/services/configuration/browser/configuration.ts index 02331934375..8b6b5f292a5 100644 --- a/src/vs/workbench/services/configuration/browser/configuration.ts +++ b/src/vs/workbench/services/configuration/browser/configuration.ts @@ -20,7 +20,7 @@ import { ConfigurationScope } from 'vs/platform/configuration/common/configurati import { extname, join } from 'vs/base/common/path'; import { equals } from 'vs/base/common/objects'; import { Schemas } from 'vs/base/common/network'; -import { IConfigurationModel, compare } from 'vs/platform/configuration/common/configuration'; +import { IConfigurationModel } from 'vs/platform/configuration/common/configuration'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { hash } from 'vs/base/common/hash'; @@ -138,11 +138,7 @@ export class UserConfiguration extends Disposable { async initialize(): Promise { const exists = await this.configurationFileService.exists(this.configurationResource); this.onResourceExists(exists); - const configuraitonModel = await this.reload(); - if (!this.configurationFileService.isWatching) { - this.configurationFileService.whenWatchingStarted.then(() => this.onWatchStarted(configuraitonModel)); - } - return configuraitonModel; + return this.reload(); } async reload(): Promise { @@ -160,14 +156,6 @@ export class UserConfiguration extends Disposable { return this.parser.configurationModel; } - private async onWatchStarted(currentModel: ConfigurationModel): Promise { - const configuraitonModel = await this.reload(); - const { added, removed, updated } = compare(currentModel, configuraitonModel); - if (added.length || removed.length || updated.length) { - this._onDidChangeConfiguration.fire(configuraitonModel); - } - } - private async handleFileEvents(event: FileChangesEvent): Promise { const events = event.changes; @@ -378,10 +366,6 @@ class FileServiceBasedWorkspaceConfiguration extends Disposable implements IWork this._register(configurationFileService.onFileChanges(e => this.handleWorkspaceFileEvents(e))); this.reloadConfigurationScheduler = this._register(new RunOnceScheduler(() => this._onDidChange.fire(), 50)); this.workspaceConfigWatcher = this._register(this.watchWorkspaceConfigurationFile()); - - if (!this.configurationFileService.isWatching) { - this.configurationFileService.whenWatchingStarted.then(() => this.onWatchStarted()); - } } get workspaceIdentifier(): IWorkspaceIdentifier | null { @@ -426,18 +410,6 @@ class FileServiceBasedWorkspaceConfiguration extends Disposable implements IWork return this.getWorkspaceSettings(); } - private async onWatchStarted(): Promise { - if (this.workspaceIdentifier) { - const currentModel = this.getConfigurationModel(); - await this.load(this.workspaceIdentifier); - const newModel = this.getConfigurationModel(); - const { added, removed, updated } = compare(currentModel, newModel); - if (added.length || removed.length || updated.length) { - this._onDidChange.fire(); - } - } - } - private consolidate(): void { this.workspaceSettings = this.workspaceConfigurationModelParser.settingsModel.merge(this.workspaceConfigurationModelParser.launchModel); } @@ -557,9 +529,6 @@ class FileServiceBasedFolderConfiguration extends Disposable implements IFolderC this.changeEventTriggerScheduler = this._register(new RunOnceScheduler(() => this._onDidChange.fire(), 50)); this._register(configurationFileService.onFileChanges(e => this.handleWorkspaceFileEvents(e))); - if (!this.configurationFileService.isWatching) { - this.configurationFileService.whenWatchingStarted.then(() => this.onWatchStarted()); - } } async loadConfiguration(): Promise { @@ -611,15 +580,6 @@ class FileServiceBasedFolderConfiguration extends Disposable implements IFolderC this._cache = this._folderSettingsModelParser.configurationModel.merge(...this._standAloneConfigurations); } - private async onWatchStarted(): Promise { - const currentModel = this._cache; - const newModel = await this.loadConfiguration(); - const { added, removed, updated } = compare(currentModel, newModel); - if (added.length || removed.length || updated.length) { - this._onDidChange.fire(); - } - } - private handleWorkspaceFileEvents(event: FileChangesEvent): void { const events = event.changes; let affectedByChanges = false; diff --git a/src/vs/workbench/services/configuration/common/configuration.ts b/src/vs/workbench/services/configuration/common/configuration.ts index a1185aa3001..ef661f92a1b 100644 --- a/src/vs/workbench/services/configuration/common/configuration.ts +++ b/src/vs/workbench/services/configuration/common/configuration.ts @@ -43,10 +43,7 @@ export interface IConfigurationCache { } export interface IConfigurationFileService { - fileService: IFileService | null; readonly onFileChanges: Event; - readonly isWatching: boolean; - readonly whenWatchingStarted: Promise; whenProviderRegistered(scheme: string): Promise; watch(resource: URI): IDisposable; exists(resource: URI): Promise; @@ -55,11 +52,9 @@ export interface IConfigurationFileService { export class ConfigurationFileService implements IConfigurationFileService { - constructor(public fileService: IFileService) { } + constructor(private readonly fileService: IFileService) { } get onFileChanges() { return this.fileService.onFileChanges; } - readonly whenWatchingStarted: Promise = Promise.resolve(); - readonly isWatching: boolean = true; whenProviderRegistered(scheme: string): Promise { if (this.fileService.canHandleResource(URI.from({ scheme }))) { diff --git a/src/vs/workbench/services/configuration/node/configurationFileService.ts b/src/vs/workbench/services/configuration/node/configurationFileService.ts deleted file mode 100644 index 18690c44040..00000000000 --- a/src/vs/workbench/services/configuration/node/configurationFileService.ts +++ /dev/null @@ -1,79 +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 pfs from 'vs/base/node/pfs'; -import { IConfigurationFileService, ConfigurationFileService as FileServiceBasedConfigurationFileService } from 'vs/workbench/services/configuration/common/configuration'; -import { URI } from 'vs/base/common/uri'; -import { Event, Emitter } from 'vs/base/common/event'; -import { FileChangesEvent, IFileService } from 'vs/platform/files/common/files'; -import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; -import { Schemas } from 'vs/base/common/network'; - -export class ConfigurationFileService extends Disposable implements IConfigurationFileService { - - private _fileServiceBasedConfigurationFileService: FileServiceBasedConfigurationFileService | null = null; - private _fileServiceBasedConfigurationFileServiceCallback: (fileServiceBasedConfigurationFileService: FileServiceBasedConfigurationFileService) => void; - private _whenFileServiceBasedConfigurationFileServiceAvailable: Promise = new Promise((c) => this._fileServiceBasedConfigurationFileServiceCallback = c); - private _watchResources: { resource: URI, disposable: { disposable: IDisposable | null } }[] = []; - readonly whenWatchingStarted: Promise = this._whenFileServiceBasedConfigurationFileServiceAvailable.then(() => undefined); - - private readonly _onFileChanges: Emitter = this._register(new Emitter()); - readonly onFileChanges: Event = this._onFileChanges.event; - - get isWatching(): boolean { - return this._fileServiceBasedConfigurationFileService ? this._fileServiceBasedConfigurationFileService.isWatching : false; - } - - watch(resource: URI): IDisposable { - if (this._fileServiceBasedConfigurationFileService) { - return this._fileServiceBasedConfigurationFileService.watch(resource); - } - const disposable: { disposable: IDisposable | null } = { disposable: null }; - this._watchResources.push({ resource, disposable }); - return toDisposable(() => { - if (disposable.disposable) { - disposable.disposable.dispose(); - } - }); - } - - whenProviderRegistered(scheme: string): Promise { - if (scheme === Schemas.file) { - return Promise.resolve(); - } - return this._whenFileServiceBasedConfigurationFileServiceAvailable - .then(fileServiceBasedConfigurationFileService => fileServiceBasedConfigurationFileService.whenProviderRegistered(scheme)); - } - - exists(resource: URI): Promise { - return this._fileServiceBasedConfigurationFileService ? this._fileServiceBasedConfigurationFileService.exists(resource) : pfs.exists(resource.fsPath); - } - - async readFile(resource: URI): Promise { - if (this._fileServiceBasedConfigurationFileService) { - return this._fileServiceBasedConfigurationFileService.readFile(resource); - } else { - const contents = await pfs.readFile(resource.fsPath); - return contents.toString(); - } - } - - private _fileService: IFileService | null; - get fileService(): IFileService | null { - return this._fileService; - } - - set fileService(fileService: IFileService | null) { - if (fileService && !this._fileServiceBasedConfigurationFileService) { - this._fileServiceBasedConfigurationFileService = new FileServiceBasedConfigurationFileService(fileService); - this._fileService = fileService; - this._register(this._fileServiceBasedConfigurationFileService.onFileChanges(e => this._onFileChanges.fire(e))); - for (const { resource, disposable } of this._watchResources) { - disposable.disposable = this._fileServiceBasedConfigurationFileService.watch(resource); - } - this._fileServiceBasedConfigurationFileServiceCallback(this._fileServiceBasedConfigurationFileService); - } - } -} 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 6634fcb6e04..1e8bf7dc6fa 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 @@ -19,7 +19,7 @@ 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'; import { ConfigurationEditingService, ConfigurationEditingError, ConfigurationEditingErrorCode, EditableConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditingService'; -import { WORKSPACE_STANDALONE_CONFIGURATIONS } from 'vs/workbench/services/configuration/common/configuration'; +import { WORKSPACE_STANDALONE_CONFIGURATIONS, ConfigurationFileService } from 'vs/workbench/services/configuration/common/configuration'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; @@ -39,7 +39,6 @@ import { Schemas } from 'vs/base/common/network'; import { DiskFileSystemProvider } from 'vs/workbench/services/files/node/diskFileSystemProvider'; import { IFileService } from 'vs/platform/files/common/files'; import { ConfigurationCache } from 'vs/workbench/services/configuration/node/configurationCache'; -import { ConfigurationFileService } from 'vs/workbench/services/configuration/node/configurationFileService'; class SettingsTestEnvironmentService extends EnvironmentService { @@ -104,14 +103,14 @@ suite('ConfigurationEditingService', () => { const environmentService = new SettingsTestEnvironmentService(parseArgs(process.argv), process.execPath, globalSettingsFile); instantiationService.stub(IEnvironmentService, environmentService); const remoteAgentService = instantiationService.createInstance(RemoteAgentService, {}); + const fileService = new FileService(new NullLogService()); + fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); + instantiationService.stub(IFileService, fileService); instantiationService.stub(IRemoteAgentService, remoteAgentService); - const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, new ConfigurationFileService(), remoteAgentService); + const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, new ConfigurationFileService(fileService), remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); return workspaceService.initialize(noWorkspace ? { id: '' } : { folder: URI.file(workspaceDir), id: createHash('md5').update(URI.file(workspaceDir).toString()).digest('hex') }).then(() => { instantiationService.stub(IConfigurationService, workspaceService); - const fileService = new FileService(new NullLogService()); - fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - instantiationService.stub(IFileService, fileService); instantiationService.stub(ITextFileService, instantiationService.createInstance(TestTextFileService)); instantiationService.stub(ITextModelService, instantiationService.createInstance(TextModelResolverService)); instantiationService.stub(ICommandService, CommandService); 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 3fd5bf00d75..8e6383fcff4 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 @@ -41,9 +41,8 @@ import { FileService } from 'vs/workbench/services/files/common/fileService'; import { NullLogService } from 'vs/platform/log/common/log'; import { DiskFileSystemProvider } from 'vs/workbench/services/files/node/diskFileSystemProvider'; import { ConfigurationCache } from 'vs/workbench/services/configuration/node/configurationCache'; -import { ConfigurationFileService } from 'vs/workbench/services/configuration/node/configurationFileService'; import { IRemoteAgentEnvironment } from 'vs/platform/remote/common/remoteAgentEnvironment'; -import { IConfigurationCache } from 'vs/workbench/services/configuration/common/configuration'; +import { IConfigurationCache, ConfigurationFileService } from 'vs/workbench/services/configuration/common/configuration'; import { VSBuffer } from 'vs/base/common/buffer'; import { SignService } from 'vs/platform/sign/browser/signService'; @@ -104,7 +103,7 @@ suite('WorkspaceContextService - Folder', () => { workspaceResource = folderDir; const globalSettingsFile = path.join(parentDir, 'settings.json'); const environmentService = new SettingsTestEnvironmentService(parseArgs(process.argv), process.execPath, globalSettingsFile); - workspaceContextService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, new ConfigurationFileService(), new RemoteAgentService({}, environmentService, new RemoteAuthorityResolverService(), new SignService())); + workspaceContextService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, new ConfigurationFileService(new FileService(new NullLogService())), new RemoteAgentService({}, environmentService, new RemoteAuthorityResolverService(), new SignService())); return (workspaceContextService).initialize(convertToWorkspacePayload(URI.file(folderDir))); }); }); @@ -166,7 +165,7 @@ suite('WorkspaceContextService - Workspace', () => { const environmentService = new SettingsTestEnvironmentService(parseArgs(process.argv), process.execPath, path.join(parentDir, 'settings.json')); const remoteAgentService = instantiationService.createInstance(RemoteAgentService, {}); instantiationService.stub(IRemoteAgentService, remoteAgentService); - const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, new ConfigurationFileService(), remoteAgentService); + const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, new ConfigurationFileService(new FileService(new NullLogService())), remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); @@ -224,8 +223,7 @@ suite('WorkspaceContextService - Workspace Editing', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const configurationFileService = new ConfigurationFileService(); - configurationFileService.fileService = fileService; + const configurationFileService = new ConfigurationFileService(fileService); const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, configurationFileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); @@ -485,8 +483,7 @@ suite('WorkspaceService - Initialization', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const configurationFileService = new ConfigurationFileService(); - configurationFileService.fileService = fileService; + const configurationFileService = new ConfigurationFileService(fileService); const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, configurationFileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); @@ -749,8 +746,7 @@ suite('WorkspaceConfigurationService - Folder', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const configurationFileService = new ConfigurationFileService(); - configurationFileService.fileService = fileService; + const configurationFileService = new ConfigurationFileService(fileService); const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, configurationFileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); @@ -1077,8 +1073,7 @@ suite('WorkspaceConfigurationService-Multiroot', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const configurationFileService = new ConfigurationFileService(); - configurationFileService.fileService = fileService; + const configurationFileService = new ConfigurationFileService(fileService); const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, configurationFileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); @@ -1479,8 +1474,7 @@ suite('WorkspaceConfigurationService - Remote Folder', () => { const remoteAgentService = instantiationService.stub(IRemoteAgentService, >{ getEnvironment: () => remoteEnvironmentPromise }); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, diskFileSystemProvider); - const configurationFileService = new ConfigurationFileService(); - configurationFileService.fileService = fileService; + const configurationFileService = new ConfigurationFileService(fileService); const configurationCache: IConfigurationCache = { read: () => Promise.resolve(''), write: () => Promise.resolve(), remove: () => Promise.resolve() }; testObject = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache, remoteAuthority }, configurationFileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, testObject); From 24e05597feb6f07c98a526d961705c6bc235b2fc Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 20 Jun 2019 12:39:59 +0200 Subject: [PATCH 0441/1449] fix tests --- .../test/electron-browser/configurationService.test.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 8e6383fcff4..36767ce3242 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 @@ -165,7 +165,9 @@ suite('WorkspaceContextService - Workspace', () => { const environmentService = new SettingsTestEnvironmentService(parseArgs(process.argv), process.execPath, path.join(parentDir, 'settings.json')); const remoteAgentService = instantiationService.createInstance(RemoteAgentService, {}); instantiationService.stub(IRemoteAgentService, remoteAgentService); - const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, new ConfigurationFileService(new FileService(new NullLogService())), remoteAgentService); + const fileService = new FileService(new NullLogService()); + fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); + const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, new ConfigurationFileService(fileService), remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); From 27ef2915f25270ef03be88117937c047d778051c Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 20 Jun 2019 12:58:42 +0200 Subject: [PATCH 0442/1449] debt create configuration file service inside configuration service --- src/vs/workbench/browser/web.main.ts | 3 +-- src/vs/workbench/electron-browser/main.ts | 5 +---- .../configuration/browser/configuration.ts | 18 +++++++++--------- .../browser/configurationService.ts | 13 ++++++++----- .../configuration/common/configuration.ts | 14 +++----------- .../configurationEditingService.test.ts | 4 ++-- .../configurationService.test.ts | 16 ++++++++-------- 7 files changed, 32 insertions(+), 41 deletions(-) diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index 6f1954ba252..1986fb66422 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -29,7 +29,6 @@ import { URI } from 'vs/base/common/uri'; import { IWorkspaceInitializationPayload } from 'vs/platform/workspaces/common/workspaces'; import { WorkspaceService } from 'vs/workbench/services/configuration/browser/configurationService'; import { ConfigurationCache } from 'vs/workbench/services/configuration/browser/configurationCache'; -import { ConfigurationFileService } from 'vs/workbench/services/configuration/common/configuration'; import { WebResources } from 'vs/workbench/browser/web.resources'; import { ISignService } from 'vs/platform/sign/common/sign'; import { SignService } from 'vs/platform/sign/browser/signService'; @@ -137,7 +136,7 @@ class CodeRendererMain extends Disposable { } private async createWorkspaceService(payload: IWorkspaceInitializationPayload, environmentService: IWorkbenchEnvironmentService, fileService: FileService, remoteAgentService: IRemoteAgentService, logService: ILogService): Promise { - const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, remoteAuthority: this.configuration.remoteAuthority, configurationCache: new ConfigurationCache() }, new ConfigurationFileService(fileService), remoteAgentService); + const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, remoteAuthority: this.configuration.remoteAuthority, configurationCache: new ConfigurationCache() }, fileService, remoteAgentService); try { await workspaceService.initialize(payload); diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index 0bd39209ff8..87259d771c9 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -50,7 +50,6 @@ import { ConfigurationCache } from 'vs/workbench/services/configuration/node/con import { SpdLogService } from 'vs/platform/log/node/spdlogService'; import { SignService } from 'vs/platform/sign/node/signService'; import { ISignService } from 'vs/platform/sign/common/sign'; -import { ConfigurationFileService } from '../services/configuration/common/configuration'; class CodeRendererMain extends Disposable { @@ -306,9 +305,7 @@ class CodeRendererMain extends Disposable { } private async createWorkspaceService(payload: IWorkspaceInitializationPayload, environmentService: IWorkbenchEnvironmentService, fileService: FileService, remoteAgentService: IRemoteAgentService, logService: ILogService): Promise { - const configurationFileService = new ConfigurationFileService(fileService); - - const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, remoteAuthority: this.configuration.remoteAuthority, configurationCache: new ConfigurationCache(environmentService) }, configurationFileService, remoteAgentService); + const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, remoteAuthority: this.configuration.remoteAuthority, configurationCache: new ConfigurationCache(environmentService) }, fileService, remoteAgentService); try { await workspaceService.initialize(payload); diff --git a/src/vs/workbench/services/configuration/browser/configuration.ts b/src/vs/workbench/services/configuration/browser/configuration.ts index 8b6b5f292a5..a2f76032809 100644 --- a/src/vs/workbench/services/configuration/browser/configuration.ts +++ b/src/vs/workbench/services/configuration/browser/configuration.ts @@ -12,7 +12,7 @@ import { RunOnceScheduler } from 'vs/base/common/async'; import { FileChangeType, FileChangesEvent } from 'vs/platform/files/common/files'; import { ConfigurationModel, ConfigurationModelParser } from 'vs/platform/configuration/common/configurationModels'; import { WorkspaceConfigurationModelParser, StandaloneConfigurationModelParser } from 'vs/workbench/services/configuration/common/configurationModels'; -import { FOLDER_SETTINGS_PATH, TASKS_CONFIGURATION_KEY, FOLDER_SETTINGS_NAME, LAUNCH_CONFIGURATION_KEY, IConfigurationCache, ConfigurationKey, IConfigurationFileService, REMOTE_MACHINE_SCOPES, FOLDER_SCOPES, WORKSPACE_SCOPES } from 'vs/workbench/services/configuration/common/configuration'; +import { FOLDER_SETTINGS_PATH, TASKS_CONFIGURATION_KEY, FOLDER_SETTINGS_NAME, LAUNCH_CONFIGURATION_KEY, IConfigurationCache, ConfigurationKey, REMOTE_MACHINE_SCOPES, FOLDER_SCOPES, WORKSPACE_SCOPES, ConfigurationFileService } from 'vs/workbench/services/configuration/common/configuration'; import { IStoredWorkspaceFolder, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { JSONEditingService } from 'vs/workbench/services/configuration/common/jsonEditingService'; import { WorkbenchState, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; @@ -27,7 +27,7 @@ import { hash } from 'vs/base/common/hash'; export class RemoteUserConfiguration extends Disposable { private readonly _cachedConfiguration: CachedUserConfiguration; - private readonly _configurationFileService: IConfigurationFileService; + private readonly _configurationFileService: ConfigurationFileService; private _userConfiguration: UserConfiguration | CachedUserConfiguration; private _userConfigurationInitializationPromise: Promise | null = null; @@ -37,7 +37,7 @@ export class RemoteUserConfiguration extends Disposable { constructor( remoteAuthority: string, configurationCache: IConfigurationCache, - configurationFileService: IConfigurationFileService, + configurationFileService: ConfigurationFileService, remoteAgentService: IRemoteAgentService ) { super(); @@ -103,7 +103,7 @@ export class UserConfiguration extends Disposable { constructor( private readonly configurationResource: URI, private readonly scopes: ConfigurationScope[] | undefined, - private readonly configurationFileService: IConfigurationFileService + private readonly configurationFileService: ConfigurationFileService ) { super(); @@ -240,7 +240,7 @@ class CachedUserConfiguration extends Disposable { export class WorkspaceConfiguration extends Disposable { - private readonly _configurationFileService: IConfigurationFileService; + private readonly _configurationFileService: ConfigurationFileService; private readonly _cachedConfiguration: CachedWorkspaceConfiguration; private _workspaceConfiguration: IWorkspaceConfiguration; private _workspaceConfigurationChangeDisposable: IDisposable = Disposable.None; @@ -254,7 +254,7 @@ export class WorkspaceConfiguration extends Disposable { constructor( configurationCache: IConfigurationCache, - configurationFileService: IConfigurationFileService + configurationFileService: ConfigurationFileService ) { super(); this._configurationFileService = configurationFileService; @@ -357,7 +357,7 @@ class FileServiceBasedWorkspaceConfiguration extends Disposable implements IWork protected readonly _onDidChange: Emitter = this._register(new Emitter()); readonly onDidChange: Event = this._onDidChange.event; - constructor(private configurationFileService: IConfigurationFileService) { + constructor(private configurationFileService: ConfigurationFileService) { super(); this.workspaceConfigurationModelParser = new WorkspaceConfigurationModelParser(''); @@ -518,7 +518,7 @@ class FileServiceBasedFolderConfiguration extends Disposable implements IFolderC protected readonly _onDidChange: Emitter = this._register(new Emitter()); readonly onDidChange: Event = this._onDidChange.event; - constructor(protected readonly configurationFolder: URI, workbenchState: WorkbenchState, private configurationFileService: IConfigurationFileService) { + constructor(protected readonly configurationFolder: URI, workbenchState: WorkbenchState, private configurationFileService: ConfigurationFileService) { super(); this.configurationNames = [FOLDER_SETTINGS_NAME /*First one should be settings */, TASKS_CONFIGURATION_KEY, LAUNCH_CONFIGURATION_KEY]; @@ -685,7 +685,7 @@ export class FolderConfiguration extends Disposable implements IFolderConfigurat readonly workspaceFolder: IWorkspaceFolder, configFolderRelativePath: string, private readonly workbenchState: WorkbenchState, - configurationFileService: IConfigurationFileService, + configurationFileService: ConfigurationFileService, configurationCache: IConfigurationCache ) { super(); diff --git a/src/vs/workbench/services/configuration/browser/configurationService.ts b/src/vs/workbench/services/configuration/browser/configurationService.ts index f0c0dfe0031..a8e14a6bcd3 100644 --- a/src/vs/workbench/services/configuration/browser/configurationService.ts +++ b/src/vs/workbench/services/configuration/browser/configurationService.ts @@ -15,7 +15,7 @@ import { isLinux } from 'vs/base/common/platform'; import { ConfigurationChangeEvent, ConfigurationModel, DefaultConfigurationModel } from 'vs/platform/configuration/common/configurationModels'; import { IConfigurationChangeEvent, ConfigurationTarget, IConfigurationOverrides, keyFromOverrideIdentifier, isConfigurationOverrides, IConfigurationData, IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { Configuration, WorkspaceConfigurationChangeEvent, AllKeysConfigurationChangeEvent } from 'vs/workbench/services/configuration/common/configurationModels'; -import { FOLDER_CONFIG_FOLDER_NAME, defaultSettingsSchemaId, userSettingsSchemaId, workspaceSettingsSchemaId, folderSettingsSchemaId, IConfigurationCache, IConfigurationFileService, machineSettingsSchemaId, LOCAL_MACHINE_SCOPES } from 'vs/workbench/services/configuration/common/configuration'; +import { FOLDER_CONFIG_FOLDER_NAME, defaultSettingsSchemaId, userSettingsSchemaId, workspaceSettingsSchemaId, folderSettingsSchemaId, IConfigurationCache, machineSettingsSchemaId, LOCAL_MACHINE_SCOPES, ConfigurationFileService } from 'vs/workbench/services/configuration/common/configuration'; import { Registry } from 'vs/platform/registry/common/platform'; import { IConfigurationRegistry, Extensions, allSettings, windowSettings, resourceSettings, applicationSettings, machineSettings } from 'vs/platform/configuration/common/configurationRegistry'; import { IWorkspaceIdentifier, isWorkspaceIdentifier, IStoredWorkspaceFolder, isStoredWorkspaceFolder, IWorkspaceFolderCreationData, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, IWorkspaceInitializationPayload, isSingleFolderWorkspaceInitializationPayload, ISingleFolderWorkspaceInitializationPayload, IEmptyWorkspaceInitializationPayload, useSlashForPath, getStoredWorkspaceFolder } from 'vs/platform/workspaces/common/workspaces'; @@ -28,6 +28,7 @@ import { localize } from 'vs/nls'; import { isEqual, dirname } from 'vs/base/common/resources'; import { mark } from 'vs/base/common/performance'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; +import { IFileService } from 'vs/platform/files/common/files'; export class WorkspaceService extends Disposable implements IConfigurationService, IWorkspaceContextService { @@ -43,9 +44,10 @@ export class WorkspaceService extends Disposable implements IConfigurationServic private remoteUserConfiguration: RemoteUserConfiguration | null = null; private workspaceConfiguration: WorkspaceConfiguration; private cachedFolderConfigs: ResourceMap; - private workspaceEditingQueue: Queue; + private readonly configurationFileService: ConfigurationFileService; + protected readonly _onDidChangeConfiguration: Emitter = this._register(new Emitter()); public readonly onDidChangeConfiguration: Event = this._onDidChangeConfiguration.event; @@ -66,7 +68,7 @@ export class WorkspaceService extends Disposable implements IConfigurationServic constructor( { userSettingsResource, remoteAuthority, configurationCache }: { userSettingsResource?: URI, remoteAuthority?: string, configurationCache: IConfigurationCache }, - private readonly configurationFileService: IConfigurationFileService, + fileService: IFileService, remoteAgentService: IRemoteAgentService, ) { super(); @@ -74,14 +76,15 @@ export class WorkspaceService extends Disposable implements IConfigurationServic this.completeWorkspaceBarrier = new Barrier(); this.defaultConfiguration = new DefaultConfigurationModel(); this.configurationCache = configurationCache; + this.configurationFileService = new ConfigurationFileService(fileService); this._configuration = new Configuration(this.defaultConfiguration, new ConfigurationModel(), new ConfigurationModel(), new ConfigurationModel(), new ResourceMap(), new ConfigurationModel(), new ResourceMap(), this.workspace); this.cachedFolderConfigs = new ResourceMap(); if (userSettingsResource) { - this.localUserConfiguration = this._register(new UserConfiguration(userSettingsResource, remoteAuthority ? LOCAL_MACHINE_SCOPES : undefined, configurationFileService)); + this.localUserConfiguration = this._register(new UserConfiguration(userSettingsResource, remoteAuthority ? LOCAL_MACHINE_SCOPES : undefined, this.configurationFileService)); this._register(this.localUserConfiguration.onDidChangeConfiguration(userConfiguration => this.onLocalUserConfigurationChanged(userConfiguration))); } if (remoteAuthority) { - this.remoteUserConfiguration = this._register(new RemoteUserConfiguration(remoteAuthority, configurationCache, configurationFileService, remoteAgentService)); + this.remoteUserConfiguration = this._register(new RemoteUserConfiguration(remoteAuthority, configurationCache, this.configurationFileService, remoteAgentService)); this._register(this.remoteUserConfiguration.onDidChangeConfiguration(userConfiguration => this.onRemoteUserConfigurationChanged(userConfiguration))); } this.workspaceConfiguration = this._register(new WorkspaceConfiguration(configurationCache, this.configurationFileService)); diff --git a/src/vs/workbench/services/configuration/common/configuration.ts b/src/vs/workbench/services/configuration/common/configuration.ts index ef661f92a1b..2910b6feccc 100644 --- a/src/vs/workbench/services/configuration/common/configuration.ts +++ b/src/vs/workbench/services/configuration/common/configuration.ts @@ -5,10 +5,10 @@ import { URI } from 'vs/base/common/uri'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { Event } from 'vs/base/common/event'; -import { FileChangesEvent, IFileService } from 'vs/platform/files/common/files'; +import { IFileService } from 'vs/platform/files/common/files'; import { ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; +export const USER_CONFIGURATION_KEY = 'settings.json'; export const FOLDER_CONFIG_FOLDER_NAME = '.vscode'; export const FOLDER_SETTINGS_NAME = 'settings'; export const FOLDER_SETTINGS_PATH = `${FOLDER_CONFIG_FOLDER_NAME}/${FOLDER_SETTINGS_NAME}.json`; @@ -42,15 +42,7 @@ export interface IConfigurationCache { } -export interface IConfigurationFileService { - readonly onFileChanges: Event; - whenProviderRegistered(scheme: string): Promise; - watch(resource: URI): IDisposable; - exists(resource: URI): Promise; - readFile(resource: URI): Promise; -} - -export class ConfigurationFileService implements IConfigurationFileService { +export class ConfigurationFileService { constructor(private readonly fileService: IFileService) { } 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 1e8bf7dc6fa..64b5b994371 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 @@ -19,7 +19,7 @@ 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'; import { ConfigurationEditingService, ConfigurationEditingError, ConfigurationEditingErrorCode, EditableConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditingService'; -import { WORKSPACE_STANDALONE_CONFIGURATIONS, ConfigurationFileService } from 'vs/workbench/services/configuration/common/configuration'; +import { WORKSPACE_STANDALONE_CONFIGURATIONS } from 'vs/workbench/services/configuration/common/configuration'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; @@ -107,7 +107,7 @@ suite('ConfigurationEditingService', () => { fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); instantiationService.stub(IFileService, fileService); instantiationService.stub(IRemoteAgentService, remoteAgentService); - const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, new ConfigurationFileService(fileService), remoteAgentService); + const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); return workspaceService.initialize(noWorkspace ? { id: '' } : { folder: URI.file(workspaceDir), id: createHash('md5').update(URI.file(workspaceDir).toString()).digest('hex') }).then(() => { instantiationService.stub(IConfigurationService, workspaceService); 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 36767ce3242..cbd400263ee 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 @@ -42,7 +42,7 @@ import { NullLogService } from 'vs/platform/log/common/log'; import { DiskFileSystemProvider } from 'vs/workbench/services/files/node/diskFileSystemProvider'; import { ConfigurationCache } from 'vs/workbench/services/configuration/node/configurationCache'; import { IRemoteAgentEnvironment } from 'vs/platform/remote/common/remoteAgentEnvironment'; -import { IConfigurationCache, ConfigurationFileService } from 'vs/workbench/services/configuration/common/configuration'; +import { IConfigurationCache } from 'vs/workbench/services/configuration/common/configuration'; import { VSBuffer } from 'vs/base/common/buffer'; import { SignService } from 'vs/platform/sign/browser/signService'; @@ -103,7 +103,7 @@ suite('WorkspaceContextService - Folder', () => { workspaceResource = folderDir; const globalSettingsFile = path.join(parentDir, 'settings.json'); const environmentService = new SettingsTestEnvironmentService(parseArgs(process.argv), process.execPath, globalSettingsFile); - workspaceContextService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, new ConfigurationFileService(new FileService(new NullLogService())), new RemoteAgentService({}, environmentService, new RemoteAuthorityResolverService(), new SignService())); + workspaceContextService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, new FileService(new NullLogService()), new RemoteAgentService({}, environmentService, new RemoteAuthorityResolverService(), new SignService())); return (workspaceContextService).initialize(convertToWorkspacePayload(URI.file(folderDir))); }); }); @@ -167,7 +167,7 @@ suite('WorkspaceContextService - Workspace', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, new ConfigurationFileService(fileService), remoteAgentService); + const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); @@ -225,7 +225,7 @@ suite('WorkspaceContextService - Workspace Editing', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const configurationFileService = new ConfigurationFileService(fileService); + const configurationFileService = fileService; const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, configurationFileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); @@ -485,7 +485,7 @@ suite('WorkspaceService - Initialization', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const configurationFileService = new ConfigurationFileService(fileService); + const configurationFileService = fileService; const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, configurationFileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); @@ -748,7 +748,7 @@ suite('WorkspaceConfigurationService - Folder', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const configurationFileService = new ConfigurationFileService(fileService); + const configurationFileService = fileService; const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, configurationFileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); @@ -1075,7 +1075,7 @@ suite('WorkspaceConfigurationService-Multiroot', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const configurationFileService = new ConfigurationFileService(fileService); + const configurationFileService = fileService; const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, configurationFileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); @@ -1476,7 +1476,7 @@ suite('WorkspaceConfigurationService - Remote Folder', () => { const remoteAgentService = instantiationService.stub(IRemoteAgentService, >{ getEnvironment: () => remoteEnvironmentPromise }); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, diskFileSystemProvider); - const configurationFileService = new ConfigurationFileService(fileService); + const configurationFileService = fileService; const configurationCache: IConfigurationCache = { read: () => Promise.resolve(''), write: () => Promise.resolve(), remove: () => Promise.resolve() }; testObject = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache, remoteAuthority }, configurationFileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, testObject); From 0c890df52204b829d460050bb18103791086fdab Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 20 Jun 2019 14:37:29 +0200 Subject: [PATCH 0443/1449] First cut of file service based user data service --- .../userData/common/fileUserDataService.ts | 83 +++++++++++++++++++ .../userData/common/userDataService.ts | 7 +- 2 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 src/vs/workbench/services/userData/common/fileUserDataService.ts diff --git a/src/vs/workbench/services/userData/common/fileUserDataService.ts b/src/vs/workbench/services/userData/common/fileUserDataService.ts new file mode 100644 index 00000000000..e0690f41ea8 --- /dev/null +++ b/src/vs/workbench/services/userData/common/fileUserDataService.ts @@ -0,0 +1,83 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Event, Emitter } from 'vs/base/common/event'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { IUserDataService, IUserDataChangesEvent } from './userDataService'; +import { IFileService, FileChangesEvent } from 'vs/platform/files/common/files'; +import { URI } from 'vs/base/common/uri'; +import * as resources from 'vs/base/common/resources'; +import { TernarySearchTree } from 'vs/base/common/map'; +import { VSBuffer } from 'vs/base/common/buffer'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; + +export class FileUserDataService extends Disposable implements IUserDataService { + _serviceBrand: any; + + private readonly settingsHome: URI; + + private _onDidChange: Emitter = this._register(new Emitter()); + readonly onDidChange: Event = this._onDidChange.event; + + constructor( + @IEnvironmentService environmentService: IEnvironmentService, + @IFileService private readonly fileService: IFileService + ) { + super(); + // Assumption: This path always exists + this.settingsHome = environmentService.appSettingsHome; + this.fileService.watch(this.settingsHome); + + this._register(this.fileService.onFileChanges(e => this.handleFileChanges(e))); + } + + private handleFileChanges(event: FileChangesEvent): void { + const changedKeys: string[] = []; + for (const change of event.changes) { + const key = resources.relativePath(this.settingsHome, change.resource); + if (key) { + changedKeys.push(key); + } + } + if (changedKeys.length) { + this._onDidChange.fire(new UserDataChangesEvent(changedKeys)); + } + } + + read(key: string): Promise { + return this.fileService.readFile(this.toResource(key)).then(content => content.value.toString()); + } + + write(key: string, value: string): Promise { + return this.fileService.writeFile(this.toResource(key), VSBuffer.fromString(value)).then(() => undefined); + } + + private toResource(key: string): URI { + return resources.joinPath(this.settingsHome, ...key.split('/')); + } + +} + +class UserDataChangesEvent implements IUserDataChangesEvent { + + private _keysTree: TernarySearchTree | undefined = undefined; + + constructor(readonly keys: string[]) { } + + private get keysTree(): TernarySearchTree { + if (!this._keysTree) { + this._keysTree = TernarySearchTree.forPaths(); + for (const key of this.keys) { + this._keysTree.set(key, key); + } + } + return this._keysTree; + } + + contains(keyOrSegment: string): boolean { + return this.keysTree.findSubstr(keyOrSegment) !== undefined; + } + +} \ No newline at end of file diff --git a/src/vs/workbench/services/userData/common/userDataService.ts b/src/vs/workbench/services/userData/common/userDataService.ts index 64fb82202a3..81c8b5dfd76 100644 --- a/src/vs/workbench/services/userData/common/userDataService.ts +++ b/src/vs/workbench/services/userData/common/userDataService.ts @@ -8,10 +8,15 @@ import { Event } from 'vs/base/common/event'; export const IUserDataService = createDecorator('userDataService'); +export interface IUserDataChangesEvent { + keys: string[]; + contains(keyOrSegment: string): boolean; +} + export interface IUserDataService { _serviceBrand: any; - onDidChange: Event; + onDidChange: Event; read(key: string): Promise; From 0779716aae9d4b4fc93725a6c1f1fe9efc00ade1 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 20 Jun 2019 14:39:04 +0200 Subject: [PATCH 0444/1449] Use user data service for reading settings --- src/vs/workbench/browser/web.main.ts | 12 +++- src/vs/workbench/electron-browser/main.ts | 12 +++- .../configuration/browser/configuration.ts | 55 ++++++++++++++++--- .../browser/configurationService.ts | 18 +++--- .../configurationEditingService.test.ts | 4 +- .../configurationService.test.ts | 35 +++++++----- 6 files changed, 97 insertions(+), 39 deletions(-) diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index 1986fb66422..9b4051ac410 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -35,6 +35,8 @@ import { SignService } from 'vs/platform/sign/browser/signService'; import { hash } from 'vs/base/common/hash'; import { IWorkbenchConstructionOptions } from 'vs/workbench/workbench.web.api'; import { ProductService } from 'vs/platform/product/browser/productService'; +import { FileUserDataService } from '../services/userData/common/fileUserDataService'; +import { IUserDataService } from '../services/userData/common/userDataService'; class CodeRendererMain extends Disposable { @@ -117,10 +119,14 @@ class CodeRendererMain extends Disposable { fileService.registerProvider(Schemas.vscodeRemote, remoteFileSystemProvider); } + // User Data Service + const userDataService = this._register(new FileUserDataService(environmentService, fileService)); + serviceCollection.set(IUserDataService, userDataService); + const payload = await this.resolveWorkspaceInitializationPayload(); await Promise.all([ - this.createWorkspaceService(payload, environmentService, fileService, remoteAgentService, logService).then(service => { + this.createWorkspaceService(payload, environmentService, fileService, userDataService, remoteAgentService, logService).then(service => { // Workspace serviceCollection.set(IWorkspaceContextService, service); @@ -135,8 +141,8 @@ class CodeRendererMain extends Disposable { return { serviceCollection, logService }; } - private async createWorkspaceService(payload: IWorkspaceInitializationPayload, environmentService: IWorkbenchEnvironmentService, fileService: FileService, remoteAgentService: IRemoteAgentService, logService: ILogService): Promise { - const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, remoteAuthority: this.configuration.remoteAuthority, configurationCache: new ConfigurationCache() }, fileService, remoteAgentService); + private async createWorkspaceService(payload: IWorkspaceInitializationPayload, environmentService: IWorkbenchEnvironmentService, fileService: FileService, userDataService: IUserDataService, remoteAgentService: IRemoteAgentService, logService: ILogService): Promise { + const workspaceService = new WorkspaceService({ remoteAuthority: this.configuration.remoteAuthority, configurationCache: new ConfigurationCache() }, fileService, userDataService, remoteAgentService); try { await workspaceService.initialize(payload); diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index 87259d771c9..2d11615deb9 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -50,6 +50,8 @@ import { ConfigurationCache } from 'vs/workbench/services/configuration/node/con import { SpdLogService } from 'vs/platform/log/node/spdlogService'; import { SignService } from 'vs/platform/sign/node/signService'; import { ISignService } from 'vs/platform/sign/common/sign'; +import { IUserDataService } from '../services/userData/common/userDataService'; +import { FileUserDataService } from '../services/userData/common/fileUserDataService'; class CodeRendererMain extends Disposable { @@ -205,10 +207,14 @@ class CodeRendererMain extends Disposable { fileService.registerProvider(Schemas.vscodeRemote, remoteFileSystemProvider); } + // User Data Service + const userDataService = this._register(new FileUserDataService(environmentService, fileService)); + serviceCollection.set(IUserDataService, userDataService); + const payload = await this.resolveWorkspaceInitializationPayload(environmentService); const services = await Promise.all([ - this.createWorkspaceService(payload, environmentService, fileService, remoteAgentService, logService).then(service => { + this.createWorkspaceService(payload, environmentService, fileService, userDataService, remoteAgentService, logService).then(service => { // Workspace serviceCollection.set(IWorkspaceContextService, service); @@ -304,8 +310,8 @@ class CodeRendererMain extends Disposable { return; } - private async createWorkspaceService(payload: IWorkspaceInitializationPayload, environmentService: IWorkbenchEnvironmentService, fileService: FileService, remoteAgentService: IRemoteAgentService, logService: ILogService): Promise { - const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, remoteAuthority: this.configuration.remoteAuthority, configurationCache: new ConfigurationCache(environmentService) }, fileService, remoteAgentService); + private async createWorkspaceService(payload: IWorkspaceInitializationPayload, environmentService: IWorkbenchEnvironmentService, fileService: FileService, userDataService: IUserDataService, remoteAgentService: IRemoteAgentService, logService: ILogService): Promise { + const workspaceService = new WorkspaceService({ remoteAuthority: this.configuration.remoteAuthority, configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); try { await workspaceService.initialize(payload); diff --git a/src/vs/workbench/services/configuration/browser/configuration.ts b/src/vs/workbench/services/configuration/browser/configuration.ts index a2f76032809..8d4f4245f5d 100644 --- a/src/vs/workbench/services/configuration/browser/configuration.ts +++ b/src/vs/workbench/services/configuration/browser/configuration.ts @@ -12,7 +12,7 @@ import { RunOnceScheduler } from 'vs/base/common/async'; import { FileChangeType, FileChangesEvent } from 'vs/platform/files/common/files'; import { ConfigurationModel, ConfigurationModelParser } from 'vs/platform/configuration/common/configurationModels'; import { WorkspaceConfigurationModelParser, StandaloneConfigurationModelParser } from 'vs/workbench/services/configuration/common/configurationModels'; -import { FOLDER_SETTINGS_PATH, TASKS_CONFIGURATION_KEY, FOLDER_SETTINGS_NAME, LAUNCH_CONFIGURATION_KEY, IConfigurationCache, ConfigurationKey, REMOTE_MACHINE_SCOPES, FOLDER_SCOPES, WORKSPACE_SCOPES, ConfigurationFileService } from 'vs/workbench/services/configuration/common/configuration'; +import { FOLDER_SETTINGS_PATH, TASKS_CONFIGURATION_KEY, FOLDER_SETTINGS_NAME, LAUNCH_CONFIGURATION_KEY, IConfigurationCache, ConfigurationKey, REMOTE_MACHINE_SCOPES, FOLDER_SCOPES, WORKSPACE_SCOPES, USER_CONFIGURATION_KEY, ConfigurationFileService } from 'vs/workbench/services/configuration/common/configuration'; import { IStoredWorkspaceFolder, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { JSONEditingService } from 'vs/workbench/services/configuration/common/jsonEditingService'; import { WorkbenchState, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; @@ -23,12 +23,51 @@ import { Schemas } from 'vs/base/common/network'; import { IConfigurationModel } from 'vs/platform/configuration/common/configuration'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { hash } from 'vs/base/common/hash'; +import { IUserDataService } from '../../userData/common/userDataService'; + +export class UserConfiguration extends Disposable { + + private readonly parser: ConfigurationModelParser; + private readonly reloadConfigurationScheduler: RunOnceScheduler; + protected readonly _onDidChangeConfiguration: Emitter = this._register(new Emitter()); + readonly onDidChangeConfiguration: Event = this._onDidChangeConfiguration.event; + + constructor( + private readonly scopes: ConfigurationScope[] | undefined, + private readonly userDataService: IUserDataService + ) { + super(); + + this.parser = new ConfigurationModelParser(USER_CONFIGURATION_KEY, this.scopes); + this.reloadConfigurationScheduler = this._register(new RunOnceScheduler(() => this.reload().then(configurationModel => this._onDidChangeConfiguration.fire(configurationModel)), 50)); + this._register(Event.filter(this.userDataService.onDidChange, e => e.contains(USER_CONFIGURATION_KEY))(() => this.reloadConfigurationScheduler.schedule())); + } + + async initialize(): Promise { + return this.reload(); + } + + async reload(): Promise { + try { + const content = await this.userDataService.read(USER_CONFIGURATION_KEY); + this.parser.parseContent(content); + return this.parser.configurationModel; + } catch (e) { + return new ConfigurationModel(); + } + } + + reprocess(): ConfigurationModel { + this.parser.parse(); + return this.parser.configurationModel; + } +} export class RemoteUserConfiguration extends Disposable { - private readonly _cachedConfiguration: CachedUserConfiguration; + private readonly _cachedConfiguration: CachedRemoteUserConfiguration; private readonly _configurationFileService: ConfigurationFileService; - private _userConfiguration: UserConfiguration | CachedUserConfiguration; + private _userConfiguration: FileServiceBasedRemoteUserConfiguration | CachedRemoteUserConfiguration; private _userConfigurationInitializationPromise: Promise | null = null; private readonly _onDidChangeConfiguration: Emitter = this._register(new Emitter()); @@ -42,10 +81,10 @@ export class RemoteUserConfiguration extends Disposable { ) { super(); this._configurationFileService = configurationFileService; - this._userConfiguration = this._cachedConfiguration = new CachedUserConfiguration(remoteAuthority, configurationCache); + this._userConfiguration = this._cachedConfiguration = new CachedRemoteUserConfiguration(remoteAuthority, configurationCache); remoteAgentService.getEnvironment().then(async environment => { if (environment) { - const userConfiguration = this._register(new UserConfiguration(environment.settingsPath, REMOTE_MACHINE_SCOPES, this._configurationFileService)); + const userConfiguration = this._register(new FileServiceBasedRemoteUserConfiguration(environment.settingsPath, REMOTE_MACHINE_SCOPES, this._configurationFileService)); this._register(userConfiguration.onDidChangeConfiguration(configurationModel => this.onDidUserConfigurationChange(configurationModel))); this._userConfigurationInitializationPromise = userConfiguration.initialize(); const configurationModel = await this._userConfigurationInitializationPromise; @@ -57,7 +96,7 @@ export class RemoteUserConfiguration extends Disposable { } async initialize(): Promise { - if (this._userConfiguration instanceof UserConfiguration) { + if (this._userConfiguration instanceof FileServiceBasedRemoteUserConfiguration) { return this._userConfiguration.initialize(); } @@ -90,7 +129,7 @@ export class RemoteUserConfiguration extends Disposable { } } -export class UserConfiguration extends Disposable { +class FileServiceBasedRemoteUserConfiguration extends Disposable { private readonly parser: ConfigurationModelParser; private readonly reloadConfigurationScheduler: RunOnceScheduler; @@ -190,7 +229,7 @@ export class UserConfiguration extends Disposable { } } -class CachedUserConfiguration extends Disposable { +class CachedRemoteUserConfiguration extends Disposable { private readonly _onDidChange: Emitter = this._register(new Emitter()); readonly onDidChange: Event = this._onDidChange.event; diff --git a/src/vs/workbench/services/configuration/browser/configurationService.ts b/src/vs/workbench/services/configuration/browser/configurationService.ts index a8e14a6bcd3..e98c108ea06 100644 --- a/src/vs/workbench/services/configuration/browser/configurationService.ts +++ b/src/vs/workbench/services/configuration/browser/configurationService.ts @@ -29,6 +29,7 @@ import { isEqual, dirname } from 'vs/base/common/resources'; import { mark } from 'vs/base/common/performance'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { IFileService } from 'vs/platform/files/common/files'; +import { IUserDataService } from '../../userData/common/userDataService'; export class WorkspaceService extends Disposable implements IConfigurationService, IWorkspaceContextService { @@ -40,7 +41,7 @@ export class WorkspaceService extends Disposable implements IConfigurationServic private _configuration: Configuration; private initialized: boolean = false; private defaultConfiguration: DefaultConfigurationModel; - private localUserConfiguration: UserConfiguration | null = null; + private localUserConfiguration: UserConfiguration; private remoteUserConfiguration: RemoteUserConfiguration | null = null; private workspaceConfiguration: WorkspaceConfiguration; private cachedFolderConfigs: ResourceMap; @@ -67,9 +68,10 @@ export class WorkspaceService extends Disposable implements IConfigurationServic private cyclicDependency = new Promise(resolve => this.cyclicDependencyReady = resolve); constructor( - { userSettingsResource, remoteAuthority, configurationCache }: { userSettingsResource?: URI, remoteAuthority?: string, configurationCache: IConfigurationCache }, + { remoteAuthority, configurationCache }: { remoteAuthority?: string, configurationCache: IConfigurationCache }, fileService: IFileService, - remoteAgentService: IRemoteAgentService, + userDataService: IUserDataService, + remoteAgentService: IRemoteAgentService ) { super(); @@ -79,10 +81,8 @@ export class WorkspaceService extends Disposable implements IConfigurationServic this.configurationFileService = new ConfigurationFileService(fileService); this._configuration = new Configuration(this.defaultConfiguration, new ConfigurationModel(), new ConfigurationModel(), new ConfigurationModel(), new ResourceMap(), new ConfigurationModel(), new ResourceMap(), this.workspace); this.cachedFolderConfigs = new ResourceMap(); - if (userSettingsResource) { - this.localUserConfiguration = this._register(new UserConfiguration(userSettingsResource, remoteAuthority ? LOCAL_MACHINE_SCOPES : undefined, this.configurationFileService)); - this._register(this.localUserConfiguration.onDidChangeConfiguration(userConfiguration => this.onLocalUserConfigurationChanged(userConfiguration))); - } + this.localUserConfiguration = this._register(new UserConfiguration(remoteAuthority ? LOCAL_MACHINE_SCOPES : undefined, userDataService)); + this._register(this.localUserConfiguration.onDidChangeConfiguration(userConfiguration => this.onLocalUserConfigurationChanged(userConfiguration))); if (remoteAuthority) { this.remoteUserConfiguration = this._register(new RemoteUserConfiguration(remoteAuthority, configurationCache, this.configurationFileService, remoteAgentService)); this._register(this.remoteUserConfiguration.onDidChangeConfiguration(userConfiguration => this.onRemoteUserConfigurationChanged(userConfiguration))); @@ -426,7 +426,7 @@ export class WorkspaceService extends Disposable implements IConfigurationServic } private initializeUserConfiguration(): Promise<{ local: ConfigurationModel, remote: ConfigurationModel }> { - return Promise.all([this.localUserConfiguration ? this.localUserConfiguration.initialize() : Promise.resolve(new ConfigurationModel()), this.remoteUserConfiguration ? this.remoteUserConfiguration.initialize() : Promise.resolve(new ConfigurationModel())]) + return Promise.all([this.localUserConfiguration.initialize(), this.remoteUserConfiguration ? this.remoteUserConfiguration.initialize() : Promise.resolve(new ConfigurationModel())]) .then(([local, remote]) => ({ local, remote })); } @@ -435,7 +435,7 @@ export class WorkspaceService extends Disposable implements IConfigurationServic } private reloadLocalUserConfiguration(key?: string): Promise { - return this.localUserConfiguration ? this.localUserConfiguration.reload() : Promise.resolve(new ConfigurationModel()); + return this.localUserConfiguration.reload(); } private reloadRemoeUserConfiguration(key?: string): Promise { 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 64b5b994371..f94f09794b4 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 @@ -39,6 +39,7 @@ import { Schemas } from 'vs/base/common/network'; import { DiskFileSystemProvider } from 'vs/workbench/services/files/node/diskFileSystemProvider'; import { IFileService } from 'vs/platform/files/common/files'; import { ConfigurationCache } from 'vs/workbench/services/configuration/node/configurationCache'; +import { FileUserDataService } from 'vs/workbench/services/userData/common/fileUserDataService'; class SettingsTestEnvironmentService extends EnvironmentService { @@ -107,7 +108,8 @@ suite('ConfigurationEditingService', () => { fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); instantiationService.stub(IFileService, fileService); instantiationService.stub(IRemoteAgentService, remoteAgentService); - const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, fileService, remoteAgentService); + const userDataService = new FileUserDataService(environmentService, fileService); + const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); return workspaceService.initialize(noWorkspace ? { id: '' } : { folder: URI.file(workspaceDir), id: createHash('md5').update(URI.file(workspaceDir).toString()).digest('hex') }).then(() => { instantiationService.stub(IConfigurationService, workspaceService); 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 cbd400263ee..3e1e4be3e3c 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 @@ -31,7 +31,7 @@ import { IJSONEditingService } from 'vs/workbench/services/configuration/common/ import { JSONEditingService } from 'vs/workbench/services/configuration/common/jsonEditingService'; import { createHash } from 'crypto'; import { Schemas } from 'vs/base/common/network'; -import { originalFSPath } from 'vs/base/common/resources'; +import { originalFSPath, dirname } from 'vs/base/common/resources'; import { isLinux } from 'vs/base/common/platform'; import { IWindowConfiguration } from 'vs/platform/windows/common/windows'; import { RemoteAgentService } from 'vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl'; @@ -45,14 +45,16 @@ import { IRemoteAgentEnvironment } from 'vs/platform/remote/common/remoteAgentEn import { IConfigurationCache } from 'vs/workbench/services/configuration/common/configuration'; import { VSBuffer } from 'vs/base/common/buffer'; import { SignService } from 'vs/platform/sign/browser/signService'; +import { FileUserDataService } from 'vs/workbench/services/userData/common/fileUserDataService'; class SettingsTestEnvironmentService extends EnvironmentService { - constructor(args: ParsedArgs, _execPath: string, private customAppSettingsHome: string) { + constructor(args: ParsedArgs, _execPath: string, private _settingsPath: string) { super(args, _execPath); } - get settingsResource(): URI { return URI.file(this.customAppSettingsHome); } + get appSettingsHome(): URI { return dirname(this.settingsResource); } + get settingsResource(): URI { return URI.file(this._settingsPath); } } function setUpFolderWorkspace(folderName: string): Promise<{ parentDir: string, folderDir: string }> { @@ -103,7 +105,9 @@ suite('WorkspaceContextService - Folder', () => { workspaceResource = folderDir; const globalSettingsFile = path.join(parentDir, 'settings.json'); const environmentService = new SettingsTestEnvironmentService(parseArgs(process.argv), process.execPath, globalSettingsFile); - workspaceContextService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, new FileService(new NullLogService()), new RemoteAgentService({}, environmentService, new RemoteAuthorityResolverService(), new SignService())); + const fileService = new FileService(new NullLogService()); + const userDataService = new FileUserDataService(environmentService, fileService); + workspaceContextService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, new RemoteAgentService({}, environmentService, new RemoteAuthorityResolverService(), new SignService())); return (workspaceContextService).initialize(convertToWorkspacePayload(URI.file(folderDir))); }); }); @@ -167,7 +171,8 @@ suite('WorkspaceContextService - Workspace', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, fileService, remoteAgentService); + const userDataService = new FileUserDataService(environmentService, fileService); + const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); @@ -225,8 +230,8 @@ suite('WorkspaceContextService - Workspace Editing', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const configurationFileService = fileService; - const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, configurationFileService, remoteAgentService); + const userDataService = new FileUserDataService(environmentService, fileService); + const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); @@ -485,8 +490,8 @@ suite('WorkspaceService - Initialization', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const configurationFileService = fileService; - const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, configurationFileService, remoteAgentService); + const userDataService = new FileUserDataService(environmentService, fileService); + const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); instantiationService.stub(IEnvironmentService, environmentService); @@ -748,8 +753,8 @@ suite('WorkspaceConfigurationService - Folder', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const configurationFileService = fileService; - const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, configurationFileService, remoteAgentService); + const userDataService = new FileUserDataService(environmentService, fileService); + const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); instantiationService.stub(IEnvironmentService, environmentService); @@ -1075,8 +1080,8 @@ suite('WorkspaceConfigurationService-Multiroot', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const configurationFileService = fileService; - const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, configurationFileService, remoteAgentService); + const userDataService = new FileUserDataService(environmentService, fileService); + const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); @@ -1476,9 +1481,9 @@ suite('WorkspaceConfigurationService - Remote Folder', () => { const remoteAgentService = instantiationService.stub(IRemoteAgentService, >{ getEnvironment: () => remoteEnvironmentPromise }); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, diskFileSystemProvider); - const configurationFileService = fileService; const configurationCache: IConfigurationCache = { read: () => Promise.resolve(''), write: () => Promise.resolve(), remove: () => Promise.resolve() }; - testObject = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache, remoteAuthority }, configurationFileService, remoteAgentService); + const userDataService = new FileUserDataService(environmentService, fileService); + testObject = new WorkspaceService({ configurationCache, remoteAuthority }, fileService, userDataService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, testObject); instantiationService.stub(IConfigurationService, testObject); instantiationService.stub(IEnvironmentService, environmentService); From fb56f999750231d93e8e8a14eb4fbb85519919c8 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 20 Jun 2019 15:17:30 +0200 Subject: [PATCH 0445/1449] Update distro hash --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7f473c58396..51b6853bd96 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "336a0c632c464d9c81e6fbff00154852967eaf02", + "distro": "98c55ad448ca078f4eb07091bf54b4cbc189203a", "author": { "name": "Microsoft Corporation" }, From 997e91421e9490a11ff3b69dd285b2c175efbe46 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 20 Jun 2019 15:47:46 +0200 Subject: [PATCH 0446/1449] add diagnostic tool for git file event issues --- extensions/git/src/model.ts | 2 +- extensions/git/src/repository.ts | 64 +++++++++++++++++++++++++------- 2 files changed, 52 insertions(+), 14 deletions(-) diff --git a/extensions/git/src/model.ts b/extensions/git/src/model.ts index 2c9085b6820..a04dc33c8be 100644 --- a/extensions/git/src/model.ts +++ b/extensions/git/src/model.ts @@ -233,7 +233,7 @@ export class Model { } const dotGit = await this.git.getRepositoryDotGit(repositoryRoot); - const repository = new Repository(this.git.open(repositoryRoot, dotGit), this.globalState); + const repository = new Repository(this.git.open(repositoryRoot, dotGit), this.globalState, this.outputChannel); this.open(repository); } catch (err) { diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index a6ac57bc691..5cbe55e8a21 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -3,9 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { commands, Uri, Command, EventEmitter, Event, scm, SourceControl, SourceControlInputBox, SourceControlResourceGroup, SourceControlResourceState, SourceControlResourceDecorations, SourceControlInputBoxValidation, Disposable, ProgressLocation, window, workspace, WorkspaceEdit, ThemeColor, DecorationData, Memento, SourceControlInputBoxValidationType } from 'vscode'; +import { commands, Uri, Command, EventEmitter, Event, scm, SourceControl, SourceControlInputBox, SourceControlResourceGroup, SourceControlResourceState, SourceControlResourceDecorations, SourceControlInputBoxValidation, Disposable, ProgressLocation, window, workspace, WorkspaceEdit, ThemeColor, DecorationData, Memento, SourceControlInputBoxValidationType, OutputChannel, LogLevel, env } from 'vscode'; import { Repository as BaseRepository, Commit, Stash, GitError, Submodule, CommitOptions, ForcePushMode } from './git'; -import { anyEvent, filterEvent, eventToPromise, dispose, find, isDescendant, IDisposable, onceEvent, EmptyDisposable, debounceEvent, toDisposable } from './util'; +import { anyEvent, filterEvent, eventToPromise, dispose, find, isDescendant, IDisposable, onceEvent, EmptyDisposable, debounceEvent, toDisposable, combinedDisposable } from './util'; import { memoize, throttle, debounce } from './decorators'; import { toGitUri } from './uri'; import { AutoFetcher } from './autofetch'; @@ -447,6 +447,39 @@ class ProgressManager { } } +class FileEventLogger { + + private eventDisposable: IDisposable = EmptyDisposable; + private logLevelDisposable: IDisposable = EmptyDisposable; + + constructor( + private onWorkspaceWorkingTreeFileChange: Event, + private onDotGitFileChange: Event, + private outputChannel: OutputChannel + ) { + this.logLevelDisposable = env.onDidChangeLogLevel(this.onDidChangeLogLevel, this); + this.onDidChangeLogLevel(env.logLevel); + } + + private onDidChangeLogLevel(level: LogLevel): void { + this.eventDisposable.dispose(); + + if (level > LogLevel.Debug) { + return; + } + + this.eventDisposable = combinedDisposable([ + this.onWorkspaceWorkingTreeFileChange(uri => this.outputChannel.appendLine(`[debug] [wt] Change: ${uri.fsPath}`)), + this.onDotGitFileChange(uri => this.outputChannel.appendLine(`[debug] [.git] Change: ${uri.fsPath}`)) + ]); + } + + dispose(): void { + this.eventDisposable.dispose(); + this.logLevelDisposable.dispose(); + } +} + export class Repository implements Disposable { private _onDidChangeRepository = new EventEmitter(); @@ -547,34 +580,39 @@ export class Repository implements Disposable { private isRepositoryHuge = false; private didWarnAboutLimit = false; private isFreshRepository: boolean | undefined = undefined; + + private disposables: Disposable[] = []; constructor( private readonly repository: BaseRepository, - globalState: Memento + globalState: Memento, + outputChannel: OutputChannel ) { const workspaceWatcher = workspace.createFileSystemWatcher('**'); this.disposables.push(workspaceWatcher); - const onWorkspaceFileChanges = anyEvent(workspaceWatcher.onDidChange, workspaceWatcher.onDidCreate, workspaceWatcher.onDidDelete); - const onWorkspaceRepositoryFileChanges = filterEvent(onWorkspaceFileChanges, uri => isDescendant(repository.root, uri.fsPath)); - const onWorkspaceWorkingTreeFileChanges = filterEvent(onWorkspaceRepositoryFileChanges, uri => !/\/\.git($|\/)/.test(uri.path)); + const onWorkspaceFileChange = anyEvent(workspaceWatcher.onDidChange, workspaceWatcher.onDidCreate, workspaceWatcher.onDidDelete); + const onWorkspaceRepositoryFileChange = filterEvent(onWorkspaceFileChange, uri => isDescendant(repository.root, uri.fsPath)); + const onWorkspaceWorkingTreeFileChange = filterEvent(onWorkspaceRepositoryFileChange, uri => !/\/\.git($|\/)/.test(uri.path)); const dotGitWatcher = fs.watch(repository.dotGit); - const onRepositoryFileEmitter = new EventEmitter(); - dotGitWatcher.on('change', (_, e) => onRepositoryFileEmitter.fire(Uri.file(path.join(repository.dotGit, e as string)))); + const onDotGitFileChangeEmitter = new EventEmitter(); + dotGitWatcher.on('change', (_, e) => onDotGitFileChangeEmitter.fire(Uri.file(path.join(repository.dotGit, e as string)))); dotGitWatcher.on('error', err => console.error(err)); this.disposables.push(toDisposable(() => dotGitWatcher.close())); - const onRelevantRepositoryChanges = filterEvent(onRepositoryFileEmitter.event, uri => !/\/\.git(\/index\.lock)?$/.test(uri.path)); + const onDotGitFileChange = filterEvent(onDotGitFileChangeEmitter.event, uri => !/\/\.git(\/index\.lock)?$/.test(uri.path)); // FS changes should trigger `git status`: // - any change inside the repository working tree // - any change whithin the first level of the `.git` folder, except the folder itself and `index.lock` - const onFSChange = anyEvent(onWorkspaceWorkingTreeFileChanges, onRelevantRepositoryChanges); - onFSChange(this.onFSChange, this, this.disposables); + const onFileChange = anyEvent(onWorkspaceWorkingTreeFileChange, onDotGitFileChange); + onFileChange(this.onFileChange, this, this.disposables); // Relevate repository changes should trigger virtual document change events - onRelevantRepositoryChanges(this._onDidChangeRepository.fire, this._onDidChangeRepository, this.disposables); + onDotGitFileChange(this._onDidChangeRepository.fire, this._onDidChangeRepository, this.disposables); + + this.disposables.push(new FileEventLogger(onWorkspaceWorkingTreeFileChange, onDotGitFileChange, outputChannel)); const root = Uri.file(repository.root); this._sourceControl = scm.createSourceControl('git', 'Git', root); @@ -1454,7 +1492,7 @@ export class Repository implements Disposable { return result; } - private onFSChange(_uri: Uri): void { + private onFileChange(_uri: Uri): void { const config = workspace.getConfiguration('git'); const autorefresh = config.get('autorefresh'); From 3839ce7751c2b670c0145161ff7774c4c8884c4e Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 20 Jun 2019 15:54:18 +0200 Subject: [PATCH 0447/1449] :lipstick: --- .../workbench/api/common/extHostFileSystem.ts | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/vs/workbench/api/common/extHostFileSystem.ts b/src/vs/workbench/api/common/extHostFileSystem.ts index a46c3fd8417..da723e3d01b 100644 --- a/src/vs/workbench/api/common/extHostFileSystem.ts +++ b/src/vs/workbench/api/common/extHostFileSystem.ts @@ -113,7 +113,6 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { private readonly _watches = new Map(); private _linkProviderRegistration: IDisposable; - // Used as a handle both for file system providers and resource label formatters (being lazy) private _handlePool: number = 0; constructor(mainContext: IMainContext, private _extHostLanguageFeatures: ExtHostLanguageFeatures) { @@ -223,31 +222,31 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } $stat(handle: number, resource: UriComponents): Promise { - return Promise.resolve(this.getProvider(handle).stat(URI.revive(resource))).then(ExtHostFileSystem._asIStat); + return Promise.resolve(this._getFsProvider(handle).stat(URI.revive(resource))).then(ExtHostFileSystem._asIStat); } $readdir(handle: number, resource: UriComponents): Promise<[string, files.FileType][]> { - return Promise.resolve(this.getProvider(handle).readDirectory(URI.revive(resource))); + return Promise.resolve(this._getFsProvider(handle).readDirectory(URI.revive(resource))); } $readFile(handle: number, resource: UriComponents): Promise { - return Promise.resolve(this.getProvider(handle).readFile(URI.revive(resource))).then(data => VSBuffer.wrap(data)); + return Promise.resolve(this._getFsProvider(handle).readFile(URI.revive(resource))).then(data => VSBuffer.wrap(data)); } $writeFile(handle: number, resource: UriComponents, content: VSBuffer, opts: files.FileWriteOptions): Promise { - return Promise.resolve(this.getProvider(handle).writeFile(URI.revive(resource), content.buffer, opts)); + return Promise.resolve(this._getFsProvider(handle).writeFile(URI.revive(resource), content.buffer, opts)); } $delete(handle: number, resource: UriComponents, opts: files.FileDeleteOptions): Promise { - return Promise.resolve(this.getProvider(handle).delete(URI.revive(resource), opts)); + return Promise.resolve(this._getFsProvider(handle).delete(URI.revive(resource), opts)); } $rename(handle: number, oldUri: UriComponents, newUri: UriComponents, opts: files.FileOverwriteOptions): Promise { - return Promise.resolve(this.getProvider(handle).rename(URI.revive(oldUri), URI.revive(newUri), opts)); + return Promise.resolve(this._getFsProvider(handle).rename(URI.revive(oldUri), URI.revive(newUri), opts)); } $copy(handle: number, oldUri: UriComponents, newUri: UriComponents, opts: files.FileOverwriteOptions): Promise { - const provider = this.getProvider(handle); + const provider = this._getFsProvider(handle); if (!provider.copy) { throw new Error('FileSystemProvider does not implement "copy"'); } @@ -255,11 +254,11 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } $mkdir(handle: number, resource: UriComponents): Promise { - return Promise.resolve(this.getProvider(handle).createDirectory(URI.revive(resource))); + return Promise.resolve(this._getFsProvider(handle).createDirectory(URI.revive(resource))); } $watch(handle: number, session: number, resource: UriComponents, opts: files.IWatchOptions): void { - const subscription = this.getProvider(handle).watch(URI.revive(resource), opts); + const subscription = this._getFsProvider(handle).watch(URI.revive(resource), opts); this._watches.set(session, subscription); } @@ -272,7 +271,7 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } $open(handle: number, resource: UriComponents, opts: files.FileOpenOptions): Promise { - const provider = this.getProvider(handle); + const provider = this._getFsProvider(handle); if (!provider.open) { throw new Error('FileSystemProvider does not implement "open"'); } @@ -280,7 +279,7 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } $close(handle: number, fd: number): Promise { - const provider = this.getProvider(handle); + const provider = this._getFsProvider(handle); if (!provider.close) { throw new Error('FileSystemProvider does not implement "close"'); } @@ -288,7 +287,7 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } $read(handle: number, fd: number, pos: number, length: number): Promise { - const provider = this.getProvider(handle); + const provider = this._getFsProvider(handle); if (!provider.read) { throw new Error('FileSystemProvider does not implement "read"'); } @@ -299,14 +298,14 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } $write(handle: number, fd: number, pos: number, data: VSBuffer): Promise { - const provider = this.getProvider(handle); + const provider = this._getFsProvider(handle); if (!provider.write) { throw new Error('FileSystemProvider does not implement "write"'); } return Promise.resolve(provider.write(fd, pos, data.buffer, 0, data.byteLength)); } - private getProvider(handle: number): vscode.FileSystemProvider { + private _getFsProvider(handle: number): vscode.FileSystemProvider { const provider = this._fsProvider.get(handle); if (!provider) { const err = new Error(); From 1e8412ca2d79aba6c35a0c656f87d6675ce3e08a Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 20 Jun 2019 15:58:16 +0200 Subject: [PATCH 0448/1449] Update distro hash --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 51b6853bd96..0e3cb54f607 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "98c55ad448ca078f4eb07091bf54b4cbc189203a", + "distro": "3db6aad4b3378955f6f369ae4a627d68953ed919", "author": { "name": "Microsoft Corporation" }, From 005b19e5bcf9deb0ff6e1cc9273e621f26b6833f Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 20 Jun 2019 16:03:41 +0200 Subject: [PATCH 0449/1449] introduce VSCODE_STEP_ON_IT --- .../darwin/product-build-darwin.yml | 24 ++++++++++++++- .../linux/product-build-linux-alpine.yml | 20 +++++++++++++ .../linux/product-build-linux-arm.yml | 22 +++++++++++++- .../linux/product-build-linux.yml | 23 +++++++++++++- .../win32/product-build-win32.yml | 30 +++++++++++++++++-- 5 files changed, 114 insertions(+), 5 deletions(-) diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index f136f2b4496..201a6bdce4c 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -26,18 +26,38 @@ steps: git config user.email "vscode@microsoft.com" git config user.name "VSCode" + displayName: Prepare tooling + +- script: | + set -e git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git" git fetch distro git merge $(node -p "require('./package.json').distro") + displayName: Merge distro +- script: | + set -e yarn + displayName: Install dependencies + +- script: | + set -e yarn gulp mixin + displayName: Mix in quality + +- script: | + set -e yarn gulp hygiene yarn monaco-compile-check + displayName: Run hygiene checks + condition: eq(variables['VSCODE_STEP_ON_IT'], 'false') + +- script: | + set -e node build/azure-pipelines/common/installDistroDependencies.js node build/azure-pipelines/common/installDistroDependencies.js remote node build/lib/builtInExtensions.js - displayName: Prepare build + displayName: Install distro dependencies and extensions - script: | set -e @@ -52,11 +72,13 @@ steps: # APP_NAME="`ls $(agent.builddirectory)/VSCode-darwin | head -n 1`" # yarn smoketest -- --build "$(agent.builddirectory)/VSCode-darwin/$APP_NAME" displayName: Run unit tests + condition: eq(variables['VSCODE_STEP_ON_IT'], 'false') - script: | set -e ./scripts/test-integration.sh --build --tfs "Integration Tests" displayName: Run integration tests + condition: eq(variables['VSCODE_STEP_ON_IT'], 'false') - script: | set -e diff --git a/build/azure-pipelines/linux/product-build-linux-alpine.yml b/build/azure-pipelines/linux/product-build-linux-alpine.yml index 4beee37d1a0..71dfb920677 100644 --- a/build/azure-pipelines/linux/product-build-linux-alpine.yml +++ b/build/azure-pipelines/linux/product-build-linux-alpine.yml @@ -35,14 +35,34 @@ steps: git config user.email "vscode@microsoft.com" git config user.name "VSCode" + displayName: Prepare tooling + +- script: | + set -e git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git" git fetch distro git merge $(node -p "require('./package.json').distro") + displayName: Merge distro +- script: | + set -e CHILD_CONCURRENCY=1 yarn + displayName: Install dependencies + +- script: | + set -e yarn gulp mixin + displayName: Mix in quality + +- script: | + set -e yarn gulp hygiene yarn monaco-compile-check + displayName: Run hygiene checks + condition: eq(variables['VSCODE_STEP_ON_IT'], 'false') + +- script: | + set -e ./build/azure-pipelines/linux/prebuild-alpine.sh displayName: Prepare build diff --git a/build/azure-pipelines/linux/product-build-linux-arm.yml b/build/azure-pipelines/linux/product-build-linux-arm.yml index 55350cce295..8eb75c58aa9 100644 --- a/build/azure-pipelines/linux/product-build-linux-arm.yml +++ b/build/azure-pipelines/linux/product-build-linux-arm.yml @@ -35,16 +35,36 @@ steps: git config user.email "vscode@microsoft.com" git config user.name "VSCode" + displayName: Prepare tooling + +- script: | + set -e git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git" git fetch distro git merge $(node -p "require('./package.json').distro") + displayName: Merge distro +- script: | + set -e CHILD_CONCURRENCY=1 yarn + displayName: Install dependencies + +- script: | + set -e yarn gulp mixin + displayName: Mix in quality + +- script: | + set -e yarn gulp hygiene yarn monaco-compile-check + displayName: Run hygiene checks + condition: eq(variables['VSCODE_STEP_ON_IT'], 'false') + +- script: | + set -e ./build/azure-pipelines/linux/prebuild-arm.sh - displayName: Prepare build + displayName: Prebuild - script: | set -e diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index c1386b93f71..691851fbf97 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -27,18 +27,38 @@ steps: git config user.email "vscode@microsoft.com" git config user.name "VSCode" + displayName: Prepare tooling + +- script: | + set -e git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git" git fetch distro git merge $(node -p "require('./package.json').distro") + displayName: Merge distro +- script: | + set -e CHILD_CONCURRENCY=1 yarn + displayName: Install dependencies + +- script: | + set -e yarn gulp mixin + displayName: Mix in quality + +- script: | + set -e yarn gulp hygiene yarn monaco-compile-check + displayName: Run hygiene checks + condition: eq(variables['VSCODE_STEP_ON_IT'], 'false') + +- script: | + set -e node build/azure-pipelines/common/installDistroDependencies.js node build/azure-pipelines/common/installDistroDependencies.js remote node build/lib/builtInExtensions.js - displayName: Prepare build + displayName: Install distro dependencies and extensions - script: | set -e @@ -56,6 +76,7 @@ steps: DISPLAY=:10 ./scripts/test.sh --build --tfs "Unit Tests" # yarn smoketest -- --build "$(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH)" displayName: Run unit tests + condition: eq(variables['VSCODE_STEP_ON_IT'], 'false') - script: | set -e diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 339bdde1b9c..6505b9a8df2 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -27,18 +27,43 @@ steps: exec { git config user.email "vscode@microsoft.com" } exec { git config user.name "VSCode" } + displayName: Prepare tooling + +- powershell: | + . build/azure-pipelines/win32/exec.ps1 + $ErrorActionPreference = "Stop" exec { git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git" } exec { git fetch distro } exec { git merge $(node -p "require('./package.json').distro") } + displayName: Merge distro +- powershell: | + . build/azure-pipelines/win32/exec.ps1 + $ErrorActionPreference = "Stop" exec { yarn } + displayName: Install dependencies + +- powershell: | + . build/azure-pipelines/win32/exec.ps1 + $ErrorActionPreference = "Stop" exec { yarn gulp mixin } + displayName: Mix in quality + +- powershell: | + . build/azure-pipelines/win32/exec.ps1 + $ErrorActionPreference = "Stop" exec { yarn gulp hygiene } exec { yarn monaco-compile-check } + displayName: Run hygiene checks + condition: eq(variables['VSCODE_STEP_ON_IT'], 'false') + +- powershell: | + . build/azure-pipelines/win32/exec.ps1 + $ErrorActionPreference = "Stop" exec { node build/azure-pipelines/common/installDistroDependencies.js } exec { node build/azure-pipelines/common/installDistroDependencies.js remote } exec { node build/lib/builtInExtensions.js } - displayName: Prepare build + displayName: Install distro dependencies and extensions - powershell: | . build/azure-pipelines/win32/exec.ps1 @@ -52,8 +77,8 @@ steps: $ErrorActionPreference = "Stop" exec { yarn gulp "electron-$(VSCODE_ARCH)" } exec { .\scripts\test.bat --build --tfs "Unit Tests" } - # yarn smoketest -- --build "$(agent.builddirectory)\VSCode-win32-$(VSCODE_ARCH)" displayName: Run unit tests + condition: eq(variables['VSCODE_STEP_ON_IT'], 'false') - powershell: | . build/azure-pipelines/win32/exec.ps1 @@ -61,6 +86,7 @@ steps: exec { yarn gulp "electron-$(VSCODE_ARCH)" } exec { .\scripts\test-integration.bat --build --tfs "Integration Tests" } displayName: Run integration tests + condition: eq(variables['VSCODE_STEP_ON_IT'], 'false') - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1 inputs: From c70c399313740bee8f9650ab9570d52d276c65bc Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 20 Jun 2019 16:31:51 +0200 Subject: [PATCH 0450/1449] remove env scripts fixes #74792 --- scripts/env.ps1 | 3 --- scripts/env.sh | 6 ------ 2 files changed, 9 deletions(-) delete mode 100644 scripts/env.ps1 delete mode 100755 scripts/env.sh diff --git a/scripts/env.ps1 b/scripts/env.ps1 deleted file mode 100644 index 72e094d0a6a..00000000000 --- a/scripts/env.ps1 +++ /dev/null @@ -1,3 +0,0 @@ -$env:npm_config_disturl="https://atom.io/download/electron" -$env:npm_config_target=(node -p "require('./build/lib/electron').getElectronVersion();") -$env:npm_config_runtime="electron" diff --git a/scripts/env.sh b/scripts/env.sh deleted file mode 100755 index 8f641759b27..00000000000 --- a/scripts/env.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -export npm_config_disturl=https://atom.io/download/electron -export npm_config_target=$(node -p "require('./build/lib/electron').getElectronVersion();") -export npm_config_runtime=electron -export npm_config_cache="$HOME/.npm-electron" -mkdir -p "$npm_config_cache" From 5c1490f2047e65b7c4735b9279195fbea1c95d52 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 20 Jun 2019 07:36:21 -0700 Subject: [PATCH 0451/1449] Update xterm.css Fixes #75827 --- .../contrib/terminal/browser/media/xterm.css | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/media/xterm.css b/src/vs/workbench/contrib/terminal/browser/media/xterm.css index 37429d9646b..5bfff739f8d 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/xterm.css +++ b/src/vs/workbench/contrib/terminal/browser/media/xterm.css @@ -43,6 +43,8 @@ font-feature-settings: "liga" 0; position: relative; user-select: none; + -ms-user-select: none; + -webkit-user-select: none; } .xterm.focus, @@ -127,13 +129,22 @@ line-height: normal; } +.xterm { + cursor: text; +} + .xterm.enable-mouse-events { - /* When mouse events are enabled (e.g. tmux), revert to the standard pointer cursor */ + /* When mouse events are enabled (eg. tmux), revert to the standard pointer cursor */ cursor: default; } -.xterm:not(.enable-mouse-events) { - cursor: text; +.xterm.xterm-cursor-pointer { + cursor: pointer; +} + +.xterm.column-select.focus { + /* Column selection mode */ + cursor: crosshair; } .xterm .xterm-accessibility, @@ -147,10 +158,6 @@ color: transparent; } -.xterm .xterm-accessibility-tree:focus [id^="xterm-active-item-"] { - outline: 1px solid #F80; -} - .xterm .live-region { position: absolute; left: -9999px; @@ -159,11 +166,10 @@ overflow: hidden; } -.xterm-cursor-pointer { - cursor: pointer !important; +.xterm-dim { + opacity: 0.5; } -.xterm.xterm-cursor-crosshair { - /* Column selection mode */ - cursor: crosshair !important; +.xterm-underline { + text-decoration: underline; } From 210a72c584c54d3a758682ace4b3e36616e74bfc Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 20 Jun 2019 15:08:28 +0200 Subject: [PATCH 0452/1449] check if file exists --- .../userData/common/fileUserDataService.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/services/userData/common/fileUserDataService.ts b/src/vs/workbench/services/userData/common/fileUserDataService.ts index e0690f41ea8..6096274dc6d 100644 --- a/src/vs/workbench/services/userData/common/fileUserDataService.ts +++ b/src/vs/workbench/services/userData/common/fileUserDataService.ts @@ -46,8 +46,18 @@ export class FileUserDataService extends Disposable implements IUserDataService } } - read(key: string): Promise { - return this.fileService.readFile(this.toResource(key)).then(content => content.value.toString()); + async read(key: string): Promise { + const resource = this.toResource(key); + try { + const content = await this.fileService.readFile(resource); + return content.value.toString(); + } catch (e) { + const exists = await this.fileService.exists(resource); + if (exists) { + throw e; + } + } + return ''; } write(key: string, value: string): Promise { From a145fbf2b146165079f1abe8d9ebbdc5e30ce8ba Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 20 Jun 2019 16:45:38 +0200 Subject: [PATCH 0453/1449] remove alert, aria-live will read the content even with no focus fixes #41356 --- src/vs/editor/contrib/gotoError/gotoErrorWidget.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/vs/editor/contrib/gotoError/gotoErrorWidget.ts b/src/vs/editor/contrib/gotoError/gotoErrorWidget.ts index 968fa5d44cb..7d93dc2fb37 100644 --- a/src/vs/editor/contrib/gotoError/gotoErrorWidget.ts +++ b/src/vs/editor/contrib/gotoError/gotoErrorWidget.ts @@ -25,7 +25,6 @@ import { basename } from 'vs/base/common/resources'; import { IAction } from 'vs/base/common/actions'; import { IActionBarOptions, ActionsOrientation } from 'vs/base/browser/ui/actionbar/actionbar'; import { peekViewTitleForeground, peekViewTitleInfoForeground } from 'vs/editor/contrib/referenceSearch/referencesWidget'; -import * as aria from 'vs/base/browser/ui/aria/aria'; import { SeverityIcon } from 'vs/platform/severityIcon/common/severityIcon'; class MessageWidget { @@ -286,8 +285,6 @@ export class MarkerNavigationWidget extends PeekViewWidget { this._icon.className = SeverityIcon.className(MarkerSeverity.toSeverity(this._severity)); this.editor.revealPositionInCenter(position, ScrollType.Smooth); - - aria.alert(marker.message); } updateMarker(marker: IMarker): void { From 769e5d2ad21ff30922467f720ad337d4db8fe9c0 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 20 Jun 2019 16:47:17 +0200 Subject: [PATCH 0454/1449] win code.sh fix --- resources/win32/bin/code.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/win32/bin/code.sh b/resources/win32/bin/code.sh index 606fb108fe5..28c48b8d72d 100644 --- a/resources/win32/bin/code.sh +++ b/resources/win32/bin/code.sh @@ -11,7 +11,7 @@ VSCODE_PATH="$(dirname "$(dirname "$(realpath "$0")")")" ELECTRON="$VSCODE_PATH/$NAME.exe" if grep -qi Microsoft /proc/version; then # in a wsl shell - if ! [ -z "$WSL_DISTRO_NAME"]; then + if ! [ -z "$WSL_DISTRO_NAME" ]; then # $WSL_DISTRO_NAME is available since WSL builds 18362, also for WSL2 WSL_BUILD=18362 else From 21b21eb6ab2939cadc481d7f9b4ea1833368cb21 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Thu, 20 Jun 2019 08:07:04 -0700 Subject: [PATCH 0455/1449] =?UTF-8?q?=F0=9F=A7=80=20Fix=20#75831?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/vs/workbench/browser/media/icons.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/browser/media/icons.css b/src/vs/workbench/browser/media/icons.css index 05465d73aa3..a730544fcb7 100644 --- a/src/vs/workbench/browser/media/icons.css +++ b/src/vs/workbench/browser/media/icons.css @@ -67,6 +67,7 @@ body[data-exploration^="icon-exploration"] .monaco-workbench .part > .title > .t body[data-exploration^="icon-exploration"] .monaco-workbench .part > .title > .title-actions .actions-container[aria-label="Source Control: Git actions"] .icon[data-title="git.refresh"], body[data-exploration^="icon-exploration"] .monaco-workbench .part > .title > .title-actions .actions-container[aria-label="Debug actions"] .icon, body[data-exploration^="icon-exploration"] .monaco-workbench .part > .title > .title-actions .actions-container[aria-label^="Extensions"] .icon, +body[data-exploration^="icon-exploration"] .scm-viewlet .monaco-list-row > .resource > .name > .monaco-icon-label > .actions .action-label[data-title^="git.openFile2"], body[data-exploration^="icon-exploration"] .scm-viewlet .monaco-list-row > .resource > .name > .monaco-icon-label > .actions .action-label[data-title^="git.unstage"], body[data-exploration^="icon-exploration"] .scm-viewlet .monaco-list-row > .resource > .name > .monaco-icon-label > .actions .action-label[data-title^="git.stage"], body[data-exploration^="icon-exploration"] .scm-viewlet .monaco-list-row > .resource > .name > .monaco-icon-label > .actions .action-label[data-title^="git.openChange"], From 7b681f8733b003d5eccbdc0c3ef801673caf2df9 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 20 Jun 2019 08:22:22 -0700 Subject: [PATCH 0456/1449] Add proposed api check for shell API Part of #75091 --- src/vs/workbench/api/node/extHost.api.impl.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 9898fa25685..88181549613 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -255,6 +255,7 @@ export function createApiFactory( return extHostClipboard; }, get shell() { + checkProposedApiEnabled(extension); return extHostTerminalService.getDefaultShell(configProvider); }, openExternal(uri: URI) { From 106985ac2293ec7d5f23d3453c0801497e963d77 Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Thu, 20 Jun 2019 17:39:19 +0200 Subject: [PATCH 0457/1449] launch ext host window internally --- src/vs/platform/windows/common/windows.ts | 1 + .../electron-browser/windowsService.ts | 4 + .../windows/electron-main/windowsService.ts | 11 +++ src/vs/platform/windows/node/windowsIpc.ts | 1 + .../workbench/browser/web.simpleservices.ts | 5 ++ .../debug/browser/debugHelperService.ts | 6 +- .../contrib/debug/browser/debugSession.ts | 8 +- .../contrib/debug/browser/rawDebugSession.ts | 58 +++++++++++-- .../workbench/contrib/debug/common/debug.ts | 17 ---- .../contrib/debug/node/debugHelperService.ts | 83 +------------------ .../workbench/test/workbenchTestServices.ts | 6 +- 11 files changed, 86 insertions(+), 114 deletions(-) diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index 3801a8cc543..b8cf79dd68d 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -153,6 +153,7 @@ export interface IWindowsService { // Global methods openWindow(windowId: number, uris: IURIToOpen[], options: IOpenSettings): Promise; openNewWindow(options?: INewWindowOptions): Promise; + openExtensionDevelopmentHostWindow(args: ParsedArgs): Promise; getWindows(): Promise<{ id: number; workspace?: IWorkspaceIdentifier; folderUri?: ISingleFolderWorkspaceIdentifier; title: string; filename?: string; }[]>; getWindowCount(): Promise; log(severity: string, ...messages: string[]): Promise; diff --git a/src/vs/platform/windows/electron-browser/windowsService.ts b/src/vs/platform/windows/electron-browser/windowsService.ts index 73acbb0f67a..1eb8c60b8ee 100644 --- a/src/vs/platform/windows/electron-browser/windowsService.ts +++ b/src/vs/platform/windows/electron-browser/windowsService.ts @@ -195,6 +195,10 @@ export class WindowsService implements IWindowsService { return this.channel.call('openNewWindow', options); } + openExtensionDevelopmentHostWindow(args: ParsedArgs): Promise { + return this.channel.call('openExtensionDevelopmentHostWindow', args); + } + async getWindows(): Promise<{ id: number; workspace?: IWorkspaceIdentifier; folderUri?: ISingleFolderWorkspaceIdentifier; title: string; filename?: string; }[]> { const result = await this.channel.call<{ id: number; diff --git a/src/vs/platform/windows/electron-main/windowsService.ts b/src/vs/platform/windows/electron-main/windowsService.ts index ed90804f293..1c3c4734384 100644 --- a/src/vs/platform/windows/electron-main/windowsService.ts +++ b/src/vs/platform/windows/electron-main/windowsService.ts @@ -306,6 +306,17 @@ export class WindowsService extends Disposable implements IWindowsService, IURLH this.windowsMainService.openNewWindow(OpenContext.API, options); } + async openExtensionDevelopmentHostWindow(args: ParsedArgs): Promise { + this.logService.trace('windowsService#openExtensionDevelopmentHostWindow ' + JSON.stringify(args)); + + if (args.extensionDevelopmentPath) { + this.windowsMainService.openExtensionDevelopmentHostWindow(args.extensionDevelopmentPath, { + context: OpenContext.API, + cli: args + }); + } + } + async getWindows(): Promise<{ id: number; workspace?: IWorkspaceIdentifier; folderUri?: ISingleFolderWorkspaceIdentifier; title: string; filename?: string; }[]> { this.logService.trace('windowsService#getWindows'); diff --git a/src/vs/platform/windows/node/windowsIpc.ts b/src/vs/platform/windows/node/windowsIpc.ts index c12c47b5a3a..30876b55e10 100644 --- a/src/vs/platform/windows/node/windowsIpc.ts +++ b/src/vs/platform/windows/node/windowsIpc.ts @@ -102,6 +102,7 @@ export class WindowsChannel implements IServerChannel { return this.service.openWindow(arg[0], urisToOpen, options); } case 'openNewWindow': return this.service.openNewWindow(arg); + case 'openExtensionDevelopmentHostWindow': return this.service.openExtensionDevelopmentHostWindow(arg); case 'getWindows': return this.service.getWindows(); case 'getWindowCount': return this.service.getWindowCount(); case 'relaunch': return this.service.relaunch(arg[0]); diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index 96d69910456..b6cf7746407 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -45,6 +45,7 @@ import { CommentingRanges } from 'vs/editor/common/modes'; import { Range } from 'vs/editor/common/core/range'; import { isUndefinedOrNull } from 'vs/base/common/types'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { ParsedArgs } from 'vs/platform/environment/common/environment'; //#region Backup File @@ -1052,6 +1053,10 @@ export class SimpleWindowsService implements IWindowsService { return Promise.resolve(); } + openExtensionDevelopmentHostWindow(args: ParsedArgs): Promise { + return Promise.resolve(); + } + getWindows(): Promise<{ id: number; workspace?: IWorkspaceIdentifier; folderUri?: ISingleFolderWorkspaceIdentifier; title: string; filename?: string; }[]> { return Promise.resolve([]); } diff --git a/src/vs/workbench/contrib/debug/browser/debugHelperService.ts b/src/vs/workbench/contrib/debug/browser/debugHelperService.ts index c7fa5b96cd1..be123b31a5e 100644 --- a/src/vs/workbench/contrib/debug/browser/debugHelperService.ts +++ b/src/vs/workbench/contrib/debug/browser/debugHelperService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { ServiceIdentifier, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ITerminalLauncher, IDebugHelperService, ILaunchVSCodeArguments } from 'vs/workbench/contrib/debug/common/debug'; +import { ITerminalLauncher, IDebugHelperService } from 'vs/workbench/contrib/debug/common/debug'; import { TelemetryService } from 'vs/platform/telemetry/common/telemetryService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; @@ -17,10 +17,6 @@ export class BrowserDebugHelperService implements IDebugHelperService { throw new Error('Method createTerminalLauncher not implemented.'); } - launchVsCode(vscodeArgs: ILaunchVSCodeArguments): Promise { - throw new Error('Method launchVsCode not implemented.'); - } - createTelemetryService(configurationService: IConfigurationService, args: string[]): TelemetryService | undefined { return undefined; } diff --git a/src/vs/workbench/contrib/debug/browser/debugSession.ts b/src/vs/workbench/contrib/debug/browser/debugSession.ts index da945a8ee9f..a75db88dfc8 100644 --- a/src/vs/workbench/contrib/debug/browser/debugSession.ts +++ b/src/vs/workbench/contrib/debug/browser/debugSession.ts @@ -12,7 +12,7 @@ import { Event, Emitter } from 'vs/base/common/event'; import { CompletionItem, completionKindFromString } from 'vs/editor/common/modes'; import { Position } from 'vs/editor/common/core/position'; import * as aria from 'vs/base/browser/ui/aria/aria'; -import { IDebugSession, IConfig, IThread, IRawModelUpdate, IDebugService, IRawStoppedDetails, State, LoadedSourceEvent, IFunctionBreakpoint, IExceptionBreakpoint, IBreakpoint, IExceptionInfo, AdapterEndEvent, IDebugger, VIEWLET_ID, IDebugConfiguration, IReplElement, IStackFrame, IExpression, IReplElementSource, IDebugHelperService } from 'vs/workbench/contrib/debug/common/debug'; +import { IDebugSession, IConfig, IThread, IRawModelUpdate, IDebugService, IRawStoppedDetails, State, LoadedSourceEvent, IFunctionBreakpoint, IExceptionBreakpoint, IBreakpoint, IExceptionInfo, AdapterEndEvent, IDebugger, VIEWLET_ID, IDebugConfiguration, IReplElement, IStackFrame, IExpression, IReplElementSource } from 'vs/workbench/contrib/debug/common/debug'; import { Source } from 'vs/workbench/contrib/debug/common/debugSource'; import { mixin } from 'vs/base/common/objects'; import { Thread, ExpressionContainer, DebugModel } from 'vs/workbench/contrib/debug/common/debugModel'; @@ -22,7 +22,7 @@ import { IWorkspaceFolder, IWorkspaceContextService } from 'vs/platform/workspac import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { RunOnceScheduler } from 'vs/base/common/async'; import { generateUuid } from 'vs/base/common/uuid'; -import { IWindowService } from 'vs/platform/windows/common/windows'; +import { IWindowService, IWindowsService } from 'vs/platform/windows/common/windows'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { normalizeDriveLetter } from 'vs/base/common/labels'; import { Range } from 'vs/editor/common/core/range'; @@ -68,7 +68,7 @@ export class DebugSession implements IDebugSession { @INotificationService private readonly notificationService: INotificationService, @ISignService private readonly signService: ISignService, @IProductService private readonly productService: IProductService, - @IDebugHelperService private readonly debugUIService: IDebugHelperService + @IWindowsService private readonly windowsService: IWindowsService ) { this.id = generateUuid(); this.repl = new ReplModel(this); @@ -169,7 +169,7 @@ export class DebugSession implements IDebugSession { return dbgr.createDebugAdapter(this).then(debugAdapter => { - this.raw = new RawDebugSession(debugAdapter, dbgr, this.telemetryService, customTelemetryService, this.signService, this.debugUIService); + this.raw = new RawDebugSession(debugAdapter, dbgr, this.telemetryService, customTelemetryService, this.signService, this.windowsService); return this.raw!.start().then(() => { diff --git a/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts b/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts index 3eb52275d43..7839a60d19e 100644 --- a/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts +++ b/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts @@ -9,10 +9,28 @@ import * as objects from 'vs/base/common/objects'; import { Action } from 'vs/base/common/actions'; import * as errors from 'vs/base/common/errors'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { formatPII } from 'vs/workbench/contrib/debug/common/debugUtils'; -import { IDebugAdapter, IConfig, AdapterEndEvent, IDebugger, IDebugHelperService, ILaunchVSCodeArguments } from 'vs/workbench/contrib/debug/common/debug'; +import { formatPII, isUri } from 'vs/workbench/contrib/debug/common/debugUtils'; +import { IDebugAdapter, IConfig, AdapterEndEvent, IDebugger } from 'vs/workbench/contrib/debug/common/debug'; import { createErrorWithActions } from 'vs/base/common/errorsWithActions'; import { ISignService } from 'vs/platform/sign/common/sign'; +import { ParsedArgs } from 'vs/platform/environment/common/environment'; +import { IWindowsService } from 'vs/platform/windows/common/windows'; +import { URI } from 'vs/base/common/uri'; + +/** + * This interface represents a single command line argument split into a "prefix" and a "path" half. + * The optional "prefix" contains arbitrary text and the optional "path" contains a file system path. + * Concatenating both results in the original command line argument. + */ +interface ILaunchVSCodeArgument { + prefix?: string; + path?: string; +} + +interface ILaunchVSCodeArguments { + args: ILaunchVSCodeArgument[]; + env?: { [key: string]: string | null; }; +} /** * Encapsulates the DebugAdapter lifecycle and some idiosyncrasies of the Debug Adapter Protocol. @@ -56,7 +74,8 @@ export class RawDebugSession { private readonly telemetryService: ITelemetryService, public readonly customTelemetryService: ITelemetryService | undefined, private readonly signService: ISignService, - private readonly debugUIService: IDebugHelperService + private readonly windowsService: IWindowsService + ) { this.debugAdapter = debugAdapter; this._capabilities = Object.create(null); @@ -503,9 +522,9 @@ export class RawDebugSession { switch (request.command) { case 'launchVSCode': - this.debugUIService.launchVsCode(request.arguments).then(pid => { + this.launchVsCode(request.arguments).then(_ => { response.body = { - processId: pid + //processId: pid }; safeSendResponse(response); }, err => { @@ -549,6 +568,35 @@ export class RawDebugSession { } } + private launchVsCode(vscodeArgs: ILaunchVSCodeArguments): Promise { + + let args: ParsedArgs = { + _: [] + }; + + for (let arg of vscodeArgs.args) { + if (arg.prefix) { + const a2 = (arg.prefix || '') + (arg.path || ''); + const match = /^--(.+)=(.+)$/.exec(a2); + if (match && match.length === 3) { + const key = match[1]; + let value = match[2]; + + if ((key === 'file-uri' || key === 'folder-uri') && !isUri(arg.path)) { + value = URI.file(value).toString(); + } + + args[key] = value; + + } else { + args._.push(a2); + } + } + } + + return this.windowsService.openExtensionDevelopmentHostWindow(args); + } + private send(command: string, args: any, timeout?: number): Promise { return new Promise((completeDispatch, errorDispatch) => { if (!this.debugAdapter) { diff --git a/src/vs/workbench/contrib/debug/common/debug.ts b/src/vs/workbench/contrib/debug/common/debug.ts index da0718b23db..f36d6529d77 100644 --- a/src/vs/workbench/contrib/debug/common/debug.ts +++ b/src/vs/workbench/contrib/debug/common/debug.ts @@ -843,27 +843,10 @@ export interface IDebugEditorContribution extends IEditorContribution { export const DEBUG_HELPER_SERVICE_ID = 'debugHelperService'; export const IDebugHelperService = createDecorator(DEBUG_HELPER_SERVICE_ID); -/** - * This interface represents a single command line argument split into a "prefix" and a "path" half. - * The optional "prefix" contains arbitrary text and the optional "path" contains a file system path. - * Concatenating both results in the original command line argument. - */ -export interface ILaunchVSCodeArgument { - prefix?: string; - path?: string; -} - -export interface ILaunchVSCodeArguments { - args: ILaunchVSCodeArgument[]; - env?: { [key: string]: string | null; }; -} - export interface IDebugHelperService { _serviceBrand: any; createTerminalLauncher(instantiationService: IInstantiationService): ITerminalLauncher; - launchVsCode(vscodeArgs: ILaunchVSCodeArguments): Promise; - createTelemetryService(configurationService: IConfigurationService, args: string[]): TelemetryService | undefined; } diff --git a/src/vs/workbench/contrib/debug/node/debugHelperService.ts b/src/vs/workbench/contrib/debug/node/debugHelperService.ts index cfbc3539189..76fcf6e30e8 100644 --- a/src/vs/workbench/contrib/debug/node/debugHelperService.ts +++ b/src/vs/workbench/contrib/debug/node/debugHelperService.ts @@ -3,13 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as objects from 'vs/base/common/objects'; -import { isUri } from 'vs/workbench/contrib/debug/common/debugUtils'; -import * as cp from 'child_process'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { TerminalLauncher } from 'vs/workbench/contrib/debug/node/terminalSupport'; -import { ITerminalLauncher, IDebugHelperService, ILaunchVSCodeArguments } from 'vs/workbench/contrib/debug/common/debug'; +import { ITerminalLauncher, IDebugHelperService } from 'vs/workbench/contrib/debug/common/debug'; import { Client as TelemetryClient } from 'vs/base/parts/ipc/node/ipc.cp'; import { TelemetryAppenderClient } from 'vs/platform/telemetry/node/telemetryIpc'; import { getPathFromAmdModule } from 'vs/base/common/amd'; @@ -21,7 +17,6 @@ export class NodeDebugHelperService implements IDebugHelperService { _serviceBrand: any; constructor( - @IEnvironmentService private readonly environmentService: IEnvironmentService ) { } @@ -29,82 +24,6 @@ export class NodeDebugHelperService implements IDebugHelperService { return instantiationService.createInstance(TerminalLauncher); } - launchVsCode(vscodeArgs: ILaunchVSCodeArguments): Promise { - - const spawnOpts: cp.SpawnOptions = { - detached: false // https://github.com/Microsoft/vscode/issues/57018 - }; - - if (vscodeArgs.env) { - // merge environment variables into a copy of the process.env - const envArgs = objects.mixin(objects.mixin({}, process.env), vscodeArgs.env); - // and delete some if necessary - Object.keys(envArgs).filter(k => envArgs[k] === null).forEach(key => delete envArgs[key]); - spawnOpts.env = envArgs; - } - - let spawnArgs = vscodeArgs.args.map(a => { - if ((a.prefix === '--file-uri=' || a.prefix === '--folder-uri=') && !isUri(a.path)) { - return (a.path || ''); - } - return (a.prefix || '') + (a.path || ''); - }); - - let runtimeExecutable = this.environmentService['execPath']; - if (!runtimeExecutable) { - return Promise.reject(new Error(`VS Code executable unknown`)); - } - - // if VS Code runs out of sources, add the VS Code workspace path as the first argument so that Electron turns into VS Code - const electronIdx = runtimeExecutable.indexOf(process.platform === 'win32' ? '\\.build\\electron\\' : '/.build/electron/'); - if (electronIdx > 0) { - // guess the VS Code workspace path from the executable - const vscodeWorkspacePath = runtimeExecutable.substr(0, electronIdx); - - // only add VS Code workspace path if user hasn't already added that path as a (folder) argument - const x = spawnArgs.filter(a => a.indexOf(vscodeWorkspacePath) === 0); - if (x.length === 0) { - spawnArgs.unshift(vscodeWorkspacePath); - } - } - - // Workaround for bug Microsoft/vscode#45832 - if (process.platform === 'win32' && runtimeExecutable.indexOf(' ') > 0) { - let foundArgWithSpace = false; - - // check whether there is one arg with a space - const args: string[] = []; - for (const a of spawnArgs) { - if (a.indexOf(' ') > 0) { - args.push(`"${a}"`); - foundArgWithSpace = true; - } else { - args.push(a); - } - } - - if (foundArgWithSpace) { - spawnArgs = args; - runtimeExecutable = `"${runtimeExecutable}"`; - spawnOpts.shell = true; - } - } - - return new Promise((resolve, reject) => { - const process = cp.spawn(runtimeExecutable, spawnArgs, spawnOpts); - process.on('error', error => { - reject(error); - }); - process.on('exit', code => { - if (code === 0) { - resolve(process.pid); - } else { - reject(new Error(`VS Code exited with ${code}`)); - } - }); - }); - } - createTelemetryService(configurationService: IConfigurationService, args: string[]): TelemetryService | undefined { const client = new TelemetryClient( diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index 209a39fd4a5..01b3c98401c 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -38,7 +38,7 @@ import { TestConfigurationService } from 'vs/platform/configuration/test/common/ import { IWindowsService, IWindowService, INativeOpenDialogOptions, IEnterWorkspaceResult, IMessageBoxResult, MenuBarVisibility, IURIToOpen, IOpenSettings, IWindowConfiguration } 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 { IEnvironmentService, ParsedArgs } 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'; @@ -1447,6 +1447,10 @@ export class TestWindowsService implements IWindowsService { return Promise.resolve(); } + openExtensionDevelopmentHostWindow(args: ParsedArgs): Promise { + return Promise.resolve(); + } + getWindows(): Promise<{ id: number; workspace?: IWorkspaceIdentifier; folderUri?: ISingleFolderWorkspaceIdentifier; title: string; filename?: string; }[]> { throw new Error('not implemented'); } From e83bb4ba9a6134996d5848d81fbe40ab39069caa Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Thu, 20 Jun 2019 18:04:34 +0200 Subject: [PATCH 0458/1449] EH debugging: support multiple files and folders --- .../contrib/debug/browser/rawDebugSession.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts b/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts index 7839a60d19e..b4828af8340 100644 --- a/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts +++ b/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts @@ -584,9 +584,21 @@ export class RawDebugSession { if ((key === 'file-uri' || key === 'folder-uri') && !isUri(arg.path)) { value = URI.file(value).toString(); - } - args[key] = value; + const v = args[key]; + if (v) { + if (Array.isArray(v)) { + v.push(value); + } else { + args[key] = [v, value]; + } + } else { + args[key] = value; + } + + } else { + args[key] = value; + } } else { args._.push(a2); From 7970fddc5b3f9b79750b59e54dbf0561101f963a Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 20 Jun 2019 09:30:47 -0700 Subject: [PATCH 0459/1449] Update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0e3cb54f607..f25abb8d431 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "3db6aad4b3378955f6f369ae4a627d68953ed919", + "distro": "cb72005ab15a4d369209542fbfa4e64c06db2111", "author": { "name": "Microsoft Corporation" }, From 95fa2fe80d957ac6547e92f395a1aafed474b13b Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 20 Jun 2019 09:34:17 -0700 Subject: [PATCH 0460/1449] xterm@3.15.0-beta50 Diff: https://github.com/xtermjs/xterm.js/compare/846a189...96eafd3 Changes: - Publish improvements - Layering/strict updates --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index f25abb8d431..f897c765b83 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "vscode-ripgrep": "^1.2.5", "vscode-sqlite3": "4.0.7", "vscode-textmate": "^4.1.1", - "xterm": "3.15.0-beta42", + "xterm": "3.15.0-beta50", "xterm-addon-search": "0.1.0-beta6", "xterm-addon-web-links": "0.1.0-beta10", "yauzl": "^2.9.2", diff --git a/yarn.lock b/yarn.lock index 4d4f75a05f7..107c1f0fd37 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9802,10 +9802,10 @@ xterm-addon-web-links@0.1.0-beta10: resolved "https://registry.yarnpkg.com/xterm-addon-web-links/-/xterm-addon-web-links-0.1.0-beta10.tgz#610fa9773a2a5ccd41c1c83ba0e2dd2c9eb66a23" integrity sha512-xfpjy0V6bB4BR44qIgZQPoCMVakxb65gMscPkHpO//QxvUxKzabV3dxOsIbeZRFkUGsWTFlvz2OoaBLoNtv5gg== -xterm@3.15.0-beta42: - version "3.15.0-beta42" - resolved "https://registry.yarnpkg.com/xterm/-/xterm-3.15.0-beta42.tgz#8ed1f2928d46cb5f941dc39e4116782787a4b8a6" - integrity sha512-1hXcdnrhAsvmyTrcR+cz/B3O/Bv9oRRg4lPrOVoJkW+0otRfljJ5CHMfaL0uiZwphNoWpkHXrzApsY5GzS8o5Q== +xterm@3.15.0-beta50: + version "3.15.0-beta50" + resolved "https://registry.yarnpkg.com/xterm/-/xterm-3.15.0-beta50.tgz#6413057fe36ff5808a41eba337f83076144d5c10" + integrity sha512-LAJ8kP3U8oXnVR3uaL4NxNFKcFDt3Zoec53hgYppwW8P5LdmL/dc0eDpgqiEsPLx4GgD37d8J92EcoMzKs2vVw== y18n@^3.2.1: version "3.2.1" From 62037fb7bcf25914ecb0cfee1a7290ed8af74622 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 20 Jun 2019 10:03:21 -0700 Subject: [PATCH 0461/1449] Fire onDidChangeMaximumDimension when dimensions are set Fixes #73496 --- .../api/browser/mainThreadTerminalService.ts | 5 +++++ src/vs/workbench/api/common/extHost.protocol.ts | 1 + .../api/node/extHostTerminalService.ts | 5 +++++ .../terminal/browser/terminalInstance.ts | 17 ++++++++++++++--- .../contrib/terminal/common/terminal.ts | 7 ++++--- .../contrib/terminal/common/terminalService.ts | 3 +++ 6 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index ff3183d0712..a607cab17b6 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -42,6 +42,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape this._toDispose.push(_terminalService.onInstanceDisposed(instance => this._onTerminalDisposed(instance))); this._toDispose.push(_terminalService.onInstanceProcessIdReady(instance => this._onTerminalProcessIdReady(instance))); this._toDispose.push(_terminalService.onInstanceDimensionsChanged(instance => this._onInstanceDimensionsChanged(instance))); + this._toDispose.push(_terminalService.onInstanceMaximumDimensionsChanged(instance => this._onInstanceMaximumDimensionsChanged(instance))); this._toDispose.push(_terminalService.onInstanceRequestExtHostProcess(request => this._onTerminalRequestExtHostProcess(request))); this._toDispose.push(_terminalService.onActiveInstanceChanged(instance => this._onActiveTerminalChanged(instance ? instance.id : null))); this._toDispose.push(_terminalService.onInstanceTitleChanged(instance => this._onTitleChanged(instance.id, instance.title))); @@ -226,6 +227,10 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape this._proxy.$acceptTerminalDimensions(instance.id, instance.cols, instance.rows); } + private _onInstanceMaximumDimensionsChanged(instance: ITerminalInstance): void { + this._proxy.$acceptTerminalMaximumDimensions(instance.id, instance.maxCols, instance.maxRows); + } + private _onTerminalRequestExtHostProcess(request: ITerminalProcessExtHostRequest): void { // Only allow processes on remote ext hosts if (!this._remoteAuthority) { diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index df31280ffc8..58ec9762b80 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -1126,6 +1126,7 @@ export interface ExtHostTerminalServiceShape { $acceptTerminalRendererInput(id: number, data: string): void; $acceptTerminalTitleChange(id: number, name: string): void; $acceptTerminalDimensions(id: number, cols: number, rows: number): void; + $acceptTerminalMaximumDimensions(id: number, cols: number, rows: number): void; $createProcess(id: number, shellLaunchConfig: ShellLaunchConfigDto, activeWorkspaceRootUri: UriComponents, cols: number, rows: number, isWorkspaceShellAllowed: boolean): void; $acceptProcessInput(id: number, data: string): void; $acceptProcessResize(id: number, cols: number, rows: number): void; diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index e935ccdf20d..d0d8920c25c 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -409,6 +409,11 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { }); } } + }); + } + + public $acceptTerminalMaximumDimensions(id: number, cols: number, rows: number): void { + this._getTerminalByIdEventually(id).then(() => { // When a terminal's dimensions change, a renderer's _maximum_ dimensions change const renderer = this._getTerminalRendererById(id); if (renderer) { diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index 9584762836c..95c3afd0445 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -201,6 +201,8 @@ export class TerminalInstance implements ITerminalInstance { } return this._rows; } + public get maxCols(): number { return this._cols; } + public get maxRows(): number { return this._rows; } // TODO: Ideally processId would be merged into processReady public get processId(): number | undefined { return this._processManager ? this._processManager.shellProcessId : undefined; } // TODO: How does this work with detached processes? @@ -232,6 +234,8 @@ export class TerminalInstance implements ITerminalInstance { public get onRequestExtHostProcess(): Event { return this._onRequestExtHostProcess.event; } private readonly _onDimensionsChanged = new Emitter(); public get onDimensionsChanged(): Event { return this._onDimensionsChanged.event; } + private readonly _onMaximumDimensionsChanged = new Emitter(); + public get onMaximumDimensionsChanged(): Event { return this._onMaximumDimensionsChanged.event; } private readonly _onFocus = new Emitter(); public get onFocus(): Event { return this._onFocus.event; } @@ -349,12 +353,20 @@ export class TerminalInstance implements ITerminalInstance { } else { scaledCharWidth = Math.floor(font.charWidth * window.devicePixelRatio) + font.letterSpacing; } - this._cols = Math.max(Math.floor(scaledWidthAvailable / scaledCharWidth), 1); + const newCols = Math.max(Math.floor(scaledWidthAvailable / scaledCharWidth), 1); const scaledHeightAvailable = dimension.height * window.devicePixelRatio; const scaledCharHeight = Math.ceil(font.charHeight * window.devicePixelRatio); const scaledLineHeight = Math.floor(scaledCharHeight * font.lineHeight); - this._rows = Math.max(Math.floor(scaledHeightAvailable / scaledLineHeight), 1); + const newRows = Math.max(Math.floor(scaledHeightAvailable / scaledLineHeight), 1); + + if (this._cols !== newCols || this._rows !== newRows) { + this._cols = newCols; + this._rows = newRows; + if (this.shellLaunchConfig.isRendererOnly) { + this._onMaximumDimensionsChanged.fire(); + } + } return dimension.width; } @@ -1238,7 +1250,6 @@ export class TerminalInstance implements ITerminalInstance { return; } - const terminalWidth = this._evaluateColsAndRows(dimension.width, dimension.height); if (!terminalWidth) { return; diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index 2c49b9dff8e..a241d24ace0 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -221,6 +221,7 @@ export interface ITerminalService { onInstanceDisposed: Event; onInstanceProcessIdReady: Event; onInstanceDimensionsChanged: Event; + onInstanceMaximumDimensionsChanged: Event; onInstanceRequestExtHostProcess: Event; onInstancesChanged: Event; onInstanceTitleChanged: Event; @@ -377,6 +378,8 @@ export interface ITerminalInstance { readonly cols: number; readonly rows: number; + readonly maxCols: number; + readonly maxRows: number; /** * The process ID of the shell process, this is undefined when there is no process associated @@ -395,12 +398,10 @@ export interface ITerminalInstance { onDisposed: Event; onFocused: Event; - onProcessIdReady: Event; - onRequestExtHostProcess: Event; - onDimensionsChanged: Event; + onMaximumDimensionsChanged: Event; onFocus: Event; diff --git a/src/vs/workbench/contrib/terminal/common/terminalService.ts b/src/vs/workbench/contrib/terminal/common/terminalService.ts index 2dd2c47180c..1f8e90b6407 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalService.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalService.ts @@ -57,6 +57,8 @@ export abstract class TerminalService implements ITerminalService { public get onInstanceRequestExtHostProcess(): Event { return this._onInstanceRequestExtHostProcess.event; } protected readonly _onInstanceDimensionsChanged = new Emitter(); public get onInstanceDimensionsChanged(): Event { return this._onInstanceDimensionsChanged.event; } + protected readonly _onInstanceMaximumDimensionsChanged = new Emitter(); + public get onInstanceMaximumDimensionsChanged(): Event { return this._onInstanceMaximumDimensionsChanged.event; } protected readonly _onInstancesChanged = new Emitter(); public get onInstancesChanged(): Event { return this._onInstancesChanged.event; } protected readonly _onInstanceTitleChanged = new Emitter(); @@ -384,6 +386,7 @@ export abstract class TerminalService implements ITerminalService { instance.addDisposable(instance.onTitleChanged(this._onInstanceTitleChanged.fire, this._onInstanceTitleChanged)); instance.addDisposable(instance.onProcessIdReady(this._onInstanceProcessIdReady.fire, this._onInstanceProcessIdReady)); instance.addDisposable(instance.onDimensionsChanged(() => this._onInstanceDimensionsChanged.fire(instance))); + instance.addDisposable(instance.onMaximumDimensionsChanged(() => this._onInstanceMaximumDimensionsChanged.fire(instance))); instance.addDisposable(instance.onFocus(this._onActiveInstanceChanged.fire, this._onActiveInstanceChanged)); } From 338b466e9504af0663e9ea66531459ea3e55416f Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 19 Jun 2019 11:08:17 -0700 Subject: [PATCH 0462/1449] Fix potential race --- .../workbench/contrib/webview/browser/pre/main.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index 971cbc0de23..b46a63a7c8f 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -122,15 +122,15 @@ if (navigator.serviceWorker) { navigator.serviceWorker.register('service-worker.js'); - navigator.serviceWorker.ready.then(registration => { - function forwardFromHostToWorker(channel) { - host.onMessage(channel, event => { + function forwardFromHostToWorker(channel) { + host.onMessage(channel, event => { + navigator.serviceWorker.ready.then(registration => { registration.active.postMessage({ channel: channel, data: event.data.args }); }); - } - forwardFromHostToWorker('did-load-resource'); - forwardFromHostToWorker('did-load-localhost'); - }); + }); + } + forwardFromHostToWorker('did-load-resource'); + forwardFromHostToWorker('did-load-localhost'); navigator.serviceWorker.addEventListener('message', event => { if (['load-resource', 'load-localhost'].includes(event.data.channel)) { From 0112fd31bcc827e0cd53cfdbc90033add07e5fda Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 19 Jun 2019 13:48:23 -0700 Subject: [PATCH 0463/1449] Delete cached service worker entries after a short timeout --- .../webview/browser/pre/service-worker.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/service-worker.js b/src/vs/workbench/contrib/webview/browser/pre/service-worker.js index d6154ba645d..d36d3cca24e 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/service-worker.js +++ b/src/vs/workbench/contrib/webview/browser/pre/service-worker.js @@ -7,6 +7,8 @@ */ const resourceRoot = '/vscode-resource'; +const resolveTimeout = 30000; + /** * @template T * @typedef {{ @@ -36,6 +38,7 @@ class RequestStore { /** * @param {string} webviewId * @param {string} path + * @returns {Promise} */ create(webviewId, path) { const existing = this.get(webviewId, path); @@ -44,7 +47,17 @@ class RequestStore { } let resolve; const promise = new Promise(r => resolve = r); - this.map.set(this._key(webviewId, path), { resolve, promise }); + const entry = { resolve, promise }; + this.map.set(this._key(webviewId, path), entry); + + const dispose = () => { + clearTimeout(timeout); + const existing = this.get(webviewId, path); + if (existing === entry) { + return this.map.delete(this._key(webviewId, path)); + } + }; + const timeout = setTimeout(dispose, resolveTimeout); return promise; } @@ -91,7 +104,6 @@ const notFoundResponse = new Response('Not Found', { status: 404, }); - self.addEventListener('message', (event) => { switch (event.data.channel) { case 'did-load-resource': From 7679015e6f482b1733131d729d3dbfdb26579d0a Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 19 Jun 2019 15:51:50 -0700 Subject: [PATCH 0464/1449] Fix webview developer command not being registered --- .../electron-browser/webview.contribution.ts | 13 ++++++++++++- .../electron-browser/{pre => }/webviewCommands.ts | 12 +----------- 2 files changed, 13 insertions(+), 12 deletions(-) rename src/vs/workbench/contrib/webview/electron-browser/{pre => }/webviewCommands.ts (60%) diff --git a/src/vs/workbench/contrib/webview/electron-browser/webview.contribution.ts b/src/vs/workbench/contrib/webview/electron-browser/webview.contribution.ts index 7b7b2c2dc76..cd912708989 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webview.contribution.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webview.contribution.ts @@ -3,8 +3,19 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { IWebviewService } from 'vs/workbench/contrib/webview/common/webview'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; +import { IWebviewService, webviewDeveloperCategory } from 'vs/workbench/contrib/webview/common/webview'; import { WebviewService } from 'vs/workbench/contrib/webview/electron-browser/webviewService'; +import { OpenWebviewDeveloperToolsAction } from 'vs/workbench/contrib/webview/electron-browser/webviewCommands'; registerSingleton(IWebviewService, WebviewService, true); + +const actionRegistry = Registry.as(ActionExtensions.WorkbenchActions); + +actionRegistry.registerWorkbenchAction( + new SyncActionDescriptor(OpenWebviewDeveloperToolsAction, OpenWebviewDeveloperToolsAction.ID, OpenWebviewDeveloperToolsAction.LABEL), + OpenWebviewDeveloperToolsAction.ALIAS, + webviewDeveloperCategory); diff --git a/src/vs/workbench/contrib/webview/electron-browser/pre/webviewCommands.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewCommands.ts similarity index 60% rename from src/vs/workbench/contrib/webview/electron-browser/pre/webviewCommands.ts rename to src/vs/workbench/contrib/webview/electron-browser/webviewCommands.ts index 40ce157e4c4..e239b767855 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/pre/webviewCommands.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewCommands.ts @@ -5,13 +5,10 @@ import { Action } from 'vs/base/common/actions'; import * as nls from 'vs/nls'; -import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; -import { Registry } from 'vs/platform/registry/common/platform'; -import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; -import { webviewDeveloperCategory } from 'vs/workbench/contrib/webview/common/webview'; export class OpenWebviewDeveloperToolsAction extends Action { static readonly ID = 'workbench.action.webview.openDeveloperTools'; + static readonly ALIAS = 'Open Webview Developer Tools'; static readonly LABEL = nls.localize('openToolsLabel', "Open Webview Developer Tools"); public constructor(id: string, label: string) { @@ -30,10 +27,3 @@ export class OpenWebviewDeveloperToolsAction extends Action { return Promise.resolve(true); } } - -const actionRegistry = Registry.as(ActionExtensions.WorkbenchActions); - -actionRegistry.registerWorkbenchAction( - new SyncActionDescriptor(OpenWebviewDeveloperToolsAction, OpenWebviewDeveloperToolsAction.ID, OpenWebviewDeveloperToolsAction.LABEL), - 'Open Webview Developer Tools', - webviewDeveloperCategory); From 8b93c01655639f80a71caff226ad3048e7cc2be0 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 20 Jun 2019 00:18:25 -0700 Subject: [PATCH 0465/1449] Re-queue canceled geterr requests before remaining buffers We should give higher priority to files that have previously had geterr triggered on them but did not have their request completed --- .../src/features/bufferSyncSupport.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/extensions/typescript-language-features/src/features/bufferSyncSupport.ts b/extensions/typescript-language-features/src/features/bufferSyncSupport.ts index e730f8e8be6..25ffb4c81bd 100644 --- a/extensions/typescript-language-features/src/features/bufferSyncSupport.ts +++ b/extensions/typescript-language-features/src/features/bufferSyncSupport.ts @@ -470,20 +470,20 @@ export default class BufferSyncSupport extends Disposable { private sendPendingDiagnostics(): void { const orderedFileSet = this.pendingDiagnostics.getOrderedFileSet(); + if (this.pendingGetErr) { + this.pendingGetErr.cancel(); + + for (const file of this.pendingGetErr.files.entries) { + orderedFileSet.set(file.resource, undefined); + } + } + // Add all open TS buffers to the geterr request. They might be visible for (const buffer of this.syncedBuffers.values) { orderedFileSet.set(buffer.resource, undefined); } if (orderedFileSet.size) { - if (this.pendingGetErr) { - this.pendingGetErr.cancel(); - - for (const file of this.pendingGetErr.files.entries) { - orderedFileSet.set(file.resource, undefined); - } - } - const getErr = this.pendingGetErr = GetErrRequest.executeGetErrRequest(this.client, orderedFileSet, () => { if (this.pendingGetErr === getErr) { this.pendingGetErr = undefined; From 247d61f4f10062f169211eb38d465b9e09dce756 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 20 Jun 2019 10:27:22 -0700 Subject: [PATCH 0466/1449] Remove log uploader Fixes #75748 --- resources/completions/bash/code | 2 +- resources/completions/zsh/_code | 1 - src/vs/code/electron-main/logUploader.ts | 153 ------------------ src/vs/code/electron-main/main.ts | 20 +-- src/vs/code/node/cli.ts | 6 +- .../environment/common/environment.ts | 1 - src/vs/platform/environment/node/argv.ts | 1 - 7 files changed, 4 insertions(+), 180 deletions(-) delete mode 100644 src/vs/code/electron-main/logUploader.ts diff --git a/resources/completions/bash/code b/resources/completions/bash/code index e377c5d24e2..f40963db05c 100644 --- a/resources/completions/bash/code +++ b/resources/completions/bash/code @@ -50,7 +50,7 @@ _code() --uninstall-extension --enable-proposed-api --verbose --log -s --status -p --performance --prof-startup --disable-extensions --disable-extension --inspect-extensions - --inspect-brk-extensions --disable-gpu --upload-logs + --inspect-brk-extensions --disable-gpu --max-memory=' -- "$cur") ) [[ $COMPREPLY == *= ]] && compopt -o nospace return diff --git a/resources/completions/zsh/_code b/resources/completions/zsh/_code index 9579cffb2f6..8c4415ac59f 100644 --- a/resources/completions/zsh/_code +++ b/resources/completions/zsh/_code @@ -30,7 +30,6 @@ arguments=( '--inspect-extensions[allow debugging and profiling of extensions]' '--inspect-brk-extensions[allow debugging and profiling of extensions with the extension host being paused after start]' '--disable-gpu[disable GPU hardware acceleration]' - '--upload-logs[upload logs from current session to a secure endpoint]:confirm:(iConfirmLogsUpload)' '--max-memory=[max memory size for a window (in Mbytes)]:size (Mbytes)' '*:file or directory:_files' ) diff --git a/src/vs/code/electron-main/logUploader.ts b/src/vs/code/electron-main/logUploader.ts deleted file mode 100644 index 4e601fe8a65..00000000000 --- a/src/vs/code/electron-main/logUploader.ts +++ /dev/null @@ -1,153 +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 os from 'os'; -import * as cp from 'child_process'; -import * as fs from 'fs'; - -import * as path from 'vs/base/common/path'; -import { localize } from 'vs/nls'; -import product from 'vs/platform/product/node/product'; -import { IRequestService } from 'vs/platform/request/node/request'; -import { IRequestContext } from 'vs/base/node/request'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { CancellationToken } from 'vs/base/common/cancellation'; -import { ILaunchService } from 'vs/platform/launch/electron-main/launchService'; - -interface PostResult { - readonly blob_id: string; -} - -class Endpoint { - private constructor( - readonly url: string - ) { } - - static getFromProduct(): Endpoint | undefined { - const logUploaderUrl = product.logUploaderUrl; - return logUploaderUrl ? new Endpoint(logUploaderUrl) : undefined; - } -} - -export async function uploadLogs( - launchService: ILaunchService, - requestService: IRequestService, - environmentService: IEnvironmentService -): Promise { - const endpoint = Endpoint.getFromProduct(); - if (!endpoint) { - console.error(localize('invalidEndpoint', 'Invalid log uploader endpoint')); - return; - } - - const logsPath = await launchService.getLogsPath(); - - if (await promptUserToConfirmLogUpload(logsPath, environmentService)) { - console.log(localize('beginUploading', 'Uploading...')); - const outZip = await zipLogs(logsPath); - const result = await postLogs(endpoint, outZip, requestService); - console.log(localize('didUploadLogs', 'Upload successful! Log file ID: {0}', result.blob_id)); - } -} - -function promptUserToConfirmLogUpload( - logsPath: string, - environmentService: IEnvironmentService -): boolean { - const confirmKey = 'iConfirmLogsUpload'; - if ((environmentService.args['upload-logs'] || '').toLowerCase() === confirmKey.toLowerCase()) { - return true; - } else { - const message = localize('logUploadPromptHeader', 'You are about to upload your session logs to a secure Microsoft endpoint that only Microsoft\'s members of the VS Code team can access.') - + '\n\n' + localize('logUploadPromptBody', 'Session logs may contain personal information such as full paths or file contents. Please review and redact your session log files here: \'{0}\'', logsPath) - + '\n\n' + localize('logUploadPromptBodyDetails', 'By continuing you confirm that you have reviewed and redacted your session log files and that you agree to Microsoft using them to debug VS Code.') - + '\n\n' + localize('logUploadPromptAcceptInstructions', 'Please run code with \'--upload-logs={0}\' to proceed with upload', confirmKey); - console.log(message); - return false; - } -} - -async function postLogs( - endpoint: Endpoint, - outZip: string, - requestService: IRequestService -): Promise { - const dotter = setInterval(() => console.log('.'), 5000); - let result: IRequestContext; - try { - result = await requestService.request({ - url: endpoint.url, - type: 'POST', - data: Buffer.from(fs.readFileSync(outZip)).toString('base64'), - headers: { - 'Content-Type': 'application/zip' - } - }, CancellationToken.None); - } catch (e) { - clearInterval(dotter); - console.log(localize('postError', 'Error posting logs: {0}', e)); - throw e; - } - - return new Promise((resolve, reject) => { - const parts: Buffer[] = []; - result.stream.on('data', data => { - parts.push(data); - }); - - result.stream.on('end', () => { - clearInterval(dotter); - try { - const response = Buffer.concat(parts).toString('utf-8'); - if (result.res.statusCode === 200) { - resolve(JSON.parse(response)); - } else { - const errorMessage = localize('responseError', 'Error posting logs. Got {0} — {1}', result.res.statusCode, response); - console.log(errorMessage); - reject(new Error(errorMessage)); - } - } catch (e) { - console.log(localize('parseError', 'Error parsing response')); - reject(e); - } - }); - }); -} - -function zipLogs( - logsPath: string -): Promise { - const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'vscode-log-upload')); - const outZip = path.join(tempDir, 'logs.zip'); - return new Promise((resolve, reject) => { - doZip(logsPath, outZip, tempDir, (err, stdout, stderr) => { - if (err) { - console.error(localize('zipError', 'Error zipping logs: {0}', err.message)); - reject(err); - } else { - resolve(outZip); - } - }); - }); -} - -function doZip( - logsPath: string, - outZip: string, - tempDir: string, - callback: (error: Error, stdout: string, stderr: string) => void -) { - switch (os.platform()) { - case 'win32': - // Copy directory first to avoid file locking issues - const sub = path.join(tempDir, 'sub'); - return cp.execFile('powershell', ['-Command', - `[System.IO.Directory]::CreateDirectory("${sub}"); Copy-Item -recurse "${logsPath}" "${sub}"; Compress-Archive -Path "${sub}" -DestinationPath "${outZip}"`], - { cwd: logsPath }, - callback); - default: - return cp.execFile('zip', ['-r', outZip, '.'], { cwd: logsPath }, callback); - } -} diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index e881d6a1e2f..be40bfa20d0 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -35,7 +35,6 @@ import { mnemonicButtonLabel } from 'vs/base/common/labels'; import { SpdLogService } from 'vs/platform/log/node/spdlogService'; import { IDiagnosticsService, DiagnosticsService } from 'vs/platform/diagnostics/electron-main/diagnosticsService'; import { BufferLogService } from 'vs/platform/log/common/bufferLog'; -import { uploadLogs } from 'vs/code/electron-main/logUploader'; import { setUnexpectedErrorHandler } from 'vs/base/common/errors'; import { IThemeMainService, ThemeMainService } from 'vs/platform/theme/electron-main/themeMainService'; import { Client } from 'vs/base/parts/ipc/common/ipc.net'; @@ -263,7 +262,7 @@ class CodeMain { // Skip this if we are running with --wait where it is expected that we wait for a while. // Also skip when gathering diagnostics (--status) which can take a longer time. let startupWarningDialogHandle: NodeJS.Timeout | undefined = undefined; - if (!environmentService.wait && !environmentService.status && !environmentService.args['upload-logs']) { + if (!environmentService.wait && !environmentService.status) { startupWarningDialogHandle = setTimeout(() => { this.showStartupWarningDialog( localize('secondInstanceNoResponse', "Another instance of {0} is running but not responding", product.nameShort), @@ -285,16 +284,6 @@ class CodeMain { }); } - // Log uploader - if (typeof environmentService.args['upload-logs'] !== 'undefined') { - return instantiationService.invokeFunction(async accessor => { - await uploadLogs(launchClient, accessor.get(IRequestService), environmentService); - - throw new ExpectedError(); - }); - } - - // Windows: allow to set foreground if (platform.isWindows) { await this.windowsAllowSetForegroundWindow(launchClient, logService); @@ -322,13 +311,6 @@ class CodeMain { throw new ExpectedError('Terminating...'); } - // Log uploader usage info - if (typeof environmentService.args['upload-logs'] !== 'undefined') { - logService.warn('Warning: The --upload-logs argument can only be used if Code is already running. Please run it again after Code has started.'); - - throw new ExpectedError('Terminating...'); - } - // dock might be hidden at this case due to a retry if (platform.isMacintosh) { app.dock.show(); diff --git a/src/vs/code/node/cli.ts b/src/vs/code/node/cli.ts index e434b71a863..45f4ff7d670 100644 --- a/src/vs/code/node/cli.ts +++ b/src/vs/code/node/cli.ts @@ -125,7 +125,7 @@ export async function main(argv: string[]): Promise { const processCallbacks: ((child: ChildProcess) => Promise)[] = []; - const verbose = args.verbose || args.status || typeof args['upload-logs'] !== 'undefined'; + const verbose = args.verbose || args.status; if (verbose) { env['ELECTRON_ENABLE_LOGGING'] = '1'; @@ -350,9 +350,7 @@ export async function main(argv: string[]): Promise { env }; - if (typeof args['upload-logs'] !== 'undefined') { - options['stdio'] = ['pipe', 'pipe', 'pipe']; - } else if (!verbose) { + if (!verbose) { options['stdio'] = 'ignore'; } diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index 189813daf8e..210ac5080a3 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -64,7 +64,6 @@ export interface ParsedArgs { 'max-memory'?: string; 'file-write'?: boolean; 'file-chmod'?: boolean; - 'upload-logs'?: string; 'driver'?: string; 'driver-verbose'?: boolean; remote?: string; diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts index b3e99e2b808..b53a29f370a 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts @@ -61,7 +61,6 @@ export const options: Option[] = [ { id: 'inspect-extensions', type: 'string', deprecates: 'debugPluginHost', args: 'port', cat: 't', description: localize('inspect-extensions', "Allow debugging and profiling of extensions. Check the developer tools for the connection URI.") }, { id: 'inspect-brk-extensions', type: 'string', deprecates: 'debugBrkPluginHost', args: 'port', cat: 't', description: localize('inspect-brk-extensions', "Allow debugging and profiling of extensions with the extension host being paused after start. Check the developer tools for the connection URI.") }, { id: 'disable-gpu', type: 'boolean', cat: 't', description: localize('disableGPU', "Disable GPU hardware acceleration.") }, - { id: 'upload-logs', type: 'string', cat: 't', description: localize('uploadLogs', "Uploads logs from current session to a secure endpoint.") }, { id: 'max-memory', type: 'string', cat: 't', description: localize('maxMemory', "Max memory size for a window (in Mbytes).") }, { id: 'remote', type: 'string' }, From 03ae3200303ecfffd944c850adac9c6d377d5b68 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Thu, 20 Jun 2019 11:30:12 -0700 Subject: [PATCH 0467/1449] Use localized name for macOS keyboard layout --- package.json | 2 +- .../preferences/browser/keyboardLayoutPicker.ts | 2 +- .../browser/keyboardLayouts/de.darwin.ts | 2 +- .../browser/keyboardLayouts/en-ext.darwin.ts | 2 +- .../browser/keyboardLayouts/en-intl.darwin.ts | 2 +- .../browser/keyboardLayouts/en-uk.darwin.ts | 2 +- .../browser/keyboardLayouts/en.darwin.ts | 16 ++++++++-------- .../browser/keyboardLayouts/es.darwin.ts | 2 +- .../browser/keyboardLayouts/fr.darwin.ts | 2 +- .../browser/keyboardLayouts/it.darwin.ts | 2 +- .../browser/keyboardLayouts/jp-roman.darwin.ts | 2 +- .../browser/keyboardLayouts/jp.darwin.ts | 2 +- .../browser/keyboardLayouts/ko.darwin.ts | 2 +- .../browser/keyboardLayouts/pl.darwin.ts | 2 +- .../browser/keyboardLayouts/ru.darwin.ts | 2 +- .../browser/keyboardLayouts/sv.darwin.ts | 2 +- .../browser/keyboardLayouts/zh-hans.darwin.ts | 2 +- .../services/keybinding/common/keymapService.ts | 9 +++++++++ yarn.lock | 8 ++++---- 19 files changed, 37 insertions(+), 28 deletions(-) diff --git a/package.json b/package.json index f897c765b83..c9fcfda77b2 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "keytar": "4.2.1", "minimist": "1.2.0", "native-is-elevated": "^0.2.1", - "native-keymap": "1.2.5", + "native-keymap": "1.2.6", "native-watchdog": "1.0.0", "node-pty": "0.9.0-beta17", "onigasm-umd": "^2.2.2", diff --git a/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts b/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts index aeabf4a637f..05b9fb2069f 100644 --- a/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts +++ b/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts @@ -132,7 +132,7 @@ export class KeyboardLayoutPickerAction extends Action { // Offer to "Auto Detect" const autoDetectMode: IQuickPickItem = { label: nls.localize('autoDetect', "Auto Detect"), - description: isAutoDetect ? `(Current: ${parseKeyboardLayout(currentLayout).label})` : undefined, + description: isAutoDetect ? `Current: ${parseKeyboardLayout(currentLayout).label}` : undefined, picked: isAutoDetect ? true : undefined }; diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.darwin.ts index 573f8094664..6e870e8c472 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.darwin.ts @@ -7,7 +7,7 @@ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/bro import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.keylayout.German', lang: 'de' }, + { id: 'com.apple.keylayout.German', lang: 'de', localizedName: 'German' }, [], { KeyA: ['a', 'A', 'å', 'Å', 0], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-ext.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-ext.darwin.ts index 91bc1741acf..688281af2be 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-ext.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-ext.darwin.ts @@ -7,7 +7,7 @@ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/bro import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.keylayout.USExtended', lang: 'en' }, + { id: 'com.apple.keylayout.USExtended', lang: 'en', localizedName: 'ABC - Extended' }, [], { KeyA: ['a', 'A', '¯', '̄', 4], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-intl.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-intl.darwin.ts index cdbcf3bcfd2..a4f4a9e10b1 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-intl.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-intl.darwin.ts @@ -7,7 +7,7 @@ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/bro import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.keylayout.USInternational-PC', lang: 'en' }, + { id: 'com.apple.keylayout.USInternational-PC', lang: 'en', localizedName: 'U.S. International - PC' }, [], { KeyA: ['a', 'A', 'å', 'Å', 0], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-uk.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-uk.darwin.ts index e50f8830397..4bebc424b1f 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-uk.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-uk.darwin.ts @@ -8,7 +8,7 @@ import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.keylayout.British', lang: 'en' }, + { id: 'com.apple.keylayout.British', lang: 'en', localizedName: 'British' }, [], { KeyA: ['a', 'A', 'å', 'Å', 0], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.darwin.ts index fabf23b5864..19f435e3c0d 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.darwin.ts @@ -7,15 +7,15 @@ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/bro import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.keylayout.US', lang: 'en' }, + { id: 'com.apple.keylayout.US', lang: 'en', localizedName: 'U.S.' }, [ - { id: 'com.apple.keylayout.ABC', lang: 'en' }, - { id: 'com.sogou.inputmethod.sogou.pinyin', lang: 'zh-Hans' }, - { id: 'com.apple.inputmethod.Kotoeri.Roman', lang: 'en' }, - { id: 'com.apple.inputmethod.Kotoeri.Japanese', lang: 'ja' }, - { id: 'com.apple.keylayout.Australian', lang: 'en' }, - { id: 'com.apple.keylayout.Canadian', lang: 'en' }, - { id: 'com.apple.keylayout.Brazilian', lang: 'pt' }, + { id: 'com.apple.keylayout.ABC', lang: 'en', localizedName: 'ABC' }, + { id: 'com.sogou.inputmethod.sogou.pinyin', lang: 'zh-Hans', localizedName: 'Pinyin - Simplified' }, + { id: 'com.apple.inputmethod.Kotoeri.Roman', lang: 'en', localizedName: 'Romaji' }, + { id: 'com.apple.inputmethod.Kotoeri.Japanese', lang: 'ja', localizedName: 'Hiragana' }, + { id: 'com.apple.keylayout.Australian', lang: 'en', localizedName: 'Australian' }, + { id: 'com.apple.keylayout.Canadian', lang: 'en', localizedName: 'Canadian English' }, + { id: 'com.apple.keylayout.Brazilian', lang: 'pt', localizedName: 'Brazilian' }, ], { KeyA: ['a', 'A', 'å', 'Å', 0], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.darwin.ts index ecc0004d078..a7b3986364b 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.darwin.ts @@ -7,7 +7,7 @@ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/bro import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.keylayout.Spanish-ISO', lang: 'es' }, + { id: 'com.apple.keylayout.Spanish-ISO', lang: 'es', localizedName: 'Spanish - ISO' }, [], { KeyA: ['a', 'A', 'å', 'Å', 0], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.darwin.ts index 6b47127cec6..6bc78c8a2b2 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.darwin.ts @@ -7,7 +7,7 @@ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/bro import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.keylayout.French', lang: 'fr' }, + { id: 'com.apple.keylayout.French', lang: 'fr', localizedName: 'French' }, [], { KeyA: ['q', 'Q', '‡', 'Ω', 0], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/it.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/it.darwin.ts index 8cb9dc8f995..3d1c557e65e 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/it.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/it.darwin.ts @@ -7,7 +7,7 @@ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/bro import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.keylayout.Italian-Pro', lang: 'it' }, + { id: 'com.apple.keylayout.Italian-Pro', lang: 'it', localizedName: 'Italian' }, [], { KeyA: ['a', 'A', 'å', 'Å', 0], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/jp-roman.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/jp-roman.darwin.ts index 8f90af0bea9..578a479dc7e 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/jp-roman.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/jp-roman.darwin.ts @@ -7,7 +7,7 @@ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/bro import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.google.inputmethod.Japanese.Roman', lang: 'en' }, + { id: 'com.google.inputmethod.Japanese.Roman', lang: 'en', localizedName: 'Alphanumeric (Google)' }, [], { KeyA: ['a', 'A', '¯', '̄', 4], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/jp.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/jp.darwin.ts index a48e202b4fb..1835862116e 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/jp.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/jp.darwin.ts @@ -7,7 +7,7 @@ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/bro import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.inputmethod.Kotoeri.Japanese', lang: 'ja' }, + { id: 'com.apple.inputmethod.Kotoeri.Japanese', lang: 'ja', localizedName: 'Hiragana' }, [], { KeyA: ['a', 'A', 'å', 'Å', 0], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ko.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ko.darwin.ts index d79920103d6..e767bd03dcd 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ko.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ko.darwin.ts @@ -8,7 +8,7 @@ import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.inputmethod.Korean.2SetKorean', lang: 'ko' }, + { id: 'com.apple.inputmethod.Korean.2SetKorean', lang: 'ko', localizedName: '2-Set Korean' }, [], { KeyA: ['ㅁ', 'ㅁ', 'a', 'A', 0], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pl.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pl.darwin.ts index 75bac351170..8ae036710a2 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pl.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pl.darwin.ts @@ -7,7 +7,7 @@ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/bro import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.keylayout.PolishPro', lang: 'pl' }, + { id: 'com.apple.keylayout.PolishPro', lang: 'pl', localizedName: 'Polish - Pro' }, [], { KeyA: ['a', 'A', 'ą', 'Ą', 0], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.darwin.ts index afecb02810d..9140df78e5c 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.darwin.ts @@ -7,7 +7,7 @@ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/bro import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.keylayout.Russian', lang: 'ru' }, + { id: 'com.apple.keylayout.Russian', lang: 'ru', localizedName: 'Russian' }, [], { KeyA: ['ф', 'Ф', 'ƒ', 'ƒ', 0], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/sv.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/sv.darwin.ts index e5b57ab30a3..2c5f6f3e582 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/sv.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/sv.darwin.ts @@ -7,7 +7,7 @@ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/bro import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.keylayout.Swedish-Pro', lang: 'sv' }, + { id: 'com.apple.keylayout.Swedish-Pro', lang: 'sv', localizedName: 'Swedish - Pro' }, [], { KeyA: ['a', 'A', '', '◊', 0], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/zh-hans.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/zh-hans.darwin.ts index cf8bfbf0ac6..df8e9252fa6 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/zh-hans.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/zh-hans.darwin.ts @@ -7,7 +7,7 @@ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/bro import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.inputmethod.SCIM.ITABC', lang: 'zh-Hans' }, + { id: 'com.apple.inputmethod.SCIM.ITABC', lang: 'zh-Hans', localizedName: '搜狗拼音' }, [], { KeyA: ['a', 'A', 'å', 'Å', 0], diff --git a/src/vs/workbench/services/keybinding/common/keymapService.ts b/src/vs/workbench/services/keybinding/common/keymapService.ts index f70f8f20bc8..c9d5dbd9115 100644 --- a/src/vs/workbench/services/keybinding/common/keymapService.ts +++ b/src/vs/workbench/services/keybinding/common/keymapService.ts @@ -78,11 +78,13 @@ export interface ILinuxKeyboardLayoutInfo { "IKeyboardLayoutInfo" : { "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, "lang": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } + "localizedName": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } } */ export interface IMacKeyboardLayoutInfo { id: string; lang: string; + localizedName?: string; } export type IKeyboardLayoutInfo = IWindowsKeyboardLayoutInfo | ILinuxKeyboardLayoutInfo | IMacKeyboardLayoutInfo; @@ -137,6 +139,13 @@ export function parseKeyboardLayout(layout: IKeyboardLayoutInfo | null): { label if ((layout).id) { let macLayout = layout; + if (macLayout.localizedName) { + return { + label: macLayout.localizedName, + description: '' + }; + } + if (/^com\.apple\.keylayout\./.test(macLayout.id)) { return { label: macLayout.id.replace(/^com\.apple\.keylayout\./, '').replace(/-/, ' '), diff --git a/yarn.lock b/yarn.lock index 107c1f0fd37..acd186d7f7e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5951,10 +5951,10 @@ native-is-elevated@^0.2.1: resolved "https://registry.yarnpkg.com/native-is-elevated/-/native-is-elevated-0.2.1.tgz#70a2123a8575b9f624a3ef465d98cb74ae017385" integrity sha1-cKISOoV1ufYko+9GXZjLdK4Bc4U= -native-keymap@1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/native-keymap/-/native-keymap-1.2.5.tgz#1035a9417b9a9340cf8097763a43c76d588165a5" - integrity sha1-EDWpQXuak0DPgJd2OkPHbViBZaU= +native-keymap@1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/native-keymap/-/native-keymap-1.2.6.tgz#93d1b4c4ae0e9136bc14538cafe02c0bbe95bebf" + integrity sha512-8hEr6wNkb7OmGPFLFk1cAsnOt2Y3F4mtBffr8uOyX0kKOjr2JVetSt9TKjk0xyJw/B/HcEgMhXmjFKzGN+9JjA== native-watchdog@1.0.0: version "1.0.0" From 95b1cdb06afc5ec85e5a1ba048310c259475a9d8 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Thu, 20 Jun 2019 11:32:31 -0700 Subject: [PATCH 0468/1449] Update debug icons --- .../debug/browser/debug.contribution.ts | 4 +- ...erse-continue-inverse.svg => add-dark.svg} | 2 +- .../contrib/debug/browser/media/add-focus.svg | 1 - .../{reverse-continue.svg => add-hc.svg} | 2 +- .../debug/browser/media/add-inverse.svg | 1 - .../contrib/debug/browser/media/add-light.svg | 3 + .../contrib/debug/browser/media/add.svg | 1 - .../media/breakpoint-conditional-disabled.svg | 4 +- .../breakpoint-conditional-unverified.svg | 4 +- .../browser/media/breakpoint-conditional.svg | 4 +- .../browser/media/breakpoint-disabled.svg | 4 +- .../media/breakpoint-function-disabled.svg | 4 +- .../media/breakpoint-function-unverified.svg | 4 +- .../browser/media/breakpoint-function.svg | 4 +- .../debug/browser/media/breakpoint-hint.svg | 6 +- .../browser/media/breakpoint-log-disabled.svg | 4 +- .../media/breakpoint-log-unverified.svg | 4 +- .../debug/browser/media/breakpoint-log.svg | 4 +- .../browser/media/breakpoint-unsupported.svg | 4 +- .../browser/media/breakpoint-unverified.svg | 4 +- .../debug/browser/media/breakpoint.svg | 4 +- .../media/breakpoints-activate-inverse.svg | 1 - .../browser/media/breakpoints-activate.svg | 1 - .../debug/browser/media/close-all-dark.svg | 4 ++ .../debug/browser/media/close-all-hc.svg | 4 ++ .../debug/browser/media/close-all-light.svg | 4 ++ .../debug/browser/media/configure-dark.svg | 3 + .../debug/browser/media/configure-hc.svg | 3 + .../debug/browser/media/configure-inverse.svg | 1 - .../debug/browser/media/configure-light.svg | 3 + .../contrib/debug/browser/media/configure.svg | 1 - .../debug/browser/media/console-dark.svg | 5 ++ .../debug/browser/media/console-hc.svg | 5 ++ .../debug/browser/media/console-light.svg | 5 ++ .../debug/browser/media/continue-dark.svg | 4 ++ .../debug/browser/media/continue-inverse.svg | 1 - .../debug/browser/media/continue-light.svg | 4 ++ .../contrib/debug/browser/media/continue.svg | 1 - .../browser/media/current-and-breakpoint.svg | 5 +- .../debug/browser/media/current-arrow.svg | 5 +- .../debug/browser/media/debugViewlet.css | 68 +++++++++++-------- .../debug/browser/media/disconnect-dark.svg | 3 + .../browser/media/disconnect-inverse.svg | 1 - .../debug/browser/media/disconnect-light.svg | 3 + .../debug/browser/media/disconnect.svg | 1 - .../contrib/debug/browser/media/drag.svg | 9 ++- .../debug/browser/media/pause-dark.svg | 3 + .../debug/browser/media/pause-inverse.svg | 1 - .../debug/browser/media/pause-light.svg | 3 + .../contrib/debug/browser/media/pause.svg | 1 - .../browser/media/remove-all-inverse.svg | 1 - .../debug/browser/media/remove-all.svg | 1 - .../debug/browser/media/repl-inverse.svg | 1 - .../contrib/debug/browser/media/repl.svg | 1 - .../debug/browser/media/restart-dark.svg | 5 ++ .../debug/browser/media/restart-inverse.svg | 1 - .../debug/browser/media/restart-light.svg | 5 ++ .../contrib/debug/browser/media/restart.svg | 1 - .../browser/media/reverse-continue-dark.svg | 4 ++ .../browser/media/reverse-continue-light.svg | 4 ++ .../media/stackframe-and-breakpoint.svg | 5 +- .../debug/browser/media/stackframe-arrow.svg | 5 +- .../debug/browser/media/start-dark.svg | 3 + .../contrib/debug/browser/media/start-hc.svg | 3 + .../debug/browser/media/start-inverse.svg | 1 - .../debug/browser/media/start-light.svg | 3 + .../contrib/debug/browser/media/start.svg | 1 - .../debug/browser/media/step-back-dark.svg | 9 +++ .../debug/browser/media/step-back-inverse.svg | 11 --- .../debug/browser/media/step-back-light.svg | 9 +++ .../contrib/debug/browser/media/step-back.svg | 11 --- .../debug/browser/media/step-into-dark.svg | 4 ++ .../debug/browser/media/step-into-inverse.svg | 1 - .../debug/browser/media/step-into-light.svg | 4 ++ .../contrib/debug/browser/media/step-into.svg | 1 - .../debug/browser/media/step-out-dark.svg | 4 ++ .../debug/browser/media/step-out-inverse.svg | 1 - .../debug/browser/media/step-out-light.svg | 4 ++ .../contrib/debug/browser/media/step-out.svg | 1 - .../debug/browser/media/step-over-dark.svg | 9 +++ .../debug/browser/media/step-over-inverse.svg | 1 - .../debug/browser/media/step-over-light.svg | 9 +++ .../contrib/debug/browser/media/step-over.svg | 1 - .../contrib/debug/browser/media/stop-dark.svg | 3 + .../debug/browser/media/stop-inverse.svg | 1 - .../debug/browser/media/stop-light.svg | 3 + .../contrib/debug/browser/media/stop.svg | 1 - .../browser/media/toggle-breakpoints-dark.svg | 3 + .../browser/media/toggle-breakpoints-hc.svg | 3 + .../media/toggle-breakpoints-light.svg | 3 + 90 files changed, 266 insertions(+), 101 deletions(-) rename src/vs/workbench/contrib/debug/browser/media/{reverse-continue-inverse.svg => add-dark.svg} (61%) delete mode 100644 src/vs/workbench/contrib/debug/browser/media/add-focus.svg rename src/vs/workbench/contrib/debug/browser/media/{reverse-continue.svg => add-hc.svg} (61%) delete mode 100644 src/vs/workbench/contrib/debug/browser/media/add-inverse.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/add-light.svg delete mode 100644 src/vs/workbench/contrib/debug/browser/media/add.svg delete mode 100644 src/vs/workbench/contrib/debug/browser/media/breakpoints-activate-inverse.svg delete mode 100644 src/vs/workbench/contrib/debug/browser/media/breakpoints-activate.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/close-all-dark.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/close-all-hc.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/close-all-light.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/configure-dark.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/configure-hc.svg delete mode 100644 src/vs/workbench/contrib/debug/browser/media/configure-inverse.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/configure-light.svg delete mode 100644 src/vs/workbench/contrib/debug/browser/media/configure.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/console-dark.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/console-hc.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/console-light.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/continue-dark.svg delete mode 100755 src/vs/workbench/contrib/debug/browser/media/continue-inverse.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/continue-light.svg delete mode 100755 src/vs/workbench/contrib/debug/browser/media/continue.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/disconnect-dark.svg delete mode 100755 src/vs/workbench/contrib/debug/browser/media/disconnect-inverse.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/disconnect-light.svg delete mode 100755 src/vs/workbench/contrib/debug/browser/media/disconnect.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/pause-dark.svg delete mode 100644 src/vs/workbench/contrib/debug/browser/media/pause-inverse.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/pause-light.svg delete mode 100644 src/vs/workbench/contrib/debug/browser/media/pause.svg delete mode 100644 src/vs/workbench/contrib/debug/browser/media/remove-all-inverse.svg delete mode 100644 src/vs/workbench/contrib/debug/browser/media/remove-all.svg delete mode 100644 src/vs/workbench/contrib/debug/browser/media/repl-inverse.svg delete mode 100644 src/vs/workbench/contrib/debug/browser/media/repl.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/restart-dark.svg delete mode 100644 src/vs/workbench/contrib/debug/browser/media/restart-inverse.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/restart-light.svg delete mode 100644 src/vs/workbench/contrib/debug/browser/media/restart.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/reverse-continue-dark.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/reverse-continue-light.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/start-dark.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/start-hc.svg delete mode 100644 src/vs/workbench/contrib/debug/browser/media/start-inverse.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/start-light.svg delete mode 100644 src/vs/workbench/contrib/debug/browser/media/start.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/step-back-dark.svg delete mode 100644 src/vs/workbench/contrib/debug/browser/media/step-back-inverse.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/step-back-light.svg delete mode 100644 src/vs/workbench/contrib/debug/browser/media/step-back.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/step-into-dark.svg delete mode 100644 src/vs/workbench/contrib/debug/browser/media/step-into-inverse.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/step-into-light.svg delete mode 100644 src/vs/workbench/contrib/debug/browser/media/step-into.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/step-out-dark.svg delete mode 100644 src/vs/workbench/contrib/debug/browser/media/step-out-inverse.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/step-out-light.svg delete mode 100644 src/vs/workbench/contrib/debug/browser/media/step-out.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/step-over-dark.svg delete mode 100644 src/vs/workbench/contrib/debug/browser/media/step-over-inverse.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/step-over-light.svg delete mode 100644 src/vs/workbench/contrib/debug/browser/media/step-over.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/stop-dark.svg delete mode 100644 src/vs/workbench/contrib/debug/browser/media/stop-inverse.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/stop-light.svg delete mode 100644 src/vs/workbench/contrib/debug/browser/media/stop.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-dark.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-hc.svg create mode 100644 src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-light.svg diff --git a/src/vs/workbench/contrib/debug/browser/debug.contribution.ts b/src/vs/workbench/contrib/debug/browser/debug.contribution.ts index 88b70660848..850b60dcf4a 100644 --- a/src/vs/workbench/contrib/debug/browser/debug.contribution.ts +++ b/src/vs/workbench/contrib/debug/browser/debug.contribution.ts @@ -277,8 +277,8 @@ const registerDebugToolBarItem = (id: string, title: string, icon: string, order id, title, iconLocation: { - light: URI.parse(require.toUrl(`vs/workbench/contrib/debug/browser/media/${icon}.svg`)), - dark: URI.parse(require.toUrl(`vs/workbench/contrib/debug/browser/media/${icon}-inverse.svg`)) + light: URI.parse(require.toUrl(`vs/workbench/contrib/debug/browser/media/${icon}-light.svg`)), + dark: URI.parse(require.toUrl(`vs/workbench/contrib/debug/browser/media/${icon}-dark.svg`)) }, precondition } diff --git a/src/vs/workbench/contrib/debug/browser/media/reverse-continue-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/add-dark.svg similarity index 61% rename from src/vs/workbench/contrib/debug/browser/media/reverse-continue-inverse.svg rename to src/vs/workbench/contrib/debug/browser/media/add-dark.svg index 5eb56cfd7b2..4d9389336b9 100644 --- a/src/vs/workbench/contrib/debug/browser/media/reverse-continue-inverse.svg +++ b/src/vs/workbench/contrib/debug/browser/media/add-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/add-focus.svg b/src/vs/workbench/contrib/debug/browser/media/add-focus.svg deleted file mode 100644 index 769bd3b12bd..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/add-focus.svg +++ /dev/null @@ -1 +0,0 @@ -add-focus \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/reverse-continue.svg b/src/vs/workbench/contrib/debug/browser/media/add-hc.svg similarity index 61% rename from src/vs/workbench/contrib/debug/browser/media/reverse-continue.svg rename to src/vs/workbench/contrib/debug/browser/media/add-hc.svg index 8bcbde7db07..fb50c6c2849 100644 --- a/src/vs/workbench/contrib/debug/browser/media/reverse-continue.svg +++ b/src/vs/workbench/contrib/debug/browser/media/add-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/add-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/add-inverse.svg deleted file mode 100644 index 7d3fd77ffd6..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/add-inverse.svg +++ /dev/null @@ -1 +0,0 @@ -add \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/add-light.svg b/src/vs/workbench/contrib/debug/browser/media/add-light.svg new file mode 100644 index 00000000000..01a9de7d5ab --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/add-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/add.svg b/src/vs/workbench/contrib/debug/browser/media/add.svg deleted file mode 100644 index 2b679663e80..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/add.svg +++ /dev/null @@ -1 +0,0 @@ -add \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional-disabled.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional-disabled.svg index 61eb04a0818..478803a7573 100644 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional-disabled.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional-disabled.svg @@ -1 +1,3 @@ -breakpoint-conditional-disabled \ No newline at end of file + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional-unverified.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional-unverified.svg index b3d735c4145..4b35f04b857 100644 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional-unverified.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional-unverified.svg @@ -1 +1,3 @@ -breakpoint-conditional-unverified \ No newline at end of file + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional.svg index db2c251350b..6d71b5adeee 100644 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional.svg @@ -1 +1,3 @@ -breakpoint-conditional \ No newline at end of file + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint-disabled.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-disabled.svg index a06c2bea57b..c1a450c90d4 100644 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint-disabled.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint-disabled.svg @@ -1 +1,3 @@ -breakpoint-disabled \ No newline at end of file + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint-function-disabled.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-function-disabled.svg index f25dc4ed167..2c99cc1fac0 100755 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint-function-disabled.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint-function-disabled.svg @@ -1 +1,3 @@ -breakpoint-function-disabled \ No newline at end of file + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint-function-unverified.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-function-unverified.svg index fcca2092ccb..a6b6b1ba5e2 100755 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint-function-unverified.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint-function-unverified.svg @@ -1 +1,3 @@ -breakpoint-function-unverified \ No newline at end of file + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint-function.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-function.svg index add61599b74..22114168c04 100755 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint-function.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint-function.svg @@ -1 +1,3 @@ -breakpoint-function \ No newline at end of file + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint-hint.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-hint.svg index 39f954b0a18..83e4bf90560 100644 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint-hint.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint-hint.svg @@ -1 +1,5 @@ -breakpoint-hint \ No newline at end of file + + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint-log-disabled.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-log-disabled.svg index d1dc5cd6560..bdb4bfeba38 100644 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint-log-disabled.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint-log-disabled.svg @@ -1 +1,3 @@ -breakpoint-log-disabled \ No newline at end of file + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint-log-unverified.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-log-unverified.svg index 31aede64f86..fb44ee34922 100644 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint-log-unverified.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint-log-unverified.svg @@ -1 +1,3 @@ -breakpoint-log-unverified \ No newline at end of file + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint-log.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-log.svg index 51e2e70edb3..769ecf93620 100644 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint-log.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint-log.svg @@ -1 +1,3 @@ -breakpoint-log \ No newline at end of file + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint-unsupported.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-unsupported.svg index 49a195c47c1..e6fb5e7be34 100644 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint-unsupported.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint-unsupported.svg @@ -1 +1,3 @@ -breakpoint-unsupported \ No newline at end of file + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint-unverified.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-unverified.svg index a4eadba7cd8..2887202ddd7 100644 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint-unverified.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint-unverified.svg @@ -1 +1,3 @@ -breakpoint-unverified \ No newline at end of file + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint.svg index 5cb33572fb5..80f39becea4 100644 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint.svg @@ -1 +1,3 @@ -breakpoint \ No newline at end of file + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoints-activate-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoints-activate-inverse.svg deleted file mode 100644 index b919b3c4f28..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoints-activate-inverse.svg +++ /dev/null @@ -1 +0,0 @@ -breakpoints-activate diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoints-activate.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoints-activate.svg deleted file mode 100644 index 34809f9b1b6..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoints-activate.svg +++ /dev/null @@ -1 +0,0 @@ -breakpoints-activate \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/close-all-dark.svg b/src/vs/workbench/contrib/debug/browser/media/close-all-dark.svg new file mode 100644 index 00000000000..26d4c7b7a50 --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/close-all-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/close-all-hc.svg b/src/vs/workbench/contrib/debug/browser/media/close-all-hc.svg new file mode 100644 index 00000000000..6dc04a3659c --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/close-all-hc.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/close-all-light.svg b/src/vs/workbench/contrib/debug/browser/media/close-all-light.svg new file mode 100644 index 00000000000..5d2398a9d16 --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/close-all-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/configure-dark.svg b/src/vs/workbench/contrib/debug/browser/media/configure-dark.svg new file mode 100644 index 00000000000..4d1909627a7 --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/configure-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/configure-hc.svg b/src/vs/workbench/contrib/debug/browser/media/configure-hc.svg new file mode 100644 index 00000000000..cb206a1fb99 --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/configure-hc.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/configure-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/configure-inverse.svg deleted file mode 100644 index bbfbd366eb9..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/configure-inverse.svg +++ /dev/null @@ -1 +0,0 @@ -configure \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/configure-light.svg b/src/vs/workbench/contrib/debug/browser/media/configure-light.svg new file mode 100644 index 00000000000..727a34f26f3 --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/configure-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/configure.svg b/src/vs/workbench/contrib/debug/browser/media/configure.svg deleted file mode 100644 index c97bb48bdcc..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/configure.svg +++ /dev/null @@ -1 +0,0 @@ -configure \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/console-dark.svg b/src/vs/workbench/contrib/debug/browser/media/console-dark.svg new file mode 100644 index 00000000000..24c0c4082b2 --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/console-dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/console-hc.svg b/src/vs/workbench/contrib/debug/browser/media/console-hc.svg new file mode 100644 index 00000000000..75d6c2d54e8 --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/console-hc.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/console-light.svg b/src/vs/workbench/contrib/debug/browser/media/console-light.svg new file mode 100644 index 00000000000..d53d838a9fc --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/console-light.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/continue-dark.svg b/src/vs/workbench/contrib/debug/browser/media/continue-dark.svg new file mode 100644 index 00000000000..45aeeee8daf --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/continue-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/continue-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/continue-inverse.svg deleted file mode 100755 index 2aab216f075..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/continue-inverse.svg +++ /dev/null @@ -1 +0,0 @@ -continue \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/continue-light.svg b/src/vs/workbench/contrib/debug/browser/media/continue-light.svg new file mode 100644 index 00000000000..5104547b5b1 --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/continue-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/continue.svg b/src/vs/workbench/contrib/debug/browser/media/continue.svg deleted file mode 100755 index ca0f30e6280..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/continue.svg +++ /dev/null @@ -1 +0,0 @@ -continue \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/current-and-breakpoint.svg b/src/vs/workbench/contrib/debug/browser/media/current-and-breakpoint.svg index 7dbc3fdedd1..2913fed3e34 100755 --- a/src/vs/workbench/contrib/debug/browser/media/current-and-breakpoint.svg +++ b/src/vs/workbench/contrib/debug/browser/media/current-and-breakpoint.svg @@ -1 +1,4 @@ -current-and-breakpoint \ No newline at end of file + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/current-arrow.svg b/src/vs/workbench/contrib/debug/browser/media/current-arrow.svg index 6a73340306e..d2e0b3df7e9 100755 --- a/src/vs/workbench/contrib/debug/browser/media/current-arrow.svg +++ b/src/vs/workbench/contrib/debug/browser/media/current-arrow.svg @@ -1 +1,4 @@ -current-arrow \ No newline at end of file + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/debugViewlet.css b/src/vs/workbench/contrib/debug/browser/media/debugViewlet.css index 56f4ecfe8d4..5255891ea42 100644 --- a/src/vs/workbench/contrib/debug/browser/media/debugViewlet.css +++ b/src/vs/workbench/contrib/debug/browser/media/debugViewlet.css @@ -16,15 +16,27 @@ /* Actionbar actions */ .monaco-workbench .debug-action.configure { - background: url('configure.svg') center center no-repeat; + background: url('configure-light.svg') center center no-repeat; } -.monaco-workbench .debug-action.start { - background: url('start.svg') center center no-repeat; +.vs-dark .monaco-workbench .debug-action.configure { + background: url('configure-dark.svg') center center no-repeat; +} + +.hc-black .monaco-workbench .debug-action.configure { + background: url('configure-hc.svg') center center no-repeat; } .monaco-workbench .debug-action.toggle-repl { - background: url('repl.svg') center center no-repeat; + background: url('console-light.svg') center center no-repeat; +} + +.vs-dark .monaco-workbench .debug-action.toggle-repl { + background: url('console-dark.svg') center center no-repeat; +} + +.hc-black .monaco-workbench .debug-action.toggle-repl { + background: url('console-hc.svg') center center no-repeat; } .monaco-workbench .debug-action.notification:before { @@ -39,16 +51,6 @@ border: 1px solid white; } -.vs-dark .monaco-workbench .debug-action.configure, -.hc-black .monaco-workbench .debug-action.configure { - background: url('configure-inverse.svg') center center no-repeat; -} - -.vs-dark .monaco-workbench .debug-action.toggle-repl, -.hc-black .monaco-workbench .debug-action.toggle-repl { - background: url('repl-inverse.svg') center center no-repeat; -} - .monaco-workbench .part > .title > .title-actions .start-debug-action-item { display: flex; align-items: center; @@ -66,16 +68,19 @@ .monaco-workbench .part > .title > .title-actions .start-debug-action-item .icon { height: 20px; width: 20px; - background: url('start.svg') no-repeat; + background: url('start-light.svg') no-repeat; background-size: 16px 16px; background-position: center center; flex-shrink: 0; transition: transform 50ms ease; } -.vs-dark .monaco-workbench .part > .title > .title-actions .start-debug-action-item .icon, +.vs-dark .monaco-workbench .part > .title > .title-actions .start-debug-action-item .icon { + background-image: url('start-dark.svg'); +} + .hc-black .monaco-workbench .part > .title > .title-actions .start-debug-action-item .icon { - background-image: url('start-inverse.svg'); + background-image: url('start-hc.svg'); } .monaco-workbench .monaco-action-bar .start-debug-action-item .configuration .monaco-select-box { @@ -315,13 +320,16 @@ .debug-viewlet .debug-action.add-watch-expression, .debug-viewlet .debug-action.add-function-breakpoint { - background: url('add.svg') center center no-repeat; + background: url('add-light.svg') center center no-repeat; } .vs-dark .debug-viewlet .debug-action.add-watch-expression, -.vs-dark .debug-viewlet .debug-action.add-function-breakpoint, +.vs-dark .debug-viewlet .debug-action.add-function-breakpoint { + background: url('add-dark.svg') center center no-repeat; +} + .hc-black .debug-viewlet .debug-action.add-watch-expression { - background: url('add-inverse.svg') center center no-repeat; + background: url('add-hc.svg') center center no-repeat; } .vs-dark .debug-viewlet .monaco-list-row .expression .value.changed { @@ -374,21 +382,27 @@ } .debug-viewlet .debug-action.remove-all { - background: url('remove-all.svg') center center no-repeat; + background: url('close-all-light.svg') center center no-repeat; +} + +.vs-dark .debug-viewlet .debug-action.remove-all { + background: url('close-all-dark.svg') center center no-repeat; +} + +.hc-black .debug-viewlet .debug-action.remove-all { + background: url('close-all-hc.svg') center center no-repeat; } .debug-viewlet .debug-action.breakpoints-activate { - background: url('breakpoints-activate.svg') center center no-repeat; + background: url('toggle-breakpoints-light.svg') center center no-repeat; } -.vs-dark .debug-viewlet .debug-action.remove-all, -.hc-black .debug-viewlet .debug-action.remove-all { - background: url('remove-all-inverse.svg') center center no-repeat; +.vs-dark .debug-viewlet .debug-action.breakpoints-activate { + background: url('toggle-breakpoints-dark.svg') center center no-repeat; } -.vs-dark .debug-viewlet .debug-action.breakpoints-activate, .hc-black .debug-viewlet .debug-action.breakpoints-activate { - background: url('breakpoints-activate-inverse.svg') center center no-repeat; + background: url('toggle-breakpoints-hc.svg') center center no-repeat; } /* No workspace view */ diff --git a/src/vs/workbench/contrib/debug/browser/media/disconnect-dark.svg b/src/vs/workbench/contrib/debug/browser/media/disconnect-dark.svg new file mode 100644 index 00000000000..f018d812952 --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/disconnect-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/disconnect-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/disconnect-inverse.svg deleted file mode 100755 index 2d1e78b5b68..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/disconnect-inverse.svg +++ /dev/null @@ -1 +0,0 @@ -disconnect \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/disconnect-light.svg b/src/vs/workbench/contrib/debug/browser/media/disconnect-light.svg new file mode 100644 index 00000000000..f47adbbe228 --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/disconnect-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/disconnect.svg b/src/vs/workbench/contrib/debug/browser/media/disconnect.svg deleted file mode 100755 index b2deb2b91df..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/disconnect.svg +++ /dev/null @@ -1 +0,0 @@ -disconnect \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/drag.svg b/src/vs/workbench/contrib/debug/browser/media/drag.svg index 522bf98284a..b6b93f31fdf 100644 --- a/src/vs/workbench/contrib/debug/browser/media/drag.svg +++ b/src/vs/workbench/contrib/debug/browser/media/drag.svg @@ -1 +1,8 @@ -drag \ No newline at end of file + + + + + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/pause-dark.svg b/src/vs/workbench/contrib/debug/browser/media/pause-dark.svg new file mode 100644 index 00000000000..9cd9f466130 --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/pause-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/pause-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/pause-inverse.svg deleted file mode 100644 index 5072d2f8cde..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/pause-inverse.svg +++ /dev/null @@ -1 +0,0 @@ -pause \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/pause-light.svg b/src/vs/workbench/contrib/debug/browser/media/pause-light.svg new file mode 100644 index 00000000000..01d3cbc290c --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/pause-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/pause.svg b/src/vs/workbench/contrib/debug/browser/media/pause.svg deleted file mode 100644 index 0875d60cb8c..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/pause.svg +++ /dev/null @@ -1 +0,0 @@ -pause \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/remove-all-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/remove-all-inverse.svg deleted file mode 100644 index 99369626bfc..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/remove-all-inverse.svg +++ /dev/null @@ -1 +0,0 @@ -remove-all \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/remove-all.svg b/src/vs/workbench/contrib/debug/browser/media/remove-all.svg deleted file mode 100644 index a71c2feeedc..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/remove-all.svg +++ /dev/null @@ -1 +0,0 @@ -remove-all_16x \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/repl-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/repl-inverse.svg deleted file mode 100644 index a8939860d05..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/repl-inverse.svg +++ /dev/null @@ -1 +0,0 @@ -repl \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/repl.svg b/src/vs/workbench/contrib/debug/browser/media/repl.svg deleted file mode 100644 index 8175eb32f94..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/repl.svg +++ /dev/null @@ -1 +0,0 @@ -repl \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/restart-dark.svg b/src/vs/workbench/contrib/debug/browser/media/restart-dark.svg new file mode 100644 index 00000000000..f45c9c967ac --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/restart-dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/restart-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/restart-inverse.svg deleted file mode 100644 index eb8116ac100..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/restart-inverse.svg +++ /dev/null @@ -1 +0,0 @@ -restart \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/restart-light.svg b/src/vs/workbench/contrib/debug/browser/media/restart-light.svg new file mode 100644 index 00000000000..aa9b912c0d8 --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/restart-light.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/restart.svg b/src/vs/workbench/contrib/debug/browser/media/restart.svg deleted file mode 100644 index 64971fd7870..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/restart.svg +++ /dev/null @@ -1 +0,0 @@ -restart \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/reverse-continue-dark.svg b/src/vs/workbench/contrib/debug/browser/media/reverse-continue-dark.svg new file mode 100644 index 00000000000..24094753931 --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/reverse-continue-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/reverse-continue-light.svg b/src/vs/workbench/contrib/debug/browser/media/reverse-continue-light.svg new file mode 100644 index 00000000000..336005e1bb8 --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/reverse-continue-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/stackframe-and-breakpoint.svg b/src/vs/workbench/contrib/debug/browser/media/stackframe-and-breakpoint.svg index 41bf68010d6..f7cab86cf13 100644 --- a/src/vs/workbench/contrib/debug/browser/media/stackframe-and-breakpoint.svg +++ b/src/vs/workbench/contrib/debug/browser/media/stackframe-and-breakpoint.svg @@ -1 +1,4 @@ -stackframe-and-breakpoint \ No newline at end of file + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/stackframe-arrow.svg b/src/vs/workbench/contrib/debug/browser/media/stackframe-arrow.svg index e5765106123..b66e3885eaf 100644 --- a/src/vs/workbench/contrib/debug/browser/media/stackframe-arrow.svg +++ b/src/vs/workbench/contrib/debug/browser/media/stackframe-arrow.svg @@ -1 +1,4 @@ -stackframe-arrow \ No newline at end of file + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/start-dark.svg b/src/vs/workbench/contrib/debug/browser/media/start-dark.svg new file mode 100644 index 00000000000..9debdf8c625 --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/start-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/start-hc.svg b/src/vs/workbench/contrib/debug/browser/media/start-hc.svg new file mode 100644 index 00000000000..9debdf8c625 --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/start-hc.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/start-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/start-inverse.svg deleted file mode 100644 index 3be0c24f6ff..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/start-inverse.svg +++ /dev/null @@ -1 +0,0 @@ -continue \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/start-light.svg b/src/vs/workbench/contrib/debug/browser/media/start-light.svg new file mode 100644 index 00000000000..dac8bdae31f --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/start-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/start.svg b/src/vs/workbench/contrib/debug/browser/media/start.svg deleted file mode 100644 index 9ef467f2c04..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/start.svg +++ /dev/null @@ -1 +0,0 @@ -continue \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/step-back-dark.svg b/src/vs/workbench/contrib/debug/browser/media/step-back-dark.svg new file mode 100644 index 00000000000..0822ef90f01 --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/step-back-dark.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/step-back-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/step-back-inverse.svg deleted file mode 100644 index 7cb61c84368..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/step-back-inverse.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/src/vs/workbench/contrib/debug/browser/media/step-back-light.svg b/src/vs/workbench/contrib/debug/browser/media/step-back-light.svg new file mode 100644 index 00000000000..56662bf1622 --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/step-back-light.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/step-back.svg b/src/vs/workbench/contrib/debug/browser/media/step-back.svg deleted file mode 100644 index fffc2313a3c..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/step-back.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/src/vs/workbench/contrib/debug/browser/media/step-into-dark.svg b/src/vs/workbench/contrib/debug/browser/media/step-into-dark.svg new file mode 100644 index 00000000000..6665b1a9d3a --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/step-into-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/step-into-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/step-into-inverse.svg deleted file mode 100644 index 8cfab5c40b1..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/step-into-inverse.svg +++ /dev/null @@ -1 +0,0 @@ -step-into \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/step-into-light.svg b/src/vs/workbench/contrib/debug/browser/media/step-into-light.svg new file mode 100644 index 00000000000..0a213e557cf --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/step-into-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/step-into.svg b/src/vs/workbench/contrib/debug/browser/media/step-into.svg deleted file mode 100644 index a4beee54411..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/step-into.svg +++ /dev/null @@ -1 +0,0 @@ -step-into \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/step-out-dark.svg b/src/vs/workbench/contrib/debug/browser/media/step-out-dark.svg new file mode 100644 index 00000000000..b42ed8cb51e --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/step-out-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/step-out-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/step-out-inverse.svg deleted file mode 100644 index 045a84ff032..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/step-out-inverse.svg +++ /dev/null @@ -1 +0,0 @@ -step-out \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/step-out-light.svg b/src/vs/workbench/contrib/debug/browser/media/step-out-light.svg new file mode 100644 index 00000000000..2e465b2197f --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/step-out-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/step-out.svg b/src/vs/workbench/contrib/debug/browser/media/step-out.svg deleted file mode 100644 index 850aed93c2e..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/step-out.svg +++ /dev/null @@ -1 +0,0 @@ -step-out \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/step-over-dark.svg b/src/vs/workbench/contrib/debug/browser/media/step-over-dark.svg new file mode 100644 index 00000000000..9bed265fba2 --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/step-over-dark.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/step-over-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/step-over-inverse.svg deleted file mode 100644 index f3a1aa36f22..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/step-over-inverse.svg +++ /dev/null @@ -1 +0,0 @@ -step-over \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/step-over-light.svg b/src/vs/workbench/contrib/debug/browser/media/step-over-light.svg new file mode 100644 index 00000000000..23dcfbef24c --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/step-over-light.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/step-over.svg b/src/vs/workbench/contrib/debug/browser/media/step-over.svg deleted file mode 100644 index 3343de71d83..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/step-over.svg +++ /dev/null @@ -1 +0,0 @@ -step-over \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/stop-dark.svg b/src/vs/workbench/contrib/debug/browser/media/stop-dark.svg new file mode 100644 index 00000000000..c503a66969c --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/stop-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/stop-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/stop-inverse.svg deleted file mode 100644 index c8e37202875..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/stop-inverse.svg +++ /dev/null @@ -1 +0,0 @@ -stop \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/stop-light.svg b/src/vs/workbench/contrib/debug/browser/media/stop-light.svg new file mode 100644 index 00000000000..11719ced07c --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/stop-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/stop.svg b/src/vs/workbench/contrib/debug/browser/media/stop.svg deleted file mode 100644 index 57c29044b12..00000000000 --- a/src/vs/workbench/contrib/debug/browser/media/stop.svg +++ /dev/null @@ -1 +0,0 @@ -stop \ No newline at end of file diff --git a/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-dark.svg b/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-dark.svg new file mode 100644 index 00000000000..fe927b01072 --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-hc.svg b/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-hc.svg new file mode 100644 index 00000000000..41048a4a9c4 --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-hc.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-light.svg b/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-light.svg new file mode 100644 index 00000000000..687a929679b --- /dev/null +++ b/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-light.svg @@ -0,0 +1,3 @@ + + + From b25f96a60a634bceb58d76426c1e419e27614ed7 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Thu, 20 Jun 2019 11:41:07 -0700 Subject: [PATCH 0469/1449] Update all icons --- extensions/git/resources/icons/dark/check.svg | 2 +- extensions/git/resources/icons/dark/unstage.svg | 2 +- extensions/git/resources/icons/light/check.svg | 2 +- extensions/git/resources/icons/light/unstage.svg | 2 +- .../base/browser/ui/findinput/case-sensitive-dark.svg | 4 ++-- src/vs/base/browser/ui/findinput/case-sensitive-hc.svg | 4 ++-- .../base/browser/ui/findinput/case-sensitive-light.svg | 4 ++-- src/vs/base/browser/ui/findinput/regex-dark.svg | 4 ++-- src/vs/base/browser/ui/findinput/whole-word-dark.svg | 4 ++-- src/vs/base/browser/ui/findinput/whole-word-hc.svg | 4 ++-- src/vs/base/browser/ui/findinput/whole-word-light.svg | 4 ++-- .../parts/editor/media/split-editor-horizontal-hc.svg | 4 ++++ .../parts/editor/media/split-editor-vertical-hc.svg | 4 ++++ .../contrib/debug/browser/media/console-dark.svg | 5 ++--- .../contrib/debug/browser/media/console-hc.svg | 5 ++--- .../contrib/debug/browser/media/console-light.svg | 5 ++--- .../debug/browser/media/toggle-breakpoints-dark.svg | 2 +- .../debug/browser/media/toggle-breakpoints-hc.svg | 2 +- .../debug/browser/media/toggle-breakpoints-light.svg | 2 +- .../contrib/files/browser/media/add-folder-dark.svg | 7 ++++--- .../contrib/files/browser/media/add-folder-hc.svg | 7 ++++--- .../contrib/files/browser/media/add-folder-light.svg | 7 ++++--- .../contrib/files/browser/media/save-all-dark.svg | 3 +-- .../contrib/files/browser/media/save-all-hc.svg | 3 +-- .../contrib/files/browser/media/save-all-light.svg | 3 +-- .../contrib/search/browser/media/clear-dark.svg | 10 +++++----- .../contrib/search/browser/media/clear-hc.svg | 10 +++++----- .../contrib/search/browser/media/clear-light.svg | 10 +++++----- .../search/browser/media/exclude-settings-dark.svg | 3 +-- .../search/browser/media/exclude-settings-hc.svg | 3 +-- .../search/browser/media/exclude-settings-light.svg | 3 +-- .../contrib/search/browser/media/replace-all-dark.svg | 4 ++-- .../contrib/search/browser/media/replace-all-hc.svg | 4 ++-- .../contrib/search/browser/media/replace-all-light.svg | 4 ++-- .../contrib/search/browser/media/replace-dark.svg | 6 +++--- .../contrib/search/browser/media/replace-hc.svg | 6 +++--- .../contrib/search/browser/media/replace-light.svg | 6 +++--- 37 files changed, 83 insertions(+), 81 deletions(-) create mode 100644 src/vs/workbench/browser/parts/editor/media/split-editor-horizontal-hc.svg create mode 100644 src/vs/workbench/browser/parts/editor/media/split-editor-vertical-hc.svg diff --git a/extensions/git/resources/icons/dark/check.svg b/extensions/git/resources/icons/dark/check.svg index 02f94482225..5f69de8fc69 100644 --- a/extensions/git/resources/icons/dark/check.svg +++ b/extensions/git/resources/icons/dark/check.svg @@ -1,3 +1,3 @@ - + diff --git a/extensions/git/resources/icons/dark/unstage.svg b/extensions/git/resources/icons/dark/unstage.svg index 7cb883ecfb2..4c5a9c1e3a5 100644 --- a/extensions/git/resources/icons/dark/unstage.svg +++ b/extensions/git/resources/icons/dark/unstage.svg @@ -1,3 +1,3 @@ - + diff --git a/extensions/git/resources/icons/light/check.svg b/extensions/git/resources/icons/light/check.svg index 92f415703c1..2b6712efcc1 100644 --- a/extensions/git/resources/icons/light/check.svg +++ b/extensions/git/resources/icons/light/check.svg @@ -1,3 +1,3 @@ - + diff --git a/extensions/git/resources/icons/light/unstage.svg b/extensions/git/resources/icons/light/unstage.svg index 5392dba3bd9..d12a8ee3135 100644 --- a/extensions/git/resources/icons/light/unstage.svg +++ b/extensions/git/resources/icons/light/unstage.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/base/browser/ui/findinput/case-sensitive-dark.svg b/src/vs/base/browser/ui/findinput/case-sensitive-dark.svg index 0aadd8f7927..eb86779a59d 100644 --- a/src/vs/base/browser/ui/findinput/case-sensitive-dark.svg +++ b/src/vs/base/browser/ui/findinput/case-sensitive-dark.svg @@ -1,4 +1,4 @@ - - + + diff --git a/src/vs/base/browser/ui/findinput/case-sensitive-hc.svg b/src/vs/base/browser/ui/findinput/case-sensitive-hc.svg index 418172b6866..591d050b0f6 100644 --- a/src/vs/base/browser/ui/findinput/case-sensitive-hc.svg +++ b/src/vs/base/browser/ui/findinput/case-sensitive-hc.svg @@ -1,4 +1,4 @@ - - + + diff --git a/src/vs/base/browser/ui/findinput/case-sensitive-light.svg b/src/vs/base/browser/ui/findinput/case-sensitive-light.svg index 924a21a34f1..cbb44fdaa1e 100644 --- a/src/vs/base/browser/ui/findinput/case-sensitive-light.svg +++ b/src/vs/base/browser/ui/findinput/case-sensitive-light.svg @@ -1,4 +1,4 @@ - - + + diff --git a/src/vs/base/browser/ui/findinput/regex-dark.svg b/src/vs/base/browser/ui/findinput/regex-dark.svg index bffb311a5be..4f07c9e57d8 100644 --- a/src/vs/base/browser/ui/findinput/regex-dark.svg +++ b/src/vs/base/browser/ui/findinput/regex-dark.svg @@ -1,4 +1,4 @@ - - + + diff --git a/src/vs/base/browser/ui/findinput/whole-word-dark.svg b/src/vs/base/browser/ui/findinput/whole-word-dark.svg index b30195e375c..d37676e0e2b 100644 --- a/src/vs/base/browser/ui/findinput/whole-word-dark.svg +++ b/src/vs/base/browser/ui/findinput/whole-word-dark.svg @@ -1,7 +1,7 @@ - + - + diff --git a/src/vs/base/browser/ui/findinput/whole-word-hc.svg b/src/vs/base/browser/ui/findinput/whole-word-hc.svg index 8a18eed8deb..28e2087cab6 100644 --- a/src/vs/base/browser/ui/findinput/whole-word-hc.svg +++ b/src/vs/base/browser/ui/findinput/whole-word-hc.svg @@ -1,7 +1,7 @@ - + - + diff --git a/src/vs/base/browser/ui/findinput/whole-word-light.svg b/src/vs/base/browser/ui/findinput/whole-word-light.svg index 7ef8cd0cf56..9c8af3270a0 100644 --- a/src/vs/base/browser/ui/findinput/whole-word-light.svg +++ b/src/vs/base/browser/ui/findinput/whole-word-light.svg @@ -1,7 +1,7 @@ - + - + diff --git a/src/vs/workbench/browser/parts/editor/media/split-editor-horizontal-hc.svg b/src/vs/workbench/browser/parts/editor/media/split-editor-horizontal-hc.svg new file mode 100644 index 00000000000..c92025ddd92 --- /dev/null +++ b/src/vs/workbench/browser/parts/editor/media/split-editor-horizontal-hc.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/browser/parts/editor/media/split-editor-vertical-hc.svg b/src/vs/workbench/browser/parts/editor/media/split-editor-vertical-hc.svg new file mode 100644 index 00000000000..f407c08fa34 --- /dev/null +++ b/src/vs/workbench/browser/parts/editor/media/split-editor-vertical-hc.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/console-dark.svg b/src/vs/workbench/contrib/debug/browser/media/console-dark.svg index 24c0c4082b2..0086b59f7cc 100644 --- a/src/vs/workbench/contrib/debug/browser/media/console-dark.svg +++ b/src/vs/workbench/contrib/debug/browser/media/console-dark.svg @@ -1,5 +1,4 @@ - - - + + diff --git a/src/vs/workbench/contrib/debug/browser/media/console-hc.svg b/src/vs/workbench/contrib/debug/browser/media/console-hc.svg index 75d6c2d54e8..10a458941a1 100644 --- a/src/vs/workbench/contrib/debug/browser/media/console-hc.svg +++ b/src/vs/workbench/contrib/debug/browser/media/console-hc.svg @@ -1,5 +1,4 @@ - - - + + diff --git a/src/vs/workbench/contrib/debug/browser/media/console-light.svg b/src/vs/workbench/contrib/debug/browser/media/console-light.svg index d53d838a9fc..667f9c1061b 100644 --- a/src/vs/workbench/contrib/debug/browser/media/console-light.svg +++ b/src/vs/workbench/contrib/debug/browser/media/console-light.svg @@ -1,5 +1,4 @@ - - - + + diff --git a/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-dark.svg b/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-dark.svg index fe927b01072..76a4d5d3bac 100644 --- a/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-dark.svg +++ b/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-hc.svg b/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-hc.svg index 41048a4a9c4..08a3991311a 100644 --- a/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-hc.svg +++ b/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-light.svg b/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-light.svg index 687a929679b..a73684ef2b6 100644 --- a/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-light.svg +++ b/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/files/browser/media/add-folder-dark.svg b/src/vs/workbench/contrib/files/browser/media/add-folder-dark.svg index 8a714b5b569..6a37c63e480 100644 --- a/src/vs/workbench/contrib/files/browser/media/add-folder-dark.svg +++ b/src/vs/workbench/contrib/files/browser/media/add-folder-dark.svg @@ -1,12 +1,13 @@ - + + - + - + diff --git a/src/vs/workbench/contrib/files/browser/media/add-folder-hc.svg b/src/vs/workbench/contrib/files/browser/media/add-folder-hc.svg index cf9562c4d6f..c104237262b 100644 --- a/src/vs/workbench/contrib/files/browser/media/add-folder-hc.svg +++ b/src/vs/workbench/contrib/files/browser/media/add-folder-hc.svg @@ -1,12 +1,13 @@ - + + - + - + diff --git a/src/vs/workbench/contrib/files/browser/media/add-folder-light.svg b/src/vs/workbench/contrib/files/browser/media/add-folder-light.svg index e07474dcf94..fc87c0a02f0 100644 --- a/src/vs/workbench/contrib/files/browser/media/add-folder-light.svg +++ b/src/vs/workbench/contrib/files/browser/media/add-folder-light.svg @@ -1,12 +1,13 @@ - + + - + - + diff --git a/src/vs/workbench/contrib/files/browser/media/save-all-dark.svg b/src/vs/workbench/contrib/files/browser/media/save-all-dark.svg index ac1ad888a3e..ae5949ef1d4 100644 --- a/src/vs/workbench/contrib/files/browser/media/save-all-dark.svg +++ b/src/vs/workbench/contrib/files/browser/media/save-all-dark.svg @@ -1,6 +1,5 @@ - - + diff --git a/src/vs/workbench/contrib/files/browser/media/save-all-hc.svg b/src/vs/workbench/contrib/files/browser/media/save-all-hc.svg index 50b3b318d81..3cc9cfaef09 100644 --- a/src/vs/workbench/contrib/files/browser/media/save-all-hc.svg +++ b/src/vs/workbench/contrib/files/browser/media/save-all-hc.svg @@ -1,6 +1,5 @@ - - + diff --git a/src/vs/workbench/contrib/files/browser/media/save-all-light.svg b/src/vs/workbench/contrib/files/browser/media/save-all-light.svg index bc9289e9805..a4a9424a956 100644 --- a/src/vs/workbench/contrib/files/browser/media/save-all-light.svg +++ b/src/vs/workbench/contrib/files/browser/media/save-all-light.svg @@ -1,6 +1,5 @@ - - + diff --git a/src/vs/workbench/contrib/search/browser/media/clear-dark.svg b/src/vs/workbench/contrib/search/browser/media/clear-dark.svg index 147d2ad7ba5..7a95ac06462 100644 --- a/src/vs/workbench/contrib/search/browser/media/clear-dark.svg +++ b/src/vs/workbench/contrib/search/browser/media/clear-dark.svg @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/src/vs/workbench/contrib/search/browser/media/clear-hc.svg b/src/vs/workbench/contrib/search/browser/media/clear-hc.svg index 531e492806b..6709e070c67 100644 --- a/src/vs/workbench/contrib/search/browser/media/clear-hc.svg +++ b/src/vs/workbench/contrib/search/browser/media/clear-hc.svg @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/src/vs/workbench/contrib/search/browser/media/clear-light.svg b/src/vs/workbench/contrib/search/browser/media/clear-light.svg index dc0519783fe..b024caa8052 100644 --- a/src/vs/workbench/contrib/search/browser/media/clear-light.svg +++ b/src/vs/workbench/contrib/search/browser/media/clear-light.svg @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/src/vs/workbench/contrib/search/browser/media/exclude-settings-dark.svg b/src/vs/workbench/contrib/search/browser/media/exclude-settings-dark.svg index f792a3ed79c..1bfca289bd7 100644 --- a/src/vs/workbench/contrib/search/browser/media/exclude-settings-dark.svg +++ b/src/vs/workbench/contrib/search/browser/media/exclude-settings-dark.svg @@ -1,5 +1,4 @@ - - + diff --git a/src/vs/workbench/contrib/search/browser/media/exclude-settings-hc.svg b/src/vs/workbench/contrib/search/browser/media/exclude-settings-hc.svg index 2257ec6dae9..ab06ba33068 100644 --- a/src/vs/workbench/contrib/search/browser/media/exclude-settings-hc.svg +++ b/src/vs/workbench/contrib/search/browser/media/exclude-settings-hc.svg @@ -1,5 +1,4 @@ - - + diff --git a/src/vs/workbench/contrib/search/browser/media/exclude-settings-light.svg b/src/vs/workbench/contrib/search/browser/media/exclude-settings-light.svg index 7fda7b2adbb..8adf3e518fc 100644 --- a/src/vs/workbench/contrib/search/browser/media/exclude-settings-light.svg +++ b/src/vs/workbench/contrib/search/browser/media/exclude-settings-light.svg @@ -1,5 +1,4 @@ - - + diff --git a/src/vs/workbench/contrib/search/browser/media/replace-all-dark.svg b/src/vs/workbench/contrib/search/browser/media/replace-all-dark.svg index fa94639932d..96dea6e6ff8 100644 --- a/src/vs/workbench/contrib/search/browser/media/replace-all-dark.svg +++ b/src/vs/workbench/contrib/search/browser/media/replace-all-dark.svg @@ -1,9 +1,9 @@ - + - + diff --git a/src/vs/workbench/contrib/search/browser/media/replace-all-hc.svg b/src/vs/workbench/contrib/search/browser/media/replace-all-hc.svg index c7223bd91b3..66ed165e46b 100644 --- a/src/vs/workbench/contrib/search/browser/media/replace-all-hc.svg +++ b/src/vs/workbench/contrib/search/browser/media/replace-all-hc.svg @@ -1,9 +1,9 @@ - + - + diff --git a/src/vs/workbench/contrib/search/browser/media/replace-all-light.svg b/src/vs/workbench/contrib/search/browser/media/replace-all-light.svg index 27a58523fe7..a7c23ff6d92 100644 --- a/src/vs/workbench/contrib/search/browser/media/replace-all-light.svg +++ b/src/vs/workbench/contrib/search/browser/media/replace-all-light.svg @@ -1,9 +1,9 @@ - + - + diff --git a/src/vs/workbench/contrib/search/browser/media/replace-dark.svg b/src/vs/workbench/contrib/search/browser/media/replace-dark.svg index 12df3a8ee36..195341a5a78 100644 --- a/src/vs/workbench/contrib/search/browser/media/replace-dark.svg +++ b/src/vs/workbench/contrib/search/browser/media/replace-dark.svg @@ -1,6 +1,6 @@ - + - - + + diff --git a/src/vs/workbench/contrib/search/browser/media/replace-hc.svg b/src/vs/workbench/contrib/search/browser/media/replace-hc.svg index 0979845e836..01cc453b092 100644 --- a/src/vs/workbench/contrib/search/browser/media/replace-hc.svg +++ b/src/vs/workbench/contrib/search/browser/media/replace-hc.svg @@ -1,6 +1,6 @@ - + - - + + diff --git a/src/vs/workbench/contrib/search/browser/media/replace-light.svg b/src/vs/workbench/contrib/search/browser/media/replace-light.svg index 542d45ddcff..2e2cbd6fc6d 100644 --- a/src/vs/workbench/contrib/search/browser/media/replace-light.svg +++ b/src/vs/workbench/contrib/search/browser/media/replace-light.svg @@ -1,6 +1,6 @@ - + - - + + From 5a5ccf7ec13f01228d4d607983e3d2efbc81fb3b Mon Sep 17 00:00:00 2001 From: SteVen Batten Date: Thu, 20 Jun 2019 18:51:55 +0000 Subject: [PATCH 0470/1449] fixes #75856 --- src/vs/workbench/workbench.main.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index a6c31adbe64..b1130436d6d 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -71,8 +71,6 @@ import { IRequestService } from 'vs/platform/request/node/request'; import { RequestService } from 'vs/platform/request/electron-browser/requestService'; import { LifecycleService } from 'vs/platform/lifecycle/electron-browser/lifecycleService'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; -import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; -import { DialogService } from 'vs/platform/dialogs/browser/dialogService'; import { ILocalizationsService } from 'vs/platform/localizations/common/localizations'; import { LocalizationsService } from 'vs/platform/localizations/electron-browser/localizationsService'; import { ISharedProcessService, SharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; @@ -138,7 +136,6 @@ import 'vs/workbench/services/window/electron-browser/windowService'; import 'vs/workbench/services/telemetry/electron-browser/telemetryService'; import 'vs/workbench/services/configurationResolver/electron-browser/configurationResolverService'; -registerSingleton(IDialogService, DialogService, true); registerSingleton(IMenuService, MenuService, true); registerSingleton(IListService, ListService, true); registerSingleton(IOpenerService, OpenerService, true); From e998949260b1934882103924f95409326274d7f8 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Thu, 20 Jun 2019 11:53:01 -0700 Subject: [PATCH 0471/1449] Update markdown icons --- .../markdown-language-features/media/Preview.svg | 1 - .../media/PreviewOnRightPane_16x.svg | 1 - .../media/PreviewOnRightPane_16x_dark.svg | 1 - .../media/Preview_inverse.svg | 1 - .../media/ViewSource.svg | 3 --- .../media/ViewSource_inverse.svg | 1 - .../media/preview-dark.svg | 7 +++++++ .../media/preview-light.svg | 7 +++++++ .../media/preview-right-dark.svg | 4 ++++ .../media/preview-right-light.svg | 4 ++++ .../media/view-source-dark.svg | 5 +++++ .../media/view-source-light.svg | 5 +++++ .../markdown-language-features/package.json | 16 ++++++++-------- .../src/features/preview.ts | 4 ++-- .../contrib/files/browser/media/Preview.svg | 1 - .../files/browser/media/Preview_inverse.svg | 1 - .../contrib/files/browser/media/fileactions.css | 4 ++-- .../contrib/files/browser/media/preview-dark.svg | 4 ++++ .../files/browser/media/preview-light.svg | 4 ++++ 19 files changed, 52 insertions(+), 22 deletions(-) delete mode 100644 extensions/markdown-language-features/media/Preview.svg delete mode 100644 extensions/markdown-language-features/media/PreviewOnRightPane_16x.svg delete mode 100644 extensions/markdown-language-features/media/PreviewOnRightPane_16x_dark.svg delete mode 100644 extensions/markdown-language-features/media/Preview_inverse.svg delete mode 100644 extensions/markdown-language-features/media/ViewSource.svg delete mode 100644 extensions/markdown-language-features/media/ViewSource_inverse.svg create mode 100644 extensions/markdown-language-features/media/preview-dark.svg create mode 100644 extensions/markdown-language-features/media/preview-light.svg create mode 100644 extensions/markdown-language-features/media/preview-right-dark.svg create mode 100644 extensions/markdown-language-features/media/preview-right-light.svg create mode 100644 extensions/markdown-language-features/media/view-source-dark.svg create mode 100644 extensions/markdown-language-features/media/view-source-light.svg delete mode 100644 src/vs/workbench/contrib/files/browser/media/Preview.svg delete mode 100644 src/vs/workbench/contrib/files/browser/media/Preview_inverse.svg create mode 100644 src/vs/workbench/contrib/files/browser/media/preview-dark.svg create mode 100644 src/vs/workbench/contrib/files/browser/media/preview-light.svg diff --git a/extensions/markdown-language-features/media/Preview.svg b/extensions/markdown-language-features/media/Preview.svg deleted file mode 100644 index 860ba093948..00000000000 --- a/extensions/markdown-language-features/media/Preview.svg +++ /dev/null @@ -1 +0,0 @@ -SwitchToPreview_16x \ No newline at end of file diff --git a/extensions/markdown-language-features/media/PreviewOnRightPane_16x.svg b/extensions/markdown-language-features/media/PreviewOnRightPane_16x.svg deleted file mode 100644 index 55778172a3b..00000000000 --- a/extensions/markdown-language-features/media/PreviewOnRightPane_16x.svg +++ /dev/null @@ -1 +0,0 @@ -PreviewInRightPanel_16x \ No newline at end of file diff --git a/extensions/markdown-language-features/media/PreviewOnRightPane_16x_dark.svg b/extensions/markdown-language-features/media/PreviewOnRightPane_16x_dark.svg deleted file mode 100644 index 390b2658bba..00000000000 --- a/extensions/markdown-language-features/media/PreviewOnRightPane_16x_dark.svg +++ /dev/null @@ -1 +0,0 @@ -PreviewInRightPanel_16x \ No newline at end of file diff --git a/extensions/markdown-language-features/media/Preview_inverse.svg b/extensions/markdown-language-features/media/Preview_inverse.svg deleted file mode 100644 index 1e7e89f7d48..00000000000 --- a/extensions/markdown-language-features/media/Preview_inverse.svg +++ /dev/null @@ -1 +0,0 @@ -SwitchToPreview_16x \ No newline at end of file diff --git a/extensions/markdown-language-features/media/ViewSource.svg b/extensions/markdown-language-features/media/ViewSource.svg deleted file mode 100644 index fccdf83d467..00000000000 --- a/extensions/markdown-language-features/media/ViewSource.svg +++ /dev/null @@ -1,3 +0,0 @@ - -]> \ No newline at end of file diff --git a/extensions/markdown-language-features/media/ViewSource_inverse.svg b/extensions/markdown-language-features/media/ViewSource_inverse.svg deleted file mode 100644 index f6302185aa4..00000000000 --- a/extensions/markdown-language-features/media/ViewSource_inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/extensions/markdown-language-features/media/preview-dark.svg b/extensions/markdown-language-features/media/preview-dark.svg new file mode 100644 index 00000000000..b22cf9dbbb1 --- /dev/null +++ b/extensions/markdown-language-features/media/preview-dark.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/extensions/markdown-language-features/media/preview-light.svg b/extensions/markdown-language-features/media/preview-light.svg new file mode 100644 index 00000000000..4ae1a8b7159 --- /dev/null +++ b/extensions/markdown-language-features/media/preview-light.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/extensions/markdown-language-features/media/preview-right-dark.svg b/extensions/markdown-language-features/media/preview-right-dark.svg new file mode 100644 index 00000000000..569cecf9d5a --- /dev/null +++ b/extensions/markdown-language-features/media/preview-right-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/extensions/markdown-language-features/media/preview-right-light.svg b/extensions/markdown-language-features/media/preview-right-light.svg new file mode 100644 index 00000000000..f6c3f035a88 --- /dev/null +++ b/extensions/markdown-language-features/media/preview-right-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/extensions/markdown-language-features/media/view-source-dark.svg b/extensions/markdown-language-features/media/view-source-dark.svg new file mode 100644 index 00000000000..5cebcad2a8d --- /dev/null +++ b/extensions/markdown-language-features/media/view-source-dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/extensions/markdown-language-features/media/view-source-light.svg b/extensions/markdown-language-features/media/view-source-light.svg new file mode 100644 index 00000000000..e5b2a034bf8 --- /dev/null +++ b/extensions/markdown-language-features/media/view-source-light.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/extensions/markdown-language-features/package.json b/extensions/markdown-language-features/package.json index 4a20defcf3d..0354cb39604 100644 --- a/extensions/markdown-language-features/package.json +++ b/extensions/markdown-language-features/package.json @@ -32,8 +32,8 @@ "title": "%markdown.preview.title%", "category": "Markdown", "icon": { - "light": "./media/Preview.svg", - "dark": "./media/Preview_inverse.svg" + "light": "./media/preview-light.svg", + "dark": "./media/preview-dark.svg" } }, { @@ -41,8 +41,8 @@ "title": "%markdown.previewSide.title%", "category": "Markdown", "icon": { - "light": "./media/PreviewOnRightPane_16x.svg", - "dark": "./media/PreviewOnRightPane_16x_dark.svg" + "light": "./media/preview-right-light.svg", + "dark": "./media/preview-right-dark.svg" } }, { @@ -50,8 +50,8 @@ "title": "%markdown.showLockedPreviewToSide.title%", "category": "Markdown", "icon": { - "light": "./media/PreviewOnRightPane_16x.svg", - "dark": "./media/PreviewOnRightPane_16x_dark.svg" + "light": "./media/preview-right-light.svg", + "dark": "./media/preview-right-dark.svg" } }, { @@ -59,8 +59,8 @@ "title": "%markdown.showSource.title%", "category": "Markdown", "icon": { - "light": "./media/ViewSource.svg", - "dark": "./media/ViewSource_inverse.svg" + "light": "./media/view-source-light.svg", + "dark": "./media/view-source-dark.svg" } }, { diff --git a/extensions/markdown-language-features/src/features/preview.ts b/extensions/markdown-language-features/src/features/preview.ts index 0bb67dccd4c..191b037795a 100644 --- a/extensions/markdown-language-features/src/features/preview.ts +++ b/extensions/markdown-language-features/src/features/preview.ts @@ -345,8 +345,8 @@ export class MarkdownPreview extends Disposable { private get iconPath() { const root = path.join(this._contributionProvider.extensionPath, 'media'); return { - light: vscode.Uri.file(path.join(root, 'Preview.svg')), - dark: vscode.Uri.file(path.join(root, 'Preview_inverse.svg')) + light: vscode.Uri.file(path.join(root, 'preview-light.svg')), + dark: vscode.Uri.file(path.join(root, 'preview-dark.svg')) }; } diff --git a/src/vs/workbench/contrib/files/browser/media/Preview.svg b/src/vs/workbench/contrib/files/browser/media/Preview.svg deleted file mode 100644 index 000f46386e1..00000000000 --- a/src/vs/workbench/contrib/files/browser/media/Preview.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/files/browser/media/Preview_inverse.svg b/src/vs/workbench/contrib/files/browser/media/Preview_inverse.svg deleted file mode 100644 index 6b95a3a2474..00000000000 --- a/src/vs/workbench/contrib/files/browser/media/Preview_inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/files/browser/media/fileactions.css b/src/vs/workbench/contrib/files/browser/media/fileactions.css index f02f45cc66f..9bf17de9261 100644 --- a/src/vs/workbench/contrib/files/browser/media/fileactions.css +++ b/src/vs/workbench/contrib/files/browser/media/fileactions.css @@ -108,12 +108,12 @@ } .monaco-workbench .file-editor-action.action-open-preview { - background: url("Preview.svg") center center no-repeat; + background: url("preview-light.svg") center center no-repeat; } .vs-dark .monaco-workbench .file-editor-action.action-open-preview, .hc-black .monaco-workbench .file-editor-action.action-open-preview { - background: url("Preview_inverse.svg") center center no-repeat; + background: url("preview-dark.svg") center center no-repeat; } .explorer-viewlet .explorer-open-editors .close-editor-action { diff --git a/src/vs/workbench/contrib/files/browser/media/preview-dark.svg b/src/vs/workbench/contrib/files/browser/media/preview-dark.svg new file mode 100644 index 00000000000..569cecf9d5a --- /dev/null +++ b/src/vs/workbench/contrib/files/browser/media/preview-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/files/browser/media/preview-light.svg b/src/vs/workbench/contrib/files/browser/media/preview-light.svg new file mode 100644 index 00000000000..f6c3f035a88 --- /dev/null +++ b/src/vs/workbench/contrib/files/browser/media/preview-light.svg @@ -0,0 +1,4 @@ + + + + From 8c0059a9ca9bfacfc81bbcd73d213574ab83c438 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Thu, 20 Jun 2019 11:57:24 -0700 Subject: [PATCH 0472/1449] User keyboard layout --- .../preferences/browser/keyboardLayoutPicker.ts | 4 +++- .../workbench/services/keybinding/common/keymapInfo.ts | 10 ++++++---- .../services/keybinding/common/keymapService.ts | 6 ++++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts b/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts index 05b9fb2069f..b3f01695c0d 100644 --- a/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts +++ b/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts @@ -113,11 +113,13 @@ export class KeyboardLayoutPickerAction extends Action { const picked = !isAutoDetect && areKeyboardLayoutsEqual(currentLayout, layout); const layoutInfo = parseKeyboardLayout(layout); return { - label: layoutInfo.label, + label: [layoutInfo.label, (layout && layout.isUserKeyboardLayout) ? '(User configured layout)' : ''].join(' '), id: (layout).text || (layout).lang || (layout).layout, description: layoutInfo.description + (picked ? ' (Current layout)' : ''), picked: !isAutoDetect && areKeyboardLayoutsEqual(currentLayout, layout) }; + }).sort((a: IQuickPickItem, b: IQuickPickItem) => { + return a.label < b.label ? -1 : (a.label > b.label ? 1 : 0); }); if (picks.length > 0) { diff --git a/src/vs/workbench/services/keybinding/common/keymapInfo.ts b/src/vs/workbench/services/keybinding/common/keymapInfo.ts index 7d2665d006d..3bd488a3d66 100644 --- a/src/vs/workbench/services/keybinding/common/keymapInfo.ts +++ b/src/vs/workbench/services/keybinding/common/keymapInfo.ts @@ -47,7 +47,7 @@ function deserializeMapping(serializedMapping: ISerializedMapping) { return ret; } -interface IKeyboardMapping { +interface IRawMixedKeyboardMapping { [key: string]: { value: string, withShift: string; @@ -66,15 +66,16 @@ interface ISerializedMapping { } export class KeymapInfo { - mapping: IKeyboardMapping; + mapping: IRawMixedKeyboardMapping; isUserKeyboardLayout: boolean; constructor(public layout: IKeyboardLayoutInfo, public secondaryLayouts: IKeyboardLayoutInfo[], keyboardMapping: ISerializedMapping, isUserKeyboardLayout?: boolean) { this.mapping = deserializeMapping(keyboardMapping); this.isUserKeyboardLayout = !!isUserKeyboardLayout; + this.layout.isUserKeyboardLayout = !!isUserKeyboardLayout; } - static createKeyboardLayoutFromDebugInfo(layout: IKeyboardLayoutInfo, value: IKeyboardMapping, isUserKeyboardLayout?: boolean): KeymapInfo { + static createKeyboardLayoutFromDebugInfo(layout: IKeyboardLayoutInfo, value: IRawMixedKeyboardMapping, isUserKeyboardLayout?: boolean): KeymapInfo { let keyboardLayoutInfo = new KeymapInfo(layout, [], {}, true); keyboardLayoutInfo.mapping = value; return keyboardLayoutInfo; @@ -85,9 +86,10 @@ export class KeymapInfo { this.secondaryLayouts = other.secondaryLayouts; this.mapping = other.mapping; this.isUserKeyboardLayout = other.isUserKeyboardLayout; + this.layout.isUserKeyboardLayout = other.isUserKeyboardLayout; } - fuzzyEqual(other: IKeyboardMapping): boolean { + fuzzyEqual(other: IRawMixedKeyboardMapping): boolean { for (let key in other) { if (isWindows && (key === 'Backslash' || key === 'KeyQ')) { // keymap from Chromium is probably wrong. diff --git a/src/vs/workbench/services/keybinding/common/keymapService.ts b/src/vs/workbench/services/keybinding/common/keymapService.ts index c9d5dbd9115..44258163415 100644 --- a/src/vs/workbench/services/keybinding/common/keymapService.ts +++ b/src/vs/workbench/services/keybinding/common/keymapService.ts @@ -87,7 +87,7 @@ export interface IMacKeyboardLayoutInfo { localizedName?: string; } -export type IKeyboardLayoutInfo = IWindowsKeyboardLayoutInfo | ILinuxKeyboardLayoutInfo | IMacKeyboardLayoutInfo; +export type IKeyboardLayoutInfo = (IWindowsKeyboardLayoutInfo | ILinuxKeyboardLayoutInfo | IMacKeyboardLayoutInfo) & { isUserKeyboardLayout?: boolean; }; export const IKeymapService = createDecorator('keymapService'); @@ -126,7 +126,9 @@ export function areKeyboardLayoutsEqual(a: IKeyboardLayoutInfo | null, b: IKeybo } export function parseKeyboardLayout(layout: IKeyboardLayoutInfo | null): { label: string, description: string } { - + if (!layout) { + return { label: '', description: '' }; + } if ((layout).name) { // windows From ea6151f952ff0aa172191e7e4627add315e1f645 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Thu, 20 Jun 2019 12:00:36 -0700 Subject: [PATCH 0473/1449] simplify common keymap layer --- .../browser/keyboardLayoutPicker.ts | 2 +- .../keybinding/browser/keybindingService.ts | 2 +- .../keybinding/browser/keymapService.ts | 3 +- .../services/keybinding/common/keymapInfo.ts | 173 ++++++++++++++++- .../keybinding/common/keymapService.ts | 176 ------------------ .../electron-browser/nativeKeymapService.ts | 2 +- 6 files changed, 176 insertions(+), 182 deletions(-) delete mode 100644 src/vs/workbench/services/keybinding/common/keymapService.ts diff --git a/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts b/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts index b3f01695c0d..46410fc9cd0 100644 --- a/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts +++ b/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts @@ -6,7 +6,7 @@ import * as nls from 'vs/nls'; import { StatusbarAlignment, IStatusbarService, IStatusbarEntryAccessor } from 'vs/platform/statusbar/common/statusbar'; import { Disposable, MutableDisposable } from 'vs/base/common/lifecycle'; -import { IKeymapService, areKeyboardLayoutsEqual, parseKeyboardLayout } from 'vs/workbench/services/keybinding/common/keymapService'; +import { IKeymapService, areKeyboardLayoutsEqual, parseKeyboardLayout } from 'vs/workbench/services/keybinding/common/keymapInfo'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as WorkbenchExtensions, IWorkbenchContribution, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; diff --git a/src/vs/workbench/services/keybinding/browser/keybindingService.ts b/src/vs/workbench/services/keybinding/browser/keybindingService.ts index a47e25c4e7d..fb7e5465845 100644 --- a/src/vs/workbench/services/keybinding/browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/browser/keybindingService.ts @@ -43,7 +43,7 @@ import { IFileService, FileChangesEvent, FileChangeType } from 'vs/platform/file import { dirname, isEqual } from 'vs/base/common/resources'; import { parse } from 'vs/base/common/json'; import * as objects from 'vs/base/common/objects'; -import { IKeymapService } from 'vs/workbench/services/keybinding/common/keymapService'; +import { IKeymapService } from 'vs/workbench/services/keybinding/common/keymapInfo'; import { getDispatchConfig } from 'vs/workbench/services/keybinding/common/dispatchConfig'; import { isArray } from 'vs/base/common/types'; import { INavigatorWithKeyboard } from 'vs/workbench/services/keybinding/common/navigatorKeyboard'; diff --git a/src/vs/workbench/services/keybinding/browser/keymapService.ts b/src/vs/workbench/services/keybinding/browser/keymapService.ts index 12cae6abfae..126e5ec17dd 100644 --- a/src/vs/workbench/services/keybinding/browser/keymapService.ts +++ b/src/vs/workbench/services/keybinding/browser/keymapService.ts @@ -6,7 +6,7 @@ import * as nls from 'vs/nls'; import { Emitter, Event } from 'vs/base/common/event'; import { Disposable, toDisposable, IDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; -import { IKeymapService, IKeyboardLayoutInfo, IKeyboardMapping, IWindowsKeyboardMapping, IWindowsKeyboardLayoutInfo, IMacKeyboardLayoutInfo, ILinuxKeyboardLayoutInfo } from 'vs/workbench/services/keybinding/common/keymapService'; +import { IKeymapService, IKeyboardLayoutInfo, IKeyboardMapping, IWindowsKeyboardMapping, IWindowsKeyboardLayoutInfo, IMacKeyboardLayoutInfo, ILinuxKeyboardLayoutInfo, KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { DispatchConfig } from 'vs/workbench/services/keybinding/common/dispatchConfig'; import { IKeyboardMapper, CachedKeyboardMapper } from 'vs/workbench/services/keybinding/common/keyboardMapper'; @@ -28,7 +28,6 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as ConfigExtensions, IConfigurationRegistry, IConfigurationNode } from 'vs/platform/configuration/common/configurationRegistry'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { INavigatorWithKeyboard } from 'vs/workbench/services/keybinding/common/navigatorKeyboard'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; export class BrowserKeyboardMapperFactory { public static readonly INSTANCE = new BrowserKeyboardMapperFactory(); diff --git a/src/vs/workbench/services/keybinding/common/keymapInfo.ts b/src/vs/workbench/services/keybinding/common/keymapInfo.ts index 3bd488a3d66..9e281fb6072 100644 --- a/src/vs/workbench/services/keybinding/common/keymapInfo.ts +++ b/src/vs/workbench/services/keybinding/common/keymapInfo.ts @@ -3,8 +3,179 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IKeyboardLayoutInfo } from 'vs/workbench/services/keybinding/common/keymapService'; +import { Event } from 'vs/base/common/event'; import { isWindows } from 'vs/base/common/platform'; +import { createDecorator, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; +import { DispatchConfig } from 'vs/workbench/services/keybinding/common/dispatchConfig'; +import { IKeyboardMapper } from 'vs/workbench/services/keybinding/common/keyboardMapper'; +import { IKeyboardEvent } from 'vs/platform/keybinding/common/keybinding'; + + +export interface IWindowsKeyMapping { + vkey: string; + value: string; + withShift: string; + withAltGr: string; + withShiftAltGr: string; +} +export interface IWindowsKeyboardMapping { + [code: string]: IWindowsKeyMapping; +} +export interface ILinuxKeyMapping { + value: string; + withShift: string; + withAltGr: string; + withShiftAltGr: string; +} +export interface ILinuxKeyboardMapping { + [code: string]: ILinuxKeyMapping; +} +export interface IMacKeyMapping { + value: string; + withShift: string; + withAltGr: string; + withShiftAltGr: string; + valueIsDeadKey: boolean; + withShiftIsDeadKey: boolean; + withAltGrIsDeadKey: boolean; + withShiftAltGrIsDeadKey: boolean; +} +export interface IMacKeyboardMapping { + [code: string]: IMacKeyMapping; +} + +export type IKeyboardMapping = IWindowsKeyboardMapping | ILinuxKeyboardMapping | IMacKeyboardMapping; + +/* __GDPR__FRAGMENT__ + "IKeyboardLayoutInfo" : { + "name" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "id": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "text": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } + } +*/ +export interface IWindowsKeyboardLayoutInfo { + name: string; + id: string; + text: string; +} + +/* __GDPR__FRAGMENT__ + "IKeyboardLayoutInfo" : { + "model" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "layout": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "variant": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "options": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "rules": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } + } +*/ +export interface ILinuxKeyboardLayoutInfo { + model: string; + layout: string; + variant: string; + options: string; + rules: string; +} + +/* __GDPR__FRAGMENT__ + "IKeyboardLayoutInfo" : { + "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "lang": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } + "localizedName": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } + } +*/ +export interface IMacKeyboardLayoutInfo { + id: string; + lang: string; + localizedName?: string; +} + +export type IKeyboardLayoutInfo = (IWindowsKeyboardLayoutInfo | ILinuxKeyboardLayoutInfo | IMacKeyboardLayoutInfo) & { isUserKeyboardLayout?: boolean; }; + +export const IKeymapService = createDecorator('keymapService'); + +export interface IKeymapService { + _serviceBrand: ServiceIdentifier; + onDidChangeKeyboardMapper: Event; + getKeyboardMapper(dispatchConfig: DispatchConfig): IKeyboardMapper; + getCurrentKeyboardLayout(): IKeyboardLayoutInfo | null; + getAllKeyboardLayouts(): IKeyboardLayoutInfo[]; + getRawKeyboardMapping(): IKeyboardMapping | null; + validateCurrentKeyboardMapping(keyboardEvent: IKeyboardEvent): void; +} + +export function areKeyboardLayoutsEqual(a: IKeyboardLayoutInfo | null, b: IKeyboardLayoutInfo | null): boolean { + if (!a || !b) { + return false; + } + + if ((a).name && (b).name && (a).name === (b).name) { + return true; + } + + if ((a).id && (b).id && (a).id === (b).id) { + return true; + } + + if ((a).model && + (b).model && + (a).model === (b).model && + (a).layout === (b).layout + ) { + return true; + } + + return false; +} + +export function parseKeyboardLayout(layout: IKeyboardLayoutInfo | null): { label: string, description: string } { + if (!layout) { + return { label: '', description: '' }; + } + + if ((layout).name) { + // windows + let windowsLayout = layout; + return { + label: windowsLayout.text, + description: '' + }; + } + + if ((layout).id) { + let macLayout = layout; + if (macLayout.localizedName) { + return { + label: macLayout.localizedName, + description: '' + }; + } + + if (/^com\.apple\.keylayout\./.test(macLayout.id)) { + return { + label: macLayout.id.replace(/^com\.apple\.keylayout\./, '').replace(/-/, ' '), + description: '' + }; + } + if (/^.*inputmethod\./.test(macLayout.id)) { + return { + label: macLayout.id.replace(/^.*inputmethod\./, '').replace(/[-\.]/, ' '), + description: `Input Method (${macLayout.lang})` + }; + } + + return { + label: macLayout.lang, + description: '' + }; + } + + let linuxLayout = layout; + + return { + label: linuxLayout.layout, + description: '' + }; +} function deserializeMapping(serializedMapping: ISerializedMapping) { let mapping = serializedMapping; diff --git a/src/vs/workbench/services/keybinding/common/keymapService.ts b/src/vs/workbench/services/keybinding/common/keymapService.ts deleted file mode 100644 index 44258163415..00000000000 --- a/src/vs/workbench/services/keybinding/common/keymapService.ts +++ /dev/null @@ -1,176 +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 { Event } from 'vs/base/common/event'; -import { createDecorator, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; -import { DispatchConfig } from 'vs/workbench/services/keybinding/common/dispatchConfig'; -import { IKeyboardMapper } from 'vs/workbench/services/keybinding/common/keyboardMapper'; -import { IKeyboardEvent } from 'vs/platform/keybinding/common/keybinding'; - -export interface IWindowsKeyMapping { - vkey: string; - value: string; - withShift: string; - withAltGr: string; - withShiftAltGr: string; -} -export interface IWindowsKeyboardMapping { - [code: string]: IWindowsKeyMapping; -} -export interface ILinuxKeyMapping { - value: string; - withShift: string; - withAltGr: string; - withShiftAltGr: string; -} -export interface ILinuxKeyboardMapping { - [code: string]: ILinuxKeyMapping; -} -export interface IMacKeyMapping { - value: string; - withShift: string; - withAltGr: string; - withShiftAltGr: string; - valueIsDeadKey: boolean; - withShiftIsDeadKey: boolean; - withAltGrIsDeadKey: boolean; - withShiftAltGrIsDeadKey: boolean; -} -export interface IMacKeyboardMapping { - [code: string]: IMacKeyMapping; -} - -export type IKeyboardMapping = IWindowsKeyboardMapping | ILinuxKeyboardMapping | IMacKeyboardMapping; - -/* __GDPR__FRAGMENT__ - "IKeyboardLayoutInfo" : { - "name" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "id": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "text": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } -*/ -export interface IWindowsKeyboardLayoutInfo { - name: string; - id: string; - text: string; -} - -/* __GDPR__FRAGMENT__ - "IKeyboardLayoutInfo" : { - "model" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "layout": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "variant": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "options": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "rules": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } -*/ -export interface ILinuxKeyboardLayoutInfo { - model: string; - layout: string; - variant: string; - options: string; - rules: string; -} - -/* __GDPR__FRAGMENT__ - "IKeyboardLayoutInfo" : { - "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "lang": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - "localizedName": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } -*/ -export interface IMacKeyboardLayoutInfo { - id: string; - lang: string; - localizedName?: string; -} - -export type IKeyboardLayoutInfo = (IWindowsKeyboardLayoutInfo | ILinuxKeyboardLayoutInfo | IMacKeyboardLayoutInfo) & { isUserKeyboardLayout?: boolean; }; - -export const IKeymapService = createDecorator('keymapService'); - -export interface IKeymapService { - _serviceBrand: ServiceIdentifier; - onDidChangeKeyboardMapper: Event; - getKeyboardMapper(dispatchConfig: DispatchConfig): IKeyboardMapper; - getCurrentKeyboardLayout(): IKeyboardLayoutInfo | null; - getAllKeyboardLayouts(): IKeyboardLayoutInfo[]; - getRawKeyboardMapping(): IKeyboardMapping | null; - validateCurrentKeyboardMapping(keyboardEvent: IKeyboardEvent): void; -} - -export function areKeyboardLayoutsEqual(a: IKeyboardLayoutInfo | null, b: IKeyboardLayoutInfo | null): boolean { - if (!a || !b) { - return false; - } - - if ((a).name && (b).name && (a).name === (b).name) { - return true; - } - - if ((a).id && (b).id && (a).id === (b).id) { - return true; - } - - if ((a).model && - (b).model && - (a).model === (b).model && - (a).layout === (b).layout - ) { - return true; - } - - return false; -} - -export function parseKeyboardLayout(layout: IKeyboardLayoutInfo | null): { label: string, description: string } { - if (!layout) { - return { label: '', description: '' }; - } - - if ((layout).name) { - // windows - let windowsLayout = layout; - return { - label: windowsLayout.text, - description: '' - }; - } - - if ((layout).id) { - let macLayout = layout; - if (macLayout.localizedName) { - return { - label: macLayout.localizedName, - description: '' - }; - } - - if (/^com\.apple\.keylayout\./.test(macLayout.id)) { - return { - label: macLayout.id.replace(/^com\.apple\.keylayout\./, '').replace(/-/, ' '), - description: '' - }; - } - if (/^.*inputmethod\./.test(macLayout.id)) { - return { - label: macLayout.id.replace(/^.*inputmethod\./, '').replace(/[-\.]/, ' '), - description: `Input Method (${macLayout.lang})` - }; - } - - return { - label: macLayout.lang, - description: '' - }; - } - - let linuxLayout = layout; - - return { - label: linuxLayout.layout, - description: '' - }; -} \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/electron-browser/nativeKeymapService.ts b/src/vs/workbench/services/keybinding/electron-browser/nativeKeymapService.ts index 85f0fa91c8a..475c881af9f 100644 --- a/src/vs/workbench/services/keybinding/electron-browser/nativeKeymapService.ts +++ b/src/vs/workbench/services/keybinding/electron-browser/nativeKeymapService.ts @@ -5,7 +5,7 @@ import * as nativeKeymap from 'native-keymap'; import { Disposable } from 'vs/base/common/lifecycle'; -import { IKeymapService, IKeyboardLayoutInfo, IKeyboardMapping } from 'vs/workbench/services/keybinding/common/keymapService'; +import { IKeymapService, IKeyboardLayoutInfo, IKeyboardMapping } from 'vs/workbench/services/keybinding/common/keymapInfo'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IKeyboardMapper, CachedKeyboardMapper } from 'vs/workbench/services/keybinding/common/keyboardMapper'; import { Emitter, Event } from 'vs/base/common/event'; From 27c4fdd645a0902ae72b9f81082d5ca5fe1525e9 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Thu, 20 Jun 2019 12:10:11 -0700 Subject: [PATCH 0474/1449] load user keyboard layout after initialization --- .../services/keybinding/browser/keymapService.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/services/keybinding/browser/keymapService.ts b/src/vs/workbench/services/keybinding/browser/keymapService.ts index 126e5ec17dd..b935e3ad7c3 100644 --- a/src/vs/workbench/services/keybinding/browser/keymapService.ts +++ b/src/vs/workbench/services/keybinding/browser/keymapService.ts @@ -544,11 +544,11 @@ class BrowserKeymapService extends Disposable implements IKeymapService { })); this._userKeyboardLayout = new UserKeyboardLayout(environmentService.keyboardLayoutResource, fileService); - this._userKeyboardLayout.initialize(); - - if (this._userKeyboardLayout.keyboardLayout) { - BrowserKeyboardMapperFactory.INSTANCE.registerKeyboardLayout(this._userKeyboardLayout.keyboardLayout); - } + this._userKeyboardLayout.initialize().then(() => { + if (this._userKeyboardLayout.keyboardLayout) { + BrowserKeyboardMapperFactory.INSTANCE.registerKeyboardLayout(this._userKeyboardLayout.keyboardLayout); + } + }); this._register(this._userKeyboardLayout.onDidChange(() => { let userKeyboardLayouts = BrowserKeyboardMapperFactory.INSTANCE.keymapInfos.filter(layout => layout.isUserKeyboardLayout); From 1b78a8869c94f3b91b7bc4d13c0fad036ab3a7cf Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Thu, 20 Jun 2019 12:32:47 -0700 Subject: [PATCH 0475/1449] US Standard keyboard info --- .../browser/keyboardLayouts/en.darwin.ts | 2 +- .../browser/keyboardLayouts/en.linux.ts | 2 +- .../browser/keyboardLayouts/en.win.ts | 2 +- .../keybinding/browser/keymapService.ts | 35 +++++++++++++------ .../services/keybinding/common/keymapInfo.ts | 4 +-- 5 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.darwin.ts index 19f435e3c0d..ee78fd8254d 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.darwin.ts @@ -7,7 +7,7 @@ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/bro import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.keylayout.US', lang: 'en', localizedName: 'U.S.' }, + { id: 'com.apple.keylayout.US', lang: 'en', localizedName: 'U.S.', isUSStandard: true }, [ { id: 'com.apple.keylayout.ABC', lang: 'en', localizedName: 'ABC' }, { id: 'com.sogou.inputmethod.sogou.pinyin', lang: 'zh-Hans', localizedName: 'Pinyin - Simplified' }, diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.linux.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.linux.ts index ae5e356006a..1ea1d427390 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.linux.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.linux.ts @@ -7,7 +7,7 @@ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/bro import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { model: 'pc105', layout: 'us', variant: '', options: '', rules: 'evdev' }, + { model: 'pc105', layout: 'us', variant: '', options: '', rules: 'evdev', isUSStandard: true }, [ { model: 'pc105', layout: 'cn', variant: '', options: '', rules: 'evdev' }, ], diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.win.ts index cb7e8e42da2..be1ca6ff8b8 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.win.ts @@ -7,7 +7,7 @@ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/bro import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( - { name: '00000409', id: '', text: 'US' }, + { name: '00000409', id: '', text: 'US', isUSStandard: true }, [ { name: '00000804', id: '', text: 'Chinese (Simplified) - US Keyboard' }, { name: '00000411', id: '', text: 'Japanese' }, diff --git a/src/vs/workbench/services/keybinding/browser/keymapService.ts b/src/vs/workbench/services/keybinding/browser/keymapService.ts index b935e3ad7c3..ac0aa22aa4c 100644 --- a/src/vs/workbench/services/keybinding/browser/keymapService.ts +++ b/src/vs/workbench/services/keybinding/browser/keymapService.ts @@ -6,7 +6,7 @@ import * as nls from 'vs/nls'; import { Emitter, Event } from 'vs/base/common/event'; import { Disposable, toDisposable, IDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; -import { IKeymapService, IKeyboardLayoutInfo, IKeyboardMapping, IWindowsKeyboardMapping, IWindowsKeyboardLayoutInfo, IMacKeyboardLayoutInfo, ILinuxKeyboardLayoutInfo, KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; +import { IKeymapService, IKeyboardLayoutInfo, IKeyboardMapping, IWindowsKeyboardMapping, IWindowsKeyboardLayoutInfo, IMacKeyboardLayoutInfo, ILinuxKeyboardLayoutInfo, KeymapInfo, IRawMixedKeyboardMapping } from 'vs/workbench/services/keybinding/common/keymapInfo'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { DispatchConfig } from 'vs/workbench/services/keybinding/common/dispatchConfig'; import { IKeyboardMapper, CachedKeyboardMapper } from 'vs/workbench/services/keybinding/common/keyboardMapper'; @@ -85,7 +85,7 @@ export class BrowserKeyboardMapperFactory { if ((navigator).keyboard && (navigator).keyboard.addEventListener) { (navigator).keyboard.addEventListener!('layoutchange', () => { // Update user keyboard map settings - this._getBrowserKeyMapping().then((mapping: IKeyboardMapping) => { + this._getBrowserKeyMapping().then((mapping: IKeyboardMapping | null) => { if (this.isKeyMappingActive(mapping)) { return; } @@ -108,7 +108,11 @@ export class BrowserKeyboardMapperFactory { this._keymapInfos.splice(index, 1); } - getMatchedKeymapInfo(keyMapping: IKeyboardMapping): KeymapInfo | null { + getMatchedKeymapInfo(keyMapping: IKeyboardMapping | null): KeymapInfo | null { + if (!keyMapping) { + return null; + } + for (let i = 0; i < this._mru.length; i++) { if (this._mru[i].fuzzyEqual(keyMapping)) { return this._mru[i]; @@ -118,12 +122,22 @@ export class BrowserKeyboardMapperFactory { return null; } - isKeyMappingActive(keymap: IKeyboardMapping) { - return this._activeKeymapInfo && this._activeKeymapInfo.fuzzyEqual(keymap); + getUSStandardLayout() { + const usStandardLayouts = this._mru.filter(layout => layout.layout.isUSStandard); + + if (usStandardLayouts.length) { + return usStandardLayouts[0]; + } + + return null; } - setActiveKeyMapping(keymap: IKeyboardMapping) { - this._activeKeymapInfo = this.getMatchedKeymapInfo(keymap); + isKeyMappingActive(keymap: IKeyboardMapping | null) { + return this._activeKeymapInfo && keymap && this._activeKeymapInfo.fuzzyEqual(keymap); + } + + setActiveKeyMapping(keymap: IKeyboardMapping | null) { + this._activeKeymapInfo = this.getMatchedKeymapInfo(keymap) || this.getUSStandardLayout(); if (!this._activeKeymapInfo) { return; @@ -179,7 +193,6 @@ export class BrowserKeyboardMapperFactory { return new MacLinuxFallbackKeyboardMapper(OS); } return this._keyboardMapper!; - } public validateCurrentKeyboardMapping(keyboardEvent: IKeyboardEvent): void { @@ -307,7 +320,7 @@ export class BrowserKeyboardMapperFactory { return true; } - private async _getBrowserKeyMapping() { + private async _getBrowserKeyMapping(): Promise { if ((navigator as any).keyboard) { try { return (navigator as any).keyboard.getLayoutMap().then((e: any) => { @@ -327,14 +340,14 @@ export class BrowserKeyboardMapperFactory { return matchedKeyboardLayout.mapping; } - return {}; + return null; }); } catch { // getLayoutMap can throw if invoked from a nested browsing context } } - return {}; + return null; } //#endregion diff --git a/src/vs/workbench/services/keybinding/common/keymapInfo.ts b/src/vs/workbench/services/keybinding/common/keymapInfo.ts index 9e281fb6072..fa3803bfd1b 100644 --- a/src/vs/workbench/services/keybinding/common/keymapInfo.ts +++ b/src/vs/workbench/services/keybinding/common/keymapInfo.ts @@ -89,7 +89,7 @@ export interface IMacKeyboardLayoutInfo { localizedName?: string; } -export type IKeyboardLayoutInfo = (IWindowsKeyboardLayoutInfo | ILinuxKeyboardLayoutInfo | IMacKeyboardLayoutInfo) & { isUserKeyboardLayout?: boolean; }; +export type IKeyboardLayoutInfo = (IWindowsKeyboardLayoutInfo | ILinuxKeyboardLayoutInfo | IMacKeyboardLayoutInfo) & { isUserKeyboardLayout?: boolean; isUSStandard?: true }; export const IKeymapService = createDecorator('keymapService'); @@ -218,7 +218,7 @@ function deserializeMapping(serializedMapping: ISerializedMapping) { return ret; } -interface IRawMixedKeyboardMapping { +export interface IRawMixedKeyboardMapping { [key: string]: { value: string, withShift: string; From 1cac4c70c1a3632a2365fe19e28bac7ba96c351b Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Thu, 20 Jun 2019 12:32:52 -0700 Subject: [PATCH 0476/1449] Update extension icons --- .../electron-browser/media/EmptyStar.svg | 92 ------------------- .../electron-browser/media/FullStarLight.svg | 92 ------------------- .../electron-browser/media/HalfStarLight.svg | 91 ------------------ .../electron-browser/media/clear-dark.svg | 7 ++ .../electron-browser/media/clear-hc.svg | 7 ++ .../electron-browser/media/clear-light.svg | 7 ++ .../electron-browser/media/configure-dark.svg | 3 + .../electron-browser/media/configure-hc.svg | 3 + .../media/configure-light.svg | 3 + .../media/extensionActions.css | 18 ++-- .../media/extensionsWidgets.css | 7 +- .../electron-browser/media/star-empty.svg | 6 ++ .../electron-browser/media/star-full.svg | 4 + .../electron-browser/media/star-half.svg | 3 + 14 files changed, 59 insertions(+), 284 deletions(-) delete mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/EmptyStar.svg delete mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/FullStarLight.svg delete mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/HalfStarLight.svg create mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/clear-dark.svg create mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/clear-hc.svg create mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/clear-light.svg create mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/configure-dark.svg create mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/configure-hc.svg create mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/configure-light.svg create mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/star-empty.svg create mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/star-full.svg create mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/star-half.svg diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/EmptyStar.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/EmptyStar.svg deleted file mode 100644 index ac80953032b..00000000000 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/EmptyStar.svg +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/FullStarLight.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/FullStarLight.svg deleted file mode 100644 index 9a20fb91c63..00000000000 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/FullStarLight.svg +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/HalfStarLight.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/HalfStarLight.svg deleted file mode 100644 index 81dbb91844a..00000000000 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/HalfStarLight.svg +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/clear-dark.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/clear-dark.svg new file mode 100644 index 00000000000..04d64ab41ca --- /dev/null +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/clear-dark.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/clear-hc.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/clear-hc.svg new file mode 100644 index 00000000000..44a41edd3b3 --- /dev/null +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/clear-hc.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/clear-light.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/clear-light.svg new file mode 100644 index 00000000000..f6a51c856f0 --- /dev/null +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/clear-light.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/configure-dark.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-dark.svg new file mode 100644 index 00000000000..4d1909627a7 --- /dev/null +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/configure-hc.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-hc.svg new file mode 100644 index 00000000000..cb206a1fb99 --- /dev/null +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-hc.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/configure-light.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-light.svg new file mode 100644 index 00000000000..727a34f26f3 --- /dev/null +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/extensionActions.css b/src/vs/workbench/contrib/extensions/electron-browser/media/extensionActions.css index 8c5bd336f10..79d7e01a69c 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/extensionActions.css +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/extensionActions.css @@ -13,12 +13,15 @@ } .monaco-action-bar .action-item .action-label.clear-extensions { - background: url('clear.svg') center center no-repeat; + background: url('clear-light.svg') center center no-repeat; +} + +.vs-dark .monaco-action-bar .action-item .action-label.clear-extensions { + background: url('clear-dark.svg') center center no-repeat; } -.vs-dark .monaco-action-bar .action-item .action-label.clear-extensions, .hc-black .monaco-action-bar .action-item .action-label.clear-extensions { - background: url('clear-inverse.svg') center center no-repeat; + background: url('clear-hc.svg') center center no-repeat; } .monaco-action-bar .action-item .action-label.extension-action.multiserver.install:after, @@ -101,14 +104,17 @@ height: 18px; width: 10px; border: none; - background: url('manage.svg') center center no-repeat; + background: url('configure-light.svg') center center no-repeat; outline-offset: 0px; margin-top: 0.15em } -.hc-black .extensions-viewlet>.extensions .extension>.details>.footer>.monaco-action-bar .action-item .action-label.extension-action.manage, .vs-dark .extensions-viewlet>.extensions .extension>.details>.footer>.monaco-action-bar .action-item .action-label.extension-action.manage { - background: url('manage-inverse.svg') center center no-repeat; + background: url('configure-dark.svg') center center no-repeat; +} + +.hc-black .extensions-viewlet>.extensions .extension>.details>.footer>.monaco-action-bar .action-item .action-label.extension-action.manage { + background: url('configure-hc.svg') center center no-repeat; } .extension-editor > .header.recommended > .details > .recommendation > .monaco-action-bar .actions-container { diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/extensionsWidgets.css b/src/vs/workbench/contrib/extensions/electron-browser/media/extensionsWidgets.css index 7ddd1d4c880..f043a50cd18 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/extensionsWidgets.css +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/extensionsWidgets.css @@ -26,18 +26,19 @@ .extension-ratings.small > .star { width: 10px; height: 10px; + background-image: url('star-small.svg'); } .extension-ratings > .full { - background-image: url('FullStarLight.svg'); + background-image: url('star-full.svg'); } .extension-ratings > .half { - background-image: url('HalfStarLight.svg'); + background-image: url('star-half.svg'); } .extension-ratings > .empty { - background-image: url('EmptyStar.svg'); + background-image: url('star-empty.svg'); } .extension-ratings > .count { diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/star-empty.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/star-empty.svg new file mode 100644 index 00000000000..acd3675de08 --- /dev/null +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/star-empty.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/star-full.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/star-full.svg new file mode 100644 index 00000000000..23b5c9c0bd4 --- /dev/null +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/star-full.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/star-half.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/star-half.svg new file mode 100644 index 00000000000..9193e4a596c --- /dev/null +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/star-half.svg @@ -0,0 +1,3 @@ + + + From 2e65c0b4a7876e9a1a91dfe1083368eddb244a07 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Thu, 20 Jun 2019 12:53:11 -0700 Subject: [PATCH 0477/1449] better score for layout --- .../keybinding/browser/keymapService.ts | 94 ++++--------------- .../services/keybinding/common/keymapInfo.ts | 22 +++++ 2 files changed, 42 insertions(+), 74 deletions(-) diff --git a/src/vs/workbench/services/keybinding/browser/keymapService.ts b/src/vs/workbench/services/keybinding/browser/keymapService.ts index ac0aa22aa4c..1917e87146f 100644 --- a/src/vs/workbench/services/keybinding/browser/keymapService.ts +++ b/src/vs/workbench/services/keybinding/browser/keymapService.ts @@ -113,6 +113,22 @@ export class BrowserKeyboardMapperFactory { return null; } + let usStandard = this.getUSStandardLayout(); + + if (usStandard) { + let maxScore = usStandard.getScore(keyMapping); + let result = usStandard; + for (let i = 0; i < this._mru.length; i++) { + let score = this._mru[i].getScore(keyMapping); + if (score > maxScore) { + maxScore = score; + result = this._mru[i]; + } + } + + return result; + } + for (let i = 0; i < this._mru.length; i++) { if (this._mru[i].fuzzyEqual(keyMapping)) { return this._mru[i]; @@ -234,26 +250,13 @@ export class BrowserKeyboardMapperFactory { private _setKeyboardData(keymapInfo: KeymapInfo): void { this._initialized = true; - this._keyboardMapper = new CachedKeyboardMapper(BrowserKeyboardMapperFactory._createKeyboardMapper(keymapInfo.mapping)); + this._keyboardMapper = new CachedKeyboardMapper(BrowserKeyboardMapperFactory._createKeyboardMapper(keymapInfo)); this._onDidChangeKeyboardMapper.fire(); } - private static _isUSStandard(rawMapping: IKeyboardMapping): boolean { - for (let key in rawMapping) { - let str = rawMapping[key].value; - let keyCode = KeyCodeUtils.fromString(str); - let usKeyCode = US_SCANCODE_MAP[key]; - - if (keyCode !== usKeyCode) { - return false; - } - - } - return true; - } - - private static _createKeyboardMapper(rawMapping: IKeyboardMapping): IKeyboardMapper { - const isUSStandard = BrowserKeyboardMapperFactory._isUSStandard(rawMapping); + private static _createKeyboardMapper(keymapInfo: KeymapInfo): IKeyboardMapper { + let rawMapping = keymapInfo.mapping; + const isUSStandard = !!keymapInfo.layout.isUSStandard; if (OS === OperatingSystem.Windows) { return new WindowsKeyboardMapper(isUSStandard, rawMapping); } @@ -353,63 +356,6 @@ export class BrowserKeyboardMapperFactory { //#endregion } -export const US_SCANCODE_MAP: { [str: string]: KeyCode; } = {}; - -(function () { - function define(scanCode: string, keyCode: KeyCode): void { - US_SCANCODE_MAP[scanCode] = keyCode; - } - - define('Backquote', KeyCode.US_BACKTICK); - define('Backslash', KeyCode.US_BACKSLASH); - define('BracketLeft', KeyCode.US_OPEN_SQUARE_BRACKET); - define('BracketRight', KeyCode.US_CLOSE_SQUARE_BRACKET); - define('Comma', KeyCode.US_COMMA); - define('Digit0', KeyCode.KEY_0); - define('Digit1', KeyCode.KEY_1); - define('Digit2', KeyCode.KEY_2); - define('Digit3', KeyCode.KEY_3); - define('Digit4', KeyCode.KEY_4); - define('Digit5', KeyCode.KEY_5); - define('Digit6', KeyCode.KEY_6); - define('Digit7', KeyCode.KEY_7); - define('Digit8', KeyCode.KEY_8); - define('Digit9', KeyCode.KEY_9); - define('Equal', KeyCode.US_EQUAL); - define('IntlBackslash', KeyCode.Unknown); - define('KeyA', KeyCode.KEY_A); - define('KeyB', KeyCode.KEY_B); - define('KeyC', KeyCode.KEY_C); - define('KeyD', KeyCode.KEY_D); - define('KeyE', KeyCode.KEY_E); - define('KeyF', KeyCode.KEY_F); - define('KeyG', KeyCode.KEY_G); - define('KeyH', KeyCode.KEY_H); - define('KeyI', KeyCode.KEY_I); - define('KeyJ', KeyCode.KEY_J); - define('KeyK', KeyCode.KEY_K); - define('KeyL', KeyCode.KEY_L); - define('KeyM', KeyCode.KEY_M); - define('KeyN', KeyCode.KEY_N); - define('KeyO', KeyCode.KEY_O); - define('KeyP', KeyCode.KEY_P); - define('KeyQ', KeyCode.KEY_Q); - define('KeyR', KeyCode.KEY_R); - define('KeyS', KeyCode.KEY_S); - define('KeyT', KeyCode.KEY_T); - define('KeyU', KeyCode.KEY_U); - define('KeyV', KeyCode.KEY_V); - define('KeyW', KeyCode.KEY_W); - define('KeyX', KeyCode.KEY_X); - define('KeyY', KeyCode.KEY_Y); - define('KeyZ', KeyCode.KEY_Z); - define('Minus', KeyCode.US_MINUS); - define('Period', KeyCode.US_DOT); - define('Quote', KeyCode.US_QUOTE); - define('Semicolon', KeyCode.US_SEMICOLON); - define('Slash', KeyCode.US_SLASH); -})(); - class UserKeyboardLayout extends Disposable { private readonly reloadConfigurationScheduler: RunOnceScheduler; protected readonly _onDidChange: Emitter = this._register(new Emitter()); diff --git a/src/vs/workbench/services/keybinding/common/keymapInfo.ts b/src/vs/workbench/services/keybinding/common/keymapInfo.ts index fa3803bfd1b..6edaa141dc0 100644 --- a/src/vs/workbench/services/keybinding/common/keymapInfo.ts +++ b/src/vs/workbench/services/keybinding/common/keymapInfo.ts @@ -260,6 +260,28 @@ export class KeymapInfo { this.layout.isUserKeyboardLayout = other.isUserKeyboardLayout; } + getScore(other: IRawMixedKeyboardMapping): number { + let score = 0; + for (let key in other) { + if (isWindows && (key === 'Backslash' || key === 'KeyQ')) { + // keymap from Chromium is probably wrong. + continue; + } + if (this.mapping[key] === undefined) { + score -= 1; + } + + let currentMapping = this.mapping[key]; + let otherMapping = other[key]; + + if (currentMapping.value !== otherMapping.value) { + score -= 1; + } + } + + return score; + } + fuzzyEqual(other: IRawMixedKeyboardMapping): boolean { for (let key in other) { if (isWindows && (key === 'Backslash' || key === 'KeyQ')) { From 65a01566655c9ae954ff0d22d0c1d11a51ef209b Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Thu, 20 Jun 2019 12:55:11 -0700 Subject: [PATCH 0478/1449] fast return keyboard layout if 48-keymap matches --- .../services/keybinding/browser/keymapService.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/vs/workbench/services/keybinding/browser/keymapService.ts b/src/vs/workbench/services/keybinding/browser/keymapService.ts index 1917e87146f..dd04ed81ec8 100644 --- a/src/vs/workbench/services/keybinding/browser/keymapService.ts +++ b/src/vs/workbench/services/keybinding/browser/keymapService.ts @@ -117,10 +117,18 @@ export class BrowserKeyboardMapperFactory { if (usStandard) { let maxScore = usStandard.getScore(keyMapping); + if (maxScore === 0) { + return usStandard; + } + let result = usStandard; for (let i = 0; i < this._mru.length; i++) { let score = this._mru[i].getScore(keyMapping); if (score > maxScore) { + if (score === 0) { + return this._mru[i]; + } + maxScore = score; result = this._mru[i]; } From 9e5594900386b0c35441127bfc55aa6878040171 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Thu, 20 Jun 2019 13:23:05 -0700 Subject: [PATCH 0479/1449] a single keyboard event can be a keymap --- .../keybinding/browser/keymapService.ts | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/services/keybinding/browser/keymapService.ts b/src/vs/workbench/services/keybinding/browser/keymapService.ts index dd04ed81ec8..59acadfcd3e 100644 --- a/src/vs/workbench/services/keybinding/browser/keymapService.ts +++ b/src/vs/workbench/services/keybinding/browser/keymapService.ts @@ -14,7 +14,6 @@ import { OS, OperatingSystem, isMacintosh, isWindows, isLinux } from 'vs/base/co import { WindowsKeyboardMapper } from 'vs/workbench/services/keybinding/common/windowsKeyboardMapper'; import { MacLinuxFallbackKeyboardMapper } from 'vs/workbench/services/keybinding/common/macLinuxFallbackKeyboardMapper'; import { IKeyboardEvent } from 'vs/platform/keybinding/common/keybinding'; -import { KeyCodeUtils, KeyCode } from 'vs/base/common/keyCodes'; import { IMacLinuxKeyboardMapping, MacLinuxKeyboardMapper } from 'vs/workbench/services/keybinding/common/macLinuxKeyboardMapper'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { URI } from 'vs/base/common/uri'; @@ -194,12 +193,12 @@ export class BrowserKeyboardMapperFactory { this._updateKeyboardLayoutAsync(this._initialized); } - private _updateKeyboardLayoutAsync(initialized: boolean) { + private _updateKeyboardLayoutAsync(initialized: boolean, keyboardEvent?: IKeyboardEvent) { if (!initialized) { return; } - this._getBrowserKeyMapping().then(keyMap => { + this._getBrowserKeyMapping(keyboardEvent).then(keyMap => { // might be false positive if (this.isKeyMappingActive(keyMap)) { return; @@ -230,7 +229,7 @@ export class BrowserKeyboardMapperFactory { return; } - this._updateKeyboardLayoutAsync(true); + this._updateKeyboardLayoutAsync(true, keyboardEvent); } public setKeyboardLayout(layoutName: string) { @@ -331,7 +330,7 @@ export class BrowserKeyboardMapperFactory { return true; } - private async _getBrowserKeyMapping(): Promise { + private async _getBrowserKeyMapping(keyboardEvent?: IKeyboardEvent): Promise { if ((navigator as any).keyboard) { try { return (navigator as any).keyboard.getLayoutMap().then((e: any) => { @@ -356,6 +355,23 @@ export class BrowserKeyboardMapperFactory { } catch { // getLayoutMap can throw if invoked from a nested browsing context } + } else if (keyboardEvent && !keyboardEvent.shiftKey && !keyboardEvent.altKey && !keyboardEvent.metaKey && !keyboardEvent.metaKey) { + let ret: IKeyboardMapping = {}; + const standardKeyboardEvent = keyboardEvent as StandardKeyboardEvent; + ret[standardKeyboardEvent.browserEvent.code] = { + 'value': standardKeyboardEvent.browserEvent.key, + 'withShift': '', + 'withAltGr': '', + 'withShiftAltGr': '' + }; + + const matchedKeyboardLayout = this.getMatchedKeymapInfo(ret); + + if (matchedKeyboardLayout) { + return matchedKeyboardLayout.mapping; + } + + return null; } return null; From f4b6f17ca3e7d16aee41e22144ef3566fbdd3076 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Thu, 20 Jun 2019 15:01:56 -0700 Subject: [PATCH 0480/1449] switch to user selected keyboard layout --- .../browser/keyboardLayoutPicker.ts | 16 ++++--- .../keybinding/browser/keymapService.ts | 44 +++++++++++-------- .../services/keybinding/common/keymapInfo.ts | 26 ++++++++++- 3 files changed, 60 insertions(+), 26 deletions(-) diff --git a/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts b/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts index 46410fc9cd0..35ea30c4219 100644 --- a/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts +++ b/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts @@ -6,7 +6,7 @@ import * as nls from 'vs/nls'; import { StatusbarAlignment, IStatusbarService, IStatusbarEntryAccessor } from 'vs/platform/statusbar/common/statusbar'; import { Disposable, MutableDisposable } from 'vs/base/common/lifecycle'; -import { IKeymapService, areKeyboardLayoutsEqual, parseKeyboardLayout } from 'vs/workbench/services/keybinding/common/keymapInfo'; +import { IKeymapService, areKeyboardLayoutsEqual, parseKeyboardLayoutDescription, getKeyboardLayoutId, IKeyboardLayoutInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as WorkbenchExtensions, IWorkbenchContribution, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; @@ -34,7 +34,7 @@ export class KeyboardLayoutPickerContribution extends Disposable implements IWor let layout = this.keymapService.getCurrentKeyboardLayout(); if (layout) { - let layoutInfo = parseKeyboardLayout(layout); + let layoutInfo = parseKeyboardLayoutDescription(layout); this.pickerElement.value = this.statusbarService.addEntry( { text: `Layout: ${layoutInfo.label}`, @@ -49,7 +49,7 @@ export class KeyboardLayoutPickerContribution extends Disposable implements IWor this._register(keymapService.onDidChangeKeyboardMapper(() => { let layout = this.keymapService.getCurrentKeyboardLayout(); - let layoutInfo = parseKeyboardLayout(layout); + let layoutInfo = parseKeyboardLayoutDescription(layout); if (this.pickerElement.value) { this.pickerElement.value.update({ @@ -75,6 +75,9 @@ export class KeyboardLayoutPickerContribution extends Disposable implements IWor const workbenchContributionsRegistry = Registry.as(WorkbenchExtensions.Workbench); workbenchContributionsRegistry.registerWorkbenchContribution(KeyboardLayoutPickerContribution, LifecyclePhase.Starting); +interface LayoutQuickPickItem extends IQuickPickItem { + layout: IKeyboardLayoutInfo; +} export class KeyboardLayoutPickerAction extends Action { static readonly ID = KEYBOARD_LAYOUT_OPEN_PICKER; @@ -111,8 +114,9 @@ export class KeyboardLayoutPickerAction extends Action { const picks: QuickPickInput[] = layouts.map(layout => { const picked = !isAutoDetect && areKeyboardLayoutsEqual(currentLayout, layout); - const layoutInfo = parseKeyboardLayout(layout); + const layoutInfo = parseKeyboardLayoutDescription(layout); return { + layout: layout, label: [layoutInfo.label, (layout && layout.isUserKeyboardLayout) ? '(User configured layout)' : ''].join(' '), id: (layout).text || (layout).lang || (layout).layout, description: layoutInfo.description + (picked ? ' (Current layout)' : ''), @@ -134,7 +138,7 @@ export class KeyboardLayoutPickerAction extends Action { // Offer to "Auto Detect" const autoDetectMode: IQuickPickItem = { label: nls.localize('autoDetect', "Auto Detect"), - description: isAutoDetect ? `Current: ${parseKeyboardLayout(currentLayout).label}` : undefined, + description: isAutoDetect ? `Current: ${parseKeyboardLayoutDescription(currentLayout).label}` : undefined, picked: isAutoDetect ? true : undefined }; @@ -171,7 +175,7 @@ export class KeyboardLayoutPickerAction extends Action { return Promise.resolve(); } - this.configurationService.updateValue('keyboard.layout', pick.label); + this.configurationService.updateValue('keyboard.layout', getKeyboardLayoutId((pick).layout)); } } diff --git a/src/vs/workbench/services/keybinding/browser/keymapService.ts b/src/vs/workbench/services/keybinding/browser/keymapService.ts index 59acadfcd3e..83c78cc1664 100644 --- a/src/vs/workbench/services/keybinding/browser/keymapService.ts +++ b/src/vs/workbench/services/keybinding/browser/keymapService.ts @@ -6,11 +6,11 @@ import * as nls from 'vs/nls'; import { Emitter, Event } from 'vs/base/common/event'; import { Disposable, toDisposable, IDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; -import { IKeymapService, IKeyboardLayoutInfo, IKeyboardMapping, IWindowsKeyboardMapping, IWindowsKeyboardLayoutInfo, IMacKeyboardLayoutInfo, ILinuxKeyboardLayoutInfo, KeymapInfo, IRawMixedKeyboardMapping } from 'vs/workbench/services/keybinding/common/keymapInfo'; +import { IKeymapService, IKeyboardLayoutInfo, IKeyboardMapping, IWindowsKeyboardMapping, KeymapInfo, IRawMixedKeyboardMapping, getKeyboardLayoutId } from 'vs/workbench/services/keybinding/common/keymapInfo'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { DispatchConfig } from 'vs/workbench/services/keybinding/common/dispatchConfig'; import { IKeyboardMapper, CachedKeyboardMapper } from 'vs/workbench/services/keybinding/common/keyboardMapper'; -import { OS, OperatingSystem, isMacintosh, isWindows, isLinux } from 'vs/base/common/platform'; +import { OS, OperatingSystem, isMacintosh, isWindows } from 'vs/base/common/platform'; import { WindowsKeyboardMapper } from 'vs/workbench/services/keybinding/common/windowsKeyboardMapper'; import { MacLinuxFallbackKeyboardMapper } from 'vs/workbench/services/keybinding/common/macLinuxFallbackKeyboardMapper'; import { IKeyboardEvent } from 'vs/platform/keybinding/common/keybinding'; @@ -41,6 +41,10 @@ export class BrowserKeyboardMapperFactory { private _mru: KeymapInfo[]; private _activeKeymapInfo: KeymapInfo | null; + get activeKeymap(): KeymapInfo | null { + return this._activeKeymapInfo; + } + get keymapInfos(): KeymapInfo[] { return this._keymapInfos; } @@ -233,21 +237,7 @@ export class BrowserKeyboardMapperFactory { } public setKeyboardLayout(layoutName: string) { - let allKeyboardLayouts = this.keymapInfos; - let matchedLayouts: KeymapInfo[] = []; - if (isWindows) { - matchedLayouts = allKeyboardLayouts.filter(layout => (layout.layout).name === layoutName); - } - - if (isMacintosh) { - // todo, probably we should use layout.id? - matchedLayouts = allKeyboardLayouts.filter(layout => (layout.layout).lang === layoutName); - } - - if (isLinux) { - // todo, probably we should use layout.id? - matchedLayouts = allKeyboardLayouts.filter(layout => (layout.layout).layout === layoutName); - } + let matchedLayouts: KeymapInfo[] = this.keymapInfos.filter(keymapInfo => getKeyboardLayoutId(keymapInfo.layout) === layoutName); if (matchedLayouts.length > 0) { this.setActiveKeymapInfo(matchedLayouts[0]); @@ -498,8 +488,8 @@ class BrowserKeymapService extends Disposable implements IKeymapService { constructor( @IEnvironmentService environmentService: IEnvironmentService, - @IConfigurationService configurationService: IConfigurationService, @IFileService fileService: IFileService, + @IConfigurationService private configurationService: IConfigurationService, ) { super(); const keyboardConfig = configurationService.getValue<{ layout: string }>('keyboard'); @@ -530,6 +520,8 @@ class BrowserKeymapService extends Disposable implements IKeymapService { this._userKeyboardLayout.initialize().then(() => { if (this._userKeyboardLayout.keyboardLayout) { BrowserKeyboardMapperFactory.INSTANCE.registerKeyboardLayout(this._userKeyboardLayout.keyboardLayout); + + this.setUserKeyboardLayoutIfMatched(); } }); @@ -548,10 +540,24 @@ class BrowserKeymapService extends Disposable implements IKeymapService { } } - // TODO: trigger keymap update + this.setUserKeyboardLayoutIfMatched(); })); } + setUserKeyboardLayoutIfMatched() { + const keyboardConfig = this.configurationService.getValue<{ layout: string }>('keyboard'); + const layout = keyboardConfig.layout; + + if (layout && this._userKeyboardLayout.keyboardLayout) { + if (getKeyboardLayoutId(this._userKeyboardLayout.keyboardLayout.layout) === layout && BrowserKeyboardMapperFactory.INSTANCE.activeKeymap) { + + if (!this._userKeyboardLayout.keyboardLayout.equal(BrowserKeyboardMapperFactory.INSTANCE.activeKeymap)) { + BrowserKeyboardMapperFactory.INSTANCE.setActiveKeymapInfo(this._userKeyboardLayout.keyboardLayout); + } + } + } + } + registerKeyboardListener() { this.layoutChangeListener.value = BrowserKeyboardMapperFactory.INSTANCE.onDidChangeKeyboardMapper(() => { this._onDidChangeKeyboardMapper.fire(); diff --git a/src/vs/workbench/services/keybinding/common/keymapInfo.ts b/src/vs/workbench/services/keybinding/common/keymapInfo.ts index 6edaa141dc0..c4159da4c6f 100644 --- a/src/vs/workbench/services/keybinding/common/keymapInfo.ts +++ b/src/vs/workbench/services/keybinding/common/keymapInfo.ts @@ -127,7 +127,7 @@ export function areKeyboardLayoutsEqual(a: IKeyboardLayoutInfo | null, b: IKeybo return false; } -export function parseKeyboardLayout(layout: IKeyboardLayoutInfo | null): { label: string, description: string } { +export function parseKeyboardLayoutDescription(layout: IKeyboardLayoutInfo | null): { label: string, description: string } { if (!layout) { return { label: '', description: '' }; } @@ -177,6 +177,18 @@ export function parseKeyboardLayout(layout: IKeyboardLayoutInfo | null): { label }; } +export function getKeyboardLayoutId(layout: IKeyboardLayoutInfo): string { + if ((layout).name) { + return (layout).name; + } + + if ((layout).id) { + return (layout).id; + } + + return (layout).layout; +} + function deserializeMapping(serializedMapping: ISerializedMapping) { let mapping = serializedMapping; @@ -282,6 +294,18 @@ export class KeymapInfo { return score; } + equal(other: KeymapInfo): boolean { + if (this.isUserKeyboardLayout !== other.isUserKeyboardLayout) { + return false; + } + + if (getKeyboardLayoutId(this.layout) !== getKeyboardLayoutId(other.layout)) { + return false; + } + + return this.fuzzyEqual(other.mapping); + } + fuzzyEqual(other: IRawMixedKeyboardMapping): boolean { for (let key in other) { if (isWindows && (key === 'Backslash' || key === 'KeyQ')) { From 5ec5ca6f2cafd2175bd5e2af7cc8c4e16dfdc197 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 20 Jun 2019 11:54:26 -0700 Subject: [PATCH 0481/1449] Have `.get` return promise directly --- .../webview/browser/pre/service-worker.js | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/service-worker.js b/src/vs/workbench/contrib/webview/browser/pre/service-worker.js index d36d3cca24e..09157ea5121 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/service-worker.js +++ b/src/vs/workbench/contrib/webview/browser/pre/service-worker.js @@ -29,10 +29,11 @@ class RequestStore { /** * @param {string} webviewId * @param {string} path - * @return {RequestStoreEntry | undefined} + * @return {Promise | undefined} */ get(webviewId, path) { - return this.map.get(this._key(webviewId, path)); + const entry = this.map.get(this._key(webviewId, path)); + return entry && entry.promise; } /** @@ -43,18 +44,19 @@ class RequestStore { create(webviewId, path) { const existing = this.get(webviewId, path); if (existing) { - return existing.promise; + return existing; } let resolve; const promise = new Promise(r => resolve = r); const entry = { resolve, promise }; - this.map.set(this._key(webviewId, path), entry); + const key = this._key(webviewId, path); + this.map.set(key, entry); const dispose = () => { clearTimeout(timeout); - const existing = this.get(webviewId, path); - if (existing === entry) { - return this.map.delete(this._key(webviewId, path)); + const existingEntry = this.map.get(key); + if (existingEntry === entry) { + return this.map.delete(key); } }; const timeout = setTimeout(dispose, resolveTimeout); @@ -68,7 +70,7 @@ class RequestStore { * @return {boolean} */ resolve(webviewId, path, result) { - const entry = this.get(webviewId, path); + const entry = this.map.get(this._key(webviewId, path)); if (!entry) { return false; } @@ -185,7 +187,7 @@ async function processResourceRequest(event, requestUrl) { // Check if we've already resolved this request const existing = resourceRequestStore.get(webviewId, resourcePath); if (existing) { - return existing.promise.then(resolveResourceEntry); + return existing.then(resolveResourceEntry); } parentClient.postMessage({ @@ -233,7 +235,7 @@ async function processLocalhostRequest(event, requestUrl) { // Check if we've already resolved this request const existing = localhostRequestStore.get(webviewId, origin); if (existing) { - return existing.promise.then(resolveRedirect); + return existing.then(resolveRedirect); } parentClient.postMessage({ From 6d88e8b576ebc19cf707032c9c4b7b238e1cc564 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 20 Jun 2019 12:00:26 -0700 Subject: [PATCH 0482/1449] Make sure we wait until service worker is ready before creating content --- .../contrib/webview/browser/pre/main.js | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index b46a63a7c8f..caef053b16f 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -119,8 +119,12 @@ // Service worker for resource loading const FAKE_LOAD = !!navigator.serviceWorker; - if (navigator.serviceWorker) { - navigator.serviceWorker.register('service-worker.js'); + + const workerReady = new Promise(resolve => { + if (!navigator.serviceWorker) { + resolve(); + } + navigator.serviceWorker.register('service-worker.js').finally(resolve); function forwardFromHostToWorker(channel) { host.onMessage(channel, event => { @@ -137,7 +141,7 @@ host.postMessage(event.data.channel, event.data); } }); - } + }); /** * @param {HTMLDocument?} document @@ -234,7 +238,6 @@ document.addEventListener('DOMContentLoaded', () => { const idMatch = document.location.search.match(/\bid=([\w-]+)/); const ID = idMatch ? idMatch[1] : undefined; - if (!document.body) { return; } @@ -261,8 +264,16 @@ } }); + // update iframe-contents - host.onMessage('content', (_event, data) => { + let updateId = 0; + host.onMessage('content', async (_event, data) => { + const currentUpdateId = ++updateId; + await workerReady; + if (currentUpdateId !== updateId) { + return; + } + const options = data.options; const text = data.contents; From 355b5692ff64a3604ddad9ea4a8076f6fb9545cd Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 20 Jun 2019 14:36:48 -0700 Subject: [PATCH 0483/1449] Add version check to service worker Try to make sure our page is talking to the expected version of the service worker --- .../contrib/webview/browser/pre/index.html | 99 ++++++++++++++----- .../contrib/webview/browser/pre/main.js | 28 +----- .../webview/browser/pre/service-worker.js | 16 ++- 3 files changed, 94 insertions(+), 49 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/index.html b/src/vs/workbench/contrib/webview/browser/pre/index.html index 9727c148c3f..4128a65be4a 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/index.html +++ b/src/vs/workbench/contrib/webview/browser/pre/index.html @@ -16,38 +16,91 @@ - + + \ No newline at end of file diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index caef053b16f..c30f0c79592 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -99,7 +99,8 @@ * postMessage: (channel: string, data?: any) => void, * onMessage: (channel: string, handler: any) => void, * injectHtml?: (document: HTMLDocument) => void, - * focusIframeOnCreate?: boolean + * focusIframeOnCreate?: boolean, + * ready?: Promise * }} HostCommunications */ @@ -120,29 +121,6 @@ // Service worker for resource loading const FAKE_LOAD = !!navigator.serviceWorker; - const workerReady = new Promise(resolve => { - if (!navigator.serviceWorker) { - resolve(); - } - navigator.serviceWorker.register('service-worker.js').finally(resolve); - - function forwardFromHostToWorker(channel) { - host.onMessage(channel, event => { - navigator.serviceWorker.ready.then(registration => { - registration.active.postMessage({ channel: channel, data: event.data.args }); - }); - }); - } - forwardFromHostToWorker('did-load-resource'); - forwardFromHostToWorker('did-load-localhost'); - - navigator.serviceWorker.addEventListener('message', event => { - if (['load-resource', 'load-localhost'].includes(event.data.channel)) { - host.postMessage(event.data.channel, event.data); - } - }); - }); - /** * @param {HTMLDocument?} document * @param {HTMLElement?} body @@ -269,7 +247,7 @@ let updateId = 0; host.onMessage('content', async (_event, data) => { const currentUpdateId = ++updateId; - await workerReady; + await host.ready; if (currentUpdateId !== updateId) { return; } diff --git a/src/vs/workbench/contrib/webview/browser/pre/service-worker.js b/src/vs/workbench/contrib/webview/browser/pre/service-worker.js index 09157ea5121..7e200dc4e98 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/service-worker.js +++ b/src/vs/workbench/contrib/webview/browser/pre/service-worker.js @@ -2,6 +2,8 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +const VERSION = 1; + /** * Root path for resources */ @@ -106,8 +108,20 @@ const notFoundResponse = new Response('Not Found', { status: 404, }); -self.addEventListener('message', (event) => { +self.addEventListener('message', async (event) => { switch (event.data.channel) { + case 'version': + { + self.clients.get(event.source.id).then(client => { + if (client) { + client.postMessage({ + channel: 'version', + version: VERSION + }); + } + }); + return; + } case 'did-load-resource': { const webviewId = getWebviewIdForClient(event.source); From 02db6311403f8d9967b13d4a73e764d034aa3677 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 20 Jun 2019 14:38:58 -0700 Subject: [PATCH 0484/1449] Don't use clone as much --- .../contrib/webview/browser/pre/service-worker.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/service-worker.js b/src/vs/workbench/contrib/webview/browser/pre/service-worker.js index 7e200dc4e98..23f08be0281 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/service-worker.js +++ b/src/vs/workbench/contrib/webview/browser/pre/service-worker.js @@ -104,9 +104,8 @@ const resourceRequestStore = new RequestStore(); */ const localhostRequestStore = new RequestStore(); -const notFoundResponse = new Response('Not Found', { - status: 404, -}); +const notFound = () => + new Response('Not Found', { status: 404, }); self.addEventListener('message', async (event) => { switch (event.data.channel) { @@ -176,7 +175,7 @@ async function processResourceRequest(event, requestUrl) { const client = await self.clients.get(event.clientId); if (!client) { console.log('Could not find inner client for request'); - return notFoundResponse.clone(); + return notFound(); } const webviewId = getWebviewIdForClient(client); @@ -184,7 +183,7 @@ async function processResourceRequest(event, requestUrl) { function resolveResourceEntry(entry) { if (!entry) { - return notFoundResponse.clone(); + return notFound(); } return new Response(entry.body, { status: 200, @@ -195,7 +194,7 @@ async function processResourceRequest(event, requestUrl) { const parentClient = await getOuterIframeClient(webviewId); if (!parentClient) { console.log('Could not find parent client for request'); - return notFoundResponse.clone(); + return notFound(); } // Check if we've already resolved this request @@ -243,7 +242,7 @@ async function processLocalhostRequest(event, requestUrl) { const parentClient = await getOuterIframeClient(webviewId); if (!parentClient) { console.log('Could not find parent client for request'); - return notFoundResponse.clone(); + return notFound(); } // Check if we've already resolved this request From d0796114464da951e6447e80e85142404c814e13 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 20 Jun 2019 15:35:19 -0700 Subject: [PATCH 0485/1449] Move host javascript to own file --- .../contrib/webview/browser/pre/host.js | 90 +++++++++++++++++++ .../contrib/webview/browser/pre/index.html | 89 +----------------- 2 files changed, 91 insertions(+), 88 deletions(-) create mode 100644 src/vs/workbench/contrib/webview/browser/pre/host.js diff --git a/src/vs/workbench/contrib/webview/browser/pre/host.js b/src/vs/workbench/contrib/webview/browser/pre/host.js new file mode 100644 index 00000000000..71acbf4b8a3 --- /dev/null +++ b/src/vs/workbench/contrib/webview/browser/pre/host.js @@ -0,0 +1,90 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// @ts-check +(function () { + const id = document.location.search.match(/\bid=([\w-]+)/)[1]; + + const hostMessaging = new class HostMessaging { + constructor() { + this.handlers = new Map(); + window.addEventListener('message', (e) => { + if (e.data && (e.data.command === 'onmessage' || e.data.command === 'do-update-state')) { + // Came from inner iframe + this.postMessage(e.data.command, e.data.data); + return; + } + + const channel = e.data.channel; + const handler = this.handlers.get(channel); + if (handler) { + handler(e, e.data.args); + } else { + console.log('no handler for ', e); + } + }); + } + + postMessage(channel, data) { + window.parent.postMessage({ target: id, channel, data }, '*'); + } + + onMessage(channel, handler) { + this.handlers.set(channel, handler); + } + }(); + + const workerReady = new Promise(async (resolveWorkerReady) => { + if (!navigator.serviceWorker) { + resolveWorkerReady(); + } + + const expectedWorkerVersion = 1; + + navigator.serviceWorker.register('service-worker.js').then(async registration => { + await navigator.serviceWorker.ready; + + const versionHandler = (event) => { + if (event.data.channel !== 'version') { + return; + } + + navigator.serviceWorker.removeEventListener('message', versionHandler); + if (event.data.version === expectedWorkerVersion) { + return resolveWorkerReady(); + } else { + // If we have the wrong version, try once to unregister and re-register + return registration.unregister() + .then(() => navigator.serviceWorker.register('service-worker.js')) + .then(navigator.serviceWorker.ready) + .finally(resolveWorkerReady); + } + }; + navigator.serviceWorker.addEventListener('message', versionHandler); + registration.active.postMessage({ channel: 'version' }); + }); + + const forwardFromHostToWorker = (channel) => { + hostMessaging.onMessage(channel, event => { + navigator.serviceWorker.ready.then(registration => { + registration.active.postMessage({ channel: channel, data: event.data.args }); + }); + }); + }; + forwardFromHostToWorker('did-load-resource'); + forwardFromHostToWorker('did-load-localhost'); + + navigator.serviceWorker.addEventListener('message', event => { + if (['load-resource', 'load-localhost'].includes(event.data.channel)) { + hostMessaging.postMessage(event.data.channel, event.data); + } + }); + }); + var createWebviewManager; + createWebviewManager({ + postMessage: hostMessaging.postMessage.bind(hostMessaging), + onMessage: hostMessaging.onMessage.bind(hostMessaging), + ready: workerReady, + }); +}()); \ No newline at end of file diff --git a/src/vs/workbench/contrib/webview/browser/pre/index.html b/src/vs/workbench/contrib/webview/browser/pre/index.html index 4128a65be4a..03337a5f6af 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/index.html +++ b/src/vs/workbench/contrib/webview/browser/pre/index.html @@ -13,94 +13,7 @@ - + \ No newline at end of file From 6c22b0bf877efcf7aa84dc406d92ca6b2d614e90 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 20 Jun 2019 15:37:38 -0700 Subject: [PATCH 0486/1449] Update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c9fcfda77b2..8ea694500f2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "cb72005ab15a4d369209542fbfa4e64c06db2111", + "distro": "8bfb613ef059967ffe5a69e3b151c29885c8c108", "author": { "name": "Microsoft Corporation" }, From d31a864e59f5d443f5ef7a779a0bfd86486a5af5 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Thu, 20 Jun 2019 15:55:23 -0700 Subject: [PATCH 0487/1449] Remove icon explorations before shipping stable --- src/vs/base/browser/ui/actionbar/actionbar.ts | 3 - src/vs/base/browser/ui/tree/media/tree.css | 10 - src/vs/workbench/browser/layout.ts | 30 +- src/vs/workbench/browser/media/icons.css | 1268 ----------------- .../media/images/activitybar/debug-alt1.svg | 18 - .../images/activitybar/extensions-alt1.svg | 6 - .../media/images/activitybar/files-alt1.svg | 3 - .../media/images/activitybar/git-alt1.svg | 13 - .../media/images/activitybar/more-alt1.svg | 5 - .../images/activitybar/references-alt1.svg | 4 - .../media/images/activitybar/search-alt1.svg | 11 - .../images/activitybar/settings-alt1.svg | 3 - .../browser/media/images/debug/add-alt1.svg | 3 - .../images/debug/breakpoint-activate-alt1.svg | 3 - .../media/images/debug/breakpoint-alt1.svg | 3 - .../debug/breakpoint-conditional-alt1.svg | 3 - .../images/debug/breakpoint-function-alt1.svg | 3 - .../breakpoint-function-disabled-alt1.svg | 3 - .../breakpoint-function-unverified-alt1.svg | 3 - .../images/debug/breakpoint-log-alt1.svg | 3 - .../debug/breakpoint-log-unverified-alt1.svg | 3 - .../debug/breakpoint-unverified-alt1.svg | 3 - .../browser/media/images/debug/close-alt1.svg | 5 - .../media/images/debug/continue-alt1.svg | 4 - .../debug/current-and-breakpoint-alt1.svg | 4 - .../media/images/debug/current-arrow-alt1.svg | 3 - .../media/images/debug/disconnect-alt1.svg | 3 - .../browser/media/images/debug/drag-alt1.svg | 8 - .../browser/media/images/debug/gear-alt1.svg | 4 - .../browser/media/images/debug/pause-alt1.svg | 3 - .../browser/media/images/debug/repl-alt1.svg | 5 - .../media/images/debug/restart-alt1.svg | 5 - .../debug/stackframe-and-breakpoint-alt1.svg | 4 - .../images/debug/stackframe-arrow-alt1.svg | 3 - .../browser/media/images/debug/start-alt1.svg | 3 - .../media/images/debug/step-into-alt1.svg | 11 - .../media/images/debug/step-out-alt1.svg | 11 - .../media/images/debug/step-over-alt1.svg | 9 - .../browser/media/images/debug/stop-alt1.svg | 3 - .../media/images/editor/open-change-alt1.svg | 8 - .../images/editor/split-horizontal-alt1.svg | 4 - .../images/editor/split-vertical-alt1.svg | 4 - .../media/images/explorer/add-file-alt1.svg | 5 - .../media/images/explorer/add-folder-alt1.svg | 5 - .../media/images/explorer/close-alt1.svg | 5 - .../media/images/explorer/collapse-alt1.svg | 4 - .../media/images/explorer/layout-alt1.svg | 3 - .../media/images/explorer/more-alt1.svg | 5 - .../media/images/explorer/refresh-alt1.svg | 3 - .../media/images/explorer/save-alt1.svg | 6 - .../media/images/extensions/clear-alt1.svg | 7 - .../media/images/extensions/download-alt1.svg | 4 - .../media/images/extensions/gear-alt1.svg | 4 - .../images/extensions/star-empty-alt1.svg | 4 - .../images/extensions/star-full-alt1.svg | 4 - .../images/extensions/star-half-alt1.svg | 3 - .../browser/media/images/find/close-alt1.svg | 4 - .../media/images/find/collapse-alt1.svg | 3 - .../browser/media/images/find/expand-alt1.svg | 3 - .../browser/media/images/find/next-alt1.svg | 3 - .../media/images/find/previous-alt1.svg | 3 - .../media/images/find/replace-all-alt1.svg | 9 - .../media/images/find/replace-alt1.svg | 6 - .../media/images/find/selection-alt1.svg | 3 - .../browser/media/images/git/check-alt1.svg | 3 - .../browser/media/images/git/clean-alt1.svg | 3 - .../browser/media/images/git/close-alt1.svg | 4 - .../media/images/git/gotofile-alt1.svg | 5 - .../browser/media/images/git/initialze.svg | 3 - .../browser/media/images/git/next-alt1.svg | 3 - .../media/images/git/previous-alt1.svg | 3 - .../browser/media/images/git/refresh-alt1.svg | 3 - .../browser/media/images/git/stage-alt1.svg | 3 - .../browser/media/images/git/unstage-alt1.svg | 4 - .../media/images/git/whitespace-alt1.svg | 3 - .../media/images/intellisense/array-alt1.svg | 4 - .../images/intellisense/boolean-alt1.svg | 5 - .../media/images/intellisense/class-alt1.svg | 3 - .../media/images/intellisense/close-alt1.svg | 4 - .../media/images/intellisense/color-alt1.svg | 3 - .../images/intellisense/constant-alt1.svg | 3 - .../images/intellisense/enum-member-alt1.svg | 4 - .../images/intellisense/enumerator-alt1.svg | 4 - .../media/images/intellisense/event-alt1.svg | 3 - .../media/images/intellisense/field-alt1.svg | 3 - .../media/images/intellisense/file-alt1.svg | 3 - .../media/images/intellisense/folder-alt1.svg | 3 - .../media/images/intellisense/info-alt1.svg | 3 - .../images/intellisense/interface-alt1.svg | 5 - .../media/images/intellisense/key-alt1.svg | 8 - .../images/intellisense/keyword-alt1.svg | 3 - .../images/intellisense/lightbulb-alt1.svg | 3 - .../intellisense/lightbulb-autofix-alt1.svg | 4 - .../media/images/intellisense/method-alt1.svg | 3 - .../images/intellisense/namespace-alt1.svg | 4 - .../images/intellisense/numeric-alt1.svg | 6 - .../images/intellisense/operator-alt1.svg | 8 - .../images/intellisense/parameter-alt1.svg | 5 - .../images/intellisense/property-alt1.svg | 3 - .../images/intellisense/reference-alt1.svg | 5 - .../media/images/intellisense/ruler-alt1.svg | 3 - .../images/intellisense/snippet-alt1.svg | 9 - .../media/images/intellisense/string-alt1.svg | 4 - .../images/intellisense/structure-alt1.svg | 3 - .../images/intellisense/variable-alt1.svg | 4 - .../browser/media/images/misc/clear-alt1.svg | 7 - .../browser/media/images/misc/fold-alt1.svg | 3 - .../media/images/misc/gotofile-alt1.svg | 5 - .../browser/media/images/misc/json-alt1.svg | 14 - .../media/images/misc/keyboard-alt1.svg | 15 - .../browser/media/images/misc/more-alt1.svg | 5 - .../media/images/misc/precedence-alt1.svg | 7 - .../media/images/misc/preview-alt1.svg | 4 - .../media/images/misc/preview-icon-alt1.svg | 7 - .../browser/media/images/misc/split-alt1.svg | 4 - .../browser/media/images/misc/unfold-alt1.svg | 3 - .../media/images/notifications/close-alt1.svg | 4 - .../images/notifications/closeall-alt1.svg | 5 - .../images/notifications/configure-alt1.svg | 4 - .../media/images/notifications/down-alt1.svg | 10 - .../media/images/notifications/error-alt1.svg | 3 - .../media/images/notifications/info-alt1.svg | 5 - .../media/images/notifications/up-alt1.svg | 10 - .../images/notifications/warning-alt1.svg | 5 - .../browser/media/images/panel/add-alt1.svg | 3 - .../browser/media/images/panel/clear-alt1.svg | 7 - .../media/images/panel/close-all-alt1.svg | 5 - .../browser/media/images/panel/close-alt1.svg | 4 - .../media/images/panel/collapse-all-alt1.svg | 4 - .../browser/media/images/panel/down-alt1.svg | 10 - .../browser/media/images/panel/gear-alt1.svg | 4 - .../media/images/panel/gotofile-alt1.svg | 5 - .../browser/media/images/panel/kill-alt1.svg | 8 - .../media/images/panel/output-lock-alt1.svg | 3 - .../media/images/panel/output-unlock-alt1.svg | 3 - .../images/panel/split-horizontal-alt1.svg | 4 - .../images/panel/split-vertical-alt1.svg | 4 - .../browser/media/images/panel/up-alt1.svg | 10 - .../images/search/case-sensitive-alt1.svg | 4 - .../media/images/search/clear-alt1.svg | 7 - .../media/images/search/collapse-all-alt1.svg | 4 - .../media/images/search/collapse-alt1.svg | 3 - .../media/images/search/exclude-alt1.svg | 5 - .../media/images/search/expand-alt1.svg | 3 - .../browser/media/images/search/more-alt1.svg | 5 - .../media/images/search/refresh-alt1.svg | 3 - .../media/images/search/regex-alt1.svg | 4 - .../media/images/search/remove-alt1.svg | 4 - .../media/images/search/replace-all-alt1.svg | 9 - .../media/images/search/replace-alt1.svg | 6 - .../browser/media/images/search/stop-alt1.svg | 3 - .../media/images/search/whole-word-alt1.svg | 7 - .../browser/media/images/tree/close-alt1.svg | 4 - .../media/images/tree/collapse-alt1.svg | 3 - .../browser/media/images/tree/dirty-alt1.svg | 3 - .../browser/media/images/tree/expand-alt1.svg | 3 - .../media/images/tree/expand-empty.svg | 2 - src/vs/workbench/browser/style.ts | 1 - .../browser/workbench.contribution.ts | 6 - 159 files changed, 1 insertion(+), 2048 deletions(-) delete mode 100644 src/vs/workbench/browser/media/icons.css delete mode 100644 src/vs/workbench/browser/media/images/activitybar/debug-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/activitybar/extensions-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/activitybar/files-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/activitybar/git-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/activitybar/more-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/activitybar/references-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/activitybar/search-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/activitybar/settings-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/debug/add-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/debug/breakpoint-activate-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/debug/breakpoint-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/debug/breakpoint-conditional-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/debug/breakpoint-function-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/debug/breakpoint-function-disabled-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/debug/breakpoint-function-unverified-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/debug/breakpoint-log-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/debug/breakpoint-log-unverified-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/debug/breakpoint-unverified-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/debug/close-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/debug/continue-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/debug/current-and-breakpoint-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/debug/current-arrow-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/debug/disconnect-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/debug/drag-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/debug/gear-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/debug/pause-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/debug/repl-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/debug/restart-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/debug/stackframe-and-breakpoint-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/debug/stackframe-arrow-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/debug/start-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/debug/step-into-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/debug/step-out-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/debug/step-over-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/debug/stop-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/editor/open-change-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/editor/split-horizontal-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/editor/split-vertical-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/explorer/add-file-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/explorer/add-folder-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/explorer/close-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/explorer/collapse-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/explorer/layout-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/explorer/more-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/explorer/refresh-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/explorer/save-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/extensions/clear-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/extensions/download-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/extensions/gear-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/extensions/star-empty-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/extensions/star-full-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/extensions/star-half-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/find/close-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/find/collapse-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/find/expand-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/find/next-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/find/previous-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/find/replace-all-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/find/replace-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/find/selection-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/git/check-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/git/clean-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/git/close-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/git/gotofile-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/git/initialze.svg delete mode 100644 src/vs/workbench/browser/media/images/git/next-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/git/previous-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/git/refresh-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/git/stage-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/git/unstage-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/git/whitespace-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/array-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/boolean-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/class-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/close-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/color-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/constant-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/enum-member-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/enumerator-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/event-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/field-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/file-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/folder-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/info-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/interface-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/key-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/keyword-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/lightbulb-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/lightbulb-autofix-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/method-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/namespace-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/numeric-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/operator-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/parameter-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/property-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/reference-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/ruler-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/snippet-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/string-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/structure-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/intellisense/variable-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/misc/clear-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/misc/fold-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/misc/gotofile-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/misc/json-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/misc/keyboard-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/misc/more-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/misc/precedence-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/misc/preview-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/misc/preview-icon-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/misc/split-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/misc/unfold-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/notifications/close-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/notifications/closeall-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/notifications/configure-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/notifications/down-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/notifications/error-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/notifications/info-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/notifications/up-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/notifications/warning-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/panel/add-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/panel/clear-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/panel/close-all-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/panel/close-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/panel/collapse-all-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/panel/down-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/panel/gear-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/panel/gotofile-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/panel/kill-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/panel/output-lock-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/panel/output-unlock-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/panel/split-horizontal-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/panel/split-vertical-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/panel/up-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/search/case-sensitive-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/search/clear-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/search/collapse-all-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/search/collapse-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/search/exclude-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/search/expand-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/search/more-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/search/refresh-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/search/regex-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/search/remove-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/search/replace-all-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/search/replace-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/search/stop-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/search/whole-word-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/tree/close-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/tree/collapse-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/tree/dirty-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/tree/expand-alt1.svg delete mode 100644 src/vs/workbench/browser/media/images/tree/expand-empty.svg diff --git a/src/vs/base/browser/ui/actionbar/actionbar.ts b/src/vs/base/browser/ui/actionbar/actionbar.ts index e76fd3a6bbc..ffef9180cc6 100644 --- a/src/vs/base/browser/ui/actionbar/actionbar.ts +++ b/src/vs/base/browser/ui/actionbar/actionbar.ts @@ -259,9 +259,6 @@ export class ActionViewItem extends BaseActionViewItem { this.label.setAttribute('role', 'menuitem'); } else { this.label.setAttribute('role', 'button'); - - // TODO @misolori remove before shipping stable - this.label.setAttribute('data-title', this._action.id); } } diff --git a/src/vs/base/browser/ui/tree/media/tree.css b/src/vs/base/browser/ui/tree/media/tree.css index 85dcafe22b1..262b33ded22 100644 --- a/src/vs/base/browser/ui/tree/media/tree.css +++ b/src/vs/base/browser/ui/tree/media/tree.css @@ -22,16 +22,6 @@ left: 10px; } -/* TODO @misolori remove before shipping stable */ -body:not([data-exploration="icon-exploration"]) .monaco-tl-indent { - left: 16px; -} - -/* TODO @misolori remove before shipping stable */ -body:not([data-exploration="icon-exploration"]) .hide-arrows .monaco-tl-indent { - left: 10px; -} - .monaco-tl-indent > svg { overflow: visible; } diff --git a/src/vs/workbench/browser/layout.ts b/src/vs/workbench/browser/layout.ts index e06870b2bb7..87171e900c6 100644 --- a/src/vs/workbench/browser/layout.ts +++ b/src/vs/workbench/browser/layout.ts @@ -45,8 +45,6 @@ enum Settings { ZEN_MODE_RESTORE = 'zenMode.restore', - // TODO @misolori remove before shipping stable - ICON_EXPLORATION_ENABLED = 'workbench.iconExploration.enabled' } enum Storage { @@ -160,12 +158,8 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi wasSideBarVisible: false, wasPanelVisible: false, transitionDisposeables: new DisposableStore() - }, - - // TODO @misolori remove before shipping stable - iconExploration: { - enabled: false } + }; constructor( @@ -299,11 +293,6 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi const newMenubarVisibility = this.configurationService.getValue(Settings.MENUBAR_VISIBLE); this.setMenubarVisibility(newMenubarVisibility, !!skipLayout); - // TODO @misolori remove before shipping stable - // Icon exploration on setting change - const newIconExplorationEnabled = this.configurationService.getValue(Settings.ICON_EXPLORATION_ENABLED); - this.setIconExploration(newIconExplorationEnabled); - } private setSideBarPosition(position: Position): void { @@ -417,10 +406,6 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi // Zen mode enablement this.state.zenMode.restore = this.storageService.getBoolean(Storage.ZEN_MODE_ENABLED, StorageScope.WORKSPACE, false) && this.configurationService.getValue(Settings.ZEN_MODE_RESTORE); - // TODO @misolori remove before shipping stable - // Icon exploration - this.state.iconExploration.enabled = this.configurationService.getValue(Settings.ICON_EXPLORATION_ENABLED); - this.setIconExploration(this.state.iconExploration.enabled); } private resolveEditorsToOpen(fileService: IFileService): Promise | IResourceEditor[] { @@ -689,19 +674,6 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi } } - // TODO @misolori remove before shipping stable - private setIconExploration(enabled: boolean): void { - this.state.iconExploration.enabled = enabled; - - // Update DOM - if (enabled) { - document.body.dataset.exploration = 'icon-exploration'; - } else { - document.body.dataset.exploration = ''; - } - - } - protected createWorkbenchLayout(instantiationService: IInstantiationService): void { const titleBar = this.getPart(Parts.TITLEBAR_PART); const editorPart = this.getPart(Parts.EDITOR_PART); diff --git a/src/vs/workbench/browser/media/icons.css b/src/vs/workbench/browser/media/icons.css deleted file mode 100644 index a730544fcb7..00000000000 --- a/src/vs/workbench/browser/media/icons.css +++ /dev/null @@ -1,1268 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -/**************** - Colors -****************/ -:root { - --blue: #00539c; - --gray: #424242; - --grayLight: #848484; - --green: #388a34; - --greenLight: #9cce9c; - --orange: #c27d1a; - --orangeLight: #ff8e00; - --purple: #652d90; - --red: #a31515; - --redLight: #e51400; - --yellow: #fc0; -} - -:root .vs-dark { - --blue: #75beff; - --gray: #c5c5c5; - --grayLight: #848484; - --green: #89d185; - --greenLight: #9cce9c; - --orange: #e8ab53; - --orangeLight: #ff8e00; - --purple: #b180d7; - --red: #f48771; - --redLight: #e51400; - --yellow: #fc0; -} - -:root .hc-black { - --blue: #75beff; - --gray: #FFF; - --grayLight: #FFF; - --green: #89d185; - --greenLight: #9cce9c; - --orange: #e8ab53; - --orangeLight: #ff8e00; - --purple: #b180d7; - --red: #f48771; - --redLight: #e51400; - --yellow: #fc0; -} - - -/**************** - Base -****************/ -body[data-exploration^="icon-exploration"] .monaco-panel-view .panel > .panel-header[aria-label="Open Editors Section"] > .actions .action-label.icon, -body[data-exploration^="icon-exploration"] .monaco-panel-view .panel > .panel-header > .actions .action-label.explorer-action.icon, -body[data-exploration^="icon-exploration"] .monaco-panel-view .panel > .panel-header > .actions .action-label.toolbar-toggle-more.icon, -body[data-exploration^="icon-exploration"] .monaco-workbench .part > .title > .title-actions .actions-container[aria-label^="Explorer"] .icon, -body[data-exploration^="icon-exploration"] .monaco-workbench .part > .title > .title-actions .actions-container[aria-label="Search actions"] .icon, -body[data-exploration^="icon-exploration"] .monaco-findInput > .controls .monaco-custom-checkbox::before, -body[data-exploration^="icon-exploration"] .monaco-workbench .search-view .query-details .file-types .controls > .monaco-custom-checkbox.useExcludesAndIgnoreFiles::before, -body[data-exploration^="icon-exploration"] .markers-panel-action-filter > .markers-panel-filter-controls > .markers-panel-filter-filesExclude::before, -body[data-exploration^="icon-exploration"] .search-view .search-widget .replace-container .monaco-action-bar .action-item .icon, -body[data-exploration^="icon-exploration"] .search-view a[class^="action-"], -body[data-exploration^="icon-exploration"] .monaco-workbench .search-view .query-details .more, -body[data-exploration^="icon-exploration"] .monaco-workbench .part > .title > .title-actions .actions-container[aria-label="Source Control: Git actions"] .icon[data-title="git.commit"], -body[data-exploration^="icon-exploration"] .monaco-workbench .part > .title > .title-actions .actions-container[aria-label="Source Control: Git actions"] .icon[data-title="git.refresh"], -body[data-exploration^="icon-exploration"] .monaco-workbench .part > .title > .title-actions .actions-container[aria-label="Debug actions"] .icon, -body[data-exploration^="icon-exploration"] .monaco-workbench .part > .title > .title-actions .actions-container[aria-label^="Extensions"] .icon, -body[data-exploration^="icon-exploration"] .scm-viewlet .monaco-list-row > .resource > .name > .monaco-icon-label > .actions .action-label[data-title^="git.openFile2"], -body[data-exploration^="icon-exploration"] .scm-viewlet .monaco-list-row > .resource > .name > .monaco-icon-label > .actions .action-label[data-title^="git.unstage"], -body[data-exploration^="icon-exploration"] .scm-viewlet .monaco-list-row > .resource > .name > .monaco-icon-label > .actions .action-label[data-title^="git.stage"], -body[data-exploration^="icon-exploration"] .scm-viewlet .monaco-list-row > .resource > .name > .monaco-icon-label > .actions .action-label[data-title^="git.openChange"], -body[data-exploration^="icon-exploration"] .scm-viewlet .monaco-list-row > .resource > .name > .monaco-icon-label > .actions .action-label[data-title^="git.clean"], -body[data-exploration^="icon-exploration"] .scm-viewlet .monaco-list-row > .resource-group > .actions .action-label[data-title="git.cleanAll"], -body[data-exploration^="icon-exploration"] .scm-viewlet .monaco-list-row > .resource-group > .actions .action-label[data-title="git.stageAll"], -body[data-exploration^="icon-exploration"] .scm-viewlet .monaco-list-row > .resource-group > .actions .action-label[data-title="git.unstageAll"], -body[data-exploration^="icon-exploration"] .monaco-workbench .part > .content > .debug-viewlet .actions .action-label.icon, -body[data-exploration^="icon-exploration"] .monaco-workbench .debug-toolbar .drag-area, -body[data-exploration^="icon-exploration"] .monaco-workbench .debug-toolbar .action-label, -body[data-exploration^="icon-exploration"] .debug-breakpoint, -body[data-exploration^="icon-exploration"] .debug-viewlet .debug-breakpoints .breakpoint > .icon, -body[data-exploration^="icon-exploration"] .extensions-viewlet > .extensions .extension > .details > .footer > .monaco-action-bar .action-item .action-label.extension-action.manage, -body[data-exploration^="icon-exploration"] .extension-ratings > .star, -body[data-exploration^="icon-exploration"] .extensions-viewlet > .extensions .extension > .details > .header-container > .header > .install-count > .octicon, -body[data-exploration^="icon-exploration"] .extension-editor > .header > .details > .subtitle .octicon, -body[data-exploration^="icon-exploration"] .monaco-toolbar .action-label.toolbar-toggle-more, -body[data-exploration^="icon-exploration"] .monaco-workbench .part.panel > .title > .title-actions .monaco-action-bar .action-item .action-label, -body[data-exploration^="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon::before, -body[data-exploration^="icon-exploration"] .monaco-workbench .symbol-icon::before, -body[data-exploration^="icon-exploration"] .monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .header > .close, -body[data-exploration^="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .readMore, -body[data-exploration^="icon-exploration"] .monaco-editor .peekview-widget .head .peekview-title .icon.error, -body[data-exploration^="icon-exploration"] .monaco-editor .peekview-widget .head .peekview-title .icon.warning, -body[data-exploration^="icon-exploration"] .monaco-workbench .notifications-list-container .notification-list-item-icon, -body[data-exploration^="icon-exploration"] .monaco-workbench > .notifications-center > .notifications-center-header .clear-all-notifications-action, -body[data-exploration^="icon-exploration"] .monaco-workbench > .notifications-center > .notifications-center-header .hide-all-notifications-action, -body[data-exploration^="icon-exploration"] .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-toolbar-container .clear-notification-action, -body[data-exploration^="icon-exploration"] .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-toolbar-container .expand-notification-action, -body[data-exploration^="icon-exploration"] .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-toolbar-container .collapse-notification-action, -body[data-exploration^="icon-exploration"] .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-toolbar-container .action-label, -body[data-exploration^="icon-exploration"] .monaco-workbench .activitybar > .content .monaco-action-bar .action-label[title="References"], -body[data-exploration^="icon-exploration"] .markers-panel .marker-icon, -body[data-exploration^="icon-exploration"] .markers-panel .monaco-tl-contents .actions .action-label.icon.markers-panel-action-quickfix, -body[data-exploration^="icon-exploration"] .monaco-tl-twistie.collapsible:not(.loading), -body[data-exploration^="icon-exploration"] .file-icon-themable-tree .monaco-tree-row.has-children .content::before, -body[data-exploration^="icon-exploration"] .file-icon-themable-tree .monaco-tree-row.has-children.expanded .content::before, -body[data-exploration^="icon-exploration"] .monaco-breadcrumbs .monaco-breadcrumb-item:not(:nth-child(2))::before, -body[data-exploration^="icon-exploration"] .monaco-tl-twistie.collapsible.collapsed:not(.loading), -body[data-exploration^="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .tabs-container > .tab.dirty .close-editor-action, -body[data-exploration^="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .close-editor-action, -body[data-exploration^="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .title-actions .action-label[data-title="workbench.action.closeActiveEditor"], -body[data-exploration^="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .editor-actions .action-label[data-title="workbench.action.splitEditor"], -body[data-exploration^="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .editor-actions .action-label[data-title="git.openChange"], -body[data-exploration^="icon-exploration"] .monaco-editor .find-widget .replace-all::before, -body[data-exploration^="icon-exploration"] .monaco-editor .find-widget .replace::before, -body[data-exploration^="icon-exploration"] .monaco-editor .find-widget .previous::before, -body[data-exploration^="icon-exploration"] .monaco-editor .find-widget .next::before, -body[data-exploration^="icon-exploration"] .monaco-editor .find-widget .close-fw::before, -body[data-exploration^="icon-exploration"] .monaco-editor .find-widget .expand::before, -body[data-exploration^="icon-exploration"] .monaco-editor .find-widget .collapse::before, -body[data-exploration^="icon-exploration"] .monaco-editor .find-widget .monaco-checkbox .label::before, -body[data-exploration^="icon-exploration"] .monaco-workbench .quick-open-sidebyside-vertical, -body[data-exploration^="icon-exploration"] .monaco-tree-action.collapse-all, -body[data-exploration^="icon-exploration"] .monaco-editor .debug-breakpoint, -body[data-exploration^="icon-exploration"] .monaco-editor .debug-focused-stack-frame, -body[data-exploration^="icon-exploration"] .monaco-editor .debug-top-stack-frame, -body[data-exploration^="icon-exploration"] .monaco-editor .debug-breakpoint-hint, -body[data-exploration^="icon-exploration"] .monaco-editor .debug-breakpoint-conditional, -body[data-exploration^="icon-exploration"] .monaco-editor .debug-breakpoint-log, -body[data-exploration^="icon-exploration"] .monaco-editor .peekview-widget .head .peekview-title .severity-icon, -body[data-exploration^="icon-exploration"] .monaco-editor .margin-view-overlays .folding, -body[data-exploration^="icon-exploration"] .monaco-workbench .explorer-action.save-all, -body[data-exploration^="icon-exploration"] .monaco-workbench .part > .title > .title-actions .action-label[data-title="git.init"], -body[data-exploration^="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .editor-actions .action-label[data-title="_workbench.openUserSettingsEditor"], -body[data-exploration^="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .editor-actions .action-label[data-title="workbench.action.compareEditor.previousChange"], -body[data-exploration^="icon-exploration"] .monaco-panel-view .panel > .panel-header > .actions .action-label.icon[data-title="git.commit"], -body[data-exploration^="icon-exploration"] .monaco-panel-view .panel > .panel-header > .actions .action-label.icon[data-title="git.refresh"], -body[data-exploration^="icon-exploration"] .monaco-workbench .part > .title > .title-actions .action-label[data-title="references-view.refresh"], -body[data-exploration^="icon-exploration"] .monaco-workbench .part > .title > .title-actions .action-label[data-title="references-view.clear"], -body[data-exploration^="icon-exploration"] .customview-tree .monaco-tree .custom-view-tree-node-item > .custom-view-tree-node-item-resourceLabel > .actions .action-label[data-title="references-view.remove"], -body[data-exploration^="icon-exploration"] .markers-panel .monaco-tl-contents .multiline-actions .action-label.octicon-chevron-up, -body[data-exploration^="icon-exploration"] .markers-panel .monaco-tl-contents .multiline-actions .action-label.octicon-chevron-down, -body[data-exploration^="icon-exploration"] .monaco-workbench .explorer-viewlet .action-close-all-files, -body[data-exploration^="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .editor-group-container-toolbar .close-editor-group, -body[data-exploration^="icon-exploration"] .monaco-workbench .part.panel > .title > .panel-switcher-container.composite-bar > .monaco-action-bar .action-label.toggle-more, -body[data-exploration^="icon-exploration"] .keybindings-editor .monaco-action-bar .action-item > .clear-input, -body[data-exploration^="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .editor-actions .action-label[data-title="workbench.action.openGlobalKeybindingsFile"], -body[data-exploration^="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .editor-actions .action-label[data-title="settings.switchToJSON"], -body[data-exploration^="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .editor-actions .action-label[data-title="markdown.showSource"], -body[data-exploration^="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .tabs-container > .tab.sizing-fit .monaco-icon-label.file-icon[title^="Preview"]::before, -body[data-exploration^="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .editor-actions .action-label[data-title="markdown.showPreviewToSide"], -body[data-exploration^="icon-exploration"] .monaco-editor .peekview-widget .head .peekview-actions > .monaco-action-bar .action-label, -body[data-exploration^="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .editor-actions .action-label[data-title="workbench.action.compareEditor.nextChange"], -body[data-exploration^="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .title-actions .action-label[data-title="workbench.action.compareEditor.previousChange"], -body[data-exploration^="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .title-actions .action-label[data-title="workbench.action.compareEditor.nextChange"], -body[data-exploration^="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .editor-actions .action-label[data-title="git.openFile"], -body[data-exploration^="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .title-actions .action-label[data-title="git.openFile"], -body[data-exploration^="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .editor-actions .action-label[data-title="workbench.action.openGlobalKeybindings"], -body[data-exploration^="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .editor-actions .action-label[data-title="toggle.diff.ignoreTrimWhitespace"], -body[data-exploration^="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .title-actions .action-label[data-title="toggle.diff.ignoreTrimWhitespace"], -body[data-exploration^="icon-exploration"] .monaco-editor .peekview-widget .head .peekview-actions .action-label.icon[data-title="peekview.close"], -body[data-exploration^="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .title-actions .action-label[data-title="workbench.action.splitEditor"], -body[data-exploration^="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .title-actions .action-label[data-title="git.openChange"], -body[data-exploration^="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .tabs-container > .tab.dirty .close-editor-action:hover, -body[data-exploration^="icon-exploration"] .monaco-workbench .explorer-viewlet .explorer-open-editors .monaco-list .monaco-list-row.dirty:not(:hover) > .monaco-action-bar .close-editor-action, -body[data-exploration^="icon-exploration"] .monaco-workbench .explorer-viewlet .explorer-open-editors .close-editor-action { - background-image: none !important; - background: var(--gray); - -webkit-mask-repeat: no-repeat; - -webkit-mask-position: center; - -webkit-mask-size: 16px; -} - -/* Center via Flexbox + Search expand */ -body[data-exploration^="icon-exploration"] .search-view .search-widget .toggle-replace-button.collapse, -body[data-exploration^="icon-exploration"] .search-view .search-widget .toggle-replace-button.expand, -body[data-exploration^="icon-exploration"] .monaco-editor .find-widget .replace-all, -body[data-exploration^="icon-exploration"] .monaco-editor .find-widget .replace, -body[data-exploration^="icon-exploration"] .monaco-editor .find-widget .previous, -body[data-exploration^="icon-exploration"] .monaco-editor .find-widget .next, -body[data-exploration^="icon-exploration"] .monaco-editor .find-widget .close-fw, -body[data-exploration^="icon-exploration"] .monaco-editor .find-widget .expand, -body[data-exploration^="icon-exploration"] .monaco-editor .find-widget .collapse, -body[data-exploration^="icon-exploration"] .monaco-editor .find-widget .monaco-checkbox .label { - display: flex; - align-items: center; - justify-content: center; - background-image: none !important; -} - -/* Before elements */ -body[data-exploration="icon-exploration"] .settings-editor > .settings-body > .settings-tree-container .setting-item-bool .setting-value-checkbox.checked::before, -body[data-exploration^="icon-exploration"] .search-view .search-widget .toggle-replace-button.collapse::before, -body[data-exploration^="icon-exploration"] .search-view .search-widget .toggle-replace-button.expand::before, -body[data-exploration^="icon-exploration"] .monaco-panel-view .panel > .panel-header::before, -body[data-exploration^="icon-exploration"] .monaco-editor .find-widget .replace-all::before, -body[data-exploration^="icon-exploration"] .monaco-editor .find-widget .replace::before, -body[data-exploration^="icon-exploration"] .monaco-editor .find-widget .previous::before, -body[data-exploration^="icon-exploration"] .monaco-editor .find-widget .next::before, -body[data-exploration^="icon-exploration"] .monaco-editor .find-widget .close-fw::before, -body[data-exploration^="icon-exploration"] .monaco-editor .find-widget .expand::before, -body[data-exploration^="icon-exploration"] .monaco-editor .find-widget .collapse::before, -body[data-exploration^="icon-exploration"] .monaco-editor .find-widget .monaco-checkbox .label::before, -body[data-exploration^="icon-exploration"] .keybindings-editor .monaco-action-bar .action-item > .monaco-custom-checkbox::before { - content: ""; - width: 16px; - height: 16px; - background-color: var(--gray); - -webkit-mask-repeat: no-repeat; - -webkit-mask-position: center; - -webkit-mask-size: 16px; -} - -/* For icons that are a custom checkbox and use focus */ -body[data-exploration="icon-exploration"] .settings-editor > .settings-body > .settings-tree-container .setting-item-bool .setting-value-checkbox.checked, -body[data-exploration^="icon-exploration"] .monaco-findInput > .controls .monaco-custom-checkbox, -body[data-exploration^="icon-exploration"] .markers-panel-action-filter > .markers-panel-filter-controls > .markers-panel-filter-filesExclude, -body[data-exploration^="icon-exploration"] .monaco-panel-view .panel > .panel-header, -body[data-exploration^="icon-exploration"] .keybindings-editor .monaco-action-bar .action-item > .monaco-custom-checkbox { - background-image: none !important; -} - -body[data-exploration="icon-exploration"] .settings-editor > .settings-body > .settings-tree-container .setting-item-bool .setting-value-checkbox.checked::before, -body[data-exploration^="icon-exploration"] .monaco-findInput > .controls .monaco-custom-checkbox::before, -body[data-exploration^="icon-exploration"] .markers-panel .monaco-tl-contents .multiline-actions .action-label.octicon-chevron-up::before, -body[data-exploration^="icon-exploration"] .markers-panel .monaco-tl-contents .multiline-actions .action-label.octicon-chevron-down::before, -body[data-exploration^="icon-exploration"] .monaco-workbench .search-view .query-details .file-types .controls > .monaco-custom-checkbox.useExcludesAndIgnoreFiles::before, -body[data-exploration^="icon-exploration"] .markers-panel-action-filter > .markers-panel-filter-controls > .markers-panel-filter-filesExclude::before { - content: ""; - width: 16px; - height: 16px; - display: block; -} - -/******************** - ACTIVITY BAR -********************/ - -body[data-exploration^="icon-exploration"] .monaco-workbench .activitybar > .content .monaco-action-bar .badge .badge-content { - font-size: 9px; - font-weight: 600; - height: 16px; - line-height: 16px; - padding: 0 4px; -} - -body[data-exploration^="icon-exploration"] .monaco-workbench .activitybar .monaco-action-bar .action-label { - -webkit-mask-size: 24px !important; -} - -body[data-exploration="icon-exploration"] .monaco-workbench .activitybar .monaco-action-bar .action-label.explore { - -webkit-mask-image: url("images/activitybar/files-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .activitybar .monaco-action-bar .action-label.search { - -webkit-mask-image: url("images/activitybar/search-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .activitybar .monaco-action-bar .action-label.scm { - -webkit-mask-image: url("images/activitybar/git-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .activitybar .monaco-action-bar .action-label.debug { - -webkit-mask-image: url("images/activitybar/debug-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .activitybar .monaco-action-bar .action-label.extensions { - -webkit-mask-image: url("images/activitybar/extensions-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .activitybar .monaco-action-bar .action-label.update-activity { - -webkit-mask-image: url("images/activitybar/settings-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .activitybar > .content > .composite-bar > .monaco-action-bar .action-label.toggle-more { - -webkit-mask-image: url("images/activitybar/more-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .activitybar > .content .monaco-action-bar .action-label[title="References"] { - -webkit-mask-image: url("images/activitybar/references-alt1.svg"); -} - - -/**************** - Explorer -****************/ - -body[data-exploration="icon-exploration"] .monaco-workbench .flip-editor-layout { - -webkit-mask-image: url("images/explorer/layout-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .explorer-action.save-all, -body[data-exploration="icon-exploration"] .monaco-workbench .save-all { - -webkit-mask-image: url("images/explorer/save-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .explorer-viewlet .action-close-all-files { - -webkit-mask-image: url("images/explorer/close-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .explorer-action.new-file { - -webkit-mask-image: url("images/explorer/add-file-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .explorer-action.new-folder { - -webkit-mask-image: url("images/explorer/add-folder-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .explorer-action.refresh-explorer, -body[data-exploration="icon-exploration"] .monaco-workbench .part > .title > .title-actions .action-label[data-title="references-view.refresh"] { - -webkit-mask-image: url("images/explorer/refresh-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .explorer-action.collapse-explorer { - -webkit-mask-image: url("images/explorer/collapse-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-toolbar .action-label.toolbar-toggle-more { - -webkit-mask-image: url("images/explorer/more-alt1.svg"); -} - - -/**************** - Search -****************/ - -body[data-exploration="icon-exploration"] .monaco-workbench .search-action.refresh { - -webkit-mask-image: url("images/search/refresh-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .search-action.clear-search-results, -body[data-exploration="icon-exploration"] .monaco-workbench .part > .title > .title-actions .action-label[data-title="references-view.clear"] { - -webkit-mask-image: url("images/search/clear-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .search-action.collapse { - -webkit-mask-image: url("images/search/collapse-all-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .search-action.cancel-search { - -webkit-mask-image: url("images/search/stop-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .search-view .search-widget .replace-container .monaco-action-bar .action-item .icon { - -webkit-mask-image: url("images/search/replace-all-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .search-view .query-details .file-types .controls > .monaco-custom-checkbox.useExcludesAndIgnoreFiles::before, -body[data-exploration="icon-exploration"] .markers-panel-action-filter > .markers-panel-filter-controls > .markers-panel-filter-filesExclude::before { - -webkit-mask-image: url("images/search/exclude-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-custom-checkbox.monaco-case-sensitive::before { - -webkit-mask-image: url("images/search/case-sensitive-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-custom-checkbox.monaco-whole-word::before { - -webkit-mask-image: url("images/search/whole-word-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-custom-checkbox.monaco-regex::before { - -webkit-mask-image: url("images/search/regex-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .search-view .action-replace { - -webkit-mask-image: url("images/search/replace-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .search-view .action-replace-all { - -webkit-mask-image: url("images/search/replace-all-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .search-view .action-remove { - -webkit-mask-image: url("images/search/remove-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .search-view .query-details .more { - -webkit-mask-image: url("images/search/more-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .search-view .search-widget .toggle-replace-button.collapse::before { - -webkit-mask-image: url("images/search/collapse-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .search-view .search-widget .toggle-replace-button.expand::before { - -webkit-mask-image: url("images/search/expand-alt1.svg"); -} - - -/**************** - Git -****************/ - -body[data-exploration="icon-exploration"] .monaco-workbench .part > .title > .title-actions .action-label[data-title="git.init"] { - -webkit-mask-image: url("images/git/initialze.svg"); -} - -body[data-exploration="icon-exploration"] .settings-editor > .settings-body > .settings-tree-container .setting-item-bool .setting-value-checkbox.checked::before, -body[data-exploration="icon-exploration"] .monaco-workbench .part > .title > .title-actions .action-label[data-title="git.commit"], -body[data-exploration="icon-exploration"] .monaco-panel-view .panel > .panel-header > .actions .action-label.icon[data-title="git.commit"] { - -webkit-mask-image: url("images/git/check-alt1.svg"); -} -/* Refresh */ -body[data-exploration="icon-exploration"] .monaco-workbench .part > .title > .title-actions .action-label[data-title="git.refresh"], -body[data-exploration="icon-exploration"] .monaco-panel-view .panel > .panel-header > .actions .action-label.icon[data-title="git.refresh"] { - -webkit-mask-image: url("images/git/refresh-alt1.svg"); -} -/* Stage */ -body[data-exploration="icon-exploration"] .monaco-editor .peekview-widget .head .peekview-actions > .monaco-action-bar .action-label[data-title="git.stageChange"], -body[data-exploration="icon-exploration"] .scm-viewlet .monaco-list-row > .resource-group > .actions .action-label[data-title="git.stageAll"], -body[data-exploration="icon-exploration"] .scm-viewlet .monaco-list-row > .resource > .name > .monaco-icon-label > .actions .action-label[data-title="git.stage"] { - -webkit-mask-image: url("images/git/stage-alt1.svg"); -} -/* Unstage */ -body[data-exploration="icon-exploration"] .scm-viewlet .monaco-list-row > .resource-group > .actions .action-label[data-title="git.unstageAll"], -body[data-exploration="icon-exploration"] .scm-viewlet .monaco-list-row > .resource > .name > .monaco-icon-label > .actions .action-label[data-title="git.unstage"] { - -webkit-mask-image: url("images/git/unstage-alt1.svg"); -} -/* Discard */ -body[data-exploration="icon-exploration"] .monaco-editor .peekview-widget .head .peekview-actions > .monaco-action-bar .action-label[data-title="git.revertChange"], -body[data-exploration="icon-exploration"] .scm-viewlet .monaco-list-row > .resource-group > .actions .action-label[data-title="git.cleanAll"], -body[data-exploration="icon-exploration"] .scm-viewlet .monaco-list-row > .resource > .name > .monaco-icon-label > .actions .action-label[data-title="git.clean"] { - -webkit-mask-image: url("images/git/clean-alt1.svg"); -} -/* Open File */ -body[data-exploration="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .editor-actions .action-label[data-title="_workbench.openUserSettingsEditor"], -body[data-exploration="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .editor-actions .action-label[data-title="git.openFile"], -body[data-exploration="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .title-actions .action-label[data-title="git.openFile"], -body[data-exploration="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .editor-actions .action-label[data-title="workbench.action.openGlobalKeybindings"], -body[data-exploration="icon-exploration"] .scm-viewlet .monaco-list-row > .resource > .name > .monaco-icon-label > .actions .action-label[data-title="git.openFile2"] { - -webkit-mask-image: url("images/git/gotofile-alt1.svg"); -} -/* Chevrons */ -body[data-exploration="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .editor-actions .action-label[data-title="workbench.action.compareEditor.nextChange"], -body[data-exploration="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .title-actions .action-label[data-title="workbench.action.compareEditor.nextChange"], -body[data-exploration="icon-exploration"] .monaco-editor .peekview-widget .head .peekview-actions > .monaco-action-bar .action-label[data-title="editor.action.marker.next"], -body[data-exploration="icon-exploration"] .monaco-editor .peekview-widget .head .peekview-actions > .monaco-action-bar .action-label[data-title="editor.action.dirtydiff.next"] { - -webkit-mask-image: url("images/git/next-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .editor-actions .action-label[data-title="workbench.action.compareEditor.previousChange"], -body[data-exploration="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .title-actions .action-label[data-title="workbench.action.compareEditor.previousChange"], -body[data-exploration="icon-exploration"] .monaco-editor .peekview-widget .head .peekview-actions > .monaco-action-bar .action-label[data-title="editor.action.marker.prev"], -body[data-exploration="icon-exploration"] .monaco-editor .peekview-widget .head .peekview-actions > .monaco-action-bar .action-label[data-title="editor.action.dirtydiff.previous"] { - -webkit-mask-image: url("images/git/previous-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .editor-actions .action-label[data-title="toggle.diff.ignoreTrimWhitespace"], -body[data-exploration="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .title-actions .action-label[data-title="toggle.diff.ignoreTrimWhitespace"]{ - -webkit-mask-image: url("images/git/whitespace-alt1.svg"); -} - - -/**************** - Debug -****************/ - -body[data-exploration="icon-exploration"] .monaco-workbench .debug-action.start, -body[data-exploration="icon-exploration"] .monaco-workbench .part > .title > .title-actions .action-label[data-title="workbench.action.debug.continue"], -body[data-exploration="icon-exploration"] .monaco-workbench .part > .title > .title-actions .start-debug-action-item .icon { - -webkit-mask-image: url("images/debug/start-alt1.svg"); - background: var(--green) !important; -} - -body[data-exploration="icon-exploration"] .monaco-workbench .debug-action.configure { - -webkit-mask-image: url("images/debug/gear-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .debug-action.toggle-repl { - -webkit-mask-image: url("images/debug/repl-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .debug-viewlet .debug-action.add-watch-expression, -body[data-exploration="icon-exploration"] .debug-viewlet .debug-action.add-function-breakpoint { - -webkit-mask-image: url("images/debug/add-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .debug-viewlet .debug-action.remove-all { - -webkit-mask-image: url("images/debug/close-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .debug-viewlet .debug-action.breakpoints-activate { - -webkit-mask-image: url("images/debug/breakpoint-activate-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .debug-toolbar .drag-area { - -webkit-mask-image: url("images/debug/drag-alt1.svg"); - background: var(--grayLight); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .debug-toolbar .action-label[data-title="workbench.action.debug.stepOver"], -body[data-exploration="icon-exploration"] .monaco-workbench .part > .title > .title-actions .action-label[data-title="workbench.action.debug.stepOver"], -body[data-exploration="icon-exploration"] .monaco-workbench .part > .title > .title-actions .action-label[data-title="workbench.action.debug.stepBack"], -body[data-exploration="icon-exploration"] .monaco-workbench .debug-toolbar .action-label[data-title="workbench.action.debug.stepBack"] { - -webkit-mask-image: url("images/debug/step-over-alt1.svg"); - background: var(--blue) !important; -} - -body[data-exploration="icon-exploration"] .monaco-workbench .debug-toolbar .action-label[data-title="workbench.action.debug.stepInto"], -body[data-exploration="icon-exploration"] .monaco-workbench .part > .title > .title-actions .action-label[data-title="workbench.action.debug.stepInto"] { - -webkit-mask-image: url("images/debug/step-into-alt1.svg"); - background: var(--blue) !important; -} - -body[data-exploration="icon-exploration"] .monaco-workbench .debug-toolbar .action-label[data-title="workbench.action.debug.stepOut"], -body[data-exploration="icon-exploration"] .monaco-workbench .part > .title > .title-actions .action-label[data-title="workbench.action.debug.stepOut"] { - -webkit-mask-image: url("images/debug/step-out-alt1.svg"); - background: var(--blue) !important; -} - -body[data-exploration="icon-exploration"] .monaco-workbench .debug-toolbar .action-label[data-title="workbench.action.debug.continue"], -body[data-exploration="icon-exploration"] .monaco-workbench .debug-toolbar .action-label[data-title="workbench.action.debug.rever"], -body[data-exploration="icon-exploration"] .monaco-workbench .part > .title > .title-actions .action-label[data-title="workbench.action.debug.continue"], -body[data-exploration="icon-exploration"] .monaco-workbench .part > .title > .title-actions .action-label[data-title="workbench.action.debug.rever"] { - -webkit-mask-image: url("images/debug/continue-alt1.svg"); - background: var(--blue) !important; -} - -body[data-exploration="icon-exploration"] .monaco-workbench .debug-toolbar .action-label[data-title="workbench.action.debug.restart"], -body[data-exploration="icon-exploration"] .monaco-workbench .part > .title > .title-actions .action-label[data-title="workbench.action.debug.restart"] { - -webkit-mask-image: url("images/debug/restart-alt1.svg"); - background: var(--green) !important; -} - -body[data-exploration="icon-exploration"] .monaco-workbench .debug-toolbar .action-label[data-title="workbench.action.debug.pause"], -body[data-exploration="icon-exploration"] .monaco-workbench .part > .title > .title-actions .action-label[data-title="workbench.action.debug.pause"] { - -webkit-mask-image: url("images/debug/pause-alt1.svg"); - background: var(--green) !important; -} - -body[data-exploration="icon-exploration"] .monaco-workbench .debug-toolbar .action-label[data-title="workbench.action.debug.stop"], -body[data-exploration="icon-exploration"] .monaco-workbench .part > .title > .title-actions .action-label[data-title="workbench.action.debug.stop"] { - -webkit-mask-image: url("images/debug/stop-alt1.svg"); - background: var(--red) !important; -} - -body[data-exploration="icon-exploration"] .monaco-workbench .debug-toolbar .action-label[data-title="workbench.action.debug.disconnect"], -body[data-exploration="icon-exploration"] .monaco-workbench .part > .title > .title-actions .action-label[data-title="workbench.action.debug.disconnect"] { - -webkit-mask-image: url("images/debug/disconnect-alt1.svg"); - background: var(--red) !important; -} - -body[data-exploration="icon-exploration"] .debug-breakpoint, -body[data-exploration="icon-exploration"] .debug-breakpoint-hint, -body[data-exploration="icon-exploration"] .debug-breakpoint.icon, -body[data-exploration="icon-exploration"] .monaco-editor .debug-breakpoint-column::before { - -webkit-mask-image: url("images/debug/breakpoint-alt1.svg"); - background: var(--redLight) !important; -} - -body[data-exploration="icon-exploration"] .debug-breakpoint-hint:not(.debug-breakpoint):not(.debug-breakpoint-conditional):not(.debug-top-stack-frame):not(.debug-focused-stack-frame):not(.debug-breakpoint-log) { - opacity: .5 !important; -} - -body[data-exploration="icon-exploration"] .debug-breakpoint-disabled.icon { - -webkit-mask-image: url("images/debug/breakpoint-unverified-alt1.svg"); - background: var(--grayLight); -} - -body[data-exploration="icon-exploration"] .debug-breakpoint-unverified, -body[data-exploration="icon-exploration"] .monaco-editor .debug-breakpoint-column.debug-breakpoint-disabled-column::before { - -webkit-mask-image: url("images/debug/breakpoint-alt1.svg"); - background: var(--grayLight); -} - -body[data-exploration="icon-exploration"] .monaco-editor .debug-top-stack-frame-column::before, -body[data-exploration="icon-exploration"] .monaco-editor .debug-top-stack-frame { - -webkit-mask-image: url("images/debug/current-arrow-alt1.svg"); - background: var(--yellow) !important; -} - -body[data-exploration="icon-exploration"] .monaco-editor .debug-top-stack-frame.debug-breakpoint, -body[data-exploration="icon-exploration"] .monaco-editor .debug-top-stack-frame.debug-breakpoint-conditional, -body[data-exploration="icon-exploration"] .monaco-editor .debug-top-stack-frame.debug-breakpoint-log, -body[data-exploration="icon-exploration"] .monaco-editor .debug-breakpoint-column.debug-breakpoint-column.debug-top-stack-frame-column::before { - -webkit-mask-image: url("images/debug/current-and-breakpoint-alt1.svg"); - background: var(--yellow) !important; -} - -body[data-exploration="icon-exploration"] .monaco-editor .debug-focused-stack-frame.debug-breakpoint, -body[data-exploration="icon-exploration"] .monaco-editor .debug-focused-stack-frame.debug-breakpoint-conditional, -body[data-exploration="icon-exploration"] .monaco-editor .debug-focused-stack-frame.debug-breakpoint-log { - -webkit-mask-image: url("images/debug/stackframe-and-breakpoint-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .debug-breakpoint-log, -body[data-exploration="icon-exploration"] .debug-breakpoint-log.icon, -body[data-exploration="icon-exploration"] .monaco-editor .debug-breakpoint-column.debug-breakpoint-log-column::before { - -webkit-mask-image: url("images/debug/breakpoint-log-alt1.svg"); - background: var(--redLight) !important; -} - -body[data-exploration="icon-exploration"] .debug-breakpoint-log-disabled, -body[data-exploration="icon-exploration"] .debug-breakpoint-log-disabled.icon, -body[data-exploration="icon-exploration"] .monaco-editor .debug-breakpoint-log-disabled-column::before { - -webkit-mask-image: url("images/debug/breakpoint-log-alt1.svg"); - background: var(--grayLight); -} - -body[data-exploration="icon-exploration"] .debug-breakpoint-log-unverified, -body[data-exploration="icon-exploration"] .debug-breakpoint-log-unverified.icon, -body[data-exploration="icon-exploration"] .monaco-editor .debug-breakpoint-log-unverified-column::before { - -webkit-mask-image: url("images/debug/breakpoint-log-unverified-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .debug-breakpoint-conditional, -body[data-exploration="icon-exploration"] .debug-breakpoint-conditional.icon, -body[data-exploration="icon-exploration"] .monaco-editor .debug-breakpoint-column.debug-breakpoint-conditional-column::before { - -webkit-mask-image: url("images/debug/breakpoint-conditional-alt1.svg"); - background: var(--redLight) !important; -} - -body[data-exploration="icon-exploration"] .monaco-editor .debug-focused-stack-frame { - -webkit-mask-image: url("images/debug/stackframe-arrow-alt1.svg"); - background: var(--green) !important; -} - -body[data-exploration="icon-exploration"] .debug-function-breakpoint, -body[data-exploration="icon-exploration"] .debug-function-breakpoint.icon { - -webkit-mask-image: url("images/debug/breakpoint-function-alt1.svg"); - background: var(--redLight) !important; -} - -body[data-exploration="icon-exploration"] .debug-function-breakpoint-unverified { - -webkit-mask-image: url("images/debug/breakpoint-function-unverified-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .debug-function-breakpoint-disabled { - -webkit-mask-image: url("images/debug/breakpoint-function-disabled-alt1.svg"); -} - -/**************** - Extensions -****************/ - -body[data-exploration^="icon-exploration"] .extensions-viewlet > .extensions .extension > .details > .header-container > .header { - align-items: center; -} - -body[data-exploration="icon-exploration"] .monaco-action-bar .action-item .action-label.clear-extensions { - -webkit-mask-image: url("images/extensions/clear-alt1.svg"); -} - -body[data-exploration^="icon-exploration"] .extensions-viewlet > .extensions .extension > .details > .header-container > .header > .install-count:not(:empty), -body[data-exploration^="icon-exploration"] .extensions-viewlet > .extensions .extension > .details > .header-container > .header > .ratings { - display: flex; - align-items: center; - justify-content: center; -} - -body[data-exploration^="icon-exploration"] .extensions-viewlet > .extensions .extension > .details > .header-container > .header > .install-count > .octicon::before, -body[data-exploration^="icon-exploration"] .extension-editor > .header > .details > .subtitle .octicon::before { - content: "" !important; -} - -body[data-exploration^="icon-exploration"] .extensions-viewlet > .extensions .extension > .details > .header-container > .header > .install-count > .octicon, -body[data-exploration^="icon-exploration"] .extension-ratings.small > .full { - width: 12px; - height: 12px; - -webkit-mask-size: 12px; -} - -body[data-exploration^="icon-exploration"] .extension-editor > .header > .details > .subtitle .octicon { - width: 16px; - height: 16px; - -webkit-mask-size: 16px; -} - -body[data-exploration^="icon-exploration"] .extension-editor > .header > .details > .subtitle > span:not(:first-child):not(:empty) { - position: relative; -} - -body[data-exploration^="icon-exploration"] .extension-editor > .header > .details > .subtitle > .install > .count { - margin-left: 22px; -} - -body[data-exploration^="icon-exploration"] .extension-editor > .header > .details > .subtitle .octicon { - position: absolute; - left: 14px; - top: 0; -} - -body[data-exploration="icon-exploration"] .extensions-viewlet > .extensions .extension > .details > .header-container > .header > .install-count > .octicon, -body[data-exploration="icon-exploration"] .extension-editor > .header > .details > .subtitle .octicon { - -webkit-mask-image: url("images/extensions/download-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .extension-ratings > .full { - -webkit-mask-image: url("images/extensions/star-full-alt1.svg"); - background: var(--orangeLight); -} - -body[data-exploration="icon-exploration"] .extension-ratings > .half { - -webkit-mask-image: url("images/extensions/star-half-alt1.svg"); - background: var(--orangeLight); -} - -body[data-exploration="icon-exploration"] .extension-ratings > .empty { - -webkit-mask-image: url("images/extensions/star-empty-alt1.svg"); - background: var(--gray); -} - -body[data-exploration="icon-exploration"] .extensions-viewlet > .extensions .extension > .details > .footer > .monaco-action-bar .action-item .action-label.extension-action.manage { - -webkit-mask-image: url("images/extensions/gear-alt1.svg"); -} - - -/**************** - Panels -****************/ - -body[data-exploration="icon-exploration"] .monaco-workbench .hide-panel-action { - -webkit-mask-image: url("images/panel/close-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .maximize-panel-action { - -webkit-mask-image: url("images/panel/up-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .minimize-panel-action { - -webkit-mask-image: url("images/panel/down-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-tree-action.collapse-all { - -webkit-mask-image: url("images/panel/collapse-all-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .output-action.open-log-file { - -webkit-mask-image: url("images/panel/gotofile-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .output-action.open-log-file { - -webkit-mask-image: url("images/panel/gotofile-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .output-action.output-scroll-unlock { - -webkit-mask-image: url("images/panel/output-unlock-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .output-action.output-scroll-lock { - -webkit-mask-image: url("images/panel/output-lock-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .output-action.clear-output { - -webkit-mask-image: url("images/panel/clear-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .debug-action.clear-repl { - -webkit-mask-image: url("images/panel/clear-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .terminal-action.kill { - -webkit-mask-image: url("images/panel/kill-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .terminal-action.split, -body[data-exploration="icon-exploration"] .monaco-workbench .quick-open-sidebyside-vertical { - -webkit-mask-image: url("images/panel/split-horizontal-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .panel.right .terminal-action.split { - -webkit-mask-image: url("images/panel/split-vertical-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .terminal-action.new { - -webkit-mask-image: url("images/panel/add-alt1.svg"); -} - - -/**************** - IntelliSense -****************/ - -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .header > .close { - -webkit-mask-image: url("images/intellisense/close-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .readMore { - -webkit-mask-image: url("images/intellisense/info-alt1.svg"); - background-color: var(--blue); -} - -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon::before { - background-image: none !important; -} -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.method::before, -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.function::before, -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.constructor::before { - -webkit-mask-image: url("images/intellisense/method-alt1.svg"); - background-color: var(--purple); -} - -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.field::before { - -webkit-mask-image: url("images/intellisense/field-alt1.svg"); - background-color: var(--blue); -} - -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.event::before { - -webkit-mask-image: url("images/intellisense/event-alt1.svg"); - background-color: var(--orange); -} - -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.operator::before { - -webkit-mask-image: url("images/intellisense/operator-alt1.svg"); - background-color: var(--blue); -} - -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.variable::before { - -webkit-mask-image: url("images/intellisense/variable-alt1.svg"); - background-color: var(--blue); -} - -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.class::before { - -webkit-mask-image: url("images/intellisense/class-alt1.svg"); - background-color: var(--orange); -} - -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.interface::before { - -webkit-mask-image: url("images/intellisense/interface-alt1.svg"); - background-color: var(--blue); -} - -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.struct::before { - -webkit-mask-image: url("images/intellisense/structure-alt1.svg"); - background-color: var(--blue); -} - -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.type-parameter::before { - -webkit-mask-image: url("images/intellisense/parameter-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.module::before { - -webkit-mask-image: url("images/intellisense/namespace-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.property::before { - -webkit-mask-image: url("images/intellisense/property-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.unit::before { - -webkit-mask-image: url("images/intellisense/ruler-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.constant::before { - -webkit-mask-image: url("images/intellisense/constant-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.value::before, -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.enum::before { - -webkit-mask-image: url("images/intellisense/enumerator-alt1.svg"); - background-color: var(--orange); -} - -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.enum-member::before { - -webkit-mask-image: url("images/intellisense/enum-member-alt1.svg"); - background-color: var(--blue); -} - -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.keyword::before { - -webkit-mask-image: url("images/intellisense/keyword-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.text::before { - -webkit-mask-image: url("images/intellisense/string-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.color::before { - -webkit-mask-image: url("images/intellisense/color-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.file::before { - -webkit-mask-image: url("images/intellisense/file-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.reference::before { - -webkit-mask-image: url("images/intellisense/reference-alt1.svg"); - background-color: var(--blue); -} - -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.snippet::before { - -webkit-mask-image: url("images/intellisense/snippet-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.folder::before { - -webkit-mask-image: url("images/intellisense/folder-alt1.svg"); -} - -/**************** - Breadcrumbs -****************/ - -body[data-exploration^="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title.breadcrumbs .breadcrumbs-control .monaco-breadcrumb-item::before { - -webkit-mask-image: none; - background: transparent; -} - -body[data-exploration^="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title.breadcrumbs .breadcrumbs-control .monaco-breadcrumb-item .symbol-icon { - margin-left: 4px; -} - -body[data-exploration^="icon-exploration"] .monaco-quick-open-widget .quick-open-tree .quick-open-entry .quick-open-entry-icon::before { - left: 0; - top: -3px; -} - -body[data-exploration^="icon-exploration"] .monaco-workbench .breadcrumbs-control .symbol-icon::before, -body[data-exploration^="icon-exploration"] .monaco-workbench .monaco-breadcrumb-item .symbol-icon { - top: -2px; -} - -body[data-exploration^="icon-exploration"] .monaco-workbench .symbol-icon { - position: relative; - background-image: none !important; - -webkit-mask-position: left center; -} - -body[data-exploration^="icon-exploration"] .monaco-workbench .symbol-icon::before { - content: ""; - position: absolute; - left: -3px; - width: 16px; - height: 22px; -} - -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon::before { - -webkit-mask-image: url("images/intellisense/field-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.constant::before { - -webkit-mask-image: url("images/intellisense/constant-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.enum::before { - -webkit-mask-image: url("images/intellisense/enumerator-alt1.svg"); - background-color: var(--orange); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.enum-member::before { - -webkit-mask-image: url("images/intellisense/enum-member-alt1.svg"); - background-color: var(--blue); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.struct::before { - -webkit-mask-image: url("images/intellisense/structure-alt1.svg"); - background-color: var(--blue); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.event::before { - -webkit-mask-image: url("images/intellisense/event-alt1.svg"); - background-color: var(--orange); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.operator::before { - -webkit-mask-image: url("images/intellisense/operator-alt1.svg"); - background-color: var(--blue); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.type-parameter::before { - -webkit-mask-image: url("images/intellisense/parameter-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.boolean::before, -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.null::before { - -webkit-mask-image: url("images/intellisense/boolean-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.class::before { - -webkit-mask-image: url("images/intellisense/class-alt1.svg"); - background-color: var(--orange); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.constructor::before, -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.method::before, -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.function::before { - -webkit-mask-image: url("images/intellisense/method-alt1.svg"); - background-color: var(--purple); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.file::before { - -webkit-mask-image: url("images/intellisense/file-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.field::before { - -webkit-mask-image: url("images/intellisense/field-alt1.svg"); - background-color: var(--blue); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.variable::before { - -webkit-mask-image: url("images/intellisense/variable-alt1.svg"); - background-color: var(--blue); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.array::before { - -webkit-mask-image: url("images/intellisense/array-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.keyword::before { - -webkit-mask-image: url("images/intellisense/keyword-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.interface::before { - -webkit-mask-image: url("images/intellisense/interface-alt1.svg"); - background-color: var(--blue); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.object::before, -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.namespace::before, -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.package::before, -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.module::before { - -webkit-mask-image: url("images/intellisense/namespace-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.number::before { - -webkit-mask-image: url("images/intellisense/numeric-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.property::before { - -webkit-mask-image: url("images/intellisense/property-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.string::before { - -webkit-mask-image: url("images/intellisense/key-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .symbol-icon.key::before { - -webkit-mask-image: url("images/intellisense/key-alt1.svg"); -} - -body[data-exploration^="icon-exploration"] .monaco-editor .lightbulb-glyph { - background-image: none !important; - -webkit-mask-repeat: no-repeat; - -webkit-mask-position: center center; - -webkit-mask-size: 16px; -} - -body[data-exploration="icon-exploration"] .monaco-editor .lightbulb-glyph, -body[data-exploration="icon-exploration"] .markers-panel .monaco-tl-contents .actions .action-label.icon.markers-panel-action-quickfix { - -webkit-mask-image: url("images/intellisense/lightbulb-alt1.svg"); - background-color: var(--yellow); -} - -body[data-exploration="icon-exploration"] .monaco-editor .lightbulb-glyph.autofixable, -body[data-exploration="icon-exploration"] .markers-panel .monaco-tl-contents .actions .action-label.icon.markers-panel-action-quickfix.autofixable { - -webkit-mask-image: url("images/intellisense/lightbulb-autofix-alt1.svg"); - background-color: var(--blue); -} - - -/**************** - Notifications -****************/ - -body[data-exploration="icon-exploration"] .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-icon.icon-info, -body[data-exploration="icon-exploration"] .monaco-editor .peekview-widget .head .peekview-title .severity-icon.severity-info, -body[data-exploration="icon-exploration"] .markers-panel .marker-icon.severity-info { - -webkit-mask-image: url("images/notifications/info-alt1.svg"); - background: var(--blue); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-icon.icon-warning, -body[data-exploration="icon-exploration"] .markers-panel .marker-icon.severity-warning, -body[data-exploration="icon-exploration"] .monaco-editor .peekview-widget .head .peekview-title .severity-icon.severity-warning { - -webkit-mask-image: url("images/notifications/warning-alt1.svg"); - background: var(--yellow); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-icon.icon-error, -body[data-exploration="icon-exploration"] .monaco-editor .peekview-widget .head .peekview-title .severity-icon.severity-error, -body[data-exploration="icon-exploration"] .markers-panel .marker-icon.severity-error { - -webkit-mask-image: url("images/notifications/error-alt1.svg"); - background: var(--redLight); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-toolbar-container .clear-notification-action { - -webkit-mask-image: url("images/notifications/close-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-toolbar-container .expand-notification-action { - -webkit-mask-image: url("images/notifications/up-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-toolbar-container .collapse-notification-action { - -webkit-mask-image: url("images/notifications/down-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-toolbar-container .configure-notification-action { - -webkit-mask-image: url("images/notifications/configure-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench > .notifications-center > .notifications-center-header .clear-all-notifications-action { - -webkit-mask-image: url("images/notifications/closeall-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench > .notifications-center > .notifications-center-header .hide-all-notifications-action { - -webkit-mask-image: url("images/notifications/down-alt1.svg"); -} - -body[data-exploration^="icon-exploration"] .markers-panel .monaco-tl-contents .marker-icon { - min-width: 16px; -} - - -/**************** - Tree -****************/ - -body[data-exploration^="icon-exploration"] .monaco-panel-view .panel > .panel-header::before { - position: absolute; - left: 2px; - top: 2px; -} - -body[data-exploration="icon-exploration"] .file-icon-themable-tree .monaco-tree-row.has-children.expanded .content::before, -body[data-exploration="icon-exploration"] .monaco-panel-view .panel > .panel-header.expanded::before, -body[data-exploration="icon-exploration"] .markers-panel .monaco-tl-contents .multiline-actions .action-label.octicon-chevron-up, -body[data-exploration="icon-exploration"] .monaco-tl-twistie.collapsible:not(.loading) { - -webkit-mask-image: url("images/tree/expand-alt1.svg"); - background-image: url("images/tree/expand-empty.svg") !important; -} - -body[data-exploration="icon-exploration"] .file-icon-themable-tree .monaco-tree-row.has-children .content::before, -body[data-exploration="icon-exploration"] .monaco-breadcrumbs .monaco-breadcrumb-item:not(:nth-child(2))::before, -body[data-exploration="icon-exploration"] .monaco-panel-view .panel > .panel-header::before, -body[data-exploration="icon-exploration"] .markers-panel .monaco-tl-contents .multiline-actions .action-label.octicon-chevron-down, -body[data-exploration="icon-exploration"] .monaco-tl-twistie.collapsible.collapsed:not(.loading) { - -webkit-mask-image: url("images/tree/collapse-alt1.svg"); - background-image: url("images/tree/expand-empty.svg") !important; - -} - -body[data-exploration="icon-exploration"] .customview-tree .monaco-tree .custom-view-tree-node-item > .custom-view-tree-node-item-resourceLabel > .actions .action-label[data-title="references-view.remove"], -body[data-exploration="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .title-actions .action-label[data-title="workbench.action.closeActiveEditor"], -body[data-exploration="icon-exploration"] .monaco-editor .peekview-widget .head .peekview-actions .action-label.icon[data-title="peekview.close"], -body[data-exploration="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .close-editor-action, -body[data-exploration="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .tabs-container > .tab.dirty .close-editor-action:hover, -body[data-exploration="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .editor-group-container-toolbar .close-editor-group, -body[data-exploration="icon-exploration"] .monaco-workbench .explorer-viewlet .explorer-open-editors .close-editor-action { - -webkit-mask-image: url("images/tree/close-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .tabs-container > .tab.dirty .close-editor-action, -body[data-exploration="icon-exploration"] .explorer-viewlet .explorer-open-editors .monaco-list .monaco-list-row.dirty:not(:hover) > .monaco-action-bar .close-editor-action { - -webkit-mask-image: url("images/tree/dirty-alt1.svg"); -} - - -/**************** - Tree -****************/ - -body[data-exploration="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .title-actions .action-label[data-title="workbench.action.splitEditor"], -body[data-exploration="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .editor-actions .action-label[data-title="workbench.action.splitEditor"] { - -webkit-mask-image: url("images/editor/split-horizontal-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .editor-actions .action-label[title="Split Editor Down"], -body[data-exploration="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .title-actions .action-label[title="Split Editor Down"] { - -webkit-mask-image: url("images/editor/split-vertical-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .scm-viewlet .monaco-list-row > .resource > .name > .monaco-icon-label > .actions .action-label[data-title="git.openChange"], -body[data-exploration="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .title-actions .action-label[data-title="git.openChange"], -body[data-exploration="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .editor-actions .action-label[data-title="git.openChange"] { - -webkit-mask-image: url("images/editor/open-change-alt1.svg"); -} - - -/**************** - Find -****************/ - -body[data-exploration="icon-exploration"] .monaco-editor .find-widget .previous::before { - -webkit-mask-image: url("images/find/previous-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-editor .find-widget .next::before { - -webkit-mask-image: url("images/find/next-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-editor .find-widget .close-fw::before { - -webkit-mask-image: url("images/find/close-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-editor .find-widget .monaco-checkbox .label::before { - -webkit-mask-image: url("images/find/selection-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-editor .find-widget .replace::before { - -webkit-mask-image: url("images/find/replace-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-editor .find-widget .replace-all::before { - -webkit-mask-image: url("images/find/replace-all-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-editor .find-widget .expand::before { - -webkit-mask-image: url("images/find/expand-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-editor .find-widget .collapse::before { - -webkit-mask-image: url("images/find/collapse-alt1.svg"); -} - -/**************** - Misc -****************/ - -body[data-exploration="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .editor-actions .action-label[data-title="markdown.showPreviewToSide"]{ - -webkit-mask-image: url("images/misc/preview-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .tabs-container > .tab.sizing-fit .monaco-icon-label.file-icon[title^="Preview"]::before{ - -webkit-mask-image: url("images/misc/preview-icon-alt1.svg"); - -webkit-mask-position: left center; -} - -body[data-exploration="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .editor-actions .action-label[data-title="markdown.showSource"]{ - -webkit-mask-image: url("images/misc/gotofile-alt1.svg") -} - -body[data-exploration="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .editor-actions .action-label[data-title="workbench.action.openGlobalKeybindingsFile"], -body[data-exploration="icon-exploration"] .monaco-workbench .part.editor > .content .editor-group-container > .title .editor-actions .action-label[data-title="settings.switchToJSON"]{ - -webkit-mask-image: url("images/misc/json-alt1.svg") -} - -body[data-exploration^="icon-exploration"] .keybindings-editor .monaco-action-bar .action-item > .monaco-custom-checkbox::before { - display: block; -} - -body[data-exploration="icon-exploration"] .keybindings-editor .monaco-action-bar .action-item > .record-keys::before { - -webkit-mask-image: url("images/misc/keyboard-alt1.svg") -} - -body[data-exploration="icon-exploration"] .keybindings-editor .monaco-action-bar .action-item > .clear-input { - -webkit-mask-image: url("images/misc/clear-alt1.svg") -} - -body[data-exploration="icon-exploration"] .keybindings-editor .monaco-action-bar .action-item > .sort-by-precedence::before { - -webkit-mask-image: url("images/misc/precedence-alt1.svg") -} - -body[data-exploration="icon-exploration"] .monaco-workbench .part.panel > .title > .panel-switcher-container.composite-bar > .monaco-action-bar .action-label.toggle-more { - -webkit-mask-image: url("images/misc/more-alt1.svg"); - background: var(--gray) !important; -} - -body[data-exploration^="icon-exploration"] .monaco-editor .margin-view-overlays .folding, -body[data-exploration^="icon-exploration"] .monaco-editor .margin-view-overlays .folding.collapsed { - -webkit-mask-position: 75% 50%; -} - -body[data-exploration="icon-exploration"] .monaco-editor .margin-view-overlays .folding { - -webkit-mask-image: url("images/misc/fold-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-editor .margin-view-overlays .folding.collapsed { - -webkit-mask-image: url("images/misc/unfold-alt1.svg"); -} - -body[data-exploration="icon-exploration"] .monaco-editor .find-widget .matchesCount { - margin-right: 0; - padding-right: 0; -} - -body[data-exploration="icon-exploration"] .settings-editor > .settings-body > .settings-tree-container .setting-item-bool .setting-value-checkbox.checked::before { - -webkit-mask-size: 14px; -} \ No newline at end of file diff --git a/src/vs/workbench/browser/media/images/activitybar/debug-alt1.svg b/src/vs/workbench/browser/media/images/activitybar/debug-alt1.svg deleted file mode 100644 index 008fbc50706..00000000000 --- a/src/vs/workbench/browser/media/images/activitybar/debug-alt1.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/src/vs/workbench/browser/media/images/activitybar/extensions-alt1.svg b/src/vs/workbench/browser/media/images/activitybar/extensions-alt1.svg deleted file mode 100644 index 0913a983e4e..00000000000 --- a/src/vs/workbench/browser/media/images/activitybar/extensions-alt1.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/src/vs/workbench/browser/media/images/activitybar/files-alt1.svg b/src/vs/workbench/browser/media/images/activitybar/files-alt1.svg deleted file mode 100644 index 14c2bb322a8..00000000000 --- a/src/vs/workbench/browser/media/images/activitybar/files-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/activitybar/git-alt1.svg b/src/vs/workbench/browser/media/images/activitybar/git-alt1.svg deleted file mode 100644 index 33e120dd8bb..00000000000 --- a/src/vs/workbench/browser/media/images/activitybar/git-alt1.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/src/vs/workbench/browser/media/images/activitybar/more-alt1.svg b/src/vs/workbench/browser/media/images/activitybar/more-alt1.svg deleted file mode 100644 index 6729ca3c90d..00000000000 --- a/src/vs/workbench/browser/media/images/activitybar/more-alt1.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/vs/workbench/browser/media/images/activitybar/references-alt1.svg b/src/vs/workbench/browser/media/images/activitybar/references-alt1.svg deleted file mode 100644 index 19bd140a927..00000000000 --- a/src/vs/workbench/browser/media/images/activitybar/references-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/activitybar/search-alt1.svg b/src/vs/workbench/browser/media/images/activitybar/search-alt1.svg deleted file mode 100644 index 3a4852f756b..00000000000 --- a/src/vs/workbench/browser/media/images/activitybar/search-alt1.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/src/vs/workbench/browser/media/images/activitybar/settings-alt1.svg b/src/vs/workbench/browser/media/images/activitybar/settings-alt1.svg deleted file mode 100644 index a8213c3d01e..00000000000 --- a/src/vs/workbench/browser/media/images/activitybar/settings-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/debug/add-alt1.svg b/src/vs/workbench/browser/media/images/debug/add-alt1.svg deleted file mode 100644 index fb50c6c2849..00000000000 --- a/src/vs/workbench/browser/media/images/debug/add-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/debug/breakpoint-activate-alt1.svg b/src/vs/workbench/browser/media/images/debug/breakpoint-activate-alt1.svg deleted file mode 100644 index 3e6b0a4c4df..00000000000 --- a/src/vs/workbench/browser/media/images/debug/breakpoint-activate-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/debug/breakpoint-alt1.svg b/src/vs/workbench/browser/media/images/debug/breakpoint-alt1.svg deleted file mode 100644 index e391c3b0852..00000000000 --- a/src/vs/workbench/browser/media/images/debug/breakpoint-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/debug/breakpoint-conditional-alt1.svg b/src/vs/workbench/browser/media/images/debug/breakpoint-conditional-alt1.svg deleted file mode 100644 index 9794d6b5522..00000000000 --- a/src/vs/workbench/browser/media/images/debug/breakpoint-conditional-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/debug/breakpoint-function-alt1.svg b/src/vs/workbench/browser/media/images/debug/breakpoint-function-alt1.svg deleted file mode 100644 index 76d1f05da2c..00000000000 --- a/src/vs/workbench/browser/media/images/debug/breakpoint-function-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/debug/breakpoint-function-disabled-alt1.svg b/src/vs/workbench/browser/media/images/debug/breakpoint-function-disabled-alt1.svg deleted file mode 100644 index 76d1f05da2c..00000000000 --- a/src/vs/workbench/browser/media/images/debug/breakpoint-function-disabled-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/debug/breakpoint-function-unverified-alt1.svg b/src/vs/workbench/browser/media/images/debug/breakpoint-function-unverified-alt1.svg deleted file mode 100644 index ece98d0f356..00000000000 --- a/src/vs/workbench/browser/media/images/debug/breakpoint-function-unverified-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/debug/breakpoint-log-alt1.svg b/src/vs/workbench/browser/media/images/debug/breakpoint-log-alt1.svg deleted file mode 100644 index 21ada7b2928..00000000000 --- a/src/vs/workbench/browser/media/images/debug/breakpoint-log-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/debug/breakpoint-log-unverified-alt1.svg b/src/vs/workbench/browser/media/images/debug/breakpoint-log-unverified-alt1.svg deleted file mode 100644 index f540bf94efb..00000000000 --- a/src/vs/workbench/browser/media/images/debug/breakpoint-log-unverified-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/debug/breakpoint-unverified-alt1.svg b/src/vs/workbench/browser/media/images/debug/breakpoint-unverified-alt1.svg deleted file mode 100644 index 6bfa8fd2f5a..00000000000 --- a/src/vs/workbench/browser/media/images/debug/breakpoint-unverified-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/debug/close-alt1.svg b/src/vs/workbench/browser/media/images/debug/close-alt1.svg deleted file mode 100644 index 8af24a5b1e8..00000000000 --- a/src/vs/workbench/browser/media/images/debug/close-alt1.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/vs/workbench/browser/media/images/debug/continue-alt1.svg b/src/vs/workbench/browser/media/images/debug/continue-alt1.svg deleted file mode 100644 index d9e1bcfa25d..00000000000 --- a/src/vs/workbench/browser/media/images/debug/continue-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/debug/current-and-breakpoint-alt1.svg b/src/vs/workbench/browser/media/images/debug/current-and-breakpoint-alt1.svg deleted file mode 100644 index df3c2501a53..00000000000 --- a/src/vs/workbench/browser/media/images/debug/current-and-breakpoint-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/debug/current-arrow-alt1.svg b/src/vs/workbench/browser/media/images/debug/current-arrow-alt1.svg deleted file mode 100644 index f62a9fb6db4..00000000000 --- a/src/vs/workbench/browser/media/images/debug/current-arrow-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/debug/disconnect-alt1.svg b/src/vs/workbench/browser/media/images/debug/disconnect-alt1.svg deleted file mode 100644 index 71aae0dd887..00000000000 --- a/src/vs/workbench/browser/media/images/debug/disconnect-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/debug/drag-alt1.svg b/src/vs/workbench/browser/media/images/debug/drag-alt1.svg deleted file mode 100644 index b6b93f31fdf..00000000000 --- a/src/vs/workbench/browser/media/images/debug/drag-alt1.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/src/vs/workbench/browser/media/images/debug/gear-alt1.svg b/src/vs/workbench/browser/media/images/debug/gear-alt1.svg deleted file mode 100644 index 7db1664af78..00000000000 --- a/src/vs/workbench/browser/media/images/debug/gear-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/debug/pause-alt1.svg b/src/vs/workbench/browser/media/images/debug/pause-alt1.svg deleted file mode 100644 index 1050e04f2d9..00000000000 --- a/src/vs/workbench/browser/media/images/debug/pause-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/debug/repl-alt1.svg b/src/vs/workbench/browser/media/images/debug/repl-alt1.svg deleted file mode 100644 index f13e57b89ac..00000000000 --- a/src/vs/workbench/browser/media/images/debug/repl-alt1.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/vs/workbench/browser/media/images/debug/restart-alt1.svg b/src/vs/workbench/browser/media/images/debug/restart-alt1.svg deleted file mode 100644 index 28c63aae4d9..00000000000 --- a/src/vs/workbench/browser/media/images/debug/restart-alt1.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/vs/workbench/browser/media/images/debug/stackframe-and-breakpoint-alt1.svg b/src/vs/workbench/browser/media/images/debug/stackframe-and-breakpoint-alt1.svg deleted file mode 100644 index df3c2501a53..00000000000 --- a/src/vs/workbench/browser/media/images/debug/stackframe-and-breakpoint-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/debug/stackframe-arrow-alt1.svg b/src/vs/workbench/browser/media/images/debug/stackframe-arrow-alt1.svg deleted file mode 100644 index f62a9fb6db4..00000000000 --- a/src/vs/workbench/browser/media/images/debug/stackframe-arrow-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/debug/start-alt1.svg b/src/vs/workbench/browser/media/images/debug/start-alt1.svg deleted file mode 100644 index 30196ede168..00000000000 --- a/src/vs/workbench/browser/media/images/debug/start-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/debug/step-into-alt1.svg b/src/vs/workbench/browser/media/images/debug/step-into-alt1.svg deleted file mode 100644 index 2113d7b1987..00000000000 --- a/src/vs/workbench/browser/media/images/debug/step-into-alt1.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/src/vs/workbench/browser/media/images/debug/step-out-alt1.svg b/src/vs/workbench/browser/media/images/debug/step-out-alt1.svg deleted file mode 100644 index 6724964aea1..00000000000 --- a/src/vs/workbench/browser/media/images/debug/step-out-alt1.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/src/vs/workbench/browser/media/images/debug/step-over-alt1.svg b/src/vs/workbench/browser/media/images/debug/step-over-alt1.svg deleted file mode 100644 index f2454843ae5..00000000000 --- a/src/vs/workbench/browser/media/images/debug/step-over-alt1.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/src/vs/workbench/browser/media/images/debug/stop-alt1.svg b/src/vs/workbench/browser/media/images/debug/stop-alt1.svg deleted file mode 100644 index 4e348228b61..00000000000 --- a/src/vs/workbench/browser/media/images/debug/stop-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/editor/open-change-alt1.svg b/src/vs/workbench/browser/media/images/editor/open-change-alt1.svg deleted file mode 100644 index 0c8297f940b..00000000000 --- a/src/vs/workbench/browser/media/images/editor/open-change-alt1.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/src/vs/workbench/browser/media/images/editor/split-horizontal-alt1.svg b/src/vs/workbench/browser/media/images/editor/split-horizontal-alt1.svg deleted file mode 100644 index c92025ddd92..00000000000 --- a/src/vs/workbench/browser/media/images/editor/split-horizontal-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/editor/split-vertical-alt1.svg b/src/vs/workbench/browser/media/images/editor/split-vertical-alt1.svg deleted file mode 100644 index f407c08fa34..00000000000 --- a/src/vs/workbench/browser/media/images/editor/split-vertical-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/explorer/add-file-alt1.svg b/src/vs/workbench/browser/media/images/explorer/add-file-alt1.svg deleted file mode 100644 index 138351f66b2..00000000000 --- a/src/vs/workbench/browser/media/images/explorer/add-file-alt1.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/vs/workbench/browser/media/images/explorer/add-folder-alt1.svg b/src/vs/workbench/browser/media/images/explorer/add-folder-alt1.svg deleted file mode 100644 index 0f1a2bfb9ba..00000000000 --- a/src/vs/workbench/browser/media/images/explorer/add-folder-alt1.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/vs/workbench/browser/media/images/explorer/close-alt1.svg b/src/vs/workbench/browser/media/images/explorer/close-alt1.svg deleted file mode 100644 index 8af24a5b1e8..00000000000 --- a/src/vs/workbench/browser/media/images/explorer/close-alt1.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/vs/workbench/browser/media/images/explorer/collapse-alt1.svg b/src/vs/workbench/browser/media/images/explorer/collapse-alt1.svg deleted file mode 100644 index f2e0e5dd5f6..00000000000 --- a/src/vs/workbench/browser/media/images/explorer/collapse-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/explorer/layout-alt1.svg b/src/vs/workbench/browser/media/images/explorer/layout-alt1.svg deleted file mode 100644 index 40c1b46b197..00000000000 --- a/src/vs/workbench/browser/media/images/explorer/layout-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/explorer/more-alt1.svg b/src/vs/workbench/browser/media/images/explorer/more-alt1.svg deleted file mode 100644 index 3d7068f6b4c..00000000000 --- a/src/vs/workbench/browser/media/images/explorer/more-alt1.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/vs/workbench/browser/media/images/explorer/refresh-alt1.svg b/src/vs/workbench/browser/media/images/explorer/refresh-alt1.svg deleted file mode 100644 index a940b8ef4a6..00000000000 --- a/src/vs/workbench/browser/media/images/explorer/refresh-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/explorer/save-alt1.svg b/src/vs/workbench/browser/media/images/explorer/save-alt1.svg deleted file mode 100644 index 5756795cb42..00000000000 --- a/src/vs/workbench/browser/media/images/explorer/save-alt1.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/src/vs/workbench/browser/media/images/extensions/clear-alt1.svg b/src/vs/workbench/browser/media/images/extensions/clear-alt1.svg deleted file mode 100644 index 63be0fae215..00000000000 --- a/src/vs/workbench/browser/media/images/extensions/clear-alt1.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/vs/workbench/browser/media/images/extensions/download-alt1.svg b/src/vs/workbench/browser/media/images/extensions/download-alt1.svg deleted file mode 100644 index 211864d2c8b..00000000000 --- a/src/vs/workbench/browser/media/images/extensions/download-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/extensions/gear-alt1.svg b/src/vs/workbench/browser/media/images/extensions/gear-alt1.svg deleted file mode 100644 index 7db1664af78..00000000000 --- a/src/vs/workbench/browser/media/images/extensions/gear-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/extensions/star-empty-alt1.svg b/src/vs/workbench/browser/media/images/extensions/star-empty-alt1.svg deleted file mode 100644 index a35ded971f7..00000000000 --- a/src/vs/workbench/browser/media/images/extensions/star-empty-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/extensions/star-full-alt1.svg b/src/vs/workbench/browser/media/images/extensions/star-full-alt1.svg deleted file mode 100644 index 2413e6ecb1f..00000000000 --- a/src/vs/workbench/browser/media/images/extensions/star-full-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/extensions/star-half-alt1.svg b/src/vs/workbench/browser/media/images/extensions/star-half-alt1.svg deleted file mode 100644 index 4e8dcd71f3b..00000000000 --- a/src/vs/workbench/browser/media/images/extensions/star-half-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/find/close-alt1.svg b/src/vs/workbench/browser/media/images/find/close-alt1.svg deleted file mode 100644 index 2512e9d61aa..00000000000 --- a/src/vs/workbench/browser/media/images/find/close-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/find/collapse-alt1.svg b/src/vs/workbench/browser/media/images/find/collapse-alt1.svg deleted file mode 100644 index 6d01adc07ea..00000000000 --- a/src/vs/workbench/browser/media/images/find/collapse-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/find/expand-alt1.svg b/src/vs/workbench/browser/media/images/find/expand-alt1.svg deleted file mode 100644 index a1a96a60926..00000000000 --- a/src/vs/workbench/browser/media/images/find/expand-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/find/next-alt1.svg b/src/vs/workbench/browser/media/images/find/next-alt1.svg deleted file mode 100644 index d2660e6e90f..00000000000 --- a/src/vs/workbench/browser/media/images/find/next-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/find/previous-alt1.svg b/src/vs/workbench/browser/media/images/find/previous-alt1.svg deleted file mode 100644 index 6f8d0cbcb6d..00000000000 --- a/src/vs/workbench/browser/media/images/find/previous-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/find/replace-all-alt1.svg b/src/vs/workbench/browser/media/images/find/replace-all-alt1.svg deleted file mode 100644 index 66437cf4410..00000000000 --- a/src/vs/workbench/browser/media/images/find/replace-all-alt1.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/src/vs/workbench/browser/media/images/find/replace-alt1.svg b/src/vs/workbench/browser/media/images/find/replace-alt1.svg deleted file mode 100644 index b599b6e5432..00000000000 --- a/src/vs/workbench/browser/media/images/find/replace-alt1.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/src/vs/workbench/browser/media/images/find/selection-alt1.svg b/src/vs/workbench/browser/media/images/find/selection-alt1.svg deleted file mode 100644 index e0503a93a51..00000000000 --- a/src/vs/workbench/browser/media/images/find/selection-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/git/check-alt1.svg b/src/vs/workbench/browser/media/images/git/check-alt1.svg deleted file mode 100644 index a5597d7c404..00000000000 --- a/src/vs/workbench/browser/media/images/git/check-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/git/clean-alt1.svg b/src/vs/workbench/browser/media/images/git/clean-alt1.svg deleted file mode 100644 index 2f3dd525c0d..00000000000 --- a/src/vs/workbench/browser/media/images/git/clean-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/git/close-alt1.svg b/src/vs/workbench/browser/media/images/git/close-alt1.svg deleted file mode 100644 index 64618b61760..00000000000 --- a/src/vs/workbench/browser/media/images/git/close-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/git/gotofile-alt1.svg b/src/vs/workbench/browser/media/images/git/gotofile-alt1.svg deleted file mode 100644 index aabfc34c3e4..00000000000 --- a/src/vs/workbench/browser/media/images/git/gotofile-alt1.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/vs/workbench/browser/media/images/git/initialze.svg b/src/vs/workbench/browser/media/images/git/initialze.svg deleted file mode 100644 index fb50c6c2849..00000000000 --- a/src/vs/workbench/browser/media/images/git/initialze.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/git/next-alt1.svg b/src/vs/workbench/browser/media/images/git/next-alt1.svg deleted file mode 100644 index d2660e6e90f..00000000000 --- a/src/vs/workbench/browser/media/images/git/next-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/git/previous-alt1.svg b/src/vs/workbench/browser/media/images/git/previous-alt1.svg deleted file mode 100644 index 6f8d0cbcb6d..00000000000 --- a/src/vs/workbench/browser/media/images/git/previous-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/git/refresh-alt1.svg b/src/vs/workbench/browser/media/images/git/refresh-alt1.svg deleted file mode 100644 index a940b8ef4a6..00000000000 --- a/src/vs/workbench/browser/media/images/git/refresh-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/git/stage-alt1.svg b/src/vs/workbench/browser/media/images/git/stage-alt1.svg deleted file mode 100644 index fb50c6c2849..00000000000 --- a/src/vs/workbench/browser/media/images/git/stage-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/git/unstage-alt1.svg b/src/vs/workbench/browser/media/images/git/unstage-alt1.svg deleted file mode 100644 index ae942eb6748..00000000000 --- a/src/vs/workbench/browser/media/images/git/unstage-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/git/whitespace-alt1.svg b/src/vs/workbench/browser/media/images/git/whitespace-alt1.svg deleted file mode 100644 index b17a38ab079..00000000000 --- a/src/vs/workbench/browser/media/images/git/whitespace-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/array-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/array-alt1.svg deleted file mode 100644 index b058a7ca9cc..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/array-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/boolean-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/boolean-alt1.svg deleted file mode 100644 index 8fbcf89f2fd..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/boolean-alt1.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/class-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/class-alt1.svg deleted file mode 100644 index c939df47de5..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/class-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/close-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/close-alt1.svg deleted file mode 100644 index 1d8840d9276..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/close-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/color-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/color-alt1.svg deleted file mode 100644 index 914bb6f48d5..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/color-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/constant-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/constant-alt1.svg deleted file mode 100644 index bbb9e6dcbf8..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/constant-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/enum-member-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/enum-member-alt1.svg deleted file mode 100644 index e182868e71e..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/enum-member-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/enumerator-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/enumerator-alt1.svg deleted file mode 100644 index 7b87fce3202..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/enumerator-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/event-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/event-alt1.svg deleted file mode 100644 index 9c7c2504c24..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/event-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/field-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/field-alt1.svg deleted file mode 100644 index e547fb51a2d..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/field-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/file-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/file-alt1.svg deleted file mode 100644 index 9a0f5212ac7..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/file-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/folder-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/folder-alt1.svg deleted file mode 100644 index 8d3f68206e0..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/folder-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/info-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/info-alt1.svg deleted file mode 100644 index ef9fe8777a3..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/info-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/interface-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/interface-alt1.svg deleted file mode 100644 index 9114ce3f3e8..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/interface-alt1.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/key-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/key-alt1.svg deleted file mode 100644 index 58c6cf4ca11..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/key-alt1.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/keyword-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/keyword-alt1.svg deleted file mode 100644 index f21364efec0..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/keyword-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/lightbulb-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/lightbulb-alt1.svg deleted file mode 100644 index 1583a31632c..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/lightbulb-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/lightbulb-autofix-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/lightbulb-autofix-alt1.svg deleted file mode 100644 index d5ef68f9b83..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/lightbulb-autofix-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/method-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/method-alt1.svg deleted file mode 100644 index 392febfaa6b..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/method-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/namespace-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/namespace-alt1.svg deleted file mode 100644 index bb4c103c752..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/namespace-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/numeric-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/numeric-alt1.svg deleted file mode 100644 index 90cf05e747a..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/numeric-alt1.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/operator-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/operator-alt1.svg deleted file mode 100644 index 20f50387a69..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/operator-alt1.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/parameter-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/parameter-alt1.svg deleted file mode 100644 index 00198f67f4e..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/parameter-alt1.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/property-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/property-alt1.svg deleted file mode 100644 index 828113202a9..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/property-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/reference-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/reference-alt1.svg deleted file mode 100644 index aabfc34c3e4..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/reference-alt1.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/ruler-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/ruler-alt1.svg deleted file mode 100644 index eec16f41fbf..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/ruler-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/snippet-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/snippet-alt1.svg deleted file mode 100644 index ee82045f2ac..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/snippet-alt1.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/string-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/string-alt1.svg deleted file mode 100644 index 1aa09c086cb..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/string-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/structure-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/structure-alt1.svg deleted file mode 100644 index f0e857ed7ca..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/structure-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/intellisense/variable-alt1.svg b/src/vs/workbench/browser/media/images/intellisense/variable-alt1.svg deleted file mode 100644 index 8cf0dbb7116..00000000000 --- a/src/vs/workbench/browser/media/images/intellisense/variable-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/misc/clear-alt1.svg b/src/vs/workbench/browser/media/images/misc/clear-alt1.svg deleted file mode 100644 index 0e624a23191..00000000000 --- a/src/vs/workbench/browser/media/images/misc/clear-alt1.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/vs/workbench/browser/media/images/misc/fold-alt1.svg b/src/vs/workbench/browser/media/images/misc/fold-alt1.svg deleted file mode 100644 index 69efb3e6957..00000000000 --- a/src/vs/workbench/browser/media/images/misc/fold-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/misc/gotofile-alt1.svg b/src/vs/workbench/browser/media/images/misc/gotofile-alt1.svg deleted file mode 100644 index aabfc34c3e4..00000000000 --- a/src/vs/workbench/browser/media/images/misc/gotofile-alt1.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/vs/workbench/browser/media/images/misc/json-alt1.svg b/src/vs/workbench/browser/media/images/misc/json-alt1.svg deleted file mode 100644 index 9e8f99141fc..00000000000 --- a/src/vs/workbench/browser/media/images/misc/json-alt1.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/src/vs/workbench/browser/media/images/misc/keyboard-alt1.svg b/src/vs/workbench/browser/media/images/misc/keyboard-alt1.svg deleted file mode 100644 index 6181acae7ef..00000000000 --- a/src/vs/workbench/browser/media/images/misc/keyboard-alt1.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/src/vs/workbench/browser/media/images/misc/more-alt1.svg b/src/vs/workbench/browser/media/images/misc/more-alt1.svg deleted file mode 100644 index 3d7068f6b4c..00000000000 --- a/src/vs/workbench/browser/media/images/misc/more-alt1.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/vs/workbench/browser/media/images/misc/precedence-alt1.svg b/src/vs/workbench/browser/media/images/misc/precedence-alt1.svg deleted file mode 100644 index 2609f1f40f9..00000000000 --- a/src/vs/workbench/browser/media/images/misc/precedence-alt1.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/vs/workbench/browser/media/images/misc/preview-alt1.svg b/src/vs/workbench/browser/media/images/misc/preview-alt1.svg deleted file mode 100644 index 25bf0b58bb9..00000000000 --- a/src/vs/workbench/browser/media/images/misc/preview-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/misc/preview-icon-alt1.svg b/src/vs/workbench/browser/media/images/misc/preview-icon-alt1.svg deleted file mode 100644 index df907d5dd14..00000000000 --- a/src/vs/workbench/browser/media/images/misc/preview-icon-alt1.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/vs/workbench/browser/media/images/misc/split-alt1.svg b/src/vs/workbench/browser/media/images/misc/split-alt1.svg deleted file mode 100644 index c92025ddd92..00000000000 --- a/src/vs/workbench/browser/media/images/misc/split-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/misc/unfold-alt1.svg b/src/vs/workbench/browser/media/images/misc/unfold-alt1.svg deleted file mode 100644 index bb57558f608..00000000000 --- a/src/vs/workbench/browser/media/images/misc/unfold-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/notifications/close-alt1.svg b/src/vs/workbench/browser/media/images/notifications/close-alt1.svg deleted file mode 100644 index 64618b61760..00000000000 --- a/src/vs/workbench/browser/media/images/notifications/close-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/notifications/closeall-alt1.svg b/src/vs/workbench/browser/media/images/notifications/closeall-alt1.svg deleted file mode 100644 index 72bf0a8b54a..00000000000 --- a/src/vs/workbench/browser/media/images/notifications/closeall-alt1.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/vs/workbench/browser/media/images/notifications/configure-alt1.svg b/src/vs/workbench/browser/media/images/notifications/configure-alt1.svg deleted file mode 100644 index 7db1664af78..00000000000 --- a/src/vs/workbench/browser/media/images/notifications/configure-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/notifications/down-alt1.svg b/src/vs/workbench/browser/media/images/notifications/down-alt1.svg deleted file mode 100644 index 7042b08fddf..00000000000 --- a/src/vs/workbench/browser/media/images/notifications/down-alt1.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/src/vs/workbench/browser/media/images/notifications/error-alt1.svg b/src/vs/workbench/browser/media/images/notifications/error-alt1.svg deleted file mode 100644 index e39bf5e0e4a..00000000000 --- a/src/vs/workbench/browser/media/images/notifications/error-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/notifications/info-alt1.svg b/src/vs/workbench/browser/media/images/notifications/info-alt1.svg deleted file mode 100644 index 4a597c7b804..00000000000 --- a/src/vs/workbench/browser/media/images/notifications/info-alt1.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/vs/workbench/browser/media/images/notifications/up-alt1.svg b/src/vs/workbench/browser/media/images/notifications/up-alt1.svg deleted file mode 100644 index d5edcc4c305..00000000000 --- a/src/vs/workbench/browser/media/images/notifications/up-alt1.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/src/vs/workbench/browser/media/images/notifications/warning-alt1.svg b/src/vs/workbench/browser/media/images/notifications/warning-alt1.svg deleted file mode 100644 index 948c0b4decf..00000000000 --- a/src/vs/workbench/browser/media/images/notifications/warning-alt1.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/vs/workbench/browser/media/images/panel/add-alt1.svg b/src/vs/workbench/browser/media/images/panel/add-alt1.svg deleted file mode 100644 index fb50c6c2849..00000000000 --- a/src/vs/workbench/browser/media/images/panel/add-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/panel/clear-alt1.svg b/src/vs/workbench/browser/media/images/panel/clear-alt1.svg deleted file mode 100644 index 63be0fae215..00000000000 --- a/src/vs/workbench/browser/media/images/panel/clear-alt1.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/vs/workbench/browser/media/images/panel/close-all-alt1.svg b/src/vs/workbench/browser/media/images/panel/close-all-alt1.svg deleted file mode 100644 index 8af24a5b1e8..00000000000 --- a/src/vs/workbench/browser/media/images/panel/close-all-alt1.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/vs/workbench/browser/media/images/panel/close-alt1.svg b/src/vs/workbench/browser/media/images/panel/close-alt1.svg deleted file mode 100644 index 3818f7d5350..00000000000 --- a/src/vs/workbench/browser/media/images/panel/close-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/panel/collapse-all-alt1.svg b/src/vs/workbench/browser/media/images/panel/collapse-all-alt1.svg deleted file mode 100644 index f2e0e5dd5f6..00000000000 --- a/src/vs/workbench/browser/media/images/panel/collapse-all-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/panel/down-alt1.svg b/src/vs/workbench/browser/media/images/panel/down-alt1.svg deleted file mode 100644 index de3313624a4..00000000000 --- a/src/vs/workbench/browser/media/images/panel/down-alt1.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/src/vs/workbench/browser/media/images/panel/gear-alt1.svg b/src/vs/workbench/browser/media/images/panel/gear-alt1.svg deleted file mode 100644 index 7db1664af78..00000000000 --- a/src/vs/workbench/browser/media/images/panel/gear-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/panel/gotofile-alt1.svg b/src/vs/workbench/browser/media/images/panel/gotofile-alt1.svg deleted file mode 100644 index aabfc34c3e4..00000000000 --- a/src/vs/workbench/browser/media/images/panel/gotofile-alt1.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/vs/workbench/browser/media/images/panel/kill-alt1.svg b/src/vs/workbench/browser/media/images/panel/kill-alt1.svg deleted file mode 100644 index bc448290732..00000000000 --- a/src/vs/workbench/browser/media/images/panel/kill-alt1.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/src/vs/workbench/browser/media/images/panel/output-lock-alt1.svg b/src/vs/workbench/browser/media/images/panel/output-lock-alt1.svg deleted file mode 100644 index 70d268965a0..00000000000 --- a/src/vs/workbench/browser/media/images/panel/output-lock-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/panel/output-unlock-alt1.svg b/src/vs/workbench/browser/media/images/panel/output-unlock-alt1.svg deleted file mode 100644 index cf8268d37d2..00000000000 --- a/src/vs/workbench/browser/media/images/panel/output-unlock-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/panel/split-horizontal-alt1.svg b/src/vs/workbench/browser/media/images/panel/split-horizontal-alt1.svg deleted file mode 100644 index c92025ddd92..00000000000 --- a/src/vs/workbench/browser/media/images/panel/split-horizontal-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/panel/split-vertical-alt1.svg b/src/vs/workbench/browser/media/images/panel/split-vertical-alt1.svg deleted file mode 100644 index f407c08fa34..00000000000 --- a/src/vs/workbench/browser/media/images/panel/split-vertical-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/panel/up-alt1.svg b/src/vs/workbench/browser/media/images/panel/up-alt1.svg deleted file mode 100644 index e7ac370945f..00000000000 --- a/src/vs/workbench/browser/media/images/panel/up-alt1.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/src/vs/workbench/browser/media/images/search/case-sensitive-alt1.svg b/src/vs/workbench/browser/media/images/search/case-sensitive-alt1.svg deleted file mode 100644 index 418172b6866..00000000000 --- a/src/vs/workbench/browser/media/images/search/case-sensitive-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/search/clear-alt1.svg b/src/vs/workbench/browser/media/images/search/clear-alt1.svg deleted file mode 100644 index 890a6cddaa1..00000000000 --- a/src/vs/workbench/browser/media/images/search/clear-alt1.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/vs/workbench/browser/media/images/search/collapse-all-alt1.svg b/src/vs/workbench/browser/media/images/search/collapse-all-alt1.svg deleted file mode 100644 index f2e0e5dd5f6..00000000000 --- a/src/vs/workbench/browser/media/images/search/collapse-all-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/search/collapse-alt1.svg b/src/vs/workbench/browser/media/images/search/collapse-alt1.svg deleted file mode 100644 index 829e53760f2..00000000000 --- a/src/vs/workbench/browser/media/images/search/collapse-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/search/exclude-alt1.svg b/src/vs/workbench/browser/media/images/search/exclude-alt1.svg deleted file mode 100644 index 2257ec6dae9..00000000000 --- a/src/vs/workbench/browser/media/images/search/exclude-alt1.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/vs/workbench/browser/media/images/search/expand-alt1.svg b/src/vs/workbench/browser/media/images/search/expand-alt1.svg deleted file mode 100644 index a1085f2ad07..00000000000 --- a/src/vs/workbench/browser/media/images/search/expand-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/search/more-alt1.svg b/src/vs/workbench/browser/media/images/search/more-alt1.svg deleted file mode 100644 index a83faaa6ffb..00000000000 --- a/src/vs/workbench/browser/media/images/search/more-alt1.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/vs/workbench/browser/media/images/search/refresh-alt1.svg b/src/vs/workbench/browser/media/images/search/refresh-alt1.svg deleted file mode 100644 index a940b8ef4a6..00000000000 --- a/src/vs/workbench/browser/media/images/search/refresh-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/search/regex-alt1.svg b/src/vs/workbench/browser/media/images/search/regex-alt1.svg deleted file mode 100644 index bffb311a5be..00000000000 --- a/src/vs/workbench/browser/media/images/search/regex-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/search/remove-alt1.svg b/src/vs/workbench/browser/media/images/search/remove-alt1.svg deleted file mode 100644 index 64618b61760..00000000000 --- a/src/vs/workbench/browser/media/images/search/remove-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/search/replace-all-alt1.svg b/src/vs/workbench/browser/media/images/search/replace-all-alt1.svg deleted file mode 100644 index 1ef9b63cd60..00000000000 --- a/src/vs/workbench/browser/media/images/search/replace-all-alt1.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/src/vs/workbench/browser/media/images/search/replace-alt1.svg b/src/vs/workbench/browser/media/images/search/replace-alt1.svg deleted file mode 100644 index 0979845e836..00000000000 --- a/src/vs/workbench/browser/media/images/search/replace-alt1.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/src/vs/workbench/browser/media/images/search/stop-alt1.svg b/src/vs/workbench/browser/media/images/search/stop-alt1.svg deleted file mode 100644 index 52f3aa26ce2..00000000000 --- a/src/vs/workbench/browser/media/images/search/stop-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/search/whole-word-alt1.svg b/src/vs/workbench/browser/media/images/search/whole-word-alt1.svg deleted file mode 100644 index 8a18eed8deb..00000000000 --- a/src/vs/workbench/browser/media/images/search/whole-word-alt1.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/vs/workbench/browser/media/images/tree/close-alt1.svg b/src/vs/workbench/browser/media/images/tree/close-alt1.svg deleted file mode 100644 index 3818f7d5350..00000000000 --- a/src/vs/workbench/browser/media/images/tree/close-alt1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/browser/media/images/tree/collapse-alt1.svg b/src/vs/workbench/browser/media/images/tree/collapse-alt1.svg deleted file mode 100644 index f6e6553774e..00000000000 --- a/src/vs/workbench/browser/media/images/tree/collapse-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/tree/dirty-alt1.svg b/src/vs/workbench/browser/media/images/tree/dirty-alt1.svg deleted file mode 100644 index e391c3b0852..00000000000 --- a/src/vs/workbench/browser/media/images/tree/dirty-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/tree/expand-alt1.svg b/src/vs/workbench/browser/media/images/tree/expand-alt1.svg deleted file mode 100644 index a98a85b340e..00000000000 --- a/src/vs/workbench/browser/media/images/tree/expand-alt1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/browser/media/images/tree/expand-empty.svg b/src/vs/workbench/browser/media/images/tree/expand-empty.svg deleted file mode 100644 index 1a0e359a261..00000000000 --- a/src/vs/workbench/browser/media/images/tree/expand-empty.svg +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/src/vs/workbench/browser/style.ts b/src/vs/workbench/browser/style.ts index 24bc347c337..8db78ac9953 100644 --- a/src/vs/workbench/browser/style.ts +++ b/src/vs/workbench/browser/style.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import 'vs/css!./media/style'; -import 'vs/css!./media/icons'; import { registerThemingParticipant, ITheme, ICssStyleCollector, HIGH_CONTRAST } from 'vs/platform/theme/common/themeService'; import { foreground, selectionBackground, focusBorder, scrollbarShadow, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground, listHighlightForeground, inputPlaceholderForeground } from 'vs/platform/theme/common/colorRegistry'; diff --git a/src/vs/workbench/browser/workbench.contribution.ts b/src/vs/workbench/browser/workbench.contribution.ts index 5b46af70bad..2b164102e23 100644 --- a/src/vs/workbench/browser/workbench.contribution.ts +++ b/src/vs/workbench/browser/workbench.contribution.ts @@ -180,12 +180,6 @@ import { isMacintosh, isWindows, isLinux, isWeb } from 'vs/base/common/platform' 'default': true, 'description': nls.localize('activityBarVisibility', "Controls the visibility of the activity bar in the workbench.") }, - // TODO @misolori remove before shipping stable - 'workbench.iconExploration.enabled': { - 'type': 'boolean', - 'default': false, - 'description': nls.localize('iconExplorationEnabled', "Controls the visibility of the icon exploration in the workbench.") - }, 'workbench.view.alwaysShowHeaderActions': { 'type': 'boolean', 'default': false, From 253927a18aac8e015e4c2e6d06c57e396ff990b3 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Thu, 20 Jun 2019 15:58:14 -0700 Subject: [PATCH 0488/1449] Move listener to window service. --- src/vs/workbench/browser/web.main.ts | 8 -------- src/vs/workbench/browser/web.simpleservices.ts | 15 ++++++++++++++- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index d33b249cc98..6f1954ba252 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -36,7 +36,6 @@ import { SignService } from 'vs/platform/sign/browser/signService'; import { hash } from 'vs/base/common/hash'; import { IWorkbenchConstructionOptions } from 'vs/workbench/workbench.web.api'; import { ProductService } from 'vs/platform/product/browser/productService'; -import { setFullscreen } from 'vs/base/browser/browser'; class CodeRendererMain extends Disposable { @@ -64,13 +63,6 @@ class CodeRendererMain extends Disposable { // Layout this._register(addDisposableListener(window, EventType.RESIZE, () => this.workbench.layout())); - this._register(addDisposableListener(document, EventType.FULLSCREEN_CHANGE, () => { - if (document.fullscreenElement || (document).webkitFullscreenElement) { - setFullscreen(true); - } else { - setFullscreen(false); - } - })); // Resource Loading this._register(new WebResources(services.serviceCollection.get(IFileService))); diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index fd3d7c637cc..cb1eb5999ed 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -45,6 +45,7 @@ import { CommentingRanges } from 'vs/editor/common/modes'; import { Range } from 'vs/editor/common/core/range'; import { isUndefinedOrNull } from 'vs/base/common/types'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { addDisposableListener, EventType } from 'vs/base/browser/dom'; //#region Backup File @@ -724,7 +725,7 @@ registerSingleton(IURLService, SimpleURLService); //#region Window -export class SimpleWindowService implements IWindowService { +export class SimpleWindowService extends Disposable implements IWindowService { _serviceBrand: any; @@ -735,6 +736,18 @@ export class SimpleWindowService implements IWindowService { readonly windowId = 0; + constructor() { + super(); + + this._register(addDisposableListener(document, EventType.FULLSCREEN_CHANGE, () => { + if (document.fullscreenElement || (document).webkitFullscreenElement) { + browser.setFullscreen(true); + } else { + browser.setFullscreen(false); + } + })); + } + isFocused(): Promise { return Promise.resolve(this.hasFocus); } From f7930a5bbda44408ed8395eb4291125dcd224100 Mon Sep 17 00:00:00 2001 From: Rachel Macfarlane Date: Thu, 20 Jun 2019 17:01:04 -0700 Subject: [PATCH 0489/1449] Minimap: Render find match decorations, fixes #75216 --- .../browser/viewParts/minimap/minimap.ts | 105 +++++++++++++++++- src/vs/editor/common/model.ts | 32 +++++- src/vs/editor/common/model/textModel.ts | 26 ++++- .../common/standalone/standaloneEnums.ts | 7 ++ src/vs/editor/contrib/find/findDecorations.ts | 10 +- .../standalone/browser/standaloneEditor.ts | 1 + src/vs/monaco.d.ts | 32 +++++- 7 files changed, 195 insertions(+), 18 deletions(-) diff --git a/src/vs/editor/browser/viewParts/minimap/minimap.ts b/src/vs/editor/browser/viewParts/minimap/minimap.ts index 6dd6de47613..fa023adedd5 100644 --- a/src/vs/editor/browser/viewParts/minimap/minimap.ts +++ b/src/vs/editor/browser/viewParts/minimap/minimap.ts @@ -23,9 +23,10 @@ import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/v import { getOrCreateMinimapCharRenderer } from 'vs/editor/common/view/runtimeMinimapCharRenderer'; import { ViewContext } from 'vs/editor/common/view/viewContext'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; -import { ViewLineData } from 'vs/editor/common/viewModel/viewModel'; +import { ViewLineData, ViewModelDecoration } from 'vs/editor/common/viewModel/viewModel'; import { scrollbarShadow, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground } from 'vs/platform/theme/common/colorRegistry'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { ModelDecorationMinimapOptions } from 'vs/editor/common/model/textModel'; function getMinimapLineHeight(renderMinimap: RenderMinimap): number { if (renderMinimap === RenderMinimap.Large) { @@ -335,10 +336,7 @@ class RenderData { * Check if the current RenderData matches accurately the new desired layout and no painting is needed. */ public linesEquals(layout: MinimapLayout): boolean { - if (this.renderedLayout.startLineNumber !== layout.startLineNumber) { - return false; - } - if (this.renderedLayout.endLineNumber !== layout.endLineNumber) { + if (!this.scrollEquals(layout)) { return false; } @@ -354,6 +352,14 @@ class RenderData { return true; } + /** + * Check if the current RenderData matches the new layout's scroll position + */ + public scrollEquals(layout: MinimapLayout): boolean { + return this.renderedLayout.startLineNumber === layout.startLineNumber + && this.renderedLayout.endLineNumber === layout.endLineNumber; + } + _get(): { imageData: ImageData; rendLineNumberStart: number; lines: MinimapLine[]; } { const tmp = this._renderedLines._get(); return { @@ -435,6 +441,7 @@ export class Minimap extends ViewPart { private readonly _domNode: FastDomNode; private readonly _shadow: FastDomNode; private readonly _canvas: FastDomNode; + private readonly _decorationsCanvas: FastDomNode; private readonly _slider: FastDomNode; private readonly _sliderHorizontal: FastDomNode; private readonly _tokensColorTracker: MinimapTokensColorTracker; @@ -444,6 +451,7 @@ export class Minimap extends ViewPart { private _options: MinimapOptions; private _lastRenderData: RenderData | null; + private _decorationsChanged: boolean = false; private _buffers: MinimapBuffers | null; constructor(context: ViewContext) { @@ -469,6 +477,12 @@ export class Minimap extends ViewPart { this._canvas.setLeft(0); this._domNode.appendChild(this._canvas); + this._decorationsCanvas = createFastDomNode(document.createElement('canvas')); + this._decorationsCanvas.setPosition('absolute'); + this._decorationsCanvas.setClassName('minimap-decorations-layer'); + this._decorationsCanvas.setLeft(0); + this._domNode.appendChild(this._decorationsCanvas); + this._slider = createFastDomNode(document.createElement('div')); this._slider.setPosition('absolute'); this._slider.setClassName('minimap-slider'); @@ -569,10 +583,17 @@ export class Minimap extends ViewPart { this._domNode.setWidth(this._options.minimapWidth); this._domNode.setHeight(this._options.minimapHeight); this._shadow.setHeight(this._options.minimapHeight); + this._canvas.setWidth(this._options.canvasOuterWidth); this._canvas.setHeight(this._options.canvasOuterHeight); this._canvas.domNode.width = this._options.canvasInnerWidth; this._canvas.domNode.height = this._options.canvasInnerHeight; + + this._decorationsCanvas.setWidth(this._options.canvasOuterWidth); + this._decorationsCanvas.setHeight(this._options.canvasOuterHeight); + this._decorationsCanvas.domNode.width = this._options.canvasInnerWidth; + this._decorationsCanvas.domNode.height = this._options.canvasInnerHeight; + this._slider.setWidth(this._options.minimapWidth); } @@ -647,6 +668,11 @@ export class Minimap extends ViewPart { return true; } + public onDecorationsChanged(e: viewEvents.ViewDecorationsChangedEvent): boolean { + this._decorationsChanged = true; + return true; + } + // --- end event handlers public prepareRender(ctx: RenderingContext): void { @@ -689,9 +715,78 @@ export class Minimap extends ViewPart { this._sliderHorizontal.setTop(0); this._sliderHorizontal.setHeight(layout.sliderHeight); + this.renderDecorations(layout); this._lastRenderData = this.renderLines(layout); } + private renderDecorations(layout: MinimapLayout) { + const scrollHasChanged = this._lastRenderData && !this._lastRenderData.scrollEquals(layout); + if (scrollHasChanged || this._decorationsChanged) { + this._decorationsChanged = false; + const decorations = this._context.model.getDecorationsInViewport(new Range(layout.startLineNumber, 1, layout.endLineNumber, this._context.model.getLineMaxColumn(layout.endLineNumber))); + + const { renderMinimap, canvasInnerWidth, canvasInnerHeight } = this._options; + const lineHeight = getMinimapLineHeight(renderMinimap); + const characterWidth = getMinimapCharWidth(renderMinimap); + const tabSize = this._context.model.getOptions().tabSize; + const canvasContext = this._decorationsCanvas.domNode.getContext('2d')!; + + canvasContext.clearRect(0, 0, canvasInnerWidth, canvasInnerHeight); + + // If the minimap is rendered using blocks, text takes up half the line height + const lineHeightRatio = renderMinimap === RenderMinimap.LargeBlocks || renderMinimap === RenderMinimap.SmallBlocks ? 0.5 : 1; + const height = lineHeight * lineHeightRatio; + + for (let i = 0; i < decorations.length; i++) { + if (decorations[i].options.minimap) { + this.renderDecoration(canvasContext, decorations[i], layout, height, lineHeight, tabSize, characterWidth); + } + } + } + } + + private renderDecoration(canvasContext: CanvasRenderingContext2D, + decoration: ViewModelDecoration, + layout: MinimapLayout, + height: number, + lineHeight: number, + tabSize: number, + charWidth: number) { + const { startLineNumber, startColumn, endColumn } = decoration.range; + + const startIndex = startColumn - 1; + const endIndex = endColumn - 1; + + const y = (startLineNumber - layout.startLineNumber) * lineHeight; + + // Get the offset of the decoration in the line. Have to read line data to see how much space each character takes. + let x = 0; + let endPosition = 0; + const lineData = this._context.model.getLineContent(startLineNumber); + for (let i = 0; i < endIndex; i++) { + const charCode = lineData.charCodeAt(i); + const dx = charCode === CharCode.Tab + ? tabSize * charWidth + : strings.isFullWidthCharacter(charCode) + ? 2 * charWidth + : charWidth; + + if (i < startIndex) { + x += dx; + } + + endPosition += dx; + } + + const width = endPosition - x; + + const minimapOptions = decoration.options.minimap; + const decorationColor = minimapOptions.getColor(this._context.theme); + + canvasContext.fillStyle = decorationColor; + canvasContext.fillRect(x, y, width, height); + } + private renderLines(layout: MinimapLayout): RenderData { const renderMinimap = this._options.renderMinimap; const startLineNumber = layout.startLineNumber; diff --git a/src/vs/editor/common/model.ts b/src/vs/editor/common/model.ts index ebc34ca227f..d2fa60c5640 100644 --- a/src/vs/editor/common/model.ts +++ b/src/vs/editor/common/model.ts @@ -26,25 +26,45 @@ export enum OverviewRulerLane { } /** - * Options for rendering a model decoration in the overview ruler. + * Position in the minimap to render the decoration. */ -export interface IModelDecorationOverviewRulerOptions { +export enum MinimapPosition { + Inline = 1 +} + +export interface IDecorationOptions { /** - * CSS color to render in the overview ruler. + * CSS color to render. * e.g.: rgba(100, 100, 100, 0.5) or a color from the color registry */ color: string | ThemeColor | undefined; /** - * CSS color to render in the overview ruler. + * CSS color to render. * e.g.: rgba(100, 100, 100, 0.5) or a color from the color registry */ darkColor?: string | ThemeColor; +} + +/** + * Options for rendering a model decoration in the overview ruler. + */ +export interface IModelDecorationOverviewRulerOptions extends IDecorationOptions { /** * The position in the overview ruler. */ position: OverviewRulerLane; } +/** + * Options for rendering a model decoration in the overview ruler. + */ +export interface IModelDecorationMinimapOptions extends IDecorationOptions { + /** + * The position in the overview ruler. + */ + position: MinimapPosition; +} + /** * Options for a model decoration. */ @@ -89,6 +109,10 @@ export interface IModelDecorationOptions { * If set, render this decoration in the overview ruler. */ overviewRuler?: IModelDecorationOverviewRulerOptions | null; + /** + * If set, render this decoration in the minimap. + */ + minimap?: IModelDecorationMinimapOptions | null; /** * If set, the decoration will be rendered in the glyph margin with this CSS class name. */ diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index 2a640ac9d01..344613d09eb 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -2823,16 +2823,14 @@ function cleanClassName(className: string): string { return className.replace(/[^a-z0-9\-_]/gi, ' '); } -export class ModelDecorationOverviewRulerOptions implements model.IModelDecorationOverviewRulerOptions { +class DecorationOptions implements model.IDecorationOptions { readonly color: string | ThemeColor; readonly darkColor: string | ThemeColor; - readonly position: model.OverviewRulerLane; private _resolvedColor: string | null; - constructor(options: model.IModelDecorationOverviewRulerOptions) { + constructor(options: model.IDecorationOptions) { this.color = options.color || strings.empty; this.darkColor = options.darkColor || strings.empty; - this.position = (typeof options.position === 'number' ? options.position : model.OverviewRulerLane.Center); this._resolvedColor = null; } @@ -2863,6 +2861,24 @@ export class ModelDecorationOverviewRulerOptions implements model.IModelDecorati } } +export class ModelDecorationOverviewRulerOptions extends DecorationOptions { + readonly position: model.OverviewRulerLane; + + constructor(options: model.IModelDecorationOverviewRulerOptions) { + super(options); + this.position = (typeof options.position === 'number' ? options.position : model.OverviewRulerLane.Center); + } +} + +export class ModelDecorationMinimapOptions extends DecorationOptions { + readonly position: model.MinimapPosition; + + constructor(options: model.IModelDecorationMinimapOptions) { + super(options); + this.position = options.position; + } +} + export class ModelDecorationOptions implements model.IModelDecorationOptions { public static EMPTY: ModelDecorationOptions; @@ -2884,6 +2900,7 @@ export class ModelDecorationOptions implements model.IModelDecorationOptions { readonly showIfCollapsed: boolean; readonly collapseOnReplaceEdit: boolean; readonly overviewRuler: ModelDecorationOverviewRulerOptions | null; + readonly minimap: ModelDecorationMinimapOptions | null; readonly glyphMarginClassName: string | null; readonly linesDecorationsClassName: string | null; readonly marginClassName: string | null; @@ -2902,6 +2919,7 @@ export class ModelDecorationOptions implements model.IModelDecorationOptions { this.showIfCollapsed = options.showIfCollapsed || false; this.collapseOnReplaceEdit = options.collapseOnReplaceEdit || false; this.overviewRuler = options.overviewRuler ? new ModelDecorationOverviewRulerOptions(options.overviewRuler) : null; + this.minimap = options.minimap ? new ModelDecorationMinimapOptions(options.minimap) : null; this.glyphMarginClassName = options.glyphMarginClassName ? cleanClassName(options.glyphMarginClassName) : null; this.linesDecorationsClassName = options.linesDecorationsClassName ? cleanClassName(options.linesDecorationsClassName) : null; this.marginClassName = options.marginClassName ? cleanClassName(options.marginClassName) : null; diff --git a/src/vs/editor/common/standalone/standaloneEnums.ts b/src/vs/editor/common/standalone/standaloneEnums.ts index 113afbafc34..df80861b2a8 100644 --- a/src/vs/editor/common/standalone/standaloneEnums.ts +++ b/src/vs/editor/common/standalone/standaloneEnums.ts @@ -228,6 +228,13 @@ export enum OverviewRulerLane { Full = 7 } +/** + * Position in the minimap to render the decoration. + */ +export enum MinimapPosition { + Inline = 1 +} + /** * End of line character preference. */ diff --git a/src/vs/editor/contrib/find/findDecorations.ts b/src/vs/editor/contrib/find/findDecorations.ts index bb115977387..49a5527fd55 100644 --- a/src/vs/editor/contrib/find/findDecorations.ts +++ b/src/vs/editor/contrib/find/findDecorations.ts @@ -7,7 +7,7 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { IActiveCodeEditor } from 'vs/editor/browser/editorBrowser'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; -import { FindMatch, IModelDecorationsChangeAccessor, IModelDeltaDecoration, OverviewRulerLane, TrackedRangeStickiness } from 'vs/editor/common/model'; +import { FindMatch, IModelDecorationsChangeAccessor, IModelDeltaDecoration, OverviewRulerLane, TrackedRangeStickiness, MinimapPosition } from 'vs/editor/common/model'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; import { overviewRulerFindMatchForeground } from 'vs/platform/theme/common/colorRegistry'; import { themeColorFromId } from 'vs/platform/theme/common/themeService'; @@ -269,6 +269,10 @@ export class FindDecorations implements IDisposable { overviewRuler: { color: themeColorFromId(overviewRulerFindMatchForeground), position: OverviewRulerLane.Center + }, + minimap: { + color: themeColorFromId(overviewRulerFindMatchForeground), + position: MinimapPosition.Inline } }); @@ -279,6 +283,10 @@ export class FindDecorations implements IDisposable { overviewRuler: { color: themeColorFromId(overviewRulerFindMatchForeground), position: OverviewRulerLane.Center + }, + minimap: { + color: themeColorFromId(overviewRulerFindMatchForeground), + position: MinimapPosition.Inline } }); diff --git a/src/vs/editor/standalone/browser/standaloneEditor.ts b/src/vs/editor/standalone/browser/standaloneEditor.ts index b09f41e79f1..8750db8f943 100644 --- a/src/vs/editor/standalone/browser/standaloneEditor.ts +++ b/src/vs/editor/standalone/browser/standaloneEditor.ts @@ -352,6 +352,7 @@ export function createMonacoEditorAPI(): typeof monaco.editor { ScrollbarVisibility: standaloneEnums.ScrollbarVisibility, WrappingIndent: standaloneEnums.WrappingIndent, OverviewRulerLane: standaloneEnums.OverviewRulerLane, + MinimapPosition: standaloneEnums.MinimapPosition, EndOfLinePreference: standaloneEnums.EndOfLinePreference, DefaultEndOfLine: standaloneEnums.DefaultEndOfLine, EndOfLineSequence: standaloneEnums.EndOfLineSequence, diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 34e8a703be4..3b1c5237e83 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -1180,25 +1180,45 @@ declare namespace monaco.editor { } /** - * Options for rendering a model decoration in the overview ruler. + * Position in the minimap to render the decoration. */ - export interface IModelDecorationOverviewRulerOptions { + export enum MinimapPosition { + Inline = 1 + } + + export interface IDecorationOptions { /** - * CSS color to render in the overview ruler. + * CSS color to render. * e.g.: rgba(100, 100, 100, 0.5) or a color from the color registry */ color: string | ThemeColor | undefined; /** - * CSS color to render in the overview ruler. + * CSS color to render. * e.g.: rgba(100, 100, 100, 0.5) or a color from the color registry */ darkColor?: string | ThemeColor; + } + + /** + * Options for rendering a model decoration in the overview ruler. + */ + export interface IModelDecorationOverviewRulerOptions extends IDecorationOptions { /** * The position in the overview ruler. */ position: OverviewRulerLane; } + /** + * Options for rendering a model decoration in the overview ruler. + */ + export interface IModelDecorationMinimapOptions extends IDecorationOptions { + /** + * The position in the overview ruler. + */ + position: MinimapPosition; + } + /** * Options for a model decoration. */ @@ -1233,6 +1253,10 @@ declare namespace monaco.editor { * If set, render this decoration in the overview ruler. */ overviewRuler?: IModelDecorationOverviewRulerOptions | null; + /** + * If set, render this decoration in the minimap. + */ + minimap?: IModelDecorationMinimapOptions | null; /** * If set, the decoration will be rendered in the glyph margin with this CSS class name. */ From 1c275b0ce45c4d3eb2f94e6eb7dfa0d7a101d5c8 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 20 Jun 2019 15:42:26 -0700 Subject: [PATCH 0490/1449] Fix `navigator.serviceWorker.ready` is a Promise, not a function --- src/vs/workbench/contrib/webview/browser/pre/host.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/host.js b/src/vs/workbench/contrib/webview/browser/pre/host.js index 71acbf4b8a3..c5eefcd9810 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/host.js +++ b/src/vs/workbench/contrib/webview/browser/pre/host.js @@ -57,7 +57,7 @@ // If we have the wrong version, try once to unregister and re-register return registration.unregister() .then(() => navigator.serviceWorker.register('service-worker.js')) - .then(navigator.serviceWorker.ready) + .then(() => navigator.serviceWorker.ready) .finally(resolveWorkerReady); } }; From 804a266e0c8383e51fd9294f585f185ace5a563f Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 20 Jun 2019 15:43:42 -0700 Subject: [PATCH 0491/1449] Use update instead of manually tring to re-register --- src/vs/workbench/contrib/webview/browser/pre/host.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/host.js b/src/vs/workbench/contrib/webview/browser/pre/host.js index c5eefcd9810..903bf54e1c7 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/host.js +++ b/src/vs/workbench/contrib/webview/browser/pre/host.js @@ -55,8 +55,7 @@ return resolveWorkerReady(); } else { // If we have the wrong version, try once to unregister and re-register - return registration.unregister() - .then(() => navigator.serviceWorker.register('service-worker.js')) + return registration.update() .then(() => navigator.serviceWorker.ready) .finally(resolveWorkerReady); } From 7e1f8d4f1d5b1952b4ffb797a36e0fdeb897e8be Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 20 Jun 2019 15:52:34 -0700 Subject: [PATCH 0492/1449] Extract ITypeScript server interface --- .../src/tsServer/server.ts | 21 +++++++++++++++++-- .../src/typescriptServiceClient.ts | 4 ++-- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/extensions/typescript-language-features/src/tsServer/server.ts b/extensions/typescript-language-features/src/tsServer/server.ts index 10a001d52c2..125c541fe0f 100644 --- a/extensions/typescript-language-features/src/tsServer/server.ts +++ b/extensions/typescript-language-features/src/tsServer/server.ts @@ -109,7 +109,7 @@ export class TypeScriptServerSpawner { version: TypeScriptVersion, configuration: TypeScriptServiceConfiguration, pluginManager: PluginManager - ): TypeScriptServer { + ): ITypeScriptServer { const apiVersion = version.version || API.defaultVersion; const { args, cancellationPipeName, tsServerLogFile } = this.getTsServerArgs(configuration, version, apiVersion, pluginManager); @@ -303,7 +303,24 @@ class ChildServerProcess implements ServerProcess { } } -export class TypeScriptServer extends Disposable { +export interface ITypeScriptServer { + readonly onEvent: vscode.Event; + readonly onExit: vscode.Event; + readonly onError: vscode.Event; + readonly onReaderError: vscode.Event; + + readonly tsServerLogFile: string | undefined; + + kill(): void; + + executeImpl(command: string, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: false, lowPriority?: boolean }): undefined; + executeImpl(command: string, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: boolean, lowPriority?: boolean }): Promise>; + executeImpl(command: string, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: boolean, lowPriority?: boolean }): Promise> | undefined; + + dispose(): void; +} + +export class TypeScriptServer extends Disposable implements ITypeScriptServer { private readonly _reader: Reader; private readonly _requestQueue = new RequestQueue(); private readonly _callbacks = new CallbackMap(); diff --git a/extensions/typescript-language-features/src/typescriptServiceClient.ts b/extensions/typescript-language-features/src/typescriptServiceClient.ts index b478e9ed080..2849cfcd012 100644 --- a/extensions/typescript-language-features/src/typescriptServiceClient.ts +++ b/extensions/typescript-language-features/src/typescriptServiceClient.ts @@ -10,7 +10,7 @@ import * as nls from 'vscode-nls'; import BufferSyncSupport from './features/bufferSyncSupport'; import { DiagnosticKind, DiagnosticsManager } from './features/diagnostics'; import * as Proto from './protocol'; -import { TypeScriptServer, TypeScriptServerSpawner } from './tsServer/server'; +import { ITypeScriptServer, TypeScriptServerSpawner } from './tsServer/server'; import { ITypeScriptServiceClient, ServerResponse } from './typescriptService'; import API from './utils/api'; import { TsServerLogLevel, TypeScriptServiceConfiguration } from './utils/configuration'; @@ -46,7 +46,7 @@ namespace ServerState { export class Running { readonly type = Type.Running; constructor( - public readonly server: TypeScriptServer, + public readonly server: ITypeScriptServer, /** * API version obtained from the version picker after checking the corresponding path exists. From ccf4a04d5a227289ece5e502a16dcc135507f82c Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 20 Jun 2019 15:56:42 -0700 Subject: [PATCH 0493/1449] extract server error to own file --- .../src/tsServer/server.ts | 71 +------------------ .../src/tsServer/serverError.ts | 64 +++++++++++++++++ 2 files changed, 65 insertions(+), 70 deletions(-) create mode 100644 extensions/typescript-language-features/src/tsServer/serverError.ts diff --git a/extensions/typescript-language-features/src/tsServer/server.ts b/extensions/typescript-language-features/src/tsServer/server.ts index 125c541fe0f..881e35b6ece 100644 --- a/extensions/typescript-language-features/src/tsServer/server.ts +++ b/extensions/typescript-language-features/src/tsServer/server.ts @@ -18,82 +18,13 @@ import LogDirectoryProvider from '../utils/logDirectoryProvider'; import Logger from '../utils/logger'; import { TypeScriptPluginPathsProvider } from '../utils/pluginPathsProvider'; import { PluginManager } from '../utils/plugins'; -import { escapeRegExp } from '../utils/regexp'; import TelemetryReporter from '../utils/telemetry'; import Tracer from '../utils/tracer'; import { TypeScriptVersion, TypeScriptVersionProvider } from '../utils/versionProvider'; import { Reader } from '../utils/wireProtocol'; import { CallbackMap } from './callbackMap'; import { RequestItem, RequestQueue, RequestQueueingType } from './requestQueue'; - -class TypeScriptServerError extends Error { - - public static create( - version: TypeScriptVersion, - response: Proto.Response, - ): TypeScriptServerError { - const parsedResult = TypeScriptServerError.parseErrorText(version, response); - return new TypeScriptServerError(version, response, - parsedResult ? parsedResult.message : undefined, - parsedResult ? parsedResult.stack : undefined); - } - - constructor( - version: TypeScriptVersion, - private readonly response: Proto.Response, - public readonly serverMessage: string | undefined, - public readonly serverStack: string | undefined, - ) { - super(`TypeScript Server Error (${version.versionString})\n${serverMessage}\n${serverStack}`); - } - - public get serverErrorText() { - return this.response.message; - } - - public get serverCommand() { - return this.response.command; - } - - /** - * Given a `errorText` from a tsserver request indicating failure in handling a request, - * prepares a payload for telemetry-logging. - */ - private static parseErrorText( - version: TypeScriptVersion, - response: Proto.Response, - ) { - const errorText = response.message; - if (errorText) { - const errorPrefix = 'Error processing request. '; - if (errorText.startsWith(errorPrefix)) { - const prefixFreeErrorText = errorText.substr(errorPrefix.length); - const newlineIndex = prefixFreeErrorText.indexOf('\n'); - if (newlineIndex >= 0) { - // Newline expected between message and stack. - return { - message: prefixFreeErrorText.substring(0, newlineIndex), - stack: TypeScriptServerError.normalizeMessageStack(version, prefixFreeErrorText.substring(newlineIndex + 1)) - }; - } - } - } - return undefined; - } - - /** - * Try to replace full TS Server paths with 'tsserver.js' so that we don't have to post process the data as much - */ - private static normalizeMessageStack( - version: TypeScriptVersion, - message: string | undefined, - ) { - if (!message) { - return ''; - } - return message.replace(new RegExp(`${escapeRegExp(version.path)}[/\\\\]tsserver.js:`, 'gi'), 'tsserver.js:'); - } -} +import { TypeScriptServerError } from './serverError'; export class TypeScriptServerSpawner { public constructor( diff --git a/extensions/typescript-language-features/src/tsServer/serverError.ts b/extensions/typescript-language-features/src/tsServer/serverError.ts new file mode 100644 index 00000000000..062c82f1336 --- /dev/null +++ b/extensions/typescript-language-features/src/tsServer/serverError.ts @@ -0,0 +1,64 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as Proto from '../protocol'; +import { escapeRegExp } from '../utils/regexp'; +import { TypeScriptVersion } from '../utils/versionProvider'; + +export class TypeScriptServerError extends Error { + public static create( + version: TypeScriptVersion, + response: Proto.Response + ): TypeScriptServerError { + const parsedResult = TypeScriptServerError.parseErrorText(version, response); + return new TypeScriptServerError(version, response, parsedResult ? parsedResult.message : undefined, parsedResult ? parsedResult.stack : undefined); + } + + private constructor( + version: TypeScriptVersion, + private readonly response: Proto.Response, + public readonly serverMessage: string | undefined, + public readonly serverStack: string | undefined + ) { + super(`TypeScript Server Error (${version.versionString})\n${serverMessage}\n${serverStack}`); + } + + public get serverErrorText() { return this.response.message; } + + public get serverCommand() { return this.response.command; } + + /** + * Given a `errorText` from a tsserver request indicating failure in handling a request, + * prepares a payload for telemetry-logging. + */ + private static parseErrorText(version: TypeScriptVersion, response: Proto.Response) { + const errorText = response.message; + if (errorText) { + const errorPrefix = 'Error processing request. '; + if (errorText.startsWith(errorPrefix)) { + const prefixFreeErrorText = errorText.substr(errorPrefix.length); + const newlineIndex = prefixFreeErrorText.indexOf('\n'); + if (newlineIndex >= 0) { + // Newline expected between message and stack. + return { + message: prefixFreeErrorText.substring(0, newlineIndex), + stack: TypeScriptServerError.normalizeMessageStack(version, prefixFreeErrorText.substring(newlineIndex + 1)) + }; + } + } + } + return undefined; + } + + /** + * Try to replace full TS Server paths with 'tsserver.js' so that we don't have to post process the data as much + */ + private static normalizeMessageStack(version: TypeScriptVersion, message: string | undefined) { + if (!message) { + return ''; + } + return message.replace(new RegExp(`${escapeRegExp(version.path)}[/\\\\]tsserver.js:`, 'gi'), 'tsserver.js:'); + } +} From 4a053c9d6d797b6c92dd3329b01eac5e608ab186 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 20 Jun 2019 16:00:36 -0700 Subject: [PATCH 0494/1449] Extract server spanwer to own file --- .../src/tsServer/server.ts | 185 +---------------- .../src/tsServer/spanwer.ts | 195 ++++++++++++++++++ .../src/typescriptServiceClient.ts | 3 +- 3 files changed, 198 insertions(+), 185 deletions(-) create mode 100644 extensions/typescript-language-features/src/tsServer/spanwer.ts diff --git a/extensions/typescript-language-features/src/tsServer/server.ts b/extensions/typescript-language-features/src/tsServer/server.ts index 881e35b6ece..52534972f1b 100644 --- a/extensions/typescript-language-features/src/tsServer/server.ts +++ b/extensions/typescript-language-features/src/tsServer/server.ts @@ -3,180 +3,20 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as child_process from 'child_process'; import * as fs from 'fs'; -import * as path from 'path'; import * as stream from 'stream'; import * as vscode from 'vscode'; import * as Proto from '../protocol'; import { ServerResponse } from '../typescriptService'; -import API from '../utils/api'; -import { TsServerLogLevel, TypeScriptServiceConfiguration } from '../utils/configuration'; import { Disposable } from '../utils/dispose'; -import * as electron from '../utils/electron'; -import LogDirectoryProvider from '../utils/logDirectoryProvider'; -import Logger from '../utils/logger'; -import { TypeScriptPluginPathsProvider } from '../utils/pluginPathsProvider'; -import { PluginManager } from '../utils/plugins'; import TelemetryReporter from '../utils/telemetry'; import Tracer from '../utils/tracer'; -import { TypeScriptVersion, TypeScriptVersionProvider } from '../utils/versionProvider'; +import { TypeScriptVersion } from '../utils/versionProvider'; import { Reader } from '../utils/wireProtocol'; import { CallbackMap } from './callbackMap'; import { RequestItem, RequestQueue, RequestQueueingType } from './requestQueue'; import { TypeScriptServerError } from './serverError'; -export class TypeScriptServerSpawner { - public constructor( - private readonly _versionProvider: TypeScriptVersionProvider, - private readonly _logDirectoryProvider: LogDirectoryProvider, - private readonly _pluginPathsProvider: TypeScriptPluginPathsProvider, - private readonly _logger: Logger, - private readonly _telemetryReporter: TelemetryReporter, - private readonly _tracer: Tracer, - ) { } - - public spawn( - version: TypeScriptVersion, - configuration: TypeScriptServiceConfiguration, - pluginManager: PluginManager - ): ITypeScriptServer { - const apiVersion = version.version || API.defaultVersion; - - const { args, cancellationPipeName, tsServerLogFile } = this.getTsServerArgs(configuration, version, apiVersion, pluginManager); - - if (TypeScriptServerSpawner.isLoggingEnabled(apiVersion, configuration)) { - if (tsServerLogFile) { - this._logger.info(`TSServer log file: ${tsServerLogFile}`); - } else { - this._logger.error('Could not create TSServer log directory'); - } - } - - this._logger.info('Forking TSServer'); - const childProcess = electron.fork(version.tsServerPath, args, this.getForkOptions()); - this._logger.info('Started TSServer'); - - return new TypeScriptServer( - new ChildServerProcess(childProcess), - tsServerLogFile, - new PipeRequestCanceller(cancellationPipeName, this._tracer), - version, - this._telemetryReporter, - this._tracer); - } - - private getForkOptions() { - const debugPort = TypeScriptServerSpawner.getDebugPort(); - const tsServerForkOptions: electron.ForkOptions = { - execArgv: debugPort ? [`--inspect=${debugPort}`] : [], - }; - return tsServerForkOptions; - } - - private getTsServerArgs( - configuration: TypeScriptServiceConfiguration, - currentVersion: TypeScriptVersion, - apiVersion: API, - pluginManager: PluginManager, - ): { args: string[], cancellationPipeName: string | undefined, tsServerLogFile: string | undefined } { - const args: string[] = []; - let cancellationPipeName: string | undefined; - let tsServerLogFile: string | undefined; - - if (apiVersion.gte(API.v206)) { - if (apiVersion.gte(API.v250)) { - args.push('--useInferredProjectPerProjectRoot'); - } else { - args.push('--useSingleInferredProject'); - } - - if (configuration.disableAutomaticTypeAcquisition) { - args.push('--disableAutomaticTypingAcquisition'); - } - } - - if (apiVersion.gte(API.v208)) { - args.push('--enableTelemetry'); - } - - if (apiVersion.gte(API.v222)) { - cancellationPipeName = electron.getTempFile('tscancellation'); - args.push('--cancellationPipeName', cancellationPipeName + '*'); - } - - if (TypeScriptServerSpawner.isLoggingEnabled(apiVersion, configuration)) { - const logDir = this._logDirectoryProvider.getNewLogDirectory(); - if (logDir) { - tsServerLogFile = path.join(logDir, `tsserver.log`); - args.push('--logVerbosity', TsServerLogLevel.toString(configuration.tsServerLogLevel)); - args.push('--logFile', tsServerLogFile); - } - } - - if (apiVersion.gte(API.v230)) { - const pluginPaths = this._pluginPathsProvider.getPluginPaths(); - - if (pluginManager.plugins.length) { - args.push('--globalPlugins', pluginManager.plugins.map(x => x.name).join(',')); - - const isUsingBundledTypeScriptVersion = currentVersion.path === this._versionProvider.defaultVersion.path; - for (const plugin of pluginManager.plugins) { - if (isUsingBundledTypeScriptVersion || plugin.enableForWorkspaceTypeScriptVersions) { - pluginPaths.push(plugin.path); - } - } - } - - if (pluginPaths.length !== 0) { - args.push('--pluginProbeLocations', pluginPaths.join(',')); - } - } - - if (apiVersion.gte(API.v234)) { - if (configuration.npmLocation) { - args.push('--npmLocation', `"${configuration.npmLocation}"`); - } - } - - if (apiVersion.gte(API.v260)) { - args.push('--locale', TypeScriptServerSpawner.getTsLocale(configuration)); - } - - if (apiVersion.gte(API.v291)) { - args.push('--noGetErrOnBackgroundUpdate'); - } - - if (apiVersion.gte(API.v345)) { - args.push('--validateDefaultNpmLocation'); - } - - return { args, cancellationPipeName, tsServerLogFile }; - } - - private static getDebugPort(): number | undefined { - const value = process.env['TSS_DEBUG']; - if (value) { - const port = parseInt(value); - if (!isNaN(port)) { - return port; - } - } - return undefined; - } - - private static isLoggingEnabled(apiVersion: API, configuration: TypeScriptServiceConfiguration) { - return apiVersion.gte(API.v222) && - configuration.tsServerLogLevel !== TsServerLogLevel.Off; - } - - private static getTsLocale(configuration: TypeScriptServiceConfiguration): string { - return configuration.locale - ? configuration.locale - : vscode.env.language; - } -} - export interface OngoingRequestCanceller { tryCancelOngoingRequest(seq: number): boolean; } @@ -211,28 +51,6 @@ export interface ServerProcess { kill(): void; } -class ChildServerProcess implements ServerProcess { - - public constructor( - private readonly _process: child_process.ChildProcess, - ) { } - - get stdout(): stream.Readable { return this._process.stdout!; } - - write(serverRequest: Proto.Request): void { - this._process.stdin!.write(JSON.stringify(serverRequest) + '\r\n', 'utf8'); - } - - on(name: 'exit', handler: (code: number | null) => void): void; - on(name: 'error', handler: (error: Error) => void): void; - on(name: any, handler: any) { - this._process.on(name, handler); - } - - kill(): void { - this._process.kill(); - } -} export interface ITypeScriptServer { readonly onEvent: vscode.Event; @@ -476,4 +294,3 @@ function getQueueingType( } return lowPriority ? RequestQueueingType.LowPriority : RequestQueueingType.Normal; } - diff --git a/extensions/typescript-language-features/src/tsServer/spanwer.ts b/extensions/typescript-language-features/src/tsServer/spanwer.ts new file mode 100644 index 00000000000..be3cf5f4104 --- /dev/null +++ b/extensions/typescript-language-features/src/tsServer/spanwer.ts @@ -0,0 +1,195 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as child_process from 'child_process'; +import * as path from 'path'; +import * as stream from 'stream'; +import * as vscode from 'vscode'; +import * as Proto from '../protocol'; +import API from '../utils/api'; +import { TsServerLogLevel, TypeScriptServiceConfiguration } from '../utils/configuration'; +import * as electron from '../utils/electron'; +import LogDirectoryProvider from '../utils/logDirectoryProvider'; +import Logger from '../utils/logger'; +import { TypeScriptPluginPathsProvider } from '../utils/pluginPathsProvider'; +import { PluginManager } from '../utils/plugins'; +import TelemetryReporter from '../utils/telemetry'; +import Tracer from '../utils/tracer'; +import { TypeScriptVersion, TypeScriptVersionProvider } from '../utils/versionProvider'; +import { ITypeScriptServer, ServerProcess, TypeScriptServer, PipeRequestCanceller } from './server'; + +export class TypeScriptServerSpawner { + public constructor( + private readonly _versionProvider: TypeScriptVersionProvider, + private readonly _logDirectoryProvider: LogDirectoryProvider, + private readonly _pluginPathsProvider: TypeScriptPluginPathsProvider, + private readonly _logger: Logger, + private readonly _telemetryReporter: TelemetryReporter, + private readonly _tracer: Tracer, + ) { } + + public spawn( + version: TypeScriptVersion, + configuration: TypeScriptServiceConfiguration, + pluginManager: PluginManager + ): ITypeScriptServer { + const apiVersion = version.version || API.defaultVersion; + + const { args, cancellationPipeName, tsServerLogFile } = this.getTsServerArgs(configuration, version, apiVersion, pluginManager); + + if (TypeScriptServerSpawner.isLoggingEnabled(apiVersion, configuration)) { + if (tsServerLogFile) { + this._logger.info(`TSServer log file: ${tsServerLogFile}`); + } else { + this._logger.error('Could not create TSServer log directory'); + } + } + + this._logger.info('Forking TSServer'); + const childProcess = electron.fork(version.tsServerPath, args, this.getForkOptions()); + this._logger.info('Started TSServer'); + + return new TypeScriptServer( + new ChildServerProcess(childProcess), + tsServerLogFile, + new PipeRequestCanceller(cancellationPipeName, this._tracer), + version, + this._telemetryReporter, + this._tracer); + } + + private getForkOptions() { + const debugPort = TypeScriptServerSpawner.getDebugPort(); + const tsServerForkOptions: electron.ForkOptions = { + execArgv: debugPort ? [`--inspect=${debugPort}`] : [], + }; + return tsServerForkOptions; + } + + private getTsServerArgs( + configuration: TypeScriptServiceConfiguration, + currentVersion: TypeScriptVersion, + apiVersion: API, + pluginManager: PluginManager, + ): { args: string[], cancellationPipeName: string | undefined, tsServerLogFile: string | undefined } { + const args: string[] = []; + let cancellationPipeName: string | undefined; + let tsServerLogFile: string | undefined; + + if (apiVersion.gte(API.v206)) { + if (apiVersion.gte(API.v250)) { + args.push('--useInferredProjectPerProjectRoot'); + } else { + args.push('--useSingleInferredProject'); + } + + if (configuration.disableAutomaticTypeAcquisition) { + args.push('--disableAutomaticTypingAcquisition'); + } + } + + if (apiVersion.gte(API.v208)) { + args.push('--enableTelemetry'); + } + + if (apiVersion.gte(API.v222)) { + cancellationPipeName = electron.getTempFile('tscancellation'); + args.push('--cancellationPipeName', cancellationPipeName + '*'); + } + + if (TypeScriptServerSpawner.isLoggingEnabled(apiVersion, configuration)) { + const logDir = this._logDirectoryProvider.getNewLogDirectory(); + if (logDir) { + tsServerLogFile = path.join(logDir, `tsserver.log`); + args.push('--logVerbosity', TsServerLogLevel.toString(configuration.tsServerLogLevel)); + args.push('--logFile', tsServerLogFile); + } + } + + if (apiVersion.gte(API.v230)) { + const pluginPaths = this._pluginPathsProvider.getPluginPaths(); + + if (pluginManager.plugins.length) { + args.push('--globalPlugins', pluginManager.plugins.map(x => x.name).join(',')); + + const isUsingBundledTypeScriptVersion = currentVersion.path === this._versionProvider.defaultVersion.path; + for (const plugin of pluginManager.plugins) { + if (isUsingBundledTypeScriptVersion || plugin.enableForWorkspaceTypeScriptVersions) { + pluginPaths.push(plugin.path); + } + } + } + + if (pluginPaths.length !== 0) { + args.push('--pluginProbeLocations', pluginPaths.join(',')); + } + } + + if (apiVersion.gte(API.v234)) { + if (configuration.npmLocation) { + args.push('--npmLocation', `"${configuration.npmLocation}"`); + } + } + + if (apiVersion.gte(API.v260)) { + args.push('--locale', TypeScriptServerSpawner.getTsLocale(configuration)); + } + + if (apiVersion.gte(API.v291)) { + args.push('--noGetErrOnBackgroundUpdate'); + } + + if (apiVersion.gte(API.v345)) { + args.push('--validateDefaultNpmLocation'); + } + + return { args, cancellationPipeName, tsServerLogFile }; + } + + private static getDebugPort(): number | undefined { + const value = process.env['TSS_DEBUG']; + if (value) { + const port = parseInt(value); + if (!isNaN(port)) { + return port; + } + } + return undefined; + } + + private static isLoggingEnabled(apiVersion: API, configuration: TypeScriptServiceConfiguration) { + return apiVersion.gte(API.v222) && + configuration.tsServerLogLevel !== TsServerLogLevel.Off; + } + + private static getTsLocale(configuration: TypeScriptServiceConfiguration): string { + return configuration.locale + ? configuration.locale + : vscode.env.language; + } +} + +class ChildServerProcess implements ServerProcess { + + public constructor( + private readonly _process: child_process.ChildProcess, + ) { } + + get stdout(): stream.Readable { return this._process.stdout!; } + + write(serverRequest: Proto.Request): void { + this._process.stdin!.write(JSON.stringify(serverRequest) + '\r\n', 'utf8'); + } + + on(name: 'exit', handler: (code: number | null) => void): void; + on(name: 'error', handler: (error: Error) => void): void; + on(name: any, handler: any) { + this._process.on(name, handler); + } + + kill(): void { + this._process.kill(); + } +} \ No newline at end of file diff --git a/extensions/typescript-language-features/src/typescriptServiceClient.ts b/extensions/typescript-language-features/src/typescriptServiceClient.ts index 2849cfcd012..bccddbf16f9 100644 --- a/extensions/typescript-language-features/src/typescriptServiceClient.ts +++ b/extensions/typescript-language-features/src/typescriptServiceClient.ts @@ -10,7 +10,7 @@ import * as nls from 'vscode-nls'; import BufferSyncSupport from './features/bufferSyncSupport'; import { DiagnosticKind, DiagnosticsManager } from './features/diagnostics'; import * as Proto from './protocol'; -import { ITypeScriptServer, TypeScriptServerSpawner } from './tsServer/server'; +import { ITypeScriptServer } from './tsServer/server'; import { ITypeScriptServiceClient, ServerResponse } from './typescriptService'; import API from './utils/api'; import { TsServerLogLevel, TypeScriptServiceConfiguration } from './utils/configuration'; @@ -25,6 +25,7 @@ import Tracer from './utils/tracer'; import { inferredProjectConfig } from './utils/tsconfig'; import { TypeScriptVersionPicker } from './utils/versionPicker'; import { TypeScriptVersion, TypeScriptVersionProvider } from './utils/versionProvider'; +import { TypeScriptServerSpawner } from './tsServer/spanwer'; const localize = nls.loadMessageBundle(); From 45ea4703c2e395165694c73d91b13cbbc6ccb9f1 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 20 Jun 2019 16:02:46 -0700 Subject: [PATCH 0495/1449] Renames --- .../src/test/server.test.ts | 6 ++--- .../src/tsServer/server.ts | 25 +++++++++---------- .../src/tsServer/spanwer.ts | 6 ++--- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/extensions/typescript-language-features/src/test/server.test.ts b/extensions/typescript-language-features/src/test/server.test.ts index bd22203d8d3..00a4ff6a254 100644 --- a/extensions/typescript-language-features/src/test/server.test.ts +++ b/extensions/typescript-language-features/src/test/server.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import 'mocha'; import * as stream from 'stream'; -import { PipeRequestCanceller, ServerProcess, TypeScriptServer } from '../tsServer/server'; +import { PipeRequestCanceller, TsServerProcess, ProcessBasedTsServer } from '../tsServer/server'; import { nulToken } from '../utils/cancellation'; import Logger from '../utils/logger'; import TelemetryReporter from '../utils/telemetry'; @@ -19,7 +19,7 @@ const NoopTelemetryReporter = new class implements TelemetryReporter { dispose(): void { /* noop */ } }; -class FakeServerProcess implements ServerProcess { +class FakeServerProcess implements TsServerProcess { private readonly _out: stream.PassThrough; private readonly writeListeners = new Set<(data: Buffer) => void>(); @@ -62,7 +62,7 @@ suite('Server', () => { test('should send requests with increasing sequence numbers', async () => { const process = new FakeServerProcess(); - const server = new TypeScriptServer(process, undefined, new PipeRequestCanceller(undefined, tracer), undefined!, NoopTelemetryReporter, tracer); + const server = new ProcessBasedTsServer(process, undefined, new PipeRequestCanceller(undefined, tracer), undefined!, NoopTelemetryReporter, tracer); const onWrite1 = process.onWrite(); server.executeImpl('geterr', {}, { isAsync: false, token: nulToken, expectsResult: true }); diff --git a/extensions/typescript-language-features/src/tsServer/server.ts b/extensions/typescript-language-features/src/tsServer/server.ts index 52534972f1b..95cf37e3e5a 100644 --- a/extensions/typescript-language-features/src/tsServer/server.ts +++ b/extensions/typescript-language-features/src/tsServer/server.ts @@ -41,17 +41,6 @@ export class PipeRequestCanceller implements OngoingRequestCanceller { } } -export interface ServerProcess { - readonly stdout: stream.Readable; - write(serverRequest: Proto.Request): void; - - on(name: 'exit', handler: (code: number | null) => void): void; - on(name: 'error', handler: (error: Error) => void): void; - - kill(): void; -} - - export interface ITypeScriptServer { readonly onEvent: vscode.Event; readonly onExit: vscode.Event; @@ -69,14 +58,24 @@ export interface ITypeScriptServer { dispose(): void; } -export class TypeScriptServer extends Disposable implements ITypeScriptServer { +export interface TsServerProcess { + readonly stdout: stream.Readable; + write(serverRequest: Proto.Request): void; + + on(name: 'exit', handler: (code: number | null) => void): void; + on(name: 'error', handler: (error: Error) => void): void; + + kill(): void; +} + +export class ProcessBasedTsServer extends Disposable implements ITypeScriptServer { private readonly _reader: Reader; private readonly _requestQueue = new RequestQueue(); private readonly _callbacks = new CallbackMap(); private readonly _pendingResponses = new Set(); constructor( - private readonly _process: ServerProcess, + private readonly _process: TsServerProcess, private readonly _tsServerLogFile: string | undefined, private readonly _requestCanceller: OngoingRequestCanceller, private readonly _version: TypeScriptVersion, diff --git a/extensions/typescript-language-features/src/tsServer/spanwer.ts b/extensions/typescript-language-features/src/tsServer/spanwer.ts index be3cf5f4104..7f6589c5635 100644 --- a/extensions/typescript-language-features/src/tsServer/spanwer.ts +++ b/extensions/typescript-language-features/src/tsServer/spanwer.ts @@ -18,7 +18,7 @@ import { PluginManager } from '../utils/plugins'; import TelemetryReporter from '../utils/telemetry'; import Tracer from '../utils/tracer'; import { TypeScriptVersion, TypeScriptVersionProvider } from '../utils/versionProvider'; -import { ITypeScriptServer, ServerProcess, TypeScriptServer, PipeRequestCanceller } from './server'; +import { ITypeScriptServer, TsServerProcess, ProcessBasedTsServer, PipeRequestCanceller } from './server'; export class TypeScriptServerSpawner { public constructor( @@ -51,7 +51,7 @@ export class TypeScriptServerSpawner { const childProcess = electron.fork(version.tsServerPath, args, this.getForkOptions()); this._logger.info('Started TSServer'); - return new TypeScriptServer( + return new ProcessBasedTsServer( new ChildServerProcess(childProcess), tsServerLogFile, new PipeRequestCanceller(cancellationPipeName, this._tracer), @@ -171,7 +171,7 @@ export class TypeScriptServerSpawner { } } -class ChildServerProcess implements ServerProcess { +class ChildServerProcess implements TsServerProcess { public constructor( private readonly _process: child_process.ChildProcess, From 8ec2559029b67f0bca38d6d894277f4e92cb690a Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 20 Jun 2019 16:04:03 -0700 Subject: [PATCH 0496/1449] Move getQueueingType into class --- .../src/tsServer/server.ts | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/extensions/typescript-language-features/src/tsServer/server.ts b/extensions/typescript-language-features/src/tsServer/server.ts index 95cf37e3e5a..906da1aa09a 100644 --- a/extensions/typescript-language-features/src/tsServer/server.ts +++ b/extensions/typescript-language-features/src/tsServer/server.ts @@ -199,7 +199,7 @@ export class ProcessBasedTsServer extends Disposable implements ITypeScriptServe request, expectsResponse: executeInfo.expectsResult, isAsync: executeInfo.isAsync, - queueingType: getQueueingType(command, executeInfo.lowPriority) + queueingType: ProcessBasedTsServer.getQueueingType(command, executeInfo.lowPriority) }; let result: Promise> | undefined; if (executeInfo.expectsResult) { @@ -280,16 +280,17 @@ export class ProcessBasedTsServer extends Disposable implements ITypeScriptServe this._pendingResponses.delete(seq); return callback; } -} -const fenceCommands = new Set(['change', 'close', 'open', 'updateOpen']); + private static readonly fenceCommands = new Set(['change', 'close', 'open', 'updateOpen']); -function getQueueingType( - command: string, - lowPriority?: boolean -): RequestQueueingType { - if (fenceCommands.has(command)) { - return RequestQueueingType.Fence; + private static getQueueingType( + command: string, + lowPriority?: boolean + ): RequestQueueingType { + if (ProcessBasedTsServer.fenceCommands.has(command)) { + return RequestQueueingType.Fence; + } + return lowPriority ? RequestQueueingType.LowPriority : RequestQueueingType.Normal; } - return lowPriority ? RequestQueueingType.LowPriority : RequestQueueingType.Normal; } + From 87b8402b5940e92cfcd5b5bc34b6524984f8a89c Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 20 Jun 2019 17:04:04 -0700 Subject: [PATCH 0497/1449] Add experimental dual TS server Fixes #75866 --- .../typescript-language-features/package.json | 6 ++ .../package.nls.json | 1 + .../src/test/server.test.ts | 2 +- .../src/tsServer/server.ts | 84 +++++++++++++++---- .../src/tsServer/spanwer.ts | 39 +++++++-- .../src/typescriptService.ts | 34 +++++--- .../src/typescriptServiceClient.ts | 15 ++-- .../src/utils/tracer.ts | 20 ++--- 8 files changed, 151 insertions(+), 50 deletions(-) diff --git a/extensions/typescript-language-features/package.json b/extensions/typescript-language-features/package.json index 86f996d0649..00c0445e730 100644 --- a/extensions/typescript-language-features/package.json +++ b/extensions/typescript-language-features/package.json @@ -591,6 +591,12 @@ "default": true, "description": "%configuration.surveys.enabled%", "scope": "window" + }, + "typescript.experimental.useSeparateSyntaxServer": { + "type": "boolean", + "default": false, + "description": "%configuration.experimental.useSeparateSyntaxServer%", + "scope": "window" } } }, diff --git a/extensions/typescript-language-features/package.nls.json b/extensions/typescript-language-features/package.nls.json index 7e31edca479..569685dec0d 100644 --- a/extensions/typescript-language-features/package.nls.json +++ b/extensions/typescript-language-features/package.nls.json @@ -49,6 +49,7 @@ "typescript.problemMatchers.tsc.label": "TypeScript problems", "typescript.problemMatchers.tscWatch.label": "TypeScript problems (watch mode)", "configuration.suggest.paths": "Enable/disable suggestions for paths in import statements and require calls.", + "configuration.experimental.useSeparateSyntaxServer": "Enable/disable spawning a separate TypeScript server that can more quickly respond to syntax related operations, such as calculating folding or computing document symbols. Note that you must restart the TypeScript server after changing this setting. Requires using TypeScript 3.4.0 or newer in the workspace.", "typescript.locale": "Sets the locale used to report JavaScript and TypeScript errors. Requires using TypeScript 2.6.0 or newer in the workspace. Default of `null` uses VS Code's locale.", "javascript.implicitProjectConfig.experimentalDecorators": "Enable/disable `experimentalDecorators` for JavaScript files that are not part of a project. Existing jsconfig.json or tsconfig.json files override this setting. Requires using TypeScript 2.3.1 or newer in the workspace.", "configuration.suggest.autoImports": "Enable/disable auto import suggestions. Requires using TypeScript 2.6.1 or newer in the workspace.", diff --git a/extensions/typescript-language-features/src/test/server.test.ts b/extensions/typescript-language-features/src/test/server.test.ts index 00a4ff6a254..651967fc12c 100644 --- a/extensions/typescript-language-features/src/test/server.test.ts +++ b/extensions/typescript-language-features/src/test/server.test.ts @@ -62,7 +62,7 @@ suite('Server', () => { test('should send requests with increasing sequence numbers', async () => { const process = new FakeServerProcess(); - const server = new ProcessBasedTsServer(process, undefined, new PipeRequestCanceller(undefined, tracer), undefined!, NoopTelemetryReporter, tracer); + const server = new ProcessBasedTsServer('semantic', process, undefined, new PipeRequestCanceller('semantic', undefined, tracer), undefined!, NoopTelemetryReporter, tracer); const onWrite1 = process.onWrite(); server.executeImpl('geterr', {}, { isAsync: false, token: nulToken, expectsResult: true }); diff --git a/extensions/typescript-language-features/src/tsServer/server.ts b/extensions/typescript-language-features/src/tsServer/server.ts index 906da1aa09a..9a2132fa27e 100644 --- a/extensions/typescript-language-features/src/tsServer/server.ts +++ b/extensions/typescript-language-features/src/tsServer/server.ts @@ -7,7 +7,7 @@ import * as fs from 'fs'; import * as stream from 'stream'; import * as vscode from 'vscode'; import * as Proto from '../protocol'; -import { ServerResponse } from '../typescriptService'; +import { ServerResponse, TypeScriptRequests } from '../typescriptService'; import { Disposable } from '../utils/dispose'; import TelemetryReporter from '../utils/telemetry'; import Tracer from '../utils/tracer'; @@ -23,6 +23,7 @@ export interface OngoingRequestCanceller { export class PipeRequestCanceller implements OngoingRequestCanceller { public constructor( + private readonly _serverId: string, private readonly _cancellationPipeName: string | undefined, private readonly _tracer: Tracer, ) { } @@ -31,7 +32,7 @@ export class PipeRequestCanceller implements OngoingRequestCanceller { if (!this._cancellationPipeName) { return false; } - this._tracer.logTrace(`TypeScript Server: trying to cancel ongoing request with sequence number ${seq}`); + this._tracer.logTrace(this._serverId, `TypeScript Server: trying to cancel ongoing request with sequence number ${seq}`); try { fs.writeFileSync(this._cancellationPipeName + seq, ''); } catch { @@ -51,9 +52,9 @@ export interface ITypeScriptServer { kill(): void; - executeImpl(command: string, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: false, lowPriority?: boolean }): undefined; - executeImpl(command: string, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: boolean, lowPriority?: boolean }): Promise>; - executeImpl(command: string, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: boolean, lowPriority?: boolean }): Promise> | undefined; + executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: false, lowPriority?: boolean }): undefined; + executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: boolean, lowPriority?: boolean }): Promise>; + executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: boolean, lowPriority?: boolean }): Promise> | undefined; dispose(): void; } @@ -75,6 +76,7 @@ export class ProcessBasedTsServer extends Disposable implements ITypeScriptServe private readonly _pendingResponses = new Set(); constructor( + private readonly _serverId: string, private readonly _process: TsServerProcess, private readonly _tsServerLogFile: string | undefined, private readonly _requestCanceller: OngoingRequestCanceller, @@ -136,11 +138,11 @@ export class ProcessBasedTsServer extends Disposable implements ITypeScriptServe const seq = (event as Proto.RequestCompletedEvent).body.request_seq; const p = this._callbacks.fetch(seq); if (p) { - this._tracer.traceRequestCompleted('requestCompleted', seq, p.startTime); + this._tracer.traceRequestCompleted(this._serverId, 'requestCompleted', seq, p.startTime); p.onSuccess(undefined); } } else { - this._tracer.traceEvent(event); + this._tracer.traceEvent(this._serverId, event); this._onEvent.fire(event); } break; @@ -156,7 +158,7 @@ export class ProcessBasedTsServer extends Disposable implements ITypeScriptServe private tryCancelRequest(seq: number, command: string): boolean { try { if (this._requestQueue.tryDeletePendingRequest(seq)) { - this._tracer.logTrace(`TypeScript Server: canceled request with sequence number ${seq}`); + this.logTrace(`Canceled request with sequence number ${seq}`); return true; } @@ -164,7 +166,7 @@ export class ProcessBasedTsServer extends Disposable implements ITypeScriptServe return true; } - this._tracer.logTrace(`TypeScript Server: tried to cancel request with sequence number ${seq}. But request got already delivered.`); + this.logTrace(`Tried to cancel request with sequence number ${seq}. But request got already delivered.`); return false; } finally { const callback = this.fetchCallback(seq); @@ -180,7 +182,7 @@ export class ProcessBasedTsServer extends Disposable implements ITypeScriptServe return; } - this._tracer.traceResponse(response, callback.startTime); + this._tracer.traceResponse(this._serverId, response, callback.startTime); if (response.success) { callback.onSuccess(response); } else if (response.message === 'No content available.') { @@ -191,9 +193,9 @@ export class ProcessBasedTsServer extends Disposable implements ITypeScriptServe } } - public executeImpl(command: string, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: false, lowPriority?: boolean }): undefined; - public executeImpl(command: string, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: boolean, lowPriority?: boolean }): Promise>; - public executeImpl(command: string, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: boolean, lowPriority?: boolean }): Promise> | undefined { + public executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: false, lowPriority?: boolean }): undefined; + public executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: boolean, lowPriority?: boolean }): Promise>; + public executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: boolean, lowPriority?: boolean }): Promise> | undefined { const request = this._requestQueue.createRequest(command, args); const requestInfo: RequestItem = { request, @@ -255,7 +257,7 @@ export class ProcessBasedTsServer extends Disposable implements ITypeScriptServe private sendRequest(requestItem: RequestItem): void { const serverRequest = requestItem.request; - this._tracer.traceRequest(serverRequest, requestItem.expectsResponse, this._requestQueue.length); + this._tracer.traceRequest(this._serverId, serverRequest, requestItem.expectsResponse, this._requestQueue.length); if (requestItem.expectsResponse && !requestItem.isAsync) { this._pendingResponses.add(requestItem.request.seq); @@ -281,6 +283,10 @@ export class ProcessBasedTsServer extends Disposable implements ITypeScriptServe return callback; } + private logTrace(message: string) { + this._tracer.logTrace(this._serverId, message); + } + private static readonly fenceCommands = new Set(['change', 'close', 'open', 'updateOpen']); private static getQueueingType( @@ -294,3 +300,53 @@ export class ProcessBasedTsServer extends Disposable implements ITypeScriptServe } } + +export class SyntaxRoutingTsServer extends Disposable implements ITypeScriptServer { + public constructor( + private readonly syntaxServer: ITypeScriptServer, + private readonly semanticServer: ITypeScriptServer, + ) { + super(); + + this._register(syntaxServer.onEvent(e => this._onEvent.fire(e))); + this._register(semanticServer.onEvent(e => this._onEvent.fire(e))); + + this._register(semanticServer.onExit(e => this._onExit.fire(e))); + this._register(semanticServer.onError(e => this._onError.fire(e))); + } + + private readonly _onEvent = this._register(new vscode.EventEmitter()); + public readonly onEvent = this._onEvent.event; + + private readonly _onExit = this._register(new vscode.EventEmitter()); + public readonly onExit = this._onExit.event; + + private readonly _onError = this._register(new vscode.EventEmitter()); + public readonly onError = this._onError.event; + + public get onReaderError() { return this.semanticServer.onReaderError; } + + public get tsServerLogFile() { return this.semanticServer.tsServerLogFile; } + + public kill(): void { + this.syntaxServer.kill(); + this.semanticServer.kill(); + } + + private static readonly syntaxCommands = new Set(['navtree', 'getOutliningSpans', 'jsxClosingTag', 'selectionRange']); + private static readonly sharedCommands = new Set(['change', 'close', 'open', 'updateOpen', 'configure', 'configurePlugin']); + + public executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: false, lowPriority?: boolean }): undefined; + public executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: boolean, lowPriority?: boolean }): Promise>; + public executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: boolean, lowPriority?: boolean }): Promise> | undefined { + + if (SyntaxRoutingTsServer.syntaxCommands.has(command)) { + return this.syntaxServer.executeImpl(command, args, executeInfo); + } else if (SyntaxRoutingTsServer.sharedCommands.has(command)) { + this.syntaxServer.executeImpl(command, args, executeInfo); + return this.semanticServer.executeImpl(command, args, executeInfo); + } else { + return this.semanticServer.executeImpl(command, args, executeInfo); + } + } +} diff --git a/extensions/typescript-language-features/src/tsServer/spanwer.ts b/extensions/typescript-language-features/src/tsServer/spanwer.ts index 7f6589c5635..1c78d71c87e 100644 --- a/extensions/typescript-language-features/src/tsServer/spanwer.ts +++ b/extensions/typescript-language-features/src/tsServer/spanwer.ts @@ -18,7 +18,7 @@ import { PluginManager } from '../utils/plugins'; import TelemetryReporter from '../utils/telemetry'; import Tracer from '../utils/tracer'; import { TypeScriptVersion, TypeScriptVersionProvider } from '../utils/versionProvider'; -import { ITypeScriptServer, TsServerProcess, ProcessBasedTsServer, PipeRequestCanceller } from './server'; +import { ITypeScriptServer, PipeRequestCanceller, ProcessBasedTsServer, SyntaxRoutingTsServer, TsServerProcess } from './server'; export class TypeScriptServerSpawner { public constructor( @@ -34,6 +34,30 @@ export class TypeScriptServerSpawner { version: TypeScriptVersion, configuration: TypeScriptServiceConfiguration, pluginManager: PluginManager + ): ITypeScriptServer { + if (this.shouldUserSeparateSyntaxServer(version)) { + const syntaxServer = this.spawnProcessBasedTsServer('syntax', version, configuration, pluginManager, ['--syntaxOnly', '--disableAutomaticTypingAcquisition']); + const semanticServer = this.spawnProcessBasedTsServer('semantic', version, configuration, pluginManager, []); + return new SyntaxRoutingTsServer(syntaxServer, semanticServer); + } + + return this.spawnProcessBasedTsServer('main', version, configuration, pluginManager, []); + } + + private shouldUserSeparateSyntaxServer(version: TypeScriptVersion): boolean { + if (!version.version || version.version.lt(API.v340)) { + return false; + } + return vscode.workspace.getConfiguration('typescript') + .get('experimental.useSeparateSyntaxServer', false); + } + + private spawnProcessBasedTsServer( + serverId: string, + version: TypeScriptVersion, + configuration: TypeScriptServiceConfiguration, + pluginManager: PluginManager, + extraForkArgs: readonly string[], ): ITypeScriptServer { const apiVersion = version.version || API.defaultVersion; @@ -41,20 +65,21 @@ export class TypeScriptServerSpawner { if (TypeScriptServerSpawner.isLoggingEnabled(apiVersion, configuration)) { if (tsServerLogFile) { - this._logger.info(`TSServer log file: ${tsServerLogFile}`); + this._logger.info(`<${serverId}> Log file: ${tsServerLogFile}`); } else { - this._logger.error('Could not create TSServer log directory'); + this._logger.error(`<${serverId}> Could not create log directory`); } } - this._logger.info('Forking TSServer'); - const childProcess = electron.fork(version.tsServerPath, args, this.getForkOptions()); - this._logger.info('Started TSServer'); + this._logger.info(`<${serverId}> Forking...`); + const childProcess = electron.fork(version.tsServerPath, [...args, ...extraForkArgs], this.getForkOptions()); + this._logger.info(`<${serverId}> Starting...`); return new ProcessBasedTsServer( + serverId, new ChildServerProcess(childProcess), tsServerLogFile, - new PipeRequestCanceller(cancellationPipeName, this._tracer), + new PipeRequestCanceller(serverId, cancellationPipeName, this._tracer), version, this._telemetryReporter, this._tracer); diff --git a/extensions/typescript-language-features/src/typescriptService.ts b/extensions/typescript-language-features/src/typescriptService.ts index 1156b79d268..537cb2a0e2e 100644 --- a/extensions/typescript-language-features/src/typescriptService.ts +++ b/extensions/typescript-language-features/src/typescriptService.ts @@ -26,7 +26,7 @@ export namespace ServerResponse { export type Response = T | Cancelled | typeof NoContent; } -export interface TypeScriptRequestTypes { +interface StandardTsServerRequests { 'applyCodeActionCommand': [Proto.ApplyCodeActionCommandRequestArgs, Proto.ApplyCodeActionCommandResponse]; 'completionEntryDetails': [Proto.CompletionDetailsRequestArgs, Proto.CompletionDetailsResponse]; 'completionInfo': [Proto.CompletionsRequestArgs, Proto.CompletionInfoResponse]; @@ -59,6 +59,22 @@ export interface TypeScriptRequestTypes { 'typeDefinition': [Proto.FileLocationRequestArgs, Proto.TypeDefinitionResponse]; } +interface NoResponseTsServerRequests { + 'open': [Proto.OpenRequestArgs, null]; + 'close': [Proto.FileRequestArgs]; + 'change': [Proto.ChangeRequestArgs, null]; + 'updateOpen': [Proto.UpdateOpenRequestArgs, null]; + 'compilerOptionsForInferredProjects': [Proto.SetCompilerOptionsForInferredProjectsArgs, null]; + 'reloadProjects': [null, null]; + 'configurePlugin': [Proto.ConfigurePluginRequest, Proto.ConfigurePluginResponse]; +} + +interface AsyncTsServerRequests { + 'geterr': [Proto.GeterrRequestArgs, Proto.Response]; +} + +export type TypeScriptRequests = StandardTsServerRequests & NoResponseTsServerRequests & AsyncTsServerRequests; + export interface ITypeScriptServiceClient { /** * Convert a resource (VS Code) to a normalized path (TypeScript). @@ -100,19 +116,17 @@ export interface ITypeScriptServiceClient { readonly logger: Logger; readonly bufferSyncSupport: BufferSyncSupport; - execute( + execute( command: K, - args: TypeScriptRequestTypes[K][0], + args: StandardTsServerRequests[K][0], token: vscode.CancellationToken, lowPriority?: boolean - ): Promise>; + ): Promise>; - executeWithoutWaitingForResponse(command: 'open', args: Proto.OpenRequestArgs): void; - executeWithoutWaitingForResponse(command: 'close', args: Proto.FileRequestArgs): void; - executeWithoutWaitingForResponse(command: 'change', args: Proto.ChangeRequestArgs): void; - executeWithoutWaitingForResponse(command: 'updateOpen', args: Proto.UpdateOpenRequestArgs): void; - executeWithoutWaitingForResponse(command: 'compilerOptionsForInferredProjects', args: Proto.SetCompilerOptionsForInferredProjectsArgs): void; - executeWithoutWaitingForResponse(command: 'reloadProjects', args: null): void; + executeWithoutWaitingForResponse( + command: K, + args: NoResponseTsServerRequests[K][0] + ): void; executeAsync(command: 'geterr', args: Proto.GeterrRequestArgs, token: vscode.CancellationToken): Promise>; diff --git a/extensions/typescript-language-features/src/typescriptServiceClient.ts b/extensions/typescript-language-features/src/typescriptServiceClient.ts index bccddbf16f9..07de35b4ba3 100644 --- a/extensions/typescript-language-features/src/typescriptServiceClient.ts +++ b/extensions/typescript-language-features/src/typescriptServiceClient.ts @@ -11,7 +11,7 @@ import BufferSyncSupport from './features/bufferSyncSupport'; import { DiagnosticKind, DiagnosticsManager } from './features/diagnostics'; import * as Proto from './protocol'; import { ITypeScriptServer } from './tsServer/server'; -import { ITypeScriptServiceClient, ServerResponse } from './typescriptService'; +import { ITypeScriptServiceClient, ServerResponse, TypeScriptRequests } from './typescriptService'; import API from './utils/api'; import { TsServerLogLevel, TypeScriptServiceConfiguration } from './utils/configuration'; import { Disposable } from './utils/dispose'; @@ -607,7 +607,7 @@ export default class TypeScriptServiceClient extends Disposable implements IType return undefined; } - public execute(command: string, args: any, token: vscode.CancellationToken, lowPriority?: boolean): Promise> { + public execute(command: keyof TypeScriptRequests, args: any, token: vscode.CancellationToken, lowPriority?: boolean): Promise> { return this.executeImpl(command, args, { isAsync: false, token, @@ -616,7 +616,7 @@ export default class TypeScriptServiceClient extends Disposable implements IType }); } - public executeWithoutWaitingForResponse(command: string, args: any): void { + public executeWithoutWaitingForResponse(command: keyof TypeScriptRequests, args: any): void { this.executeImpl(command, args, { isAsync: false, token: undefined, @@ -624,7 +624,7 @@ export default class TypeScriptServiceClient extends Disposable implements IType }); } - public executeAsync(command: string, args: Proto.GeterrRequestArgs, token: vscode.CancellationToken): Promise> { + public executeAsync(command: keyof TypeScriptRequests, args: Proto.GeterrRequestArgs, token: vscode.CancellationToken): Promise> { return this.executeImpl(command, args, { isAsync: true, token, @@ -632,9 +632,9 @@ export default class TypeScriptServiceClient extends Disposable implements IType }); } - private executeImpl(command: string, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: false, lowPriority?: boolean }): undefined; - private executeImpl(command: string, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: boolean, lowPriority?: boolean }): Promise>; - private executeImpl(command: string, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: boolean, lowPriority?: boolean }): Promise> | undefined { + private executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: false, lowPriority?: boolean }): undefined; + private executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: boolean, lowPriority?: boolean }): Promise>; + private executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: boolean, lowPriority?: boolean }): Promise> | undefined { this.bufferSyncSupport.beforeCommand(command); const runningServerState = this.service(); return runningServerState.server.executeImpl(command, args, executeInfo); @@ -769,7 +769,6 @@ export default class TypeScriptServiceClient extends Disposable implements IType this.logTelemetry(telemetryData.telemetryEventName, properties); } - private configurePlugin(pluginName: string, configuration: {}): any { if (this.apiVersion.gte(API.v314)) { this.executeWithoutWaitingForResponse('configurePlugin', { pluginName, configuration }); diff --git a/extensions/typescript-language-features/src/utils/tracer.ts b/extensions/typescript-language-features/src/utils/tracer.ts index c80254c79a0..f7ca0d674e3 100644 --- a/extensions/typescript-language-features/src/utils/tracer.ts +++ b/extensions/typescript-language-features/src/utils/tracer.ts @@ -50,7 +50,7 @@ export default class Tracer { return result; } - public traceRequest(request: Proto.Request, responseExpected: boolean, queueLength: number): void { + public traceRequest(serverId: string, request: Proto.Request, responseExpected: boolean, queueLength: number): void { if (this.trace === Trace.Off) { return; } @@ -58,10 +58,10 @@ export default class Tracer { if (this.trace === Trace.Verbose && request.arguments) { data = `Arguments: ${JSON.stringify(request.arguments, null, 4)}`; } - this.logTrace(`Sending request: ${request.command} (${request.seq}). Response expected: ${responseExpected ? 'yes' : 'no'}. Current queue length: ${queueLength}`, data); + this.logTrace(serverId, `Sending request: ${request.command} (${request.seq}). Response expected: ${responseExpected ? 'yes' : 'no'}. Current queue length: ${queueLength}`, data); } - public traceResponse(response: Proto.Response, startTime: number): void { + public traceResponse(serverId: string, response: Proto.Response, startTime: number): void { if (this.trace === Trace.Off) { return; } @@ -69,17 +69,17 @@ export default class Tracer { if (this.trace === Trace.Verbose && response.body) { data = `Result: ${JSON.stringify(response.body, null, 4)}`; } - this.logTrace(`Response received: ${response.command} (${response.request_seq}). Request took ${Date.now() - startTime} ms. Success: ${response.success} ${!response.success ? '. Message: ' + response.message : ''}`, data); + this.logTrace(serverId, `Response received: ${response.command} (${response.request_seq}). Request took ${Date.now() - startTime} ms. Success: ${response.success} ${!response.success ? '. Message: ' + response.message : ''}`, data); } - public traceRequestCompleted(command: string, request_seq: number, startTime: number): any { + public traceRequestCompleted(serverId: string, command: string, request_seq: number, startTime: number): any { if (this.trace === Trace.Off) { return; } - this.logTrace(`Async response received: ${command} (${request_seq}). Request took ${Date.now() - startTime} ms.`); + this.logTrace(serverId, `Async response received: ${command} (${request_seq}). Request took ${Date.now() - startTime} ms.`); } - public traceEvent(event: Proto.Event): void { + public traceEvent(serverId: string, event: Proto.Event): void { if (this.trace === Trace.Off) { return; } @@ -87,12 +87,12 @@ export default class Tracer { if (this.trace === Trace.Verbose && event.body) { data = `Data: ${JSON.stringify(event.body, null, 4)}`; } - this.logTrace(`Event received: ${event.event} (${event.seq}).`, data); + this.logTrace(serverId, `Event received: ${event.event} (${event.seq}).`, data); } - public logTrace(message: string, data?: any): void { + public logTrace(serverId: string, message: string, data?: any): void { if (this.trace !== Trace.Off) { - this.logger.logLevel('Trace', message, data); + this.logger.logLevel('Trace', `<${serverId}> ${message}`, data); } } } \ No newline at end of file From b362e9b6cac5ccba9701a8e35ee97888aabb7ef7 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 20 Jun 2019 17:09:20 -0700 Subject: [PATCH 0498/1449] Enable "typescript.experimental.useSeparateSyntaxServer" for VS Code workspace --- .vscode/settings.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 3fa04b1ee95..bde5d632541 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -59,5 +59,6 @@ "git.ignoreLimitWarning": true, "remote.extensionKind": { "msjsdiag.debugger-for-chrome": "workspace" - } + }, + "typescript.experimental.useSeparateSyntaxServer": true } From c6fe867ade5927eadd6b865ea02bd081d31d341d Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 20 Jun 2019 17:12:55 -0700 Subject: [PATCH 0499/1449] Remove trailing comma --- src/vs/workbench/browser/workbench.contribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/workbench.contribution.ts b/src/vs/workbench/browser/workbench.contribution.ts index 597d73d3e5a..eb6f6aabc32 100644 --- a/src/vs/workbench/browser/workbench.contribution.ts +++ b/src/vs/workbench/browser/workbench.contribution.ts @@ -318,7 +318,7 @@ import { isMacintosh, isWindows, isLinux, isWeb } from 'vs/base/common/platform' 'default': 'default', 'scope': ConfigurationScope.APPLICATION, 'markdownDescription': nls.localize('openFoldersInNewWindow', "Controls whether folders should open in a new window or replace the last active window.\nNote that there can still be cases where this setting is ignored (e.g. when using the `--new-window` or `--reuse-window` command line option).") - }, + } } }); From db0b3fde0ee19f80f71005fe56b4af7eb0e0d5c8 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Thu, 20 Jun 2019 17:34:26 -0700 Subject: [PATCH 0500/1449] Make badges smaller --- .../browser/parts/activitybar/media/activityaction.css | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/browser/parts/activitybar/media/activityaction.css b/src/vs/workbench/browser/parts/activitybar/media/activityaction.css index b7f64c06a08..1aedfd5cb21 100644 --- a/src/vs/workbench/browser/parts/activitybar/media/activityaction.css +++ b/src/vs/workbench/browser/parts/activitybar/media/activityaction.css @@ -54,11 +54,12 @@ position: absolute; top: 20px; right: 8px; - font-size: 11px; + font-size: 9px; + font-weight: 600; min-width: 8px; - height: 18px; - line-height: 18px; - padding: 0 5px; + height: 16px; + line-height: 16px; + padding: 0 4px; border-radius: 20px; text-align: center; } From 1958209dafdc3f6175f088b4aaf3fdb797b82189 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 20 Jun 2019 17:57:09 -0700 Subject: [PATCH 0501/1449] Include server id in TS server errors --- .../typescript-language-features/src/tsServer/server.ts | 2 +- .../src/tsServer/serverError.ts | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/extensions/typescript-language-features/src/tsServer/server.ts b/extensions/typescript-language-features/src/tsServer/server.ts index 9a2132fa27e..4a19cde00e7 100644 --- a/extensions/typescript-language-features/src/tsServer/server.ts +++ b/extensions/typescript-language-features/src/tsServer/server.ts @@ -189,7 +189,7 @@ export class ProcessBasedTsServer extends Disposable implements ITypeScriptServe // Special case where response itself is successful but there is not any data to return. callback.onSuccess(ServerResponse.NoContent); } else { - callback.onError(TypeScriptServerError.create(this._version, response)); + callback.onError(TypeScriptServerError.create(this._serverId, this._version, response)); } } diff --git a/extensions/typescript-language-features/src/tsServer/serverError.ts b/extensions/typescript-language-features/src/tsServer/serverError.ts index 062c82f1336..cb5cb8035f1 100644 --- a/extensions/typescript-language-features/src/tsServer/serverError.ts +++ b/extensions/typescript-language-features/src/tsServer/serverError.ts @@ -9,20 +9,22 @@ import { TypeScriptVersion } from '../utils/versionProvider'; export class TypeScriptServerError extends Error { public static create( + serverId: string, version: TypeScriptVersion, response: Proto.Response ): TypeScriptServerError { const parsedResult = TypeScriptServerError.parseErrorText(version, response); - return new TypeScriptServerError(version, response, parsedResult ? parsedResult.message : undefined, parsedResult ? parsedResult.stack : undefined); + return new TypeScriptServerError(serverId, version, response, parsedResult ? parsedResult.message : undefined, parsedResult ? parsedResult.stack : undefined); } private constructor( + serverId: string, version: TypeScriptVersion, private readonly response: Proto.Response, public readonly serverMessage: string | undefined, public readonly serverStack: string | undefined ) { - super(`TypeScript Server Error (${version.versionString})\n${serverMessage}\n${serverStack}`); + super(`<${serverId}> TypeScript Server Error (${version.versionString})\n${serverMessage}\n${serverStack}`); } public get serverErrorText() { return this.response.message; } From ec191a08f47e9f46f24131c3e33d0a582d8f0d1f Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 20 Jun 2019 17:59:36 -0700 Subject: [PATCH 0502/1449] Make execute command a configuration object --- .../src/features/implementationsCodeLens.ts | 2 +- .../src/features/referencesCodeLens.ts | 2 +- .../typescript-language-features/src/typescriptService.ts | 6 +++++- .../src/typescriptServiceClient.ts | 6 +++--- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/extensions/typescript-language-features/src/features/implementationsCodeLens.ts b/extensions/typescript-language-features/src/features/implementationsCodeLens.ts index 63cfc6222d9..c732ade5223 100644 --- a/extensions/typescript-language-features/src/features/implementationsCodeLens.ts +++ b/extensions/typescript-language-features/src/features/implementationsCodeLens.ts @@ -26,7 +26,7 @@ export default class TypeScriptImplementationsCodeLensProvider extends TypeScrip const codeLens = inputCodeLens as ReferencesCodeLens; const args = typeConverters.Position.toFileLocationRequestArgs(codeLens.file, codeLens.range.start); - const response = await this.client.execute('implementation', args, token, /* lowPriority */ true); + const response = await this.client.execute('implementation', args, token, { lowPriority: true }); if (response.type !== 'response' || !response.body) { codeLens.command = response.type === 'cancelled' ? TypeScriptBaseCodeLensProvider.cancelledCommand diff --git a/extensions/typescript-language-features/src/features/referencesCodeLens.ts b/extensions/typescript-language-features/src/features/referencesCodeLens.ts index ff09a9a4346..65c2cd5eb7f 100644 --- a/extensions/typescript-language-features/src/features/referencesCodeLens.ts +++ b/extensions/typescript-language-features/src/features/referencesCodeLens.ts @@ -22,7 +22,7 @@ class TypeScriptReferencesCodeLensProvider extends TypeScriptBaseCodeLensProvide public async resolveCodeLens(inputCodeLens: vscode.CodeLens, token: vscode.CancellationToken): Promise { const codeLens = inputCodeLens as ReferencesCodeLens; const args = typeConverters.Position.toFileLocationRequestArgs(codeLens.file, codeLens.range.start); - const response = await this.client.execute('references', args, token, /* lowPriority */ true); + const response = await this.client.execute('references', args, token, { lowPriority: true }); if (response.type !== 'response' || !response.body) { codeLens.command = response.type === 'cancelled' ? TypeScriptBaseCodeLensProvider.cancelledCommand diff --git a/extensions/typescript-language-features/src/typescriptService.ts b/extensions/typescript-language-features/src/typescriptService.ts index 537cb2a0e2e..ba396ad2fd2 100644 --- a/extensions/typescript-language-features/src/typescriptService.ts +++ b/extensions/typescript-language-features/src/typescriptService.ts @@ -75,6 +75,10 @@ interface AsyncTsServerRequests { export type TypeScriptRequests = StandardTsServerRequests & NoResponseTsServerRequests & AsyncTsServerRequests; +export type ExecConfig = { + lowPriority?: boolean; +}; + export interface ITypeScriptServiceClient { /** * Convert a resource (VS Code) to a normalized path (TypeScript). @@ -120,7 +124,7 @@ export interface ITypeScriptServiceClient { command: K, args: StandardTsServerRequests[K][0], token: vscode.CancellationToken, - lowPriority?: boolean + config?: ExecConfig ): Promise>; executeWithoutWaitingForResponse( diff --git a/extensions/typescript-language-features/src/typescriptServiceClient.ts b/extensions/typescript-language-features/src/typescriptServiceClient.ts index 07de35b4ba3..ca99e59509a 100644 --- a/extensions/typescript-language-features/src/typescriptServiceClient.ts +++ b/extensions/typescript-language-features/src/typescriptServiceClient.ts @@ -11,7 +11,7 @@ import BufferSyncSupport from './features/bufferSyncSupport'; import { DiagnosticKind, DiagnosticsManager } from './features/diagnostics'; import * as Proto from './protocol'; import { ITypeScriptServer } from './tsServer/server'; -import { ITypeScriptServiceClient, ServerResponse, TypeScriptRequests } from './typescriptService'; +import { ITypeScriptServiceClient, ServerResponse, TypeScriptRequests, ExecConfig } from './typescriptService'; import API from './utils/api'; import { TsServerLogLevel, TypeScriptServiceConfiguration } from './utils/configuration'; import { Disposable } from './utils/dispose'; @@ -607,12 +607,12 @@ export default class TypeScriptServiceClient extends Disposable implements IType return undefined; } - public execute(command: keyof TypeScriptRequests, args: any, token: vscode.CancellationToken, lowPriority?: boolean): Promise> { + public execute(command: keyof TypeScriptRequests, args: any, token: vscode.CancellationToken, config?: ExecConfig): Promise> { return this.executeImpl(command, args, { isAsync: false, token, expectsResult: true, - lowPriority + lowPriority: config ? config.lowPriority : undefined }); } From 362ca1d638eef676dee8977af286ba782ec55f0b Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 20 Jun 2019 18:01:39 -0700 Subject: [PATCH 0503/1449] Also include format in the syntax commands --- .../src/tsServer/server.ts | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/extensions/typescript-language-features/src/tsServer/server.ts b/extensions/typescript-language-features/src/tsServer/server.ts index 4a19cde00e7..9fbe7e80fac 100644 --- a/extensions/typescript-language-features/src/tsServer/server.ts +++ b/extensions/typescript-language-features/src/tsServer/server.ts @@ -333,18 +333,32 @@ export class SyntaxRoutingTsServer extends Disposable implements ITypeScriptServ this.semanticServer.kill(); } - private static readonly syntaxCommands = new Set(['navtree', 'getOutliningSpans', 'jsxClosingTag', 'selectionRange']); - private static readonly sharedCommands = new Set(['change', 'close', 'open', 'updateOpen', 'configure', 'configurePlugin']); + private static readonly syntaxCommands = new Set([ + 'navtree', + 'getOutliningSpans', + 'jsxClosingTag', + 'selectionRange', + 'format', + 'formatonkey', + ]); + private static readonly sharedCommands = new Set([ + 'change', + 'close', + 'open', + 'updateOpen', + 'configure', + 'configurePlugin', + ]); public executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: false, lowPriority?: boolean }): undefined; public executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: boolean, lowPriority?: boolean }): Promise>; public executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: boolean, lowPriority?: boolean }): Promise> | undefined { - if (SyntaxRoutingTsServer.syntaxCommands.has(command)) { return this.syntaxServer.executeImpl(command, args, executeInfo); } else if (SyntaxRoutingTsServer.sharedCommands.has(command)) { - this.syntaxServer.executeImpl(command, args, executeInfo); - return this.semanticServer.executeImpl(command, args, executeInfo); + // Dispatch to both server but only return from syntax one + this.semanticServer.executeImpl(command, args, executeInfo); + return this.syntaxServer.executeImpl(command, args, executeInfo); } else { return this.semanticServer.executeImpl(command, args, executeInfo); } From fd245fcda031687f58a5d8cd2cf3c70ca4e1ad9d Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 20 Jun 2019 18:13:06 -0700 Subject: [PATCH 0504/1449] Fix method name --- .../typescript-language-features/src/tsServer/spanwer.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/typescript-language-features/src/tsServer/spanwer.ts b/extensions/typescript-language-features/src/tsServer/spanwer.ts index 1c78d71c87e..d2ffd68b24b 100644 --- a/extensions/typescript-language-features/src/tsServer/spanwer.ts +++ b/extensions/typescript-language-features/src/tsServer/spanwer.ts @@ -35,7 +35,7 @@ export class TypeScriptServerSpawner { configuration: TypeScriptServiceConfiguration, pluginManager: PluginManager ): ITypeScriptServer { - if (this.shouldUserSeparateSyntaxServer(version)) { + if (this.shouldUseSeparateSyntaxServer(version)) { const syntaxServer = this.spawnProcessBasedTsServer('syntax', version, configuration, pluginManager, ['--syntaxOnly', '--disableAutomaticTypingAcquisition']); const semanticServer = this.spawnProcessBasedTsServer('semantic', version, configuration, pluginManager, []); return new SyntaxRoutingTsServer(syntaxServer, semanticServer); @@ -44,7 +44,7 @@ export class TypeScriptServerSpawner { return this.spawnProcessBasedTsServer('main', version, configuration, pluginManager, []); } - private shouldUserSeparateSyntaxServer(version: TypeScriptVersion): boolean { + private shouldUseSeparateSyntaxServer(version: TypeScriptVersion): boolean { if (!version.version || version.version.lt(API.v340)) { return false; } From 5fc7a8c5c0534baf4f86471707158993e9af257e Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 20 Jun 2019 18:15:33 -0700 Subject: [PATCH 0505/1449] Renames --- .../src/tsServer/spanwer.ts | 12 ++++++------ .../src/typescriptServiceClient.ts | 4 ++-- .../src/utils/versionProvider.ts | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/extensions/typescript-language-features/src/tsServer/spanwer.ts b/extensions/typescript-language-features/src/tsServer/spanwer.ts index d2ffd68b24b..b0abc67e286 100644 --- a/extensions/typescript-language-features/src/tsServer/spanwer.ts +++ b/extensions/typescript-language-features/src/tsServer/spanwer.ts @@ -36,30 +36,30 @@ export class TypeScriptServerSpawner { pluginManager: PluginManager ): ITypeScriptServer { if (this.shouldUseSeparateSyntaxServer(version)) { - const syntaxServer = this.spawnProcessBasedTsServer('syntax', version, configuration, pluginManager, ['--syntaxOnly', '--disableAutomaticTypingAcquisition']); - const semanticServer = this.spawnProcessBasedTsServer('semantic', version, configuration, pluginManager, []); + const syntaxServer = this.spawnTsServer('syntax', version, configuration, pluginManager, ['--syntaxOnly', '--disableAutomaticTypingAcquisition']); + const semanticServer = this.spawnTsServer('semantic', version, configuration, pluginManager, []); return new SyntaxRoutingTsServer(syntaxServer, semanticServer); } - return this.spawnProcessBasedTsServer('main', version, configuration, pluginManager, []); + return this.spawnTsServer('main', version, configuration, pluginManager, []); } private shouldUseSeparateSyntaxServer(version: TypeScriptVersion): boolean { - if (!version.version || version.version.lt(API.v340)) { + if (!version.apiVersion || version.apiVersion.lt(API.v340)) { return false; } return vscode.workspace.getConfiguration('typescript') .get('experimental.useSeparateSyntaxServer', false); } - private spawnProcessBasedTsServer( + private spawnTsServer( serverId: string, version: TypeScriptVersion, configuration: TypeScriptServiceConfiguration, pluginManager: PluginManager, extraForkArgs: readonly string[], ): ITypeScriptServer { - const apiVersion = version.version || API.defaultVersion; + const apiVersion = version.apiVersion || API.defaultVersion; const { args, cancellationPipeName, tsServerLogFile } = this.getTsServerArgs(configuration, version, apiVersion, pluginManager); diff --git a/extensions/typescript-language-features/src/typescriptServiceClient.ts b/extensions/typescript-language-features/src/typescriptServiceClient.ts index ca99e59509a..6285981756a 100644 --- a/extensions/typescript-language-features/src/typescriptServiceClient.ts +++ b/extensions/typescript-language-features/src/typescriptServiceClient.ts @@ -285,7 +285,7 @@ export default class TypeScriptServiceClient extends Disposable implements IType currentVersion = this.versionPicker.currentVersion; } - const apiVersion = this.versionPicker.currentVersion.version || API.defaultVersion; + const apiVersion = this.versionPicker.currentVersion.apiVersion || API.defaultVersion; this.onDidChangeTypeScriptVersion(currentVersion); let mytoken = ++this.token; @@ -353,7 +353,7 @@ export default class TypeScriptServiceClient extends Disposable implements IType handle.onEvent(event => this.dispatchEvent(event)); this._onReady!.resolve(); - this._onTsServerStarted.fire(currentVersion.version); + this._onTsServerStarted.fire(currentVersion.apiVersion); if (apiVersion.gte(API.v300)) { this.loadingIndicator.startedLoadingProject(undefined /* projectName */); diff --git a/extensions/typescript-language-features/src/utils/versionProvider.ts b/extensions/typescript-language-features/src/utils/versionProvider.ts index fcbee87bb1d..901446130bd 100644 --- a/extensions/typescript-language-features/src/utils/versionProvider.ts +++ b/extensions/typescript-language-features/src/utils/versionProvider.ts @@ -27,10 +27,10 @@ export class TypeScriptVersion { } public get isValid(): boolean { - return this.version !== undefined; + return this.apiVersion !== undefined; } - public get version(): API | undefined { + public get apiVersion(): API | undefined { const version = this.getTypeScriptVersion(this.tsServerPath); if (version) { return version; @@ -46,7 +46,7 @@ export class TypeScriptVersion { } public get versionString(): string { - const version = this.version; + const version = this.apiVersion; return version ? version.versionString : localize( 'couldNotLoadTsVersion', 'Could not load the TypeScript version at this path'); } From ffecce0476c74bb8482e9ad95767faa8681cc9da Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 20 Jun 2019 18:25:12 -0700 Subject: [PATCH 0506/1449] Better encapsulate logic of spawning different server kinds --- .../src/tsServer/spanwer.ts | 46 +++++++++++-------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/extensions/typescript-language-features/src/tsServer/spanwer.ts b/extensions/typescript-language-features/src/tsServer/spanwer.ts index b0abc67e286..a7be07a0806 100644 --- a/extensions/typescript-language-features/src/tsServer/spanwer.ts +++ b/extensions/typescript-language-features/src/tsServer/spanwer.ts @@ -20,6 +20,8 @@ import Tracer from '../utils/tracer'; import { TypeScriptVersion, TypeScriptVersionProvider } from '../utils/versionProvider'; import { ITypeScriptServer, PipeRequestCanceller, ProcessBasedTsServer, SyntaxRoutingTsServer, TsServerProcess } from './server'; +type ServerKind = 'main' | 'syntax' | 'semantic'; + export class TypeScriptServerSpawner { public constructor( private readonly _versionProvider: TypeScriptVersionProvider, @@ -36,12 +38,12 @@ export class TypeScriptServerSpawner { pluginManager: PluginManager ): ITypeScriptServer { if (this.shouldUseSeparateSyntaxServer(version)) { - const syntaxServer = this.spawnTsServer('syntax', version, configuration, pluginManager, ['--syntaxOnly', '--disableAutomaticTypingAcquisition']); - const semanticServer = this.spawnTsServer('semantic', version, configuration, pluginManager, []); + const syntaxServer = this.spawnTsServer('syntax', version, configuration, pluginManager); + const semanticServer = this.spawnTsServer('semantic', version, configuration, pluginManager); return new SyntaxRoutingTsServer(syntaxServer, semanticServer); } - return this.spawnTsServer('main', version, configuration, pluginManager, []); + return this.spawnTsServer('main', version, configuration, pluginManager); } private shouldUseSeparateSyntaxServer(version: TypeScriptVersion): boolean { @@ -53,40 +55,39 @@ export class TypeScriptServerSpawner { } private spawnTsServer( - serverId: string, + kind: ServerKind, version: TypeScriptVersion, configuration: TypeScriptServiceConfiguration, pluginManager: PluginManager, - extraForkArgs: readonly string[], ): ITypeScriptServer { const apiVersion = version.apiVersion || API.defaultVersion; - const { args, cancellationPipeName, tsServerLogFile } = this.getTsServerArgs(configuration, version, apiVersion, pluginManager); + const { args, cancellationPipeName, tsServerLogFile } = this.getTsServerArgs(kind, configuration, version, apiVersion, pluginManager); if (TypeScriptServerSpawner.isLoggingEnabled(apiVersion, configuration)) { if (tsServerLogFile) { - this._logger.info(`<${serverId}> Log file: ${tsServerLogFile}`); + this._logger.info(`<${kind}> Log file: ${tsServerLogFile}`); } else { - this._logger.error(`<${serverId}> Could not create log directory`); + this._logger.error(`<${kind}> Could not create log directory`); } } - this._logger.info(`<${serverId}> Forking...`); - const childProcess = electron.fork(version.tsServerPath, [...args, ...extraForkArgs], this.getForkOptions()); - this._logger.info(`<${serverId}> Starting...`); + this._logger.info(`<${kind}> Forking...`); + const childProcess = electron.fork(version.tsServerPath, args, this.getForkOptions(kind)); + this._logger.info(`<${kind}> Starting...`); return new ProcessBasedTsServer( - serverId, + kind, new ChildServerProcess(childProcess), tsServerLogFile, - new PipeRequestCanceller(serverId, cancellationPipeName, this._tracer), + new PipeRequestCanceller(kind, cancellationPipeName, this._tracer), version, this._telemetryReporter, this._tracer); } - private getForkOptions() { - const debugPort = TypeScriptServerSpawner.getDebugPort(); + private getForkOptions(kind: ServerKind) { + const debugPort = TypeScriptServerSpawner.getDebugPort(kind); const tsServerForkOptions: electron.ForkOptions = { execArgv: debugPort ? [`--inspect=${debugPort}`] : [], }; @@ -94,6 +95,7 @@ export class TypeScriptServerSpawner { } private getTsServerArgs( + kind: ServerKind, configuration: TypeScriptServiceConfiguration, currentVersion: TypeScriptVersion, apiVersion: API, @@ -103,6 +105,10 @@ export class TypeScriptServerSpawner { let cancellationPipeName: string | undefined; let tsServerLogFile: string | undefined; + if (kind === 'syntax') { + args.push('--syntaxOnly'); + } + if (apiVersion.gte(API.v206)) { if (apiVersion.gte(API.v250)) { args.push('--useInferredProjectPerProjectRoot'); @@ -110,12 +116,12 @@ export class TypeScriptServerSpawner { args.push('--useSingleInferredProject'); } - if (configuration.disableAutomaticTypeAcquisition) { + if (configuration.disableAutomaticTypeAcquisition || kind === 'syntax') { args.push('--disableAutomaticTypingAcquisition'); } } - if (apiVersion.gte(API.v208)) { + if (apiVersion.gte(API.v208) && kind !== 'syntax') { args.push('--enableTelemetry'); } @@ -173,7 +179,11 @@ export class TypeScriptServerSpawner { return { args, cancellationPipeName, tsServerLogFile }; } - private static getDebugPort(): number | undefined { + private static getDebugPort(kind: ServerKind): number | undefined { + if (kind === 'syntax') { + // We typically only want to debug the main semantic server + return undefined; + } const value = process.env['TSS_DEBUG']; if (value) { const port = parseInt(value); From 9ff8ae037e8e6109d65e4b5e3eb3dc60cc187e21 Mon Sep 17 00:00:00 2001 From: SteVen Batten Date: Thu, 20 Jun 2019 19:46:25 -0700 Subject: [PATCH 0507/1449] some fixes for mac web --- src/vs/workbench/browser/layout.ts | 6 +++--- src/vs/workbench/browser/workbench.contribution.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/browser/layout.ts b/src/vs/workbench/browser/layout.ts index e06870b2bb7..0eb3ce21f20 100644 --- a/src/vs/workbench/browser/layout.ts +++ b/src/vs/workbench/browser/layout.ts @@ -9,7 +9,7 @@ import { EventType, addDisposableListener, addClass, removeClass, isAncestor, ge import { onDidChangeFullscreen, isFullscreen, getZoomFactor } from 'vs/base/browser/browser'; import { IBackupFileService } from 'vs/workbench/services/backup/common/backup'; import { Registry } from 'vs/platform/registry/common/platform'; -import { isWindows, isLinux, isMacintosh, isWeb } from 'vs/base/common/platform'; +import { isWindows, isLinux, isMacintosh, isWeb, isNative } from 'vs/base/common/platform'; import { pathsToEditors } from 'vs/workbench/common/editor'; import { SidebarPart } from 'vs/workbench/browser/parts/sidebar/sidebarPart'; import { PanelPart } from 'vs/workbench/browser/parts/panel/panelPart'; @@ -229,7 +229,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi } // Menubar visibility changes - if ((isWindows || isLinux) && getTitleBarStyle(this.configurationService, this.environmentService) === 'custom') { + if ((isWindows || isLinux || isWeb) && getTitleBarStyle(this.configurationService, this.environmentService) === 'custom') { this._register(this.titleService.onMenubarVisibilityChange(visible => this.onMenubarToggled(visible))); } } @@ -535,7 +535,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi return false; } else if (!this.state.fullscreen) { return true; - } else if (isMacintosh) { + } else if (isMacintosh && isNative) { return false; } else if (this.state.menuBar.visibility === 'visible') { return true; diff --git a/src/vs/workbench/browser/workbench.contribution.ts b/src/vs/workbench/browser/workbench.contribution.ts index eb6f6aabc32..d3e988fa21f 100644 --- a/src/vs/workbench/browser/workbench.contribution.ts +++ b/src/vs/workbench/browser/workbench.contribution.ts @@ -298,7 +298,7 @@ import { isMacintosh, isWindows, isLinux, isWeb } from 'vs/base/common/platform' 'default': true, 'scope': ConfigurationScope.APPLICATION, 'description': nls.localize('enableMenuBarMnemonics', "If enabled, the main menus can be opened via Alt-key shortcuts. Disabling mnemonics allows to bind these Alt-key shortcuts to editor commands instead."), - 'included': isWindows || isLinux || isWeb + 'included': isWindows || isLinux }, 'window.disableCustomMenuBarAltFocus': { 'type': 'boolean', From 1f82a5b025ae4ab25afd01661e845417c100bb87 Mon Sep 17 00:00:00 2001 From: Pine Wu Date: Fri, 21 Jun 2019 14:26:09 +0800 Subject: [PATCH 0508/1449] New test runner API for #74555 --- .../api/node/extHostExtensionService.ts | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts index 69d976b10d0..90e59f4f245 100644 --- a/src/vs/workbench/api/node/extHostExtensionService.ts +++ b/src/vs/workbench/api/node/extHostExtensionService.ts @@ -36,7 +36,11 @@ import { RemoteAuthorityResolverError, ExtensionExecutionContext, ExtensionKind import { IURITransformer } from 'vs/base/common/uriIpc'; interface ITestRunner { + // Old test runner spec, shipped in vscode/lib/testrunner run(testsRoot: string, clb: (error: Error, failures?: number) => void): void; + + // New test runner spec + runTests(): Promise; } export interface IHostUtils { @@ -534,7 +538,26 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { requireError = error; } - // Execute the runner if it follows our spec + // Execute the runner following the new `runTests` spec + if (testRunner && typeof testRunner.runTests === 'function') { + return new Promise((c, e) => { + testRunner!.runTests() + .then((succeeded) => { + if (succeeded) { + c(undefined); + this._gracefulExit(0); + } else { + this._gracefulExit(1); + } + }) + .catch(err => { + e(err); + this._gracefulExit(1); + }); + }); + } + + // Execute the runner if it follows the old `run` spec if (testRunner && typeof testRunner.run === 'function') { return new Promise((c, e) => { testRunner!.run(extensionTestsPath, (error, failures) => { From e4ca6137b4aeae9d9e5fe719bfd117d13bcfa634 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 21 Jun 2019 09:21:40 +0200 Subject: [PATCH 0509/1449] update doc, #74188 --- src/vs/vscode.proposed.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 29764773871..0ac46132de5 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -61,7 +61,7 @@ declare module 'vscode' { export namespace env { /** * The name of a remote. Defined by extensions, popular samples are `wsl` for the Windows - * Subsystem for Linux or `ssh` for remotes using a secure shell. + * Subsystem for Linux or `ssh-remote` for remotes using a secure shell. * * *Note* that the value is `undefined` when there is no remote extension host but that the * value is defined in all extension hosts (local and remote) in case a remote extension host From 3233601840681b63d68cf4d6920b0fcdef7dd182 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 21 Jun 2019 10:28:26 +0200 Subject: [PATCH 0510/1449] build: release only iff all builds succeed, introduce VSCODE_RELEASE env --- build/azure-pipelines/common/publish.ts | 15 +-- build/azure-pipelines/common/release.ts | 109 ++++++++++++++++++ build/azure-pipelines/common/sync-mooncake.ts | 5 - build/azure-pipelines/product-build.yml | 16 ++- build/azure-pipelines/release.yml | 22 ++++ 5 files changed, 147 insertions(+), 20 deletions(-) create mode 100644 build/azure-pipelines/common/release.ts create mode 100644 build/azure-pipelines/release.yml diff --git a/build/azure-pipelines/common/publish.ts b/build/azure-pipelines/common/publish.ts index 724939da318..62113c8f3b3 100644 --- a/build/azure-pipelines/common/publish.ts +++ b/build/azure-pipelines/common/publish.ts @@ -151,13 +151,6 @@ async function publish(commit: string, quality: string, platform: string, type: const queuedBy = process.env['BUILD_QUEUEDBY']!; const sourceBranch = process.env['BUILD_SOURCEBRANCH']!; - const isReleased = ( - // Insiders: nightly build from master - (quality === 'insider' && /^master$|^refs\/heads\/master$/.test(sourceBranch) && /Project Collection Service Accounts|Microsoft.VisualStudio.Services.TFS/.test(queuedBy)) || - - // Exploration: any build from electron-4.0.x branch - (quality === 'exploration' && /^electron-4.0.x$|^refs\/heads\/electron-4.0.x$/.test(sourceBranch)) - ); console.log('Publishing...'); console.log('Quality:', quality); @@ -167,7 +160,6 @@ async function publish(commit: string, quality: string, platform: string, type: console.log('Version:', version); console.log('Commit:', commit); console.log('Is Update:', isUpdate); - console.log('Is Released:', isReleased); console.log('File:', file); const stat = await new Promise((c, e) => fs.stat(file, (err, stat) => err ? e(err) : c(stat))); @@ -226,7 +218,7 @@ async function publish(commit: string, quality: string, platform: string, type: id: commit, timestamp: (new Date()).getTime(), version, - isReleased: config.frozen ? false : isReleased, + isReleased: false, sourceBranch, queuedBy, assets: [] as Array, @@ -245,11 +237,6 @@ async function publish(commit: string, quality: string, platform: string, type: } function main(): void { - if (process.env['VSCODE_BUILD_SKIP_PUBLISH']) { - console.warn('Skipping publish due to VSCODE_BUILD_SKIP_PUBLISH'); - return; - } - const commit = process.env['BUILD_SOURCEVERSION']; if (!commit) { diff --git a/build/azure-pipelines/common/release.ts b/build/azure-pipelines/common/release.ts new file mode 100644 index 00000000000..1220bd62e68 --- /dev/null +++ b/build/azure-pipelines/common/release.ts @@ -0,0 +1,109 @@ +/*--------------------------------------------------------------------------------------------- + * 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 { DocumentClient } from 'documentdb'; + +interface Config { + id: string; + frozen: boolean; +} + +function createDefaultConfig(quality: string): Config { + return { + id: quality, + frozen: false + }; +} + +function getConfig(quality: string): Promise { + const client = new DocumentClient(process.env['AZURE_DOCUMENTDB_ENDPOINT']!, { masterKey: process.env['AZURE_DOCUMENTDB_MASTERKEY'] }); + const collection = 'dbs/builds/colls/config'; + const query = { + query: `SELECT TOP 1 * FROM c WHERE c.id = @quality`, + parameters: [ + { name: '@quality', value: quality } + ] + }; + + return new Promise((c, e) => { + client.queryDocuments(collection, query).toArray((err, results) => { + if (err && err.code !== 409) { return e(err); } + + c(!results || results.length === 0 ? createDefaultConfig(quality) : results[0] as any as Config); + }); + }); +} + +function doRelease(commit: string, quality: string): Promise { + const client = new DocumentClient(process.env['AZURE_DOCUMENTDB_ENDPOINT']!, { masterKey: process.env['AZURE_DOCUMENTDB_MASTERKEY'] }); + const collection = 'dbs/builds/colls/' + quality; + const query = { + query: 'SELECT TOP 1 * FROM c WHERE c.id = @id', + parameters: [{ name: '@id', value: commit }] + }; + + let updateTries = 0; + + function update(): Promise { + updateTries++; + + return new Promise((c, e) => { + client.queryDocuments(collection, query).toArray((err, results) => { + if (err) { return e(err); } + if (results.length !== 1) { return e(new Error('No documents')); } + + const release = results[0]; + release.isReleased = true; + + client.replaceDocument(release._self, release, err => { + if (err && err.code === 409 && updateTries < 5) { return c(update()); } + if (err) { return e(err); } + + console.log('Build successfully updated.'); + c(); + }); + }); + }); + } + + return update(); +} + +async function release(commit: string, quality: string): Promise { + const config = await getConfig(quality); + + console.log('Quality config:', config); + + if (config.frozen) { + console.log(`Skipping release because quality ${quality} is frozen.`); + return; + } + + await doRelease(commit, quality); +} + +function env(name: string): string { + const result = process.env[name]; + + if (!result) { + throw new Error(`Skipping release due to missing env: ${name}`); + } + + return result; +} + +async function main(): Promise { + const commit = env('BUILD_SOURCEVERSION'); + const quality = env('VSCODE_QUALITY'); + + await release(commit, quality); +} + +main().catch(err => { + console.error(err); + process.exit(1); +}); diff --git a/build/azure-pipelines/common/sync-mooncake.ts b/build/azure-pipelines/common/sync-mooncake.ts index af0db530683..1eac8f34e92 100644 --- a/build/azure-pipelines/common/sync-mooncake.ts +++ b/build/azure-pipelines/common/sync-mooncake.ts @@ -153,11 +153,6 @@ async function sync(commit: string, quality: string): Promise { } function main(): void { - if (process.env['VSCODE_BUILD_SKIP_PUBLISH']) { - error('Skipping publish due to VSCODE_BUILD_SKIP_PUBLISH'); - return; - } - const commit = process.env['BUILD_SOURCEVERSION']; if (!commit) { diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 25c572cfd56..60d99b36ed4 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -78,8 +78,22 @@ jobs: steps: - template: darwin/product-build-darwin.yml +- job: Release + condition: and(succeeded(), or(eq(variables['VSCODE_RELEASE'], 'true'), and(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['Build.Reason'], 'Schedule')), and(eq(variables['VSCODE_QUALITY'], 'exploration'), eq(variables['Build.SourceBranch'], 'refs/heads/electron-4.0.x')))) + pool: + vmImage: 'Ubuntu-16.04' + dependsOn: + - Windows + - Windows32 + - Linux + - LinuxSnap + - LinuxArmhf + - LinuxAlpine + - macOS + steps: + - template: release.yml + - job: Mooncake - timeoutInMinutes: 120 pool: vmImage: 'Ubuntu-16.04' condition: true diff --git a/build/azure-pipelines/release.yml b/build/azure-pipelines/release.yml new file mode 100644 index 00000000000..eee54a1d8b7 --- /dev/null +++ b/build/azure-pipelines/release.yml @@ -0,0 +1,22 @@ +steps: +- task: NodeTool@0 + inputs: + versionSpec: "10.x" + +- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 + inputs: + versionSpec: "1.x" + +- task: AzureKeyVault@1 + displayName: 'Azure Key Vault: Get Secrets' + inputs: + azureSubscription: 'vscode-builds-subscription' + KeyVaultName: vscode + +- script: | + set -e + + (cd build ; yarn) + + AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ + node build/azure-pipelines/common/release.js From 44596ac959bea131144ca23fee9809f4cc69c899 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 21 Jun 2019 10:56:36 +0200 Subject: [PATCH 0511/1449] first version of vscode.workspace.fs --- .../singlefolder-tests/workspace.fs.test.ts | 119 ++++++++++++++++++ src/vs/vscode.proposed.d.ts | 21 ++++ .../api/browser/mainThreadFileSystem.ts | 54 +++++++- .../workbench/api/common/extHost.protocol.ts | 9 ++ .../workbench/api/common/extHostFileSystem.ts | 34 +++++ src/vs/workbench/api/node/extHost.api.impl.ts | 4 + 6 files changed, 239 insertions(+), 2 deletions(-) create mode 100644 extensions/vscode-api-tests/src/singlefolder-tests/workspace.fs.test.ts diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.fs.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.fs.test.ts new file mode 100644 index 00000000000..92fe43e125f --- /dev/null +++ b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.fs.test.ts @@ -0,0 +1,119 @@ +/*--------------------------------------------------------------------------------------------- + * 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 vscode from 'vscode'; +import { join } from 'path'; + +suite('workspace-fs', () => { + + let root: vscode.Uri; + + suiteSetup(function () { + root = vscode.workspace.workspaceFolders![0]!.uri; + }); + + test('fs.stat', async function () { + const stat = await vscode.workspace.fs.stat(root); + assert.equal(stat.type, vscode.FileType.Directory); + + assert.equal(typeof stat.size, 'number'); + assert.equal(typeof stat.mtime, 'number'); + assert.equal(typeof stat.ctime, 'number'); + + + const entries = await vscode.workspace.fs.readDirectory(root); + assert.ok(entries.length > 0); + + // find far.js + const tuple = entries.find(tuple => tuple[0] === 'far.js')!; + assert.ok(tuple); + assert.equal(tuple[0], 'far.js'); + assert.equal(tuple[1], vscode.FileType.File); + }); + + test('fs.stat - bad scheme', async function () { + try { + await vscode.workspace.fs.stat(vscode.Uri.parse('foo:/bar/baz/test.txt')); + assert.ok(false); + } catch { + assert.ok(true); + } + }); + + test('fs.stat - missing file', async function () { + try { + await vscode.workspace.fs.stat(root.with({ path: root.path + '.bad' })); + assert.ok(false); + } catch (e) { + assert.ok(true); + } + }); + + test('fs.write/stat/delete', async function () { + + const uri = root.with({ path: join(root.path, 'new.file') }); + await vscode.workspace.fs.writeFile(uri, Buffer.from('HELLO')); + + const stat = await vscode.workspace.fs.stat(uri); + assert.equal(stat.type, vscode.FileType.File); + + await vscode.workspace.fs.delete(uri); + + try { + await vscode.workspace.fs.stat(uri); + assert.ok(false); + } catch { + assert.ok(true); + } + }); + + test('fs.delete folder', async function () { + + const folder = root.with({ path: join(root.path, 'folder') }); + const file = root.with({ path: join(root.path, 'folder/file') }); + + await vscode.workspace.fs.createDirectory(folder); + await vscode.workspace.fs.writeFile(file, Buffer.from('FOO')); + + await vscode.workspace.fs.stat(folder); + await vscode.workspace.fs.stat(file); + + // ensure non empty folder cannot be deleted + try { + await vscode.workspace.fs.delete(folder, { recursive: false }); + assert.ok(false); + } catch { + await vscode.workspace.fs.stat(folder); + await vscode.workspace.fs.stat(file); + } + + // ensure non empty folder cannot be deleted is DEFAULT + try { + await vscode.workspace.fs.delete(folder); // recursive: false as default + assert.ok(false); + } catch { + await vscode.workspace.fs.stat(folder); + await vscode.workspace.fs.stat(file); + } + + // delete non empty folder with recursive-flag + await vscode.workspace.fs.delete(folder, { recursive: true }); + + // esnure folder/file are gone + try { + await vscode.workspace.fs.stat(folder); + assert.ok(false); + } catch { + assert.ok(true); + } + try { + await vscode.workspace.fs.stat(file); + assert.ok(false); + } catch { + assert.ok(true); + } + }); +}); diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 0ac46132de5..e2580b67495 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1519,4 +1519,25 @@ declare module 'vscode' { } //#endregion + + + //#region Joh - read/write files of any scheme + + export interface FileSystem { + stat(uri: Uri): Thenable; + readDirectory(uri: Uri): Thenable<[string, FileType][]>; + createDirectory(uri: Uri): Thenable; + readFile(uri: Uri): Thenable; + writeFile(uri: Uri, content: Uint8Array, options?: { create: boolean, overwrite: boolean }): Thenable; + delete(uri: Uri, options?: { recursive: boolean }): Thenable; + rename(oldUri: Uri, newUri: Uri, options?: { overwrite: boolean }): Thenable; + copy(source: Uri, destination: Uri, options?: { overwrite: boolean }): Thenable; + } + + export namespace workspace { + + export const fs: FileSystem; + } + + //#endregion } diff --git a/src/vs/workbench/api/browser/mainThreadFileSystem.ts b/src/vs/workbench/api/browser/mainThreadFileSystem.ts index 61871e2c39b..2f395fd03e4 100644 --- a/src/vs/workbench/api/browser/mainThreadFileSystem.ts +++ b/src/vs/workbench/api/browser/mainThreadFileSystem.ts @@ -5,8 +5,8 @@ import { Emitter, Event } from 'vs/base/common/event'; import { IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; -import { URI } from 'vs/base/common/uri'; -import { FileWriteOptions, FileSystemProviderCapabilities, IFileChange, IFileService, IFileSystemProvider, IStat, IWatchOptions, FileType, FileOverwriteOptions, FileDeleteOptions, FileOpenOptions } from 'vs/platform/files/common/files'; +import { URI, UriComponents } from 'vs/base/common/uri'; +import { FileWriteOptions, FileSystemProviderCapabilities, IFileChange, IFileService, IFileSystemProvider, IStat, IWatchOptions, FileType, FileOverwriteOptions, FileDeleteOptions, FileOpenOptions, IFileStat } from 'vs/platform/files/common/files'; import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { ExtHostContext, ExtHostFileSystemShape, IExtHostContext, IFileChangeDto, MainContext, MainThreadFileSystemShape } from '../common/extHost.protocol'; import { ResourceLabelFormatter, ILabelService } from 'vs/platform/label/common/label'; @@ -60,6 +60,56 @@ export class MainThreadFileSystem implements MainThreadFileSystemShape { } fileProvider.$onFileSystemChange(changes); } + + + // --- + + async $stat(uri: UriComponents): Promise { + const stat = await this._fileService.resolve(URI.revive(uri), { resolveMetadata: true }); + return { + ctime: 0, + mtime: stat.mtime, + size: stat.size, + type: MainThreadFileSystem._getFileType(stat) + }; + } + + async $readdir(uri: UriComponents): Promise<[string, FileType][]> { + const stat = await this._fileService.resolve(URI.revive(uri), { resolveMetadata: false }); + if (!stat.children) { + throw new Error('not a folder'); + } + return stat.children.map(child => [child.name, MainThreadFileSystem._getFileType(child)]); + } + + private static _getFileType(stat: IFileStat): FileType { + return (stat.isDirectory ? FileType.Directory : FileType.File) + (stat.isSymbolicLink ? FileType.SymbolicLink : 0); + } + + async $readFile(resource: UriComponents): Promise { + return (await this._fileService.readFile(URI.revive(resource))).value; + } + + async $writeFile(resource: UriComponents, content: VSBuffer, opts: FileWriteOptions): Promise { + //todo@joh honor opts + await this._fileService.writeFile(URI.revive(resource), content, {}); + } + + async $rename(resource: UriComponents, target: UriComponents, opts: FileOverwriteOptions): Promise { + this._fileService.move(URI.revive(resource), URI.revive(target), opts.overwrite); + } + + async $copy(resource: UriComponents, target: UriComponents, opts: FileOverwriteOptions): Promise { + this._fileService.copy(URI.revive(resource), URI.revive(target), opts.overwrite); + } + + async $mkdir(resource: UriComponents): Promise { + this._fileService.createFolder(URI.revive(resource)); + } + + async $delete(resource: UriComponents, opts: FileDeleteOptions): Promise { + this._fileService.del(URI.revive(resource), opts); + } } class RemoteFileSystemProvider implements IFileSystemProvider { diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 58ec9762b80..3257cafa435 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -592,6 +592,15 @@ export interface MainThreadFileSystemShape extends IDisposable { $registerResourceLabelFormatter(handle: number, formatter: ResourceLabelFormatter): void; $unregisterResourceLabelFormatter(handle: number): void; $onFileSystemChange(handle: number, resource: IFileChangeDto[]): void; + + $stat(uri: UriComponents): Promise; + $readdir(resource: UriComponents): Promise<[string, files.FileType][]>; + $readFile(resource: UriComponents): Promise; + $writeFile(resource: UriComponents, content: VSBuffer, opts: files.FileWriteOptions): Promise; + $rename(resource: UriComponents, target: UriComponents, opts: files.FileOverwriteOptions): Promise; + $copy(resource: UriComponents, target: UriComponents, opts: files.FileOverwriteOptions): Promise; + $mkdir(resource: UriComponents): Promise; + $delete(resource: UriComponents, opts: files.FileDeleteOptions): Promise; } export interface MainThreadSearchShape extends IDisposable { diff --git a/src/vs/workbench/api/common/extHostFileSystem.ts b/src/vs/workbench/api/common/extHostFileSystem.ts index da723e3d01b..0159b6403eb 100644 --- a/src/vs/workbench/api/common/extHostFileSystem.ts +++ b/src/vs/workbench/api/common/extHostFileSystem.ts @@ -104,6 +104,36 @@ class FsLinkProvider { } } +class ConsumerFileSystem implements vscode.FileSystem { + + constructor(private _proxy: MainThreadFileSystemShape) { } + + stat(uri: vscode.Uri): Promise { + return this._proxy.$stat(uri); + } + readDirectory(uri: vscode.Uri): Promise<[string, vscode.FileType][]> { + return this._proxy.$readdir(uri); + } + createDirectory(uri: vscode.Uri): Promise { + return this._proxy.$mkdir(uri); + } + async readFile(uri: vscode.Uri): Promise { + return (await this._proxy.$readFile(uri)).buffer; + } + writeFile(uri: vscode.Uri, content: Uint8Array, options: { create: boolean; overwrite: boolean; } = { create: true, overwrite: true }): Promise { + return this._proxy.$writeFile(uri, VSBuffer.wrap(content), options); + } + delete(uri: vscode.Uri, options: { recursive: boolean; } = { recursive: false }): Promise { + return this._proxy.$delete(uri, { ...options, useTrash: true }); //todo@joh useTrash + } + rename(oldUri: vscode.Uri, newUri: vscode.Uri, options: { overwrite: boolean; } = { overwrite: false }): Promise { + return this._proxy.$rename(oldUri, newUri, options); + } + copy(source: vscode.Uri, destination: vscode.Uri, options: { overwrite: boolean } = { overwrite: false }): Promise { + return this._proxy.$copy(source, destination, options); + } +} + export class ExtHostFileSystem implements ExtHostFileSystemShape { private readonly _proxy: MainThreadFileSystemShape; @@ -115,6 +145,8 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { private _linkProviderRegistration: IDisposable; private _handlePool: number = 0; + readonly fileSystem: vscode.FileSystem; + constructor(mainContext: IMainContext, private _extHostLanguageFeatures: ExtHostLanguageFeatures) { this._proxy = mainContext.getProxy(MainContext.MainThreadFileSystem); this._usedSchemes.add(Schemas.file); @@ -127,6 +159,8 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { this._usedSchemes.add(Schemas.mailto); this._usedSchemes.add(Schemas.data); this._usedSchemes.add(Schemas.command); + + this.fileSystem = new ConsumerFileSystem(this._proxy); } dispose(): void { diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 88181549613..dd6c14f666b 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -673,6 +673,10 @@ export function createApiFactory( registerFileSystemProvider(scheme, provider, options) { return extHostFileSystem.registerFileSystemProvider(scheme, provider, options); }, + get fs() { + checkProposedApiEnabled(extension); + return extHostFileSystem.fileSystem; + }, registerFileSearchProvider: proposedApiFunction(extension, (scheme: string, provider: vscode.FileSearchProvider) => { return extHostSearch.registerFileSearchProvider(scheme, provider); }), From 293596c9af033f0f76ee55933e0a7dc143c1ba13 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 21 Jun 2019 11:12:14 +0200 Subject: [PATCH 0512/1449] :lipstick: --- src/vs/vscode.proposed.d.ts | 4 ++-- .../api/browser/mainThreadFileSystem.ts | 24 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index e2580b67495..f60ed7ca4bd 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1530,8 +1530,8 @@ declare module 'vscode' { readFile(uri: Uri): Thenable; writeFile(uri: Uri, content: Uint8Array, options?: { create: boolean, overwrite: boolean }): Thenable; delete(uri: Uri, options?: { recursive: boolean }): Thenable; - rename(oldUri: Uri, newUri: Uri, options?: { overwrite: boolean }): Thenable; - copy(source: Uri, destination: Uri, options?: { overwrite: boolean }): Thenable; + rename(source: Uri, target: Uri, options?: { overwrite: boolean }): Thenable; + copy(source: Uri, target: Uri, options?: { overwrite: boolean }): Thenable; } export namespace workspace { diff --git a/src/vs/workbench/api/browser/mainThreadFileSystem.ts b/src/vs/workbench/api/browser/mainThreadFileSystem.ts index 2f395fd03e4..5a52faf060e 100644 --- a/src/vs/workbench/api/browser/mainThreadFileSystem.ts +++ b/src/vs/workbench/api/browser/mainThreadFileSystem.ts @@ -86,29 +86,29 @@ export class MainThreadFileSystem implements MainThreadFileSystemShape { return (stat.isDirectory ? FileType.Directory : FileType.File) + (stat.isSymbolicLink ? FileType.SymbolicLink : 0); } - async $readFile(resource: UriComponents): Promise { - return (await this._fileService.readFile(URI.revive(resource))).value; + async $readFile(uri: UriComponents): Promise { + return (await this._fileService.readFile(URI.revive(uri))).value; } - async $writeFile(resource: UriComponents, content: VSBuffer, opts: FileWriteOptions): Promise { + async $writeFile(uri: UriComponents, content: VSBuffer, opts: FileWriteOptions): Promise { //todo@joh honor opts - await this._fileService.writeFile(URI.revive(resource), content, {}); + await this._fileService.writeFile(URI.revive(uri), content, {}); } - async $rename(resource: UriComponents, target: UriComponents, opts: FileOverwriteOptions): Promise { - this._fileService.move(URI.revive(resource), URI.revive(target), opts.overwrite); + async $rename(source: UriComponents, target: UriComponents, opts: FileOverwriteOptions): Promise { + this._fileService.move(URI.revive(source), URI.revive(target), opts.overwrite); } - async $copy(resource: UriComponents, target: UriComponents, opts: FileOverwriteOptions): Promise { - this._fileService.copy(URI.revive(resource), URI.revive(target), opts.overwrite); + async $copy(source: UriComponents, target: UriComponents, opts: FileOverwriteOptions): Promise { + this._fileService.copy(URI.revive(source), URI.revive(target), opts.overwrite); } - async $mkdir(resource: UriComponents): Promise { - this._fileService.createFolder(URI.revive(resource)); + async $mkdir(uri: UriComponents): Promise { + this._fileService.createFolder(URI.revive(uri)); } - async $delete(resource: UriComponents, opts: FileDeleteOptions): Promise { - this._fileService.del(URI.revive(resource), opts); + async $delete(uri: UriComponents, opts: FileDeleteOptions): Promise { + this._fileService.del(URI.revive(uri), opts); } } From 50fc8fd24293007f29ca47b490ee3b4a360be80a Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Fri, 21 Jun 2019 11:36:56 +0200 Subject: [PATCH 0513/1449] Tasks registration + the local ext host now has an autority Part of https://github.com/microsoft/vscode-remote-release/issues/757 --- src/vs/workbench/api/node/extHost.api.impl.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 88181549613..f970b136e80 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -125,7 +125,8 @@ export function createApiFactory( const extHostProgress = rpcProtocol.set(ExtHostContext.ExtHostProgress, new ExtHostProgress(rpcProtocol.getProxy(MainContext.MainThreadProgress))); const extHostOutputService = rpcProtocol.set(ExtHostContext.ExtHostOutputService, new ExtHostOutputService(LogOutputChannelFactory, initData.logsLocation, rpcProtocol)); rpcProtocol.set(ExtHostContext.ExtHostStorage, extHostStorage); - if (initData.remote.authority) { + + if (initData.remote.isRemote && initData.remote.authority) { extHostTask.registerTaskSystem(Schemas.vscodeRemote, { scheme: Schemas.vscodeRemote, authority: initData.remote.authority, From 648b2d5ddf0660a51ae2e4d83c059c7ea5635ba9 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Fri, 21 Jun 2019 11:38:55 +0200 Subject: [PATCH 0514/1449] Add platform override to getDefaultShellAndArgs in terminal Part of https://github.com/microsoft/vscode-remote-release/issues/757 --- .../contrib/tasks/browser/terminalTaskSystem.ts | 2 +- .../workbench/contrib/terminal/browser/terminal.ts | 4 ++-- .../electron-browser/terminalInstanceService.ts | 12 +++++++----- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts index a481fcc0f69..38c4ba18efc 100644 --- a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts @@ -778,7 +778,7 @@ export class TerminalTaskSystem implements ITaskSystem { let terminalName = this.createTerminalName(task); let originalCommand = task.command.name; if (isShellCommand) { - const defaultConfig = await this.terminalInstanceService.getDefaultShellAndArgs(); + const defaultConfig = await this.terminalInstanceService.getDefaultShellAndArgs(platform); shellLaunchConfig = { name: terminalName, executable: defaultConfig.shell, args: defaultConfig.args, waitOnExit }; let shellSpecified: boolean = false; let shellOptions: ShellConfiguration | undefined = task.command.options && task.command.options.shell; diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.ts b/src/vs/workbench/contrib/terminal/browser/terminal.ts index 312ea61b5d6..c9e3bdb74a3 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -8,7 +8,7 @@ import { WebLinksAddon as XTermWebLinksAddon } from 'xterm-addon-web-links'; import { SearchAddon as XTermSearchAddon } from 'xterm-addon-search'; import { ITerminalInstance, IWindowsShellHelper, ITerminalConfigHelper, ITerminalChildProcess, IShellLaunchConfig, IDefaultShellAndArgsRequest } from 'vs/workbench/contrib/terminal/common/terminal'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { IProcessEnvironment } from 'vs/base/common/platform'; +import { IProcessEnvironment, Platform } from 'vs/base/common/platform'; import { Event } from 'vs/base/common/event'; export const ITerminalInstanceService = createDecorator('terminalInstanceService'); @@ -30,7 +30,7 @@ export interface ITerminalInstanceService { createWindowsShellHelper(shellProcessId: number, instance: ITerminalInstance, xterm: XTermTerminal): IWindowsShellHelper; createTerminalProcess(shellLaunchConfig: IShellLaunchConfig, cwd: string, cols: number, rows: number, env: IProcessEnvironment, windowsEnableConpty: boolean): ITerminalChildProcess; - getDefaultShellAndArgs(): Promise<{ shell: string, args: string[] | string | undefined }>; + getDefaultShellAndArgs(platformOverride?: Platform): Promise<{ shell: string, args: string[] | string | undefined }>; getMainProcessParentEnv(): Promise; } diff --git a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts index 7b3a08d1978..d725545794d 100644 --- a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts @@ -7,7 +7,7 @@ import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/ import { ITerminalInstance, IWindowsShellHelper, IShellLaunchConfig, ITerminalChildProcess, IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY } from 'vs/workbench/contrib/terminal/common/terminal'; import { WindowsShellHelper } from 'vs/workbench/contrib/terminal/node/windowsShellHelper'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IProcessEnvironment, isLinux, isMacintosh, isWindows, platform } from 'vs/base/common/platform'; +import { IProcessEnvironment, isLinux, isMacintosh, isWindows, platform, Platform } from 'vs/base/common/platform'; import { TerminalProcess } from 'vs/workbench/contrib/terminal/node/terminalProcess'; import { getSystemShell } from 'vs/workbench/contrib/terminal/node/terminal'; import { Terminal as XTermTerminal } from 'xterm'; @@ -68,18 +68,20 @@ export class TerminalInstanceService implements ITerminalInstanceService { return this._storageService.getBoolean(IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY, StorageScope.WORKSPACE, false); } - public getDefaultShellAndArgs(): Promise<{ shell: string, args: string[] | string | undefined }> { + public getDefaultShellAndArgs(platformOverride: Platform = platform): Promise<{ shell: string, args: string[] | undefined }> { const isWorkspaceShellAllowed = this._isWorkspaceShellAllowed(); const shell = getDefaultShell( (key) => this._configurationService.inspect(key), isWorkspaceShellAllowed, - getSystemShell(platform), + getSystemShell(platformOverride), process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432'), - process.env.windir + process.env.windir, + platformOverride ); const args = getDefaultShellArgs( (key) => this._configurationService.inspect(key), - isWorkspaceShellAllowed + isWorkspaceShellAllowed, + platformOverride ); return Promise.resolve({ shell, args }); } From 94e7cd9cb6908e054379835253f0c6c3cfc76427 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Fri, 21 Jun 2019 12:03:35 +0200 Subject: [PATCH 0515/1449] Ensure no trailing path separtor on URIs from file picker Part of #75847 --- src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts b/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts index 73aa2adcd4e..d40fb379306 100644 --- a/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts +++ b/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts @@ -242,6 +242,9 @@ export class RemoteFileDialog { this.filePickBox.items = []; function doResolve(dialog: RemoteFileDialog, uri: URI | undefined) { + if (uri) { + uri = resources.removeTrailingPathSeparator(uri); + } resolve(uri); dialog.contextKey.set(false); dialog.filePickBox.dispose(); From 59e2699376ac8b065e0145d2b40c2011f85bcf7a Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 21 Jun 2019 12:41:18 +0200 Subject: [PATCH 0516/1449] data tree view state should store scrollTop, #74410 --- src/vs/base/browser/ui/tree/dataTree.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/vs/base/browser/ui/tree/dataTree.ts b/src/vs/base/browser/ui/tree/dataTree.ts index d2342d7e85b..bb93ca31fad 100644 --- a/src/vs/base/browser/ui/tree/dataTree.ts +++ b/src/vs/base/browser/ui/tree/dataTree.ts @@ -18,6 +18,7 @@ export interface IDataTreeViewState { readonly focus: string[]; readonly selection: string[]; readonly expanded: string[]; + readonly scrollTop: number; } export class DataTree extends AbstractTree { @@ -80,6 +81,10 @@ export class DataTree extends AbstractTree extends AbstractTree Date: Fri, 21 Jun 2019 12:54:56 +0200 Subject: [PATCH 0517/1449] fix #75564 --- .../parts/editor/breadcrumbsControl.ts | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts index 6590a90c12c..12d9ee5b662 100644 --- a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts +++ b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts @@ -609,6 +609,42 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ widget.focusPrev(); } }); +KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: 'breadcrumbs.focusNextWithPicker', + weight: KeybindingWeight.WorkbenchContrib + 1, + primary: KeyMod.CtrlCmd | KeyCode.RightArrow, + mac: { + primary: KeyMod.Alt | KeyCode.RightArrow, + }, + when: ContextKeyExpr.and(BreadcrumbsControl.CK_BreadcrumbsVisible, BreadcrumbsControl.CK_BreadcrumbsActive, WorkbenchListFocusContextKey), + handler(accessor) { + const groups = accessor.get(IEditorGroupsService); + const breadcrumbs = accessor.get(IBreadcrumbsService); + const widget = breadcrumbs.getWidget(groups.activeGroup.id); + if (!widget) { + return; + } + widget.focusNext(); + } +}); +KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: 'breadcrumbs.focusPrevious', + weight: KeybindingWeight.WorkbenchContrib + 1, + primary: KeyMod.CtrlCmd | KeyCode.LeftArrow, + mac: { + primary: KeyMod.Alt | KeyCode.LeftArrow, + }, + when: ContextKeyExpr.and(BreadcrumbsControl.CK_BreadcrumbsVisible, BreadcrumbsControl.CK_BreadcrumbsActive, WorkbenchListFocusContextKey), + handler(accessor) { + const groups = accessor.get(IEditorGroupsService); + const breadcrumbs = accessor.get(IBreadcrumbsService); + const widget = breadcrumbs.getWidget(groups.activeGroup.id); + if (!widget) { + return; + } + widget.focusPrev(); + } +}); KeybindingsRegistry.registerCommandAndKeybindingRule({ id: 'breadcrumbs.selectFocused', weight: KeybindingWeight.WorkbenchContrib, From b40dbda0bdd89b34ddb3881f7fc0dce2d9e3ef4e Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Fri, 21 Jun 2019 13:01:01 +0200 Subject: [PATCH 0518/1449] Change promise structure of creating terminal in tasks Potential fix for #75774 --- .../tasks/browser/terminalTaskSystem.ts | 176 +++++++++--------- 1 file changed, 85 insertions(+), 91 deletions(-) diff --git a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts index a481fcc0f69..a7cb73817bb 100644 --- a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts @@ -513,69 +513,69 @@ export class TerminalTaskSystem implements ITaskSystem { let executedCommand: string | undefined = undefined; let error: TaskError | undefined = undefined; let promise: Promise | undefined = undefined; - let terminalPromise: Promise | undefined = undefined; if (task.configurationProperties.isBackground) { - terminalPromise = new Promise(async (resolveTerminal) => { - [terminal, executedCommand, error] = await this.createTerminal(task, resolver); - resolveTerminal(); - }); - promise = new Promise(async (resolve, reject) => { - const problemMatchers = this.resolveMatchers(resolver, task.configurationProperties.problemMatchers); - let watchingProblemMatcher = new WatchingProblemCollector(problemMatchers, this.markerService, this.modelService, this.fileService); - let toDispose: IDisposable[] | undefined = []; - let eventCounter: number = 0; - toDispose.push(watchingProblemMatcher.onDidStateChange((event) => { - if (event.kind === ProblemCollectorEventKind.BackgroundProcessingBegins) { - eventCounter++; - this._onDidStateChange.fire(TaskEvent.create(TaskEventKind.Active, task)); - } else if (event.kind === ProblemCollectorEventKind.BackgroundProcessingEnds) { - eventCounter--; - this._onDidStateChange.fire(TaskEvent.create(TaskEventKind.Inactive, task)); - if (eventCounter === 0) { - if ((watchingProblemMatcher.numberOfMatches > 0) && watchingProblemMatcher.maxMarkerSeverity && - (watchingProblemMatcher.maxMarkerSeverity >= MarkerSeverity.Error)) { - let reveal = task.command.presentation!.reveal; - let revealProblems = task.command.presentation!.revealProblems; - if (revealProblems === RevealProblemKind.OnProblem) { - this.panelService.openPanel(Constants.MARKERS_PANEL_ID, true); - } else if (reveal === RevealKind.Silent) { - this.terminalService.setActiveInstance(terminal!); - this.terminalService.showPanel(false); - } + const problemMatchers = this.resolveMatchers(resolver, task.configurationProperties.problemMatchers); + let watchingProblemMatcher = new WatchingProblemCollector(problemMatchers, this.markerService, this.modelService, this.fileService); + let toDispose: IDisposable[] | undefined = []; + let eventCounter: number = 0; + toDispose.push(watchingProblemMatcher.onDidStateChange((event) => { + if (event.kind === ProblemCollectorEventKind.BackgroundProcessingBegins) { + eventCounter++; + this._onDidStateChange.fire(TaskEvent.create(TaskEventKind.Active, task)); + } else if (event.kind === ProblemCollectorEventKind.BackgroundProcessingEnds) { + eventCounter--; + this._onDidStateChange.fire(TaskEvent.create(TaskEventKind.Inactive, task)); + if (eventCounter === 0) { + if ((watchingProblemMatcher.numberOfMatches > 0) && watchingProblemMatcher.maxMarkerSeverity && + (watchingProblemMatcher.maxMarkerSeverity >= MarkerSeverity.Error)) { + let reveal = task.command.presentation!.reveal; + let revealProblems = task.command.presentation!.revealProblems; + if (revealProblems === RevealProblemKind.OnProblem) { + this.panelService.openPanel(Constants.MARKERS_PANEL_ID, true); + } else if (reveal === RevealKind.Silent) { + this.terminalService.setActiveInstance(terminal!); + this.terminalService.showPanel(false); } } } - })); - watchingProblemMatcher.aboutToStart(); - let delayer: Async.Delayer | undefined = undefined; - await terminalPromise; - if (error || !terminal) { - return; } - let processStartedSignaled = false; - terminal.processReady.then(() => { - if (!processStartedSignaled) { - if (task.command.runtime !== RuntimeType.CustomExecution) { - this._onDidStateChange.fire(TaskEvent.create(TaskEventKind.ProcessStarted, task, terminal!.processId!)); - } - processStartedSignaled = true; + })); + watchingProblemMatcher.aboutToStart(); + let delayer: Async.Delayer | undefined = undefined; + [terminal, executedCommand, error] = await this.createTerminal(task, resolver); + + if (error) { + return Promise.reject(new Error((error).message)); + } + if (!terminal) { + return Promise.reject(new Error(`Failed to create terminal for task ${task._label}`)); + } + + let processStartedSignaled = false; + terminal.processReady.then(() => { + if (!processStartedSignaled) { + if (task.command.runtime !== RuntimeType.CustomExecution) { + this._onDidStateChange.fire(TaskEvent.create(TaskEventKind.ProcessStarted, task, terminal!.processId!)); } - }, (_error) => { - // The process never got ready. Need to think how to handle this. + processStartedSignaled = true; + } + }, (_error) => { + // The process never got ready. Need to think how to handle this. + }); + this._onDidStateChange.fire(TaskEvent.create(TaskEventKind.Start, task, terminal.id)); + const registeredLinkMatchers = this.registerLinkMatchers(terminal, problemMatchers); + const onData = terminal.onLineData((line) => { + watchingProblemMatcher.processLine(line); + if (!delayer) { + delayer = new Async.Delayer(3000); + } + delayer.trigger(() => { + watchingProblemMatcher.forceDelivery(); + delayer = undefined; }); - this._onDidStateChange.fire(TaskEvent.create(TaskEventKind.Start, task, terminal.id)); - const registeredLinkMatchers = this.registerLinkMatchers(terminal, problemMatchers); - const onData = terminal.onLineData((line) => { - watchingProblemMatcher.processLine(line); - if (!delayer) { - delayer = new Async.Delayer(3000); - } - delayer.trigger(() => { - watchingProblemMatcher.forceDelivery(); - delayer = undefined; - }); - }); - const onExit = terminal.onExit((exitCode) => { + }); + promise = new Promise((resolve, reject) => { + const onExit = terminal!.onExit((exitCode) => { onData.dispose(); onExit.dispose(); let key = task.getMapKey(); @@ -622,36 +622,36 @@ export class TerminalTaskSystem implements ITaskSystem { }); }); } else { - terminalPromise = new Promise(async (resolveTerminal) => { - [terminal, executedCommand, error] = await this.createTerminal(task, resolver); - resolveTerminal(); - }); - promise = new Promise(async (resolve, reject) => { - await terminalPromise; - if (!terminal || error) { - return; - } + [terminal, executedCommand, error] = await this.createTerminal(task, resolver); - let processStartedSignaled = false; - terminal.processReady.then(() => { - if (!processStartedSignaled) { - if (task.command.runtime !== RuntimeType.CustomExecution) { - this._onDidStateChange.fire(TaskEvent.create(TaskEventKind.ProcessStarted, task, terminal!.processId!)); - } - processStartedSignaled = true; + if (error) { + return Promise.reject(new Error((error).message)); + } + if (!terminal) { + return Promise.reject(new Error(`Failed to create terminal for task ${task._label}`)); + } + + let processStartedSignaled = false; + terminal.processReady.then(() => { + if (!processStartedSignaled) { + if (task.command.runtime !== RuntimeType.CustomExecution) { + this._onDidStateChange.fire(TaskEvent.create(TaskEventKind.ProcessStarted, task, terminal!.processId!)); } - }, (_error) => { - // The process never got ready. Need to think how to handle this. - }); - this._onDidStateChange.fire(TaskEvent.create(TaskEventKind.Start, task, terminal.id)); - this._onDidStateChange.fire(TaskEvent.create(TaskEventKind.Active, task)); - let problemMatchers = this.resolveMatchers(resolver, task.configurationProperties.problemMatchers); - let startStopProblemMatcher = new StartStopProblemCollector(problemMatchers, this.markerService, this.modelService, ProblemHandlingStrategy.Clean, this.fileService); - const registeredLinkMatchers = this.registerLinkMatchers(terminal, problemMatchers); - const onData = terminal.onLineData((line) => { - startStopProblemMatcher.processLine(line); - }); - const onExit = terminal.onExit((exitCode) => { + processStartedSignaled = true; + } + }, (_error) => { + // The process never got ready. Need to think how to handle this. + }); + this._onDidStateChange.fire(TaskEvent.create(TaskEventKind.Start, task, terminal.id)); + this._onDidStateChange.fire(TaskEvent.create(TaskEventKind.Active, task)); + let problemMatchers = this.resolveMatchers(resolver, task.configurationProperties.problemMatchers); + let startStopProblemMatcher = new StartStopProblemCollector(problemMatchers, this.markerService, this.modelService, ProblemHandlingStrategy.Clean, this.fileService); + const registeredLinkMatchers = this.registerLinkMatchers(terminal, problemMatchers); + const onData = terminal.onLineData((line) => { + startStopProblemMatcher.processLine(line); + }); + promise = new Promise((resolve, reject) => { + const onExit = terminal!.onExit((exitCode) => { onData.dispose(); onExit.dispose(); let key = task.getMapKey(); @@ -698,13 +698,7 @@ export class TerminalTaskSystem implements ITaskSystem { }); }); } - await terminalPromise; - if (error) { - return Promise.reject(new Error((error).message)); - } - if (!terminal) { - return Promise.reject(new Error(`Failed to create terminal for task ${task._label}`)); - } + let showProblemPanel = task.command.presentation && (task.command.presentation.revealProblems === RevealProblemKind.Always); if (showProblemPanel) { this.panelService.openPanel(Constants.MARKERS_PANEL_ID); From 2955dbfa8efaa1cb51c00be72fb1761f0e54fbd1 Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 21 Jun 2019 16:01:47 +0200 Subject: [PATCH 0519/1449] do not allow additionalProperties #75887 --- src/vs/workbench/contrib/debug/common/debugSchemas.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/debug/common/debugSchemas.ts b/src/vs/workbench/contrib/debug/common/debugSchemas.ts index 9cd391a66f6..6eaa73a2838 100644 --- a/src/vs/workbench/contrib/debug/common/debugSchemas.ts +++ b/src/vs/workbench/contrib/debug/common/debugSchemas.ts @@ -17,8 +17,9 @@ export const debuggersExtPoint = extensionsRegistry.ExtensionsRegistry.registerE jsonSchema: { description: nls.localize('vscode.extension.contributes.debuggers', 'Contributes debug adapters.'), type: 'array', - defaultSnippets: [{ body: [{ type: '', extensions: [] }] }], + defaultSnippets: [{ body: [{ type: '' }] }], items: { + additionalProperties: false, type: 'object', defaultSnippets: [{ body: { type: '', program: '', runtime: '', enableBreakpointsFor: { languageIds: [''] } } }], properties: { @@ -118,6 +119,7 @@ export const breakpointsExtPoint = extensionsRegistry.ExtensionsRegistry.registe defaultSnippets: [{ body: [{ language: '' }] }], items: { type: 'object', + additionalProperties: false, defaultSnippets: [{ body: { language: '' } }], properties: { language: { From ec3d81812cac278d0821baed6b1a476619929d29 Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 21 Jun 2019 16:45:02 +0200 Subject: [PATCH 0520/1449] explorer: roots forget children on new file system provider registration #75720 --- src/vs/workbench/contrib/files/common/explorerService.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/contrib/files/common/explorerService.ts b/src/vs/workbench/contrib/files/common/explorerService.ts index 494351a4274..cb6d96bd1ff 100644 --- a/src/vs/workbench/contrib/files/common/explorerService.ts +++ b/src/vs/workbench/contrib/files/common/explorerService.ts @@ -102,6 +102,7 @@ export class ExplorerService implements IExplorerService { this.disposables.push(this.fileService.onDidChangeFileSystemProviderRegistrations(e => { if (e.added && this.fileSystemProviderSchemes.has(e.scheme)) { // A file system provider got re-registered, we should update all file stats since they might change (got read-only) + this.model.roots.forEach(r => r.forgetChildren()); this._onDidChangeItem.fire({ recursive: true }); } else { this.fileSystemProviderSchemes.add(e.scheme); From 7583fe8aa48ae3c50a3c6f1f497506c7bcd9c010 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Fri, 21 Jun 2019 11:35:42 -0700 Subject: [PATCH 0521/1449] Update max tokenization limit without reload --- .../services/textMate/browser/abstractTextMateService.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts b/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts index 316a6f97a50..e25b10d9696 100644 --- a/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts +++ b/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts @@ -462,6 +462,11 @@ class TMTokenization implements ITokenizationSupport { this._containsEmbeddedLanguages = containsEmbeddedLanguages; this._seenLanguages = []; this._maxTokenizationLineLength = configurationService.getValue('editor.maxTokenizationLineLength'); + configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration('editor.maxTokenizationLineLength')) { + this._maxTokenizationLineLength = configurationService.getValue('editor.maxTokenizationLineLength'); + } + }); } public getInitialState(): IState { From f90a0abe02b932182bd72d689ce5dd0836583493 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Fri, 21 Jun 2019 12:03:26 -0700 Subject: [PATCH 0522/1449] Use interfaces for keyboard layout registration --- .../browser/keyboardLayouts/_.contribution.ts | 6 +++--- .../keybinding/browser/keyboardLayouts/cz.win.ts | 11 +++++------ .../browser/keyboardLayouts/de-swiss.win.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/de.darwin.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/de.linux.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/de.win.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/dk.win.ts | 12 ++++++------ .../browser/keyboardLayouts/en-belgian.win.ts | 12 ++++++------ .../browser/keyboardLayouts/en-ext.darwin.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/en-in.win.ts | 12 ++++++------ .../browser/keyboardLayouts/en-intl.darwin.ts | 12 ++++++------ .../browser/keyboardLayouts/en-intl.win.ts | 12 ++++++------ .../browser/keyboardLayouts/en-uk.darwin.ts | 12 +++++------- .../keybinding/browser/keyboardLayouts/en-uk.win.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/en.darwin.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/en.linux.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/en.win.ts | 12 ++++++------ .../browser/keyboardLayouts/es-latin.win.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/es.darwin.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/es.linux.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/es.win.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/fr.darwin.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/fr.linux.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/fr.win.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/hu.win.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/it.darwin.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/it.win.ts | 12 ++++++------ .../browser/keyboardLayouts/jp-roman.darwin.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/jp.darwin.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/ko.darwin.ts | 12 +++++------- .../keybinding/browser/keyboardLayouts/no.win.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/pl.darwin.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/pl.win.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/pt-br.win.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/pt.darwin.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/pt.win.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/ru.darwin.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/ru.linux.ts | 13 ++++++------- .../keybinding/browser/keyboardLayouts/ru.win.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/sv.darwin.ts | 12 ++++++------ .../keybinding/browser/keyboardLayouts/sv.win.ts | 13 ++++++------- .../keybinding/browser/keyboardLayouts/thai.win.ts | 11 +++++------ .../keybinding/browser/keyboardLayouts/tr.win.ts | 11 +++++------ .../browser/keyboardLayouts/zh-hans.darwin.ts | 12 +++++------- .../services/keybinding/browser/keymapService.ts | 5 +++-- .../services/keybinding/common/keymapInfo.ts | 7 +++++++ 46 files changed, 265 insertions(+), 268 deletions(-) diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution.ts index 846b6023774..89ef892047a 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution.ts @@ -3,12 +3,12 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; +import { IKeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; export class KeyboardLayoutContribution { public static readonly INSTANCE: KeyboardLayoutContribution = new KeyboardLayoutContribution(); - private _layoutInfos: KeymapInfo[] = []; + private _layoutInfos: IKeymapInfo[] = []; get layoutInfos() { return this._layoutInfos; @@ -17,7 +17,7 @@ export class KeyboardLayoutContribution { private constructor() { } - registerKeyboardLayout(layout: KeymapInfo) { + registerKeyboardLayout(layout: IKeymapInfo) { this._layoutInfos.push(layout); } } \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/cz.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/cz.win.ts index 8d560875c61..c187c923cec 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/cz.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/cz.win.ts @@ -4,12 +4,11 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( - { name: '00000405', id: '', text: 'Czech' }, - [], - { +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { name: '00000405', id: '', text: 'Czech' }, + secondaryLayouts: [], + mapping: { Sleep: [], WakeUp: [], KeyA: ['a', 'A', '', '', 0, 'VK_A'], @@ -166,4 +165,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( BrowserRefresh: [], BrowserFavorites: [] } -))); +}); diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de-swiss.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de-swiss.win.ts index b7d6467220a..b19d2935e66 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de-swiss.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de-swiss.win.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( - { name: '00000807', id: '', text: 'Swiss German' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { name: '00000807', id: '', text: 'Swiss German' }, + secondaryLayouts: [], + mapping: { Sleep: [], WakeUp: [], KeyA: ['a', 'A', '', '', 0, 'VK_A'], @@ -166,4 +166,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( BrowserRefresh: [], BrowserFavorites: [] } -))); +}); diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.darwin.ts index 6e870e8c472..33d2f5d5e32 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.darwin.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.keylayout.German', lang: 'de', localizedName: 'German' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { id: 'com.apple.keylayout.German', lang: 'de', localizedName: 'German' }, + secondaryLayouts: [], + mapping: { KeyA: ['a', 'A', 'å', 'Å', 0], KeyB: ['b', 'B', '∫', '‹', 0], KeyC: ['c', 'C', 'ç', 'Ç', 0], @@ -129,4 +129,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( AltRight: [], MetaRight: [] } -)); +}); diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.linux.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.linux.ts index 2f7f85af3ca..b4675240ef0 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.linux.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.linux.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { model: 'pc104', layout: 'de', variant: '', options: '', rules: 'base' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { model: 'pc104', layout: 'de', variant: '', options: '', rules: 'base' }, + secondaryLayouts: [], + mapping: { Sleep: [], WakeUp: [], KeyA: ['a', 'A', 'æ', 'Æ', 0], @@ -184,4 +184,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( MailForward: [], MailSend: [] } -)); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.win.ts index 0bf3c61618e..46bf5981a68 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/de.win.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( - { name: '00000407', id: '', text: 'German' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { name: '00000407', id: '', text: 'German' }, + secondaryLayouts: [], + mapping: { Sleep: [], WakeUp: [], KeyA: ['a', 'A', '', '', 0, 'VK_A'], @@ -166,4 +166,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( BrowserRefresh: [], BrowserFavorites: [] } -))); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/dk.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/dk.win.ts index 34f7f3103a7..b774622699c 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/dk.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/dk.win.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( - { name: '00000406', id: '', text: 'Danish' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { name: '00000406', id: '', text: 'Danish' }, + secondaryLayouts: [], + mapping: { Sleep: [], WakeUp: [], KeyA: ['a', 'A', '', '', 0, 'VK_A'], @@ -167,4 +167,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( BrowserFavorites: [] } -))); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-belgian.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-belgian.win.ts index 6e5cae52518..89e3a27892a 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-belgian.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-belgian.win.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( - { name: '00000813', id: '', text: 'Belgian (Period)' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { name: '00000813', id: '', text: 'Belgian (Period)' }, + secondaryLayouts: [], + mapping: { Sleep: [], WakeUp: [], KeyA: ['q', 'Q', '', '', 0, 'VK_Q'], @@ -166,4 +166,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( BrowserRefresh: [], BrowserFavorites: [] } -))); +}); diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-ext.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-ext.darwin.ts index 688281af2be..a12a2338bff 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-ext.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-ext.darwin.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.keylayout.USExtended', lang: 'en', localizedName: 'ABC - Extended' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { id: 'com.apple.keylayout.USExtended', lang: 'en', localizedName: 'ABC - Extended' }, + secondaryLayouts: [], + mapping: { KeyA: ['a', 'A', '¯', '̄', 4], KeyB: ['b', 'B', '˘', '̆', 4], KeyC: ['c', 'C', '¸', '̧', 4], @@ -129,4 +129,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( AltRight: [], MetaRight: [] } -)); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-in.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-in.win.ts index d3ad3786dcb..a1786f42061 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-in.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-in.win.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( - { name: '00004009', id: '', text: 'India' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { name: '00004009', id: '', text: 'India' }, + secondaryLayouts: [], + mapping: { Sleep: [], WakeUp: [], KeyA: ['a', 'A', 'ā', 'Ā', 0, 'VK_A'], @@ -166,4 +166,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( BrowserRefresh: [], BrowserFavorites: [] } -))); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-intl.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-intl.darwin.ts index a4f4a9e10b1..ceb7b67a878 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-intl.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-intl.darwin.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.keylayout.USInternational-PC', lang: 'en', localizedName: 'U.S. International - PC' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { id: 'com.apple.keylayout.USInternational-PC', lang: 'en', localizedName: 'U.S. International - PC' }, + secondaryLayouts: [], + mapping: { KeyA: ['a', 'A', 'å', 'Å', 0], KeyB: ['b', 'B', '∫', 'ı', 0], KeyC: ['c', 'C', 'ç', 'Ç', 0], @@ -129,4 +129,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( AltRight: [], MetaRight: [] } -)); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-intl.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-intl.win.ts index ce5ade144e2..75a2a40b805 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-intl.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-intl.win.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( - { name: '00020409', id: '0001', text: 'United States-International' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { name: '00020409', id: '0001', text: 'United States-International' }, + secondaryLayouts: [], + mapping: { Sleep: [], WakeUp: [], KeyA: ['a', 'A', 'á', 'Á', 0, 'VK_A'], @@ -166,4 +166,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( BrowserRefresh: [], BrowserFavorites: [] } -))); +}); diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-uk.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-uk.darwin.ts index 4bebc424b1f..89236337707 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-uk.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-uk.darwin.ts @@ -4,13 +4,11 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - - { id: 'com.apple.keylayout.British', lang: 'en', localizedName: 'British' }, - [], - { +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { id: 'com.apple.keylayout.British', lang: 'en', localizedName: 'British' }, + secondaryLayouts: [], + mapping: { KeyA: ['a', 'A', 'å', 'Å', 0], KeyB: ['b', 'B', '∫', 'ı', 0], KeyC: ['c', 'C', 'ç', 'Ç', 0], @@ -130,4 +128,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( AltRight: [], MetaRight: [] } -)); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-uk.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-uk.win.ts index d3aa6995fb9..0b07025fa88 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-uk.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en-uk.win.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( - { name: '00000809', id: '', text: 'United Kingdom' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { name: '00000809', id: '', text: 'United Kingdom' }, + secondaryLayouts: [], + mapping: { Sleep: [], WakeUp: [], KeyA: ['a', 'A', 'á', 'Á', 0, 'VK_A'], @@ -167,4 +167,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( BrowserFavorites: [] } -))); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.darwin.ts index ee78fd8254d..f0fca4a9d74 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.darwin.ts @@ -4,11 +4,11 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.keylayout.US', lang: 'en', localizedName: 'U.S.', isUSStandard: true }, - [ + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { id: 'com.apple.keylayout.US', lang: 'en', localizedName: 'U.S.', isUSStandard: true }, + secondaryLayouts: [ { id: 'com.apple.keylayout.ABC', lang: 'en', localizedName: 'ABC' }, { id: 'com.sogou.inputmethod.sogou.pinyin', lang: 'zh-Hans', localizedName: 'Pinyin - Simplified' }, { id: 'com.apple.inputmethod.Kotoeri.Roman', lang: 'en', localizedName: 'Romaji' }, @@ -17,7 +17,7 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( { id: 'com.apple.keylayout.Canadian', lang: 'en', localizedName: 'Canadian English' }, { id: 'com.apple.keylayout.Brazilian', lang: 'pt', localizedName: 'Brazilian' }, ], - { + mapping: { KeyA: ['a', 'A', 'å', 'Å', 0], KeyB: ['b', 'B', '∫', 'ı', 0], KeyC: ['c', 'C', 'ç', 'Ç', 0], @@ -137,4 +137,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( AltRight: [], MetaRight: [] } -)); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.linux.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.linux.ts index 1ea1d427390..571e9164e15 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.linux.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.linux.ts @@ -4,14 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { model: 'pc105', layout: 'us', variant: '', options: '', rules: 'evdev', isUSStandard: true }, - [ + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { model: 'pc105', layout: 'us', variant: '', options: '', rules: 'evdev', isUSStandard: true }, + secondaryLayouts: [ { model: 'pc105', layout: 'cn', variant: '', options: '', rules: 'evdev' }, ], - { + mapping: { Sleep: [], WakeUp: [], KeyA: ['a', 'A', 'a', 'A', 0], @@ -187,4 +187,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( MailSend: [] } -)); +}); diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.win.ts index be1ca6ff8b8..3d6845dc053 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/en.win.ts @@ -4,17 +4,17 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( - { name: '00000409', id: '', text: 'US', isUSStandard: true }, - [ + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { name: '00000409', id: '', text: 'US', isUSStandard: true }, + secondaryLayouts: [ { name: '00000804', id: '', text: 'Chinese (Simplified) - US Keyboard' }, { name: '00000411', id: '', text: 'Japanese' }, { name: '00000412', id: '', text: 'Korean' }, { name: '00000404', id: '', text: 'Chinese (Traditional) - US Keyboard' } ], - { + mapping: { Sleep: [], WakeUp: [], KeyA: ['a', 'A', '', '', 0, 'VK_A'], @@ -171,4 +171,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( BrowserRefresh: [], BrowserFavorites: [] } -))); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es-latin.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es-latin.win.ts index 6234c454280..16531eda212 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es-latin.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es-latin.win.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( - { name: '0000080A', id: '', text: 'Latin American' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { name: '0000080A', id: '', text: 'Latin American' }, + secondaryLayouts: [], + mapping: { Sleep: [], WakeUp: [], KeyA: ['a', 'A', '', '', 0, 'VK_A'], @@ -167,4 +167,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( BrowserFavorites: [] } -))); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.darwin.ts index a7b3986364b..679dfb36d08 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.darwin.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.keylayout.Spanish-ISO', lang: 'es', localizedName: 'Spanish - ISO' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { id: 'com.apple.keylayout.Spanish-ISO', lang: 'es', localizedName: 'Spanish - ISO' }, + secondaryLayouts: [], + mapping: { KeyA: ['a', 'A', 'å', 'Å', 0], KeyB: ['b', 'B', 'ß', '', 0], KeyC: ['c', 'C', '©', ' ', 0], @@ -129,4 +129,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( AltRight: [], MetaRight: [] } -)); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.linux.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.linux.ts index 1b4f4d94858..8fcff46f8d6 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.linux.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.linux.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { model: 'pc105', layout: 'es', variant: '', options: '', rules: 'evdev' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { model: 'pc105', layout: 'es', variant: '', options: '', rules: 'evdev' }, + secondaryLayouts: [], + mapping: { Sleep: [], WakeUp: [], KeyA: ['a', 'A', 'æ', 'Æ', 0], @@ -184,4 +184,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( MailForward: [], MailSend: [] } -)); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.win.ts index 8fea58dc872..3ac96a5dc59 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/es.win.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( - { name: '0000040A', id: '', text: 'Spanish' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { name: '0000040A', id: '', text: 'Spanish' }, + secondaryLayouts: [], + mapping: { Sleep: [], WakeUp: [], KeyA: ['a', 'A', '', '', 0, 'VK_A'], @@ -166,4 +166,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( BrowserRefresh: [], BrowserFavorites: [] } -))); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.darwin.ts index 6bc78c8a2b2..fa9198b64a0 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.darwin.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.keylayout.French', lang: 'fr', localizedName: 'French' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { id: 'com.apple.keylayout.French', lang: 'fr', localizedName: 'French' }, + secondaryLayouts: [], + mapping: { KeyA: ['q', 'Q', '‡', 'Ω', 0], KeyB: ['b', 'B', 'ß', '∫', 0], KeyC: ['c', 'C', '©', '¢', 0], @@ -129,4 +129,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( AltRight: [], MetaRight: [] } -)); +}); diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.linux.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.linux.ts index 7c857332595..dc9488f28c3 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.linux.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.linux.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { model: 'pc104', layout: 'fr', variant: '', options: '', rules: 'base' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { model: 'pc104', layout: 'fr', variant: '', options: '', rules: 'base' }, + secondaryLayouts: [], + mapping: { Sleep: [], WakeUp: [], KeyA: ['q', 'Q', '@', 'Ω', 0], @@ -184,4 +184,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( MailForward: [], MailSend: [] } -)); +}); diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.win.ts index b056c38ff2d..c9f032d7bee 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/fr.win.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( - { name: '0000040C', id: '', text: 'French' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { name: '0000040C', id: '', text: 'French' }, + secondaryLayouts: [], + mapping: { Sleep: [], WakeUp: [], KeyA: ['q', 'Q', '', '', 0, 'VK_Q'], @@ -166,4 +166,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( BrowserRefresh: [], BrowserFavorites: [] } -))); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/hu.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/hu.win.ts index ebcce4786fd..d6b5a4dac06 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/hu.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/hu.win.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( - { name: '0000040E', id: '', text: 'Hungarian' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { name: '0000040E', id: '', text: 'Hungarian' }, + secondaryLayouts: [], + mapping: { Sleep: [], WakeUp: [], KeyA: ['a', 'A', 'ä', '', 0, 'VK_A'], @@ -166,4 +166,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( BrowserRefresh: [], BrowserFavorites: [] } -))); +}); diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/it.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/it.darwin.ts index 3d1c557e65e..1dc97d9903f 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/it.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/it.darwin.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.keylayout.Italian-Pro', lang: 'it', localizedName: 'Italian' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { id: 'com.apple.keylayout.Italian-Pro', lang: 'it', localizedName: 'Italian' }, + secondaryLayouts: [], + mapping: { KeyA: ['a', 'A', 'å', 'Å', 0], KeyB: ['b', 'B', '∫', 'Í', 0], KeyC: ['c', 'C', '©', 'Á', 0], @@ -129,4 +129,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( AltRight: [], MetaRight: [] } -)); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/it.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/it.win.ts index 1b0636f02ab..573b7b0c6c3 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/it.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/it.win.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( - { name: '00000410', id: '', text: 'Italian' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { name: '00000410', id: '', text: 'Italian' }, + secondaryLayouts: [], + mapping: { Sleep: [], WakeUp: [], KeyA: ['a', 'A', '', '', 0, 'VK_A'], @@ -166,4 +166,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( BrowserRefresh: [], BrowserFavorites: [] } -))); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/jp-roman.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/jp-roman.darwin.ts index 578a479dc7e..27328f3d87b 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/jp-roman.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/jp-roman.darwin.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.google.inputmethod.Japanese.Roman', lang: 'en', localizedName: 'Alphanumeric (Google)' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { id: 'com.google.inputmethod.Japanese.Roman', lang: 'en', localizedName: 'Alphanumeric (Google)' }, + secondaryLayouts: [], + mapping: { KeyA: ['a', 'A', '¯', '̄', 4], KeyB: ['b', 'B', '˘', '̆', 4], KeyC: ['c', 'C', '¸', '̧', 4], @@ -129,4 +129,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( AltRight: [], MetaRight: [] } -)); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/jp.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/jp.darwin.ts index 1835862116e..819f96ba5ca 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/jp.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/jp.darwin.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.inputmethod.Kotoeri.Japanese', lang: 'ja', localizedName: 'Hiragana' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { id: 'com.apple.inputmethod.Kotoeri.Japanese', lang: 'ja', localizedName: 'Hiragana' }, + secondaryLayouts: [], + mapping: { KeyA: ['a', 'A', 'å', 'Å', 0], KeyB: ['b', 'B', '∫', 'ı', 0], KeyC: ['c', 'C', 'ç', 'Ç', 0], @@ -129,4 +129,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( AltRight: [], MetaRight: [] } -)); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ko.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ko.darwin.ts index e767bd03dcd..4219a7bd62f 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ko.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ko.darwin.ts @@ -4,13 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.inputmethod.Korean.2SetKorean', lang: 'ko', localizedName: '2-Set Korean' }, - [], - { +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { id: 'com.apple.inputmethod.Korean.2SetKorean', lang: 'ko', localizedName: '2-Set Korean' }, + secondaryLayouts: [], + mapping: { KeyA: ['ㅁ', 'ㅁ', 'a', 'A', 0], KeyB: ['ㅠ', 'ㅠ', 'b', 'B', 0], KeyC: ['ㅊ', 'ㅊ', 'c', 'C', 0], @@ -130,5 +129,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( AltRight: [], MetaRight: [] } - -)); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/no.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/no.win.ts index 7183b0fbe9f..2c415e8ebff 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/no.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/no.win.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( - { name: '00000414', id: '', text: 'Norwegian' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { name: '00000414', id: '', text: 'Norwegian' }, + secondaryLayouts: [], + mapping: { Sleep: [], WakeUp: [], KeyA: ['a', 'A', '', '', 0, 'VK_A'], @@ -166,4 +166,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( BrowserRefresh: [], BrowserFavorites: [] } -))); +}); diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pl.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pl.darwin.ts index 8ae036710a2..57577ba513c 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pl.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pl.darwin.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.keylayout.PolishPro', lang: 'pl', localizedName: 'Polish - Pro' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { id: 'com.apple.keylayout.PolishPro', lang: 'pl', localizedName: 'Polish - Pro' }, + secondaryLayouts: [], + mapping: { KeyA: ['a', 'A', 'ą', 'Ą', 0], KeyB: ['b', 'B', 'ļ', 'ű', 0], KeyC: ['c', 'C', 'ć', 'Ć', 0], @@ -129,4 +129,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( AltRight: [], MetaRight: [] } -)); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pl.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pl.win.ts index 9d0576fc4f2..a110111a83f 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pl.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pl.win.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( - { name: '00000415', id: '', text: 'Polish (Programmers)' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { name: '00000415', id: '', text: 'Polish (Programmers)' }, + secondaryLayouts: [], + mapping: { Sleep: [], WakeUp: [], KeyA: ['a', 'A', 'ą', 'Ą', 0, 'VK_A'], @@ -166,4 +166,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( BrowserRefresh: [], BrowserFavorites: [] } -))); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt-br.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt-br.win.ts index b5886ffc968..9bb82448a7c 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt-br.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt-br.win.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( - { name: '00000416', id: '', text: 'Portuguese (Brazilian ABNT)' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { name: '00000416', id: '', text: 'Portuguese (Brazilian ABNT)' }, + secondaryLayouts: [], + mapping: { Sleep: [], WakeUp: [], KeyA: ['a', 'A', '', '', 0, 'VK_A'], @@ -167,4 +167,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( BrowserRefresh: [], BrowserFavorites: [] } -))); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt.darwin.ts index 9a0baec47d2..87435fdc0ea 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt.darwin.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.keylayout.Brazilian-Pro', lang: 'pt' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { id: 'com.apple.keylayout.Brazilian-Pro', lang: 'pt' }, + secondaryLayouts: [], + mapping: { KeyA: ['a', 'A', 'å', 'Å', 0], KeyB: ['b', 'B', '∫', 'ı', 0], KeyC: ['c', 'C', 'ç', 'Ç', 0], @@ -129,4 +129,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( AltRight: [], MetaRight: [] } -)); +}); diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt.win.ts index 2d1c72c89b9..456a537654b 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/pt.win.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( - { name: '00000816', id: '', text: 'Portuguese' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { name: '00000816', id: '', text: 'Portuguese' }, + secondaryLayouts: [], + mapping: { Sleep: [], WakeUp: [], KeyA: ['a', 'A', '', '', 0, 'VK_A'], @@ -167,4 +167,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( BrowserFavorites: [] } -))); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.darwin.ts index 9140df78e5c..5eea5ac38f5 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.darwin.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.keylayout.Russian', lang: 'ru', localizedName: 'Russian' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { id: 'com.apple.keylayout.Russian', lang: 'ru', localizedName: 'Russian' }, + secondaryLayouts: [], + mapping: { KeyA: ['ф', 'Ф', 'ƒ', 'ƒ', 0], KeyB: ['и', 'И', 'и', 'И', 0], KeyC: ['с', 'С', '≠', '≠', 0], @@ -129,4 +129,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( AltRight: [], MetaRight: [] } -)); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.linux.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.linux.ts index c086909149a..b13adb0d9ac 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.linux.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.linux.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { model: 'pc104', layout: 'ru', variant: ',', options: '', rules: 'base' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { model: 'pc104', layout: 'ru', variant: ',', options: '', rules: 'base' }, + secondaryLayouts: [], + mapping: { Sleep: [], WakeUp: [], KeyA: ['ф', 'Ф', 'ф', 'Ф', 0], @@ -184,5 +184,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( MailForward: [], MailSend: [] } - -)); +}); diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.win.ts index dfe753aacb0..0da492a10ac 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/ru.win.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( - { name: '00000419', id: '', text: 'Russian' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { name: '00000419', id: '', text: 'Russian' }, + secondaryLayouts: [], + mapping: { Sleep: [], WakeUp: [], KeyA: ['ф', 'Ф', '', '', 0, 'VK_A'], @@ -166,4 +166,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( BrowserRefresh: [], BrowserFavorites: [] } -))); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/sv.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/sv.darwin.ts index 2c5f6f3e582..6d80477a689 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/sv.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/sv.darwin.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.keylayout.Swedish-Pro', lang: 'sv', localizedName: 'Swedish - Pro' }, - [], - { + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { id: 'com.apple.keylayout.Swedish-Pro', lang: 'sv', localizedName: 'Swedish - Pro' }, + secondaryLayouts: [], + mapping: { KeyA: ['a', 'A', '', '◊', 0], KeyB: ['b', 'B', '›', '»', 0], KeyC: ['c', 'C', 'ç', 'Ç', 0], @@ -129,4 +129,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( AltRight: [], MetaRight: [] } -)); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/sv.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/sv.win.ts index 729d9a13bb0..c7128b5c929 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/sv.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/sv.win.ts @@ -4,14 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( - { name: '0000041D', id: '', text: 'Swedish' }, - [ + +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { name: '0000041D', id: '', text: 'Swedish' }, + secondaryLayouts: [ { name: '0000040B', id: '', text: 'Finnish' } ], - { + mapping: { Sleep: [], WakeUp: [], KeyA: ['a', 'A', '', '', 0, 'VK_A'], @@ -168,5 +168,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( BrowserRefresh: [], BrowserFavorites: [] } - -))); +}); diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/thai.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/thai.win.ts index 013b7ac64f7..be85bfedd9e 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/thai.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/thai.win.ts @@ -4,12 +4,11 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( - { name: '0000041E', id: '', text: 'Thai Kedmanee' }, - [], - { +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { name: '0000041E', id: '', text: 'Thai Kedmanee' }, + secondaryLayouts: [], + mapping: { Sleep: [], WakeUp: [], KeyA: ['ฟ', 'ฤ', '', '', 0, 'VK_A'], @@ -166,4 +165,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( BrowserRefresh: [], BrowserFavorites: [] } -))); +}); diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/tr.win.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/tr.win.ts index 058ef5592ae..955b03f5fc0 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/tr.win.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/tr.win.ts @@ -4,12 +4,11 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( - { name: '0000041F', id: '', text: 'Turkish Q' }, - [], - { +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { name: '0000041F', id: '', text: 'Turkish Q' }, + secondaryLayouts: [], + mapping: { Sleep: [], WakeUp: [], KeyA: ['a', 'A', 'æ', 'Æ', 0, 'VK_A'], @@ -166,4 +165,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout((new KeymapInfo( BrowserRefresh: [], BrowserFavorites: [] } -))); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/zh-hans.darwin.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/zh-hans.darwin.ts index df8e9252fa6..49d1f60ae0d 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayouts/zh-hans.darwin.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayouts/zh-hans.darwin.ts @@ -4,12 +4,11 @@ *--------------------------------------------------------------------------------------------*/ import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; -import { KeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; -KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( - { id: 'com.apple.inputmethod.SCIM.ITABC', lang: 'zh-Hans', localizedName: '搜狗拼音' }, - [], - { +KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout({ + layout: { id: 'com.apple.inputmethod.SCIM.ITABC', lang: 'zh-Hans', localizedName: '搜狗拼音' }, + secondaryLayouts: [], + mapping: { KeyA: ['a', 'A', 'å', 'Å', 0], KeyB: ['b', 'B', '∫', 'ı', 0], KeyC: ['c', 'C', 'ç', 'Ç', 0], @@ -129,5 +128,4 @@ KeyboardLayoutContribution.INSTANCE.registerKeyboardLayout(new KeymapInfo( AltRight: [], MetaRight: [] } - -)); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keymapService.ts b/src/vs/workbench/services/keybinding/browser/keymapService.ts index 83c78cc1664..13434bdb7bb 100644 --- a/src/vs/workbench/services/keybinding/browser/keymapService.ts +++ b/src/vs/workbench/services/keybinding/browser/keymapService.ts @@ -6,7 +6,7 @@ import * as nls from 'vs/nls'; import { Emitter, Event } from 'vs/base/common/event'; import { Disposable, toDisposable, IDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; -import { IKeymapService, IKeyboardLayoutInfo, IKeyboardMapping, IWindowsKeyboardMapping, KeymapInfo, IRawMixedKeyboardMapping, getKeyboardLayoutId } from 'vs/workbench/services/keybinding/common/keymapInfo'; +import { IKeymapService, IKeyboardLayoutInfo, IKeyboardMapping, IWindowsKeyboardMapping, KeymapInfo, IRawMixedKeyboardMapping, getKeyboardLayoutId, IKeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { DispatchConfig } from 'vs/workbench/services/keybinding/common/dispatchConfig'; import { IKeyboardMapper, CachedKeyboardMapper } from 'vs/workbench/services/keybinding/common/keyboardMapper'; @@ -79,7 +79,8 @@ export class BrowserKeyboardMapperFactory { const platform = isWindows ? 'win' : isMacintosh ? 'darwin' : 'linux'; import('vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.' + platform).then((m) => { - this._keymapInfos.push(...m.KeyboardLayoutContribution.INSTANCE.layoutInfos); + let keymapInfos: IKeymapInfo[] = m.KeyboardLayoutContribution.INSTANCE.layoutInfos; + this._keymapInfos.push(...keymapInfos.map(info => (new KeymapInfo(info.layout, info.secondaryLayouts, info.mapping, info.isUserKeyboardLayout)))); this._mru = this._keymapInfos; this._initialized = true; this.onKeyboardLayoutChanged(); diff --git a/src/vs/workbench/services/keybinding/common/keymapInfo.ts b/src/vs/workbench/services/keybinding/common/keymapInfo.ts index c4159da4c6f..cc1108c5ca4 100644 --- a/src/vs/workbench/services/keybinding/common/keymapInfo.ts +++ b/src/vs/workbench/services/keybinding/common/keymapInfo.ts @@ -248,6 +248,13 @@ interface ISerializedMapping { [key: string]: (string | number)[]; } +export interface IKeymapInfo { + layout: IKeyboardLayoutInfo; + secondaryLayouts: IKeyboardLayoutInfo[]; + mapping: ISerializedMapping; + isUserKeyboardLayout?: boolean; +} + export class KeymapInfo { mapping: IRawMixedKeyboardMapping; isUserKeyboardLayout: boolean; From 9bc5332d797294c3e7ee14763b232bef7c156ba6 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Fri, 21 Jun 2019 13:38:40 -0700 Subject: [PATCH 0523/1449] Separate keyboard layout loading logic for testing --- .../keybinding/browser/keymapService.ts | 42 +++++++++++-------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/src/vs/workbench/services/keybinding/browser/keymapService.ts b/src/vs/workbench/services/keybinding/browser/keymapService.ts index 13434bdb7bb..21546ac6d36 100644 --- a/src/vs/workbench/services/keybinding/browser/keymapService.ts +++ b/src/vs/workbench/services/keybinding/browser/keymapService.ts @@ -28,17 +28,16 @@ import { Extensions as ConfigExtensions, IConfigurationRegistry, IConfigurationN import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { INavigatorWithKeyboard } from 'vs/workbench/services/keybinding/common/navigatorKeyboard'; -export class BrowserKeyboardMapperFactory { - public static readonly INSTANCE = new BrowserKeyboardMapperFactory(); +export class BrowserKeyboardMapperFactoryBase { // keyboard mapper - private _initialized: boolean; - private _keyboardMapper: IKeyboardMapper | null; + protected _initialized: boolean; + protected _keyboardMapper: IKeyboardMapper | null; private readonly _onDidChangeKeyboardMapper = new Emitter(); public readonly onDidChangeKeyboardMapper: Event = this._onDidChangeKeyboardMapper.event; // keymap infos - private _keymapInfos: KeymapInfo[]; - private _mru: KeymapInfo[]; + protected _keymapInfos: KeymapInfo[]; + protected _mru: KeymapInfo[]; private _activeKeymapInfo: KeymapInfo | null; get activeKeymap(): KeymapInfo | null { @@ -69,23 +68,13 @@ export class BrowserKeyboardMapperFactory { return this._keymapInfos.map(keymapInfo => keymapInfo.layout); } - private constructor() { + protected constructor() { this._keyboardMapper = null; this._initialized = false; this._keymapInfos = []; this._mru = []; this._activeKeymapInfo = null; - const platform = isWindows ? 'win' : isMacintosh ? 'darwin' : 'linux'; - - import('vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.' + platform).then((m) => { - let keymapInfos: IKeymapInfo[] = m.KeyboardLayoutContribution.INSTANCE.layoutInfos; - this._keymapInfos.push(...keymapInfos.map(info => (new KeymapInfo(info.layout, info.secondaryLayouts, info.mapping, info.isUserKeyboardLayout)))); - this._mru = this._keymapInfos; - this._initialized = true; - this.onKeyboardLayoutChanged(); - }); - if ((navigator).keyboard && (navigator).keyboard.addEventListener) { (navigator).keyboard.addEventListener!('layoutchange', () => { // Update user keyboard map settings @@ -371,6 +360,25 @@ export class BrowserKeyboardMapperFactory { //#endregion } +export class BrowserKeyboardMapperFactory extends BrowserKeyboardMapperFactoryBase { + public static readonly INSTANCE = new BrowserKeyboardMapperFactory(); + // keyboard mapper + + private constructor() { + super(); + + const platform = isWindows ? 'win' : isMacintosh ? 'darwin' : 'linux'; + + import('vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.' + platform).then((m) => { + let keymapInfos: IKeymapInfo[] = m.KeyboardLayoutContribution.INSTANCE.layoutInfos; + this._keymapInfos.push(...keymapInfos.map(info => (new KeymapInfo(info.layout, info.secondaryLayouts, info.mapping, info.isUserKeyboardLayout)))); + this._mru = this._keymapInfos; + this._initialized = true; + this.onKeyboardLayoutChanged(); + }); + } +} + class UserKeyboardLayout extends Disposable { private readonly reloadConfigurationScheduler: RunOnceScheduler; protected readonly _onDidChange: Emitter = this._register(new Emitter()); From 36b272f2f14eb636032546381dfff00f8cfd3136 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Fri, 21 Jun 2019 14:13:34 -0700 Subject: [PATCH 0524/1449] Test browser keymapper --- .../test/browserKeyboardMapper.test.ts | 137 ++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts diff --git a/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts b/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts new file mode 100644 index 00000000000..a50a0e54d72 --- /dev/null +++ b/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts @@ -0,0 +1,137 @@ +/*--------------------------------------------------------------------------------------------- + * 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 '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 { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; + +class TestKeyboardMapperFactory extends BrowserKeyboardMapperFactoryBase { + public static readonly INSTANCE = new TestKeyboardMapperFactory(); + + constructor() { + super(); + + let keymapInfos: IKeymapInfo[] = KeyboardLayoutContribution.INSTANCE.layoutInfos; + this._keymapInfos.push(...keymapInfos.map(info => (new KeymapInfo(info.layout, info.secondaryLayouts, info.mapping, info.isUserKeyboardLayout)))); + this._mru = this._keymapInfos; + this._initialized = true; + this.onKeyboardLayoutChanged(); + } +} + + +suite('keyboard layout loader', () => { + + test('load default US keyboard layout', () => { + assert.notEqual(TestKeyboardMapperFactory.INSTANCE.activeKeyboardLayout, null); + assert.equal(TestKeyboardMapperFactory.INSTANCE.activeKeyboardLayout!.isUSStandard, true); + }); + + test('isKeyMappingActive', () => { + assert.equal(TestKeyboardMapperFactory.INSTANCE.isKeyMappingActive({ + KeyA: { + value: 'a', + valueIsDeadKey: false, + withShift: 'A', + withShiftIsDeadKey: false, + withAltGr: 'å', + withAltGrIsDeadKey: false, + withShiftAltGr: 'Å', + withShiftAltGrIsDeadKey: false + } + }), true); + + assert.equal(TestKeyboardMapperFactory.INSTANCE.isKeyMappingActive({ + KeyA: { + value: 'a', + valueIsDeadKey: false, + withShift: 'A', + withShiftIsDeadKey: false, + withAltGr: 'å', + withAltGrIsDeadKey: false, + withShiftAltGr: 'Å', + withShiftAltGrIsDeadKey: false + }, + KeyZ: { + value: 'z', + valueIsDeadKey: false, + withShift: 'Z', + withShiftIsDeadKey: false, + withAltGr: 'Ω', + withAltGrIsDeadKey: false, + withShiftAltGr: '¸', + withShiftAltGrIsDeadKey: false + } + }), true); + + assert.equal(TestKeyboardMapperFactory.INSTANCE.isKeyMappingActive({ + KeyZ: { + value: 'y', + valueIsDeadKey: false, + withShift: 'Y', + withShiftIsDeadKey: false, + withAltGr: '¥', + withAltGrIsDeadKey: false, + withShiftAltGr: 'Ÿ', + withShiftAltGrIsDeadKey: false + }, + }), false); + + }); + + test('Switch keymapping', () => { + TestKeyboardMapperFactory.INSTANCE.setActiveKeyMapping({ + KeyZ: { + value: 'y', + valueIsDeadKey: false, + withShift: 'Y', + withShiftIsDeadKey: false, + withAltGr: '¥', + withAltGrIsDeadKey: false, + withShiftAltGr: 'Ÿ', + withShiftAltGrIsDeadKey: false + } + }); + assert.equal(!!TestKeyboardMapperFactory.INSTANCE.activeKeyboardLayout!.isUSStandard, false); + assert.equal(TestKeyboardMapperFactory.INSTANCE.isKeyMappingActive({ + KeyZ: { + value: 'y', + valueIsDeadKey: false, + withShift: 'Y', + withShiftIsDeadKey: false, + withAltGr: '¥', + withAltGrIsDeadKey: false, + withShiftAltGr: 'Ÿ', + withShiftAltGrIsDeadKey: false + }, + }), true); + + TestKeyboardMapperFactory.INSTANCE.setActiveKeyMapping(null); + assert.equal(TestKeyboardMapperFactory.INSTANCE.activeKeyboardLayout!.isUSStandard, true); + }); + + test('Switch keyboard layout info', () => { + TestKeyboardMapperFactory.INSTANCE.setKeyboardLayout('com.apple.keylayout.German'); + assert.equal(!!TestKeyboardMapperFactory.INSTANCE.activeKeyboardLayout!.isUSStandard, false); + assert.equal(TestKeyboardMapperFactory.INSTANCE.isKeyMappingActive({ + KeyZ: { + value: 'y', + valueIsDeadKey: false, + withShift: 'Y', + withShiftIsDeadKey: false, + withAltGr: '¥', + withAltGrIsDeadKey: false, + withShiftAltGr: 'Ÿ', + withShiftAltGrIsDeadKey: false + }, + }), true); + + TestKeyboardMapperFactory.INSTANCE.setActiveKeyMapping(null); + assert.equal(TestKeyboardMapperFactory.INSTANCE.activeKeyboardLayout!.isUSStandard, true); + }); +}); \ No newline at end of file From 6103a134fd2f639613df9d62bbb25ba18b1c33c9 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Fri, 21 Jun 2019 14:14:10 -0700 Subject: [PATCH 0525/1449] unused standard keyboard event. --- .../services/keybinding/test/browserKeyboardMapper.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts b/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts index a50a0e54d72..6f817dc867d 100644 --- a/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts +++ b/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts @@ -8,7 +8,6 @@ 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 { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; class TestKeyboardMapperFactory extends BrowserKeyboardMapperFactoryBase { public static readonly INSTANCE = new TestKeyboardMapperFactory(); From 3490cfe9846f642380ac0a1adc9f9e4124ae01f2 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 21 Jun 2019 14:43:23 -0700 Subject: [PATCH 0526/1449] Make sure we dismiss the zoom status bar entry when switching editors --- .../browser/parts/editor/binaryEditor.ts | 8 ++--- .../browser/parts/editor/resourceViewer.ts | 34 +++++++++++-------- .../files/browser/editors/binaryFileEditor.ts | 9 ++--- 3 files changed, 25 insertions(+), 26 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/binaryEditor.ts b/src/vs/workbench/browser/parts/editor/binaryEditor.ts index fd12b0179c1..b2d51bde13c 100644 --- a/src/vs/workbench/browser/parts/editor/binaryEditor.ts +++ b/src/vs/workbench/browser/parts/editor/binaryEditor.ts @@ -20,8 +20,7 @@ import { dispose } from 'vs/base/common/lifecycle'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IFileService } from 'vs/platform/files/common/files'; -import { IStatusbarService } from 'vs/platform/statusbar/common/statusbar'; -import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; export interface IOpenCallbacks { openInternal: (input: EditorInput, options: EditorOptions) => Promise; @@ -53,8 +52,7 @@ export abstract class BaseBinaryResourceEditor extends BaseEditor { @IFileService private readonly fileService: IFileService, @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, @IStorageService storageService: IStorageService, - @IStatusbarService private readonly statusbarService: IStatusbarService, - @IContextMenuService private readonly contextMenuService: IContextMenuService + @IInstantiationService private readonly instantiationService: IInstantiationService, ) { super(id, telemetryService, themeService, storageService); @@ -101,7 +99,7 @@ export abstract class BaseBinaryResourceEditor extends BaseEditor { openInternalClb: () => this.handleOpenInternalCallback(input, options), openExternalClb: this.environmentService.configuration.remoteAuthority ? undefined : resource => this.callbacks.openExternal(resource), metadataClb: meta => this.handleMetadataChanged(meta) - }, this.statusbarService, this.contextMenuService); + }, this.instantiationService); } private async handleOpenInternalCallback(input: EditorInput, options: EditorOptions): Promise { diff --git a/src/vs/workbench/browser/parts/editor/resourceViewer.ts b/src/vs/workbench/browser/parts/editor/resourceViewer.ts index a3772c915a9..56fa7d04676 100644 --- a/src/vs/workbench/browser/parts/editor/resourceViewer.ts +++ b/src/vs/workbench/browser/parts/editor/resourceViewer.ts @@ -19,6 +19,8 @@ import { memoize } from 'vs/base/common/decorators'; import * as platform from 'vs/base/common/platform'; import { IFileService } from 'vs/platform/files/common/files'; import { IStatusbarEntry, IStatusbarEntryAccessor, IStatusbarService, StatusbarAlignment } from 'vs/platform/statusbar/common/statusbar'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; export interface IResourceDescriptor { readonly resource: URI; @@ -79,8 +81,7 @@ export class ResourceViewer { container: HTMLElement, scrollbar: DomScrollableElement, delegate: ResourceViewerDelegate, - statusbarService: IStatusbarService, - contextMenuService: IContextMenuService + instantiationService: IInstantiationService, ): ResourceViewerContext { // Ensure CSS class @@ -88,7 +89,7 @@ export class ResourceViewer { // Images if (ResourceViewer.isImageResource(descriptor)) { - return ImageView.create(container, descriptor, fileService, scrollbar, delegate, statusbarService, contextMenuService); + return ImageView.create(container, descriptor, fileService, scrollbar, delegate, instantiationService); } // Large Files @@ -120,11 +121,10 @@ class ImageView { fileService: IFileService, scrollbar: DomScrollableElement, delegate: ResourceViewerDelegate, - statusbarService: IStatusbarService, - contextMenuService: IContextMenuService + instantiationService: IInstantiationService, ): ResourceViewerContext { if (ImageView.shouldShowImageInline(descriptor)) { - return InlineImageView.create(container, descriptor, fileService, scrollbar, delegate, statusbarService, contextMenuService); + return InlineImageView.create(container, descriptor, fileService, scrollbar, delegate, instantiationService); } return LargeImageView.create(container, descriptor, delegate); @@ -237,15 +237,22 @@ type Scale = number | 'fit'; export class ZoomStatusbarItem extends Disposable { - private statusbarItem: IStatusbarEntryAccessor; + private statusbarItem?: IStatusbarEntryAccessor; onSelectScale?: (scale: Scale) => void; constructor( - private readonly contextMenuService: IContextMenuService, - private readonly statusbarService: IStatusbarService + @IEditorService editorService: IEditorService, + @IContextMenuService private readonly contextMenuService: IContextMenuService, + @IStatusbarService private readonly statusbarService: IStatusbarService, ) { super(); + this._register(editorService.onDidActiveEditorChange(() => { + if (this.statusbarItem) { + this.statusbarItem.dispose(); + this.statusbarItem = undefined; + } + })); } updateStatusbar(scale: Scale, onSelectScale?: (scale: Scale) => void): void { @@ -263,7 +270,6 @@ export class ZoomStatusbarItem extends Disposable { this._register(this.statusbarItem); const element = document.getElementById('status.imageZoom')!; - this._register(DOM.addDisposableListener(element, DOM.EventType.CLICK, (e: MouseEvent) => { this.contextMenuService.showContextMenu({ getAnchor: () => element, @@ -344,13 +350,11 @@ class InlineImageView { fileService: IFileService, scrollbar: DomScrollableElement, delegate: ResourceViewerDelegate, - statusbarService: IStatusbarService, - contextMenuService: IContextMenuService + @IInstantiationService instantiationService: IInstantiationService, ) { const disposables = new DisposableStore(); - const zoomStatusbarItem = new ZoomStatusbarItem(contextMenuService, statusbarService); - disposables.add(zoomStatusbarItem); + const zoomStatusbarItem = disposables.add(instantiationService.createInstance(ZoomStatusbarItem)); const context: ResourceViewerContext = { layout(dimension: DOM.Dimension) { }, @@ -408,8 +412,8 @@ class InlineImageView { }); InlineImageView.imageStateCache.set(cacheKey, { scale: scale, offsetX: newScrollLeft, offsetY: newScrollTop }); - } + zoomStatusbarItem.updateStatusbar(scale, updateScale); scrollbar.scanDomNode(); } diff --git a/src/vs/workbench/contrib/files/browser/editors/binaryFileEditor.ts b/src/vs/workbench/contrib/files/browser/editors/binaryFileEditor.ts index 6402c9fb414..580a2990ac4 100644 --- a/src/vs/workbench/contrib/files/browser/editors/binaryFileEditor.ts +++ b/src/vs/workbench/contrib/files/browser/editors/binaryFileEditor.ts @@ -16,8 +16,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { IStorageService } from 'vs/platform/storage/common/storage'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IFileService } from 'vs/platform/files/common/files'; -import { IStatusbarService } from 'vs/platform/statusbar/common/statusbar'; -import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; /** * An implementation of editor for binary files like images. @@ -34,8 +33,7 @@ export class BinaryFileEditor extends BaseBinaryResourceEditor { @IStorageService storageService: IStorageService, @IFileService fileService: IFileService, @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, - @IStatusbarService statusbarService: IStatusbarService, - @IContextMenuService contextMenuService: IContextMenuService + @IInstantiationService instantiationService: IInstantiationService, ) { super( BinaryFileEditor.ID, @@ -48,8 +46,7 @@ export class BinaryFileEditor extends BaseBinaryResourceEditor { fileService, environmentService, storageService, - statusbarService, - contextMenuService + instantiationService, ); } From ebb0ac31651e8cc2dc1598a3597c8f361153f127 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 21 Jun 2019 14:45:16 -0700 Subject: [PATCH 0527/1449] Reduce state --- .../browser/parts/editor/resourceViewer.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/resourceViewer.ts b/src/vs/workbench/browser/parts/editor/resourceViewer.ts index 56fa7d04676..a5e644112b5 100644 --- a/src/vs/workbench/browser/parts/editor/resourceViewer.ts +++ b/src/vs/workbench/browser/parts/editor/resourceViewer.ts @@ -239,9 +239,8 @@ export class ZoomStatusbarItem extends Disposable { private statusbarItem?: IStatusbarEntryAccessor; - onSelectScale?: (scale: Scale) => void; - constructor( + private readonly onSelectScale: (scale: Scale) => void, @IEditorService editorService: IEditorService, @IContextMenuService private readonly contextMenuService: IContextMenuService, @IStatusbarService private readonly statusbarService: IStatusbarService, @@ -255,15 +254,11 @@ export class ZoomStatusbarItem extends Disposable { })); } - updateStatusbar(scale: Scale, onSelectScale?: (scale: Scale) => void): void { + updateStatusbar(scale: Scale): void { const entry: IStatusbarEntry = { text: this.zoomLabel(scale) }; - if (onSelectScale) { - this.onSelectScale = onSelectScale; - } - if (!this.statusbarItem) { this.statusbarItem = this.statusbarService.addEntry(entry, 'status.imageZoom', nls.localize('status.imageZoom', "Image Zoom"), StatusbarAlignment.RIGHT, 101 /* to the left of editor status (100) */); @@ -354,7 +349,8 @@ class InlineImageView { ) { const disposables = new DisposableStore(); - const zoomStatusbarItem = disposables.add(instantiationService.createInstance(ZoomStatusbarItem)); + const zoomStatusbarItem = disposables.add(instantiationService.createInstance(ZoomStatusbarItem, + newScale => updateScale(newScale))); const context: ResourceViewerContext = { layout(dimension: DOM.Dimension) { }, @@ -414,7 +410,7 @@ class InlineImageView { InlineImageView.imageStateCache.set(cacheKey, { scale: scale, offsetX: newScrollLeft, offsetY: newScrollTop }); } - zoomStatusbarItem.updateStatusbar(scale, updateScale); + zoomStatusbarItem.updateStatusbar(scale); scrollbar.scanDomNode(); } From 402281babe08c6b1a32d7a0316fc696523db1d9d Mon Sep 17 00:00:00 2001 From: Logan Ramos Date: Fri, 21 Jun 2019 15:13:07 -0700 Subject: [PATCH 0528/1449] Added strictly typed telemetry function (#75915) * Added strictly typed telemetry function * cleanup publicLog2 signature --- .../standalone/browser/simpleServices.ts | 5 ++++ .../platform/telemetry/common/gdprTypings.ts | 26 +++++++++++++++++++ src/vs/platform/telemetry/common/telemetry.ts | 3 +++ .../telemetry/common/telemetryService.ts | 5 ++++ .../telemetry/common/telemetryUtils.ts | 4 +++ .../api/browser/mainThreadTelemetry.ts | 7 +++++ .../workbench/api/common/extHost.protocol.ts | 2 ++ .../workbench/browser/web.simpleservices.ts | 5 ++++ .../electron-browser/telemetryService.ts | 5 ++++ .../quickopen.perf.integrationTest.ts | 5 ++++ .../textsearch.perf.integrationTest.ts | 5 ++++ 11 files changed, 72 insertions(+) create mode 100644 src/vs/platform/telemetry/common/gdprTypings.ts diff --git a/src/vs/editor/standalone/browser/simpleServices.ts b/src/vs/editor/standalone/browser/simpleServices.ts index 7cf0082c0dd..1f44f246486 100644 --- a/src/vs/editor/standalone/browser/simpleServices.ts +++ b/src/vs/editor/standalone/browser/simpleServices.ts @@ -44,6 +44,7 @@ import { IWorkspace, IWorkspaceContextService, IWorkspaceFolder, IWorkspaceFolde import { ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { ILayoutService, IDimension } from 'vs/platform/layout/browser/layoutService'; import { SimpleServicesNLS } from 'vs/editor/common/standaloneStrings'; +import { ClassifiedEvent, StrictPropertyCheck, GDPRClassification } from 'vs/platform/telemetry/common/gdprTypings'; export class SimpleModel implements IResolvedTextEditorModel { @@ -525,6 +526,10 @@ export class StandaloneTelemetryService implements ITelemetryService { return Promise.resolve(undefined); } + publicLog2 = never, T extends GDPRClassification = never>(eventName: string, data?: StrictPropertyCheck) { + return this.publicLog(eventName, data as any); + } + public getTelemetryInfo(): Promise { throw new Error(`Not available`); } diff --git a/src/vs/platform/telemetry/common/gdprTypings.ts b/src/vs/platform/telemetry/common/gdprTypings.ts new file mode 100644 index 00000000000..4fa946fb59f --- /dev/null +++ b/src/vs/platform/telemetry/common/gdprTypings.ts @@ -0,0 +1,26 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +export interface IPropertyData { + classification: 'SystemMetaData' | 'CallstackOrException' | 'CustomerContent' | 'PublicNonPersonalData'; + purpose: 'PerformanceAndHealth' | 'FeatureInsight' | 'BusinessInsight'; + endpoint?: string; + isMeasurement?: boolean; +} + +export interface IGDPRProperty { + readonly [name: string]: IPropertyData | undefined | IGDPRProperty; +} + +export type ClassifiedEvent = { + [k in keyof T]: any +}; + +export type StrictPropertyChecker = keyof TEvent extends keyof TClassifiedEvent ? keyof TClassifiedEvent extends keyof TEvent ? TEvent : TError : TError; + +export type StrictPropertyCheckError = 'Type of classified event does not match event properties'; + +export type StrictPropertyCheck = StrictPropertyChecker, StrictPropertyCheckError>; + +export type GDPRClassification = { [_ in keyof T]: IPropertyData | IGDPRProperty | undefined }; \ No newline at end of file diff --git a/src/vs/platform/telemetry/common/telemetry.ts b/src/vs/platform/telemetry/common/telemetry.ts index 41924be4901..e82693979be 100644 --- a/src/vs/platform/telemetry/common/telemetry.ts +++ b/src/vs/platform/telemetry/common/telemetry.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { ClassifiedEvent, StrictPropertyCheck, GDPRClassification } from 'vs/platform/telemetry/common/gdprTypings'; export const ITelemetryService = createDecorator('telemetryService'); @@ -29,6 +30,8 @@ export interface ITelemetryService { */ publicLog(eventName: string, data?: ITelemetryData, anonymizeFilePaths?: boolean): Promise; + publicLog2 = never, T extends GDPRClassification = never>(eventName: string, data?: StrictPropertyCheck, anonymizeFilePaths?: boolean): Promise; + setEnabled(value: boolean): void; getTelemetryInfo(): Promise; diff --git a/src/vs/platform/telemetry/common/telemetryService.ts b/src/vs/platform/telemetry/common/telemetryService.ts index fce980fcb9a..cab7686a859 100644 --- a/src/vs/platform/telemetry/common/telemetryService.ts +++ b/src/vs/platform/telemetry/common/telemetryService.ts @@ -13,6 +13,7 @@ import { IConfigurationRegistry, Extensions } from 'vs/platform/configuration/co import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { cloneAndChange, mixin } from 'vs/base/common/objects'; import { Registry } from 'vs/platform/registry/common/platform'; +import { ClassifiedEvent, StrictPropertyCheck, GDPRClassification } from 'vs/platform/telemetry/common/gdprTypings'; export interface ITelemetryServiceConfig { appender: ITelemetryAppender; @@ -131,6 +132,10 @@ export class TelemetryService implements ITelemetryService { }); } + publicLog2 = never, T extends GDPRClassification = never>(eventName: string, data?: StrictPropertyCheck, anonymizeFilePaths?: boolean): Promise { + return this.publicLog(eventName, data as ITelemetryData, anonymizeFilePaths); + } + private _cleanupInfo(stack: string, anonymizeFilePaths?: boolean): string { let updatedStack = stack; diff --git a/src/vs/platform/telemetry/common/telemetryUtils.ts b/src/vs/platform/telemetry/common/telemetryUtils.ts index 69e17c36bd1..d9e73fab37c 100644 --- a/src/vs/platform/telemetry/common/telemetryUtils.ts +++ b/src/vs/platform/telemetry/common/telemetryUtils.ts @@ -8,12 +8,16 @@ import { IConfigurationService, ConfigurationTarget, ConfigurationTargetToString import { IKeybindingService, KeybindingSource } from 'vs/platform/keybinding/common/keybinding'; import { ITelemetryService, ITelemetryInfo, ITelemetryData } from 'vs/platform/telemetry/common/telemetry'; import { ILogService } from 'vs/platform/log/common/log'; +import { ClassifiedEvent, StrictPropertyCheck, GDPRClassification } from 'vs/platform/telemetry/common/gdprTypings'; export const NullTelemetryService = new class implements ITelemetryService { _serviceBrand: undefined; publicLog(eventName: string, data?: ITelemetryData) { return Promise.resolve(undefined); } + publicLog2 = never, T extends GDPRClassification = never>(eventName: string, data?: StrictPropertyCheck) { + return this.publicLog(eventName, data as ITelemetryData); + } setEnabled() { } isOptedIn: true; getTelemetryInfo(): Promise { diff --git a/src/vs/workbench/api/browser/mainThreadTelemetry.ts b/src/vs/workbench/api/browser/mainThreadTelemetry.ts index 41f9947bc71..3b800af7284 100644 --- a/src/vs/workbench/api/browser/mainThreadTelemetry.ts +++ b/src/vs/workbench/api/browser/mainThreadTelemetry.ts @@ -6,6 +6,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { MainThreadTelemetryShape, MainContext, IExtHostContext } from '../common/extHost.protocol'; import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { ClassifiedEvent, StrictPropertyCheck, GDPRClassification } from 'vs/platform/telemetry/common/gdprTypings'; @extHostNamedCustomer(MainContext.MainThreadTelemetry) export class MainThreadTelemetry implements MainThreadTelemetryShape { @@ -28,4 +29,10 @@ export class MainThreadTelemetry implements MainThreadTelemetryShape { data[MainThreadTelemetry._name] = true; this._telemetryService.publicLog(eventName, data); } + + $publicLog2 = never, T extends GDPRClassification = never>(eventName: string, data: StrictPropertyCheck): void { + this.$publicLog(eventName, data as any); + } } + + diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 58ec9762b80..fb42af2da36 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -46,6 +46,7 @@ import * as callHierarchy from 'vs/workbench/contrib/callHierarchy/common/callHi import { IRelativePattern } from 'vs/base/common/glob'; import { IRemoteConsoleLog } from 'vs/base/common/console'; import { VSBuffer } from 'vs/base/common/buffer'; +import { ClassifiedEvent, StrictPropertyCheck, GDPRClassification } from 'vs/platform/telemetry/common/gdprTypings'; export interface IEnvironment { isExtensionDevelopmentDebug: boolean; @@ -508,6 +509,7 @@ export interface MainThreadStorageShape extends IDisposable { export interface MainThreadTelemetryShape extends IDisposable { $publicLog(eventName: string, data?: any): void; + $publicLog2 = never, T extends GDPRClassification = never>(eventName: string, data?: StrictPropertyCheck): void; } export interface MainThreadEditorInsetsShape extends IDisposable { diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index 663f21593ea..f5bccc1b42d 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -51,6 +51,7 @@ import { pathsToEditors } from 'vs/workbench/common/editor'; import { IFileService } from 'vs/platform/files/common/files'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ParsedArgs } from 'vs/platform/environment/common/environment'; +import { ClassifiedEvent, StrictPropertyCheck, GDPRClassification } from 'vs/platform/telemetry/common/gdprTypings'; //#region Backup File @@ -660,6 +661,10 @@ export class SimpleTelemetryService implements ITelemetryService { return Promise.resolve(undefined); } + publicLog2 = never, T extends GDPRClassification = never>(eventName: string, data?: StrictPropertyCheck) { + return this.publicLog(eventName, data as ITelemetryData); + } + setEnabled(value: boolean): void { } diff --git a/src/vs/workbench/services/telemetry/electron-browser/telemetryService.ts b/src/vs/workbench/services/telemetry/electron-browser/telemetryService.ts index c445313f091..5583a243cb2 100644 --- a/src/vs/workbench/services/telemetry/electron-browser/telemetryService.ts +++ b/src/vs/workbench/services/telemetry/electron-browser/telemetryService.ts @@ -16,6 +16,7 @@ import { IStorageService } from 'vs/platform/storage/common/storage'; import { resolveWorkbenchCommonProperties } from 'vs/platform/telemetry/node/workbenchCommonProperties'; import { TelemetryService as BaseTelemetryService, ITelemetryServiceConfig } from 'vs/platform/telemetry/common/telemetryService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { ClassifiedEvent, StrictPropertyCheck, GDPRClassification } from 'vs/platform/telemetry/common/gdprTypings'; export class TelemetryService extends Disposable implements ITelemetryService { @@ -59,6 +60,10 @@ export class TelemetryService extends Disposable implements ITelemetryService { return this.impl.publicLog(eventName, data, anonymizeFilePaths); } + publicLog2 = never, T extends GDPRClassification = never>(eventName: string, data?: StrictPropertyCheck, anonymizeFilePaths?: boolean) { + return this.publicLog(eventName, data as ITelemetryData, anonymizeFilePaths); + } + getTelemetryInfo(): Promise { return this.impl.getTelemetryInfo(); } 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 a0c7e9a27fe..4b246719249 100644 --- a/src/vs/workbench/test/electron-browser/quickopen.perf.integrationTest.ts +++ b/src/vs/workbench/test/electron-browser/quickopen.perf.integrationTest.ts @@ -29,6 +29,7 @@ import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editor import { LocalSearchService } from 'vs/workbench/services/search/node/searchService'; import { IUntitledEditorService, UntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; import { TestContextService, TestEditorGroupsService, TestEditorService, TestEnvironmentService, TestTextResourcePropertiesService } from 'vs/workbench/test/workbenchTestServices'; +import { ClassifiedEvent, StrictPropertyCheck, GDPRClassification } from 'vs/platform/telemetry/common/gdprTypings'; namespace Timer { export interface ITimerEvent { @@ -172,6 +173,10 @@ class TestTelemetryService implements ITelemetryService { return Promise.resolve(undefined); } + public publicLog2 = never, T extends GDPRClassification = never>(eventName: string, data?: StrictPropertyCheck) { + return this.publicLog(eventName, data as any); + } + public getTelemetryInfo(): Promise { return Promise.resolve({ instanceId: 'someValue.instanceId', 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 be16e39397a..e08748c6364 100644 --- a/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts +++ b/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts @@ -33,6 +33,7 @@ import { Event, Emitter } from 'vs/base/common/event'; import { testWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; import { NullLogService, ILogService } from 'vs/platform/log/common/log'; import { ITextResourcePropertiesService } from 'vs/editor/common/services/resourceConfiguration'; +import { ClassifiedEvent, StrictPropertyCheck, GDPRClassification } from 'vs/platform/telemetry/common/gdprTypings'; declare var __dirname: string; @@ -165,6 +166,10 @@ class TestTelemetryService implements ITelemetryService { return Promise.resolve(); } + public publicLog2 = never, T extends GDPRClassification = never>(eventName: string, data?: StrictPropertyCheck) { + return this.publicLog(eventName, data as any); + } + public getTelemetryInfo(): Promise { return Promise.resolve({ instanceId: 'someValue.instanceId', From d27ab54da0cfd6b275dbadd2d0d6ffe0d57e1a4e Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 21 Jun 2019 17:36:26 -0700 Subject: [PATCH 0529/1449] Extract port mapping helper function --- .../contrib/webview/common/portMapping.ts | 40 +++++++++++-------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/contrib/webview/common/portMapping.ts b/src/vs/workbench/contrib/webview/common/portMapping.ts index 3a9b8ee056a..99c605a52f8 100644 --- a/src/vs/workbench/contrib/webview/common/portMapping.ts +++ b/src/vs/workbench/contrib/webview/common/portMapping.ts @@ -9,6 +9,20 @@ import * as modes from 'vs/editor/common/modes'; import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; import { ITunnelService, RemoteTunnel } from 'vs/platform/remote/common/tunnel'; +export function extractLocalHostUriMetaDataForPortMapping(uri: URI): { address: string, port: number } | undefined { + if (uri.scheme !== 'http' && uri.scheme !== 'https') { + return undefined; + } + const localhostMatch = /^(localhost):(\d+)$/.exec(uri.authority); + if (!localhostMatch) { + return undefined; + } + return { + address: localhostMatch[1], + port: +localhostMatch[2], + }; +} + export class WebviewPortMappingManager extends Disposable { private readonly _tunnels = new Map>(); @@ -23,31 +37,25 @@ export class WebviewPortMappingManager extends Disposable { public async getRedirect(url: string): Promise { const uri = URI.parse(url); - if (uri.scheme !== 'http' && uri.scheme !== 'https') { - return undefined; + const requestLocalHostInfo = extractLocalHostUriMetaDataForPortMapping(uri); + if (!requestLocalHostInfo) { + return requestLocalHostInfo; } - - const localhostMatch = /^localhost:(\d+)$/.exec(uri.authority); - if (!localhostMatch) { - return undefined; - } - - const port = +localhostMatch[1]; for (const mapping of this.mappings()) { - if (mapping.webviewPort === port) { + if (mapping.webviewPort === requestLocalHostInfo.port) { if (this.extensionLocation && this.extensionLocation.scheme === REMOTE_HOST_SCHEME) { const tunnel = await this.getOrCreateTunnel(mapping.extensionHostPort); if (tunnel) { - return url.replace( - new RegExp(`^${uri.scheme}://localhost:${mapping.webviewPort}(/|$)`), - `${uri.scheme}://localhost:${tunnel.tunnelLocalPort}$1`); + return uri.with({ + authority: `127.0.0.1:${tunnel.tunnelLocalPort}`, + }).toString(); } } if (mapping.webviewPort !== mapping.extensionHostPort) { - return url.replace( - new RegExp(`^${uri.scheme}://localhost:${mapping.webviewPort}(/|$)`), - `${uri.scheme}://localhost:${mapping.extensionHostPort}$1`); + return uri.with({ + authority: `${requestLocalHostInfo.address}:${mapping.extensionHostPort}` + }).toString(); } } } From 0358d08196cece5b0652cd87528b0ebc409e0d7f Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 21 Jun 2019 17:39:02 -0700 Subject: [PATCH 0530/1449] Re-use extractLocalHostUriMetaDataForPortMapping for openUri --- .../workbench/api/browser/mainThreadWindow.ts | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadWindow.ts b/src/vs/workbench/api/browser/mainThreadWindow.ts index c9a212e4863..533dbb62eae 100644 --- a/src/vs/workbench/api/browser/mainThreadWindow.ts +++ b/src/vs/workbench/api/browser/mainThreadWindow.ts @@ -11,6 +11,7 @@ import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { ExtHostContext, ExtHostWindowShape, IExtHostContext, MainContext, MainThreadWindowShape, IOpenUriOptions } from '../common/extHost.protocol'; import { ITunnelService, RemoteTunnel } from 'vs/platform/remote/common/tunnel'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { extractLocalHostUriMetaDataForPortMapping } from 'vs/workbench/contrib/webview/common/portMapping'; @extHostNamedCustomer(MainContext.MainThreadWindow) export class MainThreadWindow implements MainThreadWindowShape { @@ -48,13 +49,11 @@ export class MainThreadWindow implements MainThreadWindowShape { async $openUri(uriComponent: UriComponents, options: IOpenUriOptions): Promise { let uri = URI.revive(uriComponent); if (options.allowTunneling && !!this.environmentService.configuration.remoteAuthority) { - if (uri.scheme === 'http' || uri.scheme === 'https') { - const port = this.getLocalhostPort(uri); - if (typeof port === 'number') { - const tunnel = await this.getOrCreateTunnel(port); - if (tunnel) { - uri = uri.with({ authority: `localhost:${tunnel.tunnelLocalPort}` }); - } + const portMappingRequest = extractLocalHostUriMetaDataForPortMapping(uri); + if (portMappingRequest) { + const tunnel = await this.getOrCreateTunnel(portMappingRequest.port); + if (tunnel) { + uri = uri.with({ authority: `127.0.0.1:${tunnel.tunnelLocalPort}` }); } } } @@ -62,14 +61,6 @@ export class MainThreadWindow implements MainThreadWindowShape { return this.windowsService.openExternal(uri.toString()); } - private getLocalhostPort(uri: URI): number | undefined { - const match = /^localhost:(\d+)$/.exec(uri.authority); - if (match) { - return +match[1]; - } - return undefined; - } - private getOrCreateTunnel(remotePort: number): Promise | undefined { const existing = this._tunnels.get(remotePort); if (existing) { From a426717b50d68810ddfbf55558d777852bc21db0 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 21 Jun 2019 17:42:48 -0700 Subject: [PATCH 0531/1449] Also map 127.0.0.1 in webviews and forward it for openExternal Fixes https://github.com/microsoft/vscode-remote-release/issues/108 --- src/vs/workbench/contrib/webview/common/portMapping.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/webview/common/portMapping.ts b/src/vs/workbench/contrib/webview/common/portMapping.ts index 99c605a52f8..487ee92148e 100644 --- a/src/vs/workbench/contrib/webview/common/portMapping.ts +++ b/src/vs/workbench/contrib/webview/common/portMapping.ts @@ -13,7 +13,7 @@ export function extractLocalHostUriMetaDataForPortMapping(uri: URI): { address: if (uri.scheme !== 'http' && uri.scheme !== 'https') { return undefined; } - const localhostMatch = /^(localhost):(\d+)$/.exec(uri.authority); + const localhostMatch = /^(localhost|127\.0\.0\.1):(\d+)$/.exec(uri.authority); if (!localhostMatch) { return undefined; } From 4ebbe06e0ce0575ae7e6df7893132b84502cfbc0 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 23 Jun 2019 16:22:30 +0200 Subject: [PATCH 0532/1449] use empty model when content is empty --- .../workbench/services/configuration/browser/configuration.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/services/configuration/browser/configuration.ts b/src/vs/workbench/services/configuration/browser/configuration.ts index 8d4f4245f5d..14bade52756 100644 --- a/src/vs/workbench/services/configuration/browser/configuration.ts +++ b/src/vs/workbench/services/configuration/browser/configuration.ts @@ -49,7 +49,7 @@ export class UserConfiguration extends Disposable { async reload(): Promise { try { - const content = await this.userDataService.read(USER_CONFIGURATION_KEY); + const content = (await this.userDataService.read(USER_CONFIGURATION_KEY)) || '{}'; this.parser.parseContent(content); return this.parser.configurationModel; } catch (e) { From 3718e799834243b2124e51a1505bc13d796d3eb8 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 23 Jun 2019 16:22:47 +0200 Subject: [PATCH 0533/1449] :lipstick: --- .../services/configuration/browser/configurationService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/services/configuration/browser/configurationService.ts b/src/vs/workbench/services/configuration/browser/configurationService.ts index e98c108ea06..bf934755350 100644 --- a/src/vs/workbench/services/configuration/browser/configurationService.ts +++ b/src/vs/workbench/services/configuration/browser/configurationService.ts @@ -29,7 +29,7 @@ import { isEqual, dirname } from 'vs/base/common/resources'; import { mark } from 'vs/base/common/performance'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { IFileService } from 'vs/platform/files/common/files'; -import { IUserDataService } from '../../userData/common/userDataService'; +import { IUserDataService } from 'vs/workbench/services/userData/common/userDataService'; export class WorkspaceService extends Disposable implements IConfigurationService, IWorkspaceContextService { From 89640033a06ffa6f313d77b10b213b787fc6e96f Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 23 Jun 2019 17:25:37 +0200 Subject: [PATCH 0534/1449] use user data service for writing --- .../common/configurationEditingService.ts | 620 ++++++++++-------- .../configurationEditingService.test.ts | 73 ++- 2 files changed, 403 insertions(+), 290 deletions(-) diff --git a/src/vs/workbench/services/configuration/common/configurationEditingService.ts b/src/vs/workbench/services/configuration/common/configurationEditingService.ts index ffef24c5573..827452f20a7 100644 --- a/src/vs/workbench/services/configuration/common/configurationEditingService.ts +++ b/src/vs/workbench/services/configuration/common/configurationEditingService.ts @@ -10,18 +10,16 @@ import * as strings from 'vs/base/common/strings'; import { setProperty } from 'vs/base/common/jsonEdit'; import { Queue } from 'vs/base/common/async'; import { Edit } from 'vs/base/common/jsonFormatter'; -import { IReference } from 'vs/base/common/lifecycle'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Registry } from 'vs/platform/registry/common/platform'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IConfigurationService, IConfigurationOverrides, keyFromOverrideIdentifier } from 'vs/platform/configuration/common/configuration'; -import { FOLDER_SETTINGS_PATH, WORKSPACE_STANDALONE_CONFIGURATIONS, TASKS_CONFIGURATION_KEY, LAUNCH_CONFIGURATION_KEY } from 'vs/workbench/services/configuration/common/configuration'; +import { FOLDER_SETTINGS_PATH, WORKSPACE_STANDALONE_CONFIGURATIONS, TASKS_CONFIGURATION_KEY, LAUNCH_CONFIGURATION_KEY, USER_CONFIGURATION_KEY } from 'vs/workbench/services/configuration/common/configuration'; import { IFileService } from 'vs/platform/files/common/files'; -import { ITextModelService, IResolvedTextEditorModel } from 'vs/editor/common/services/resolverService'; +import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { OVERRIDE_PROPERTY_PATTERN, IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ITextModel } from 'vs/editor/common/model'; @@ -29,6 +27,13 @@ import { INotificationService, Severity } from 'vs/platform/notification/common/ import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; import { withUndefinedAsNull, withNullAsUndefined } from 'vs/base/common/types'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; +import { IUserDataService } from '../../userData/common/userDataService'; +import { IModelService } from 'vs/editor/common/services/modelService'; +import { IModeService } from 'vs/editor/common/services/modeService'; +import { Emitter } from 'vs/base/common/event'; +import { LanguageIdentifier } from 'vs/editor/common/modes'; +import { IDisposable, Disposable, toDisposable } from 'vs/base/common/lifecycle'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; export const enum ConfigurationEditingErrorCode { @@ -95,10 +100,6 @@ export interface IConfigurationValue { } export interface IConfigurationEditingOptions { - /** - * If `true`, do not saves the configuration. Default is `false`. - */ - donotSave?: boolean; /** * If `true`, do not notifies the error to user by showing the message box. Default is `false`. */ @@ -116,70 +117,127 @@ export const enum EditableConfigurationTarget { WORKSPACE_FOLDER } -interface IConfigurationEditOperation extends IConfigurationValue { +interface IConfigurationEditOperation extends IDisposable { + value: IConfigurationValue; target: EditableConfigurationTarget; jsonPath: json.JSONPath; - resource?: URI; + resource: URI | null; workspaceStandAloneConfigurationKey?: string; - + apply(save: boolean): Promise; } interface ConfigurationEditingOptions extends IConfigurationEditingOptions { + donotSave?: boolean; force?: boolean; } -export class ConfigurationEditingService { +function toConfigurationEditingError(error: ConfigurationEditingErrorCode, operation: IConfigurationEditOperation, contextService: IWorkspaceContextService): ConfigurationEditingError { + switch (error) { - public _serviceBrand: any; + // API constraints + case ConfigurationEditingErrorCode.ERROR_UNKNOWN_KEY: return new ConfigurationEditingError(nls.localize('errorUnknownKey', "Unable to write to {0} because {1} is not a registered configuration.", stringifyTarget(operation.target), operation.value.key), error); + case ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_CONFIGURATION_APPLICATION: return new ConfigurationEditingError(nls.localize('errorInvalidWorkspaceConfigurationApplication', "Unable to write {0} to Workspace Settings. This setting can be written only into User settings.", operation.value.key), error); + case ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_CONFIGURATION_MACHINE: return new ConfigurationEditingError(nls.localize('errorInvalidWorkspaceConfigurationMachine', "Unable to write {0} to Workspace Settings. This setting can be written only into User settings.", operation.value.key), error); + case ConfigurationEditingErrorCode.ERROR_INVALID_FOLDER_CONFIGURATION: return new ConfigurationEditingError(nls.localize('errorInvalidFolderConfiguration', "Unable to write to Folder Settings because {0} does not support the folder resource scope.", operation.value.key), error); + case ConfigurationEditingErrorCode.ERROR_INVALID_USER_TARGET: return new ConfigurationEditingError(nls.localize('errorInvalidUserTarget', "Unable to write to User Settings because {0} does not support for global scope.", operation.value.key), error); + case ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_TARGET: return new ConfigurationEditingError(nls.localize('errorInvalidWorkspaceTarget', "Unable to write to Workspace Settings because {0} does not support for workspace scope in a multi folder workspace.", operation.value.key), error); + case ConfigurationEditingErrorCode.ERROR_INVALID_FOLDER_TARGET: return new ConfigurationEditingError(nls.localize('errorInvalidFolderTarget', "Unable to write to Folder Settings because no resource is provided."), error); + case ConfigurationEditingErrorCode.ERROR_NO_WORKSPACE_OPENED: return new ConfigurationEditingError(nls.localize('errorNoWorkspaceOpened', "Unable to write to {0} because no workspace is opened. Please open a workspace first and try again.", stringifyTarget(operation.target)), error); - private queue: Queue; - private remoteSettingsResource: URI | null; + // User issues + case ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION: { + if (operation.workspaceStandAloneConfigurationKey === TASKS_CONFIGURATION_KEY) { + return new ConfigurationEditingError(nls.localize('errorInvalidTaskConfiguration', "Unable to write into the tasks configuration file. Please open it to correct errors/warnings in it and try again."), error); + } + if (operation.workspaceStandAloneConfigurationKey === LAUNCH_CONFIGURATION_KEY) { + return new ConfigurationEditingError(nls.localize('errorInvalidLaunchConfiguration', "Unable to write into the launch configuration file. Please open it to correct errors/warnings in it and try again."), error); + } + switch (operation.target) { + case EditableConfigurationTarget.USER_LOCAL: + return new ConfigurationEditingError(nls.localize('errorInvalidConfiguration', "Unable to write into user settings. Please open the user settings to correct errors/warnings in it and try again."), error); + case EditableConfigurationTarget.USER_REMOTE: + return new ConfigurationEditingError(nls.localize('errorInvalidRemoteConfiguration', "Unable to write into remote user settings. Please open the remote user settings to correct errors/warnings in it and try again."), error); + case EditableConfigurationTarget.WORKSPACE: + return new ConfigurationEditingError(nls.localize('errorInvalidConfigurationWorkspace', "Unable to write into workspace settings. Please open the workspace settings to correct errors/warnings in the file and try again."), error); + case EditableConfigurationTarget.WORKSPACE_FOLDER: + let workspaceFolderName: string = '<>'; + if (operation.resource) { + const folder = contextService.getWorkspaceFolder(operation.resource); + if (folder) { + workspaceFolderName = folder.name; + } + } + return new ConfigurationEditingError(nls.localize('errorInvalidConfigurationFolder', "Unable to write into folder settings. Please open the '{0}' folder settings to correct errors/warnings in it and try again.", workspaceFolderName), error); + } + return new ConfigurationEditingError('', error); + } + case ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY: { + if (operation.workspaceStandAloneConfigurationKey === TASKS_CONFIGURATION_KEY) { + return new ConfigurationEditingError(nls.localize('errorTasksConfigurationFileDirty', "Unable to write into tasks configuration file because the file is dirty. Please save it first and then try again."), error); + } + if (operation.workspaceStandAloneConfigurationKey === LAUNCH_CONFIGURATION_KEY) { + return new ConfigurationEditingError(nls.localize('errorLaunchConfigurationFileDirty', "Unable to write into launch configuration file because the file is dirty. Please save it first and then try again."), error); + } + switch (operation.target) { + case EditableConfigurationTarget.USER_LOCAL: + return new ConfigurationEditingError(nls.localize('errorConfigurationFileDirty', "Unable to write into user settings because the file is dirty. Please save the user settings file first and then try again."), error); + case EditableConfigurationTarget.USER_REMOTE: + return new ConfigurationEditingError(nls.localize('errorRemoteConfigurationFileDirty', "Unable to write into remote user settings because the file is dirty. Please save the remote user settings file first and then try again."), error); + case EditableConfigurationTarget.WORKSPACE: + return new ConfigurationEditingError(nls.localize('errorConfigurationFileDirtyWorkspace', "Unable to write into workspace settings because the file is dirty. Please save the workspace settings file first and then try again."), error); + case EditableConfigurationTarget.WORKSPACE_FOLDER: + let workspaceFolderName: string = '<>'; + if (operation.resource) { + const folder = contextService.getWorkspaceFolder(operation.resource); + if (folder) { + workspaceFolderName = folder.name; + } + } + return new ConfigurationEditingError(nls.localize('errorConfigurationFileDirtyFolder', "Unable to write into folder settings because the file is dirty. Please save the '{0}' folder settings file first and then try again.", workspaceFolderName), error); + } + return new ConfigurationEditingError('', error); + } + } +} + +function stringifyTarget(target: EditableConfigurationTarget): string { + switch (target) { + case EditableConfigurationTarget.USER_LOCAL: + return nls.localize('userTarget', "User Settings"); + case EditableConfigurationTarget.USER_REMOTE: + return nls.localize('remoteUserTarget', "Remote User Settings"); + case EditableConfigurationTarget.WORKSPACE: + return nls.localize('workspaceTarget', "Workspace Settings"); + case EditableConfigurationTarget.WORKSPACE_FOLDER: + return nls.localize('folderTarget', "Folder Settings"); + } + return ''; +} + +abstract class ConfigurationEditOperation extends Disposable implements IConfigurationEditOperation { constructor( - @IConfigurationService private readonly configurationService: IConfigurationService, - @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, - @IEnvironmentService private readonly environmentService: IEnvironmentService, - @IFileService private readonly fileService: IFileService, - @ITextModelService private readonly textModelResolverService: ITextModelService, - @ITextFileService private readonly textFileService: ITextFileService, - @INotificationService private readonly notificationService: INotificationService, - @IPreferencesService private readonly preferencesService: IPreferencesService, - @IEditorService private readonly editorService: IEditorService, - @IRemoteAgentService remoteAgentService: IRemoteAgentService + readonly value: IConfigurationValue, + readonly target: EditableConfigurationTarget, + readonly jsonPath: json.JSONPath, + readonly resource: URI | null, + readonly workspaceStandAloneConfigurationKey: string | undefined, + protected readonly contextService: IWorkspaceContextService ) { - this.queue = new Queue(); - remoteAgentService.getEnvironment().then(environment => { - if (environment) { - this.remoteSettingsResource = environment.settingsPath; - } - }); + super(); } - writeConfiguration(target: EditableConfigurationTarget, value: IConfigurationValue, options: IConfigurationEditingOptions = {}): Promise { - const operation = this.getConfigurationEditOperation(target, value, options.scopes || {}); - return Promise.resolve(this.queue.queue(() => this.doWriteConfiguration(operation, options) // queue up writes to prevent race conditions - .then(() => null, - error => { - if (!options.donotNotifyError) { - this.onError(error, operation, options.scopes); - } - return Promise.reject(error); - }))); - } - - private doWriteConfiguration(operation: IConfigurationEditOperation, options: ConfigurationEditingOptions): Promise { - const checkDirtyConfiguration = !(options.force || options.donotSave); - const saveConfiguration = options.force || !options.donotSave; - return this.resolveAndValidate(operation.target, operation, checkDirtyConfiguration, options.scopes || {}) - .then(reference => this.writeToBuffer(reference.object.textEditorModel, operation, saveConfiguration) - .then(() => reference.dispose())); - } - - private async writeToBuffer(model: ITextModel, operation: IConfigurationEditOperation, save: boolean): Promise { - const edit = this.getEdits(model, operation)[0]; - if (edit && this.applyEditsToBuffer(edit, model) && save) { - return this.textFileService.save(operation.resource!, { skipSaveParticipants: true /* programmatic change */ }); + async apply(save: boolean): Promise { + this.validate(); + const model = await this.resolve(); + if (this.hasParseErrors(model)) { + throw toConfigurationEditingError(ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION, this, this.contextService); } + const edit = this.getEdits(model)[0]; + if (edit && this.applyEditsToBuffer(edit, model) && save) { + await this.save(model); + } + } private applyEditsToBuffer(edit: Edit, model: ITextModel): boolean { @@ -195,6 +253,239 @@ export class ConfigurationEditingService { return false; } + private getEdits(model: ITextModel): Edit[] { + const { tabSize, insertSpaces } = model.getOptions(); + const eol = model.getEOL(); + + // Without jsonPath, the entire configuration file is being replaced, so we just use JSON.stringify + if (!this.jsonPath.length) { + const content = JSON.stringify(this.value.value, null, insertSpaces ? strings.repeat(' ', tabSize) : '\t'); + return [{ + content, + length: model.getValue().length, + offset: 0 + }]; + } + + return setProperty(model.getValue(), this.jsonPath, this.value.value, { tabSize, insertSpaces, eol }); + } + + private hasParseErrors(model: ITextModel): boolean { + // If we write to a workspace standalone file and replace the entire contents (no key provided) + // we can return here because any parse errors can safely be ignored since all contents are replaced + if (this.workspaceStandAloneConfigurationKey && !this.value.key) { + return false; + } + const parseErrors: json.ParseError[] = []; + json.parse(model.getValue(), parseErrors); + return parseErrors.length > 0; + } + + protected abstract validate(): void; + protected abstract save(model: ITextModel): Promise; + protected abstract resolve(): Promise; +} + +class ResourceConfigurationEditOperation extends ConfigurationEditOperation { + + private resolvePromise: Promise | undefined = undefined; + + constructor( + value: IConfigurationValue, + target: EditableConfigurationTarget, + jsonPath: json.JSONPath, + readonly resource: URI, + workspaceStandAloneConfigurationKey: string | undefined, + private readonly checkDirty: boolean, + @IFileService private readonly fileService: IFileService, + @ITextFileService private readonly textFileService: ITextFileService, + @ITextModelService private readonly textModelResolverService: ITextModelService, + @IConfigurationService private readonly configurationService: IConfigurationService, + @IWorkspaceContextService contextService: IWorkspaceContextService + ) { + super( + value, + target, + jsonPath, + resource, + workspaceStandAloneConfigurationKey, + contextService + ); + } + + protected async save(model: ITextModel): Promise { + await this.textFileService.save(this.resource, { skipSaveParticipants: true /* programmatic change */ }); + } + + protected async resolve(): Promise { + if (!this.resolvePromise) { + this.resolvePromise = this._resolve(); + } + return this.resolvePromise; + } + + protected validate(): void { + if (this.checkDirty && this.textFileService.isDirty(this.resource)) { + throw toConfigurationEditingError(ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY, this, this.contextService); + } + + // Any key must be a known setting from the registry (unless this is a standalone config) + if (!this.workspaceStandAloneConfigurationKey) { + const validKeys = this.configurationService.keys().default; + if (validKeys.indexOf(this.value.key) < 0 && !OVERRIDE_PROPERTY_PATTERN.test(this.value.key)) { + throw toConfigurationEditingError(ConfigurationEditingErrorCode.ERROR_UNKNOWN_KEY, this, this.contextService); + } + } + + if (this.workspaceStandAloneConfigurationKey) { + // Global tasks and launches are not supported + if (this.target === EditableConfigurationTarget.USER_LOCAL || this.target === EditableConfigurationTarget.USER_REMOTE) { + throw toConfigurationEditingError(ConfigurationEditingErrorCode.ERROR_INVALID_USER_TARGET, this, this.contextService); + } + + // Workspace tasks are not supported + if (this.workspaceStandAloneConfigurationKey === TASKS_CONFIGURATION_KEY && this.contextService.getWorkbenchState() === WorkbenchState.WORKSPACE && this.target === EditableConfigurationTarget.WORKSPACE) { + throw toConfigurationEditingError(ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_TARGET, this, this.contextService); + } + } + + // Target cannot be workspace or folder if no workspace opened + if ((this.target === EditableConfigurationTarget.WORKSPACE || this.target === EditableConfigurationTarget.WORKSPACE_FOLDER) && this.contextService.getWorkbenchState() === WorkbenchState.EMPTY) { + throw toConfigurationEditingError(ConfigurationEditingErrorCode.ERROR_NO_WORKSPACE_OPENED, this, this.contextService); + } + + if (this.target === EditableConfigurationTarget.WORKSPACE) { + if (!this.workspaceStandAloneConfigurationKey) { + const configurationProperties = Registry.as(ConfigurationExtensions.Configuration).getConfigurationProperties(); + if (configurationProperties[this.value.key].scope === ConfigurationScope.APPLICATION) { + throw toConfigurationEditingError(ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_CONFIGURATION_APPLICATION, this, this.contextService); + } + if (configurationProperties[this.value.key].scope === ConfigurationScope.MACHINE) { + throw toConfigurationEditingError(ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_CONFIGURATION_MACHINE, this, this.contextService); + } + } + } + + if (this.target === EditableConfigurationTarget.WORKSPACE_FOLDER) { + if (!this.resource) { + throw toConfigurationEditingError(ConfigurationEditingErrorCode.ERROR_INVALID_FOLDER_TARGET, this, this.contextService); + } + + if (!this.workspaceStandAloneConfigurationKey) { + const configurationProperties = Registry.as(ConfigurationExtensions.Configuration).getConfigurationProperties(); + if (configurationProperties[this.value.key].scope !== ConfigurationScope.RESOURCE) { + throw toConfigurationEditingError(ConfigurationEditingErrorCode.ERROR_INVALID_FOLDER_CONFIGURATION, this, this.contextService); + } + } + } + + if (!this.resource) { + throw toConfigurationEditingError(ConfigurationEditingErrorCode.ERROR_INVALID_FOLDER_TARGET, this, this.contextService); + } + } + + private async _resolve(): Promise { + const exists = await this.fileService.exists(this.resource); + if (!exists) { + await this.textFileService.write(this.resource, '{}', { encoding: 'utf8' }); + } + const reference = this._register(await this.textModelResolverService.createModelReference(this.resource)); + return reference.object.textEditorModel; + } +} + +class UserConfigurationEditOperation extends ConfigurationEditOperation { + + private resolvePromise: Promise | undefined = undefined; + + constructor( + value: IConfigurationValue, + jsonPath: json.JSONPath, + @IUserDataService private readonly userDataService: IUserDataService, + @IModelService private readonly modelService: IModelService, + @IModeService private readonly modeService: IModeService, + @IConfigurationService private readonly configurationService: IConfigurationService, + @IWorkspaceContextService contextService: IWorkspaceContextService + ) { + super( + value, + EditableConfigurationTarget.USER_LOCAL, + jsonPath, + null, + undefined, + contextService + ); + } + + protected async save(model: ITextModel): Promise { + await this.userDataService.write(USER_CONFIGURATION_KEY, model.getValue()); + } + + protected validate(): void { + // Any key must be a known setting from the registry + const validKeys = this.configurationService.keys().default; + if (validKeys.indexOf(this.value.key) < 0 && !OVERRIDE_PROPERTY_PATTERN.test(this.value.key)) { + throw toConfigurationEditingError(ConfigurationEditingErrorCode.ERROR_UNKNOWN_KEY, this, this.contextService); + } + } + + protected resolve(): Promise { + if (!this.resolvePromise) { + this.resolvePromise = this._resolve(); + } + return this.resolvePromise; + } + + private async _resolve(): Promise { + const content = (await this.userDataService.read(USER_CONFIGURATION_KEY)) || '{}'; + const languageIdentifier = this.modeService.getLanguageIdentifier('jsonc'); + const model = this.modelService.createModel(content, languageIdentifier ? { languageIdentifier, onDidChange: new Emitter().event, dispose: () => { } } : null); + this._register(toDisposable(() => { + model.dispose(); + this.modelService.destroyModel(model.uri); + })); + return model; + } +} + +export class ConfigurationEditingService { + + public _serviceBrand: any; + + private queue: Queue; + private remoteSettingsResource: URI | null; + + constructor( + @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, + @INotificationService private readonly notificationService: INotificationService, + @IPreferencesService private readonly preferencesService: IPreferencesService, + @IEditorService private readonly editorService: IEditorService, + @IRemoteAgentService remoteAgentService: IRemoteAgentService, + @IInstantiationService private readonly instantiationService: IInstantiationService, + ) { + this.queue = new Queue(); + remoteAgentService.getEnvironment().then(environment => { + if (environment) { + this.remoteSettingsResource = environment.settingsPath; + } + }); + } + + writeConfiguration(target: EditableConfigurationTarget, value: IConfigurationValue, options: ConfigurationEditingOptions = {}): Promise { + return this.queue.queue(async () => { // queue up writes to prevent race conditions + const operation = this.getConfigurationEditOperation(target, value, options.scopes || {}, !(options.force || options.donotSave)); + try { + await operation.apply(options.force || !options.donotSave); + operation.dispose(); + } catch (error) { + if (!options.donotNotifyError) { + this.onError(error, operation, options.scopes); + } + return Promise.reject(error); + } + }); + } + private onError(error: ConfigurationEditingError, operation: IConfigurationEditOperation, scopes: IConfigurationOverrides | undefined): void { switch (error.code) { case ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION: @@ -238,7 +529,7 @@ export class ConfigurationEditingService { [{ label: nls.localize('saveAndRetry', "Save and Retry"), run: () => { - const key = operation.key ? `${operation.workspaceStandAloneConfigurationKey}.${operation.key}` : operation.workspaceStandAloneConfigurationKey!; + const key = operation.value.key ? `${operation.workspaceStandAloneConfigurationKey}.${operation.value.key}` : operation.workspaceStandAloneConfigurationKey!; this.writeConfiguration(operation.target, { key, value: operation.value }, { force: true, scopes }); } }, @@ -251,7 +542,7 @@ export class ConfigurationEditingService { this.notificationService.prompt(Severity.Error, error.message, [{ label: nls.localize('saveAndRetry', "Save and Retry"), - run: () => this.writeConfiguration(operation.target, { key: operation.key, value: operation.value }, { force: true, scopes }) + run: () => this.writeConfiguration(operation.target, { key: operation.value.key, value: operation.value }, { force: true, scopes }) }, { label: nls.localize('open', "Open Settings"), @@ -287,205 +578,7 @@ export class ConfigurationEditingService { this.editorService.openEditor({ resource }); } - private reject(code: ConfigurationEditingErrorCode, target: EditableConfigurationTarget, operation: IConfigurationEditOperation): Promise { - const message = this.toErrorMessage(code, target, operation); - - return Promise.reject(new ConfigurationEditingError(message, code)); - } - - private toErrorMessage(error: ConfigurationEditingErrorCode, target: EditableConfigurationTarget, operation: IConfigurationEditOperation): string { - switch (error) { - - // API constraints - case ConfigurationEditingErrorCode.ERROR_UNKNOWN_KEY: return nls.localize('errorUnknownKey', "Unable to write to {0} because {1} is not a registered configuration.", this.stringifyTarget(target), operation.key); - case ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_CONFIGURATION_APPLICATION: return nls.localize('errorInvalidWorkspaceConfigurationApplication', "Unable to write {0} to Workspace Settings. This setting can be written only into User settings.", operation.key); - case ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_CONFIGURATION_MACHINE: return nls.localize('errorInvalidWorkspaceConfigurationMachine', "Unable to write {0} to Workspace Settings. This setting can be written only into User settings.", operation.key); - case ConfigurationEditingErrorCode.ERROR_INVALID_FOLDER_CONFIGURATION: return nls.localize('errorInvalidFolderConfiguration', "Unable to write to Folder Settings because {0} does not support the folder resource scope.", operation.key); - case ConfigurationEditingErrorCode.ERROR_INVALID_USER_TARGET: return nls.localize('errorInvalidUserTarget', "Unable to write to User Settings because {0} does not support for global scope.", operation.key); - case ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_TARGET: return nls.localize('errorInvalidWorkspaceTarget', "Unable to write to Workspace Settings because {0} does not support for workspace scope in a multi folder workspace.", operation.key); - case ConfigurationEditingErrorCode.ERROR_INVALID_FOLDER_TARGET: return nls.localize('errorInvalidFolderTarget', "Unable to write to Folder Settings because no resource is provided."); - case ConfigurationEditingErrorCode.ERROR_NO_WORKSPACE_OPENED: return nls.localize('errorNoWorkspaceOpened', "Unable to write to {0} because no workspace is opened. Please open a workspace first and try again.", this.stringifyTarget(target)); - - // User issues - case ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION: { - if (operation.workspaceStandAloneConfigurationKey === TASKS_CONFIGURATION_KEY) { - return nls.localize('errorInvalidTaskConfiguration', "Unable to write into the tasks configuration file. Please open it to correct errors/warnings in it and try again."); - } - if (operation.workspaceStandAloneConfigurationKey === LAUNCH_CONFIGURATION_KEY) { - return nls.localize('errorInvalidLaunchConfiguration', "Unable to write into the launch configuration file. Please open it to correct errors/warnings in it and try again."); - } - switch (target) { - case EditableConfigurationTarget.USER_LOCAL: - return nls.localize('errorInvalidConfiguration', "Unable to write into user settings. Please open the user settings to correct errors/warnings in it and try again."); - case EditableConfigurationTarget.USER_REMOTE: - return nls.localize('errorInvalidRemoteConfiguration', "Unable to write into remote user settings. Please open the remote user settings to correct errors/warnings in it and try again."); - case EditableConfigurationTarget.WORKSPACE: - return nls.localize('errorInvalidConfigurationWorkspace', "Unable to write into workspace settings. Please open the workspace settings to correct errors/warnings in the file and try again."); - case EditableConfigurationTarget.WORKSPACE_FOLDER: - let workspaceFolderName: string = '<>'; - if (operation.resource) { - const folder = this.contextService.getWorkspaceFolder(operation.resource); - if (folder) { - workspaceFolderName = folder.name; - } - } - return nls.localize('errorInvalidConfigurationFolder', "Unable to write into folder settings. Please open the '{0}' folder settings to correct errors/warnings in it and try again.", workspaceFolderName); - } - return ''; - } - case ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY: { - if (operation.workspaceStandAloneConfigurationKey === TASKS_CONFIGURATION_KEY) { - return nls.localize('errorTasksConfigurationFileDirty', "Unable to write into tasks configuration file because the file is dirty. Please save it first and then try again."); - } - if (operation.workspaceStandAloneConfigurationKey === LAUNCH_CONFIGURATION_KEY) { - return nls.localize('errorLaunchConfigurationFileDirty', "Unable to write into launch configuration file because the file is dirty. Please save it first and then try again."); - } - switch (target) { - case EditableConfigurationTarget.USER_LOCAL: - return nls.localize('errorConfigurationFileDirty', "Unable to write into user settings because the file is dirty. Please save the user settings file first and then try again."); - case EditableConfigurationTarget.USER_REMOTE: - return nls.localize('errorRemoteConfigurationFileDirty', "Unable to write into remote user settings because the file is dirty. Please save the remote user settings file first and then try again."); - case EditableConfigurationTarget.WORKSPACE: - return nls.localize('errorConfigurationFileDirtyWorkspace', "Unable to write into workspace settings because the file is dirty. Please save the workspace settings file first and then try again."); - case EditableConfigurationTarget.WORKSPACE_FOLDER: - let workspaceFolderName: string = '<>'; - if (operation.resource) { - const folder = this.contextService.getWorkspaceFolder(operation.resource); - if (folder) { - workspaceFolderName = folder.name; - } - } - return nls.localize('errorConfigurationFileDirtyFolder', "Unable to write into folder settings because the file is dirty. Please save the '{0}' folder settings file first and then try again.", workspaceFolderName); - } - return ''; - } - } - } - - private stringifyTarget(target: EditableConfigurationTarget): string { - switch (target) { - case EditableConfigurationTarget.USER_LOCAL: - return nls.localize('userTarget', "User Settings"); - case EditableConfigurationTarget.USER_REMOTE: - return nls.localize('remoteUserTarget', "Remote User Settings"); - case EditableConfigurationTarget.WORKSPACE: - return nls.localize('workspaceTarget', "Workspace Settings"); - case EditableConfigurationTarget.WORKSPACE_FOLDER: - return nls.localize('folderTarget', "Folder Settings"); - } - return ''; - } - - private getEdits(model: ITextModel, edit: IConfigurationEditOperation): Edit[] { - const { tabSize, insertSpaces } = model.getOptions(); - const eol = model.getEOL(); - const { value, jsonPath } = edit; - - // Without jsonPath, the entire configuration file is being replaced, so we just use JSON.stringify - if (!jsonPath.length) { - const content = JSON.stringify(value, null, insertSpaces ? strings.repeat(' ', tabSize) : '\t'); - return [{ - content, - length: model.getValue().length, - offset: 0 - }]; - } - - return setProperty(model.getValue(), jsonPath, value, { tabSize, insertSpaces, eol }); - } - - private async resolveModelReference(resource: URI): Promise> { - const exists = await this.fileService.exists(resource); - if (!exists) { - await this.textFileService.write(resource, '{}', { encoding: 'utf8' }); - } - return this.textModelResolverService.createModelReference(resource); - } - - private hasParseErrors(model: ITextModel, operation: IConfigurationEditOperation): boolean { - // If we write to a workspace standalone file and replace the entire contents (no key provided) - // we can return here because any parse errors can safely be ignored since all contents are replaced - if (operation.workspaceStandAloneConfigurationKey && !operation.key) { - return false; - } - const parseErrors: json.ParseError[] = []; - json.parse(model.getValue(), parseErrors); - return parseErrors.length > 0; - } - - private resolveAndValidate(target: EditableConfigurationTarget, operation: IConfigurationEditOperation, checkDirty: boolean, overrides: IConfigurationOverrides): Promise> { - - // Any key must be a known setting from the registry (unless this is a standalone config) - if (!operation.workspaceStandAloneConfigurationKey) { - const validKeys = this.configurationService.keys().default; - if (validKeys.indexOf(operation.key) < 0 && !OVERRIDE_PROPERTY_PATTERN.test(operation.key)) { - return this.reject(ConfigurationEditingErrorCode.ERROR_UNKNOWN_KEY, target, operation); - } - } - - if (operation.workspaceStandAloneConfigurationKey) { - // Global tasks and launches are not supported - if (target === EditableConfigurationTarget.USER_LOCAL || target === EditableConfigurationTarget.USER_REMOTE) { - return this.reject(ConfigurationEditingErrorCode.ERROR_INVALID_USER_TARGET, target, operation); - } - - // Workspace tasks are not supported - if (operation.workspaceStandAloneConfigurationKey === TASKS_CONFIGURATION_KEY && this.contextService.getWorkbenchState() === WorkbenchState.WORKSPACE && operation.target === EditableConfigurationTarget.WORKSPACE) { - return this.reject(ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_TARGET, target, operation); - } - } - - // Target cannot be workspace or folder if no workspace opened - if ((target === EditableConfigurationTarget.WORKSPACE || target === EditableConfigurationTarget.WORKSPACE_FOLDER) && this.contextService.getWorkbenchState() === WorkbenchState.EMPTY) { - return this.reject(ConfigurationEditingErrorCode.ERROR_NO_WORKSPACE_OPENED, target, operation); - } - - if (target === EditableConfigurationTarget.WORKSPACE) { - if (!operation.workspaceStandAloneConfigurationKey) { - const configurationProperties = Registry.as(ConfigurationExtensions.Configuration).getConfigurationProperties(); - if (configurationProperties[operation.key].scope === ConfigurationScope.APPLICATION) { - return this.reject(ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_CONFIGURATION_APPLICATION, target, operation); - } - if (configurationProperties[operation.key].scope === ConfigurationScope.MACHINE) { - return this.reject(ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_CONFIGURATION_MACHINE, target, operation); - } - } - } - - if (target === EditableConfigurationTarget.WORKSPACE_FOLDER) { - if (!operation.resource) { - return this.reject(ConfigurationEditingErrorCode.ERROR_INVALID_FOLDER_TARGET, target, operation); - } - - if (!operation.workspaceStandAloneConfigurationKey) { - const configurationProperties = Registry.as(ConfigurationExtensions.Configuration).getConfigurationProperties(); - if (configurationProperties[operation.key].scope !== ConfigurationScope.RESOURCE) { - return this.reject(ConfigurationEditingErrorCode.ERROR_INVALID_FOLDER_CONFIGURATION, target, operation); - } - } - } - - if (!operation.resource) { - return this.reject(ConfigurationEditingErrorCode.ERROR_INVALID_FOLDER_TARGET, target, operation); - } - - return this.resolveModelReference(operation.resource) - .then(reference => { - const model = reference.object.textEditorModel; - - if (this.hasParseErrors(model, operation)) { - return this.reject(ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION, target, operation); - } - - // Target cannot be dirty if not writing into buffer - if (checkDirty && this.textFileService.isDirty(operation.resource)) { - return this.reject(ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY, target, operation); - } - return reference; - }); - } - - private getConfigurationEditOperation(target: EditableConfigurationTarget, config: IConfigurationValue, overrides: IConfigurationOverrides): IConfigurationEditOperation { + private getConfigurationEditOperation(target: EditableConfigurationTarget, config: IConfigurationValue, overrides: IConfigurationOverrides, checkDirty: boolean): IConfigurationEditOperation { // Check for standalone workspace configurations if (config.key) { @@ -496,29 +589,32 @@ export class ConfigurationEditingService { // Check for prefix if (config.key === key) { const jsonPath = this.isWorkspaceConfigurationResource(resource) ? [key] : []; - return { key: jsonPath[jsonPath.length - 1], jsonPath, value: config.value, resource: withNullAsUndefined(resource), workspaceStandAloneConfigurationKey: key, target }; + return this.instantiationService.createInstance(ResourceConfigurationEditOperation, { key: jsonPath[jsonPath.length - 1], value: config.value }, target, jsonPath, resource, key, checkDirty); } // Check for prefix. const keyPrefix = `${key}.`; if (config.key.indexOf(keyPrefix) === 0) { const jsonPath = this.isWorkspaceConfigurationResource(resource) ? [key, config.key.substr(keyPrefix.length)] : [config.key.substr(keyPrefix.length)]; - return { key: jsonPath[jsonPath.length - 1], jsonPath, value: config.value, resource: withNullAsUndefined(resource), workspaceStandAloneConfigurationKey: key, target }; + return this.instantiationService.createInstance(ResourceConfigurationEditOperation, { key: jsonPath[jsonPath.length - 1], value: config.value }, target, jsonPath, resource, key, checkDirty); } } } let key = config.key; let jsonPath = overrides.overrideIdentifier ? [keyFromOverrideIdentifier(overrides.overrideIdentifier), key] : [key]; - if (target === EditableConfigurationTarget.USER_LOCAL || target === EditableConfigurationTarget.USER_REMOTE) { - return { key, jsonPath, value: config.value, resource: withNullAsUndefined(this.getConfigurationFileResource(target, config, '', null)), target }; + if (target === EditableConfigurationTarget.USER_LOCAL) { + return this.instantiationService.createInstance(UserConfigurationEditOperation, { key, value: config.value }, jsonPath); + } + if (target === EditableConfigurationTarget.USER_REMOTE) { + return this.instantiationService.createInstance(ResourceConfigurationEditOperation, { key, value: config.value }, target, jsonPath, withNullAsUndefined(this.getConfigurationFileResource(target, config, '', null)), undefined, checkDirty); } const resource = this.getConfigurationFileResource(target, config, FOLDER_SETTINGS_PATH, overrides.resource); if (this.isWorkspaceConfigurationResource(resource)) { jsonPath = ['settings', ...jsonPath]; } - return { key, jsonPath, value: config.value, resource: withNullAsUndefined(resource), target }; + return this.instantiationService.createInstance(ResourceConfigurationEditOperation, { key, value: config.value }, target, jsonPath, withNullAsUndefined(resource), undefined, checkDirty); } private isWorkspaceConfigurationResource(resource: URI | null): boolean { @@ -528,7 +624,7 @@ export class ConfigurationEditingService { private getConfigurationFileResource(target: EditableConfigurationTarget, config: IConfigurationValue, relativePath: string, resource: URI | null | undefined): URI | null { if (target === EditableConfigurationTarget.USER_LOCAL) { - return this.environmentService.settingsResource; + return null; } if (target === EditableConfigurationTarget.USER_REMOTE) { return this.remoteSettingsResource; 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 f94f09794b4..8f2b128f1dd 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 @@ -40,14 +40,17 @@ import { DiskFileSystemProvider } from 'vs/workbench/services/files/node/diskFil import { IFileService } from 'vs/platform/files/common/files'; import { ConfigurationCache } from 'vs/workbench/services/configuration/node/configurationCache'; import { FileUserDataService } from 'vs/workbench/services/userData/common/fileUserDataService'; +import { IUserDataService } from 'vs/workbench/services/userData/common/userDataService'; +import { dirname } from 'vs/base/common/resources'; class SettingsTestEnvironmentService extends EnvironmentService { - constructor(args: ParsedArgs, _execPath: string, private customAppSettingsHome: string) { + constructor(args: ParsedArgs, _execPath: string, private _settingsPath: string) { super(args, _execPath); } - get settingsResource(): URI { return URI.file(this.customAppSettingsHome); } + get appSettingsHome(): URI { return dirname(this.settingsResource); } + get settingsResource(): URI { return URI.file(this._settingsPath); } } suite('ConfigurationEditingService', () => { @@ -90,7 +93,7 @@ suite('ConfigurationEditingService', () => { const id = uuid.generateUuid(); parentDir = path.join(os.tmpdir(), 'vsctests', id); workspaceDir = path.join(parentDir, 'workspaceconfig', id); - globalSettingsFile = path.join(workspaceDir, 'config.json'); + globalSettingsFile = path.join(workspaceDir, 'settings.json'); workspaceSettingsDir = path.join(workspaceDir, '.vscode'); return await mkdirp(workspaceSettingsDir, 493); @@ -109,6 +112,7 @@ suite('ConfigurationEditingService', () => { instantiationService.stub(IFileService, fileService); instantiationService.stub(IRemoteAgentService, remoteAgentService); const userDataService = new FileUserDataService(environmentService, fileService); + instantiationService.stub(IUserDataService, userDataService); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); return workspaceService.initialize(noWorkspace ? { id: '' } : { folder: URI.file(workspaceDir), id: createHash('md5').update(URI.file(workspaceDir).toString()).digest('hex') }).then(() => { @@ -145,6 +149,12 @@ suite('ConfigurationEditingService', () => { }).then(() => parentDir = null!); } + test('errors cases - invalid key (user)', () => { + return testObject.writeConfiguration(EditableConfigurationTarget.USER_LOCAL, { key: 'unknown.key', value: 'value' }) + .then(() => assert.fail('Should fail with ERROR_UNKNOWN_KEY'), + (error: ConfigurationEditingError) => assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_UNKNOWN_KEY)); + }); + test('errors cases - invalid key', () => { return testObject.writeConfiguration(EditableConfigurationTarget.WORKSPACE, { key: 'unknown.key', value: 'value' }) .then(() => assert.fail('Should fail with ERROR_UNKNOWN_KEY'), @@ -171,31 +181,6 @@ suite('ConfigurationEditingService', () => { (error: ConfigurationEditingError) => assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION)); }); - test('errors cases - dirty', () => { - instantiationService.stub(ITextFileService, 'isDirty', true); - return testObject.writeConfiguration(EditableConfigurationTarget.USER_LOCAL, { key: 'configurationEditing.service.testSetting', value: 'value' }) - .then(() => assert.fail('Should fail with ERROR_CONFIGURATION_FILE_DIRTY error.'), - (error: ConfigurationEditingError) => assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY)); - }); - - test('dirty error is not thrown if not asked to save', () => { - instantiationService.stub(ITextFileService, 'isDirty', true); - return testObject.writeConfiguration(EditableConfigurationTarget.USER_LOCAL, { key: 'configurationEditing.service.testSetting', value: 'value' }, { donotSave: true }) - .then(() => null, error => assert.fail('Should not fail.')); - }); - - test('do not notify error', () => { - instantiationService.stub(ITextFileService, 'isDirty', true); - const target = sinon.stub(); - instantiationService.stub(INotificationService, { prompt: target, _serviceBrand: null!, notify: null!, error: null!, info: null!, warn: null!, status: null! }); - return testObject.writeConfiguration(EditableConfigurationTarget.USER_LOCAL, { key: 'configurationEditing.service.testSetting', value: 'value' }, { donotNotifyError: true }) - .then(() => assert.fail('Should fail with ERROR_CONFIGURATION_FILE_DIRTY error.'), - (error: ConfigurationEditingError) => { - assert.equal(false, target.calledOnce); - assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY); - }); - }); - test('write one setting - empty file', () => { return testObject.writeConfiguration(EditableConfigurationTarget.USER_LOCAL, { key: 'configurationEditing.service.testSetting', value: 'value' }) .then(() => { @@ -238,6 +223,38 @@ suite('ConfigurationEditingService', () => { }); }); + test('errors cases - invalid configuration (workspace_', () => { + fs.writeFileSync(globalSettingsFile, ',,,,,,,,,,,,,,'); + return testObject.writeConfiguration(EditableConfigurationTarget.USER_LOCAL, { key: 'configurationEditing.service.testSetting', value: 'value' }) + .then(() => assert.fail('Should fail with ERROR_INVALID_CONFIGURATION'), + (error: ConfigurationEditingError) => assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION)); + }); + + test('errors cases - dirty', () => { + instantiationService.stub(ITextFileService, 'isDirty', true); + return testObject.writeConfiguration(EditableConfigurationTarget.WORKSPACE, { key: 'tasks.service.testSetting', value: 'value' }) + .then(() => assert.fail('Should fail with ERROR_CONFIGURATION_FILE_DIRTY error.'), + (error: ConfigurationEditingError) => assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY)); + }); + + test('dirty error is not thrown if not asked to save', () => { + instantiationService.stub(ITextFileService, 'isDirty', true); + return testObject.writeConfiguration(EditableConfigurationTarget.WORKSPACE, { key: 'tasks.service.testSetting', value: 'value' }, { donotSave: true }) + .then(() => null, error => assert.fail('Should not fail.')); + }); + + test('do not notify error', () => { + instantiationService.stub(ITextFileService, 'isDirty', true); + const target = sinon.stub(); + instantiationService.stub(INotificationService, { prompt: target, _serviceBrand: null!, notify: null!, error: null!, info: null!, warn: null!, status: null! }); + return testObject.writeConfiguration(EditableConfigurationTarget.WORKSPACE, { key: 'tasks.service.testSetting', value: 'value' }, { donotNotifyError: true }) + .then(() => assert.fail('Should fail with ERROR_CONFIGURATION_FILE_DIRTY error.'), + (error: ConfigurationEditingError) => { + assert.equal(false, target.calledOnce); + assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY); + }); + }); + test('write workspace standalone setting - empty file', () => { return testObject.writeConfiguration(EditableConfigurationTarget.WORKSPACE, { key: 'tasks.service.testSetting', value: 'value' }) .then(() => { From f1150d66fcff3c56bc6fc68b9fa7d7a88e19859b Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 23 Jun 2019 17:26:53 +0200 Subject: [PATCH 0535/1449] UserDataFileProvider for handling user data resources --- src/vs/base/common/network.ts | 2 + src/vs/base/test/node/utils.ts | 4 +- .../sharedProcess/sharedProcessMain.ts | 2 +- src/vs/code/electron-main/main.ts | 2 +- src/vs/code/node/cliProcessMain.ts | 2 +- .../standalone/browser/simpleServices.ts | 2 + .../configuration/common/configuration.ts | 1 + .../node/configurationService.ts | 14 ++-- .../test/common/testConfigurationService.ts | 2 + .../test/node/configurationService.test.ts | 39 +++++----- .../environment/common/environment.ts | 1 - .../environment/node/environmentService.ts | 3 - .../electron-browser/telemetryService.test.ts | 2 + .../windows/electron-main/windowsService.ts | 3 + src/vs/workbench/browser/web.main.ts | 6 +- .../files/browser/fileActions.contribution.ts | 1 - .../browser/preferences.contribution.ts | 4 +- .../common/preferencesContribution.ts | 4 +- .../electron-browser/main.contribution.ts | 14 ++++ src/vs/workbench/electron-browser/main.ts | 2 + .../configuration/browser/configuration.ts | 5 +- .../browser/configurationService.ts | 2 + .../common/configurationEditingService.ts | 3 +- .../configurationEditingService.test.ts | 3 +- .../configurationService.test.ts | 27 +++---- .../configurationResolverService.test.ts | 3 +- .../environment/browser/environmentService.ts | 2 - .../keybindingEditing.test.ts | 2 +- .../preferences/browser/preferencesService.ts | 4 +- .../textfile/common/textFileEditorModel.ts | 6 +- .../common/textResourcePropertiesService.ts | 2 +- .../userData/common/fileUserDataService.ts | 23 ++++-- .../userData/common/userDataFileProvider.ts | 72 +++++++++++++++++++ .../userData/common/userDataService.ts | 6 ++ 34 files changed, 199 insertions(+), 71 deletions(-) create mode 100644 src/vs/workbench/services/userData/common/userDataFileProvider.ts diff --git a/src/vs/base/common/network.ts b/src/vs/base/common/network.ts index a7466e641af..46d2933a05e 100644 --- a/src/vs/base/common/network.ts +++ b/src/vs/base/common/network.ts @@ -46,4 +46,6 @@ export namespace Schemas { export const command: string = 'command'; export const vscodeRemote: string = 'vscode-remote'; + + export const userData: string = 'vscode-userdata'; } diff --git a/src/vs/base/test/node/utils.ts b/src/vs/base/test/node/utils.ts index 58e77924fe6..5ba6f6e2472 100644 --- a/src/vs/base/test/node/utils.ts +++ b/src/vs/base/test/node/utils.ts @@ -16,8 +16,8 @@ export interface ITestFileResult { export function testFile(folder: string, file: string): Promise { const id = generateUuid(); const parentDir = join(tmpdir(), 'vsctests', id); - const newDir = join(parentDir, 'config', id); - const testFile = join(newDir, 'config.json'); + const newDir = join(parentDir, folder, id); + const testFile = join(newDir, file); return mkdirp(newDir, 493).then(() => { return { diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts index 34cd3e48a63..da1e7be6953 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts @@ -98,7 +98,7 @@ async function main(server: Server, initData: ISharedProcessInitData, configurat disposables.push(logService); logService.info('main', JSON.stringify(configuration)); - const configurationService = new ConfigurationService(environmentService.settingsResource); + const configurationService = new ConfigurationService(environmentService.appSettingsHome); disposables.push(configurationService); await configurationService.initialize(); diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index be40bfa20d0..d1be121aad1 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -142,7 +142,7 @@ class CodeMain { process.once('exit', () => logService.dispose()); services.set(ILogService, logService); - services.set(IConfigurationService, new ConfigurationService(environmentService.settingsResource)); + services.set(IConfigurationService, new ConfigurationService(environmentService.appSettingsHome)); services.set(ILifecycleService, new SyncDescriptor(LifecycleService)); services.set(IStateService, new SyncDescriptor(StateService)); services.set(IRequestService, new SyncDescriptor(RequestService)); diff --git a/src/vs/code/node/cliProcessMain.ts b/src/vs/code/node/cliProcessMain.ts index dafebd1c91f..63d6cfccca2 100644 --- a/src/vs/code/node/cliProcessMain.ts +++ b/src/vs/code/node/cliProcessMain.ts @@ -285,7 +285,7 @@ export async function main(argv: ParsedArgs): Promise { await Promise.all([environmentService.appSettingsHome.fsPath, environmentService.extensionsPath].map(p => mkdirp(p))); - const configurationService = new ConfigurationService(environmentService.settingsResource); + const configurationService = new ConfigurationService(environmentService.appSettingsHome); await configurationService.initialize(); services.set(IEnvironmentService, environmentService); diff --git a/src/vs/editor/standalone/browser/simpleServices.ts b/src/vs/editor/standalone/browser/simpleServices.ts index 1f44f246486..9a5ee6ed071 100644 --- a/src/vs/editor/standalone/browser/simpleServices.ts +++ b/src/vs/editor/standalone/browser/simpleServices.ts @@ -413,6 +413,8 @@ export class SimpleConfigurationService implements IConfigurationService { private readonly _configuration: Configuration; + userSettingsResource = URI.file('settings.json'); + constructor() { this._configuration = new Configuration(new DefaultConfigurationModel(), new ConfigurationModel()); } diff --git a/src/vs/platform/configuration/common/configuration.ts b/src/vs/platform/configuration/common/configuration.ts index e9758098d43..d98ce059c77 100644 --- a/src/vs/platform/configuration/common/configuration.ts +++ b/src/vs/platform/configuration/common/configuration.ts @@ -65,6 +65,7 @@ export interface IConfigurationChangeEvent { export interface IConfigurationService { _serviceBrand: any; + userSettingsResource: URI; onDidChangeConfiguration: Event; getConfigurationData(): IConfigurationData | null; diff --git a/src/vs/platform/configuration/node/configurationService.ts b/src/vs/platform/configuration/node/configurationService.ts index d3e4dfe09b1..aa8502dec8f 100644 --- a/src/vs/platform/configuration/node/configurationService.ts +++ b/src/vs/platform/configuration/node/configurationService.ts @@ -14,11 +14,14 @@ import { ConfigWatcher } from 'vs/base/node/config'; import { onUnexpectedError } from 'vs/base/common/errors'; import { URI } from 'vs/base/common/uri'; import { Schemas } from 'vs/base/common/network'; +import { joinPath } from 'vs/base/common/resources'; export class ConfigurationService extends Disposable implements IConfigurationService, IDisposable { _serviceBrand: any; + readonly userSettingsResource: URI; + private configuration: Configuration; private userConfigModelWatcher: ConfigWatcher | undefined; @@ -26,9 +29,10 @@ export class ConfigurationService extends Disposable implements IConfigurationSe readonly onDidChangeConfiguration: Event = this._onDidChangeConfiguration.event; constructor( - private readonly settingsResource: URI + appSettingsHome: URI ) { super(); + this.userSettingsResource = joinPath(appSettingsHome, 'settings.json'); this.configuration = new Configuration(new DefaultConfigurationModel(), new ConfigurationModel()); this._register(Registry.as(Extensions.Configuration).onDidUpdateConfiguration(configurationProperties => this.onDidDefaultConfigurationChange(configurationProperties))); } @@ -38,13 +42,13 @@ export class ConfigurationService extends Disposable implements IConfigurationSe this.userConfigModelWatcher.dispose(); } - if (this.settingsResource.scheme !== Schemas.file) { + if (this.userSettingsResource.scheme !== Schemas.file) { return Promise.resolve(); } return new Promise((c, e) => { - this.userConfigModelWatcher = this._register(new ConfigWatcher(this.settingsResource.fsPath, { - changeBufferDelay: 300, onError: error => onUnexpectedError(error), defaultConfig: new ConfigurationModelParser(this.settingsResource.fsPath), parse: (content: string, parseErrors: any[]) => { - const userConfigModelParser = new ConfigurationModelParser(this.settingsResource.fsPath); + this.userConfigModelWatcher = this._register(new ConfigWatcher(this.userSettingsResource.fsPath, { + changeBufferDelay: 300, onError: error => onUnexpectedError(error), defaultConfig: new ConfigurationModelParser(this.userSettingsResource.fsPath), parse: (content: string, parseErrors: any[]) => { + const userConfigModelParser = new ConfigurationModelParser(this.userSettingsResource.fsPath); userConfigModelParser.parseContent(content); parseErrors = [...userConfigModelParser.errors]; return userConfigModelParser; diff --git a/src/vs/platform/configuration/test/common/testConfigurationService.ts b/src/vs/platform/configuration/test/common/testConfigurationService.ts index 9bb4c8e2208..e5551acf347 100644 --- a/src/vs/platform/configuration/test/common/testConfigurationService.ts +++ b/src/vs/platform/configuration/test/common/testConfigurationService.ts @@ -14,6 +14,8 @@ export class TestConfigurationService implements IConfigurationService { private configurationByRoot: TernarySearchTree = TernarySearchTree.forPaths(); + userSettingsResource = URI.file('settings.json'); + public reloadConfiguration(): Promise { return Promise.resolve(this.getValue()); } diff --git a/src/vs/platform/configuration/test/node/configurationService.test.ts b/src/vs/platform/configuration/test/node/configurationService.test.ts index 22fdbb6c911..3619e33bdb1 100644 --- a/src/vs/platform/configuration/test/node/configurationService.test.ts +++ b/src/vs/platform/configuration/test/node/configurationService.test.ts @@ -14,14 +14,15 @@ import * as uuid from 'vs/base/common/uuid'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; import { testFile } from 'vs/base/test/node/utils'; import { URI } from 'vs/base/common/uri'; +import { dirname } from 'vs/base/common/resources'; suite('ConfigurationService - Node', () => { test('simple', async () => { - const res = await testFile('config', 'config.json'); + const res = await testFile('config', 'settings.json'); fs.writeFileSync(res.testFile, '{ "foo": "bar" }'); - const service = new ConfigurationService(URI.file(res.testFile)); + const service = new ConfigurationService(dirname(URI.file(res.testFile))); await service.initialize(); const config = service.getValue<{ foo: string; @@ -35,11 +36,11 @@ suite('ConfigurationService - Node', () => { }); test('config gets flattened', async () => { - const res = await testFile('config', 'config.json'); + const res = await testFile('config', 'settings.json'); fs.writeFileSync(res.testFile, '{ "testworkbench.editor.tabs": true }'); - const service = new ConfigurationService(URI.file(res.testFile)); + const service = new ConfigurationService(dirname(URI.file(res.testFile))); await service.initialize(); const config = service.getValue<{ testworkbench: { @@ -58,11 +59,11 @@ suite('ConfigurationService - Node', () => { }); test('error case does not explode', async () => { - const res = await testFile('config', 'config.json'); + const res = await testFile('config', 'settings.json'); fs.writeFileSync(res.testFile, ',,,,'); - const service = new ConfigurationService(URI.file(res.testFile)); + const service = new ConfigurationService(dirname(URI.file(res.testFile))); await service.initialize(); const config = service.getValue<{ foo: string; @@ -77,9 +78,9 @@ suite('ConfigurationService - Node', () => { const id = uuid.generateUuid(); const parentDir = path.join(os.tmpdir(), 'vsctests', id); const newDir = path.join(parentDir, 'config', id); - const testFile = path.join(newDir, 'config.json'); + const testFile = path.join(newDir, 'settings.json'); - const service = new ConfigurationService(URI.file(testFile)); + const service = new ConfigurationService(dirname(URI.file(testFile))); await service.initialize(); const config = service.getValue<{ foo: string }>(); @@ -89,9 +90,9 @@ suite('ConfigurationService - Node', () => { }); test('trigger configuration change event', async () => { - const res = await testFile('config', 'config.json'); + const res = await testFile('config', 'settings.json'); - const service = new ConfigurationService(URI.file(res.testFile)); + const service = new ConfigurationService(dirname(URI.file(res.testFile))); await service.initialize(); return new Promise((c, e) => { service.onDidChangeConfiguration(() => { @@ -105,11 +106,11 @@ suite('ConfigurationService - Node', () => { }); test('reloadConfiguration', async () => { - const res = await testFile('config', 'config.json'); + const res = await testFile('config', 'settings.json'); fs.writeFileSync(res.testFile, '{ "foo": "bar" }'); - const service = new ConfigurationService(URI.file(res.testFile)); + const service = new ConfigurationService(dirname(URI.file(res.testFile))); await service.initialize(); let config = service.getValue<{ foo: string; @@ -158,17 +159,17 @@ suite('ConfigurationService - Node', () => { } }); - let serviceWithoutFile = new ConfigurationService(URI.file('__testFile')); + let serviceWithoutFile = new ConfigurationService(dirname(URI.file('__testFile'))); await serviceWithoutFile.initialize(); let setting = serviceWithoutFile.getValue(); assert.ok(setting); assert.equal(setting.configuration.service.testSetting, 'isSet'); - return testFile('config', 'config.json').then(async res => { + return testFile('config', 'settings.json').then(async res => { fs.writeFileSync(res.testFile, '{ "testworkbench.editor.tabs": true }'); - const service = new ConfigurationService(URI.file(res.testFile)); + const service = new ConfigurationService(dirname(URI.file(res.testFile))); let setting = service.getValue(); @@ -200,8 +201,8 @@ suite('ConfigurationService - Node', () => { } }); - const r = await testFile('config', 'config.json'); - const service = new ConfigurationService(URI.file(r.testFile)); + const r = await testFile('config', 'settings.json'); + const service = new ConfigurationService(dirname(URI.file(r.testFile))); service.initialize(); let res = service.inspect('something.missing'); @@ -238,8 +239,8 @@ suite('ConfigurationService - Node', () => { } }); - const r = await testFile('config', 'config.json'); - const service = new ConfigurationService(URI.file(r.testFile)); + const r = await testFile('config', 'settings.json'); + const service = new ConfigurationService(dirname(URI.file(r.testFile))); service.initialize(); let res = service.inspect('lookup.service.testNullSetting'); diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index 210ac5080a3..2679dd2d68b 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -97,7 +97,6 @@ export interface IEnvironmentService { appNameLong: string; appQuality?: string; appSettingsHome: URI; - settingsResource: URI; keybindingsResource: URI; keyboardLayoutResource: URI; diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts index 12881effa53..e2b0934a468 100644 --- a/src/vs/platform/environment/node/environmentService.ts +++ b/src/vs/platform/environment/node/environmentService.ts @@ -114,9 +114,6 @@ export class EnvironmentService implements IEnvironmentService { @memoize get appSettingsHome(): URI { return URI.file(path.join(this.userDataPath, 'User')); } - @memoize - get settingsResource(): URI { return resources.joinPath(this.appSettingsHome, 'settings.json'); } - @memoize get machineSettingsHome(): URI { return URI.file(path.join(this.userDataPath, 'Machine')); } diff --git a/src/vs/platform/telemetry/test/electron-browser/telemetryService.test.ts b/src/vs/platform/telemetry/test/electron-browser/telemetryService.test.ts index 9f728745344..530ffae4699 100644 --- a/src/vs/platform/telemetry/test/electron-browser/telemetryService.test.ts +++ b/src/vs/platform/telemetry/test/electron-browser/telemetryService.test.ts @@ -11,6 +11,7 @@ import * as Errors from 'vs/base/common/errors'; import * as sinon from 'sinon'; import { getConfigurationValue } from 'vs/platform/configuration/common/configuration'; import { ITelemetryData } from 'vs/platform/telemetry/common/telemetry'; +import { URI } from 'vs/base/common/uri'; class TestTelemetryAppender implements ITelemetryAppender { @@ -769,6 +770,7 @@ suite('TelemetryService', () => { appender: testAppender }, { _serviceBrand: undefined, + userSettingsResource: URI.file('settings.json'), getValue() { return { enableTelemetry: enableTelemetry diff --git a/src/vs/platform/windows/electron-main/windowsService.ts b/src/vs/platform/windows/electron-main/windowsService.ts index 1c3c4734384..80ef92456ae 100644 --- a/src/vs/platform/windows/electron-main/windowsService.ts +++ b/src/vs/platform/windows/electron-main/windowsService.ts @@ -342,6 +342,9 @@ export class WindowsService extends Disposable implements IWindowsService, IURLH if (path.scheme === Schemas.file) { shell.showItemInFolder(path.fsPath); } + if (path.scheme === Schemas.userData) { + shell.showItemInFolder(path.path); + } } async getActiveWindowId(): Promise { diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index 9b4051ac410..3e64ed90871 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -35,8 +35,9 @@ import { SignService } from 'vs/platform/sign/browser/signService'; import { hash } from 'vs/base/common/hash'; import { IWorkbenchConstructionOptions } from 'vs/workbench/workbench.web.api'; import { ProductService } from 'vs/platform/product/browser/productService'; -import { FileUserDataService } from '../services/userData/common/fileUserDataService'; -import { IUserDataService } from '../services/userData/common/userDataService'; +import { FileUserDataService } from 'vs/workbench/services/userData/common/fileUserDataService'; +import { IUserDataService } from 'vs/workbench//services/userData/common/userDataService'; +import { UserDataFileProvider } from 'vs/workbench//services/userData/common/userDataFileProvider'; class CodeRendererMain extends Disposable { @@ -122,6 +123,7 @@ class CodeRendererMain extends Disposable { // User Data Service const userDataService = this._register(new FileUserDataService(environmentService, fileService)); serviceCollection.set(IUserDataService, userDataService); + fileService.registerProvider(Schemas.userData, new UserDataFileProvider(userDataService)); const payload = await this.resolveWorkspaceInitializationPayload(); diff --git a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts index 8573f02c5a2..152668b7c7f 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts @@ -167,7 +167,6 @@ const copyRelativePathCommand = { // Editor Title Context Menu appendEditorTitleContextMenuItem(COPY_PATH_COMMAND_ID, copyPathCommand.title, ResourceContextKey.IsFileSystemResource, '1_cutcopypaste'); appendEditorTitleContextMenuItem(COPY_RELATIVE_PATH_COMMAND_ID, copyRelativePathCommand.title, ResourceContextKey.IsFileSystemResource, '1_cutcopypaste'); -appendEditorTitleContextMenuItem(REVEAL_IN_OS_COMMAND_ID, REVEAL_IN_OS_LABEL, ResourceContextKey.Scheme.isEqualTo(Schemas.file)); appendEditorTitleContextMenuItem(REVEAL_IN_EXPLORER_COMMAND_ID, nls.localize('revealInSideBar', "Reveal in Side Bar"), ResourceContextKey.IsFileSystemResource); function appendEditorTitleContextMenuItem(id: string, title: string, when: ContextKeyExpr, group?: string): void { diff --git a/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts b/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts index 20c9985f632..cf6d46bc632 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts @@ -39,6 +39,7 @@ import { ExplorerRootContext, ExplorerFolderContext } from 'vs/workbench/contrib import { ILabelService } from 'vs/platform/label/common/label'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; Registry.as(EditorExtensions.Editors).registerEditor( new EditorDescriptor( @@ -370,6 +371,7 @@ class PreferencesActionsContribution extends Disposable implements IWorkbenchCon constructor( @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, + @IConfigurationService configurationService: IConfigurationService, @IPreferencesService private readonly preferencesService: IPreferencesService, @IWorkspaceContextService private readonly workpsaceContextService: IWorkspaceContextService, @ILabelService labelService: ILabelService, @@ -401,7 +403,7 @@ class PreferencesActionsContribution extends Disposable implements IWorkbenchCon dark: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/browser/media/preferences-editor-inverse.svg`)) } }, - when: ResourceContextKey.Resource.isEqualTo(environmentService.settingsResource.toString()), + when: ResourceContextKey.Resource.isEqualTo(configurationService.userSettingsResource.toString()), group: 'navigation', order: 1 }); diff --git a/src/vs/workbench/contrib/preferences/common/preferencesContribution.ts b/src/vs/workbench/contrib/preferences/common/preferencesContribution.ts index 246eaf2ed11..52097f9afc2 100644 --- a/src/vs/workbench/contrib/preferences/common/preferencesContribution.ts +++ b/src/vs/workbench/contrib/preferences/common/preferencesContribution.ts @@ -14,7 +14,6 @@ import { IModeService } from 'vs/editor/common/services/modeService'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IEditorOptions, ITextEditorOptions } from 'vs/platform/editor/common/editor'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import * as JSONContributionRegistry from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; import { Registry } from 'vs/platform/registry/common/platform'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; @@ -36,7 +35,6 @@ export class PreferencesContribution implements IWorkbenchContribution { @IPreferencesService private readonly preferencesService: IPreferencesService, @IModeService private readonly modeService: IModeService, @IEditorService private readonly editorService: IEditorService, - @IEnvironmentService private readonly environmentService: IEnvironmentService, @IWorkspaceContextService private readonly workspaceService: IWorkspaceContextService, @IConfigurationService private readonly configurationService: IConfigurationService ) { @@ -79,7 +77,7 @@ export class PreferencesContribution implements IWorkbenchContribution { } // Global User Settings File - if (isEqual(resource, this.environmentService.settingsResource, !isLinux)) { + if (isEqual(resource, this.configurationService.userSettingsResource, !isLinux)) { return { override: this.preferencesService.openGlobalSettings(true, options, group) }; } diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index aa6647f914f..b31b01cdfc5 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -26,6 +26,9 @@ import { NoEditorsVisibleContext, SingleEditorGroupsContext } from 'vs/workbench import { IWindowService, IWindowsService } from 'vs/platform/windows/common/windows'; import { LogStorageAction } from 'vs/platform/storage/node/storageService'; import product from 'vs/platform/product/node/product'; +import { REVEAL_IN_OS_COMMAND_ID, REVEAL_IN_OS_LABEL } from '../contrib/files/browser/fileCommands'; +import { ResourceContextKey } from 'vs/workbench/common/resources'; +import { Schemas } from 'vs/base/common/network'; // Actions (function registerActions(): void { @@ -61,6 +64,17 @@ import product from 'vs/platform/product/node/product'; primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_R, mac: { primary: KeyMod.WinCtrl | KeyMod.Shift | KeyCode.KEY_R } }); + + MenuRegistry.appendMenuItem(MenuId.EditorTitleContext, { + command: { id: REVEAL_IN_OS_COMMAND_ID, title: REVEAL_IN_OS_LABEL }, + when: ResourceContextKey.Scheme.isEqualTo(Schemas.file), + group: '2_files' + }); + MenuRegistry.appendMenuItem(MenuId.EditorTitleContext, { + command: { id: REVEAL_IN_OS_COMMAND_ID, title: REVEAL_IN_OS_LABEL }, + when: ResourceContextKey.Scheme.isEqualTo(Schemas.userData), + group: '2_files' + }); })(); // Actions: View diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index 2d11615deb9..1dc0f324175 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -52,6 +52,7 @@ import { SignService } from 'vs/platform/sign/node/signService'; import { ISignService } from 'vs/platform/sign/common/sign'; import { IUserDataService } from '../services/userData/common/userDataService'; import { FileUserDataService } from '../services/userData/common/fileUserDataService'; +import { UserDataFileProvider } from '../services/userData/common/userDataFileProvider'; class CodeRendererMain extends Disposable { @@ -210,6 +211,7 @@ class CodeRendererMain extends Disposable { // User Data Service const userDataService = this._register(new FileUserDataService(environmentService, fileService)); serviceCollection.set(IUserDataService, userDataService); + fileService.registerProvider(Schemas.userData, new UserDataFileProvider(userDataService)); const payload = await this.resolveWorkspaceInitializationPayload(environmentService); diff --git a/src/vs/workbench/services/configuration/browser/configuration.ts b/src/vs/workbench/services/configuration/browser/configuration.ts index 14bade52756..38b605b5d89 100644 --- a/src/vs/workbench/services/configuration/browser/configuration.ts +++ b/src/vs/workbench/services/configuration/browser/configuration.ts @@ -23,10 +23,12 @@ import { Schemas } from 'vs/base/common/network'; import { IConfigurationModel } from 'vs/platform/configuration/common/configuration'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { hash } from 'vs/base/common/hash'; -import { IUserDataService } from '../../userData/common/userDataService'; +import { IUserDataService } from 'vs/workbench/services/userData/common/userDataService'; export class UserConfiguration extends Disposable { + readonly resource: URI; + private readonly parser: ConfigurationModelParser; private readonly reloadConfigurationScheduler: RunOnceScheduler; protected readonly _onDidChangeConfiguration: Emitter = this._register(new Emitter()); @@ -38,6 +40,7 @@ export class UserConfiguration extends Disposable { ) { super(); + this.resource = userDataService.toResource(USER_CONFIGURATION_KEY); this.parser = new ConfigurationModelParser(USER_CONFIGURATION_KEY, this.scopes); this.reloadConfigurationScheduler = this._register(new RunOnceScheduler(() => this.reload().then(configurationModel => this._onDidChangeConfiguration.fire(configurationModel)), 50)); this._register(Event.filter(this.userDataService.onDidChange, e => e.contains(USER_CONFIGURATION_KEY))(() => this.reloadConfigurationScheduler.schedule())); diff --git a/src/vs/workbench/services/configuration/browser/configurationService.ts b/src/vs/workbench/services/configuration/browser/configurationService.ts index bf934755350..4c5eb4e2e57 100644 --- a/src/vs/workbench/services/configuration/browser/configurationService.ts +++ b/src/vs/workbench/services/configuration/browser/configurationService.ts @@ -47,6 +47,7 @@ export class WorkspaceService extends Disposable implements IConfigurationServic private cachedFolderConfigs: ResourceMap; private workspaceEditingQueue: Queue; + readonly userSettingsResource: URI; private readonly configurationFileService: ConfigurationFileService; protected readonly _onDidChangeConfiguration: Emitter = this._register(new Emitter()); @@ -82,6 +83,7 @@ export class WorkspaceService extends Disposable implements IConfigurationServic this._configuration = new Configuration(this.defaultConfiguration, new ConfigurationModel(), new ConfigurationModel(), new ConfigurationModel(), new ResourceMap(), new ConfigurationModel(), new ResourceMap(), this.workspace); this.cachedFolderConfigs = new ResourceMap(); this.localUserConfiguration = this._register(new UserConfiguration(remoteAuthority ? LOCAL_MACHINE_SCOPES : undefined, userDataService)); + this.userSettingsResource = this.localUserConfiguration.resource; this._register(this.localUserConfiguration.onDidChangeConfiguration(userConfiguration => this.onLocalUserConfigurationChanged(userConfiguration))); if (remoteAuthority) { this.remoteUserConfiguration = this._register(new RemoteUserConfiguration(remoteAuthority, configurationCache, this.configurationFileService, remoteAgentService)); diff --git a/src/vs/workbench/services/configuration/common/configurationEditingService.ts b/src/vs/workbench/services/configuration/common/configurationEditingService.ts index 827452f20a7..dd6e767be62 100644 --- a/src/vs/workbench/services/configuration/common/configurationEditingService.ts +++ b/src/vs/workbench/services/configuration/common/configurationEditingService.ts @@ -34,6 +34,7 @@ import { Emitter } from 'vs/base/common/event'; import { LanguageIdentifier } from 'vs/editor/common/modes'; import { IDisposable, Disposable, toDisposable } from 'vs/base/common/lifecycle'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { Schemas } from 'vs/base/common/network'; export const enum ConfigurationEditingErrorCode { @@ -439,7 +440,7 @@ class UserConfigurationEditOperation extends ConfigurationEditOperation { private async _resolve(): Promise { const content = (await this.userDataService.read(USER_CONFIGURATION_KEY)) || '{}'; const languageIdentifier = this.modeService.getLanguageIdentifier('jsonc'); - const model = this.modelService.createModel(content, languageIdentifier ? { languageIdentifier, onDidChange: new Emitter().event, dispose: () => { } } : null); + const model = this.modelService.createModel(content, languageIdentifier ? { languageIdentifier, onDidChange: new Emitter().event, dispose: () => { } } : null, this.configurationService.userSettingsResource.with({ scheme: Schemas.vscode })); this._register(toDisposable(() => { model.dispose(); this.modelService.destroyModel(model.uri); 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 8f2b128f1dd..063a8f58d04 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 @@ -49,8 +49,7 @@ class SettingsTestEnvironmentService extends EnvironmentService { super(args, _execPath); } - get appSettingsHome(): URI { return dirname(this.settingsResource); } - get settingsResource(): URI { return URI.file(this._settingsPath); } + get appSettingsHome(): URI { return dirname(URI.file(this._settingsPath)); } } suite('ConfigurationEditingService', () => { 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 3e1e4be3e3c..663a11973e3 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 @@ -46,6 +46,7 @@ import { IConfigurationCache } from 'vs/workbench/services/configuration/common/ import { VSBuffer } from 'vs/base/common/buffer'; import { SignService } from 'vs/platform/sign/browser/signService'; import { FileUserDataService } from 'vs/workbench/services/userData/common/fileUserDataService'; +import { IUserDataService } from 'vs/workbench/services/userData/common/userDataService'; class SettingsTestEnvironmentService extends EnvironmentService { @@ -53,8 +54,7 @@ class SettingsTestEnvironmentService extends EnvironmentService { super(args, _execPath); } - get appSettingsHome(): URI { return dirname(this.settingsResource); } - get settingsResource(): URI { return URI.file(this._settingsPath); } + get appSettingsHome(): URI { return dirname(URI.file(this._settingsPath)); } } function setUpFolderWorkspace(folderName: string): Promise<{ parentDir: string, folderDir: string }> { @@ -754,6 +754,7 @@ suite('WorkspaceConfigurationService - Folder', () => { const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); const userDataService = new FileUserDataService(environmentService, fileService); + instantiationService.stub(IUserDataService, userDataService); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); @@ -1037,7 +1038,7 @@ suite('WorkspaceConfigurationService - Folder', () => { suite('WorkspaceConfigurationService-Multiroot', () => { - let parentResource: string, workspaceContextService: IWorkspaceContextService, environmentService: IEnvironmentService, jsonEditingServce: IJSONEditingService, testObject: IConfigurationService; + let parentResource: string, workspaceContextService: IWorkspaceContextService, environmentService: IEnvironmentService, jsonEditingServce: IJSONEditingService, testObject: IConfigurationService, globalSettingsFile: string; const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); suiteSetup(() => { @@ -1073,14 +1074,16 @@ suite('WorkspaceConfigurationService-Multiroot', () => { .then(({ parentDir, configPath }) => { parentResource = parentDir; + globalSettingsFile = path.join(parentDir, 'settings.json'); const instantiationService = workbenchInstantiationService(); - environmentService = new SettingsTestEnvironmentService(parseArgs(process.argv), process.execPath, path.join(parentDir, 'settings.json')); + environmentService = new SettingsTestEnvironmentService(parseArgs(process.argv), process.execPath, globalSettingsFile); const remoteAgentService = instantiationService.createInstance(RemoteAgentService, {}); instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); const userDataService = new FileUserDataService(environmentService, fileService); + instantiationService.stub(IUserDataService, userDataService); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); @@ -1111,21 +1114,21 @@ suite('WorkspaceConfigurationService-Multiroot', () => { }); test('application settings are not read from workspace', () => { - fs.writeFileSync(environmentService.settingsResource.fsPath, '{ "configurationService.workspace.applicationSetting": "userValue" }'); + fs.writeFileSync(globalSettingsFile, '{ "configurationService.workspace.applicationSetting": "userValue" }'); return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, { key: 'settings', value: { 'configurationService.workspace.applicationSetting': 'workspaceValue' } }, true) .then(() => testObject.reloadConfiguration()) .then(() => assert.equal(testObject.getValue('configurationService.workspace.applicationSetting'), 'userValue')); }); test('machine settings are not read from workspace', () => { - fs.writeFileSync(environmentService.settingsResource.fsPath, '{ "configurationService.workspace.machineSetting": "userValue" }'); + fs.writeFileSync(globalSettingsFile, '{ "configurationService.workspace.machineSetting": "userValue" }'); return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, { key: 'settings', value: { 'configurationService.workspace.machineSetting': 'workspaceValue' } }, true) .then(() => testObject.reloadConfiguration()) .then(() => assert.equal(testObject.getValue('configurationService.workspace.machineSetting'), 'userValue')); }); test('workspace settings override user settings after defaults are registered ', () => { - fs.writeFileSync(environmentService.settingsResource.fsPath, '{ "configurationService.workspace.newSetting": "userValue" }'); + fs.writeFileSync(globalSettingsFile, '{ "configurationService.workspace.newSetting": "userValue" }'); return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, { key: 'settings', value: { 'configurationService.workspace.newSetting': 'workspaceValue' } }, true) .then(() => testObject.reloadConfiguration()) .then(() => { @@ -1144,21 +1147,21 @@ suite('WorkspaceConfigurationService-Multiroot', () => { }); test('application settings are not read from workspace folder', () => { - fs.writeFileSync(environmentService.settingsResource.fsPath, '{ "configurationService.workspace.applicationSetting": "userValue" }'); + fs.writeFileSync(globalSettingsFile, '{ "configurationService.workspace.applicationSetting": "userValue" }'); fs.writeFileSync(workspaceContextService.getWorkspace().folders[0].toResource('.vscode/settings.json').fsPath, '{ "configurationService.workspace.applicationSetting": "workspaceFolderValue" }'); return testObject.reloadConfiguration() .then(() => assert.equal(testObject.getValue('configurationService.workspace.applicationSetting'), 'userValue')); }); test('machine settings are not read from workspace folder', () => { - fs.writeFileSync(environmentService.settingsResource.fsPath, '{ "configurationService.workspace.machineSetting": "userValue" }'); + fs.writeFileSync(globalSettingsFile, '{ "configurationService.workspace.machineSetting": "userValue" }'); fs.writeFileSync(workspaceContextService.getWorkspace().folders[0].toResource('.vscode/settings.json').fsPath, '{ "configurationService.workspace.machineSetting": "workspaceFolderValue" }'); return testObject.reloadConfiguration() .then(() => assert.equal(testObject.getValue('configurationService.workspace.machineSetting'), 'userValue')); }); test('application settings are not read from workspace folder after defaults are registered', () => { - fs.writeFileSync(environmentService.settingsResource.fsPath, '{ "configurationService.workspace.testNewApplicationSetting": "userValue" }'); + fs.writeFileSync(globalSettingsFile, '{ "configurationService.workspace.testNewApplicationSetting": "userValue" }'); fs.writeFileSync(workspaceContextService.getWorkspace().folders[0].toResource('.vscode/settings.json').fsPath, '{ "configurationService.workspace.testNewApplicationSetting": "workspaceFolderValue" }'); return testObject.reloadConfiguration() .then(() => { @@ -1178,7 +1181,7 @@ suite('WorkspaceConfigurationService-Multiroot', () => { }); test('application settings are not read from workspace folder after defaults are registered', () => { - fs.writeFileSync(environmentService.settingsResource.fsPath, '{ "configurationService.workspace.testNewMachineSetting": "userValue" }'); + fs.writeFileSync(globalSettingsFile, '{ "configurationService.workspace.testNewMachineSetting": "userValue" }'); fs.writeFileSync(workspaceContextService.getWorkspace().folders[0].toResource('.vscode/settings.json').fsPath, '{ "configurationService.workspace.testNewMachineSetting": "workspaceFolderValue" }'); return testObject.reloadConfiguration() .then(() => { @@ -1232,7 +1235,7 @@ suite('WorkspaceConfigurationService-Multiroot', () => { assert.equal(actual.workspaceFolder, undefined); assert.equal(actual.value, 'isSet'); - fs.writeFileSync(environmentService.settingsResource.fsPath, '{ "configurationService.workspace.testResourceSetting": "userValue" }'); + fs.writeFileSync(globalSettingsFile, '{ "configurationService.workspace.testResourceSetting": "userValue" }'); return testObject.reloadConfiguration() .then(() => { actual = testObject.inspect('configurationService.workspace.testResourceSetting'); 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 cefee9701c9..d875310f3af 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 @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { URI as uri } from 'vs/base/common/uri'; +import { URI as uri, URI } from 'vs/base/common/uri'; import * as platform from 'vs/base/common/platform'; import { IConfigurationService, getConfigurationValue, IConfigurationOverrides } from 'vs/platform/configuration/common/configuration'; import { ICommandService } from 'vs/platform/commands/common/commands'; @@ -494,6 +494,7 @@ suite('Configuration Resolver Service', () => { class MockConfigurationService implements IConfigurationService { public _serviceBrand: any; public serviceId = IConfigurationService; + userSettingsResource = URI.file('settings.json'); public constructor(private configuration: any = {}) { } public inspect(key: string, overrides?: IConfigurationOverrides): any { return { value: getConfigurationValue(this.getValue(), key), default: getConfigurationValue(this.getValue(), key), user: getConfigurationValue(this.getValue(), key), workspaceFolder: undefined, folder: undefined }; } public keys() { return { default: [], user: [], workspace: [], workspaceFolder: [] }; } diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts index 3525569601e..e3911e2833a 100644 --- a/src/vs/workbench/services/environment/browser/environmentService.ts +++ b/src/vs/workbench/services/environment/browser/environmentService.ts @@ -71,7 +71,6 @@ export class BrowserWorkbenchEnvironmentService implements IEnvironmentService { this.configuration.remoteAuthority = configuration.remoteAuthority; this.appSettingsHome = joinPath(URI.revive(JSON.parse(document.getElementById('vscode-remote-user-data-uri')!.getAttribute('data-settings')!)), 'User'); - this.settingsResource = joinPath(this.appSettingsHome, 'settings.json'); this.keybindingsResource = joinPath(this.appSettingsHome, 'keybindings.json'); this.keyboardLayoutResource = joinPath(this.appSettingsHome, 'keyboardLayout.json'); @@ -97,7 +96,6 @@ export class BrowserWorkbenchEnvironmentService implements IEnvironmentService { appNameLong: string; appQuality?: string; appSettingsHome: URI; - settingsResource: URI; keybindingsResource: URI; keyboardLayoutResource: URI; machineSettingsHome: URI; 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 255ec9727fc..f91983980e5 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 @@ -66,7 +66,7 @@ suite('KeybindingsEditing', () => { instantiationService = new TestInstantiationService(); - instantiationService.stub(IEnvironmentService, { keybindingsResource: URI.file(keybindingsFile), settingsResource: URI.file(path.join(testDir, 'settings.json')) }); + instantiationService.stub(IEnvironmentService, { keybindingsResource: URI.file(keybindingsFile) }); instantiationService.stub(IConfigurationService, ConfigurationService); instantiationService.stub(IConfigurationService, 'getValue', { 'eol': '\n' }); instantiationService.stub(IConfigurationService, 'onDidUpdateConfiguration', () => { }); diff --git a/src/vs/workbench/services/preferences/browser/preferencesService.ts b/src/vs/workbench/services/preferences/browser/preferencesService.ts index 9f6330fcd37..2de8150a4c4 100644 --- a/src/vs/workbench/services/preferences/browser/preferencesService.ts +++ b/src/vs/workbench/services/preferences/browser/preferencesService.ts @@ -524,9 +524,9 @@ export class PreferencesService extends Disposable implements IPreferencesServic switch (configurationTarget) { case ConfigurationTarget.USER: case ConfigurationTarget.USER_LOCAL: - return this.environmentService.settingsResource; + return this.configurationService.userSettingsResource; case ConfigurationTarget.USER_REMOTE: - return this.environmentService.settingsResource; + return this.configurationService.userSettingsResource; case ConfigurationTarget.WORKSPACE: if (this.contextService.getWorkbenchState() === WorkbenchState.EMPTY) { return null; diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts index 9a70fd94b6a..866ee212c2e 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts @@ -30,6 +30,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { isEqual, isEqualOrParent, extname, basename, joinPath } from 'vs/base/common/resources'; import { onUnexpectedError } from 'vs/base/common/errors'; import { Schemas } from 'vs/base/common/network'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; export interface IBackupMetaData { mtime: number; @@ -104,7 +105,8 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil @IBackupFileService private readonly backupFileService: IBackupFileService, @IEnvironmentService private readonly environmentService: IEnvironmentService, @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, - @ILogService private readonly logService: ILogService + @ILogService private readonly logService: ILogService, + @IConfigurationService private readonly configurationService: IConfigurationService ) { super(modelService, modeService); @@ -775,7 +777,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil } // Check for global settings file - if (isEqual(this.resource, this.environmentService.settingsResource, !isLinux)) { + if (isEqual(this.resource, this.configurationService.userSettingsResource, !isLinux)) { return 'global-settings'; } diff --git a/src/vs/workbench/services/textfile/common/textResourcePropertiesService.ts b/src/vs/workbench/services/textfile/common/textResourcePropertiesService.ts index ce097d6fdf5..14a488aafc6 100644 --- a/src/vs/workbench/services/textfile/common/textResourcePropertiesService.ts +++ b/src/vs/workbench/services/textfile/common/textResourcePropertiesService.ts @@ -44,7 +44,7 @@ export class TextResourcePropertiesService implements ITextResourcePropertiesSer const remoteAuthority = this.environmentService.configuration.remoteAuthority; if (remoteAuthority) { - if (resource.scheme !== Schemas.file) { + if (resource.scheme === Schemas.vscodeRemote) { const osCacheKey = `resource.authority.os.${remoteAuthority}`; os = this.remoteEnvironment ? this.remoteEnvironment.os : /* Get it from cache */ this.storageService.getNumber(osCacheKey, StorageScope.WORKSPACE, OS); this.storageService.store(osCacheKey, os, StorageScope.WORKSPACE); diff --git a/src/vs/workbench/services/userData/common/fileUserDataService.ts b/src/vs/workbench/services/userData/common/fileUserDataService.ts index 6096274dc6d..ae4ac73cb3b 100644 --- a/src/vs/workbench/services/userData/common/fileUserDataService.ts +++ b/src/vs/workbench/services/userData/common/fileUserDataService.ts @@ -12,6 +12,7 @@ import * as resources from 'vs/base/common/resources'; import { TernarySearchTree } from 'vs/base/common/map'; import { VSBuffer } from 'vs/base/common/buffer'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { Schemas } from 'vs/base/common/network'; export class FileUserDataService extends Disposable implements IUserDataService { _serviceBrand: any; @@ -36,9 +37,11 @@ export class FileUserDataService extends Disposable implements IUserDataService private handleFileChanges(event: FileChangesEvent): void { const changedKeys: string[] = []; for (const change of event.changes) { - const key = resources.relativePath(this.settingsHome, change.resource); - if (key) { - changedKeys.push(key); + if (change.resource.scheme !== Schemas.userData) { + const key = this.toKey(change.resource.with({ scheme: Schemas.userData })); + if (key) { + changedKeys.push(key); + } } } if (changedKeys.length) { @@ -47,7 +50,7 @@ export class FileUserDataService extends Disposable implements IUserDataService } async read(key: string): Promise { - const resource = this.toResource(key); + const resource = this.toFileResource(key); try { const content = await this.fileService.readFile(resource); return content.value.toString(); @@ -61,13 +64,21 @@ export class FileUserDataService extends Disposable implements IUserDataService } write(key: string, value: string): Promise { - return this.fileService.writeFile(this.toResource(key), VSBuffer.fromString(value)).then(() => undefined); + return this.fileService.writeFile(this.toFileResource(key), VSBuffer.fromString(value)).then(() => undefined); } - private toResource(key: string): URI { + private toFileResource(key: string): URI { return resources.joinPath(this.settingsHome, ...key.split('/')); } + toResource(key: string): URI { + return this.toFileResource(key).with({ scheme: Schemas.userData }); + } + + toKey(resource: URI): string | undefined { + return resources.relativePath(this.settingsHome.with({ scheme: Schemas.userData }), resource); + } + } class UserDataChangesEvent implements IUserDataChangesEvent { diff --git a/src/vs/workbench/services/userData/common/userDataFileProvider.ts b/src/vs/workbench/services/userData/common/userDataFileProvider.ts new file mode 100644 index 00000000000..76e4419a51d --- /dev/null +++ b/src/vs/workbench/services/userData/common/userDataFileProvider.ts @@ -0,0 +1,72 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; +import { FileSystemProviderCapabilities, FileWriteOptions, IStat, FileType, FileDeleteOptions, IWatchOptions, FileOverwriteOptions, IFileSystemProviderWithFileReadWriteCapability, IFileChange, FileChangesEvent, FileChangeType } from 'vs/platform/files/common/files'; +import { IUserDataService } from './userDataService'; +import { URI } from 'vs/base/common/uri'; +import { VSBuffer } from 'vs/base/common/buffer'; +import { Event, Emitter } from 'vs/base/common/event'; + +export class UserDataFileProvider extends Disposable implements IFileSystemProviderWithFileReadWriteCapability { + + constructor(private readonly userDataService: IUserDataService) { super(); } + + readonly capabilities: FileSystemProviderCapabilities = FileSystemProviderCapabilities.FileReadWrite; + readonly onDidChangeCapabilities: Event = Event.None; + + private readonly _onDidChangeFile: Emitter = this._register(new Emitter()); + readonly onDidChangeFile: Event = this._onDidChangeFile.event; + + private versions: Map = new Map(); + + watch(resource: URI, opts: IWatchOptions): IDisposable { + const key = this.userDataService.toKey(resource); + if (!key) { + throw new Error(`Invalud user data resource ${resource}`); + } + return this.userDataService.onDidChange(e => { + if (e.contains(key)) { + this.versions.set(key, (this.versions.get(key) || 1) + 1); + this._onDidChangeFile.fire(new FileChangesEvent([{ resource, type: FileChangeType.UPDATED }]).changes); + } + }); + } + + async stat(resource: URI): Promise { + const key = this.userDataService.toKey(resource); + if (!key) { + throw new Error(`Invalud user data resource ${resource}`); + } + return { + type: FileType.File, + ctime: 0, + mtime: this.versions.get(key) || 0, + size: 0 + }; + } + mkdir(resource: URI): Promise { throw new Error('not supported'); } + readdir(resource: URI): Promise<[string, FileType][]> { throw new Error('not supported'); } + delete(resource: URI, opts: FileDeleteOptions): Promise { throw new Error('not supported'); } + + rename(from: URI, to: URI, opts: FileOverwriteOptions): Promise { throw new Error('not supported'); } + + async readFile(resource: URI): Promise { + const key = this.userDataService.toKey(resource); + if (!key) { + throw new Error(`Invalud user data resource ${resource}`); + } + const content = await this.userDataService.read(key); + return VSBuffer.fromString(content).buffer; + } + + writeFile(resource: URI, content: Uint8Array, opts: FileWriteOptions): Promise { + const key = this.userDataService.toKey(resource); + if (!key) { + throw new Error(`Invalud user data resource ${resource}`); + } + return this.userDataService.write(key, VSBuffer.wrap(content).toString()); + } +} \ No newline at end of file diff --git a/src/vs/workbench/services/userData/common/userDataService.ts b/src/vs/workbench/services/userData/common/userDataService.ts index 81c8b5dfd76..d47f01616e2 100644 --- a/src/vs/workbench/services/userData/common/userDataService.ts +++ b/src/vs/workbench/services/userData/common/userDataService.ts @@ -5,7 +5,9 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { Event } from 'vs/base/common/event'; +import { URI } from 'vs/base/common/uri'; +export const schme: string = 'vscode-userdata'; export const IUserDataService = createDecorator('userDataService'); export interface IUserDataChangesEvent { @@ -18,6 +20,10 @@ export interface IUserDataService { onDidChange: Event; + toResource(key: string): URI; + + toKey(resource: URI): string | undefined; + read(key: string): Promise; write(key: string, value: string): Promise; From b4fa4cd8988c38a5d4e55ff24663cd329520f014 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 23 Jun 2019 19:43:52 +0200 Subject: [PATCH 0536/1449] :lipstick: --- src/vs/workbench/browser/web.main.ts | 2 +- src/vs/workbench/electron-browser/main.ts | 6 +++--- .../services/configuration/browser/configuration.ts | 2 +- .../configuration/browser/configurationService.ts | 2 +- .../configuration/common/configurationEditingService.ts | 2 +- .../electron-browser/configurationEditingService.test.ts | 2 +- .../test/electron-browser/configurationService.test.ts | 2 +- .../services/userData/common/fileUserDataService.ts | 2 +- .../userData/common/{userDataService.ts => userData.ts} | 9 --------- .../services/userData/common/userDataFileProvider.ts | 2 +- 10 files changed, 11 insertions(+), 20 deletions(-) rename src/vs/workbench/services/userData/common/{userDataService.ts => userData.ts} (78%) diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index 3e64ed90871..7bfb526bbea 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -36,7 +36,7 @@ import { hash } from 'vs/base/common/hash'; import { IWorkbenchConstructionOptions } from 'vs/workbench/workbench.web.api'; import { ProductService } from 'vs/platform/product/browser/productService'; import { FileUserDataService } from 'vs/workbench/services/userData/common/fileUserDataService'; -import { IUserDataService } from 'vs/workbench//services/userData/common/userDataService'; +import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; import { UserDataFileProvider } from 'vs/workbench//services/userData/common/userDataFileProvider'; class CodeRendererMain extends Disposable { diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index 1dc0f324175..b1a7d8361bf 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -50,9 +50,9 @@ import { ConfigurationCache } from 'vs/workbench/services/configuration/node/con import { SpdLogService } from 'vs/platform/log/node/spdlogService'; import { SignService } from 'vs/platform/sign/node/signService'; import { ISignService } from 'vs/platform/sign/common/sign'; -import { IUserDataService } from '../services/userData/common/userDataService'; -import { FileUserDataService } from '../services/userData/common/fileUserDataService'; -import { UserDataFileProvider } from '../services/userData/common/userDataFileProvider'; +import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; +import { FileUserDataService } from 'vs/workbench/services/userData/common/fileUserDataService'; +import { UserDataFileProvider } from 'vs/workbench/services/userData/common/userDataFileProvider'; class CodeRendererMain extends Disposable { diff --git a/src/vs/workbench/services/configuration/browser/configuration.ts b/src/vs/workbench/services/configuration/browser/configuration.ts index 38b605b5d89..7907be1ca34 100644 --- a/src/vs/workbench/services/configuration/browser/configuration.ts +++ b/src/vs/workbench/services/configuration/browser/configuration.ts @@ -23,7 +23,7 @@ import { Schemas } from 'vs/base/common/network'; import { IConfigurationModel } from 'vs/platform/configuration/common/configuration'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { hash } from 'vs/base/common/hash'; -import { IUserDataService } from 'vs/workbench/services/userData/common/userDataService'; +import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; export class UserConfiguration extends Disposable { diff --git a/src/vs/workbench/services/configuration/browser/configurationService.ts b/src/vs/workbench/services/configuration/browser/configurationService.ts index 4c5eb4e2e57..7aa440f3117 100644 --- a/src/vs/workbench/services/configuration/browser/configurationService.ts +++ b/src/vs/workbench/services/configuration/browser/configurationService.ts @@ -29,7 +29,7 @@ import { isEqual, dirname } from 'vs/base/common/resources'; import { mark } from 'vs/base/common/performance'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { IFileService } from 'vs/platform/files/common/files'; -import { IUserDataService } from 'vs/workbench/services/userData/common/userDataService'; +import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; export class WorkspaceService extends Disposable implements IConfigurationService, IWorkspaceContextService { diff --git a/src/vs/workbench/services/configuration/common/configurationEditingService.ts b/src/vs/workbench/services/configuration/common/configurationEditingService.ts index dd6e767be62..da010d44828 100644 --- a/src/vs/workbench/services/configuration/common/configurationEditingService.ts +++ b/src/vs/workbench/services/configuration/common/configurationEditingService.ts @@ -27,7 +27,7 @@ import { INotificationService, Severity } from 'vs/platform/notification/common/ import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; import { withUndefinedAsNull, withNullAsUndefined } from 'vs/base/common/types'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; -import { IUserDataService } from '../../userData/common/userDataService'; +import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; import { IModelService } from 'vs/editor/common/services/modelService'; import { IModeService } from 'vs/editor/common/services/modeService'; import { Emitter } from 'vs/base/common/event'; 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 063a8f58d04..7a0373be577 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 @@ -40,7 +40,7 @@ import { DiskFileSystemProvider } from 'vs/workbench/services/files/node/diskFil import { IFileService } from 'vs/platform/files/common/files'; import { ConfigurationCache } from 'vs/workbench/services/configuration/node/configurationCache'; import { FileUserDataService } from 'vs/workbench/services/userData/common/fileUserDataService'; -import { IUserDataService } from 'vs/workbench/services/userData/common/userDataService'; +import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; import { dirname } from 'vs/base/common/resources'; class SettingsTestEnvironmentService extends EnvironmentService { 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 663a11973e3..41bc29d871b 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 @@ -46,7 +46,7 @@ import { IConfigurationCache } from 'vs/workbench/services/configuration/common/ import { VSBuffer } from 'vs/base/common/buffer'; import { SignService } from 'vs/platform/sign/browser/signService'; import { FileUserDataService } from 'vs/workbench/services/userData/common/fileUserDataService'; -import { IUserDataService } from 'vs/workbench/services/userData/common/userDataService'; +import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; class SettingsTestEnvironmentService extends EnvironmentService { diff --git a/src/vs/workbench/services/userData/common/fileUserDataService.ts b/src/vs/workbench/services/userData/common/fileUserDataService.ts index ae4ac73cb3b..847b923a90d 100644 --- a/src/vs/workbench/services/userData/common/fileUserDataService.ts +++ b/src/vs/workbench/services/userData/common/fileUserDataService.ts @@ -5,7 +5,7 @@ import { Event, Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; -import { IUserDataService, IUserDataChangesEvent } from './userDataService'; +import { IUserDataService, IUserDataChangesEvent } from 'vs/workbench/services/userData/common/userData'; import { IFileService, FileChangesEvent } from 'vs/platform/files/common/files'; import { URI } from 'vs/base/common/uri'; import * as resources from 'vs/base/common/resources'; diff --git a/src/vs/workbench/services/userData/common/userDataService.ts b/src/vs/workbench/services/userData/common/userData.ts similarity index 78% rename from src/vs/workbench/services/userData/common/userDataService.ts rename to src/vs/workbench/services/userData/common/userData.ts index d47f01616e2..38e9b20b87f 100644 --- a/src/vs/workbench/services/userData/common/userDataService.ts +++ b/src/vs/workbench/services/userData/common/userData.ts @@ -7,7 +7,6 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' import { Event } from 'vs/base/common/event'; import { URI } from 'vs/base/common/uri'; -export const schme: string = 'vscode-userdata'; export const IUserDataService = createDecorator('userDataService'); export interface IUserDataChangesEvent { @@ -27,12 +26,4 @@ export interface IUserDataService { read(key: string): Promise; write(key: string, value: string): Promise; -} - -export const IUserDataEditorService = createDecorator('userDataEditorService'); - -export interface IUserDataEditorService { - _serviceBrand: any; - - openInEditor(key: string): Promise; } \ No newline at end of file diff --git a/src/vs/workbench/services/userData/common/userDataFileProvider.ts b/src/vs/workbench/services/userData/common/userDataFileProvider.ts index 76e4419a51d..2f48f9b1e79 100644 --- a/src/vs/workbench/services/userData/common/userDataFileProvider.ts +++ b/src/vs/workbench/services/userData/common/userDataFileProvider.ts @@ -5,7 +5,7 @@ import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; import { FileSystemProviderCapabilities, FileWriteOptions, IStat, FileType, FileDeleteOptions, IWatchOptions, FileOverwriteOptions, IFileSystemProviderWithFileReadWriteCapability, IFileChange, FileChangesEvent, FileChangeType } from 'vs/platform/files/common/files'; -import { IUserDataService } from './userDataService'; +import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; import { URI } from 'vs/base/common/uri'; import { VSBuffer } from 'vs/base/common/buffer'; import { Event, Emitter } from 'vs/base/common/event'; From 0f9d11821ee6a47b707e7eebb8e9cd9b08ddd439 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 23 Jun 2019 19:45:36 +0200 Subject: [PATCH 0537/1449] :lipstick: --- src/vs/workbench/browser/web.main.ts | 4 ++-- src/vs/workbench/electron-browser/main.ts | 4 ++-- .../services/userData/common/userDataFileProvider.ts | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index 7bfb526bbea..eac69848c2d 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -37,7 +37,7 @@ import { IWorkbenchConstructionOptions } from 'vs/workbench/workbench.web.api'; import { ProductService } from 'vs/platform/product/browser/productService'; import { FileUserDataService } from 'vs/workbench/services/userData/common/fileUserDataService'; import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; -import { UserDataFileProvider } from 'vs/workbench//services/userData/common/userDataFileProvider'; +import { UserDataFileSystemProvider } from 'vs/workbench//services/userData/common/userDataFileProvider'; class CodeRendererMain extends Disposable { @@ -123,7 +123,7 @@ class CodeRendererMain extends Disposable { // User Data Service const userDataService = this._register(new FileUserDataService(environmentService, fileService)); serviceCollection.set(IUserDataService, userDataService); - fileService.registerProvider(Schemas.userData, new UserDataFileProvider(userDataService)); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(userDataService)); const payload = await this.resolveWorkspaceInitializationPayload(); diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index b1a7d8361bf..2ef5500a440 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -52,7 +52,7 @@ import { SignService } from 'vs/platform/sign/node/signService'; import { ISignService } from 'vs/platform/sign/common/sign'; import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; import { FileUserDataService } from 'vs/workbench/services/userData/common/fileUserDataService'; -import { UserDataFileProvider } from 'vs/workbench/services/userData/common/userDataFileProvider'; +import { UserDataFileSystemProvider } from 'vs/workbench/services/userData/common/userDataFileProvider'; class CodeRendererMain extends Disposable { @@ -211,7 +211,7 @@ class CodeRendererMain extends Disposable { // User Data Service const userDataService = this._register(new FileUserDataService(environmentService, fileService)); serviceCollection.set(IUserDataService, userDataService); - fileService.registerProvider(Schemas.userData, new UserDataFileProvider(userDataService)); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(userDataService)); const payload = await this.resolveWorkspaceInitializationPayload(environmentService); diff --git a/src/vs/workbench/services/userData/common/userDataFileProvider.ts b/src/vs/workbench/services/userData/common/userDataFileProvider.ts index 2f48f9b1e79..8b39afee00f 100644 --- a/src/vs/workbench/services/userData/common/userDataFileProvider.ts +++ b/src/vs/workbench/services/userData/common/userDataFileProvider.ts @@ -10,7 +10,7 @@ import { URI } from 'vs/base/common/uri'; import { VSBuffer } from 'vs/base/common/buffer'; import { Event, Emitter } from 'vs/base/common/event'; -export class UserDataFileProvider extends Disposable implements IFileSystemProviderWithFileReadWriteCapability { +export class UserDataFileSystemProvider extends Disposable implements IFileSystemProviderWithFileReadWriteCapability { constructor(private readonly userDataService: IUserDataService) { super(); } From 2c52e2c4dc9cf1857cb576c1107e2b891dc83995 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 23 Jun 2019 19:47:33 +0200 Subject: [PATCH 0538/1449] :lipstick: --- src/vs/workbench/browser/web.main.ts | 2 +- src/vs/workbench/electron-browser/main.ts | 2 +- .../{userDataFileProvider.ts => userDataFileSystemProvider.ts} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename src/vs/workbench/services/userData/common/{userDataFileProvider.ts => userDataFileSystemProvider.ts} (100%) diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index eac69848c2d..40645da0ed0 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -37,7 +37,7 @@ import { IWorkbenchConstructionOptions } from 'vs/workbench/workbench.web.api'; import { ProductService } from 'vs/platform/product/browser/productService'; import { FileUserDataService } from 'vs/workbench/services/userData/common/fileUserDataService'; import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; -import { UserDataFileSystemProvider } from 'vs/workbench//services/userData/common/userDataFileProvider'; +import { UserDataFileSystemProvider } from 'vs/workbench//services/userData/common/userDataFileSystemProvider'; class CodeRendererMain extends Disposable { diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index 2ef5500a440..6a61f0b4817 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -52,7 +52,7 @@ import { SignService } from 'vs/platform/sign/node/signService'; import { ISignService } from 'vs/platform/sign/common/sign'; import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; import { FileUserDataService } from 'vs/workbench/services/userData/common/fileUserDataService'; -import { UserDataFileSystemProvider } from 'vs/workbench/services/userData/common/userDataFileProvider'; +import { UserDataFileSystemProvider } from 'vs/workbench/services/userData/common/userDataFileSystemProvider'; class CodeRendererMain extends Disposable { diff --git a/src/vs/workbench/services/userData/common/userDataFileProvider.ts b/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts similarity index 100% rename from src/vs/workbench/services/userData/common/userDataFileProvider.ts rename to src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts From 5dc8f8100b547cad1b54f03ba4c1c533cf64a445 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 23 Jun 2019 20:12:31 +0200 Subject: [PATCH 0539/1449] Custom user data provider --- src/vs/workbench/browser/web.main.ts | 28 ++++++++++++- src/vs/workbench/electron-browser/main.ts | 2 +- .../configurationEditingService.test.ts | 2 +- .../configurationService.test.ts | 14 +++---- .../userData/common/customUserDataService.ts | 41 +++++++++++++++++++ .../userData/common/fileUserDataService.ts | 37 +++-------------- .../common/inMemoryUserDataProvider.ts | 41 +++++++++++++++++++ .../services/userData/common/userData.ts | 33 +++++++++++++++ src/vs/workbench/workbench.web.api.ts | 8 +--- 9 files changed, 158 insertions(+), 48 deletions(-) create mode 100644 src/vs/workbench/services/userData/common/customUserDataService.ts create mode 100644 src/vs/workbench/services/userData/common/inMemoryUserDataProvider.ts diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index 40645da0ed0..a8eeae2cdc0 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -38,6 +38,9 @@ import { ProductService } from 'vs/platform/product/browser/productService'; import { FileUserDataService } from 'vs/workbench/services/userData/common/fileUserDataService'; import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; import { UserDataFileSystemProvider } from 'vs/workbench//services/userData/common/userDataFileSystemProvider'; +import { CustomUserDataService } from '../services/userData/common/customUserDataService'; +import { joinPath } from 'vs/base/common/resources'; +import { InMemoryUserDataProvider } from '../services/userData/common/inMemoryUserDataProvider'; class CodeRendererMain extends Disposable { @@ -121,7 +124,7 @@ class CodeRendererMain extends Disposable { } // User Data Service - const userDataService = this._register(new FileUserDataService(environmentService, fileService)); + const userDataService = this.createUserDataService(fileService); serviceCollection.set(IUserDataService, userDataService); fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(userDataService)); @@ -172,6 +175,29 @@ class CodeRendererMain extends Disposable { return { id: 'empty-window' }; } + + private createUserDataService(fileService: IFileService): IUserDataService { + if (this.configuration.userDataProvider) { + return this._register(new CustomUserDataService(this.configuration.userDataProvider)); + } else if (this.configuration.remoteAuthority) { + const remoteUserDataUri = this.getRemoteUserDataUri(); + if (remoteUserDataUri) { + return this._register(new FileUserDataService(remoteUserDataUri, fileService)); + } + } + return this._register(new CustomUserDataService(new InMemoryUserDataProvider())); + } + + private getRemoteUserDataUri(): URI | null { + const element = document.getElementById('vscode-remote-user-data-uri'); + if (element) { + const remoteUserDataPath = element.getAttribute('data-settings'); + if (remoteUserDataPath) { + return joinPath(URI.revive(JSON.parse(remoteUserDataPath)), 'User'); + } + } + return null; + } } export function main(domElement: HTMLElement, options: IWorkbenchConstructionOptions): Promise { diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index 6a61f0b4817..60dd333c222 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -209,7 +209,7 @@ class CodeRendererMain extends Disposable { } // User Data Service - const userDataService = this._register(new FileUserDataService(environmentService, fileService)); + const userDataService = this._register(new FileUserDataService(environmentService.appSettingsHome, fileService)); serviceCollection.set(IUserDataService, userDataService); fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(userDataService)); 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 7a0373be577..c86dc528ddd 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 @@ -110,7 +110,7 @@ suite('ConfigurationEditingService', () => { fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); instantiationService.stub(IFileService, fileService); instantiationService.stub(IRemoteAgentService, remoteAgentService); - const userDataService = new FileUserDataService(environmentService, fileService); + const userDataService = new FileUserDataService(environmentService.appSettingsHome, fileService); instantiationService.stub(IUserDataService, userDataService); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); 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 41bc29d871b..9185ba45304 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 @@ -106,7 +106,7 @@ suite('WorkspaceContextService - Folder', () => { const globalSettingsFile = path.join(parentDir, 'settings.json'); const environmentService = new SettingsTestEnvironmentService(parseArgs(process.argv), process.execPath, globalSettingsFile); const fileService = new FileService(new NullLogService()); - const userDataService = new FileUserDataService(environmentService, fileService); + const userDataService = new FileUserDataService(environmentService.appSettingsHome, fileService); workspaceContextService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, new RemoteAgentService({}, environmentService, new RemoteAuthorityResolverService(), new SignService())); return (workspaceContextService).initialize(convertToWorkspacePayload(URI.file(folderDir))); }); @@ -171,7 +171,7 @@ suite('WorkspaceContextService - Workspace', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const userDataService = new FileUserDataService(environmentService, fileService); + const userDataService = new FileUserDataService(environmentService.appSettingsHome, fileService); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); @@ -230,7 +230,7 @@ suite('WorkspaceContextService - Workspace Editing', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const userDataService = new FileUserDataService(environmentService, fileService); + const userDataService = new FileUserDataService(environmentService.appSettingsHome, fileService); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); @@ -490,7 +490,7 @@ suite('WorkspaceService - Initialization', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const userDataService = new FileUserDataService(environmentService, fileService); + const userDataService = new FileUserDataService(environmentService.appSettingsHome, fileService); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); @@ -753,7 +753,7 @@ suite('WorkspaceConfigurationService - Folder', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const userDataService = new FileUserDataService(environmentService, fileService); + const userDataService = new FileUserDataService(environmentService.appSettingsHome, fileService); instantiationService.stub(IUserDataService, userDataService); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); @@ -1082,7 +1082,7 @@ suite('WorkspaceConfigurationService-Multiroot', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const userDataService = new FileUserDataService(environmentService, fileService); + const userDataService = new FileUserDataService(environmentService.appSettingsHome, fileService); instantiationService.stub(IUserDataService, userDataService); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); @@ -1485,7 +1485,7 @@ suite('WorkspaceConfigurationService - Remote Folder', () => { const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, diskFileSystemProvider); const configurationCache: IConfigurationCache = { read: () => Promise.resolve(''), write: () => Promise.resolve(), remove: () => Promise.resolve() }; - const userDataService = new FileUserDataService(environmentService, fileService); + const userDataService = new FileUserDataService(environmentService.appSettingsHome, fileService); testObject = new WorkspaceService({ configurationCache, remoteAuthority }, fileService, userDataService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, testObject); instantiationService.stub(IConfigurationService, testObject); diff --git a/src/vs/workbench/services/userData/common/customUserDataService.ts b/src/vs/workbench/services/userData/common/customUserDataService.ts new file mode 100644 index 00000000000..71bc77124c1 --- /dev/null +++ b/src/vs/workbench/services/userData/common/customUserDataService.ts @@ -0,0 +1,41 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Event, Emitter } from 'vs/base/common/event'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { IUserDataService, IUserDataChangesEvent, IUserDataProvider, UserDataChangesEvent } from 'vs/workbench/services/userData/common/userData'; +import { URI } from 'vs/base/common/uri'; +import { Schemas } from 'vs/base/common/network'; + +export class CustomUserDataService extends Disposable implements IUserDataService { + _serviceBrand: any; + + private _onDidChange: Emitter = this._register(new Emitter()); + readonly onDidChange: Event = this._onDidChange.event; + + constructor( + private readonly userDataProvider: IUserDataProvider + ) { + super(); + this._register(this.userDataProvider.onDidChange(key => this._onDidChange.fire(new UserDataChangesEvent([key])))); + } + + read(key: string): Promise { + return this.userDataProvider.read(key); + } + + write(key: string, value: string): Promise { + return this.userDataProvider.write(key, value); + } + + toResource(key: string): URI { + return URI.from({ scheme: Schemas.userData, path: key }); + } + + toKey(resource: URI): string | undefined { + return resource.scheme === Schemas.userData ? resource.path : undefined; + } + +} \ No newline at end of file diff --git a/src/vs/workbench/services/userData/common/fileUserDataService.ts b/src/vs/workbench/services/userData/common/fileUserDataService.ts index 847b923a90d..ae44e1e5989 100644 --- a/src/vs/workbench/services/userData/common/fileUserDataService.ts +++ b/src/vs/workbench/services/userData/common/fileUserDataService.ts @@ -5,31 +5,26 @@ import { Event, Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; -import { IUserDataService, IUserDataChangesEvent } from 'vs/workbench/services/userData/common/userData'; +import { IUserDataService, IUserDataChangesEvent, UserDataChangesEvent } from 'vs/workbench/services/userData/common/userData'; import { IFileService, FileChangesEvent } from 'vs/platform/files/common/files'; import { URI } from 'vs/base/common/uri'; import * as resources from 'vs/base/common/resources'; -import { TernarySearchTree } from 'vs/base/common/map'; import { VSBuffer } from 'vs/base/common/buffer'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { Schemas } from 'vs/base/common/network'; export class FileUserDataService extends Disposable implements IUserDataService { _serviceBrand: any; - private readonly settingsHome: URI; - private _onDidChange: Emitter = this._register(new Emitter()); readonly onDidChange: Event = this._onDidChange.event; constructor( - @IEnvironmentService environmentService: IEnvironmentService, + private readonly userDataHome: URI, @IFileService private readonly fileService: IFileService ) { super(); // Assumption: This path always exists - this.settingsHome = environmentService.appSettingsHome; - this.fileService.watch(this.settingsHome); + this.fileService.watch(this.userDataHome); this._register(this.fileService.onFileChanges(e => this.handleFileChanges(e))); } @@ -68,7 +63,7 @@ export class FileUserDataService extends Disposable implements IUserDataService } private toFileResource(key: string): URI { - return resources.joinPath(this.settingsHome, ...key.split('/')); + return resources.joinPath(this.userDataHome, ...key.split('/')); } toResource(key: string): URI { @@ -76,29 +71,7 @@ export class FileUserDataService extends Disposable implements IUserDataService } toKey(resource: URI): string | undefined { - return resources.relativePath(this.settingsHome.with({ scheme: Schemas.userData }), resource); - } - -} - -class UserDataChangesEvent implements IUserDataChangesEvent { - - private _keysTree: TernarySearchTree | undefined = undefined; - - constructor(readonly keys: string[]) { } - - private get keysTree(): TernarySearchTree { - if (!this._keysTree) { - this._keysTree = TernarySearchTree.forPaths(); - for (const key of this.keys) { - this._keysTree.set(key, key); - } - } - return this._keysTree; - } - - contains(keyOrSegment: string): boolean { - return this.keysTree.findSubstr(keyOrSegment) !== undefined; + return resources.relativePath(this.userDataHome.with({ scheme: Schemas.userData }), resource); } } \ No newline at end of file diff --git a/src/vs/workbench/services/userData/common/inMemoryUserDataProvider.ts b/src/vs/workbench/services/userData/common/inMemoryUserDataProvider.ts new file mode 100644 index 00000000000..e4961722ae4 --- /dev/null +++ b/src/vs/workbench/services/userData/common/inMemoryUserDataProvider.ts @@ -0,0 +1,41 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Event, Emitter } from 'vs/base/common/event'; +import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; +import { IUserDataProvider } from 'vs/workbench/services/userData/common/userData'; + +export class InMemoryUserDataProvider extends Disposable implements IUserDataProvider { + _serviceBrand: any; + + private _onDidChange: Emitter = this._register(new Emitter()); + readonly onDidChange: Event = this._onDidChange.event; + + private readonly store: Map = new Map(); + + constructor() { + super(); + this._register(toDisposable(() => this.store.clear())); + } + + async read(key: string): Promise { + return this.getValue(key); + } + + async write(key: string, value: string): Promise { + if (value !== this.getValue(key)) { + if (value) { + this.store.set(key, value); + } else { + this.store.delete(key); + } + this._onDidChange.fire(key); + } + } + + private getValue(key: string): string { + return this.store.get(key) || ''; + } +} \ No newline at end of file diff --git a/src/vs/workbench/services/userData/common/userData.ts b/src/vs/workbench/services/userData/common/userData.ts index 38e9b20b87f..aba73a83f61 100644 --- a/src/vs/workbench/services/userData/common/userData.ts +++ b/src/vs/workbench/services/userData/common/userData.ts @@ -6,6 +6,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { Event } from 'vs/base/common/event'; import { URI } from 'vs/base/common/uri'; +import { TernarySearchTree } from 'vs/base/common/map'; export const IUserDataService = createDecorator('userDataService'); @@ -26,4 +27,36 @@ export interface IUserDataService { read(key: string): Promise; write(key: string, value: string): Promise; +} + +export interface IUserDataProvider { + + onDidChange: Event; + + read(key: string): Promise; + + write(key: string, value: string): Promise; + +} + +export class UserDataChangesEvent implements IUserDataChangesEvent { + + private _keysTree: TernarySearchTree | undefined = undefined; + + constructor(readonly keys: string[]) { } + + private get keysTree(): TernarySearchTree { + if (!this._keysTree) { + this._keysTree = TernarySearchTree.forPaths(); + for (const key of this.keys) { + this._keysTree.set(key, key); + } + } + return this._keysTree; + } + + contains(keyOrSegment: string): boolean { + return this.keysTree.findSubstr(keyOrSegment) !== undefined; + } + } \ No newline at end of file diff --git a/src/vs/workbench/workbench.web.api.ts b/src/vs/workbench/workbench.web.api.ts index d8070d0ce4c..1cd5d949546 100644 --- a/src/vs/workbench/workbench.web.api.ts +++ b/src/vs/workbench/workbench.web.api.ts @@ -6,7 +6,7 @@ import 'vs/workbench/workbench.web.main'; import { main } from 'vs/workbench/browser/web.main'; import { UriComponents } from 'vs/base/common/uri'; -import { Event } from 'vs/base/common/event'; +import { IUserDataProvider } from './services/userData/common/userData'; export interface IWorkbenchConstructionOptions { remoteAuthority: string; @@ -16,11 +16,7 @@ export interface IWorkbenchConstructionOptions { folderUri?: UriComponents; workspaceUri?: UriComponents; - userData?: { - read(key: string): Promise; - write(key: string, value: string): Promise; - onDidChange: Event; - }; + userDataProvider?: IUserDataProvider; } function create(domElement: HTMLElement, options: IWorkbenchConstructionOptions): Promise { From f75bbdbc09d9f981cad562e7c6b9fa80c85915ec Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 23 Jun 2019 20:28:09 +0200 Subject: [PATCH 0540/1449] Use paths starting with User --- .../services/userData/common/customUserDataService.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/services/userData/common/customUserDataService.ts b/src/vs/workbench/services/userData/common/customUserDataService.ts index 71bc77124c1..491d2a9a319 100644 --- a/src/vs/workbench/services/userData/common/customUserDataService.ts +++ b/src/vs/workbench/services/userData/common/customUserDataService.ts @@ -8,10 +8,13 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { IUserDataService, IUserDataChangesEvent, IUserDataProvider, UserDataChangesEvent } from 'vs/workbench/services/userData/common/userData'; import { URI } from 'vs/base/common/uri'; import { Schemas } from 'vs/base/common/network'; +import { joinPath, relativePath } from 'vs/base/common/resources'; export class CustomUserDataService extends Disposable implements IUserDataService { _serviceBrand: any; + private readonly userDataHome: URI; + private _onDidChange: Emitter = this._register(new Emitter()); readonly onDidChange: Event = this._onDidChange.event; @@ -19,6 +22,7 @@ export class CustomUserDataService extends Disposable implements IUserDataServic private readonly userDataProvider: IUserDataProvider ) { super(); + this.userDataHome = URI.file('/User').with({ scheme: Schemas.userData }); this._register(this.userDataProvider.onDidChange(key => this._onDidChange.fire(new UserDataChangesEvent([key])))); } @@ -31,11 +35,11 @@ export class CustomUserDataService extends Disposable implements IUserDataServic } toResource(key: string): URI { - return URI.from({ scheme: Schemas.userData, path: key }); + return joinPath(this.userDataHome, key); } toKey(resource: URI): string | undefined { - return resource.scheme === Schemas.userData ? resource.path : undefined; + return relativePath(this.userDataHome, resource); } } \ No newline at end of file From c5bd62f063103e57331a3e1eb7eba22059f833f0 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 23 Jun 2019 21:48:38 +0200 Subject: [PATCH 0541/1449] adopt keybindings to user data service --- .../environment/common/environment.ts | 1 - .../environment/node/environmentService.ts | 3 - .../platform/keybinding/common/keybinding.ts | 2 + .../browser/preferences.contribution.ts | 4 +- .../environment/browser/environmentService.ts | 2 - .../keybinding/browser/keybindingService.ts | 86 ++----------- .../keybinding/common/keybindingEditing.ts | 113 ++++++++---------- .../keybindingEditing.test.ts | 15 +-- .../preferences/browser/preferencesService.ts | 6 +- .../textfile/common/textFileEditorModel.ts | 6 +- 10 files changed, 78 insertions(+), 160 deletions(-) diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index 2679dd2d68b..196b47933c1 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -97,7 +97,6 @@ export interface IEnvironmentService { appNameLong: string; appQuality?: string; appSettingsHome: URI; - keybindingsResource: URI; keyboardLayoutResource: URI; machineSettingsHome: URI; diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts index e2b0934a468..aa956e5f306 100644 --- a/src/vs/platform/environment/node/environmentService.ts +++ b/src/vs/platform/environment/node/environmentService.ts @@ -132,9 +132,6 @@ export class EnvironmentService implements IEnvironmentService { @memoize get settingsSearchUrl(): string | undefined { return product.settingsSearchUrl; } - @memoize - get keybindingsResource(): URI { return resources.joinPath(this.appSettingsHome, 'keybindings.json'); } - @memoize get keyboardLayoutResource(): URI { return resources.joinPath(this.appSettingsHome, 'keyboardLayout.json'); } diff --git a/src/vs/platform/keybinding/common/keybinding.ts b/src/vs/platform/keybinding/common/keybinding.ts index 57b2f701fce..7ceaf162a3d 100644 --- a/src/vs/platform/keybinding/common/keybinding.ts +++ b/src/vs/platform/keybinding/common/keybinding.ts @@ -10,6 +10,8 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' import { IResolveResult } from 'vs/platform/keybinding/common/keybindingResolver'; import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKeybindingItem'; +export const USER_KEYBINDINGS_KEY = 'keybindings.json'; + export interface IUserFriendlyKeybinding { key: string; command: string; diff --git a/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts b/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts index cf6d46bc632..02013097199 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts @@ -40,6 +40,7 @@ import { ILabelService } from 'vs/platform/label/common/label'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IKeybindingEditingService } from 'vs/workbench/services/keybinding/common/keybindingEditing'; Registry.as(EditorExtensions.Editors).registerEditor( new EditorDescriptor( @@ -371,6 +372,7 @@ class PreferencesActionsContribution extends Disposable implements IWorkbenchCon constructor( @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, + @IKeybindingEditingService keybindingEditingService: IKeybindingEditingService, @IConfigurationService configurationService: IConfigurationService, @IPreferencesService private readonly preferencesService: IPreferencesService, @IWorkspaceContextService private readonly workpsaceContextService: IWorkspaceContextService, @@ -387,7 +389,7 @@ class PreferencesActionsContribution extends Disposable implements IWorkbenchCon dark: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/browser/media/preferences-editor-inverse.svg`)) } }, - when: ResourceContextKey.Resource.isEqualTo(environmentService.keybindingsResource.toString()), + when: ResourceContextKey.Resource.isEqualTo(keybindingEditingService.userKeybindingsResource.toString()), group: 'navigation', order: 1 }); diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts index e3911e2833a..dfed462b94b 100644 --- a/src/vs/workbench/services/environment/browser/environmentService.ts +++ b/src/vs/workbench/services/environment/browser/environmentService.ts @@ -71,7 +71,6 @@ export class BrowserWorkbenchEnvironmentService implements IEnvironmentService { this.configuration.remoteAuthority = configuration.remoteAuthority; this.appSettingsHome = joinPath(URI.revive(JSON.parse(document.getElementById('vscode-remote-user-data-uri')!.getAttribute('data-settings')!)), 'User'); - this.keybindingsResource = joinPath(this.appSettingsHome, 'keybindings.json'); this.keyboardLayoutResource = joinPath(this.appSettingsHome, 'keyboardLayout.json'); this.logsPath = '/web/logs'; @@ -96,7 +95,6 @@ export class BrowserWorkbenchEnvironmentService implements IEnvironmentService { appNameLong: string; appQuality?: string; appSettingsHome: URI; - keybindingsResource: URI; keyboardLayoutResource: URI; machineSettingsHome: URI; machineSettingsResource: URI; diff --git a/src/vs/workbench/services/keybinding/browser/keybindingService.ts b/src/vs/workbench/services/keybinding/browser/keybindingService.ts index fb7e5465845..f0ddd401ce9 100644 --- a/src/vs/workbench/services/keybinding/browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/browser/keybindingService.ts @@ -19,7 +19,7 @@ import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/commo import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { Extensions, IJSONContributionRegistry } from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; import { AbstractKeybindingService } from 'vs/platform/keybinding/common/abstractKeybindingService'; -import { IKeyboardEvent, IUserFriendlyKeybinding, KeybindingSource, IKeybindingService, IKeybindingEvent } from 'vs/platform/keybinding/common/keybinding'; +import { IKeyboardEvent, IUserFriendlyKeybinding, KeybindingSource, IKeybindingService, IKeybindingEvent, USER_KEYBINDINGS_KEY } from 'vs/platform/keybinding/common/keybinding'; import { KeybindingResolver } from 'vs/platform/keybinding/common/keybindingResolver'; import { IKeybindingItem, IKeybindingRule2, KeybindingWeight, KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKeybindingItem'; @@ -36,17 +36,15 @@ import { MenuRegistry } from 'vs/platform/actions/common/actions'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; // tslint:disable-next-line: import-patterns import { commandsExtensionPoint } from 'vs/workbench/api/common/menusExtensionPoint'; -import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable } from 'vs/base/common/lifecycle'; import { RunOnceScheduler } from 'vs/base/common/async'; -import { URI } from 'vs/base/common/uri'; -import { IFileService, FileChangesEvent, FileChangeType } from 'vs/platform/files/common/files'; -import { dirname, isEqual } from 'vs/base/common/resources'; import { parse } from 'vs/base/common/json'; import * as objects from 'vs/base/common/objects'; import { IKeymapService } from 'vs/workbench/services/keybinding/common/keymapInfo'; import { getDispatchConfig } from 'vs/workbench/services/keybinding/common/dispatchConfig'; import { isArray } from 'vs/base/common/types'; import { INavigatorWithKeyboard } from 'vs/workbench/services/keybinding/common/navigatorKeyboard'; +import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; interface ContributedKeyBinding { command: string; @@ -158,8 +156,8 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { @IConfigurationService configurationService: IConfigurationService, @IWindowService private readonly windowService: IWindowService, @IExtensionService extensionService: IExtensionService, - @IFileService fileService: IFileService, - @IKeymapService private readonly keymapService: IKeymapService + @IKeymapService private readonly keymapService: IKeymapService, + @IUserDataService userDataService: IUserDataService, ) { super(contextKeyService, commandService, telemetryService, notificationService); @@ -185,7 +183,7 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { this._cachedResolver = null; - this.userKeybindings = this._register(new UserKeybindings(environmentService.keybindingsResource, fileService)); + this.userKeybindings = this._register(new UserKeybindings(userDataService)); this.userKeybindings.initialize().then(() => { if (this.userKeybindings.keybindings.length) { this.updateResolver({ source: KeybindingSource.User }); @@ -552,100 +550,40 @@ class UserKeybindings extends Disposable { private _keybindings: IUserFriendlyKeybinding[] = []; get keybindings(): IUserFriendlyKeybinding[] { return this._keybindings; } + private readonly reloadConfigurationScheduler: RunOnceScheduler; + protected readonly _onDidChange: Emitter = this._register(new Emitter()); readonly onDidChange: Event = this._onDidChange.event; - private fileWatcherDisposable: IDisposable = Disposable.None; - private directoryWatcherDisposable: IDisposable = Disposable.None; - constructor( - private readonly keybindingsResource: URI, - private readonly fileService: IFileService + private readonly userDataService: IUserDataService ) { super(); - this._register(fileService.onFileChanges(e => this.handleFileEvents(e))); + this._register(Event.filter(this.userDataService.onDidChange, e => e.contains(USER_KEYBINDINGS_KEY))(() => this.reloadConfigurationScheduler.schedule())); this.reloadConfigurationScheduler = this._register(new RunOnceScheduler(() => this.reload().then(changed => { if (changed) { this._onDidChange.fire(); } }), 50)); - this._register(toDisposable(() => { - this.stopWatchingResource(); - this.stopWatchingDirectory(); - })); - } - - private watchResource(): void { - this.fileWatcherDisposable = this.fileService.watch(this.keybindingsResource); - } - - private stopWatchingResource(): void { - this.fileWatcherDisposable.dispose(); - this.fileWatcherDisposable = Disposable.None; - } - - private watchDirectory(): void { - const directory = dirname(this.keybindingsResource); - this.directoryWatcherDisposable = this.fileService.watch(directory); - } - - private stopWatchingDirectory(): void { - this.directoryWatcherDisposable.dispose(); - this.directoryWatcherDisposable = Disposable.None; } async initialize(): Promise { - const exists = await this.fileService.exists(this.keybindingsResource); - this.onResourceExists(exists); await this.reload(); } private async reload(): Promise { const existing = this._keybindings; try { - const content = await this.fileService.readFile(this.keybindingsResource); - const value = parse(content.value.toString()); + const content = (await this.userDataService.read(USER_KEYBINDINGS_KEY)) || '[]'; + const value = parse(content); this._keybindings = isArray(value) ? value : []; } catch (e) { this._keybindings = []; } return existing ? !objects.equals(existing, this._keybindings) : true; } - - private async handleFileEvents(event: FileChangesEvent): Promise { - const events = event.changes; - - let affectedByChanges = false; - - // Find changes that affect the resource - for (const event of events) { - affectedByChanges = isEqual(this.keybindingsResource, event.resource); - if (affectedByChanges) { - if (event.type === FileChangeType.ADDED) { - this.onResourceExists(true); - } else if (event.type === FileChangeType.DELETED) { - this.onResourceExists(false); - } - break; - } - } - - if (affectedByChanges) { - this.reloadConfigurationScheduler.schedule(); - } - } - - private onResourceExists(exists: boolean): void { - if (exists) { - this.stopWatchingDirectory(); - this.watchResource(); - } else { - this.stopWatchingResource(); - this.watchDirectory(); - } - } } let schemaId = 'vscode://schemas/keybindings'; diff --git a/src/vs/workbench/services/keybinding/common/keybindingEditing.ts b/src/vs/workbench/services/keybinding/common/keybindingEditing.ts index 49b53c2d234..f3cbd16af4b 100644 --- a/src/vs/workbench/services/keybinding/common/keybindingEditing.ts +++ b/src/vs/workbench/services/keybinding/common/keybindingEditing.ts @@ -8,23 +8,24 @@ import { Queue } from 'vs/base/common/async'; import * as json from 'vs/base/common/json'; import { setProperty } from 'vs/base/common/jsonEdit'; import { Edit } from 'vs/base/common/jsonFormatter'; -import { Disposable, IReference } from 'vs/base/common/lifecycle'; +import { Disposable } from 'vs/base/common/lifecycle'; import { isArray } from 'vs/base/common/types'; -import { URI } from 'vs/base/common/uri'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { ITextModel } from 'vs/editor/common/model'; -import { ITextModelService, IResolvedTextEditorModel } from 'vs/editor/common/services/resolverService'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { IFileService } from 'vs/platform/files/common/files'; import { ServiceIdentifier, createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { IUserFriendlyKeybinding } from 'vs/platform/keybinding/common/keybinding'; +import { IUserFriendlyKeybinding, USER_KEYBINDINGS_KEY } from 'vs/platform/keybinding/common/keybinding'; import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKeybindingItem'; -import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; +import { IModeService } from 'vs/editor/common/services/modeService'; +import { IModelService } from 'vs/editor/common/services/modelService'; +import { Emitter } from 'vs/base/common/event'; +import { LanguageIdentifier } from 'vs/editor/common/modes'; +import { Schemas } from 'vs/base/common/network'; +import { URI } from 'vs/base/common/uri'; export const IKeybindingEditingService = createDecorator('keybindingEditingService'); @@ -32,6 +33,8 @@ export interface IKeybindingEditingService { _serviceBrand: ServiceIdentifier; + userKeybindingsResource: URI; + editKeybinding(keybindingItem: ResolvedKeybindingItem, key: string, when: string | undefined): Promise; removeKeybinding(keybindingItem: ResolvedKeybindingItem): Promise; @@ -42,18 +45,17 @@ export interface IKeybindingEditingService { export class KeybindingsEditingService extends Disposable implements IKeybindingEditingService { public _serviceBrand: any; + + readonly userKeybindingsResource: URI; private queue: Queue; - private resource: URI = this.environmentService.keybindingsResource; - constructor( - @ITextModelService private readonly textModelResolverService: ITextModelService, - @ITextFileService private readonly textFileService: ITextFileService, - @IFileService private readonly fileService: IFileService, - @IConfigurationService private readonly configurationService: IConfigurationService, - @IEnvironmentService private readonly environmentService: IEnvironmentService + @IUserDataService private readonly userDataService: IUserDataService, + @IModeService private readonly modeService: IModeService, + @IModelService private readonly modelService: IModelService ) { super(); + this.userKeybindingsResource = userDataService.toResource(USER_KEYBINDINGS_KEY); this.queue = new Queue(); } @@ -71,45 +73,44 @@ export class KeybindingsEditingService extends Disposable implements IKeybinding private doEditKeybinding(keybindingItem: ResolvedKeybindingItem, key: string, when: string | undefined): Promise { return this.resolveAndValidate() - .then(reference => { - const model = reference.object.textEditorModel; + .then(model => { const userKeybindingEntries = json.parse(model.getValue()); const userKeybindingEntryIndex = this.findUserKeybindingEntryIndex(keybindingItem, userKeybindingEntries); this.updateKeybinding(keybindingItem, key, when, model, userKeybindingEntryIndex); if (keybindingItem.isDefault && keybindingItem.resolvedKeybinding) { this.removeDefaultKeybinding(keybindingItem, model); } - return this.save().then(() => reference.dispose()); + return this.save(model); }); } private doRemoveKeybinding(keybindingItem: ResolvedKeybindingItem): Promise { return this.resolveAndValidate() - .then(reference => { - const model = reference.object.textEditorModel; + .then(model => { if (keybindingItem.isDefault) { this.removeDefaultKeybinding(keybindingItem, model); } else { this.removeUserKeybinding(keybindingItem, model); } - return this.save().then(() => reference.dispose()); + return this.save(model); }); } private doResetKeybinding(keybindingItem: ResolvedKeybindingItem): Promise { return this.resolveAndValidate() - .then(reference => { - const model = reference.object.textEditorModel; + .then(model => { if (!keybindingItem.isDefault) { this.removeUserKeybinding(keybindingItem, model); this.removeUnassignedDefaultKeybinding(keybindingItem, model); } - return this.save().then(() => reference.dispose()); + return this.save(model); }); } - private save(): Promise { - return this.textFileService.save(this.resource); + private async save(model: ITextModel): Promise { + await this.userDataService.write(USER_KEYBINDINGS_KEY, model.getValue()); + model.dispose(); + this.modelService.destroyModel(model.uri); } private updateKeybinding(keybindingItem: ResolvedKeybindingItem, newKey: string, when: string | undefined, model: ITextModel, userKeybindingEntryIndex: number): void { @@ -207,45 +208,33 @@ export class KeybindingsEditingService extends Disposable implements IKeybinding } - private resolveModelReference(): Promise> { - return this.fileService.exists(this.resource) - .then(exists => { - const EOL = this.configurationService.getValue<{}>('files', { overrideIdentifier: 'json' })['eol']; - const result: Promise = exists ? Promise.resolve(null) : this.textFileService.write(this.resource, this.getEmptyContent(EOL), { encoding: 'utf8' }); - return result.then(() => this.textModelResolverService.createModelReference(this.resource)); - }); + private async resolveModel(): Promise { + const content = (await this.userDataService.read(USER_KEYBINDINGS_KEY)) || '[]'; + const languageIdentifier = this.modeService.getLanguageIdentifier('jsonc'); + return this.modelService.createModel(content, languageIdentifier ? { languageIdentifier, onDidChange: new Emitter().event, dispose: () => { } } : null, this.userKeybindingsResource.with({ scheme: Schemas.vscode })); } - private resolveAndValidate(): Promise> { - - // Target cannot be dirty if not writing into buffer - if (this.textFileService.isDirty(this.resource)) { - return Promise.reject(new Error(localize('errorKeybindingsFileDirty', "Unable to write because the keybindings configuration file is dirty. Please save it first and then try again."))); - } - - return this.resolveModelReference() - .then(reference => { - const model = reference.object.textEditorModel; - const EOL = model.getEOL(); - if (model.getValue()) { - const parsed = this.parse(model); - if (parsed.parseErrors.length) { - return Promise.reject(new Error(localize('parseErrors', "Unable to write to the keybindings configuration file. Please open it to correct errors/warnings in the file and try again."))); - } - if (parsed.result) { - if (!isArray(parsed.result)) { - return Promise.reject(new Error(localize('errorInvalidConfiguration', "Unable to write to the keybindings configuration file. It has an object which is not of type Array. Please open the file to clean up and try again."))); - } - } else { - const content = EOL + '[]'; - this.applyEditsToBuffer({ content, length: content.length, offset: model.getValue().length }, model); - } - } else { - const content = this.getEmptyContent(EOL); - this.applyEditsToBuffer({ content, length: content.length, offset: 0 }, model); + private async resolveAndValidate(): Promise { + const model = await this.resolveModel(); + const EOL = model.getEOL(); + if (model.getValue()) { + const parsed = this.parse(model); + if (parsed.parseErrors.length) { + return Promise.reject(new Error(localize('parseErrors', "Unable to write to the keybindings configuration file. Please open it to correct errors/warnings in the file and try again."))); + } + if (parsed.result) { + if (!isArray(parsed.result)) { + return Promise.reject(new Error(localize('errorInvalidConfiguration', "Unable to write to the keybindings configuration file. It has an object which is not of type Array. Please open the file to clean up and try again."))); } - return reference; - }); + } else { + const content = EOL + '[]'; + this.applyEditsToBuffer({ content, length: content.length, offset: model.getValue().length }, model); + } + } else { + const content = this.getEmptyContent(EOL); + this.applyEditsToBuffer({ content, length: content.length, offset: 0 }, model); + } + return model; } private parse(model: ITextModel): { result: IUserFriendlyKeybinding[], parseErrors: json.ParseError[] } { 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 f91983980e5..c79ddfea801 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 @@ -21,7 +21,6 @@ import { ITextResourcePropertiesService } from 'vs/editor/common/services/resour import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ConfigurationService } from 'vs/platform/configuration/node/configurationService'; import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IFileService } from 'vs/platform/files/common/files'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { IUserFriendlyKeybinding } from 'vs/platform/keybinding/common/keybinding'; @@ -45,6 +44,8 @@ import { FileService } from 'vs/workbench/services/files/common/fileService'; import { Schemas } from 'vs/base/common/network'; import { DiskFileSystemProvider } from 'vs/workbench/services/files/node/diskFileSystemProvider'; import { URI } from 'vs/base/common/uri'; +import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; +import { FileUserDataService } from 'vs/workbench/services/userData/common/fileUserDataService'; interface Modifiers { metaKey?: boolean; @@ -66,7 +67,6 @@ suite('KeybindingsEditing', () => { instantiationService = new TestInstantiationService(); - instantiationService.stub(IEnvironmentService, { keybindingsResource: URI.file(keybindingsFile) }); instantiationService.stub(IConfigurationService, ConfigurationService); instantiationService.stub(IConfigurationService, 'getValue', { 'eol': '\n' }); instantiationService.stub(IConfigurationService, 'onDidUpdateConfiguration', () => { }); @@ -85,6 +85,7 @@ suite('KeybindingsEditing', () => { const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); instantiationService.stub(IFileService, fileService); + instantiationService.stub(IUserDataService, new FileUserDataService(URI.file(testDir), fileService)); instantiationService.stub(IUntitledEditorService, instantiationService.createInstance(UntitledEditorService)); instantiationService.stub(ITextFileService, instantiationService.createInstance(TestTextFileService)); instantiationService.stub(ITextModelService, instantiationService.createInstance(TextModelResolverService)); @@ -144,16 +145,6 @@ suite('KeybindingsEditing', () => { .then(() => assert.deepEqual(getUserKeybindings(), expected)); }); - test('edit a default keybinding to a non existing keybindings file', () => { - keybindingsFile = path.join(testDir, 'nonExistingFile.json'); - instantiationService.get(IEnvironmentService).keybindingsResource = URI.file(keybindingsFile); - testObject = instantiationService.createInstance(KeybindingsEditingService); - - const expected: IUserFriendlyKeybinding[] = [{ key: 'alt+c', command: 'a' }, { key: 'escape', command: '-a' }]; - return testObject.editKeybinding(aResolvedKeybindingItem({ firstPart: { keyCode: KeyCode.Escape }, command: 'a' }), 'alt+c', undefined) - .then(() => assert.deepEqual(getUserKeybindings(), expected)); - }); - test('edit a default keybinding to an empty array', () => { writeToKeybindingsFile(); const expected: IUserFriendlyKeybinding[] = [{ key: 'alt+c', command: 'a' }, { key: 'escape', command: '-a' }]; diff --git a/src/vs/workbench/services/preferences/browser/preferencesService.ts b/src/vs/workbench/services/preferences/browser/preferencesService.ts index 2de8150a4c4..ce7695b8f78 100644 --- a/src/vs/workbench/services/preferences/browser/preferencesService.ts +++ b/src/vs/workbench/services/preferences/browser/preferencesService.ts @@ -20,7 +20,6 @@ import { ITextModelService } from 'vs/editor/common/services/resolverService'; import * as nls from 'vs/nls'; import { ConfigurationTarget, IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IEditorOptions } from 'vs/platform/editor/common/editor'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { FileOperationError, FileOperationResult } from 'vs/platform/files/common/files'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; @@ -38,6 +37,7 @@ import { defaultKeybindingsContents, DefaultKeybindingsEditorModel, DefaultSetti import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; +import { IKeybindingEditingService } from '../../keybinding/common/keybindingEditing'; const emptyEditableSettingsContent = '{\n}'; @@ -64,7 +64,7 @@ export class PreferencesService extends Disposable implements IPreferencesServic @INotificationService private readonly notificationService: INotificationService, @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, @IInstantiationService private readonly instantiationService: IInstantiationService, - @IEnvironmentService private readonly environmentService: IEnvironmentService, + @IKeybindingEditingService private readonly keybindingEditingService: IKeybindingEditingService, @ITelemetryService private readonly telemetryService: ITelemetryService, @ITextModelService private readonly textModelResolverService: ITextModelService, @IKeybindingService keybindingService: IKeybindingService, @@ -273,7 +273,7 @@ export class PreferencesService extends Disposable implements IPreferencesServic this.telemetryService.publicLog('openKeybindings', { textual }); if (textual) { const emptyContents = '// ' + nls.localize('emptyKeybindingsHeader', "Place your key bindings in this file to override the defaults") + '\n[\n]'; - const editableKeybindings = this.environmentService.keybindingsResource; + const editableKeybindings = this.keybindingEditingService.userKeybindingsResource; const openDefaultKeybindings = !!this.configurationService.getValue('workbench.settings.openDefaultKeybindings'); // Create as needed and open in editor diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts index 866ee212c2e..60c009b6b56 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts @@ -31,6 +31,7 @@ import { isEqual, isEqualOrParent, extname, basename, joinPath } from 'vs/base/c import { onUnexpectedError } from 'vs/base/common/errors'; import { Schemas } from 'vs/base/common/network'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IKeybindingEditingService } from 'vs/workbench/services/keybinding/common/keybindingEditing'; export interface IBackupMetaData { mtime: number; @@ -106,7 +107,8 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil @IEnvironmentService private readonly environmentService: IEnvironmentService, @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, @ILogService private readonly logService: ILogService, - @IConfigurationService private readonly configurationService: IConfigurationService + @IConfigurationService private readonly configurationService: IConfigurationService, + @IKeybindingEditingService private readonly keybindingEditingService: IKeybindingEditingService ) { super(modelService, modeService); @@ -782,7 +784,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil } // Check for keybindings file - if (isEqual(this.resource, this.environmentService.keybindingsResource, !isLinux)) { + if (isEqual(this.resource, this.keybindingEditingService.userKeybindingsResource, !isLinux)) { return 'keybindings'; } From 26881a9e699eefe00b2d2e26745b071f3c68fe6b Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 23 Jun 2019 21:53:02 +0200 Subject: [PATCH 0542/1449] fix tests --- .../test/electron-browser/keybindingEditing.test.ts | 7 ------- .../services/textfile/common/textFileEditorModel.ts | 7 ++++--- 2 files changed, 4 insertions(+), 10 deletions(-) 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 c79ddfea801..0466789663a 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 @@ -124,13 +124,6 @@ suite('KeybindingsEditing', () => { error => assert.equal(error.message, 'Unable to write to the keybindings configuration file. Please open it to correct errors/warnings in the file and try again.')); }); - test('errors cases - dirty', () => { - instantiationService.stub(ITextFileService, 'isDirty', true); - return testObject.editKeybinding(aResolvedKeybindingItem({ firstPart: { keyCode: KeyCode.Escape } }), 'alt+c', undefined) - .then(() => assert.fail('Should fail with dirty error'), - error => assert.equal(error.message, 'Unable to write because the keybindings configuration file is dirty. Please save it first and then try again.')); - }); - test('errors cases - did not find an array', () => { fs.writeFileSync(keybindingsFile, '{"key": "alt+c", "command": "hello"}'); return testObject.editKeybinding(aResolvedKeybindingItem({ firstPart: { keyCode: KeyCode.Escape } }), 'alt+c', undefined) diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts index 60c009b6b56..2f9daf0900c 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts @@ -31,7 +31,8 @@ import { isEqual, isEqualOrParent, extname, basename, joinPath } from 'vs/base/c import { onUnexpectedError } from 'vs/base/common/errors'; import { Schemas } from 'vs/base/common/network'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IKeybindingEditingService } from 'vs/workbench/services/keybinding/common/keybindingEditing'; +import { IUserDataService } from '../../userData/common/userData'; +import { USER_KEYBINDINGS_KEY } from 'vs/platform/keybinding/common/keybinding'; export interface IBackupMetaData { mtime: number; @@ -108,7 +109,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, @ILogService private readonly logService: ILogService, @IConfigurationService private readonly configurationService: IConfigurationService, - @IKeybindingEditingService private readonly keybindingEditingService: IKeybindingEditingService + @IUserDataService private readonly userDataService: IUserDataService ) { super(modelService, modeService); @@ -784,7 +785,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil } // Check for keybindings file - if (isEqual(this.resource, this.keybindingEditingService.userKeybindingsResource, !isLinux)) { + if (isEqual(this.resource, this.userDataService.toResource(USER_KEYBINDINGS_KEY), !isLinux)) { return 'keybindings'; } From 6e0979d57b2bde6f0c61e63a547c3a11b12cb5e3 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 23 Jun 2019 22:02:28 +0200 Subject: [PATCH 0543/1449] fix tests --- .../electron-browser/configurationEditingService.test.ts | 2 ++ .../test/electron-browser/configurationService.test.ts | 3 +++ .../services/textfile/common/textFileEditorModel.ts | 7 +++---- 3 files changed, 8 insertions(+), 4 deletions(-) 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 c86dc528ddd..44fc5a99eeb 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 @@ -42,6 +42,7 @@ import { ConfigurationCache } from 'vs/workbench/services/configuration/node/con import { FileUserDataService } from 'vs/workbench/services/userData/common/fileUserDataService'; import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; import { dirname } from 'vs/base/common/resources'; +import { KeybindingsEditingService, IKeybindingEditingService } from 'vs/workbench/services/keybinding/common/keybindingEditing'; class SettingsTestEnvironmentService extends EnvironmentService { @@ -116,6 +117,7 @@ suite('ConfigurationEditingService', () => { instantiationService.stub(IWorkspaceContextService, workspaceService); return workspaceService.initialize(noWorkspace ? { id: '' } : { folder: URI.file(workspaceDir), id: createHash('md5').update(URI.file(workspaceDir).toString()).digest('hex') }).then(() => { instantiationService.stub(IConfigurationService, workspaceService); + instantiationService.stub(IKeybindingEditingService, instantiationService.createInstance(KeybindingsEditingService)); instantiationService.stub(ITextFileService, instantiationService.createInstance(TestTextFileService)); instantiationService.stub(ITextModelService, instantiationService.createInstance(TextModelResolverService)); instantiationService.stub(ICommandService, CommandService); 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 9185ba45304..7be91c54df9 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 @@ -47,6 +47,7 @@ import { VSBuffer } from 'vs/base/common/buffer'; import { SignService } from 'vs/platform/sign/browser/signService'; import { FileUserDataService } from 'vs/workbench/services/userData/common/fileUserDataService'; import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; +import { IKeybindingEditingService, KeybindingsEditingService } from 'vs/workbench/services/keybinding/common/keybindingEditing'; class SettingsTestEnvironmentService extends EnvironmentService { @@ -762,6 +763,7 @@ suite('WorkspaceConfigurationService - Folder', () => { return workspaceService.initialize(convertToWorkspacePayload(URI.file(folderDir))).then(() => { instantiationService.stub(IFileService, fileService); + instantiationService.stub(IKeybindingEditingService, instantiationService.createInstance(KeybindingsEditingService)); instantiationService.stub(ITextFileService, instantiationService.createInstance(TestTextFileService)); instantiationService.stub(ITextModelService, instantiationService.createInstance(TextModelResolverService)); workspaceService.acquireInstantiationService(instantiationService); @@ -1092,6 +1094,7 @@ suite('WorkspaceConfigurationService-Multiroot', () => { return workspaceService.initialize(getWorkspaceIdentifier(configPath)).then(() => { instantiationService.stub(IFileService, fileService); + instantiationService.stub(IKeybindingEditingService, instantiationService.createInstance(KeybindingsEditingService)); instantiationService.stub(ITextFileService, instantiationService.createInstance(TestTextFileService)); instantiationService.stub(ITextModelService, instantiationService.createInstance(TextModelResolverService)); workspaceService.acquireInstantiationService(instantiationService); diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts index 2f9daf0900c..60c009b6b56 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts @@ -31,8 +31,7 @@ import { isEqual, isEqualOrParent, extname, basename, joinPath } from 'vs/base/c import { onUnexpectedError } from 'vs/base/common/errors'; import { Schemas } from 'vs/base/common/network'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IUserDataService } from '../../userData/common/userData'; -import { USER_KEYBINDINGS_KEY } from 'vs/platform/keybinding/common/keybinding'; +import { IKeybindingEditingService } from 'vs/workbench/services/keybinding/common/keybindingEditing'; export interface IBackupMetaData { mtime: number; @@ -109,7 +108,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, @ILogService private readonly logService: ILogService, @IConfigurationService private readonly configurationService: IConfigurationService, - @IUserDataService private readonly userDataService: IUserDataService + @IKeybindingEditingService private readonly keybindingEditingService: IKeybindingEditingService ) { super(modelService, modeService); @@ -785,7 +784,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil } // Check for keybindings file - if (isEqual(this.resource, this.userDataService.toResource(USER_KEYBINDINGS_KEY), !isLinux)) { + if (isEqual(this.resource, this.keybindingEditingService.userKeybindingsResource, !isLinux)) { return 'keybindings'; } From 616bac29a6de4f8658805848638718340b281640 Mon Sep 17 00:00:00 2001 From: Leonardo Carreiro Date: Sun, 23 Jun 2019 17:28:12 -0300 Subject: [PATCH 0544/1449] Fix #48403 broken images in markdown preview --- src/vs/workbench/contrib/webview/common/resourceLoader.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/webview/common/resourceLoader.ts b/src/vs/workbench/contrib/webview/common/resourceLoader.ts index 2d9971f7e4e..f852c52b9a7 100644 --- a/src/vs/workbench/contrib/webview/common/resourceLoader.ts +++ b/src/vs/workbench/contrib/webview/common/resourceLoader.ts @@ -5,7 +5,7 @@ import { VSBuffer } from 'vs/base/common/buffer'; import { sep } from 'vs/base/common/path'; -import { startsWith } from 'vs/base/common/strings'; +import { startsWith, endsWith } from 'vs/base/common/strings'; import { URI } from 'vs/base/common/uri'; import { IFileService } from 'vs/platform/files/common/files'; import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; @@ -45,10 +45,11 @@ export async function loadLocalResource( extensionLocation: URI | undefined, getRoots: () => ReadonlyArray ): Promise { - const requestPath = requestUri.path; + const requestPath = requestUri.authority ? `//${requestUri.authority}${requestUri.path}` : requestUri.path; const normalizedPath = URI.file(requestPath); for (const root of getRoots()) { - if (!startsWith(normalizedPath.fsPath, root.fsPath + sep)) { + const rootPath = root.fsPath + (endsWith(root.fsPath, sep) ? '' : sep); + if (!startsWith(normalizedPath.fsPath, rootPath)) { continue; } From b2fd3101ebffc382d5583ea2917520167f3f1255 Mon Sep 17 00:00:00 2001 From: jeanp413 Date: Sun, 23 Jun 2019 16:10:20 -0500 Subject: [PATCH 0545/1449] Stop event propagation in `onEditSettingClicked`. Fixes #75947 --- .../contrib/preferences/browser/preferencesRenderers.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/preferences/browser/preferencesRenderers.ts b/src/vs/workbench/contrib/preferences/browser/preferencesRenderers.ts index 6e820f58d02..cd62e03a9a9 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferencesRenderers.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferencesRenderers.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { ContextSubMenu } from 'vs/base/browser/contextmenu'; -import { getDomNodePagePosition } from 'vs/base/browser/dom'; +import { EventHelper, getDomNodePagePosition } from 'vs/base/browser/dom'; import { IAction } from 'vs/base/common/actions'; import { Delayer } from 'vs/base/common/async'; import { Emitter, Event } from 'vs/base/common/event'; @@ -820,6 +820,8 @@ class EditSettingRenderer extends Disposable { } private onEditSettingClicked(editPreferenceWidget: EditPreferenceWidget, e: IEditorMouseEvent): void { + EventHelper.stop(e.event, true); + const anchor = { x: e.event.posx, y: e.event.posy + 10 }; const actions = this.getSettings(editPreferenceWidget.getLine()).length === 1 ? this.getActions(editPreferenceWidget.preferences[0], this.getConfigurationsMap()[editPreferenceWidget.preferences[0].key]) : editPreferenceWidget.preferences.map(setting => new ContextSubMenu(setting.key, this.getActions(setting, this.getConfigurationsMap()[setting.key]))); From 6a7020dd4a11e0f33b157b3df4baeec90d85701b Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Sun, 23 Jun 2019 16:56:31 -0700 Subject: [PATCH 0546/1449] Update keyboard layout file comments --- .../contrib/preferences/browser/keyboardLayoutPicker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts b/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts index 35ea30c4219..ddab5c033e4 100644 --- a/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts +++ b/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts @@ -85,7 +85,7 @@ export class KeyboardLayoutPickerAction extends Action { private static DEFAULT_CONTENT: string = [ `// ${nls.localize('displayLanguage', 'Defines the keyboard layout used in VS Code in the browser environment.')}`, - `// ${nls.localize('doc', 'See {0} for how to generate keyboard layout information.', 'https://go.microsoft.com/fwlink/?LinkId=761051')}`, + `// ${nls.localize('doc', 'Open VS Code and run "Developer: Inspect Key Mappings (JSON)" from Command Palette.')}`, ``, `// Once you have the keyboard layout info, please paste it below.`, '\n' From 8b9005edee4c59794e1ad1bc8c73fb5b315a692e Mon Sep 17 00:00:00 2001 From: jeanp413 Date: Sun, 23 Jun 2019 20:56:19 -0500 Subject: [PATCH 0547/1449] Delete breadcrumbs.filterOnType unused setting. Fixes #75969 --- .../workbench/browser/parts/editor/breadcrumbs.ts | 8 +------- .../browser/parts/editor/breadcrumbsPicker.ts | 15 +-------------- 2 files changed, 2 insertions(+), 21 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/breadcrumbs.ts b/src/vs/workbench/browser/parts/editor/breadcrumbs.ts index 265f7b286b4..ca8fb69dd8c 100644 --- a/src/vs/workbench/browser/parts/editor/breadcrumbs.ts +++ b/src/vs/workbench/browser/parts/editor/breadcrumbs.ts @@ -71,7 +71,6 @@ export abstract class BreadcrumbsConfig { static FilePath = BreadcrumbsConfig._stub<'on' | 'off' | 'last'>('breadcrumbs.filePath'); static SymbolPath = BreadcrumbsConfig._stub<'on' | 'off' | 'last'>('breadcrumbs.symbolPath'); static SymbolSortOrder = BreadcrumbsConfig._stub<'position' | 'name' | 'type'>('breadcrumbs.symbolSortOrder'); - static FilterOnType = BreadcrumbsConfig._stub('breadcrumbs.filterOnType'); static FileExcludes = BreadcrumbsConfig._stub('files.exclude'); @@ -161,12 +160,7 @@ Registry.as(Extensions.Configuration).registerConfigurat localize('symbolSortOrder.name', "Show symbol outline in alphabetical order."), localize('symbolSortOrder.type', "Show symbol outline in symbol type order."), ] - }, - // 'breadcrumbs.filterOnType': { - // description: localize('filterOnType', "Controls whether the breadcrumb picker filters or highlights when typing."), - // type: 'boolean', - // default: false - // }, + } } }); diff --git a/src/vs/workbench/browser/parts/editor/breadcrumbsPicker.ts b/src/vs/workbench/browser/parts/editor/breadcrumbsPicker.ts index d2147f4c505..3da86172b0c 100644 --- a/src/vs/workbench/browser/parts/editor/breadcrumbsPicker.ts +++ b/src/vs/workbench/browser/parts/editor/breadcrumbsPicker.ts @@ -15,7 +15,7 @@ import { basename, dirname, isEqual } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import 'vs/css!./media/breadcrumbscontrol'; import { OutlineElement, OutlineModel, TreeElement } from 'vs/editor/contrib/documentSymbols/outlineModel'; -import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { FileKind, IFileService, IFileStat } from 'vs/platform/files/common/files'; import { IConstructorSignature1, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { WorkbenchDataTree, WorkbenchAsyncDataTree } from 'vs/platform/list/browser/listService'; @@ -102,10 +102,6 @@ export abstract class BreadcrumbsPicker { this._treeContainer.style.boxShadow = `0px 5px 8px ${this._themeService.getTheme().getColor(widgetShadow)}`; this._domNode.appendChild(this._treeContainer); - - const filterConfig = BreadcrumbsConfig.FilterOnType.bindTo(this._configurationService); - this._disposables.push(filterConfig); - this._layoutInfo = { maxHeight, width, arrowSize, arrowOffset, inputHeight: 0 }; this._tree = this._createTree(this._treeContainer); @@ -129,13 +125,6 @@ export abstract class BreadcrumbsPicker { this._layout(); })); - // filter on type: state - const cfgFilterOnType = BreadcrumbsConfig.FilterOnType.bindTo(this._configurationService); - this._tree.updateOptions({ filterOnType: cfgFilterOnType.getValue() }); - this._disposables.push(this._tree.onDidUpdateOptions(e => { - this._configurationService.updateValue(cfgFilterOnType.name, e.filterOnType, ConfigurationTarget.MEMORY); - })); - this._domNode.focus(); this._setInput(input).then(() => { @@ -389,7 +378,6 @@ export class BreadcrumbsFilePicker extends BreadcrumbsPicker { this._disposables.push(labels); return this._instantiationService.createInstance(WorkbenchAsyncDataTree, container, new FileVirtualDelegate(), [this._instantiationService.createInstance(FileRenderer, labels)], this._instantiationService.createInstance(FileDataSource), { - filterOnType: true, multipleSelectionSupport: false, sorter: new FileSorter(), filter: this._instantiationService.createInstance(FileFilter), @@ -467,7 +455,6 @@ export class BreadcrumbsOutlinePicker extends BreadcrumbsPicker { [new OutlineGroupRenderer(), this._instantiationService.createInstance(OutlineElementRenderer)], new OutlineDataSource(), { - filterOnType: true, expandOnlyOnTwistieClick: true, multipleSelectionSupport: false, sorter: new OutlineItemComparator(this._getOutlineItemCompareType()), From cc9f0b00d6f790d92ee8d338ce145ed11a852813 Mon Sep 17 00:00:00 2001 From: jeanp413 Date: Mon, 24 Jun 2019 02:14:53 -0500 Subject: [PATCH 0548/1449] Fixes #75981 --- src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts index 12d9ee5b662..1006edb824b 100644 --- a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts +++ b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts @@ -282,7 +282,8 @@ export class BreadcrumbsControl { private _onFocusEvent(event: IBreadcrumbsItemEvent): void { if (event.item && this._breadcrumbsPickerShowing) { - return this._widget.setSelection(event.item); + this._breadcrumbsPickerIgnoreOnceItem = undefined; + this._widget.setSelection(event.item); } } From 9e02832ea8507f2dcc664c088bf78643d646e74f Mon Sep 17 00:00:00 2001 From: Chase Adams Date: Mon, 24 Jun 2019 00:57:39 -0700 Subject: [PATCH 0549/1449] Add quick open/input color registrations (fixes #65153) --- .../browser/parts/quickinput/quickInput.ts | 10 +++++----- .../browser/parts/quickopen/quickOpenController.ts | 4 ++-- src/vs/workbench/common/theme.ts | 14 ++++++++++++++ 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/browser/parts/quickinput/quickInput.ts b/src/vs/workbench/browser/parts/quickinput/quickInput.ts index 39b2c68e696..606817b4e51 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInput.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInput.ts @@ -11,7 +11,7 @@ import * as dom from 'vs/base/browser/dom'; import { IInstantiationService, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { contrastBorder, widgetShadow } from 'vs/platform/theme/common/colorRegistry'; -import { SIDE_BAR_BACKGROUND, SIDE_BAR_FOREGROUND } from 'vs/workbench/common/theme'; +import { QUICK_OPEN_BACKGROUND, QUICK_OPEN_FOREGROUND } from 'vs/workbench/common/theme'; import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; import { CancellationToken } from 'vs/base/common/cancellation'; import { QuickInputList } from './quickInputList'; @@ -1512,10 +1512,10 @@ export class QuickInputService extends Component implements IQuickInputService { const titleColor = { dark: 'rgba(255, 255, 255, 0.105)', light: 'rgba(0,0,0,.06)', hc: 'black' }[theme.type]; this.titleBar.style.backgroundColor = titleColor ? titleColor.toString() : null; this.ui.inputBox.style(theme); - const sideBarBackground = theme.getColor(SIDE_BAR_BACKGROUND); - this.ui.container.style.backgroundColor = sideBarBackground ? sideBarBackground.toString() : null; - const sideBarForeground = theme.getColor(SIDE_BAR_FOREGROUND); - this.ui.container.style.color = sideBarForeground ? sideBarForeground.toString() : null; + const quickOpenBackground = theme.getColor(QUICK_OPEN_BACKGROUND); + this.ui.container.style.backgroundColor = quickOpenBackground ? quickOpenBackground.toString() : null; + const quickOpenForeground = theme.getColor(QUICK_OPEN_FOREGROUND); + this.ui.container.style.color = quickOpenForeground ? quickOpenForeground.toString() : null; const contrastBorderColor = theme.getColor(contrastBorder); this.ui.container.style.border = contrastBorderColor ? `1px solid ${contrastBorderColor}` : null; const widgetShadowColor = theme.getColor(widgetShadow); diff --git a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts index 1c1d735ff47..4ab01f54eed 100644 --- a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts +++ b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts @@ -34,7 +34,7 @@ import { IInstantiationService, ServiceIdentifier } from 'vs/platform/instantiat import { IContextKeyService, RawContextKey, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { SIDE_BAR_BACKGROUND, SIDE_BAR_FOREGROUND } from 'vs/workbench/common/theme'; +import { QUICK_OPEN_BACKGROUND, QUICK_OPEN_FOREGROUND } from 'vs/workbench/common/theme'; import { attachQuickOpenStyler } from 'vs/platform/theme/common/styler'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IFileService } from 'vs/platform/files/common/files'; @@ -188,7 +188,7 @@ export class QuickOpenController extends Component implements IQuickOpenService treeCreator: (container, config, opts) => this.instantiationService.createInstance(WorkbenchTree, container, config, opts) } )); - this._register(attachQuickOpenStyler(this.quickOpenWidget, this.themeService, { background: SIDE_BAR_BACKGROUND, foreground: SIDE_BAR_FOREGROUND })); + this._register(attachQuickOpenStyler(this.quickOpenWidget, this.themeService, { background: QUICK_OPEN_BACKGROUND, foreground: QUICK_OPEN_FOREGROUND })); const quickOpenContainer = this.quickOpenWidget.create(); addClass(quickOpenContainer, 'show-file-icons'); diff --git a/src/vs/workbench/common/theme.ts b/src/vs/workbench/common/theme.ts index 8bb1a35ebf2..39ffc80047e 100644 --- a/src/vs/workbench/common/theme.ts +++ b/src/vs/workbench/common/theme.ts @@ -437,6 +437,20 @@ export const SIDE_BAR_SECTION_HEADER_BORDER = registerColor('sideBarSectionHeade }, nls.localize('sideBarSectionHeaderBorder', "Side bar section header border color. The side bar is the container for views like explorer and search.")); +// < --- Quick Input -- > + +export const QUICK_OPEN_BACKGROUND = registerColor('quickOpen.background', { + dark: SIDE_BAR_BACKGROUND, + light: SIDE_BAR_BACKGROUND, + hc: SIDE_BAR_BACKGROUND +}, nls.localize('quickOpenBackground', "Quick open background color. The quick open palette is the container for views like the command palette and file quick picker")); + +export const QUICK_OPEN_FOREGROUND = registerColor('quickOpen.foreground', { + dark: SIDE_BAR_FOREGROUND, + light: SIDE_BAR_FOREGROUND, + hc: SIDE_BAR_FOREGROUND +}, nls.localize('quickOpenForeground', "Quick open foreground color. The quick open palette is the container for views like the command palette and file quick picker")); + // < --- Title Bar --- > export const TITLE_BAR_ACTIVE_FOREGROUND = registerColor('titleBar.activeForeground', { From a559a2142d7ae8dd6a3eeafef3d945346064eebd Mon Sep 17 00:00:00 2001 From: Pine Wu Date: Mon, 24 Jun 2019 01:33:25 -0700 Subject: [PATCH 0550/1449] Update API --- .../api/node/extHostExtensionService.ts | 48 +++++++++---------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts index 90e59f4f245..9d506fc112f 100644 --- a/src/vs/workbench/api/node/extHostExtensionService.ts +++ b/src/vs/workbench/api/node/extHostExtensionService.ts @@ -36,11 +36,13 @@ import { RemoteAuthorityResolverError, ExtensionExecutionContext, ExtensionKind import { IURITransformer } from 'vs/base/common/uriIpc'; interface ITestRunner { - // Old test runner spec, shipped in vscode/lib/testrunner + /** Old test runner API, as exported from `vscode/lib/testrunner` */ run(testsRoot: string, clb: (error: Error, failures?: number) => void): void; +} - // New test runner spec - runTests(): Promise; +interface INewTestRunner { + /** New test runner API, as explained in the extension test doc */ + run(): Promise; } export interface IHostUtils { @@ -530,7 +532,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { const extensionTestsPath = originalFSPath(extensionTestsLocationURI); // Require the test runner via node require from the provided path - let testRunner: ITestRunner | undefined; + let testRunner: ITestRunner | INewTestRunner | undefined; let requireError: Error | undefined; try { testRunner = require.__$__nodeRequire(extensionTestsPath); @@ -538,29 +540,10 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { requireError = error; } - // Execute the runner following the new `runTests` spec - if (testRunner && typeof testRunner.runTests === 'function') { - return new Promise((c, e) => { - testRunner!.runTests() - .then((succeeded) => { - if (succeeded) { - c(undefined); - this._gracefulExit(0); - } else { - this._gracefulExit(1); - } - }) - .catch(err => { - e(err); - this._gracefulExit(1); - }); - }); - } - // Execute the runner if it follows the old `run` spec if (testRunner && typeof testRunner.run === 'function') { return new Promise((c, e) => { - testRunner!.run(extensionTestsPath, (error, failures) => { + const oldTestRunnerCallback = (error: Error, failures: number | undefined) => { if (error) { e(error.toString()); } else { @@ -569,7 +552,22 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { // after tests have run, we shutdown the host this._gracefulExit(error || (typeof failures === 'number' && failures > 0) ? 1 /* ERROR */ : 0 /* OK */); - }); + }; + + const runResult = testRunner!.run(extensionTestsPath, oldTestRunnerCallback); + + // Using the new API `run(): Promise` + if (runResult && runResult.then) { + runResult + .then(() => { + c(); + this._gracefulExit(0); + }) + .catch((err) => { + e(err); + this._gracefulExit(1); + }); + } }); } From 422fd46b942e5eabba2f4fa1867d076e4b58fb8c Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 24 Jun 2019 10:35:55 +0200 Subject: [PATCH 0551/1449] implements ExtHostEditorInsetsShape --- src/vs/workbench/api/common/extHostCodeInsets.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/api/common/extHostCodeInsets.ts b/src/vs/workbench/api/common/extHostCodeInsets.ts index 398afff564f..5a6773d4438 100644 --- a/src/vs/workbench/api/common/extHostCodeInsets.ts +++ b/src/vs/workbench/api/common/extHostCodeInsets.ts @@ -5,13 +5,13 @@ import { Emitter } from 'vs/base/common/event'; import * as vscode from 'vscode'; -import { MainThreadEditorInsetsShape } from './extHost.protocol'; +import { MainThreadEditorInsetsShape, ExtHostEditorInsetsShape } from './extHost.protocol'; import { ExtHostEditors } from 'vs/workbench/api/common/extHostTextEditors'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ExtHostTextEditor } from 'vs/workbench/api/common/extHostTextEditor'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; -export class ExtHostEditorInsets implements ExtHostEditorInsets { +export class ExtHostEditorInsets implements ExtHostEditorInsetsShape { private _handlePool = 0; private _disposables = new DisposableStore(); From 8d1de35a463b9d1b235e2c4a12bf331ef5cf3c3c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 24 Jun 2019 10:40:24 +0200 Subject: [PATCH 0552/1449] use divs for tree indent guides fixes #75779 --- src/vs/base/browser/ui/tree/abstractTree.ts | 52 +++++++-------------- src/vs/base/browser/ui/tree/media/tree.css | 24 +++++----- 2 files changed, 29 insertions(+), 47 deletions(-) diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index c3527a710b8..dad7d26545a 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -243,7 +243,7 @@ class TreeRenderer implements IListRenderer, SVGLineElement>(); + private renderedIndentGuides = new SetMap, HTMLDivElement>(); private activeParentNodes = new Set>(); private indentGuidesDisposable: IDisposable = Disposable.None; @@ -312,7 +312,7 @@ class TreeRenderer implements IListRenderer implements IListRenderer, templateData: ITreeListTemplateData) { @@ -371,51 +371,35 @@ class TreeRenderer implements IListRenderer, templateData: ITreeListTemplateData, height: number): void { + private renderIndentGuides(target: ITreeNode, templateData: ITreeListTemplateData): void { + clearNode(templateData.indent); + templateData.indentGuidesDisposable.dispose(); + if (this._renderIndentGuides === RenderIndentGuides.None) { - clearNode(templateData.indent); return; } - templateData.indentGuidesDisposable.dispose(); - const disposableStore = new DisposableStore(); - const width = this.indent * target.depth; - const virtualWidth = width * window.devicePixelRatio; - const virtualHeight = height * window.devicePixelRatio; - - const svg = $.SVG('svg', { - preserveAspectRatio: 'none', - width: `${width}`, - height: `${height}`, - viewBox: `0 0 ${virtualWidth} ${virtualHeight}` - }); - let node = target; - let i = 1; while (node.parent && node.parent.parent) { const parent = node.parent; - const x = Math.floor((target.depth - i - 1) * this.indent * window.devicePixelRatio) + 2.5; - const line = $.SVG('line', { x1: x, y1: 0, x2: x, y2: virtualHeight }); + const guide = $('.indent-guide', { style: `width: ${this.indent}px` }); if (this.activeParentNodes.has(parent)) { - addClass(line, 'active'); + addClass(guide, 'active'); } - svg.appendChild(line); + if (templateData.indent.childElementCount === 0) { + templateData.indent.appendChild(guide); + } else { + templateData.indent.insertBefore(guide, templateData.indent.firstElementChild); + } - this.renderedIndentGuides.add(parent, line); - disposableStore.add(toDisposable(() => this.renderedIndentGuides.delete(parent, line))); + this.renderedIndentGuides.add(parent, guide); + disposableStore.add(toDisposable(() => this.renderedIndentGuides.delete(parent, guide))); node = parent; - i++; - } - - clearNode(templateData.indent); - - if (svg.firstChild) { - templateData.indent.appendChild(svg); } templateData.indentGuidesDisposable = disposableStore; @@ -1358,8 +1342,8 @@ export abstract class AbstractTree implements IDisposable const content: string[] = []; if (styles.treeIndentGuidesStroke) { - content.push(`.monaco-list${suffix}:hover .monaco-tl-indent > svg > line, .monaco-list${suffix}.always .monaco-tl-indent > svg > line { stroke: ${styles.treeIndentGuidesStroke.transparent(0.4)}; }`); - content.push(`.monaco-list${suffix} .monaco-tl-indent > svg > line.active { stroke: ${styles.treeIndentGuidesStroke}; }`); + content.push(`.monaco-list${suffix}:hover .monaco-tl-indent > .indent-guide, .monaco-list${suffix}.always .monaco-tl-indent > .indent-guide { border-color: ${styles.treeIndentGuidesStroke.transparent(0.4)}; }`); + content.push(`.monaco-list${suffix} .monaco-tl-indent > .indent-guide.active { border-color: ${styles.treeIndentGuidesStroke}; }`); } const newStyles = content.join('\n'); diff --git a/src/vs/base/browser/ui/tree/media/tree.css b/src/vs/base/browser/ui/tree/media/tree.css index 262b33ded22..0ba2eb422e0 100644 --- a/src/vs/base/browser/ui/tree/media/tree.css +++ b/src/vs/base/browser/ui/tree/media/tree.css @@ -14,16 +14,23 @@ height: 100%; position: absolute; top: 0; - left: 14px; + left: 18px; pointer-events: none; } .hide-arrows .monaco-tl-indent { - left: 10px; + left: 12px; } -.monaco-tl-indent > svg { - overflow: visible; +.monaco-tl-indent > .indent-guide { + display: inline-block; + box-sizing: border-box; + height: 100%; + border-left: 1px solid transparent; +} + +.monaco-tl-indent > .indent-guide { + transition: border-color 0.1s linear; } .monaco-tl-twistie, @@ -84,12 +91,3 @@ .hc-black .monaco-tl-twistie.loading { background-image: url("loading-hc.svg"); } - -.monaco-list .monaco-tl-indent > svg { - height: 100%; -} - -.monaco-list .monaco-tl-indent > svg > line { - stroke: transparent; - transition: stroke 0.1s linear; -} \ No newline at end of file From d813315714aad6390f59cc6a10458d19267d4001 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 24 Jun 2019 10:49:34 +0200 Subject: [PATCH 0553/1449] comment out more (for #74898) --- .../src/singlefolder-tests/workspace.test.ts | 12 ++++++------ scripts/test-integration.bat | 10 +++++----- scripts/test-integration.sh | 6 +++--- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.test.ts index 67059e58c50..dc700abdf1b 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.test.ts @@ -513,28 +513,28 @@ suite('workspace-namespace', () => { }); }); - (process.platform === 'win32' ? test.skip /* https://github.com/microsoft/vscode/issues/74898 */ : test)('findFiles', () => { + test('findFiles', () => { return vscode.workspace.findFiles('**/*.png').then((res) => { assert.equal(res.length, 2); assert.equal(basename(vscode.workspace.asRelativePath(res[0])), 'image.png'); }); }); - (process.platform === 'win32' ? test.skip /* https://github.com/microsoft/vscode/issues/74898 */ : test)('findFiles - exclude', () => { + test('findFiles - exclude', () => { return vscode.workspace.findFiles('**/*.png').then((res) => { assert.equal(res.length, 2); assert.equal(basename(vscode.workspace.asRelativePath(res[0])), 'image.png'); }); }); - (process.platform === 'win32' ? test.skip /* https://github.com/microsoft/vscode/issues/74898 */ : test)('findFiles, exclude', () => { + test('findFiles, exclude', () => { return vscode.workspace.findFiles('**/*.png', '**/sub/**').then((res) => { assert.equal(res.length, 1); assert.equal(basename(vscode.workspace.asRelativePath(res[0])), 'image.png'); }); }); - (process.platform === 'win32' ? test.skip /* https://github.com/microsoft/vscode/issues/74898 */ : test)('findFiles, cancellation', () => { + test('findFiles, cancellation', () => { const source = new vscode.CancellationTokenSource(); const token = source.token; // just to get an instance first @@ -545,7 +545,7 @@ suite('workspace-namespace', () => { }); }); - (process.platform === 'win32' ? test.skip /* https://github.com/microsoft/vscode/issues/74898 */ : test)('findTextInFiles', async () => { + test('findTextInFiles', async () => { const options: vscode.FindTextInFilesOptions = { include: '*.ts', previewOptions: { @@ -565,7 +565,7 @@ suite('workspace-namespace', () => { assert.equal(vscode.workspace.asRelativePath(match.uri), '10linefile.ts'); }); - (process.platform === 'win32' ? suite.skip /* https://github.com/microsoft/vscode/issues/74898 */ : suite)('findTextInFiles, cancellation', async () => { + test('findTextInFiles, cancellation', async () => { const results: vscode.TextSearchResult[] = []; const cancellation = new vscode.CancellationTokenSource(); cancellation.cancel(); diff --git a/scripts/test-integration.bat b/scripts/test-integration.bat index cf8902a2bce..4f38bc04c5a 100644 --- a/scripts/test-integration.bat +++ b/scripts/test-integration.bat @@ -23,12 +23,12 @@ call .\scripts\code.bat $%~dp0\..\extensions\emmet\test-fixtures --extensionDeve 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% +REM call .\scripts\node-electron.bat .\node_modules\mocha\bin\_mocha .\extensions\*\server\out\test\**\*.test.js +REM if %errorlevel% neq 0 exit /b %errorlevel% -if exist ".\resources\server\test\test-remote-integration.bat" ( - call .\resources\server\test\test-remote-integration.bat -) +REM if exist ".\resources\server\test\test-remote-integration.bat" ( +REM call .\resources\server\test\test-remote-integration.bat +REM ) rmdir /s /q %VSCODEUSERDATADIR% diff --git a/scripts/test-integration.sh b/scripts/test-integration.sh index a9058442dce..3d397ed204e 100755 --- a/scripts/test-integration.sh +++ b/scripts/test-integration.sh @@ -21,9 +21,9 @@ cd $ROOT ./scripts/code.sh $ROOT/extensions/vscode-colorize-tests/test --extensionDevelopmentPath=$ROOT/extensions/vscode-colorize-tests --extensionTestsPath=$ROOT/extensions/vscode-colorize-tests/out --disable-extensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started ./scripts/code.sh $ROOT/extensions/markdown-language-features/test-fixtures --extensionDevelopmentPath=$ROOT/extensions/markdown-language-features --extensionTestsPath=$ROOT/extensions/markdown-language-features/out/test --disable-extensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started -# mkdir -p $ROOT/extensions/emmet/test-fixtures -# ./scripts/code.sh $ROOT/extensions/emmet/test-fixtures --extensionDevelopmentPath=$ROOT/extensions/emmet --extensionTestsPath=$ROOT/extensions/emmet/out/test --disable-extensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started -# rm -rf $ROOT/extensions/emmet/test-fixtures +mkdir -p $ROOT/extensions/emmet/test-fixtures +./scripts/code.sh $ROOT/extensions/emmet/test-fixtures --extensionDevelopmentPath=$ROOT/extensions/emmet --extensionTestsPath=$ROOT/extensions/emmet/out/test --disable-extensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started +rm -rf $ROOT/extensions/emmet/test-fixtures if [ -f ./resources/server/test/test-remote-integration.sh ]; then ./resources/server/test/test-remote-integration.sh From cc6b5c3487df7581cf4b9f198fbcdf3052057a5b Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Mon, 24 Jun 2019 11:26:19 +0200 Subject: [PATCH 0554/1449] Quick Open > Quick Input (#65153) --- .../workbench/browser/parts/quickinput/quickInput.ts | 10 +++++----- .../browser/parts/quickopen/quickOpenController.ts | 4 ++-- src/vs/workbench/common/theme.ts | 8 ++++---- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/browser/parts/quickinput/quickInput.ts b/src/vs/workbench/browser/parts/quickinput/quickInput.ts index 606817b4e51..b2e36ae2e74 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInput.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInput.ts @@ -11,7 +11,7 @@ import * as dom from 'vs/base/browser/dom'; import { IInstantiationService, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { contrastBorder, widgetShadow } from 'vs/platform/theme/common/colorRegistry'; -import { QUICK_OPEN_BACKGROUND, QUICK_OPEN_FOREGROUND } from 'vs/workbench/common/theme'; +import { QUICK_INPUT_BACKGROUND, QUICK_INPUT_FOREGROUND } from 'vs/workbench/common/theme'; import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; import { CancellationToken } from 'vs/base/common/cancellation'; import { QuickInputList } from './quickInputList'; @@ -1512,10 +1512,10 @@ export class QuickInputService extends Component implements IQuickInputService { const titleColor = { dark: 'rgba(255, 255, 255, 0.105)', light: 'rgba(0,0,0,.06)', hc: 'black' }[theme.type]; this.titleBar.style.backgroundColor = titleColor ? titleColor.toString() : null; this.ui.inputBox.style(theme); - const quickOpenBackground = theme.getColor(QUICK_OPEN_BACKGROUND); - this.ui.container.style.backgroundColor = quickOpenBackground ? quickOpenBackground.toString() : null; - const quickOpenForeground = theme.getColor(QUICK_OPEN_FOREGROUND); - this.ui.container.style.color = quickOpenForeground ? quickOpenForeground.toString() : null; + const quickInputBackground = theme.getColor(QUICK_INPUT_BACKGROUND); + this.ui.container.style.backgroundColor = quickInputBackground ? quickInputBackground.toString() : null; + const quickInputForeground = theme.getColor(QUICK_INPUT_FOREGROUND); + this.ui.container.style.color = quickInputForeground ? quickInputForeground.toString() : null; const contrastBorderColor = theme.getColor(contrastBorder); this.ui.container.style.border = contrastBorderColor ? `1px solid ${contrastBorderColor}` : null; const widgetShadowColor = theme.getColor(widgetShadow); diff --git a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts index 4ab01f54eed..5851bdb62ce 100644 --- a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts +++ b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts @@ -34,7 +34,7 @@ import { IInstantiationService, ServiceIdentifier } from 'vs/platform/instantiat import { IContextKeyService, RawContextKey, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { QUICK_OPEN_BACKGROUND, QUICK_OPEN_FOREGROUND } from 'vs/workbench/common/theme'; +import { QUICK_INPUT_BACKGROUND, QUICK_INPUT_FOREGROUND } from 'vs/workbench/common/theme'; import { attachQuickOpenStyler } from 'vs/platform/theme/common/styler'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IFileService } from 'vs/platform/files/common/files'; @@ -188,7 +188,7 @@ export class QuickOpenController extends Component implements IQuickOpenService treeCreator: (container, config, opts) => this.instantiationService.createInstance(WorkbenchTree, container, config, opts) } )); - this._register(attachQuickOpenStyler(this.quickOpenWidget, this.themeService, { background: QUICK_OPEN_BACKGROUND, foreground: QUICK_OPEN_FOREGROUND })); + this._register(attachQuickOpenStyler(this.quickOpenWidget, this.themeService, { background: QUICK_INPUT_BACKGROUND, foreground: QUICK_INPUT_FOREGROUND })); const quickOpenContainer = this.quickOpenWidget.create(); addClass(quickOpenContainer, 'show-file-icons'); diff --git a/src/vs/workbench/common/theme.ts b/src/vs/workbench/common/theme.ts index 39ffc80047e..2d453924e8a 100644 --- a/src/vs/workbench/common/theme.ts +++ b/src/vs/workbench/common/theme.ts @@ -439,17 +439,17 @@ export const SIDE_BAR_SECTION_HEADER_BORDER = registerColor('sideBarSectionHeade // < --- Quick Input -- > -export const QUICK_OPEN_BACKGROUND = registerColor('quickOpen.background', { +export const QUICK_INPUT_BACKGROUND = registerColor('quickInput.background', { dark: SIDE_BAR_BACKGROUND, light: SIDE_BAR_BACKGROUND, hc: SIDE_BAR_BACKGROUND -}, nls.localize('quickOpenBackground', "Quick open background color. The quick open palette is the container for views like the command palette and file quick picker")); +}, nls.localize('quickInputBackground', "Quick Input background color. The Quick Input widget is the container for views like the color theme picker")); -export const QUICK_OPEN_FOREGROUND = registerColor('quickOpen.foreground', { +export const QUICK_INPUT_FOREGROUND = registerColor('quickInput.foreground', { dark: SIDE_BAR_FOREGROUND, light: SIDE_BAR_FOREGROUND, hc: SIDE_BAR_FOREGROUND -}, nls.localize('quickOpenForeground', "Quick open foreground color. The quick open palette is the container for views like the command palette and file quick picker")); +}, nls.localize('quickInputForeground', "Quick Input foreground color. The Quick Input widget is the container for views like the color theme picker")); // < --- Title Bar --- > From 0b62cdf464062a119a39656a07b63418e916d52d Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 24 Jun 2019 12:11:26 +0200 Subject: [PATCH 0555/1449] build - enable language server tests again (for #74898) --- scripts/test-integration.bat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/test-integration.bat b/scripts/test-integration.bat index 4f38bc04c5a..1c189ec7b1b 100644 --- a/scripts/test-integration.bat +++ b/scripts/test-integration.bat @@ -23,8 +23,8 @@ call .\scripts\code.bat $%~dp0\..\extensions\emmet\test-fixtures --extensionDeve if %errorlevel% neq 0 exit /b %errorlevel% :: Tests in commonJS (HTML, CSS, JSON language server tests...) -REM call .\scripts\node-electron.bat .\node_modules\mocha\bin\_mocha .\extensions\*\server\out\test\**\*.test.js -REM if %errorlevel% neq 0 exit /b %errorlevel% +call .\scripts\node-electron.bat .\node_modules\mocha\bin\_mocha .\extensions\*\server\out\test\**\*.test.js +if %errorlevel% neq 0 exit /b %errorlevel% REM if exist ".\resources\server\test\test-remote-integration.bat" ( REM call .\resources\server\test\test-remote-integration.bat From c9e7a0ba11c314a46962a98b60b591ff62e1e73c Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 24 Jun 2019 12:17:56 +0200 Subject: [PATCH 0556/1449] use polish for wsl1 --- .../files/node/diskFileSystemProvider.ts | 40 +++++++++++++------ .../watcher/unix/chokidarWatcherService.ts | 13 +++--- .../files/node/watcher/unix/watcher.ts | 2 + .../files/node/watcher/unix/watcherService.ts | 8 ++-- 4 files changed, 41 insertions(+), 22 deletions(-) diff --git a/src/vs/workbench/services/files/node/diskFileSystemProvider.ts b/src/vs/workbench/services/files/node/diskFileSystemProvider.ts index 530f3ea5c23..a645ac84ef0 100644 --- a/src/vs/workbench/services/files/node/diskFileSystemProvider.ts +++ b/src/vs/workbench/services/files/node/diskFileSystemProvider.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { mkdir, open, close, read, write, fdatasync } from 'fs'; +import * as os from 'os'; import { promisify } from 'util'; import { IDisposable, Disposable, toDisposable, dispose, combinedDisposable } from 'vs/base/common/lifecycle'; import { IFileSystemProvider, FileSystemProviderCapabilities, IFileChange, IWatchOptions, IStat, FileType, FileDeleteOptions, FileOverwriteOptions, FileWriteOptions, FileOpenOptions, FileSystemProviderErrorCode, createFileSystemProviderError, FileSystemProviderError } from 'vs/platform/files/common/files'; @@ -408,22 +409,30 @@ export class DiskFileSystemProvider extends Disposable implements IFileSystemPro folders: { path: string, excludes: string[] }[], onChange: (changes: IDiskFileChange[]) => void, onLogMessage: (msg: ILogMessage) => void, - verboseLogging: boolean + verboseLogging: boolean, + watcherOptions?: { [key: string]: boolean | number | string } ): WindowsWatcherService | UnixWatcherService | NsfwWatcherService }; + let watcherOptions = undefined; - // Single Folder Watcher - if (this.recursiveFoldersToWatch.length === 1) { - if (isWindows) { - watcherImpl = WindowsWatcherService; - } else { - watcherImpl = UnixWatcherService; + if (this.forcePolling()) { + // WSL needs a polling watcher + watcherImpl = UnixWatcherService; + watcherOptions = { usePolling: true }; + } else { + // Single Folder Watcher + if (this.recursiveFoldersToWatch.length === 1) { + if (isWindows) { + watcherImpl = WindowsWatcherService; + } else { + watcherImpl = UnixWatcherService; + } } - } - // Multi Folder Watcher - else { - watcherImpl = NsfwWatcherService; + // Multi Folder Watcher + else { + watcherImpl = NsfwWatcherService; + } } // Create and start watching @@ -436,7 +445,8 @@ export class DiskFileSystemProvider extends Disposable implements IFileSystemPro } this.logService[msg.type](msg.message); }, - this.logService.getLevel() === LogLevel.Trace + this.logService.getLevel() === LogLevel.Trace, + watcherOptions ); if (!this.recursiveWatcherLogLevelListener) { @@ -504,6 +514,12 @@ export class DiskFileSystemProvider extends Disposable implements IFileSystemPro return createFileSystemProviderError(error, code); } + + forcePolling(): boolean { + // wsl1 needs polling + return isLinux && /^[\.\-0-9]+-Microsoft/.test(os.release()); + } + //#endregion dispose(): void { diff --git a/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts b/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts index db31180b5a1..a95c7e42632 100644 --- a/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts +++ b/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts @@ -14,7 +14,7 @@ import { ThrottledDelayer } from 'vs/base/common/async'; import { normalizeNFC } from 'vs/base/common/normalization'; import { realcaseSync } from 'vs/base/node/extpath'; import { isMacintosh, isLinux } from 'vs/base/common/platform'; -import { IDiskFileChange, normalizeFileChanges, ILogMessage } from 'vs/workbench/services/files/node/watcher/watcher'; +import { IDiskFileChange, normalizeFileChanges, ILogMessage, isWSL1 } from 'vs/workbench/services/files/node/watcher/watcher'; import { IWatcherRequest, IWatcherService, IWatcherOptions } from 'vs/workbench/services/files/node/watcher/unix/watcher'; import { Emitter, Event } from 'vs/base/common/event'; @@ -23,10 +23,6 @@ interface IWatcher { stop(): any; } -export interface IChockidarWatcherOptions { - pollingInterval?: number; -} - interface ExtendedWatcherRequest extends IWatcherRequest { parsedPattern?: glob.ParsedPattern; } @@ -52,7 +48,7 @@ export class ChokidarWatcherService implements IWatcherService { private _onLogMessage = new Emitter(); readonly onLogMessage: Event = this._onLogMessage.event; - public watch(options: IWatcherOptions & IChockidarWatcherOptions): Event { + public watch(options: IWatcherOptions): Event { this._pollingInterval = options.pollingInterval; this._watchers = Object.create(null); this._watcherCount = 0; @@ -106,6 +102,10 @@ export class ChokidarWatcherService implements IWatcherService { } const pollingInterval = this._pollingInterval || 1000; + const usePolling = isWSL1(); + if (usePolling && this._verboseLogging) { + this.log(`Use polling instead of fs.watch.`); + } const watcherOpts: chokidar.IOptions = { ignoreInitial: true, @@ -113,6 +113,7 @@ export class ChokidarWatcherService implements IWatcherService { followSymlinks: true, // this is the default of chokidar and supports file events through symlinks interval: pollingInterval, // while not used in normal cases, if any error causes chokidar to fallback to polling, increase its intervals binaryInterval: pollingInterval, + usePolling: usePolling, disableGlobbing: true // fix https://github.com/Microsoft/vscode/issues/4586 }; diff --git a/src/vs/workbench/services/files/node/watcher/unix/watcher.ts b/src/vs/workbench/services/files/node/watcher/unix/watcher.ts index fa5d4b23335..fc87e15803a 100644 --- a/src/vs/workbench/services/files/node/watcher/unix/watcher.ts +++ b/src/vs/workbench/services/files/node/watcher/unix/watcher.ts @@ -12,6 +12,8 @@ export interface IWatcherRequest { } export interface IWatcherOptions { + pollingInterval?: number; + usePolling?: boolean; } export interface IWatcherService { diff --git a/src/vs/workbench/services/files/node/watcher/unix/watcherService.ts b/src/vs/workbench/services/files/node/watcher/unix/watcherService.ts index 887932e9e71..202b505d53a 100644 --- a/src/vs/workbench/services/files/node/watcher/unix/watcherService.ts +++ b/src/vs/workbench/services/files/node/watcher/unix/watcherService.ts @@ -8,7 +8,7 @@ import { Client } from 'vs/base/parts/ipc/node/ipc.cp'; import { IDiskFileChange, ILogMessage } from 'vs/workbench/services/files/node/watcher/watcher'; import { WatcherChannelClient } from 'vs/workbench/services/files/node/watcher/unix/watcherIpc'; import { Disposable } from 'vs/base/common/lifecycle'; -import { IWatcherRequest } from 'vs/workbench/services/files/node/watcher/unix/watcher'; +import { IWatcherRequest, IWatcherOptions } from 'vs/workbench/services/files/node/watcher/unix/watcher'; import { getPathFromAmdModule } from 'vs/base/common/amd'; export class FileWatcher extends Disposable { @@ -22,7 +22,8 @@ export class FileWatcher extends Disposable { private folders: IWatcherRequest[], private onFileChanges: (changes: IDiskFileChange[]) => void, private onLogMessage: (msg: ILogMessage) => void, - private verboseLogging: boolean + private verboseLogging: boolean, + private watcherOptions: IWatcherOptions = {} ) { super(); @@ -66,8 +67,7 @@ export class FileWatcher extends Disposable { this.service.setVerboseLogging(this.verboseLogging); - const options = {}; - this._register(this.service.watch(options)(e => !this.isDisposed && this.onFileChanges(e))); + this._register(this.service.watch(this.watcherOptions)(e => !this.isDisposed && this.onFileChanges(e))); this._register(this.service.onLogMessage(m => this.onLogMessage(m))); From 0c22cee46b93da9bca49166b73e6e0daa3264307 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 24 Jun 2019 12:31:12 +0200 Subject: [PATCH 0557/1449] move extension kind to Extension-interface --- src/vs/vscode.proposed.d.ts | 2 +- .../api/common/extHostExtensionActivator.ts | 2 -- src/vs/workbench/api/node/extHost.api.impl.ts | 18 ++++++++++++------ .../api/node/extHostExtensionService.ts | 3 +-- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 0ac46132de5..1ddff5bff6d 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -46,7 +46,7 @@ declare module 'vscode' { Workspace = 2 } - export interface ExtensionContext { + export interface Extension { /** * The extension kind describes if an extension runs where the UI runs diff --git a/src/vs/workbench/api/common/extHostExtensionActivator.ts b/src/vs/workbench/api/common/extHostExtensionActivator.ts index b38a447ab68..8ba9dbd8162 100644 --- a/src/vs/workbench/api/common/extHostExtensionActivator.ts +++ b/src/vs/workbench/api/common/extHostExtensionActivator.ts @@ -8,7 +8,6 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { ExtensionDescriptionRegistry } from 'vs/workbench/services/extensions/common/extensionDescriptionRegistry'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { ExtensionActivationError, MissingDependencyError } from 'vs/workbench/services/extensions/common/extensions'; -import { ExtensionKind } from 'vs/workbench/api/common/extHostTypes'; const NO_OP_VOID_PROMISE = Promise.resolve(undefined); @@ -28,7 +27,6 @@ export interface IExtensionContext { asAbsolutePath(relativePath: string): string; readonly logPath: string; executionContext: number; - extensionKind: ExtensionKind; } /** diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index f970b136e80..9bb9a6a92a4 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -284,17 +284,21 @@ export function createApiFactory( Object.freeze(env); } + const extensionKind = initData.remote.isRemote + ? extHostTypes.ExtensionKind.Workspace + : extHostTypes.ExtensionKind.UI; + // namespace: extensions const extensions: typeof vscode.extensions = { getExtension(extensionId: string): Extension | undefined { const desc = extensionRegistry.getExtensionDescription(extensionId); if (desc) { - return new Extension(extensionService, desc); + return new Extension(extensionService, desc, extensionKind); } return undefined; }, get all(): Extension[] { - return extensionRegistry.getAllExtensionDescriptions().map((desc) => new Extension(extensionService, desc)); + return extensionRegistry.getAllExtensionDescriptions().map((desc) => new Extension(extensionService, desc, extensionKind)); }, get onDidChange() { return extensionRegistry.onDidChange; @@ -906,16 +910,18 @@ class Extension implements vscode.Extension { private _extensionService: ExtHostExtensionService; private _identifier: ExtensionIdentifier; - public id: string; - public extensionPath: string; - public packageJSON: IExtensionDescription; + readonly id: string; + readonly extensionPath: string; + readonly packageJSON: IExtensionDescription; + readonly extensionKind: vscode.ExtensionKind; - constructor(extensionService: ExtHostExtensionService, description: IExtensionDescription) { + constructor(extensionService: ExtHostExtensionService, description: IExtensionDescription, kind: extHostTypes.ExtensionKind) { this._extensionService = extensionService; this._identifier = description.identifier; this.id = description.identifier.value; this.extensionPath = path.normalize(originalFSPath(description.extensionLocation)); this.packageJSON = description; + this.extensionKind = kind; } get isActive(): boolean { diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts index 69d976b10d0..cff54445d0e 100644 --- a/src/vs/workbench/api/node/extHostExtensionService.ts +++ b/src/vs/workbench/api/node/extHostExtensionService.ts @@ -32,7 +32,7 @@ import { withNullAsUndefined } from 'vs/base/common/types'; import { VSBuffer } from 'vs/base/common/buffer'; import { ExtensionMemento } from 'vs/workbench/api/common/extHostMemento'; import { ExtensionStoragePaths } from 'vs/workbench/api/node/extHostStoragePaths'; -import { RemoteAuthorityResolverError, ExtensionExecutionContext, ExtensionKind } from 'vs/workbench/api/common/extHostTypes'; +import { RemoteAuthorityResolverError, ExtensionExecutionContext } from 'vs/workbench/api/common/extHostTypes'; import { IURITransformer } from 'vs/base/common/uriIpc'; interface ITestRunner { @@ -362,7 +362,6 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { asAbsolutePath: (relativePath: string) => { return path.join(extensionDescription.extensionLocation.fsPath, relativePath); }, logPath: that._extHostLogService.getLogDirectory(extensionDescription.identifier), executionContext: this._initData.remote.isRemote ? ExtensionExecutionContext.Remote : ExtensionExecutionContext.Local, - extensionKind: this._initData.remote.isRemote ? ExtensionKind.Workspace : ExtensionKind.UI }); }); } From c8379e2bd0993fd035b8262f6623afeb0c54001b Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 24 Jun 2019 14:28:42 +0200 Subject: [PATCH 0558/1449] init log level of remote log service --- package.json | 2 +- .../contrib/remote/common/remote.contribution.ts | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 8ea694500f2..c8047f1c9e6 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "8bfb613ef059967ffe5a69e3b151c29885c8c108", + "distro": "e2de7806e752fbcf8be2bf6d3b0476cc49937ff0", "author": { "name": "Microsoft Corporation" }, diff --git a/src/vs/workbench/contrib/remote/common/remote.contribution.ts b/src/vs/workbench/contrib/remote/common/remote.contribution.ts index f169fda95d1..9235c739fb0 100644 --- a/src/vs/workbench/contrib/remote/common/remote.contribution.ts +++ b/src/vs/workbench/contrib/remote/common/remote.contribution.ts @@ -12,10 +12,11 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/ import { Schemas } from 'vs/base/common/network'; import { IRemoteAgentService, RemoteExtensionLogFileName } from 'vs/workbench/services/remote/common/remoteAgentService'; import { ILogService } from 'vs/platform/log/common/log'; -import { LogLevelSetterChannel } from 'vs/platform/log/common/logIpc'; +import { LogLevelSetterChannelClient } from 'vs/platform/log/common/logIpc'; import { IOutputChannelRegistry, Extensions as OutputExt, } from 'vs/workbench/contrib/output/common/output'; import { localize } from 'vs/nls'; import { joinPath } from 'vs/base/common/resources'; +import { Disposable } from 'vs/base/common/lifecycle'; export class LabelContribution implements IWorkbenchContribution { constructor( @@ -44,15 +45,18 @@ export class LabelContribution implements IWorkbenchContribution { } } -class RemoteChannelsContribution implements IWorkbenchContribution { +class RemoteChannelsContribution extends Disposable implements IWorkbenchContribution { constructor( @ILogService logService: ILogService, @IRemoteAgentService remoteAgentService: IRemoteAgentService, ) { + super(); const connection = remoteAgentService.getConnection(); if (connection) { - connection.registerChannel('loglevel', new LogLevelSetterChannel(logService)); + const logLevelClient = new LogLevelSetterChannelClient(connection.getChannel('loglevel')); + logLevelClient.setLevel(logService.getLevel()); + this._register(logService.onDidChangeLogLevel(level => logLevelClient.setLevel(level))); } } } From 923e3d38b6b562521c85a6a8a542c13eb19aeb0d Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Mon, 24 Jun 2019 14:29:20 +0200 Subject: [PATCH 0559/1449] Open/Save local commands should not show in the command palette Fixes #75737 --- .../browser/actions/workspaceActions.ts | 100 +++++++----------- .../files/browser/fileActions.contribution.ts | 40 ++++++- .../electron-browser/main.contribution.ts | 5 +- .../dialogs/browser/remoteFileDialog.ts | 6 +- 4 files changed, 80 insertions(+), 71 deletions(-) diff --git a/src/vs/workbench/browser/actions/workspaceActions.ts b/src/vs/workbench/browser/actions/workspaceActions.ts index 68fe0859f59..3cd1005e09d 100644 --- a/src/vs/workbench/browser/actions/workspaceActions.ts +++ b/src/vs/workbench/browser/actions/workspaceActions.ts @@ -11,7 +11,7 @@ import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder } from 'vs/p import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common/workspaceEditing'; import { IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { ICommandService } from 'vs/platform/commands/common/commands'; +import { ICommandService, ICommandHandler } from 'vs/platform/commands/common/commands'; import { ADD_ROOT_FOLDER_COMMAND_ID, ADD_ROOT_FOLDER_LABEL, PICK_WORKSPACE_FOLDER_COMMAND_ID } from 'vs/workbench/browser/actions/workspaceCommands'; import { IFileDialogService } from 'vs/platform/dialogs/common/dialogs'; import { INotificationService } from 'vs/platform/notification/common/notification'; @@ -39,44 +39,33 @@ export class OpenFileAction extends Action { } } -export class OpenLocalFileAction extends Action { +export namespace OpenLocalFileCommand { + export const ID = 'workbench.action.files.openLocalFile'; + export const LABEL = nls.localize('openLocalFile', "Open Local File..."); - static readonly ID = 'workbench.action.files.openLocalFile'; - static LABEL = nls.localize('openLocalFile', "Open Local File..."); - - constructor( - id: string, - label: string, - @IFileDialogService private readonly dialogService: IFileDialogService - ) { - super(id, label); - } - - run(event?: any, data?: ITelemetryData): Promise { - return this.dialogService.pickFileAndOpen({ forceNewWindow: false, telemetryExtraData: data, availableFileSystems: [Schemas.file] }); + export function handler(): ICommandHandler { + return accessor => { + const dialogService = accessor.get(IFileDialogService); + return dialogService.pickFileAndOpen({ forceNewWindow: false, availableFileSystems: [Schemas.file] }); + }; } } -export class SaveLocalFileAction extends Action { +export namespace SaveLocalFileCommand { + export const ID = 'workbench.action.files.saveLocalFile'; + export const LABEL = nls.localize('saveLocalFile', "Save Local File..."); - static readonly ID = 'workbench.action.files.saveLocalFile'; - static LABEL = nls.localize('saveLocalFile', "Save Local File..."); - - constructor( - id: string, - label: string, - @ITextFileService private readonly textFileService: ITextFileService, - @IEditorService private readonly editorService: IEditorService - ) { - super(id, label); - } - - async run(event?: any, data?: ITelemetryData): Promise { - let resource: URI | undefined = toResource(this.editorService.activeEditor); - const options: ISaveOptions = { force: true, availableFileSystems: [Schemas.file] }; - if (resource) { - return this.textFileService.saveAs(resource, undefined, options); - } + export function handler(): ICommandHandler { + return accessor => { + const textFileService = accessor.get(ITextFileService); + const editorService = accessor.get(IEditorService); + let resource: URI | undefined = toResource(editorService.activeEditor); + const options: ISaveOptions = { force: true, availableFileSystems: [Schemas.file] }; + if (resource) { + return textFileService.saveAs(resource, undefined, options); + } + return Promise.resolve(undefined); + }; } } @@ -98,21 +87,15 @@ export class OpenFolderAction extends Action { } } -export class OpenLocalFolderAction extends Action { +export namespace OpenLocalFolderCommand { + export const ID = 'workbench.action.files.openLocalFolder'; + export const LABEL = nls.localize('openLocalFolder', "Open Local Folder..."); - static readonly ID = 'workbench.action.files.openLocalFolder'; - static LABEL = nls.localize('openLocalFolder', "Open Local Folder..."); - - constructor( - id: string, - label: string, - @IFileDialogService private readonly dialogService: IFileDialogService - ) { - super(id, label); - } - - run(event?: any, data?: ITelemetryData): Promise { - return this.dialogService.pickFolderAndOpen({ forceNewWindow: false, telemetryExtraData: data, availableFileSystems: [Schemas.file] }); + export function handler(): ICommandHandler { + return accessor => { + const dialogService = accessor.get(IFileDialogService); + return dialogService.pickFolderAndOpen({ forceNewWindow: false, availableFileSystems: [Schemas.file] }); + }; } } @@ -135,21 +118,16 @@ export class OpenFileFolderAction extends Action { } } -export class OpenLocalFileFolderAction extends Action { +export namespace OpenLocalFileFolderCommand { - static readonly ID = 'workbench.action.files.openLocalFileFolder'; - static LABEL = nls.localize('openLocalFileFolder', "Open Local..."); + export const ID = 'workbench.action.files.openLocalFileFolder'; + export const LABEL = nls.localize('openLocalFileFolder', "Open Local..."); - constructor( - id: string, - label: string, - @IFileDialogService private readonly dialogService: IFileDialogService - ) { - super(id, label); - } - - run(event?: any, data?: ITelemetryData): Promise { - return this.dialogService.pickFileFolderAndOpen({ forceNewWindow: false, telemetryExtraData: data, availableFileSystems: [Schemas.file] }); + export function handler(): ICommandHandler { + return accessor => { + const dialogService = accessor.get(IFileDialogService); + return dialogService.pickFileFolderAndOpen({ forceNewWindow: false, availableFileSystems: [Schemas.file] }); + }; } } diff --git a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts index 8573f02c5a2..6ebb9b3e3fe 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts @@ -25,7 +25,7 @@ import { URI } from 'vs/base/common/uri'; import { Schemas } from 'vs/base/common/network'; import { SupportsWorkspacesContext, IsWebContext, RemoteFileDialogContext } from 'vs/workbench/browser/contextkeys'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { OpenFileFolderAction, OpenLocalFileFolderAction, OpenFileAction, OpenFolderAction, OpenLocalFileAction, OpenLocalFolderAction, OpenWorkspaceAction } from 'vs/workbench/browser/actions/workspaceActions'; +import { OpenFileFolderAction, OpenLocalFileFolderCommand, OpenFileAction, OpenFolderAction, OpenLocalFileCommand, OpenLocalFolderCommand, OpenWorkspaceAction, SaveLocalFileCommand } from 'vs/workbench/browser/actions/workspaceActions'; // Contribute Global Actions const category = { value: nls.localize('filesCategory', "File"), original: 'File' }; @@ -48,17 +48,49 @@ const fileCategory = nls.localize('file', "File"); if (isMacintosh) { registry.registerWorkbenchAction(new SyncActionDescriptor(OpenFileFolderAction, OpenFileFolderAction.ID, OpenFileFolderAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.KEY_O }), 'File: Open...', fileCategory); if (!isWeb) { - registry.registerWorkbenchAction(new SyncActionDescriptor(OpenLocalFileFolderAction, OpenLocalFileFolderAction.ID, OpenLocalFileFolderAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.KEY_O }, RemoteFileDialogContext), 'File: Open Local...', fileCategory); + KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: OpenLocalFileFolderCommand.ID, + weight: KeybindingWeight.WorkbenchContrib, + primary: KeyMod.CtrlCmd | KeyCode.KEY_O, + when: RemoteFileDialogContext, + description: { description: OpenLocalFileFolderCommand.LABEL, args: [] }, + handler: OpenLocalFileFolderCommand.handler() + }); } } else { registry.registerWorkbenchAction(new SyncActionDescriptor(OpenFileAction, OpenFileAction.ID, OpenFileAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.KEY_O }), 'File: Open File...', fileCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(OpenFolderAction, OpenFolderAction.ID, OpenFolderAction.LABEL, { primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.KEY_O) }), 'File: Open Folder...', fileCategory); if (!isWeb) { - registry.registerWorkbenchAction(new SyncActionDescriptor(OpenLocalFileAction, OpenLocalFileAction.ID, OpenLocalFileAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.KEY_O }, RemoteFileDialogContext), 'File: Open Local File...', fileCategory); - registry.registerWorkbenchAction(new SyncActionDescriptor(OpenLocalFolderAction, OpenLocalFolderAction.ID, OpenLocalFolderAction.LABEL, { primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.KEY_O) }, RemoteFileDialogContext), 'File: Open Local Folder...', fileCategory); + KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: OpenLocalFileCommand.ID, + weight: KeybindingWeight.WorkbenchContrib, + primary: KeyMod.CtrlCmd | KeyCode.KEY_O, + when: RemoteFileDialogContext, + description: { description: OpenLocalFileCommand.LABEL, args: [] }, + handler: OpenLocalFileCommand.handler() + }); + KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: OpenLocalFolderCommand.ID, + weight: KeybindingWeight.WorkbenchContrib, + primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.KEY_O), + when: RemoteFileDialogContext, + description: { description: OpenLocalFolderCommand.LABEL, args: [] }, + handler: OpenLocalFolderCommand.handler() + }); } } +if (!isWeb) { + KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: SaveLocalFileCommand.ID, + weight: KeybindingWeight.WorkbenchContrib, + primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_S, + when: RemoteFileDialogContext, + description: { description: SaveLocalFileCommand.LABEL, args: [] }, + handler: SaveLocalFileCommand.handler() + }); +} + const workspacesCategory = nls.localize('workspaces', "Workspaces"); registry.registerWorkbenchAction(new SyncActionDescriptor(OpenWorkspaceAction, OpenWorkspaceAction.ID, OpenWorkspaceAction.LABEL), 'Workspaces: Open Workspace...', workspacesCategory, SupportsWorkspacesContext); diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index aa6647f914f..9b217d89457 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -14,14 +14,14 @@ import { isWindows, isLinux, isMacintosh } from 'vs/base/common/platform'; import { KeybindingsReferenceAction, OpenDocumentationUrlAction, OpenIntroductoryVideosUrlAction, OpenTipsAndTricksUrlAction, OpenTwitterUrlAction, OpenRequestFeatureUrlAction, OpenPrivacyStatementUrlAction, OpenLicenseUrlAction, OpenNewsletterSignupUrlAction } from 'vs/workbench/electron-browser/actions/helpActions'; import { ToggleSharedProcessAction, InspectContextKeysAction, ToggleScreencastModeAction, ToggleDevToolsAction } from 'vs/workbench/electron-browser/actions/developerActions'; import { ShowAboutDialogAction, ZoomResetAction, ZoomOutAction, ZoomInAction, CloseCurrentWindowAction, SwitchWindow, NewWindowAction, QuickSwitchWindow, QuickOpenRecentAction, inRecentFilesPickerContextKey, OpenRecentAction, ReloadWindowWithExtensionsDisabledAction, NewWindowTabHandler, ReloadWindowAction, ShowPreviousWindowTabHandler, ShowNextWindowTabHandler, MoveWindowTabToNewWindowHandler, MergeWindowTabsHandlerHandler, ToggleWindowTabsBarHandler } from 'vs/workbench/electron-browser/actions/windowActions'; -import { AddRootFolderAction, GlobalRemoveRootFolderAction, SaveWorkspaceAsAction, OpenWorkspaceConfigFileAction, DuplicateWorkspaceInNewWindowAction, CloseWorkspaceAction, SaveLocalFileAction } from 'vs/workbench/browser/actions/workspaceActions'; +import { AddRootFolderAction, GlobalRemoveRootFolderAction, SaveWorkspaceAsAction, OpenWorkspaceConfigFileAction, DuplicateWorkspaceInNewWindowAction, CloseWorkspaceAction } from 'vs/workbench/browser/actions/workspaceActions'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { inQuickOpenContext, getQuickNavigateHandler } from 'vs/workbench/browser/parts/quickopen/quickopen'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { ADD_ROOT_FOLDER_COMMAND_ID } from 'vs/workbench/browser/actions/workspaceCommands'; -import { SupportsWorkspacesContext, IsMacContext, HasMacNativeTabsContext, IsDevelopmentContext, WorkbenchStateContext, WorkspaceFolderCountContext, RemoteFileDialogContext } from 'vs/workbench/browser/contextkeys'; +import { SupportsWorkspacesContext, IsMacContext, HasMacNativeTabsContext, IsDevelopmentContext, WorkbenchStateContext, WorkspaceFolderCountContext } from 'vs/workbench/browser/contextkeys'; import { NoEditorsVisibleContext, SingleEditorGroupsContext } from 'vs/workbench/common/editor'; import { IWindowService, IWindowsService } from 'vs/platform/windows/common/windows'; import { LogStorageAction } from 'vs/platform/storage/node/storageService'; @@ -35,7 +35,6 @@ import product from 'vs/platform/product/node/product'; (function registerFileActions(): void { const fileCategory = nls.localize('file', "File"); - registry.registerWorkbenchAction(new SyncActionDescriptor(SaveLocalFileAction, SaveLocalFileAction.ID, SaveLocalFileAction.LABEL, { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_S }, RemoteFileDialogContext), 'File: Save Local File...', fileCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(QuickOpenRecentAction, QuickOpenRecentAction.ID, QuickOpenRecentAction.LABEL), 'File: Quick Open Recent...', fileCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(OpenRecentAction, OpenRecentAction.ID, OpenRecentAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.KEY_R, mac: { primary: KeyMod.WinCtrl | KeyCode.KEY_R } }), 'File: Open Recent...', fileCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(CloseWorkspaceAction, CloseWorkspaceAction.ID, CloseWorkspaceAction.LABEL, { primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyCode.KEY_F) }), 'File: Close Workspace', fileCategory); diff --git a/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts b/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts index d40fb379306..6a3b741424e 100644 --- a/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts +++ b/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts @@ -23,7 +23,7 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/ import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { equalsIgnoreCase, format, startsWithIgnoreCase } from 'vs/base/common/strings'; -import { OpenLocalFileAction, OpenLocalFileFolderAction, OpenLocalFolderAction, SaveLocalFileAction } from 'vs/workbench/browser/actions/workspaceActions'; +import { OpenLocalFileCommand, OpenLocalFileFolderCommand, OpenLocalFolderCommand, SaveLocalFileCommand } from 'vs/workbench/browser/actions/workspaceActions'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IRemoteAgentEnvironment } from 'vs/platform/remote/common/remoteAgentEnvironment'; import { isValidBasename } from 'vs/base/common/extpath'; @@ -217,9 +217,9 @@ export class RemoteFileDialog { this.filePickBox.customLabel = nls.localize('remoteFileDialog.local', 'Show Local'); let action; if (isSave) { - action = SaveLocalFileAction; + action = SaveLocalFileCommand; } else { - action = this.allowFileSelection ? (this.allowFolderSelection ? OpenLocalFileFolderAction : OpenLocalFileAction) : OpenLocalFolderAction; + action = this.allowFileSelection ? (this.allowFolderSelection ? OpenLocalFileFolderCommand : OpenLocalFileCommand) : OpenLocalFolderCommand; } const keybinding = this.keybindingService.lookupKeybinding(action.ID); if (keybinding) { From df5f3f550c3ede60225d3043e77ae0f022806b05 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 24 Jun 2019 14:30:43 +0200 Subject: [PATCH 0560/1449] chockidar: use polling --- .../files/node/watcher/unix/chokidarWatcherService.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts b/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts index a95c7e42632..2302d222f57 100644 --- a/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts +++ b/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts @@ -14,7 +14,7 @@ import { ThrottledDelayer } from 'vs/base/common/async'; import { normalizeNFC } from 'vs/base/common/normalization'; import { realcaseSync } from 'vs/base/node/extpath'; import { isMacintosh, isLinux } from 'vs/base/common/platform'; -import { IDiskFileChange, normalizeFileChanges, ILogMessage, isWSL1 } from 'vs/workbench/services/files/node/watcher/watcher'; +import { IDiskFileChange, normalizeFileChanges, ILogMessage } from 'vs/workbench/services/files/node/watcher/watcher'; import { IWatcherRequest, IWatcherService, IWatcherOptions } from 'vs/workbench/services/files/node/watcher/unix/watcher'; import { Emitter, Event } from 'vs/base/common/event'; @@ -36,6 +36,7 @@ export class ChokidarWatcherService implements IWatcherService { private _watcherCount: number; private _pollingInterval?: number; + private _usePolling?: boolean; private _verboseLogging: boolean; private spamCheckStartTime: number; @@ -50,6 +51,7 @@ export class ChokidarWatcherService implements IWatcherService { public watch(options: IWatcherOptions): Event { this._pollingInterval = options.pollingInterval; + this._usePolling = options.usePolling; this._watchers = Object.create(null); this._watcherCount = 0; return this.onWatchEvent; @@ -102,9 +104,9 @@ export class ChokidarWatcherService implements IWatcherService { } const pollingInterval = this._pollingInterval || 1000; - const usePolling = isWSL1(); + const usePolling = this._usePolling; if (usePolling && this._verboseLogging) { - this.log(`Use polling instead of fs.watch.`); + this.log(`Use polling instead of fs.watch: Polling interval ${pollingInterval} ms`); } const watcherOpts: chokidar.IOptions = { From 588fb230c33d401869b9d38a58104231c5e483af Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 24 Jun 2019 14:32:05 +0200 Subject: [PATCH 0561/1449] fix build conditions --- build/azure-pipelines/darwin/product-build-darwin.yml | 6 +++--- build/azure-pipelines/linux/product-build-linux-alpine.yml | 2 +- build/azure-pipelines/linux/product-build-linux-arm.yml | 2 +- build/azure-pipelines/linux/product-build-linux.yml | 4 ++-- build/azure-pipelines/win32/product-build-win32.yml | 6 +++--- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index 201a6bdce4c..b465ef9a095 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -50,7 +50,7 @@ steps: yarn gulp hygiene yarn monaco-compile-check displayName: Run hygiene checks - condition: eq(variables['VSCODE_STEP_ON_IT'], 'false') + condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | set -e @@ -72,13 +72,13 @@ steps: # APP_NAME="`ls $(agent.builddirectory)/VSCode-darwin | head -n 1`" # yarn smoketest -- --build "$(agent.builddirectory)/VSCode-darwin/$APP_NAME" displayName: Run unit tests - condition: eq(variables['VSCODE_STEP_ON_IT'], 'false') + condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | set -e ./scripts/test-integration.sh --build --tfs "Integration Tests" displayName: Run integration tests - condition: eq(variables['VSCODE_STEP_ON_IT'], 'false') + condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | set -e diff --git a/build/azure-pipelines/linux/product-build-linux-alpine.yml b/build/azure-pipelines/linux/product-build-linux-alpine.yml index 71dfb920677..107f7fa0cec 100644 --- a/build/azure-pipelines/linux/product-build-linux-alpine.yml +++ b/build/azure-pipelines/linux/product-build-linux-alpine.yml @@ -59,7 +59,7 @@ steps: yarn gulp hygiene yarn monaco-compile-check displayName: Run hygiene checks - condition: eq(variables['VSCODE_STEP_ON_IT'], 'false') + condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | set -e diff --git a/build/azure-pipelines/linux/product-build-linux-arm.yml b/build/azure-pipelines/linux/product-build-linux-arm.yml index 8eb75c58aa9..ffa6d18f68e 100644 --- a/build/azure-pipelines/linux/product-build-linux-arm.yml +++ b/build/azure-pipelines/linux/product-build-linux-arm.yml @@ -59,7 +59,7 @@ steps: yarn gulp hygiene yarn monaco-compile-check displayName: Run hygiene checks - condition: eq(variables['VSCODE_STEP_ON_IT'], 'false') + condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | set -e diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 691851fbf97..fa26c26dd1c 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -51,7 +51,7 @@ steps: yarn gulp hygiene yarn monaco-compile-check displayName: Run hygiene checks - condition: eq(variables['VSCODE_STEP_ON_IT'], 'false') + condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | set -e @@ -76,7 +76,7 @@ steps: DISPLAY=:10 ./scripts/test.sh --build --tfs "Unit Tests" # yarn smoketest -- --build "$(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH)" displayName: Run unit tests - condition: eq(variables['VSCODE_STEP_ON_IT'], 'false') + condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | set -e diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 6505b9a8df2..18758af4f99 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -55,7 +55,7 @@ steps: exec { yarn gulp hygiene } exec { yarn monaco-compile-check } displayName: Run hygiene checks - condition: eq(variables['VSCODE_STEP_ON_IT'], 'false') + condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - powershell: | . build/azure-pipelines/win32/exec.ps1 @@ -78,7 +78,7 @@ steps: exec { yarn gulp "electron-$(VSCODE_ARCH)" } exec { .\scripts\test.bat --build --tfs "Unit Tests" } displayName: Run unit tests - condition: eq(variables['VSCODE_STEP_ON_IT'], 'false') + condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - powershell: | . build/azure-pipelines/win32/exec.ps1 @@ -86,7 +86,7 @@ steps: exec { yarn gulp "electron-$(VSCODE_ARCH)" } exec { .\scripts\test-integration.bat --build --tfs "Integration Tests" } displayName: Run integration tests - condition: eq(variables['VSCODE_STEP_ON_IT'], 'false') + condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1 inputs: From 88f10ca5ed57020a92e09c5548bfd2d2cca96425 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 24 Jun 2019 14:42:08 +0200 Subject: [PATCH 0562/1449] xterm fixes for cglicenses --- cglicenses.json | 1430 ++++++++++++++++++++++++----------------------- 1 file changed, 739 insertions(+), 691 deletions(-) diff --git a/cglicenses.json b/cglicenses.json index 3d96813f3ef..469cdedc9ad 100644 --- a/cglicenses.json +++ b/cglicenses.json @@ -6,694 +6,742 @@ // DO NOT EDIT THIS FILE UNLESS THE OSS TOOL INDICATES THAT YOU SHOULD. // [ -{ - // Reason: The license at https://github.com/aadsm/jschardet/blob/master/LICENSE - // does not include a clear Copyright statement and does not credit authors. - "name": "jschardet", - "licenseDetail": [ - "Chardet was originally ported from C++ by Mark Pilgrim. It is now maintained", - " by Dan Blanchard and Ian Cordasco, and was formerly maintained by Erik Rose.", - " JSChardet was ported from python to JavaScript by António Afonso ", - " (https://github.com/aadsm/jschardet) and transformed into an npm package by ", - "Markus Ast (https://github.com/brainafk)", - "", - "GNU LESSER GENERAL PUBLIC LICENSE", - "\t\t Version 2.1, February 1999", - "", - " Copyright (C) 1991,", - "1999 Free Software Foundation, Inc.", - " 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA", - " Everyone is permitted to copy and distribute verbatim copies", - " of this license document, but changing it is not allowed.", - "", - "[This is the first released version of the Lesser GPL. It also counts", - " as the successor of the GNU Library Public License, version 2, hence", - " the version number 2.1.", - "]", - "", - "\t\t\t Preamble", - "", - " The licenses for most software are designed to take away your", - "freedom to share and change it. By contrast, the GNU General Public", - "Licenses are intended to guarantee your freedom to share and change", - "free software--to make sure the software is free for all its users.", - "", - " This license, the Lesser General Public License, applies to some", - "specially designated software packages--typically libraries--of the", - "Free Software Foundation and other authors who decide to use it. You", - "can use it too, but we suggest you first think carefully about whether", - "this license or the ordinary General Public License is the better", - "strategy to use in any particular case, based on the explanations below.", - "", - " When we speak of free software, we are referring to freedom of use,", - "not price. Our General Public Licenses are designed to make sure that", - "you have the freedom to distribute copies of free software (and charge", - "for this service if you wish); that you receive source code or can get", - "it if you want it; that you can change the software and use pieces of", - "it in new free programs; and that you are informed that you can do", - "these things.", - "", - " To protect your rights, we need to make restrictions that forbid", - "distributors to deny you these rights or to ask you to surrender these", - "rights. These restrictions translate to certain responsibilities for", - "you if you distribute copies of the library or if you modify it.", - "", - " For example, if you distribute copies of the library, whether gratis", - "or for a fee, you must give the recipients all the rights that we gave", - "you. You must make sure that they, too, receive or can get the source", - "code. If you link other code with the library, you must provide", - "complete object files to the recipients, so that they can relink them", - "with the library after making changes to the library and recompiling", - "it. And you must show them these terms so they know their rights.", - "", - " We protect your rights with a two-step method: (1) we copyright the", - "library, and (2) we offer you this license, which gives you legal", - "permission to copy, distribute and/or modify the library.", - "", - " To protect each distributor, we want to make it very clear that", - "there is no warranty for the free library. Also, if the library is", - "modified by someone else and passed on, the recipients should know", - "that what they have is not the original version, so that the original", - "author's reputation will not be affected by problems that might be", - "introduced by others.", - "", - " Finally, software patents pose a constant threat to the existence of", - "any free program. We wish to make sure that a company cannot", - "effectively restrict the users of a free program by obtaining a", - "restrictive license from a patent holder. Therefore, we insist that", - "any patent license obtained for a version of the library must be", - "consistent with the full freedom of use specified in this license.", - "", - " Most GNU software, including some libraries, is covered by the", - "ordinary GNU General Public License. This license, the GNU Lesser", - "General Public License, applies to certain designated libraries, and", - "is quite different from the ordinary General Public License. We use", - "this license for certain libraries in order to permit linking those", - "libraries into non-free programs.", - "", - " When a program is linked with a library, whether statically or using", - "a shared library, the combination of the two is legally speaking a", - "combined work, a derivative of the original library. The ordinary", - "General Public License therefore permits such linking only if the", - "entire combination fits its criteria of freedom. The Lesser General", - "Public License permits more lax criteria for linking other code with", - "the library.", - "", - " We call this license the \"Lesser\" General Public License because it", - "does Less to protect the user's freedom than the ordinary General", - "Public License. It also provides other free software developers Less", - "of an advantage over competing non-free programs. These disadvantages", - "are the reason we use the ordinary General Public License for many", - "libraries. However, the Lesser license provides advantages in certain", - "special circumstances.", - "", - " For example, on rare occasions, there may be a special need to", - "encourage the widest possible use of a certain library, so that it becomes", - "a de-facto standard. To achieve this, non-free programs must be", - "allowed to use the library. A more frequent case is that a free", - "library does the same job as widely used non-free libraries. In this", - "case, there is little to gain by limiting the free library to free", - "software only, so we use the Lesser General Public License.", - "", - " In other cases, permission to use a particular library in non-free", - "programs enables a greater number of people to use a large body of", - "free software. For example, permission to use the GNU C Library in", - "non-free programs enables many more people to use the whole GNU", - "operating system, as well as its variant, the GNU/Linux operating", - "system.", - "", - " Although the Lesser General Public License is Less protective of the", - "users' freedom, it does ensure that the user of a program that is", - "linked with the Library has the freedom and the wherewithal to run", - "that program using a modified version of the Library.", - "", - " The precise terms and conditions for copying, distribution and", - "modification follow. Pay close attention to the difference between a", - "\"work based on the library\" and a \"work that uses the library\". The", - "former contains code derived from the library, whereas the latter must", - "be combined with the library in order to run.", - "", - "\t\t GNU LESSER GENERAL PUBLIC LICENSE", - " TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION", - "", - " 0. This License Agreement applies to any software library or other", - "program which contains a notice placed by the copyright holder or", - "other authorized party saying it may be distributed under the terms of", - "this Lesser General Public License (also called \"this License\").", - "Each licensee is addressed as \"you\".", - "", - " A \"library\" means a collection of software functions and/or data", - "prepared so as to be conveniently linked with application programs", - "(which use some of those functions and data) to form executables.", - "", - " The \"Library\", below, refers to any such software library or work", - "which has been distributed under these terms. A \"work based on the", - "Library\" means either the Library or any derivative work under", - "copyright law: that is to say, a work containing the Library or a", - "portion of it, either verbatim or with modifications and/or translated", - "straightforwardly into another language. (Hereinafter, translation is", - "included without limitation in the term \"modification\".)", - "", - " \"Source code\" for a work means the preferred form of the work for", - "making modifications to it. For a library, complete source code means", - "all the source code for all modules it contains, plus any associated", - "interface definition files, plus the scripts used to control compilation", - "and installation of the library.", - "", - " Activities other than copying, distribution and modification are not", - "covered by this License; they are outside its scope. The act of", - "running a program using the Library is not restricted, and output from", - "such a program is covered only if its contents constitute a work based", - "on the Library (independent of the use of the Library in a tool for", - "writing it). Whether that is true depends on what the Library does", - "and what the program that uses the Library does.", - "", - " 1. You may copy and distribute verbatim copies of the Library's", - "complete source code as you receive it, in any medium, provided that", - "you conspicuously and appropriately publish on each copy an", - "appropriate copyright notice and disclaimer of warranty; keep intact", - "all the notices that refer to this License and to the absence of any", - "warranty; and distribute a copy of this License along with the", - "Library.", - "", - " You may charge a fee for the physical act of transferring a copy,", - "and you may at your option offer warranty protection in exchange for a", - "fee.", - "", - " 2. You may modify your copy or copies of the Library or any portion", - "of it, thus forming a work based on the Library, and copy and", - "distribute such modifications or work under the terms of Section 1", - "above, provided that you also meet all of these conditions:", - "", - " a) The modified work must itself be a software library.", - "", - " b) You must cause the files modified to carry prominent notices", - " stating that you changed the files and the date of any change.", - "", - " c) You must cause the whole of the work to be licensed at no", - " charge to all third parties under the terms of this License.", - "", - " d) If a facility in the modified Library refers to a function or a", - " table of data to be supplied by an application program that uses", - " the facility, other than as an argument passed when the facility", - " is invoked, then you must make a good faith effort to ensure that,", - " in the event an application does not supply such function or", - " table, the facility still operates, and performs whatever part of", - " its purpose remains meaningful.", - "", - " (For example, a function in a library to compute square roots has", - " a purpose that is entirely well-defined independent of the", - " application. Therefore, Subsection 2d requires that any", - " application-supplied function or table used by this function must", - " be optional: if the application does not supply it, the square", - " root function must still compute square roots.)", - "", - "These requirements apply to the modified work as a whole. If", - "identifiable sections of that work are not derived from the Library,", - "and can be reasonably considered independent and separate works in", - "themselves, then this License, and its terms, do not apply to those", - "sections when you distribute them as separate works. But when you", - "distribute the same sections as part of a whole which is a work based", - "on the Library, the distribution of the whole must be on the terms of", - "this License, whose permissions for other licensees extend to the", - "entire whole, and thus to each and every part regardless of who wrote", - "it.", - "", - "Thus, it is not the intent of this section to claim rights or contest", - "your rights to work written entirely by you; rather, the intent is to", - "exercise the right to control the distribution of derivative or", - "collective works based on the Library.", - "", - "In addition, mere aggregation of another work not based on the Library", - "with the Library (or with a work based on the Library) on a volume of", - "a storage or distribution medium does not bring the other work under", - "the scope of this License.", - "", - " 3. You may opt to apply the terms of the ordinary GNU General Public", - "License instead of this License to a given copy of the Library. To do", - "this, you must alter all the notices that refer to this License, so", - "that they refer to the ordinary GNU General Public License, version 2,", - "instead of to this License. (If a newer version than version 2 of the", - "ordinary GNU General Public License has appeared, then you can specify", - "that version instead if you wish.) Do not make any other change in", - "these notices.", - "", - " Once this change is made in a given copy, it is irreversible for", - "that copy, so the ordinary GNU General Public License applies to all", - "subsequent copies and derivative works made from that copy.", - "", - " This option is useful when you wish to copy part of the code of", - "the Library into a program that is not a library.", - "", - " 4. You may copy and distribute the Library (or a portion or", - "derivative of it, under Section 2) in object code or executable form", - "under the terms of Sections 1 and 2 above provided that you accompany", - "it with the complete corresponding machine-readable source code, which", - "must be distributed under the terms of Sections 1 and 2 above on a", - "medium customarily used for software interchange.", - "", - " If distribution of object code is made by offering access to copy", - "from a designated place, then offering equivalent access to copy the", - "source code from the same place satisfies the requirement to", - "distribute the source code, even though third parties are not", - "compelled to copy the source along with the object code.", - "", - " 5. A program that contains no derivative of any portion of the", - "Library, but is designed to work with the Library by being compiled or", - "linked with it, is called a \"work that uses the Library\". Such a", - "work, in isolation, is not a derivative work of the Library, and", - "therefore falls outside the scope of this License.", - "", - " However, linking a \"work that uses the Library\" with the Library", - "creates an executable that is a derivative of the Library (because it", - "contains portions of the Library), rather than a \"work that uses the", - "library\". The executable is therefore covered by this License.", - "Section 6 states terms for distribution of such executables.", - "", - " When a \"work that uses the Library\" uses material from a header file", - "that is part of the Library, the object code for the work may be a", - "derivative work of the Library even though the source code is not.", - "Whether this is true is especially significant if the work can be", - "linked without the Library, or if the work is itself a library. The", - "threshold for this to be true is not precisely defined by law.", - "", - " If such an object file uses only numerical parameters, data", - "structure layouts and accessors, and small macros and small inline", - "functions (ten lines or less in length), then the use of the object", - "file is unrestricted, regardless of whether it is legally a derivative", - "work. (Executables containing this object code plus portions of the", - "Library will still fall under Section 6.)", - "", - " Otherwise, if the work is a derivative of the Library, you may", - "distribute the object code for the work under the terms of Section 6.", - "Any executables containing that work also fall under Section 6,", - "whether or not they are linked directly with the Library itself.", - "", - " 6. As an exception to the Sections above, you may also combine or", - "link a \"work that uses the Library\" with the Library to produce a", - "work containing portions of the Library, and distribute that work", - "under terms of your choice, provided that the terms permit", - "modification of the work for the customer's own use and reverse", - "engineering for debugging such modifications.", - "", - " You must give prominent notice with each copy of the work that the", - "Library is used in it and that the Library and its use are covered by", - "this License. You must supply a copy of this License. If the work", - "during execution displays copyright notices, you must include the", - "copyright notice for the Library among them, as well as a reference", - "directing the user to the copy of this License. Also, you must do one", - "of these things:", - "", - " a) Accompany the work with the complete corresponding", - " machine-readable source code for the Library including whatever", - " changes were used in the work (which must be distributed under", - " Sections 1 and 2 above); and, if the work is an executable linked", - " with the Library, with the complete machine-readable \"work that", - " uses the Library\", as object code and/or source code, so that the", - " user can modify the Library and then relink to produce a modified", - " executable containing the modified Library. (It is understood", - " that the user who changes the contents of definitions files in the", - " Library will not necessarily be able to recompile the application", - " to use the modified definitions.)", - "", - " b) Use a suitable shared library mechanism for linking with the", - " Library. A suitable mechanism is one that (1) uses at run time a", - " copy of the library already present on the user's computer system,", - " rather than copying library functions into the executable, and (2)", - " will operate properly with a modified version of the library, if", - " the user installs one, as long as the modified version is", - " interface-compatible with the version that the work was made with.", - "", - " c) Accompany the work with a written offer, valid for at", - " least three years, to give the same user the materials", - " specified in Subsection 6a, above, for a charge no more", - " than the cost of performing this distribution.", - "", - " d) If distribution of the work is made by offering access to copy", - " from a designated place, offer equivalent access to copy the above", - " specified materials from the same place.", - "", - " e) Verify that the user has already received a copy of these", - " materials or that you have already sent this user a copy.", - "", - " For an executable, the required form of the \"work that uses the", - "Library\" must include any data and utility programs needed for", - "reproducing the executable from it. However, as a special exception,", - "the materials to be distributed need not include anything that is", - "normally distributed (in either source or binary form) with the major", - "components (compiler, kernel, and so on) of the operating system on", - "which the executable runs, unless that component itself accompanies", - "the executable.", - "", - " It may happen that this requirement contradicts the license", - "restrictions of other proprietary libraries that do not normally", - "accompany the operating system. Such a contradiction means you cannot", - "use both them and the Library together in an executable that you", - "distribute.", - "", - " 7. You may place library facilities that are a work based on the", - "Library side-by-side in a single library together with other library", - "facilities not covered by this License, and distribute such a combined", - "library, provided that the separate distribution of the work based on", - "the Library and of the other library facilities is otherwise", - "permitted, and provided that you do these two things:", - "", - " a) Accompany the combined library with a copy of the same work", - " based on the Library, uncombined with any other library", - " facilities. This must be distributed under the terms of the", - " Sections above.", - "", - " b) Give prominent notice with the combined library of the fact", - " that part of it is a work based on the Library, and explaining", - " where to find the accompanying uncombined form of the same work.", - "", - " 8. You may not copy, modify, sublicense, link with, or distribute", - "the Library except as expressly provided under this License. Any", - "attempt otherwise to copy, modify, sublicense, link with, or", - "distribute the Library is void, and will automatically terminate your", - "rights under this License. However, parties who have received copies,", - "or rights, from you under this License will not have their licenses", - "terminated so long as such parties remain in full compliance.", - "", - " 9. You are not required to accept this License, since you have not", - "signed it. However, nothing else grants you permission to modify or", - "distribute the Library or its derivative works. These actions are", - "prohibited by law if you do not accept this License. Therefore, by", - "modifying or distributing the Library (or any work based on the", - "Library), you indicate your acceptance of this License to do so, and", - "all its terms and conditions for copying, distributing or modifying", - "the Library or works based on it.", - "", - " 10. Each time you redistribute the Library (or any work based on the", - "Library), the recipient automatically receives a license from the", - "original licensor to copy, distribute, link with or modify the Library", - "subject to these terms and conditions. You may not impose any further", - "restrictions on the recipients' exercise of the rights granted herein.", - "You are not responsible for enforcing compliance by third parties with", - "this License.", - "", - " 11. If, as a consequence of a court judgment or allegation of patent", - "infringement or for any other reason (not limited to patent issues),", - "conditions are imposed on you (whether by court order, agreement or", - "otherwise) that contradict the conditions of this License, they do not", - "excuse you from the conditions of this License. If you cannot", - "distribute so as to satisfy simultaneously your obligations under this", - "License and any other pertinent obligations, then as a consequence you", - "may not distribute the Library at all. For example, if a patent", - "license would not permit royalty-free redistribution of the Library by", - "all those who receive copies directly or indirectly through you, then", - "the only way you could satisfy both it and this License would be to", - "refrain entirely from distribution of the Library.", - "", - "If any portion of this section is held invalid or unenforceable under any", - "particular circumstance, the balance of the section is intended to apply,", - "and the section as a whole is intended to apply in other circumstances.", - "", - "It is not the purpose of this section to induce you to infringe any", - "patents or other property right claims or to contest validity of any", - "such claims; this section has the sole purpose of protecting the", - "integrity of the free software distribution system which is", - "implemented by public license practices. Many people have made", - "generous contributions to the wide range of software distributed", - "through that system in reliance on consistent application of that", - "system; it is up to the author/donor to decide if he or she is willing", - "to distribute software through any other system and a licensee cannot", - "impose that choice.", - "", - "This section is intended to make thoroughly clear what is believed to", - "be a consequence of the rest of this License.", - "", - " 12. If the distribution and/or use of the Library is restricted in", - "certain countries either by patents or by copyrighted interfaces, the", - "original copyright holder who places the Library under this License may add", - "an explicit geographical distribution limitation excluding those countries,", - "so that distribution is permitted only in or among countries not thus", - "excluded. In such case, this License incorporates the limitation as if", - "written in the body of this License.", - "", - " 13. The Free Software Foundation may publish revised and/or new", - "versions of the Lesser General Public License from time to time.", - "Such new versions will be similar in spirit to the present version,", - "but may differ in detail to address new problems or concerns.", - "", - "Each version is given a distinguishing version number. If the Library", - "specifies a version number of this License which applies to it and", - "\"any later version\", you have the option of following the terms and", - "conditions either of that version or of any later version published by", - "the Free Software Foundation. If the Library does not specify a", - "license version number, you may choose any version ever published by", - "the Free Software Foundation.", - "", - " 14. If you wish to incorporate parts of the Library into other free", - "programs whose distribution conditions are incompatible with these,", - "write to the author to ask for permission. For software which is", - "copyrighted by the Free Software Foundation, write to the Free", - "Software Foundation; we sometimes make exceptions for this. Our", - "decision will be guided by the two goals of preserving the free status", - "of all derivatives of our free software and of promoting the sharing", - "and reuse of software generally.", - "", - "\t\t\t NO WARRANTY", - "", - " 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO", - "WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.", - "EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR", - "OTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY", - "KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE", - "IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR", - "PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE", - "LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME", - "THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.", - "", - " 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN", - "WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY", - "AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU", - "FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR", - "CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE", - "LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING", - "RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A", - "FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF", - "SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH", - "DAMAGES.", - "", - "\t\t END OF TERMS AND CONDITIONS", - "", - " How to Apply These Terms to Your New Libraries", - "", - " If you develop a new library, and you want it to be of the greatest", - "possible use to the public, we recommend making it free software that", - "everyone can redistribute and change. You can do so by permitting", - "redistribution under these terms (or, alternatively, under the terms of the", - "ordinary General Public License).", - "", - " To apply these terms, attach the following notices to the library. It is", - "safest to attach them to the start of each source file to most effectively", - "convey the exclusion of warranty; and each file should have at least the", - "\"copyright\" line and a pointer to where the full notice is found.", - "", - " ", - " Copyright (C) ", - "", - " This library is free software; you can redistribute it and/or", - " modify it under the terms of the GNU Lesser General Public", - " License as published by the Free Software Foundation; either", - " version 2.1 of the License, or (at your option) any later version.", - "", - " This library is distributed in the hope that it will be useful,", - " but WITHOUT ANY WARRANTY; without even the implied warranty of", - " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU", - " Lesser General Public License for more details.", - "", - " You should have received a copy of the GNU Lesser General Public", - " License along with this library; if not, write to the Free Software", - " Foundation, Inc.,", - "51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA", - "", - "Also add information on how to contact you by electronic and paper mail.", - "", - "You should also get your employer (if you work as a programmer) or your", - "school, if any, to sign a \"copyright disclaimer\" for the library, if", - "necessary. Here is a sample; alter the names:", - "", - " Yoyodyne, Inc., hereby disclaims all copyright interest in the", - " library `Frob' (a library for tweaking knobs) written by James Random Hacker.", - "", - " ,", - "1 April 1990", - " Ty Coon, President of Vice", - "", - "That's all there is to it!" - ] -}, -{ - // Added here because the module `parse5` has a dependency to it. - // The module `parse5` is shipped via the `extension-editing` built-in extension. - // The module `parse5` does not want to remove it https://github.com/inikulin/parse5/issues/225 - "name": "@types/node", - "licenseDetail": [ - "This project is licensed under the MIT license.", - "Copyrights are respective of each contributor listed at the beginning of each definition file.", - "", - "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:", - "", - "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", - "", - "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE." - ] -}, -{ - // We override the license that gets discovered at - // https://github.com/Microsoft/TypeScript/blob/master/LICENSE.txt - // because it does not contain a Copyright statement - "name": "typescript", - "licenseDetail": [ - "Copyright (c) Microsoft Corporation. All rights reserved.", - "", - "Apache License", - "", - "Version 2.0, January 2004", - "", - "http://www.apache.org/licenses/", - "", - "TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION", - "", - "1. Definitions.", - "", - "\"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.", - "", - "\"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.", - "", - "\"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.", - "", - "\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.", - "", - "\"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.", - "", - "\"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.", - "", - "\"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).", - "", - "\"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.", - "", - "\"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"", - "", - "\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.", - "", - "2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.", - "", - "3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.", - "", - "4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:", - "", - "You must give any other recipients of the Work or Derivative Works a copy of this License; and", - "", - "You must cause any modified files to carry prominent notices stating that You changed the files; and", - "", - "You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and", - "", - "If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.", - "", - "5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.", - "", - "6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.", - "", - "7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.", - "", - "8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.", - "", - "9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.", - "", - "END OF TERMS AND CONDITIONS" - ] -}, -{ - // This module comes in from https://github.com/Microsoft/vscode-node-debug2/blob/master/package-lock.json - "name": "@types/source-map", - "licenseDetail": [ - "This project is licensed under the MIT license.", - "Copyrights are respective of each contributor listed at the beginning of each definition file.", - "", - "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:", - "", - "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", - "", - "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE." - ] -}, -{ - "name": "tunnel-agent", - "licenseDetail": [ - "Copyright (c) tunnel-agent authors", - "", - "Apache License", - "", - "Version 2.0, January 2004", - "", - "http://www.apache.org/licenses/", - "", - "TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION", - "", - "1. Definitions.", - "", - "\"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.", - "", - "\"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.", - "", - "\"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.", - "", - "\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.", - "", - "\"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.", - "", - "\"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.", - "", - "\"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).", - "", - "\"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.", - "", - "\"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"", - "", - "\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.", - "", - "2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.", - "", - "3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.", - "", - "4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:", - "", - "You must give any other recipients of the Work or Derivative Works a copy of this License; and", - "", - "You must cause any modified files to carry prominent notices stating that You changed the files; and", - "", - "You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and", - "", - "If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.", - "", - "5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.", - "", - "6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.", - "", - "7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.", - "", - "8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.", - "", - "9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.", - "", - "END OF TERMS AND CONDITIONS" - ] -}, -{ - // Waiting for https://github.com/segmentio/noop-logger/issues/2 - "name": "noop-logger", - "licenseDetail": [ - "This project is licensed under the MIT license.", - "Copyrights are respective of each contributor listed at the beginning of each definition file.", - "", - "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:", - "", - "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", - "", - "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE." - ] -} -] \ No newline at end of file + { + // Reason: The license at https://github.com/aadsm/jschardet/blob/master/LICENSE + // does not include a clear Copyright statement and does not credit authors. + "name": "jschardet", + "licenseDetail": [ + "Chardet was originally ported from C++ by Mark Pilgrim. It is now maintained", + " by Dan Blanchard and Ian Cordasco, and was formerly maintained by Erik Rose.", + " JSChardet was ported from python to JavaScript by António Afonso ", + " (https://github.com/aadsm/jschardet) and transformed into an npm package by ", + "Markus Ast (https://github.com/brainafk)", + "", + "GNU LESSER GENERAL PUBLIC LICENSE", + "\t\t Version 2.1, February 1999", + "", + " Copyright (C) 1991,", + "1999 Free Software Foundation, Inc.", + " 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA", + " Everyone is permitted to copy and distribute verbatim copies", + " of this license document, but changing it is not allowed.", + "", + "[This is the first released version of the Lesser GPL. It also counts", + " as the successor of the GNU Library Public License, version 2, hence", + " the version number 2.1.", + "]", + "", + "\t\t\t Preamble", + "", + " The licenses for most software are designed to take away your", + "freedom to share and change it. By contrast, the GNU General Public", + "Licenses are intended to guarantee your freedom to share and change", + "free software--to make sure the software is free for all its users.", + "", + " This license, the Lesser General Public License, applies to some", + "specially designated software packages--typically libraries--of the", + "Free Software Foundation and other authors who decide to use it. You", + "can use it too, but we suggest you first think carefully about whether", + "this license or the ordinary General Public License is the better", + "strategy to use in any particular case, based on the explanations below.", + "", + " When we speak of free software, we are referring to freedom of use,", + "not price. Our General Public Licenses are designed to make sure that", + "you have the freedom to distribute copies of free software (and charge", + "for this service if you wish); that you receive source code or can get", + "it if you want it; that you can change the software and use pieces of", + "it in new free programs; and that you are informed that you can do", + "these things.", + "", + " To protect your rights, we need to make restrictions that forbid", + "distributors to deny you these rights or to ask you to surrender these", + "rights. These restrictions translate to certain responsibilities for", + "you if you distribute copies of the library or if you modify it.", + "", + " For example, if you distribute copies of the library, whether gratis", + "or for a fee, you must give the recipients all the rights that we gave", + "you. You must make sure that they, too, receive or can get the source", + "code. If you link other code with the library, you must provide", + "complete object files to the recipients, so that they can relink them", + "with the library after making changes to the library and recompiling", + "it. And you must show them these terms so they know their rights.", + "", + " We protect your rights with a two-step method: (1) we copyright the", + "library, and (2) we offer you this license, which gives you legal", + "permission to copy, distribute and/or modify the library.", + "", + " To protect each distributor, we want to make it very clear that", + "there is no warranty for the free library. Also, if the library is", + "modified by someone else and passed on, the recipients should know", + "that what they have is not the original version, so that the original", + "author's reputation will not be affected by problems that might be", + "introduced by others.", + "", + " Finally, software patents pose a constant threat to the existence of", + "any free program. We wish to make sure that a company cannot", + "effectively restrict the users of a free program by obtaining a", + "restrictive license from a patent holder. Therefore, we insist that", + "any patent license obtained for a version of the library must be", + "consistent with the full freedom of use specified in this license.", + "", + " Most GNU software, including some libraries, is covered by the", + "ordinary GNU General Public License. This license, the GNU Lesser", + "General Public License, applies to certain designated libraries, and", + "is quite different from the ordinary General Public License. We use", + "this license for certain libraries in order to permit linking those", + "libraries into non-free programs.", + "", + " When a program is linked with a library, whether statically or using", + "a shared library, the combination of the two is legally speaking a", + "combined work, a derivative of the original library. The ordinary", + "General Public License therefore permits such linking only if the", + "entire combination fits its criteria of freedom. The Lesser General", + "Public License permits more lax criteria for linking other code with", + "the library.", + "", + " We call this license the \"Lesser\" General Public License because it", + "does Less to protect the user's freedom than the ordinary General", + "Public License. It also provides other free software developers Less", + "of an advantage over competing non-free programs. These disadvantages", + "are the reason we use the ordinary General Public License for many", + "libraries. However, the Lesser license provides advantages in certain", + "special circumstances.", + "", + " For example, on rare occasions, there may be a special need to", + "encourage the widest possible use of a certain library, so that it becomes", + "a de-facto standard. To achieve this, non-free programs must be", + "allowed to use the library. A more frequent case is that a free", + "library does the same job as widely used non-free libraries. In this", + "case, there is little to gain by limiting the free library to free", + "software only, so we use the Lesser General Public License.", + "", + " In other cases, permission to use a particular library in non-free", + "programs enables a greater number of people to use a large body of", + "free software. For example, permission to use the GNU C Library in", + "non-free programs enables many more people to use the whole GNU", + "operating system, as well as its variant, the GNU/Linux operating", + "system.", + "", + " Although the Lesser General Public License is Less protective of the", + "users' freedom, it does ensure that the user of a program that is", + "linked with the Library has the freedom and the wherewithal to run", + "that program using a modified version of the Library.", + "", + " The precise terms and conditions for copying, distribution and", + "modification follow. Pay close attention to the difference between a", + "\"work based on the library\" and a \"work that uses the library\". The", + "former contains code derived from the library, whereas the latter must", + "be combined with the library in order to run.", + "", + "\t\t GNU LESSER GENERAL PUBLIC LICENSE", + " TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION", + "", + " 0. This License Agreement applies to any software library or other", + "program which contains a notice placed by the copyright holder or", + "other authorized party saying it may be distributed under the terms of", + "this Lesser General Public License (also called \"this License\").", + "Each licensee is addressed as \"you\".", + "", + " A \"library\" means a collection of software functions and/or data", + "prepared so as to be conveniently linked with application programs", + "(which use some of those functions and data) to form executables.", + "", + " The \"Library\", below, refers to any such software library or work", + "which has been distributed under these terms. A \"work based on the", + "Library\" means either the Library or any derivative work under", + "copyright law: that is to say, a work containing the Library or a", + "portion of it, either verbatim or with modifications and/or translated", + "straightforwardly into another language. (Hereinafter, translation is", + "included without limitation in the term \"modification\".)", + "", + " \"Source code\" for a work means the preferred form of the work for", + "making modifications to it. For a library, complete source code means", + "all the source code for all modules it contains, plus any associated", + "interface definition files, plus the scripts used to control compilation", + "and installation of the library.", + "", + " Activities other than copying, distribution and modification are not", + "covered by this License; they are outside its scope. The act of", + "running a program using the Library is not restricted, and output from", + "such a program is covered only if its contents constitute a work based", + "on the Library (independent of the use of the Library in a tool for", + "writing it). Whether that is true depends on what the Library does", + "and what the program that uses the Library does.", + "", + " 1. You may copy and distribute verbatim copies of the Library's", + "complete source code as you receive it, in any medium, provided that", + "you conspicuously and appropriately publish on each copy an", + "appropriate copyright notice and disclaimer of warranty; keep intact", + "all the notices that refer to this License and to the absence of any", + "warranty; and distribute a copy of this License along with the", + "Library.", + "", + " You may charge a fee for the physical act of transferring a copy,", + "and you may at your option offer warranty protection in exchange for a", + "fee.", + "", + " 2. You may modify your copy or copies of the Library or any portion", + "of it, thus forming a work based on the Library, and copy and", + "distribute such modifications or work under the terms of Section 1", + "above, provided that you also meet all of these conditions:", + "", + " a) The modified work must itself be a software library.", + "", + " b) You must cause the files modified to carry prominent notices", + " stating that you changed the files and the date of any change.", + "", + " c) You must cause the whole of the work to be licensed at no", + " charge to all third parties under the terms of this License.", + "", + " d) If a facility in the modified Library refers to a function or a", + " table of data to be supplied by an application program that uses", + " the facility, other than as an argument passed when the facility", + " is invoked, then you must make a good faith effort to ensure that,", + " in the event an application does not supply such function or", + " table, the facility still operates, and performs whatever part of", + " its purpose remains meaningful.", + "", + " (For example, a function in a library to compute square roots has", + " a purpose that is entirely well-defined independent of the", + " application. Therefore, Subsection 2d requires that any", + " application-supplied function or table used by this function must", + " be optional: if the application does not supply it, the square", + " root function must still compute square roots.)", + "", + "These requirements apply to the modified work as a whole. If", + "identifiable sections of that work are not derived from the Library,", + "and can be reasonably considered independent and separate works in", + "themselves, then this License, and its terms, do not apply to those", + "sections when you distribute them as separate works. But when you", + "distribute the same sections as part of a whole which is a work based", + "on the Library, the distribution of the whole must be on the terms of", + "this License, whose permissions for other licensees extend to the", + "entire whole, and thus to each and every part regardless of who wrote", + "it.", + "", + "Thus, it is not the intent of this section to claim rights or contest", + "your rights to work written entirely by you; rather, the intent is to", + "exercise the right to control the distribution of derivative or", + "collective works based on the Library.", + "", + "In addition, mere aggregation of another work not based on the Library", + "with the Library (or with a work based on the Library) on a volume of", + "a storage or distribution medium does not bring the other work under", + "the scope of this License.", + "", + " 3. You may opt to apply the terms of the ordinary GNU General Public", + "License instead of this License to a given copy of the Library. To do", + "this, you must alter all the notices that refer to this License, so", + "that they refer to the ordinary GNU General Public License, version 2,", + "instead of to this License. (If a newer version than version 2 of the", + "ordinary GNU General Public License has appeared, then you can specify", + "that version instead if you wish.) Do not make any other change in", + "these notices.", + "", + " Once this change is made in a given copy, it is irreversible for", + "that copy, so the ordinary GNU General Public License applies to all", + "subsequent copies and derivative works made from that copy.", + "", + " This option is useful when you wish to copy part of the code of", + "the Library into a program that is not a library.", + "", + " 4. You may copy and distribute the Library (or a portion or", + "derivative of it, under Section 2) in object code or executable form", + "under the terms of Sections 1 and 2 above provided that you accompany", + "it with the complete corresponding machine-readable source code, which", + "must be distributed under the terms of Sections 1 and 2 above on a", + "medium customarily used for software interchange.", + "", + " If distribution of object code is made by offering access to copy", + "from a designated place, then offering equivalent access to copy the", + "source code from the same place satisfies the requirement to", + "distribute the source code, even though third parties are not", + "compelled to copy the source along with the object code.", + "", + " 5. A program that contains no derivative of any portion of the", + "Library, but is designed to work with the Library by being compiled or", + "linked with it, is called a \"work that uses the Library\". Such a", + "work, in isolation, is not a derivative work of the Library, and", + "therefore falls outside the scope of this License.", + "", + " However, linking a \"work that uses the Library\" with the Library", + "creates an executable that is a derivative of the Library (because it", + "contains portions of the Library), rather than a \"work that uses the", + "library\". The executable is therefore covered by this License.", + "Section 6 states terms for distribution of such executables.", + "", + " When a \"work that uses the Library\" uses material from a header file", + "that is part of the Library, the object code for the work may be a", + "derivative work of the Library even though the source code is not.", + "Whether this is true is especially significant if the work can be", + "linked without the Library, or if the work is itself a library. The", + "threshold for this to be true is not precisely defined by law.", + "", + " If such an object file uses only numerical parameters, data", + "structure layouts and accessors, and small macros and small inline", + "functions (ten lines or less in length), then the use of the object", + "file is unrestricted, regardless of whether it is legally a derivative", + "work. (Executables containing this object code plus portions of the", + "Library will still fall under Section 6.)", + "", + " Otherwise, if the work is a derivative of the Library, you may", + "distribute the object code for the work under the terms of Section 6.", + "Any executables containing that work also fall under Section 6,", + "whether or not they are linked directly with the Library itself.", + "", + " 6. As an exception to the Sections above, you may also combine or", + "link a \"work that uses the Library\" with the Library to produce a", + "work containing portions of the Library, and distribute that work", + "under terms of your choice, provided that the terms permit", + "modification of the work for the customer's own use and reverse", + "engineering for debugging such modifications.", + "", + " You must give prominent notice with each copy of the work that the", + "Library is used in it and that the Library and its use are covered by", + "this License. You must supply a copy of this License. If the work", + "during execution displays copyright notices, you must include the", + "copyright notice for the Library among them, as well as a reference", + "directing the user to the copy of this License. Also, you must do one", + "of these things:", + "", + " a) Accompany the work with the complete corresponding", + " machine-readable source code for the Library including whatever", + " changes were used in the work (which must be distributed under", + " Sections 1 and 2 above); and, if the work is an executable linked", + " with the Library, with the complete machine-readable \"work that", + " uses the Library\", as object code and/or source code, so that the", + " user can modify the Library and then relink to produce a modified", + " executable containing the modified Library. (It is understood", + " that the user who changes the contents of definitions files in the", + " Library will not necessarily be able to recompile the application", + " to use the modified definitions.)", + "", + " b) Use a suitable shared library mechanism for linking with the", + " Library. A suitable mechanism is one that (1) uses at run time a", + " copy of the library already present on the user's computer system,", + " rather than copying library functions into the executable, and (2)", + " will operate properly with a modified version of the library, if", + " the user installs one, as long as the modified version is", + " interface-compatible with the version that the work was made with.", + "", + " c) Accompany the work with a written offer, valid for at", + " least three years, to give the same user the materials", + " specified in Subsection 6a, above, for a charge no more", + " than the cost of performing this distribution.", + "", + " d) If distribution of the work is made by offering access to copy", + " from a designated place, offer equivalent access to copy the above", + " specified materials from the same place.", + "", + " e) Verify that the user has already received a copy of these", + " materials or that you have already sent this user a copy.", + "", + " For an executable, the required form of the \"work that uses the", + "Library\" must include any data and utility programs needed for", + "reproducing the executable from it. However, as a special exception,", + "the materials to be distributed need not include anything that is", + "normally distributed (in either source or binary form) with the major", + "components (compiler, kernel, and so on) of the operating system on", + "which the executable runs, unless that component itself accompanies", + "the executable.", + "", + " It may happen that this requirement contradicts the license", + "restrictions of other proprietary libraries that do not normally", + "accompany the operating system. Such a contradiction means you cannot", + "use both them and the Library together in an executable that you", + "distribute.", + "", + " 7. You may place library facilities that are a work based on the", + "Library side-by-side in a single library together with other library", + "facilities not covered by this License, and distribute such a combined", + "library, provided that the separate distribution of the work based on", + "the Library and of the other library facilities is otherwise", + "permitted, and provided that you do these two things:", + "", + " a) Accompany the combined library with a copy of the same work", + " based on the Library, uncombined with any other library", + " facilities. This must be distributed under the terms of the", + " Sections above.", + "", + " b) Give prominent notice with the combined library of the fact", + " that part of it is a work based on the Library, and explaining", + " where to find the accompanying uncombined form of the same work.", + "", + " 8. You may not copy, modify, sublicense, link with, or distribute", + "the Library except as expressly provided under this License. Any", + "attempt otherwise to copy, modify, sublicense, link with, or", + "distribute the Library is void, and will automatically terminate your", + "rights under this License. However, parties who have received copies,", + "or rights, from you under this License will not have their licenses", + "terminated so long as such parties remain in full compliance.", + "", + " 9. You are not required to accept this License, since you have not", + "signed it. However, nothing else grants you permission to modify or", + "distribute the Library or its derivative works. These actions are", + "prohibited by law if you do not accept this License. Therefore, by", + "modifying or distributing the Library (or any work based on the", + "Library), you indicate your acceptance of this License to do so, and", + "all its terms and conditions for copying, distributing or modifying", + "the Library or works based on it.", + "", + " 10. Each time you redistribute the Library (or any work based on the", + "Library), the recipient automatically receives a license from the", + "original licensor to copy, distribute, link with or modify the Library", + "subject to these terms and conditions. You may not impose any further", + "restrictions on the recipients' exercise of the rights granted herein.", + "You are not responsible for enforcing compliance by third parties with", + "this License.", + "", + " 11. If, as a consequence of a court judgment or allegation of patent", + "infringement or for any other reason (not limited to patent issues),", + "conditions are imposed on you (whether by court order, agreement or", + "otherwise) that contradict the conditions of this License, they do not", + "excuse you from the conditions of this License. If you cannot", + "distribute so as to satisfy simultaneously your obligations under this", + "License and any other pertinent obligations, then as a consequence you", + "may not distribute the Library at all. For example, if a patent", + "license would not permit royalty-free redistribution of the Library by", + "all those who receive copies directly or indirectly through you, then", + "the only way you could satisfy both it and this License would be to", + "refrain entirely from distribution of the Library.", + "", + "If any portion of this section is held invalid or unenforceable under any", + "particular circumstance, the balance of the section is intended to apply,", + "and the section as a whole is intended to apply in other circumstances.", + "", + "It is not the purpose of this section to induce you to infringe any", + "patents or other property right claims or to contest validity of any", + "such claims; this section has the sole purpose of protecting the", + "integrity of the free software distribution system which is", + "implemented by public license practices. Many people have made", + "generous contributions to the wide range of software distributed", + "through that system in reliance on consistent application of that", + "system; it is up to the author/donor to decide if he or she is willing", + "to distribute software through any other system and a licensee cannot", + "impose that choice.", + "", + "This section is intended to make thoroughly clear what is believed to", + "be a consequence of the rest of this License.", + "", + " 12. If the distribution and/or use of the Library is restricted in", + "certain countries either by patents or by copyrighted interfaces, the", + "original copyright holder who places the Library under this License may add", + "an explicit geographical distribution limitation excluding those countries,", + "so that distribution is permitted only in or among countries not thus", + "excluded. In such case, this License incorporates the limitation as if", + "written in the body of this License.", + "", + " 13. The Free Software Foundation may publish revised and/or new", + "versions of the Lesser General Public License from time to time.", + "Such new versions will be similar in spirit to the present version,", + "but may differ in detail to address new problems or concerns.", + "", + "Each version is given a distinguishing version number. If the Library", + "specifies a version number of this License which applies to it and", + "\"any later version\", you have the option of following the terms and", + "conditions either of that version or of any later version published by", + "the Free Software Foundation. If the Library does not specify a", + "license version number, you may choose any version ever published by", + "the Free Software Foundation.", + "", + " 14. If you wish to incorporate parts of the Library into other free", + "programs whose distribution conditions are incompatible with these,", + "write to the author to ask for permission. For software which is", + "copyrighted by the Free Software Foundation, write to the Free", + "Software Foundation; we sometimes make exceptions for this. Our", + "decision will be guided by the two goals of preserving the free status", + "of all derivatives of our free software and of promoting the sharing", + "and reuse of software generally.", + "", + "\t\t\t NO WARRANTY", + "", + " 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO", + "WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.", + "EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR", + "OTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY", + "KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE", + "IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR", + "PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE", + "LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME", + "THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.", + "", + " 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN", + "WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY", + "AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU", + "FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR", + "CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE", + "LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING", + "RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A", + "FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF", + "SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH", + "DAMAGES.", + "", + "\t\t END OF TERMS AND CONDITIONS", + "", + " How to Apply These Terms to Your New Libraries", + "", + " If you develop a new library, and you want it to be of the greatest", + "possible use to the public, we recommend making it free software that", + "everyone can redistribute and change. You can do so by permitting", + "redistribution under these terms (or, alternatively, under the terms of the", + "ordinary General Public License).", + "", + " To apply these terms, attach the following notices to the library. It is", + "safest to attach them to the start of each source file to most effectively", + "convey the exclusion of warranty; and each file should have at least the", + "\"copyright\" line and a pointer to where the full notice is found.", + "", + " ", + " Copyright (C) ", + "", + " This library is free software; you can redistribute it and/or", + " modify it under the terms of the GNU Lesser General Public", + " License as published by the Free Software Foundation; either", + " version 2.1 of the License, or (at your option) any later version.", + "", + " This library is distributed in the hope that it will be useful,", + " but WITHOUT ANY WARRANTY; without even the implied warranty of", + " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU", + " Lesser General Public License for more details.", + "", + " You should have received a copy of the GNU Lesser General Public", + " License along with this library; if not, write to the Free Software", + " Foundation, Inc.,", + "51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA", + "", + "Also add information on how to contact you by electronic and paper mail.", + "", + "You should also get your employer (if you work as a programmer) or your", + "school, if any, to sign a \"copyright disclaimer\" for the library, if", + "necessary. Here is a sample; alter the names:", + "", + " Yoyodyne, Inc., hereby disclaims all copyright interest in the", + " library `Frob' (a library for tweaking knobs) written by James Random Hacker.", + "", + " ,", + "1 April 1990", + " Ty Coon, President of Vice", + "", + "That's all there is to it!" + ] + }, + { + // Added here because the module `parse5` has a dependency to it. + // The module `parse5` is shipped via the `extension-editing` built-in extension. + // The module `parse5` does not want to remove it https://github.com/inikulin/parse5/issues/225 + "name": "@types/node", + "licenseDetail": [ + "This project is licensed under the MIT license.", + "Copyrights are respective of each contributor listed at the beginning of each definition file.", + "", + "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:", + "", + "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE." + ] + }, + { + // We override the license that gets discovered at + // https://github.com/Microsoft/TypeScript/blob/master/LICENSE.txt + // because it does not contain a Copyright statement + "name": "typescript", + "licenseDetail": [ + "Copyright (c) Microsoft Corporation. All rights reserved.", + "", + "Apache License", + "", + "Version 2.0, January 2004", + "", + "http://www.apache.org/licenses/", + "", + "TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION", + "", + "1. Definitions.", + "", + "\"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.", + "", + "\"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.", + "", + "\"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.", + "", + "\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.", + "", + "\"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.", + "", + "\"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.", + "", + "\"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).", + "", + "\"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.", + "", + "\"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"", + "", + "\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.", + "", + "2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.", + "", + "3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.", + "", + "4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:", + "", + "You must give any other recipients of the Work or Derivative Works a copy of this License; and", + "", + "You must cause any modified files to carry prominent notices stating that You changed the files; and", + "", + "You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and", + "", + "If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.", + "", + "5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.", + "", + "6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.", + "", + "7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.", + "", + "8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.", + "", + "9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.", + "", + "END OF TERMS AND CONDITIONS" + ] + }, + { + // This module comes in from https://github.com/Microsoft/vscode-node-debug2/blob/master/package-lock.json + "name": "@types/source-map", + "licenseDetail": [ + "This project is licensed under the MIT license.", + "Copyrights are respective of each contributor listed at the beginning of each definition file.", + "", + "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:", + "", + "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE." + ] + }, + { + "name": "tunnel-agent", + "licenseDetail": [ + "Copyright (c) tunnel-agent authors", + "", + "Apache License", + "", + "Version 2.0, January 2004", + "", + "http://www.apache.org/licenses/", + "", + "TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION", + "", + "1. Definitions.", + "", + "\"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.", + "", + "\"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.", + "", + "\"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.", + "", + "\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.", + "", + "\"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.", + "", + "\"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.", + "", + "\"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).", + "", + "\"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.", + "", + "\"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"", + "", + "\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.", + "", + "2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.", + "", + "3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.", + "", + "4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:", + "", + "You must give any other recipients of the Work or Derivative Works a copy of this License; and", + "", + "You must cause any modified files to carry prominent notices stating that You changed the files; and", + "", + "You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and", + "", + "If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.", + "", + "5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.", + "", + "6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.", + "", + "7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.", + "", + "8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.", + "", + "9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.", + "", + "END OF TERMS AND CONDITIONS" + ] + }, + { + // Waiting for https://github.com/segmentio/noop-logger/issues/2 + "name": "noop-logger", + "licenseDetail": [ + "This project is licensed under the MIT license.", + "Copyrights are respective of each contributor listed at the beginning of each definition file.", + "", + "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:", + "", + "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE." + ] + }, + { + "name": "xterm-addon-search", + "licenseDetail": [ + "Copyright (c) 2017, The xterm.js authors (https://github.com/xtermjs/xterm.js)", + "", + "Permission is hereby granted, free of charge, to any person obtaining a copy", + "of this software and associated documentation files (the \"Software\"), to deal", + "in the Software without restriction, including without limitation the rights", + "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell", + "copies of the Software, and to permit persons to whom the Software is", + "furnished to do so, subject to the following conditions:", + "", + "The above copyright notice and this permission notice shall be included in", + "all copies or substantial portions of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR", + "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,", + "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE", + "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER", + "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,", + "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN", + "THE SOFTWARE." + ] + }, + { + "name": "xterm-addon-web-links", + "licenseDetail": [ + "Copyright (c) 2017, The xterm.js authors (https://github.com/xtermjs/xterm.js)", + "", + "Permission is hereby granted, free of charge, to any person obtaining a copy", + "of this software and associated documentation files (the \"Software\"), to deal", + "in the Software without restriction, including without limitation the rights", + "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell", + "copies of the Software, and to permit persons to whom the Software is", + "furnished to do so, subject to the following conditions:", + "", + "The above copyright notice and this permission notice shall be included in", + "all copies or substantial portions of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR", + "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,", + "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE", + "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER", + "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,", + "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN", + "THE SOFTWARE." + ] + } +] From 3e52e92085c52cc508e33d505200a6074f63b846 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 24 Jun 2019 14:44:42 +0200 Subject: [PATCH 0563/1449] oss 1.36.0 --- ThirdPartyNotices.txt | 199 +++++++++++++----------------------------- 1 file changed, 62 insertions(+), 137 deletions(-) diff --git a/ThirdPartyNotices.txt b/ThirdPartyNotices.txt index df0fad7f826..1d854430864 100644 --- a/ThirdPartyNotices.txt +++ b/ThirdPartyNotices.txt @@ -5,108 +5,70 @@ Do Not Translate or Localize This project incorporates components from the projects listed below. The original copyright notices and the licenses under which Microsoft received such components are set forth below. Microsoft reserves all rights not expressly granted herein, whether by implication, estoppel or otherwise. -1. atom/language-c version 0.58.1 (https://github.com/atom/language-c) -2. atom/language-clojure version 0.22.7 (https://github.com/atom/language-clojure) -3. atom/language-coffee-script version 0.49.3 (https://github.com/atom/language-coffee-script) -4. atom/language-java version 0.31.2 (https://github.com/atom/language-java) -5. atom/language-objective-c version 0.15.0 (https://github.com/atom/language-objective-c) -6. atom/language-sass version 0.61.4 (https://github.com/atom/language-sass) -7. atom/language-shellscript version 0.26.0 (https://github.com/atom/language-shellscript) -8. atom/language-xml version 0.35.2 (https://github.com/atom/language-xml) -9. Colorsublime-Themes version 0.1.0 (https://github.com/Colorsublime/Colorsublime-Themes) -10. daaain/Handlebars version 1.8.0 (https://github.com/daaain/Handlebars) -11. davidrios/pug-tmbundle (https://github.com/davidrios/pug-tmbundle) -12. definitelytyped (https://github.com/DefinitelyTyped/DefinitelyTyped) -13. demyte/language-cshtml version 0.3.0 (https://github.com/demyte/language-cshtml) -14. Document Object Model version 4.0.0 (https://www.w3.org/DOM/) -15. dotnet/csharp-tmLanguage version 0.1.0 (https://github.com/dotnet/csharp-tmLanguage) -16. expand-abbreviation version 0.5.8 (https://github.com/emmetio/expand-abbreviation) -17. fadeevab/make.tmbundle (https://github.com/fadeevab/make.tmbundle) -18. freebroccolo/atom-language-swift (https://github.com/freebroccolo/atom-language-swift) -19. HTML 5.1 W3C Working Draft version 08 October 2015 (http://www.w3.org/TR/2015/WD-html51-20151008/) -20. Ikuyadeu/vscode-R version 0.5.5 (https://github.com/Ikuyadeu/vscode-R) -21. Ionic documentation version 1.2.4 (https://github.com/ionic-team/ionic-site) -22. ionide/ionide-fsgrammar (https://github.com/ionide/ionide-fsgrammar) -23. jeff-hykin/cpp-textmate-grammar version 1.8.15 (https://github.com/jeff-hykin/cpp-textmate-grammar) -24. js-beautify version 1.6.8 (https://github.com/beautify-web/js-beautify) -25. Jxck/assert version 1.0.0 (https://github.com/Jxck/assert) -26. language-docker (https://github.com/moby/moby) -27. language-go version 0.44.3 (https://github.com/atom/language-go) -28. language-less version 0.34.2 (https://github.com/atom/language-less) -29. language-php version 0.44.1 (https://github.com/atom/language-php) -30. language-rust version 0.4.12 (https://github.com/zargony/atom-language-rust) -31. MagicStack/MagicPython version 1.1.1 (https://github.com/MagicStack/MagicPython) -32. marked version 0.6.2 (https://github.com/markedjs/marked) -33. mdn-data version 1.1.12 (https://github.com/mdn/data) -34. Microsoft/TypeScript-TmLanguage version 0.0.1 (https://github.com/Microsoft/TypeScript-TmLanguage) -35. Microsoft/vscode-JSON.tmLanguage (https://github.com/Microsoft/vscode-JSON.tmLanguage) -36. Microsoft/vscode-mssql version 1.4.0 (https://github.com/Microsoft/vscode-mssql) -37. mmims/language-batchfile version 0.7.5 (https://github.com/mmims/language-batchfile) -38. octicons version 8.3.0 (https://github.com/primer/octicons) -39. octref/language-css version 0.42.11 (https://github.com/octref/language-css) -40. PowerShell/EditorSyntax (https://github.com/powershell/editorsyntax) -41. promise-polyfill version 8.0.0 (https://github.com/taylorhakes/promise-polyfill) -42. seti-ui version 0.1.0 (https://github.com/jesseweed/seti-ui) -43. shaders-tmLanguage version 0.1.0 (https://github.com/tgjones/shaders-tmLanguage) -44. textmate/asp.vb.net.tmbundle (https://github.com/textmate/asp.vb.net.tmbundle) -45. textmate/c.tmbundle (https://github.com/textmate/c.tmbundle) -46. textmate/diff.tmbundle (https://github.com/textmate/diff.tmbundle) -47. textmate/git.tmbundle (https://github.com/textmate/git.tmbundle) -48. textmate/groovy.tmbundle (https://github.com/textmate/groovy.tmbundle) -49. textmate/html.tmbundle (https://github.com/textmate/html.tmbundle) -50. textmate/ini.tmbundle (https://github.com/textmate/ini.tmbundle) -51. textmate/javascript.tmbundle (https://github.com/textmate/javascript.tmbundle) -52. textmate/lua.tmbundle (https://github.com/textmate/lua.tmbundle) -53. textmate/markdown.tmbundle (https://github.com/textmate/markdown.tmbundle) -54. textmate/perl.tmbundle (https://github.com/textmate/perl.tmbundle) -55. textmate/ruby.tmbundle (https://github.com/textmate/ruby.tmbundle) -56. textmate/yaml.tmbundle (https://github.com/textmate/yaml.tmbundle) -57. TypeScript-TmLanguage version 0.1.8 (https://github.com/Microsoft/TypeScript-TmLanguage) -58. TypeScript-TmLanguage version 1.0.0 (https://github.com/Microsoft/TypeScript-TmLanguage) -59. Unicode version 12.0.0 (http://www.unicode.org/) -60. vscode-logfile-highlighter version 2.4.1 (https://github.com/emilast/vscode-logfile-highlighter) -61. vscode-octicons-font version 1.3.0 (https://github.com/Microsoft/vscode-octicons-font) -62. vscode-swift version 0.0.1 (https://github.com/owensd/vscode-swift) -63. Web Background Synchronization (https://github.com/WICG/BackgroundSync) +1. atom/language-clojure version 0.22.7 (https://github.com/atom/language-clojure) +2. atom/language-coffee-script version 0.49.3 (https://github.com/atom/language-coffee-script) +3. atom/language-java version 0.31.2 (https://github.com/atom/language-java) +4. atom/language-sass version 0.61.4 (https://github.com/atom/language-sass) +5. atom/language-shellscript version 0.26.0 (https://github.com/atom/language-shellscript) +6. atom/language-xml version 0.35.2 (https://github.com/atom/language-xml) +7. Colorsublime-Themes version 0.1.0 (https://github.com/Colorsublime/Colorsublime-Themes) +8. daaain/Handlebars version 1.8.0 (https://github.com/daaain/Handlebars) +9. davidrios/pug-tmbundle (https://github.com/davidrios/pug-tmbundle) +10. definitelytyped (https://github.com/DefinitelyTyped/DefinitelyTyped) +11. demyte/language-cshtml version 0.3.0 (https://github.com/demyte/language-cshtml) +12. Document Object Model version 4.0.0 (https://www.w3.org/DOM/) +13. dotnet/csharp-tmLanguage version 0.1.0 (https://github.com/dotnet/csharp-tmLanguage) +14. expand-abbreviation version 0.5.8 (https://github.com/emmetio/expand-abbreviation) +15. fadeevab/make.tmbundle (https://github.com/fadeevab/make.tmbundle) +16. freebroccolo/atom-language-swift (https://github.com/freebroccolo/atom-language-swift) +17. HTML 5.1 W3C Working Draft version 08 October 2015 (http://www.w3.org/TR/2015/WD-html51-20151008/) +18. Ikuyadeu/vscode-R version 0.5.5 (https://github.com/Ikuyadeu/vscode-R) +19. Ionic documentation version 1.2.4 (https://github.com/ionic-team/ionic-site) +20. ionide/ionide-fsgrammar (https://github.com/ionide/ionide-fsgrammar) +21. jeff-hykin/cpp-textmate-grammar version 1.11.0 (https://github.com/jeff-hykin/cpp-textmate-grammar) +22. jeff-hykin/cpp-textmate-grammar version 1.11.7 (https://github.com/jeff-hykin/cpp-textmate-grammar) +23. js-beautify version 1.6.8 (https://github.com/beautify-web/js-beautify) +24. Jxck/assert version 1.0.0 (https://github.com/Jxck/assert) +25. language-docker (https://github.com/moby/moby) +26. language-go version 0.44.3 (https://github.com/atom/language-go) +27. language-less version 0.34.2 (https://github.com/atom/language-less) +28. language-php version 0.44.1 (https://github.com/atom/language-php) +29. language-rust version 0.4.12 (https://github.com/zargony/atom-language-rust) +30. MagicStack/MagicPython version 1.1.1 (https://github.com/MagicStack/MagicPython) +31. marked version 0.6.2 (https://github.com/markedjs/marked) +32. mdn-data version 1.1.12 (https://github.com/mdn/data) +33. Microsoft/TypeScript-TmLanguage version 0.0.1 (https://github.com/Microsoft/TypeScript-TmLanguage) +34. Microsoft/vscode-JSON.tmLanguage (https://github.com/Microsoft/vscode-JSON.tmLanguage) +35. Microsoft/vscode-mssql version 1.4.0 (https://github.com/Microsoft/vscode-mssql) +36. mmims/language-batchfile version 0.7.5 (https://github.com/mmims/language-batchfile) +37. octicons version 8.3.0 (https://github.com/primer/octicons) +38. octref/language-css version 0.42.11 (https://github.com/octref/language-css) +39. PowerShell/EditorSyntax (https://github.com/powershell/editorsyntax) +40. promise-polyfill version 8.0.0 (https://github.com/taylorhakes/promise-polyfill) +41. seti-ui version 0.1.0 (https://github.com/jesseweed/seti-ui) +42. shaders-tmLanguage version 0.1.0 (https://github.com/tgjones/shaders-tmLanguage) +43. textmate/asp.vb.net.tmbundle (https://github.com/textmate/asp.vb.net.tmbundle) +44. textmate/c.tmbundle (https://github.com/textmate/c.tmbundle) +45. textmate/diff.tmbundle (https://github.com/textmate/diff.tmbundle) +46. textmate/git.tmbundle (https://github.com/textmate/git.tmbundle) +47. textmate/groovy.tmbundle (https://github.com/textmate/groovy.tmbundle) +48. textmate/html.tmbundle (https://github.com/textmate/html.tmbundle) +49. textmate/ini.tmbundle (https://github.com/textmate/ini.tmbundle) +50. textmate/javascript.tmbundle (https://github.com/textmate/javascript.tmbundle) +51. textmate/lua.tmbundle (https://github.com/textmate/lua.tmbundle) +52. textmate/markdown.tmbundle (https://github.com/textmate/markdown.tmbundle) +53. textmate/perl.tmbundle (https://github.com/textmate/perl.tmbundle) +54. textmate/ruby.tmbundle (https://github.com/textmate/ruby.tmbundle) +55. textmate/yaml.tmbundle (https://github.com/textmate/yaml.tmbundle) +56. TypeScript-TmLanguage version 0.1.8 (https://github.com/Microsoft/TypeScript-TmLanguage) +57. TypeScript-TmLanguage version 1.0.0 (https://github.com/Microsoft/TypeScript-TmLanguage) +58. Unicode version 12.0.0 (http://www.unicode.org/) +59. vscode-logfile-highlighter version 2.4.1 (https://github.com/emilast/vscode-logfile-highlighter) +60. vscode-octicons-font version 1.3.1 (https://github.com/Microsoft/vscode-octicons-font) +61. vscode-swift version 0.0.1 (https://github.com/owensd/vscode-swift) +62. Web Background Synchronization (https://github.com/WICG/BackgroundSync) -%% atom/language-c NOTICES AND INFORMATION BEGIN HERE -========================================= -The MIT License (MIT) - -Copyright (c) 2014 GitHub Inc. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -This package was derived from a TextMate bundle located at -https://github.com/textmate/c.tmbundle and distributed under the following -license, located in `README.mdown`: - -Permission to copy, use, modify, sell and distribute this -software is granted. This software is provided "as is" without -express or implied warranty, and with no claim as to its -suitability for any purpose. -========================================= -END OF atom/language-c NOTICES AND INFORMATION - %% atom/language-clojure NOTICES AND INFORMATION BEGIN HERE ========================================= Copyright (c) 2014 GitHub Inc. @@ -251,43 +213,6 @@ suitability for any purpose. ========================================= END OF atom/language-java NOTICES AND INFORMATION -%% atom/language-objective-c NOTICES AND INFORMATION BEGIN HERE -========================================= -The MIT License (MIT) - -Copyright (c) 2014 GitHub Inc. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -This package was derived from a TextMate bundle located at -https://github.com/textmate/objective-c.tmbundle and distributed under the following -license, located in `README.mdown`: - -Permission to copy, use, modify, sell and distribute this -software is granted. This software is provided "as is" without -express or implied warranty, and with no claim as to its -suitability for any purpose. -========================================= -END OF atom/language-objective-c NOTICES AND INFORMATION - %% atom/language-sass NOTICES AND INFORMATION BEGIN HERE ========================================= The MIT License (MIT) From 8e791727268ab0cda8f4ac689b0be4b4954a806f Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 24 Jun 2019 14:48:43 +0200 Subject: [PATCH 0564/1449] workaround for #75830 --- src/vs/code/electron-main/window.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index ec398df67ed..9c6813de1be 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -156,7 +156,8 @@ export class CodeWindow extends Disposable implements ICodeWindow { } } - if (isMacintosh && windowConfig && windowConfig.nativeTabs === true) { + const useNativeTabs = isMacintosh && windowConfig && windowConfig.nativeTabs === true; + if (useNativeTabs) { options.tabbingIdentifier = product.nameShort; // this opts in to sierra tabs } @@ -180,7 +181,10 @@ export class CodeWindow extends Disposable implements ICodeWindow { // TODO@Ben (Electron 4 regression): when running on multiple displays where the target display // to open the window has a larger resolution than the primary display, the window will not size // correctly unless we set the bounds again (https://github.com/microsoft/vscode/issues/74872) - if (isMacintosh && hasMultipleDisplays) { + // However, when running with native tabs we cannot use this workaround because there is a potential + // that the new window will be added as native tab instead of being a window on its own. In that + // case calling setBounds() would cause https://github.com/microsoft/vscode/issues/75830 + if (isMacintosh && hasMultipleDisplays && !useNativeTabs) { if ([this.windowState.width, this.windowState.height, this.windowState.x, this.windowState.y].every(value => typeof value === 'number')) { this._win.setBounds({ width: this.windowState.width!, From 2375b1f21de5c7af9f95ea44646e265fb203f09f Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 24 Jun 2019 14:51:19 +0200 Subject: [PATCH 0565/1449] update distro commit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c8047f1c9e6..0f4051616ea 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "e2de7806e752fbcf8be2bf6d3b0476cc49937ff0", + "distro": "05595573cc7515041a708d6ba0596dfeef29c250", "author": { "name": "Microsoft Corporation" }, From 6178c670e055b033f6384af33c8ce6ca2e01fb1f Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 24 Jun 2019 14:55:43 +0200 Subject: [PATCH 0566/1449] electron - still call setBounds() as workaround for first window --- src/vs/code/electron-main/window.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index 9c6813de1be..83e0aad634e 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -181,10 +181,11 @@ export class CodeWindow extends Disposable implements ICodeWindow { // TODO@Ben (Electron 4 regression): when running on multiple displays where the target display // to open the window has a larger resolution than the primary display, the window will not size // correctly unless we set the bounds again (https://github.com/microsoft/vscode/issues/74872) - // However, when running with native tabs we cannot use this workaround because there is a potential - // that the new window will be added as native tab instead of being a window on its own. In that - // case calling setBounds() would cause https://github.com/microsoft/vscode/issues/75830 - if (isMacintosh && hasMultipleDisplays && !useNativeTabs) { + // + // However, when running with native tabs with multiple windows we cannot use this workaround + // because there is a potential that the new window will be added as native tab instead of being + // a window on its own. In that case calling setBounds() would cause https://github.com/microsoft/vscode/issues/75830 + if (isMacintosh && hasMultipleDisplays && (!useNativeTabs || BrowserWindow.getAllWindows().length === 1)) { if ([this.windowState.width, this.windowState.height, this.windowState.x, this.windowState.y].every(value => typeof value === 'number')) { this._win.setBounds({ width: this.windowState.width!, From 7b1a326985e9f58cafbfaa84b6d20a5be67c4100 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 24 Jun 2019 15:04:32 +0200 Subject: [PATCH 0567/1449] fixes #75753 --- extensions/git/src/repository.ts | 64 ++++++++++++++++++++++++++------ extensions/git/src/util.ts | 22 +++++++++-- 2 files changed, 72 insertions(+), 14 deletions(-) diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index 5cbe55e8a21..6018648f468 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -5,7 +5,7 @@ import { commands, Uri, Command, EventEmitter, Event, scm, SourceControl, SourceControlInputBox, SourceControlResourceGroup, SourceControlResourceState, SourceControlResourceDecorations, SourceControlInputBoxValidation, Disposable, ProgressLocation, window, workspace, WorkspaceEdit, ThemeColor, DecorationData, Memento, SourceControlInputBoxValidationType, OutputChannel, LogLevel, env } from 'vscode'; import { Repository as BaseRepository, Commit, Stash, GitError, Submodule, CommitOptions, ForcePushMode } from './git'; -import { anyEvent, filterEvent, eventToPromise, dispose, find, isDescendant, IDisposable, onceEvent, EmptyDisposable, debounceEvent, toDisposable, combinedDisposable } from './util'; +import { anyEvent, filterEvent, eventToPromise, dispose, find, isDescendant, IDisposable, onceEvent, EmptyDisposable, debounceEvent, combinedDisposable, watch, IFileWatcher } from './util'; import { memoize, throttle, debounce } from './decorators'; import { toGitUri } from './uri'; import { AutoFetcher } from './autofetch'; @@ -480,6 +480,49 @@ class FileEventLogger { } } +class DotGitWatcher implements IFileWatcher { + + readonly event: Event; + + private emitter = new EventEmitter(); + private transientDisposables: IDisposable[] = []; + private disposables: IDisposable[] = []; + + constructor(private repository: Repository) { + const rootWatcher = watch(repository.dotGit); + this.disposables.push(rootWatcher); + + const filteredRootWatcher = filterEvent(rootWatcher.event, uri => !/\/\.git(\/index\.lock)?$/.test(uri.path)); + this.event = anyEvent(filteredRootWatcher, this.emitter.event); + + repository.onDidRunGitStatus(this.updateTransientWatchers, this, this.disposables); + this.updateTransientWatchers(); + } + + private updateTransientWatchers() { + this.transientDisposables = dispose(this.transientDisposables); + + if (!this.repository.HEAD || !this.repository.HEAD.upstream) { + return; + } + + this.transientDisposables = dispose(this.transientDisposables); + + const { name, remote } = this.repository.HEAD.upstream; + const upstreamPath = path.join(this.repository.dotGit, 'refs', 'remotes', remote, name); + + const upstreamWatcher = watch(upstreamPath); + this.transientDisposables.push(upstreamWatcher); + upstreamWatcher.event(this.emitter.fire, this.emitter, this.transientDisposables); + } + + dispose() { + this.emitter.dispose(); + this.transientDisposables = dispose(this.transientDisposables); + this.disposables = dispose(this.disposables); + } +} + export class Repository implements Disposable { private _onDidChangeRepository = new EventEmitter(); @@ -577,11 +620,14 @@ export class Repository implements Disposable { return this.repository.root; } + get dotGit(): string { + return this.repository.dotGit; + } + private isRepositoryHuge = false; private didWarnAboutLimit = false; private isFreshRepository: boolean | undefined = undefined; - private disposables: Disposable[] = []; constructor( @@ -596,23 +642,19 @@ export class Repository implements Disposable { const onWorkspaceRepositoryFileChange = filterEvent(onWorkspaceFileChange, uri => isDescendant(repository.root, uri.fsPath)); const onWorkspaceWorkingTreeFileChange = filterEvent(onWorkspaceRepositoryFileChange, uri => !/\/\.git($|\/)/.test(uri.path)); - const dotGitWatcher = fs.watch(repository.dotGit); - const onDotGitFileChangeEmitter = new EventEmitter(); - dotGitWatcher.on('change', (_, e) => onDotGitFileChangeEmitter.fire(Uri.file(path.join(repository.dotGit, e as string)))); - dotGitWatcher.on('error', err => console.error(err)); - this.disposables.push(toDisposable(() => dotGitWatcher.close())); - const onDotGitFileChange = filterEvent(onDotGitFileChangeEmitter.event, uri => !/\/\.git(\/index\.lock)?$/.test(uri.path)); + const dotGitFileWatcher = new DotGitWatcher(this); + this.disposables.push(dotGitFileWatcher); // FS changes should trigger `git status`: // - any change inside the repository working tree // - any change whithin the first level of the `.git` folder, except the folder itself and `index.lock` - const onFileChange = anyEvent(onWorkspaceWorkingTreeFileChange, onDotGitFileChange); + const onFileChange = anyEvent(onWorkspaceWorkingTreeFileChange, dotGitFileWatcher.event); onFileChange(this.onFileChange, this, this.disposables); // Relevate repository changes should trigger virtual document change events - onDotGitFileChange(this._onDidChangeRepository.fire, this._onDidChangeRepository, this.disposables); + dotGitFileWatcher.event(this._onDidChangeRepository.fire, this._onDidChangeRepository, this.disposables); - this.disposables.push(new FileEventLogger(onWorkspaceWorkingTreeFileChange, onDotGitFileChange, outputChannel)); + this.disposables.push(new FileEventLogger(onWorkspaceWorkingTreeFileChange, dotGitFileWatcher.event, outputChannel)); const root = Uri.file(repository.root); this._sourceControl = scm.createSourceControl('git', 'Git', root); diff --git a/extensions/git/src/util.ts b/extensions/git/src/util.ts index 7bf81adccd9..c4e93850619 100644 --- a/extensions/git/src/util.ts +++ b/extensions/git/src/util.ts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Event } from 'vscode'; -import { dirname, sep } from 'path'; +import { Event, EventEmitter, Uri } from 'vscode'; +import { dirname, sep, join } from 'path'; import { Readable } from 'stream'; import * as fs from 'fs'; import * as byline from 'byline'; @@ -343,4 +343,20 @@ export function pathEquals(a: string, b: string): boolean { } return a === b; -} \ No newline at end of file +} + +export interface IFileWatcher extends IDisposable { + readonly event: Event; +} + +export function watch(location: string): IFileWatcher { + const dotGitWatcher = fs.watch(location); + const onDotGitFileChangeEmitter = new EventEmitter(); + dotGitWatcher.on('change', (_, e) => onDotGitFileChangeEmitter.fire(Uri.file(join(location, e as string)))); + dotGitWatcher.on('error', err => console.error(err)); + + return new class implements IFileWatcher { + event = onDotGitFileChangeEmitter.event; + dispose() { dotGitWatcher.close(); } + }; +} From 7ce9a74bbdd7b254a7355fc983e190e4ec4352ee Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 24 Jun 2019 15:22:25 +0200 Subject: [PATCH 0568/1449] remove user data service --- .../configuration/common/configuration.ts | 1 - .../environment/common/environment.ts | 2 + .../environment/node/environmentService.ts | 6 + .../electron-browser/telemetryService.test.ts | 2 - src/vs/workbench/browser/web.main.ts | 37 +- .../browser/preferences.contribution.ts | 8 +- .../common/preferencesContribution.ts | 4 +- src/vs/workbench/electron-browser/main.ts | 16 +- .../configuration/browser/configuration.ts | 19 +- .../browser/configurationService.ts | 8 +- .../configuration/common/configuration.ts | 1 - .../common/configurationEditingService.ts | 621 ++++++++---------- .../configuration/node/configurationCache.ts | 3 +- .../configurationEditingService.test.ts | 16 +- .../configurationService.test.ts | 45 +- .../environment/browser/environmentService.ts | 15 +- .../environment/node/environmentService.ts | 10 + .../keybinding/browser/keybindingService.ts | 86 ++- .../keybinding/common/keybindingEditing.ts | 113 ++-- .../keybindingEditing.test.ts | 28 +- .../preferences/browser/preferencesService.ts | 12 +- .../textfile/common/textFileEditorModel.ts | 10 +- .../userData/common/customUserDataService.ts | 45 -- ...DataService.ts => fileUserDataProvider.ts} | 48 +- .../common/inMemoryUserDataProvider.ts | 33 +- .../services/userData/common/userData.ts | 54 +- .../common/userDataFileSystemProvider.ts | 84 ++- 27 files changed, 651 insertions(+), 676 deletions(-) delete mode 100644 src/vs/workbench/services/userData/common/customUserDataService.ts rename src/vs/workbench/services/userData/common/{fileUserDataService.ts => fileUserDataProvider.ts} (54%) diff --git a/src/vs/platform/configuration/common/configuration.ts b/src/vs/platform/configuration/common/configuration.ts index d98ce059c77..e9758098d43 100644 --- a/src/vs/platform/configuration/common/configuration.ts +++ b/src/vs/platform/configuration/common/configuration.ts @@ -65,7 +65,6 @@ export interface IConfigurationChangeEvent { export interface IConfigurationService { _serviceBrand: any; - userSettingsResource: URI; onDidChangeConfiguration: Event; getConfigurationData(): IConfigurationData | null; diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index 196b47933c1..210ac5080a3 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -97,6 +97,8 @@ export interface IEnvironmentService { appNameLong: string; appQuality?: string; appSettingsHome: URI; + settingsResource: URI; + keybindingsResource: URI; keyboardLayoutResource: URI; machineSettingsHome: URI; diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts index aa956e5f306..12881effa53 100644 --- a/src/vs/platform/environment/node/environmentService.ts +++ b/src/vs/platform/environment/node/environmentService.ts @@ -114,6 +114,9 @@ export class EnvironmentService implements IEnvironmentService { @memoize get appSettingsHome(): URI { return URI.file(path.join(this.userDataPath, 'User')); } + @memoize + get settingsResource(): URI { return resources.joinPath(this.appSettingsHome, 'settings.json'); } + @memoize get machineSettingsHome(): URI { return URI.file(path.join(this.userDataPath, 'Machine')); } @@ -132,6 +135,9 @@ export class EnvironmentService implements IEnvironmentService { @memoize get settingsSearchUrl(): string | undefined { return product.settingsSearchUrl; } + @memoize + get keybindingsResource(): URI { return resources.joinPath(this.appSettingsHome, 'keybindings.json'); } + @memoize get keyboardLayoutResource(): URI { return resources.joinPath(this.appSettingsHome, 'keyboardLayout.json'); } diff --git a/src/vs/platform/telemetry/test/electron-browser/telemetryService.test.ts b/src/vs/platform/telemetry/test/electron-browser/telemetryService.test.ts index 530ffae4699..9f728745344 100644 --- a/src/vs/platform/telemetry/test/electron-browser/telemetryService.test.ts +++ b/src/vs/platform/telemetry/test/electron-browser/telemetryService.test.ts @@ -11,7 +11,6 @@ import * as Errors from 'vs/base/common/errors'; import * as sinon from 'sinon'; import { getConfigurationValue } from 'vs/platform/configuration/common/configuration'; import { ITelemetryData } from 'vs/platform/telemetry/common/telemetry'; -import { URI } from 'vs/base/common/uri'; class TestTelemetryAppender implements ITelemetryAppender { @@ -770,7 +769,6 @@ suite('TelemetryService', () => { appender: testAppender }, { _serviceBrand: undefined, - userSettingsResource: URI.file('settings.json'), getValue() { return { enableTelemetry: enableTelemetry diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index a8eeae2cdc0..15542b6087e 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -35,12 +35,11 @@ import { SignService } from 'vs/platform/sign/browser/signService'; import { hash } from 'vs/base/common/hash'; import { IWorkbenchConstructionOptions } from 'vs/workbench/workbench.web.api'; import { ProductService } from 'vs/platform/product/browser/productService'; -import { FileUserDataService } from 'vs/workbench/services/userData/common/fileUserDataService'; -import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; +import { FileUserDataProvider } from 'vs/workbench/services/userData/common/fileUserDataProvider'; import { UserDataFileSystemProvider } from 'vs/workbench//services/userData/common/userDataFileSystemProvider'; -import { CustomUserDataService } from '../services/userData/common/customUserDataService'; -import { joinPath } from 'vs/base/common/resources'; -import { InMemoryUserDataProvider } from '../services/userData/common/inMemoryUserDataProvider'; +import { joinPath, dirname } from 'vs/base/common/resources'; +import { InMemoryUserDataProvider } from 'vs/workbench/services/userData/common/inMemoryUserDataProvider'; +import { IUserDataProvider } from 'vs/workbench/services/userData/common/userData'; class CodeRendererMain extends Disposable { @@ -92,7 +91,8 @@ class CodeRendererMain extends Disposable { serviceCollection.set(ILogService, logService); // Environment - const environmentService = new BrowserWorkbenchEnvironmentService(this.configuration); + const remoteUserDataUri = this.getRemoteUserDataUri(); + const environmentService = new BrowserWorkbenchEnvironmentService(this.configuration, remoteUserDataUri); serviceCollection.set(IWorkbenchEnvironmentService, environmentService); // Product @@ -123,15 +123,13 @@ class CodeRendererMain extends Disposable { fileService.registerProvider(Schemas.vscodeRemote, remoteFileSystemProvider); } - // User Data Service - const userDataService = this.createUserDataService(fileService); - serviceCollection.set(IUserDataService, userDataService); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(userDataService)); + // User Data Provider + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(dirname(environmentService.settingsResource), this.getUserDataPovider(fileService, remoteUserDataUri))); const payload = await this.resolveWorkspaceInitializationPayload(); await Promise.all([ - this.createWorkspaceService(payload, environmentService, fileService, userDataService, remoteAgentService, logService).then(service => { + this.createWorkspaceService(payload, environmentService, fileService, remoteAgentService, logService).then(service => { // Workspace serviceCollection.set(IWorkspaceContextService, service); @@ -146,8 +144,8 @@ class CodeRendererMain extends Disposable { return { serviceCollection, logService }; } - private async createWorkspaceService(payload: IWorkspaceInitializationPayload, environmentService: IWorkbenchEnvironmentService, fileService: FileService, userDataService: IUserDataService, remoteAgentService: IRemoteAgentService, logService: ILogService): Promise { - const workspaceService = new WorkspaceService({ remoteAuthority: this.configuration.remoteAuthority, configurationCache: new ConfigurationCache() }, fileService, userDataService, remoteAgentService); + private async createWorkspaceService(payload: IWorkspaceInitializationPayload, environmentService: IWorkbenchEnvironmentService, fileService: FileService, remoteAgentService: IRemoteAgentService, logService: ILogService): Promise { + const workspaceService = new WorkspaceService({ remoteAuthority: this.configuration.remoteAuthority, configurationCache: new ConfigurationCache() }, environmentService, fileService, remoteAgentService); try { await workspaceService.initialize(payload); @@ -176,16 +174,13 @@ class CodeRendererMain extends Disposable { return { id: 'empty-window' }; } - private createUserDataService(fileService: IFileService): IUserDataService { + private getUserDataPovider(fileService: IFileService, remoteUserDataUri: URI | null): IUserDataProvider { if (this.configuration.userDataProvider) { - return this._register(new CustomUserDataService(this.configuration.userDataProvider)); - } else if (this.configuration.remoteAuthority) { - const remoteUserDataUri = this.getRemoteUserDataUri(); - if (remoteUserDataUri) { - return this._register(new FileUserDataService(remoteUserDataUri, fileService)); - } + return this.configuration.userDataProvider; + } else if (this.configuration.remoteAuthority && remoteUserDataUri) { + return this._register(new FileUserDataProvider(remoteUserDataUri, fileService)); } - return this._register(new CustomUserDataService(new InMemoryUserDataProvider())); + return this._register(new InMemoryUserDataProvider()); } private getRemoteUserDataUri(): URI | null { diff --git a/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts b/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts index 02013097199..20c9985f632 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts @@ -39,8 +39,6 @@ import { ExplorerRootContext, ExplorerFolderContext } from 'vs/workbench/contrib import { ILabelService } from 'vs/platform/label/common/label'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IKeybindingEditingService } from 'vs/workbench/services/keybinding/common/keybindingEditing'; Registry.as(EditorExtensions.Editors).registerEditor( new EditorDescriptor( @@ -372,8 +370,6 @@ class PreferencesActionsContribution extends Disposable implements IWorkbenchCon constructor( @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, - @IKeybindingEditingService keybindingEditingService: IKeybindingEditingService, - @IConfigurationService configurationService: IConfigurationService, @IPreferencesService private readonly preferencesService: IPreferencesService, @IWorkspaceContextService private readonly workpsaceContextService: IWorkspaceContextService, @ILabelService labelService: ILabelService, @@ -389,7 +385,7 @@ class PreferencesActionsContribution extends Disposable implements IWorkbenchCon dark: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/browser/media/preferences-editor-inverse.svg`)) } }, - when: ResourceContextKey.Resource.isEqualTo(keybindingEditingService.userKeybindingsResource.toString()), + when: ResourceContextKey.Resource.isEqualTo(environmentService.keybindingsResource.toString()), group: 'navigation', order: 1 }); @@ -405,7 +401,7 @@ class PreferencesActionsContribution extends Disposable implements IWorkbenchCon dark: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/browser/media/preferences-editor-inverse.svg`)) } }, - when: ResourceContextKey.Resource.isEqualTo(configurationService.userSettingsResource.toString()), + when: ResourceContextKey.Resource.isEqualTo(environmentService.settingsResource.toString()), group: 'navigation', order: 1 }); diff --git a/src/vs/workbench/contrib/preferences/common/preferencesContribution.ts b/src/vs/workbench/contrib/preferences/common/preferencesContribution.ts index 52097f9afc2..246eaf2ed11 100644 --- a/src/vs/workbench/contrib/preferences/common/preferencesContribution.ts +++ b/src/vs/workbench/contrib/preferences/common/preferencesContribution.ts @@ -14,6 +14,7 @@ import { IModeService } from 'vs/editor/common/services/modeService'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IEditorOptions, ITextEditorOptions } from 'vs/platform/editor/common/editor'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import * as JSONContributionRegistry from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; import { Registry } from 'vs/platform/registry/common/platform'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; @@ -35,6 +36,7 @@ export class PreferencesContribution implements IWorkbenchContribution { @IPreferencesService private readonly preferencesService: IPreferencesService, @IModeService private readonly modeService: IModeService, @IEditorService private readonly editorService: IEditorService, + @IEnvironmentService private readonly environmentService: IEnvironmentService, @IWorkspaceContextService private readonly workspaceService: IWorkspaceContextService, @IConfigurationService private readonly configurationService: IConfigurationService ) { @@ -77,7 +79,7 @@ export class PreferencesContribution implements IWorkbenchContribution { } // Global User Settings File - if (isEqual(resource, this.configurationService.userSettingsResource, !isLinux)) { + if (isEqual(resource, this.environmentService.settingsResource, !isLinux)) { return { override: this.preferencesService.openGlobalSettings(true, options, group) }; } diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index 60dd333c222..014ac74121d 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -50,9 +50,9 @@ import { ConfigurationCache } from 'vs/workbench/services/configuration/node/con import { SpdLogService } from 'vs/platform/log/node/spdlogService'; import { SignService } from 'vs/platform/sign/node/signService'; import { ISignService } from 'vs/platform/sign/common/sign'; -import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; -import { FileUserDataService } from 'vs/workbench/services/userData/common/fileUserDataService'; +import { FileUserDataProvider } from 'vs/workbench/services/userData/common/fileUserDataProvider'; import { UserDataFileSystemProvider } from 'vs/workbench/services/userData/common/userDataFileSystemProvider'; +import { dirname } from 'vs/base/common/resources'; class CodeRendererMain extends Disposable { @@ -208,15 +208,13 @@ class CodeRendererMain extends Disposable { fileService.registerProvider(Schemas.vscodeRemote, remoteFileSystemProvider); } - // User Data Service - const userDataService = this._register(new FileUserDataService(environmentService.appSettingsHome, fileService)); - serviceCollection.set(IUserDataService, userDataService); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(userDataService)); + // User Data Provider + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(dirname(environmentService.settingsResource), new FileUserDataProvider(environmentService.appSettingsHome, fileService))); const payload = await this.resolveWorkspaceInitializationPayload(environmentService); const services = await Promise.all([ - this.createWorkspaceService(payload, environmentService, fileService, userDataService, remoteAgentService, logService).then(service => { + this.createWorkspaceService(payload, environmentService, fileService, remoteAgentService, logService).then(service => { // Workspace serviceCollection.set(IWorkspaceContextService, service); @@ -312,8 +310,8 @@ class CodeRendererMain extends Disposable { return; } - private async createWorkspaceService(payload: IWorkspaceInitializationPayload, environmentService: IWorkbenchEnvironmentService, fileService: FileService, userDataService: IUserDataService, remoteAgentService: IRemoteAgentService, logService: ILogService): Promise { - const workspaceService = new WorkspaceService({ remoteAuthority: this.configuration.remoteAuthority, configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); + private async createWorkspaceService(payload: IWorkspaceInitializationPayload, environmentService: IWorkbenchEnvironmentService, fileService: FileService, remoteAgentService: IRemoteAgentService, logService: ILogService): Promise { + const workspaceService = new WorkspaceService({ remoteAuthority: this.configuration.remoteAuthority, configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); try { await workspaceService.initialize(payload); diff --git a/src/vs/workbench/services/configuration/browser/configuration.ts b/src/vs/workbench/services/configuration/browser/configuration.ts index 7907be1ca34..515c6df2fe3 100644 --- a/src/vs/workbench/services/configuration/browser/configuration.ts +++ b/src/vs/workbench/services/configuration/browser/configuration.ts @@ -9,10 +9,10 @@ import { Event, Emitter } from 'vs/base/common/event'; import * as errors from 'vs/base/common/errors'; import { Disposable, IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; import { RunOnceScheduler } from 'vs/base/common/async'; -import { FileChangeType, FileChangesEvent } from 'vs/platform/files/common/files'; +import { FileChangeType, FileChangesEvent, IFileService } from 'vs/platform/files/common/files'; import { ConfigurationModel, ConfigurationModelParser } from 'vs/platform/configuration/common/configurationModels'; import { WorkspaceConfigurationModelParser, StandaloneConfigurationModelParser } from 'vs/workbench/services/configuration/common/configurationModels'; -import { FOLDER_SETTINGS_PATH, TASKS_CONFIGURATION_KEY, FOLDER_SETTINGS_NAME, LAUNCH_CONFIGURATION_KEY, IConfigurationCache, ConfigurationKey, REMOTE_MACHINE_SCOPES, FOLDER_SCOPES, WORKSPACE_SCOPES, USER_CONFIGURATION_KEY, ConfigurationFileService } from 'vs/workbench/services/configuration/common/configuration'; +import { FOLDER_SETTINGS_PATH, TASKS_CONFIGURATION_KEY, FOLDER_SETTINGS_NAME, LAUNCH_CONFIGURATION_KEY, IConfigurationCache, ConfigurationKey, REMOTE_MACHINE_SCOPES, FOLDER_SCOPES, WORKSPACE_SCOPES, ConfigurationFileService } from 'vs/workbench/services/configuration/common/configuration'; import { IStoredWorkspaceFolder, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { JSONEditingService } from 'vs/workbench/services/configuration/common/jsonEditingService'; import { WorkbenchState, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; @@ -23,27 +23,24 @@ import { Schemas } from 'vs/base/common/network'; import { IConfigurationModel } from 'vs/platform/configuration/common/configuration'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { hash } from 'vs/base/common/hash'; -import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; export class UserConfiguration extends Disposable { - readonly resource: URI; - private readonly parser: ConfigurationModelParser; private readonly reloadConfigurationScheduler: RunOnceScheduler; protected readonly _onDidChangeConfiguration: Emitter = this._register(new Emitter()); readonly onDidChangeConfiguration: Event = this._onDidChangeConfiguration.event; constructor( + private readonly userSettingsResource: URI, private readonly scopes: ConfigurationScope[] | undefined, - private readonly userDataService: IUserDataService + private readonly fileService: IFileService ) { super(); - this.resource = userDataService.toResource(USER_CONFIGURATION_KEY); - this.parser = new ConfigurationModelParser(USER_CONFIGURATION_KEY, this.scopes); + this.parser = new ConfigurationModelParser(this.userSettingsResource.toString(), this.scopes); this.reloadConfigurationScheduler = this._register(new RunOnceScheduler(() => this.reload().then(configurationModel => this._onDidChangeConfiguration.fire(configurationModel)), 50)); - this._register(Event.filter(this.userDataService.onDidChange, e => e.contains(USER_CONFIGURATION_KEY))(() => this.reloadConfigurationScheduler.schedule())); + this._register(Event.filter(this.fileService.onFileChanges, e => e.contains(this.userSettingsResource))(() => this.reloadConfigurationScheduler.schedule())); } async initialize(): Promise { @@ -52,8 +49,8 @@ export class UserConfiguration extends Disposable { async reload(): Promise { try { - const content = (await this.userDataService.read(USER_CONFIGURATION_KEY)) || '{}'; - this.parser.parseContent(content); + const content = await this.fileService.readFile(this.userSettingsResource); + this.parser.parseContent(content.value.toString() || '{}'); return this.parser.configurationModel; } catch (e) { return new ConfigurationModel(); diff --git a/src/vs/workbench/services/configuration/browser/configurationService.ts b/src/vs/workbench/services/configuration/browser/configurationService.ts index 7aa440f3117..b2b2f3469f9 100644 --- a/src/vs/workbench/services/configuration/browser/configurationService.ts +++ b/src/vs/workbench/services/configuration/browser/configurationService.ts @@ -29,7 +29,7 @@ import { isEqual, dirname } from 'vs/base/common/resources'; import { mark } from 'vs/base/common/performance'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { IFileService } from 'vs/platform/files/common/files'; -import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; +import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; export class WorkspaceService extends Disposable implements IConfigurationService, IWorkspaceContextService { @@ -47,7 +47,6 @@ export class WorkspaceService extends Disposable implements IConfigurationServic private cachedFolderConfigs: ResourceMap; private workspaceEditingQueue: Queue; - readonly userSettingsResource: URI; private readonly configurationFileService: ConfigurationFileService; protected readonly _onDidChangeConfiguration: Emitter = this._register(new Emitter()); @@ -70,8 +69,8 @@ export class WorkspaceService extends Disposable implements IConfigurationServic constructor( { remoteAuthority, configurationCache }: { remoteAuthority?: string, configurationCache: IConfigurationCache }, + environmentService: IWorkbenchEnvironmentService, fileService: IFileService, - userDataService: IUserDataService, remoteAgentService: IRemoteAgentService ) { super(); @@ -82,8 +81,7 @@ export class WorkspaceService extends Disposable implements IConfigurationServic this.configurationFileService = new ConfigurationFileService(fileService); this._configuration = new Configuration(this.defaultConfiguration, new ConfigurationModel(), new ConfigurationModel(), new ConfigurationModel(), new ResourceMap(), new ConfigurationModel(), new ResourceMap(), this.workspace); this.cachedFolderConfigs = new ResourceMap(); - this.localUserConfiguration = this._register(new UserConfiguration(remoteAuthority ? LOCAL_MACHINE_SCOPES : undefined, userDataService)); - this.userSettingsResource = this.localUserConfiguration.resource; + this.localUserConfiguration = this._register(new UserConfiguration(environmentService.settingsResource, remoteAuthority ? LOCAL_MACHINE_SCOPES : undefined, fileService)); this._register(this.localUserConfiguration.onDidChangeConfiguration(userConfiguration => this.onLocalUserConfigurationChanged(userConfiguration))); if (remoteAuthority) { this.remoteUserConfiguration = this._register(new RemoteUserConfiguration(remoteAuthority, configurationCache, this.configurationFileService, remoteAgentService)); diff --git a/src/vs/workbench/services/configuration/common/configuration.ts b/src/vs/workbench/services/configuration/common/configuration.ts index 2910b6feccc..ca5948d81a6 100644 --- a/src/vs/workbench/services/configuration/common/configuration.ts +++ b/src/vs/workbench/services/configuration/common/configuration.ts @@ -8,7 +8,6 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { IFileService } from 'vs/platform/files/common/files'; import { ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; -export const USER_CONFIGURATION_KEY = 'settings.json'; export const FOLDER_CONFIG_FOLDER_NAME = '.vscode'; export const FOLDER_SETTINGS_NAME = 'settings'; export const FOLDER_SETTINGS_PATH = `${FOLDER_CONFIG_FOLDER_NAME}/${FOLDER_SETTINGS_NAME}.json`; diff --git a/src/vs/workbench/services/configuration/common/configurationEditingService.ts b/src/vs/workbench/services/configuration/common/configurationEditingService.ts index da010d44828..ffef24c5573 100644 --- a/src/vs/workbench/services/configuration/common/configurationEditingService.ts +++ b/src/vs/workbench/services/configuration/common/configurationEditingService.ts @@ -10,16 +10,18 @@ import * as strings from 'vs/base/common/strings'; import { setProperty } from 'vs/base/common/jsonEdit'; import { Queue } from 'vs/base/common/async'; import { Edit } from 'vs/base/common/jsonFormatter'; +import { IReference } from 'vs/base/common/lifecycle'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Registry } from 'vs/platform/registry/common/platform'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IConfigurationService, IConfigurationOverrides, keyFromOverrideIdentifier } from 'vs/platform/configuration/common/configuration'; -import { FOLDER_SETTINGS_PATH, WORKSPACE_STANDALONE_CONFIGURATIONS, TASKS_CONFIGURATION_KEY, LAUNCH_CONFIGURATION_KEY, USER_CONFIGURATION_KEY } from 'vs/workbench/services/configuration/common/configuration'; +import { FOLDER_SETTINGS_PATH, WORKSPACE_STANDALONE_CONFIGURATIONS, TASKS_CONFIGURATION_KEY, LAUNCH_CONFIGURATION_KEY } from 'vs/workbench/services/configuration/common/configuration'; import { IFileService } from 'vs/platform/files/common/files'; -import { ITextModelService } from 'vs/editor/common/services/resolverService'; +import { ITextModelService, IResolvedTextEditorModel } from 'vs/editor/common/services/resolverService'; import { OVERRIDE_PROPERTY_PATTERN, IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ITextModel } from 'vs/editor/common/model'; @@ -27,14 +29,6 @@ import { INotificationService, Severity } from 'vs/platform/notification/common/ import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; import { withUndefinedAsNull, withNullAsUndefined } from 'vs/base/common/types'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; -import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; -import { IModelService } from 'vs/editor/common/services/modelService'; -import { IModeService } from 'vs/editor/common/services/modeService'; -import { Emitter } from 'vs/base/common/event'; -import { LanguageIdentifier } from 'vs/editor/common/modes'; -import { IDisposable, Disposable, toDisposable } from 'vs/base/common/lifecycle'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { Schemas } from 'vs/base/common/network'; export const enum ConfigurationEditingErrorCode { @@ -101,6 +95,10 @@ export interface IConfigurationValue { } export interface IConfigurationEditingOptions { + /** + * If `true`, do not saves the configuration. Default is `false`. + */ + donotSave?: boolean; /** * If `true`, do not notifies the error to user by showing the message box. Default is `false`. */ @@ -118,127 +116,70 @@ export const enum EditableConfigurationTarget { WORKSPACE_FOLDER } -interface IConfigurationEditOperation extends IDisposable { - value: IConfigurationValue; +interface IConfigurationEditOperation extends IConfigurationValue { target: EditableConfigurationTarget; jsonPath: json.JSONPath; - resource: URI | null; + resource?: URI; workspaceStandAloneConfigurationKey?: string; - apply(save: boolean): Promise; + } interface ConfigurationEditingOptions extends IConfigurationEditingOptions { - donotSave?: boolean; force?: boolean; } -function toConfigurationEditingError(error: ConfigurationEditingErrorCode, operation: IConfigurationEditOperation, contextService: IWorkspaceContextService): ConfigurationEditingError { - switch (error) { +export class ConfigurationEditingService { - // API constraints - case ConfigurationEditingErrorCode.ERROR_UNKNOWN_KEY: return new ConfigurationEditingError(nls.localize('errorUnknownKey', "Unable to write to {0} because {1} is not a registered configuration.", stringifyTarget(operation.target), operation.value.key), error); - case ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_CONFIGURATION_APPLICATION: return new ConfigurationEditingError(nls.localize('errorInvalidWorkspaceConfigurationApplication', "Unable to write {0} to Workspace Settings. This setting can be written only into User settings.", operation.value.key), error); - case ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_CONFIGURATION_MACHINE: return new ConfigurationEditingError(nls.localize('errorInvalidWorkspaceConfigurationMachine', "Unable to write {0} to Workspace Settings. This setting can be written only into User settings.", operation.value.key), error); - case ConfigurationEditingErrorCode.ERROR_INVALID_FOLDER_CONFIGURATION: return new ConfigurationEditingError(nls.localize('errorInvalidFolderConfiguration', "Unable to write to Folder Settings because {0} does not support the folder resource scope.", operation.value.key), error); - case ConfigurationEditingErrorCode.ERROR_INVALID_USER_TARGET: return new ConfigurationEditingError(nls.localize('errorInvalidUserTarget', "Unable to write to User Settings because {0} does not support for global scope.", operation.value.key), error); - case ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_TARGET: return new ConfigurationEditingError(nls.localize('errorInvalidWorkspaceTarget', "Unable to write to Workspace Settings because {0} does not support for workspace scope in a multi folder workspace.", operation.value.key), error); - case ConfigurationEditingErrorCode.ERROR_INVALID_FOLDER_TARGET: return new ConfigurationEditingError(nls.localize('errorInvalidFolderTarget', "Unable to write to Folder Settings because no resource is provided."), error); - case ConfigurationEditingErrorCode.ERROR_NO_WORKSPACE_OPENED: return new ConfigurationEditingError(nls.localize('errorNoWorkspaceOpened', "Unable to write to {0} because no workspace is opened. Please open a workspace first and try again.", stringifyTarget(operation.target)), error); + public _serviceBrand: any; - // User issues - case ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION: { - if (operation.workspaceStandAloneConfigurationKey === TASKS_CONFIGURATION_KEY) { - return new ConfigurationEditingError(nls.localize('errorInvalidTaskConfiguration', "Unable to write into the tasks configuration file. Please open it to correct errors/warnings in it and try again."), error); - } - if (operation.workspaceStandAloneConfigurationKey === LAUNCH_CONFIGURATION_KEY) { - return new ConfigurationEditingError(nls.localize('errorInvalidLaunchConfiguration', "Unable to write into the launch configuration file. Please open it to correct errors/warnings in it and try again."), error); - } - switch (operation.target) { - case EditableConfigurationTarget.USER_LOCAL: - return new ConfigurationEditingError(nls.localize('errorInvalidConfiguration', "Unable to write into user settings. Please open the user settings to correct errors/warnings in it and try again."), error); - case EditableConfigurationTarget.USER_REMOTE: - return new ConfigurationEditingError(nls.localize('errorInvalidRemoteConfiguration', "Unable to write into remote user settings. Please open the remote user settings to correct errors/warnings in it and try again."), error); - case EditableConfigurationTarget.WORKSPACE: - return new ConfigurationEditingError(nls.localize('errorInvalidConfigurationWorkspace', "Unable to write into workspace settings. Please open the workspace settings to correct errors/warnings in the file and try again."), error); - case EditableConfigurationTarget.WORKSPACE_FOLDER: - let workspaceFolderName: string = '<>'; - if (operation.resource) { - const folder = contextService.getWorkspaceFolder(operation.resource); - if (folder) { - workspaceFolderName = folder.name; - } - } - return new ConfigurationEditingError(nls.localize('errorInvalidConfigurationFolder', "Unable to write into folder settings. Please open the '{0}' folder settings to correct errors/warnings in it and try again.", workspaceFolderName), error); - } - return new ConfigurationEditingError('', error); - } - case ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY: { - if (operation.workspaceStandAloneConfigurationKey === TASKS_CONFIGURATION_KEY) { - return new ConfigurationEditingError(nls.localize('errorTasksConfigurationFileDirty', "Unable to write into tasks configuration file because the file is dirty. Please save it first and then try again."), error); - } - if (operation.workspaceStandAloneConfigurationKey === LAUNCH_CONFIGURATION_KEY) { - return new ConfigurationEditingError(nls.localize('errorLaunchConfigurationFileDirty', "Unable to write into launch configuration file because the file is dirty. Please save it first and then try again."), error); - } - switch (operation.target) { - case EditableConfigurationTarget.USER_LOCAL: - return new ConfigurationEditingError(nls.localize('errorConfigurationFileDirty', "Unable to write into user settings because the file is dirty. Please save the user settings file first and then try again."), error); - case EditableConfigurationTarget.USER_REMOTE: - return new ConfigurationEditingError(nls.localize('errorRemoteConfigurationFileDirty', "Unable to write into remote user settings because the file is dirty. Please save the remote user settings file first and then try again."), error); - case EditableConfigurationTarget.WORKSPACE: - return new ConfigurationEditingError(nls.localize('errorConfigurationFileDirtyWorkspace', "Unable to write into workspace settings because the file is dirty. Please save the workspace settings file first and then try again."), error); - case EditableConfigurationTarget.WORKSPACE_FOLDER: - let workspaceFolderName: string = '<>'; - if (operation.resource) { - const folder = contextService.getWorkspaceFolder(operation.resource); - if (folder) { - workspaceFolderName = folder.name; - } - } - return new ConfigurationEditingError(nls.localize('errorConfigurationFileDirtyFolder', "Unable to write into folder settings because the file is dirty. Please save the '{0}' folder settings file first and then try again.", workspaceFolderName), error); - } - return new ConfigurationEditingError('', error); - } - } -} - -function stringifyTarget(target: EditableConfigurationTarget): string { - switch (target) { - case EditableConfigurationTarget.USER_LOCAL: - return nls.localize('userTarget', "User Settings"); - case EditableConfigurationTarget.USER_REMOTE: - return nls.localize('remoteUserTarget', "Remote User Settings"); - case EditableConfigurationTarget.WORKSPACE: - return nls.localize('workspaceTarget', "Workspace Settings"); - case EditableConfigurationTarget.WORKSPACE_FOLDER: - return nls.localize('folderTarget', "Folder Settings"); - } - return ''; -} - -abstract class ConfigurationEditOperation extends Disposable implements IConfigurationEditOperation { + private queue: Queue; + private remoteSettingsResource: URI | null; constructor( - readonly value: IConfigurationValue, - readonly target: EditableConfigurationTarget, - readonly jsonPath: json.JSONPath, - readonly resource: URI | null, - readonly workspaceStandAloneConfigurationKey: string | undefined, - protected readonly contextService: IWorkspaceContextService + @IConfigurationService private readonly configurationService: IConfigurationService, + @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, + @IEnvironmentService private readonly environmentService: IEnvironmentService, + @IFileService private readonly fileService: IFileService, + @ITextModelService private readonly textModelResolverService: ITextModelService, + @ITextFileService private readonly textFileService: ITextFileService, + @INotificationService private readonly notificationService: INotificationService, + @IPreferencesService private readonly preferencesService: IPreferencesService, + @IEditorService private readonly editorService: IEditorService, + @IRemoteAgentService remoteAgentService: IRemoteAgentService ) { - super(); + this.queue = new Queue(); + remoteAgentService.getEnvironment().then(environment => { + if (environment) { + this.remoteSettingsResource = environment.settingsPath; + } + }); } - async apply(save: boolean): Promise { - this.validate(); - const model = await this.resolve(); - if (this.hasParseErrors(model)) { - throw toConfigurationEditingError(ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION, this, this.contextService); - } - const edit = this.getEdits(model)[0]; - if (edit && this.applyEditsToBuffer(edit, model) && save) { - await this.save(model); - } + writeConfiguration(target: EditableConfigurationTarget, value: IConfigurationValue, options: IConfigurationEditingOptions = {}): Promise { + const operation = this.getConfigurationEditOperation(target, value, options.scopes || {}); + return Promise.resolve(this.queue.queue(() => this.doWriteConfiguration(operation, options) // queue up writes to prevent race conditions + .then(() => null, + error => { + if (!options.donotNotifyError) { + this.onError(error, operation, options.scopes); + } + return Promise.reject(error); + }))); + } + private doWriteConfiguration(operation: IConfigurationEditOperation, options: ConfigurationEditingOptions): Promise { + const checkDirtyConfiguration = !(options.force || options.donotSave); + const saveConfiguration = options.force || !options.donotSave; + return this.resolveAndValidate(operation.target, operation, checkDirtyConfiguration, options.scopes || {}) + .then(reference => this.writeToBuffer(reference.object.textEditorModel, operation, saveConfiguration) + .then(() => reference.dispose())); + } + + private async writeToBuffer(model: ITextModel, operation: IConfigurationEditOperation, save: boolean): Promise { + const edit = this.getEdits(model, operation)[0]; + if (edit && this.applyEditsToBuffer(edit, model) && save) { + return this.textFileService.save(operation.resource!, { skipSaveParticipants: true /* programmatic change */ }); + } } private applyEditsToBuffer(edit: Edit, model: ITextModel): boolean { @@ -254,239 +195,6 @@ abstract class ConfigurationEditOperation extends Disposable implements IConfigu return false; } - private getEdits(model: ITextModel): Edit[] { - const { tabSize, insertSpaces } = model.getOptions(); - const eol = model.getEOL(); - - // Without jsonPath, the entire configuration file is being replaced, so we just use JSON.stringify - if (!this.jsonPath.length) { - const content = JSON.stringify(this.value.value, null, insertSpaces ? strings.repeat(' ', tabSize) : '\t'); - return [{ - content, - length: model.getValue().length, - offset: 0 - }]; - } - - return setProperty(model.getValue(), this.jsonPath, this.value.value, { tabSize, insertSpaces, eol }); - } - - private hasParseErrors(model: ITextModel): boolean { - // If we write to a workspace standalone file and replace the entire contents (no key provided) - // we can return here because any parse errors can safely be ignored since all contents are replaced - if (this.workspaceStandAloneConfigurationKey && !this.value.key) { - return false; - } - const parseErrors: json.ParseError[] = []; - json.parse(model.getValue(), parseErrors); - return parseErrors.length > 0; - } - - protected abstract validate(): void; - protected abstract save(model: ITextModel): Promise; - protected abstract resolve(): Promise; -} - -class ResourceConfigurationEditOperation extends ConfigurationEditOperation { - - private resolvePromise: Promise | undefined = undefined; - - constructor( - value: IConfigurationValue, - target: EditableConfigurationTarget, - jsonPath: json.JSONPath, - readonly resource: URI, - workspaceStandAloneConfigurationKey: string | undefined, - private readonly checkDirty: boolean, - @IFileService private readonly fileService: IFileService, - @ITextFileService private readonly textFileService: ITextFileService, - @ITextModelService private readonly textModelResolverService: ITextModelService, - @IConfigurationService private readonly configurationService: IConfigurationService, - @IWorkspaceContextService contextService: IWorkspaceContextService - ) { - super( - value, - target, - jsonPath, - resource, - workspaceStandAloneConfigurationKey, - contextService - ); - } - - protected async save(model: ITextModel): Promise { - await this.textFileService.save(this.resource, { skipSaveParticipants: true /* programmatic change */ }); - } - - protected async resolve(): Promise { - if (!this.resolvePromise) { - this.resolvePromise = this._resolve(); - } - return this.resolvePromise; - } - - protected validate(): void { - if (this.checkDirty && this.textFileService.isDirty(this.resource)) { - throw toConfigurationEditingError(ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY, this, this.contextService); - } - - // Any key must be a known setting from the registry (unless this is a standalone config) - if (!this.workspaceStandAloneConfigurationKey) { - const validKeys = this.configurationService.keys().default; - if (validKeys.indexOf(this.value.key) < 0 && !OVERRIDE_PROPERTY_PATTERN.test(this.value.key)) { - throw toConfigurationEditingError(ConfigurationEditingErrorCode.ERROR_UNKNOWN_KEY, this, this.contextService); - } - } - - if (this.workspaceStandAloneConfigurationKey) { - // Global tasks and launches are not supported - if (this.target === EditableConfigurationTarget.USER_LOCAL || this.target === EditableConfigurationTarget.USER_REMOTE) { - throw toConfigurationEditingError(ConfigurationEditingErrorCode.ERROR_INVALID_USER_TARGET, this, this.contextService); - } - - // Workspace tasks are not supported - if (this.workspaceStandAloneConfigurationKey === TASKS_CONFIGURATION_KEY && this.contextService.getWorkbenchState() === WorkbenchState.WORKSPACE && this.target === EditableConfigurationTarget.WORKSPACE) { - throw toConfigurationEditingError(ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_TARGET, this, this.contextService); - } - } - - // Target cannot be workspace or folder if no workspace opened - if ((this.target === EditableConfigurationTarget.WORKSPACE || this.target === EditableConfigurationTarget.WORKSPACE_FOLDER) && this.contextService.getWorkbenchState() === WorkbenchState.EMPTY) { - throw toConfigurationEditingError(ConfigurationEditingErrorCode.ERROR_NO_WORKSPACE_OPENED, this, this.contextService); - } - - if (this.target === EditableConfigurationTarget.WORKSPACE) { - if (!this.workspaceStandAloneConfigurationKey) { - const configurationProperties = Registry.as(ConfigurationExtensions.Configuration).getConfigurationProperties(); - if (configurationProperties[this.value.key].scope === ConfigurationScope.APPLICATION) { - throw toConfigurationEditingError(ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_CONFIGURATION_APPLICATION, this, this.contextService); - } - if (configurationProperties[this.value.key].scope === ConfigurationScope.MACHINE) { - throw toConfigurationEditingError(ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_CONFIGURATION_MACHINE, this, this.contextService); - } - } - } - - if (this.target === EditableConfigurationTarget.WORKSPACE_FOLDER) { - if (!this.resource) { - throw toConfigurationEditingError(ConfigurationEditingErrorCode.ERROR_INVALID_FOLDER_TARGET, this, this.contextService); - } - - if (!this.workspaceStandAloneConfigurationKey) { - const configurationProperties = Registry.as(ConfigurationExtensions.Configuration).getConfigurationProperties(); - if (configurationProperties[this.value.key].scope !== ConfigurationScope.RESOURCE) { - throw toConfigurationEditingError(ConfigurationEditingErrorCode.ERROR_INVALID_FOLDER_CONFIGURATION, this, this.contextService); - } - } - } - - if (!this.resource) { - throw toConfigurationEditingError(ConfigurationEditingErrorCode.ERROR_INVALID_FOLDER_TARGET, this, this.contextService); - } - } - - private async _resolve(): Promise { - const exists = await this.fileService.exists(this.resource); - if (!exists) { - await this.textFileService.write(this.resource, '{}', { encoding: 'utf8' }); - } - const reference = this._register(await this.textModelResolverService.createModelReference(this.resource)); - return reference.object.textEditorModel; - } -} - -class UserConfigurationEditOperation extends ConfigurationEditOperation { - - private resolvePromise: Promise | undefined = undefined; - - constructor( - value: IConfigurationValue, - jsonPath: json.JSONPath, - @IUserDataService private readonly userDataService: IUserDataService, - @IModelService private readonly modelService: IModelService, - @IModeService private readonly modeService: IModeService, - @IConfigurationService private readonly configurationService: IConfigurationService, - @IWorkspaceContextService contextService: IWorkspaceContextService - ) { - super( - value, - EditableConfigurationTarget.USER_LOCAL, - jsonPath, - null, - undefined, - contextService - ); - } - - protected async save(model: ITextModel): Promise { - await this.userDataService.write(USER_CONFIGURATION_KEY, model.getValue()); - } - - protected validate(): void { - // Any key must be a known setting from the registry - const validKeys = this.configurationService.keys().default; - if (validKeys.indexOf(this.value.key) < 0 && !OVERRIDE_PROPERTY_PATTERN.test(this.value.key)) { - throw toConfigurationEditingError(ConfigurationEditingErrorCode.ERROR_UNKNOWN_KEY, this, this.contextService); - } - } - - protected resolve(): Promise { - if (!this.resolvePromise) { - this.resolvePromise = this._resolve(); - } - return this.resolvePromise; - } - - private async _resolve(): Promise { - const content = (await this.userDataService.read(USER_CONFIGURATION_KEY)) || '{}'; - const languageIdentifier = this.modeService.getLanguageIdentifier('jsonc'); - const model = this.modelService.createModel(content, languageIdentifier ? { languageIdentifier, onDidChange: new Emitter().event, dispose: () => { } } : null, this.configurationService.userSettingsResource.with({ scheme: Schemas.vscode })); - this._register(toDisposable(() => { - model.dispose(); - this.modelService.destroyModel(model.uri); - })); - return model; - } -} - -export class ConfigurationEditingService { - - public _serviceBrand: any; - - private queue: Queue; - private remoteSettingsResource: URI | null; - - constructor( - @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, - @INotificationService private readonly notificationService: INotificationService, - @IPreferencesService private readonly preferencesService: IPreferencesService, - @IEditorService private readonly editorService: IEditorService, - @IRemoteAgentService remoteAgentService: IRemoteAgentService, - @IInstantiationService private readonly instantiationService: IInstantiationService, - ) { - this.queue = new Queue(); - remoteAgentService.getEnvironment().then(environment => { - if (environment) { - this.remoteSettingsResource = environment.settingsPath; - } - }); - } - - writeConfiguration(target: EditableConfigurationTarget, value: IConfigurationValue, options: ConfigurationEditingOptions = {}): Promise { - return this.queue.queue(async () => { // queue up writes to prevent race conditions - const operation = this.getConfigurationEditOperation(target, value, options.scopes || {}, !(options.force || options.donotSave)); - try { - await operation.apply(options.force || !options.donotSave); - operation.dispose(); - } catch (error) { - if (!options.donotNotifyError) { - this.onError(error, operation, options.scopes); - } - return Promise.reject(error); - } - }); - } - private onError(error: ConfigurationEditingError, operation: IConfigurationEditOperation, scopes: IConfigurationOverrides | undefined): void { switch (error.code) { case ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION: @@ -530,7 +238,7 @@ export class ConfigurationEditingService { [{ label: nls.localize('saveAndRetry', "Save and Retry"), run: () => { - const key = operation.value.key ? `${operation.workspaceStandAloneConfigurationKey}.${operation.value.key}` : operation.workspaceStandAloneConfigurationKey!; + const key = operation.key ? `${operation.workspaceStandAloneConfigurationKey}.${operation.key}` : operation.workspaceStandAloneConfigurationKey!; this.writeConfiguration(operation.target, { key, value: operation.value }, { force: true, scopes }); } }, @@ -543,7 +251,7 @@ export class ConfigurationEditingService { this.notificationService.prompt(Severity.Error, error.message, [{ label: nls.localize('saveAndRetry', "Save and Retry"), - run: () => this.writeConfiguration(operation.target, { key: operation.value.key, value: operation.value }, { force: true, scopes }) + run: () => this.writeConfiguration(operation.target, { key: operation.key, value: operation.value }, { force: true, scopes }) }, { label: nls.localize('open', "Open Settings"), @@ -579,7 +287,205 @@ export class ConfigurationEditingService { this.editorService.openEditor({ resource }); } - private getConfigurationEditOperation(target: EditableConfigurationTarget, config: IConfigurationValue, overrides: IConfigurationOverrides, checkDirty: boolean): IConfigurationEditOperation { + private reject(code: ConfigurationEditingErrorCode, target: EditableConfigurationTarget, operation: IConfigurationEditOperation): Promise { + const message = this.toErrorMessage(code, target, operation); + + return Promise.reject(new ConfigurationEditingError(message, code)); + } + + private toErrorMessage(error: ConfigurationEditingErrorCode, target: EditableConfigurationTarget, operation: IConfigurationEditOperation): string { + switch (error) { + + // API constraints + case ConfigurationEditingErrorCode.ERROR_UNKNOWN_KEY: return nls.localize('errorUnknownKey', "Unable to write to {0} because {1} is not a registered configuration.", this.stringifyTarget(target), operation.key); + case ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_CONFIGURATION_APPLICATION: return nls.localize('errorInvalidWorkspaceConfigurationApplication', "Unable to write {0} to Workspace Settings. This setting can be written only into User settings.", operation.key); + case ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_CONFIGURATION_MACHINE: return nls.localize('errorInvalidWorkspaceConfigurationMachine', "Unable to write {0} to Workspace Settings. This setting can be written only into User settings.", operation.key); + case ConfigurationEditingErrorCode.ERROR_INVALID_FOLDER_CONFIGURATION: return nls.localize('errorInvalidFolderConfiguration', "Unable to write to Folder Settings because {0} does not support the folder resource scope.", operation.key); + case ConfigurationEditingErrorCode.ERROR_INVALID_USER_TARGET: return nls.localize('errorInvalidUserTarget', "Unable to write to User Settings because {0} does not support for global scope.", operation.key); + case ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_TARGET: return nls.localize('errorInvalidWorkspaceTarget', "Unable to write to Workspace Settings because {0} does not support for workspace scope in a multi folder workspace.", operation.key); + case ConfigurationEditingErrorCode.ERROR_INVALID_FOLDER_TARGET: return nls.localize('errorInvalidFolderTarget', "Unable to write to Folder Settings because no resource is provided."); + case ConfigurationEditingErrorCode.ERROR_NO_WORKSPACE_OPENED: return nls.localize('errorNoWorkspaceOpened', "Unable to write to {0} because no workspace is opened. Please open a workspace first and try again.", this.stringifyTarget(target)); + + // User issues + case ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION: { + if (operation.workspaceStandAloneConfigurationKey === TASKS_CONFIGURATION_KEY) { + return nls.localize('errorInvalidTaskConfiguration', "Unable to write into the tasks configuration file. Please open it to correct errors/warnings in it and try again."); + } + if (operation.workspaceStandAloneConfigurationKey === LAUNCH_CONFIGURATION_KEY) { + return nls.localize('errorInvalidLaunchConfiguration', "Unable to write into the launch configuration file. Please open it to correct errors/warnings in it and try again."); + } + switch (target) { + case EditableConfigurationTarget.USER_LOCAL: + return nls.localize('errorInvalidConfiguration', "Unable to write into user settings. Please open the user settings to correct errors/warnings in it and try again."); + case EditableConfigurationTarget.USER_REMOTE: + return nls.localize('errorInvalidRemoteConfiguration', "Unable to write into remote user settings. Please open the remote user settings to correct errors/warnings in it and try again."); + case EditableConfigurationTarget.WORKSPACE: + return nls.localize('errorInvalidConfigurationWorkspace', "Unable to write into workspace settings. Please open the workspace settings to correct errors/warnings in the file and try again."); + case EditableConfigurationTarget.WORKSPACE_FOLDER: + let workspaceFolderName: string = '<>'; + if (operation.resource) { + const folder = this.contextService.getWorkspaceFolder(operation.resource); + if (folder) { + workspaceFolderName = folder.name; + } + } + return nls.localize('errorInvalidConfigurationFolder', "Unable to write into folder settings. Please open the '{0}' folder settings to correct errors/warnings in it and try again.", workspaceFolderName); + } + return ''; + } + case ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY: { + if (operation.workspaceStandAloneConfigurationKey === TASKS_CONFIGURATION_KEY) { + return nls.localize('errorTasksConfigurationFileDirty', "Unable to write into tasks configuration file because the file is dirty. Please save it first and then try again."); + } + if (operation.workspaceStandAloneConfigurationKey === LAUNCH_CONFIGURATION_KEY) { + return nls.localize('errorLaunchConfigurationFileDirty', "Unable to write into launch configuration file because the file is dirty. Please save it first and then try again."); + } + switch (target) { + case EditableConfigurationTarget.USER_LOCAL: + return nls.localize('errorConfigurationFileDirty', "Unable to write into user settings because the file is dirty. Please save the user settings file first and then try again."); + case EditableConfigurationTarget.USER_REMOTE: + return nls.localize('errorRemoteConfigurationFileDirty', "Unable to write into remote user settings because the file is dirty. Please save the remote user settings file first and then try again."); + case EditableConfigurationTarget.WORKSPACE: + return nls.localize('errorConfigurationFileDirtyWorkspace', "Unable to write into workspace settings because the file is dirty. Please save the workspace settings file first and then try again."); + case EditableConfigurationTarget.WORKSPACE_FOLDER: + let workspaceFolderName: string = '<>'; + if (operation.resource) { + const folder = this.contextService.getWorkspaceFolder(operation.resource); + if (folder) { + workspaceFolderName = folder.name; + } + } + return nls.localize('errorConfigurationFileDirtyFolder', "Unable to write into folder settings because the file is dirty. Please save the '{0}' folder settings file first and then try again.", workspaceFolderName); + } + return ''; + } + } + } + + private stringifyTarget(target: EditableConfigurationTarget): string { + switch (target) { + case EditableConfigurationTarget.USER_LOCAL: + return nls.localize('userTarget', "User Settings"); + case EditableConfigurationTarget.USER_REMOTE: + return nls.localize('remoteUserTarget', "Remote User Settings"); + case EditableConfigurationTarget.WORKSPACE: + return nls.localize('workspaceTarget', "Workspace Settings"); + case EditableConfigurationTarget.WORKSPACE_FOLDER: + return nls.localize('folderTarget', "Folder Settings"); + } + return ''; + } + + private getEdits(model: ITextModel, edit: IConfigurationEditOperation): Edit[] { + const { tabSize, insertSpaces } = model.getOptions(); + const eol = model.getEOL(); + const { value, jsonPath } = edit; + + // Without jsonPath, the entire configuration file is being replaced, so we just use JSON.stringify + if (!jsonPath.length) { + const content = JSON.stringify(value, null, insertSpaces ? strings.repeat(' ', tabSize) : '\t'); + return [{ + content, + length: model.getValue().length, + offset: 0 + }]; + } + + return setProperty(model.getValue(), jsonPath, value, { tabSize, insertSpaces, eol }); + } + + private async resolveModelReference(resource: URI): Promise> { + const exists = await this.fileService.exists(resource); + if (!exists) { + await this.textFileService.write(resource, '{}', { encoding: 'utf8' }); + } + return this.textModelResolverService.createModelReference(resource); + } + + private hasParseErrors(model: ITextModel, operation: IConfigurationEditOperation): boolean { + // If we write to a workspace standalone file and replace the entire contents (no key provided) + // we can return here because any parse errors can safely be ignored since all contents are replaced + if (operation.workspaceStandAloneConfigurationKey && !operation.key) { + return false; + } + const parseErrors: json.ParseError[] = []; + json.parse(model.getValue(), parseErrors); + return parseErrors.length > 0; + } + + private resolveAndValidate(target: EditableConfigurationTarget, operation: IConfigurationEditOperation, checkDirty: boolean, overrides: IConfigurationOverrides): Promise> { + + // Any key must be a known setting from the registry (unless this is a standalone config) + if (!operation.workspaceStandAloneConfigurationKey) { + const validKeys = this.configurationService.keys().default; + if (validKeys.indexOf(operation.key) < 0 && !OVERRIDE_PROPERTY_PATTERN.test(operation.key)) { + return this.reject(ConfigurationEditingErrorCode.ERROR_UNKNOWN_KEY, target, operation); + } + } + + if (operation.workspaceStandAloneConfigurationKey) { + // Global tasks and launches are not supported + if (target === EditableConfigurationTarget.USER_LOCAL || target === EditableConfigurationTarget.USER_REMOTE) { + return this.reject(ConfigurationEditingErrorCode.ERROR_INVALID_USER_TARGET, target, operation); + } + + // Workspace tasks are not supported + if (operation.workspaceStandAloneConfigurationKey === TASKS_CONFIGURATION_KEY && this.contextService.getWorkbenchState() === WorkbenchState.WORKSPACE && operation.target === EditableConfigurationTarget.WORKSPACE) { + return this.reject(ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_TARGET, target, operation); + } + } + + // Target cannot be workspace or folder if no workspace opened + if ((target === EditableConfigurationTarget.WORKSPACE || target === EditableConfigurationTarget.WORKSPACE_FOLDER) && this.contextService.getWorkbenchState() === WorkbenchState.EMPTY) { + return this.reject(ConfigurationEditingErrorCode.ERROR_NO_WORKSPACE_OPENED, target, operation); + } + + if (target === EditableConfigurationTarget.WORKSPACE) { + if (!operation.workspaceStandAloneConfigurationKey) { + const configurationProperties = Registry.as(ConfigurationExtensions.Configuration).getConfigurationProperties(); + if (configurationProperties[operation.key].scope === ConfigurationScope.APPLICATION) { + return this.reject(ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_CONFIGURATION_APPLICATION, target, operation); + } + if (configurationProperties[operation.key].scope === ConfigurationScope.MACHINE) { + return this.reject(ConfigurationEditingErrorCode.ERROR_INVALID_WORKSPACE_CONFIGURATION_MACHINE, target, operation); + } + } + } + + if (target === EditableConfigurationTarget.WORKSPACE_FOLDER) { + if (!operation.resource) { + return this.reject(ConfigurationEditingErrorCode.ERROR_INVALID_FOLDER_TARGET, target, operation); + } + + if (!operation.workspaceStandAloneConfigurationKey) { + const configurationProperties = Registry.as(ConfigurationExtensions.Configuration).getConfigurationProperties(); + if (configurationProperties[operation.key].scope !== ConfigurationScope.RESOURCE) { + return this.reject(ConfigurationEditingErrorCode.ERROR_INVALID_FOLDER_CONFIGURATION, target, operation); + } + } + } + + if (!operation.resource) { + return this.reject(ConfigurationEditingErrorCode.ERROR_INVALID_FOLDER_TARGET, target, operation); + } + + return this.resolveModelReference(operation.resource) + .then(reference => { + const model = reference.object.textEditorModel; + + if (this.hasParseErrors(model, operation)) { + return this.reject(ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION, target, operation); + } + + // Target cannot be dirty if not writing into buffer + if (checkDirty && this.textFileService.isDirty(operation.resource)) { + return this.reject(ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY, target, operation); + } + return reference; + }); + } + + private getConfigurationEditOperation(target: EditableConfigurationTarget, config: IConfigurationValue, overrides: IConfigurationOverrides): IConfigurationEditOperation { // Check for standalone workspace configurations if (config.key) { @@ -590,32 +496,29 @@ export class ConfigurationEditingService { // Check for prefix if (config.key === key) { const jsonPath = this.isWorkspaceConfigurationResource(resource) ? [key] : []; - return this.instantiationService.createInstance(ResourceConfigurationEditOperation, { key: jsonPath[jsonPath.length - 1], value: config.value }, target, jsonPath, resource, key, checkDirty); + return { key: jsonPath[jsonPath.length - 1], jsonPath, value: config.value, resource: withNullAsUndefined(resource), workspaceStandAloneConfigurationKey: key, target }; } // Check for prefix. const keyPrefix = `${key}.`; if (config.key.indexOf(keyPrefix) === 0) { const jsonPath = this.isWorkspaceConfigurationResource(resource) ? [key, config.key.substr(keyPrefix.length)] : [config.key.substr(keyPrefix.length)]; - return this.instantiationService.createInstance(ResourceConfigurationEditOperation, { key: jsonPath[jsonPath.length - 1], value: config.value }, target, jsonPath, resource, key, checkDirty); + return { key: jsonPath[jsonPath.length - 1], jsonPath, value: config.value, resource: withNullAsUndefined(resource), workspaceStandAloneConfigurationKey: key, target }; } } } let key = config.key; let jsonPath = overrides.overrideIdentifier ? [keyFromOverrideIdentifier(overrides.overrideIdentifier), key] : [key]; - if (target === EditableConfigurationTarget.USER_LOCAL) { - return this.instantiationService.createInstance(UserConfigurationEditOperation, { key, value: config.value }, jsonPath); - } - if (target === EditableConfigurationTarget.USER_REMOTE) { - return this.instantiationService.createInstance(ResourceConfigurationEditOperation, { key, value: config.value }, target, jsonPath, withNullAsUndefined(this.getConfigurationFileResource(target, config, '', null)), undefined, checkDirty); + if (target === EditableConfigurationTarget.USER_LOCAL || target === EditableConfigurationTarget.USER_REMOTE) { + return { key, jsonPath, value: config.value, resource: withNullAsUndefined(this.getConfigurationFileResource(target, config, '', null)), target }; } const resource = this.getConfigurationFileResource(target, config, FOLDER_SETTINGS_PATH, overrides.resource); if (this.isWorkspaceConfigurationResource(resource)) { jsonPath = ['settings', ...jsonPath]; } - return this.instantiationService.createInstance(ResourceConfigurationEditOperation, { key, value: config.value }, target, jsonPath, withNullAsUndefined(resource), undefined, checkDirty); + return { key, jsonPath, value: config.value, resource: withNullAsUndefined(resource), target }; } private isWorkspaceConfigurationResource(resource: URI | null): boolean { @@ -625,7 +528,7 @@ export class ConfigurationEditingService { private getConfigurationFileResource(target: EditableConfigurationTarget, config: IConfigurationValue, relativePath: string, resource: URI | null | undefined): URI | null { if (target === EditableConfigurationTarget.USER_LOCAL) { - return null; + return this.environmentService.settingsResource; } if (target === EditableConfigurationTarget.USER_REMOTE) { return this.remoteSettingsResource; diff --git a/src/vs/workbench/services/configuration/node/configurationCache.ts b/src/vs/workbench/services/configuration/node/configurationCache.ts index 67b46a14cb2..432c8ada983 100644 --- a/src/vs/workbench/services/configuration/node/configurationCache.ts +++ b/src/vs/workbench/services/configuration/node/configurationCache.ts @@ -7,12 +7,13 @@ import * as pfs from 'vs/base/node/pfs'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { join } from 'vs/base/common/path'; import { IConfigurationCache, ConfigurationKey } from 'vs/workbench/services/configuration/common/configuration'; +import { IWorkbenchEnvironmentService } from '../../environment/common/environmentService'; export class ConfigurationCache implements IConfigurationCache { private readonly cachedConfigurations: Map = new Map(); - constructor(private readonly environmentService: IEnvironmentService) { + constructor(private readonly environmentService: IWorkbenchEnvironmentService) { } read(key: ConfigurationKey): Promise { 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 44fc5a99eeb..0c295fcd0af 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 @@ -13,7 +13,6 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { ParsedArgs, IEnvironmentService } from 'vs/platform/environment/common/environment'; import { parseArgs } from 'vs/platform/environment/node/argv'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { EnvironmentService } from 'vs/platform/environment/node/environmentService'; import { TestTextFileService, workbenchInstantiationService } from 'vs/workbench/test/workbenchTestServices'; import * as uuid from 'vs/base/common/uuid'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; @@ -39,15 +38,17 @@ import { Schemas } from 'vs/base/common/network'; import { DiskFileSystemProvider } from 'vs/workbench/services/files/node/diskFileSystemProvider'; import { IFileService } from 'vs/platform/files/common/files'; import { ConfigurationCache } from 'vs/workbench/services/configuration/node/configurationCache'; -import { FileUserDataService } from 'vs/workbench/services/userData/common/fileUserDataService'; -import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; import { dirname } from 'vs/base/common/resources'; import { KeybindingsEditingService, IKeybindingEditingService } from 'vs/workbench/services/keybinding/common/keybindingEditing'; +import { UserDataFileSystemProvider } from 'vs/workbench/services/userData/common/userDataFileSystemProvider'; +import { WorkbenchEnvironmentService } from 'vs/workbench/services/environment/node/environmentService'; +import { IWindowConfiguration } from 'vs/platform/windows/common/windows'; +import { FileUserDataProvider } from 'vs/workbench/services/userData/common/fileUserDataProvider'; -class SettingsTestEnvironmentService extends EnvironmentService { +class SettingsTestEnvironmentService extends WorkbenchEnvironmentService { constructor(args: ParsedArgs, _execPath: string, private _settingsPath: string) { - super(args, _execPath); + super(args, _execPath); } get appSettingsHome(): URI { return dirname(URI.file(this._settingsPath)); } @@ -111,9 +112,8 @@ suite('ConfigurationEditingService', () => { fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); instantiationService.stub(IFileService, fileService); instantiationService.stub(IRemoteAgentService, remoteAgentService); - const userDataService = new FileUserDataService(environmentService.appSettingsHome, fileService); - instantiationService.stub(IUserDataService, userDataService); - const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.appSettingsHome.with({ scheme: Schemas.userData }), new FileUserDataProvider(environmentService.appSettingsHome, fileService))); + const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); return workspaceService.initialize(noWorkspace ? { id: '' } : { folder: URI.file(workspaceDir), id: createHash('md5').update(URI.file(workspaceDir).toString()).digest('hex') }).then(() => { instantiationService.stub(IConfigurationService, workspaceService); 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 7be91c54df9..4554c25471e 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 @@ -11,7 +11,6 @@ import * as os from 'os'; import { URI } from 'vs/base/common/uri'; import { Registry } from 'vs/platform/registry/common/platform'; import { ParsedArgs, IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { EnvironmentService } from 'vs/platform/environment/node/environmentService'; import { parseArgs } from 'vs/platform/environment/node/argv'; import * as pfs from 'vs/base/node/pfs'; import * as uuid from 'vs/base/common/uuid'; @@ -45,14 +44,16 @@ import { IRemoteAgentEnvironment } from 'vs/platform/remote/common/remoteAgentEn import { IConfigurationCache } from 'vs/workbench/services/configuration/common/configuration'; import { VSBuffer } from 'vs/base/common/buffer'; import { SignService } from 'vs/platform/sign/browser/signService'; -import { FileUserDataService } from 'vs/workbench/services/userData/common/fileUserDataService'; -import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; +import { FileUserDataProvider } from 'vs/workbench/services/userData/common/fileUserDataProvider'; import { IKeybindingEditingService, KeybindingsEditingService } from 'vs/workbench/services/keybinding/common/keybindingEditing'; +import { WorkbenchEnvironmentService } from 'vs/workbench/services/environment/node/environmentService'; +import { UserDataFileSystemProvider } from 'vs/workbench/services/userData/common/userDataFileSystemProvider'; +import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -class SettingsTestEnvironmentService extends EnvironmentService { +class SettingsTestEnvironmentService extends WorkbenchEnvironmentService { constructor(args: ParsedArgs, _execPath: string, private _settingsPath: string) { - super(args, _execPath); + super(args, _execPath); } get appSettingsHome(): URI { return dirname(URI.file(this._settingsPath)); } @@ -107,8 +108,8 @@ suite('WorkspaceContextService - Folder', () => { const globalSettingsFile = path.join(parentDir, 'settings.json'); const environmentService = new SettingsTestEnvironmentService(parseArgs(process.argv), process.execPath, globalSettingsFile); const fileService = new FileService(new NullLogService()); - const userDataService = new FileUserDataService(environmentService.appSettingsHome, fileService); - workspaceContextService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, new RemoteAgentService({}, environmentService, new RemoteAuthorityResolverService(), new SignService())); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.appSettingsHome.with({ scheme: Schemas.userData }), new FileUserDataProvider(environmentService.appSettingsHome, fileService))); + workspaceContextService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, new RemoteAgentService({}, environmentService, new RemoteAuthorityResolverService(), new SignService())); return (workspaceContextService).initialize(convertToWorkspacePayload(URI.file(folderDir))); }); }); @@ -172,8 +173,8 @@ suite('WorkspaceContextService - Workspace', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const userDataService = new FileUserDataService(environmentService.appSettingsHome, fileService); - const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.appSettingsHome.with({ scheme: Schemas.userData }), new FileUserDataProvider(environmentService.appSettingsHome, fileService))); + const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); @@ -231,8 +232,8 @@ suite('WorkspaceContextService - Workspace Editing', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const userDataService = new FileUserDataService(environmentService.appSettingsHome, fileService); - const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.appSettingsHome.with({ scheme: Schemas.userData }), new FileUserDataProvider(environmentService.appSettingsHome, fileService))); + const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); @@ -491,8 +492,8 @@ suite('WorkspaceService - Initialization', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const userDataService = new FileUserDataService(environmentService.appSettingsHome, fileService); - const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.appSettingsHome.with({ scheme: Schemas.userData }), new FileUserDataProvider(environmentService.appSettingsHome, fileService))); + const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); instantiationService.stub(IEnvironmentService, environmentService); @@ -754,9 +755,8 @@ suite('WorkspaceConfigurationService - Folder', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const userDataService = new FileUserDataService(environmentService.appSettingsHome, fileService); - instantiationService.stub(IUserDataService, userDataService); - const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.appSettingsHome.with({ scheme: Schemas.userData }), new FileUserDataProvider(environmentService.appSettingsHome, fileService))); + const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); instantiationService.stub(IEnvironmentService, environmentService); @@ -1040,7 +1040,7 @@ suite('WorkspaceConfigurationService - Folder', () => { suite('WorkspaceConfigurationService-Multiroot', () => { - let parentResource: string, workspaceContextService: IWorkspaceContextService, environmentService: IEnvironmentService, jsonEditingServce: IJSONEditingService, testObject: IConfigurationService, globalSettingsFile: string; + let parentResource: string, workspaceContextService: IWorkspaceContextService, environmentService: IWorkbenchEnvironmentService, jsonEditingServce: IJSONEditingService, testObject: IConfigurationService, globalSettingsFile: string; const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); suiteSetup(() => { @@ -1084,13 +1084,12 @@ suite('WorkspaceConfigurationService-Multiroot', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const userDataService = new FileUserDataService(environmentService.appSettingsHome, fileService); - instantiationService.stub(IUserDataService, userDataService); - const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.appSettingsHome.with({ scheme: Schemas.userData }), new FileUserDataProvider(environmentService.appSettingsHome, fileService))); + const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); - instantiationService.stub(IEnvironmentService, environmentService); + instantiationService.stub(IWorkbenchEnvironmentService, environmentService); return workspaceService.initialize(getWorkspaceIdentifier(configPath)).then(() => { instantiationService.stub(IFileService, fileService); @@ -1487,9 +1486,9 @@ suite('WorkspaceConfigurationService - Remote Folder', () => { const remoteAgentService = instantiationService.stub(IRemoteAgentService, >{ getEnvironment: () => remoteEnvironmentPromise }); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, diskFileSystemProvider); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.appSettingsHome.with({ scheme: Schemas.userData }), new FileUserDataProvider(environmentService.appSettingsHome, fileService))); const configurationCache: IConfigurationCache = { read: () => Promise.resolve(''), write: () => Promise.resolve(), remove: () => Promise.resolve() }; - const userDataService = new FileUserDataService(environmentService.appSettingsHome, fileService); - testObject = new WorkspaceService({ configurationCache, remoteAuthority }, fileService, userDataService, remoteAgentService); + testObject = new WorkspaceService({ configurationCache, remoteAuthority }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, testObject); instantiationService.stub(IConfigurationService, testObject); instantiationService.stub(IEnvironmentService, environmentService); diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts index dfed462b94b..95f1bbf6a30 100644 --- a/src/vs/workbench/services/environment/browser/environmentService.ts +++ b/src/vs/workbench/services/environment/browser/environmentService.ts @@ -63,14 +63,23 @@ export class BrowserWorkbenchEnvironmentService implements IEnvironmentService { readonly configuration: IWindowConfiguration = new BrowserWindowConfiguration(); - constructor(configuration: IWorkbenchConstructionOptions) { + constructor(configuration: IWorkbenchConstructionOptions, remoteUserDataUri: URI | null) { this.args = { _: [] }; this.appRoot = '/web/'; this.appNameLong = 'Visual Studio Code - Web'; this.configuration.remoteAuthority = configuration.remoteAuthority; - this.appSettingsHome = joinPath(URI.revive(JSON.parse(document.getElementById('vscode-remote-user-data-uri')!.getAttribute('data-settings')!)), 'User'); + if (remoteUserDataUri) { + this.appSettingsHome = remoteUserDataUri || URI.file('/User').with({ scheme: Schemas.userData }); + this.settingsResource = joinPath(this.appSettingsHome, 'settings.json').with({ scheme: Schemas.userData }); + this.keybindingsResource = joinPath(this.appSettingsHome, 'keybindings.json').with({ scheme: Schemas.userData }); + } else { + const appSettingsHome = URI.file('/User').with({ scheme: Schemas.userData }); + this.settingsResource = joinPath(appSettingsHome, 'settings.json'); + this.keybindingsResource = joinPath(appSettingsHome, 'keybindings.json'); + } + this.keyboardLayoutResource = joinPath(this.appSettingsHome, 'keyboardLayout.json'); this.logsPath = '/web/logs'; @@ -95,6 +104,8 @@ export class BrowserWorkbenchEnvironmentService implements IEnvironmentService { appNameLong: string; appQuality?: string; appSettingsHome: URI; + settingsResource: URI; + keybindingsResource: URI; keyboardLayoutResource: URI; machineSettingsHome: URI; machineSettingsResource: URI; diff --git a/src/vs/workbench/services/environment/node/environmentService.ts b/src/vs/workbench/services/environment/node/environmentService.ts index db2a229c03b..bb72c8785b8 100644 --- a/src/vs/workbench/services/environment/node/environmentService.ts +++ b/src/vs/workbench/services/environment/node/environmentService.ts @@ -6,6 +6,10 @@ import { EnvironmentService } from 'vs/platform/environment/node/environmentService'; import { IWindowConfiguration } from 'vs/platform/windows/common/windows'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { memoize } from 'vs/base/common/decorators'; +import { URI } from 'vs/base/common/uri'; +import { joinPath } from 'vs/base/common/resources'; +import { Schemas } from 'vs/base/common/network'; export class WorkbenchEnvironmentService extends EnvironmentService implements IWorkbenchEnvironmentService { @@ -21,4 +25,10 @@ export class WorkbenchEnvironmentService extends EnvironmentService implements I get configuration(): IWindowConfiguration { return this._configuration; } + + @memoize + get settingsResource(): URI { return joinPath(this.appSettingsHome, 'settings.json').with({ scheme: Schemas.userData }); } + + @memoize + get keybindingsResource(): URI { return joinPath(this.appSettingsHome, 'keybindings.json').with({ scheme: Schemas.userData }); } } diff --git a/src/vs/workbench/services/keybinding/browser/keybindingService.ts b/src/vs/workbench/services/keybinding/browser/keybindingService.ts index f0ddd401ce9..fb7e5465845 100644 --- a/src/vs/workbench/services/keybinding/browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/browser/keybindingService.ts @@ -19,7 +19,7 @@ import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/commo import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { Extensions, IJSONContributionRegistry } from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; import { AbstractKeybindingService } from 'vs/platform/keybinding/common/abstractKeybindingService'; -import { IKeyboardEvent, IUserFriendlyKeybinding, KeybindingSource, IKeybindingService, IKeybindingEvent, USER_KEYBINDINGS_KEY } from 'vs/platform/keybinding/common/keybinding'; +import { IKeyboardEvent, IUserFriendlyKeybinding, KeybindingSource, IKeybindingService, IKeybindingEvent } from 'vs/platform/keybinding/common/keybinding'; import { KeybindingResolver } from 'vs/platform/keybinding/common/keybindingResolver'; import { IKeybindingItem, IKeybindingRule2, KeybindingWeight, KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKeybindingItem'; @@ -36,15 +36,17 @@ import { MenuRegistry } from 'vs/platform/actions/common/actions'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; // tslint:disable-next-line: import-patterns import { commandsExtensionPoint } from 'vs/workbench/api/common/menusExtensionPoint'; -import { Disposable } from 'vs/base/common/lifecycle'; +import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { RunOnceScheduler } from 'vs/base/common/async'; +import { URI } from 'vs/base/common/uri'; +import { IFileService, FileChangesEvent, FileChangeType } from 'vs/platform/files/common/files'; +import { dirname, isEqual } from 'vs/base/common/resources'; import { parse } from 'vs/base/common/json'; import * as objects from 'vs/base/common/objects'; import { IKeymapService } from 'vs/workbench/services/keybinding/common/keymapInfo'; import { getDispatchConfig } from 'vs/workbench/services/keybinding/common/dispatchConfig'; import { isArray } from 'vs/base/common/types'; import { INavigatorWithKeyboard } from 'vs/workbench/services/keybinding/common/navigatorKeyboard'; -import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; interface ContributedKeyBinding { command: string; @@ -156,8 +158,8 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { @IConfigurationService configurationService: IConfigurationService, @IWindowService private readonly windowService: IWindowService, @IExtensionService extensionService: IExtensionService, - @IKeymapService private readonly keymapService: IKeymapService, - @IUserDataService userDataService: IUserDataService, + @IFileService fileService: IFileService, + @IKeymapService private readonly keymapService: IKeymapService ) { super(contextKeyService, commandService, telemetryService, notificationService); @@ -183,7 +185,7 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { this._cachedResolver = null; - this.userKeybindings = this._register(new UserKeybindings(userDataService)); + this.userKeybindings = this._register(new UserKeybindings(environmentService.keybindingsResource, fileService)); this.userKeybindings.initialize().then(() => { if (this.userKeybindings.keybindings.length) { this.updateResolver({ source: KeybindingSource.User }); @@ -550,40 +552,100 @@ class UserKeybindings extends Disposable { private _keybindings: IUserFriendlyKeybinding[] = []; get keybindings(): IUserFriendlyKeybinding[] { return this._keybindings; } - private readonly reloadConfigurationScheduler: RunOnceScheduler; - protected readonly _onDidChange: Emitter = this._register(new Emitter()); readonly onDidChange: Event = this._onDidChange.event; + private fileWatcherDisposable: IDisposable = Disposable.None; + private directoryWatcherDisposable: IDisposable = Disposable.None; + constructor( - private readonly userDataService: IUserDataService + private readonly keybindingsResource: URI, + private readonly fileService: IFileService ) { super(); - this._register(Event.filter(this.userDataService.onDidChange, e => e.contains(USER_KEYBINDINGS_KEY))(() => this.reloadConfigurationScheduler.schedule())); + this._register(fileService.onFileChanges(e => this.handleFileEvents(e))); this.reloadConfigurationScheduler = this._register(new RunOnceScheduler(() => this.reload().then(changed => { if (changed) { this._onDidChange.fire(); } }), 50)); + this._register(toDisposable(() => { + this.stopWatchingResource(); + this.stopWatchingDirectory(); + })); + } + + private watchResource(): void { + this.fileWatcherDisposable = this.fileService.watch(this.keybindingsResource); + } + + private stopWatchingResource(): void { + this.fileWatcherDisposable.dispose(); + this.fileWatcherDisposable = Disposable.None; + } + + private watchDirectory(): void { + const directory = dirname(this.keybindingsResource); + this.directoryWatcherDisposable = this.fileService.watch(directory); + } + + private stopWatchingDirectory(): void { + this.directoryWatcherDisposable.dispose(); + this.directoryWatcherDisposable = Disposable.None; } async initialize(): Promise { + const exists = await this.fileService.exists(this.keybindingsResource); + this.onResourceExists(exists); await this.reload(); } private async reload(): Promise { const existing = this._keybindings; try { - const content = (await this.userDataService.read(USER_KEYBINDINGS_KEY)) || '[]'; - const value = parse(content); + const content = await this.fileService.readFile(this.keybindingsResource); + const value = parse(content.value.toString()); this._keybindings = isArray(value) ? value : []; } catch (e) { this._keybindings = []; } return existing ? !objects.equals(existing, this._keybindings) : true; } + + private async handleFileEvents(event: FileChangesEvent): Promise { + const events = event.changes; + + let affectedByChanges = false; + + // Find changes that affect the resource + for (const event of events) { + affectedByChanges = isEqual(this.keybindingsResource, event.resource); + if (affectedByChanges) { + if (event.type === FileChangeType.ADDED) { + this.onResourceExists(true); + } else if (event.type === FileChangeType.DELETED) { + this.onResourceExists(false); + } + break; + } + } + + if (affectedByChanges) { + this.reloadConfigurationScheduler.schedule(); + } + } + + private onResourceExists(exists: boolean): void { + if (exists) { + this.stopWatchingDirectory(); + this.watchResource(); + } else { + this.stopWatchingResource(); + this.watchDirectory(); + } + } } let schemaId = 'vscode://schemas/keybindings'; diff --git a/src/vs/workbench/services/keybinding/common/keybindingEditing.ts b/src/vs/workbench/services/keybinding/common/keybindingEditing.ts index f3cbd16af4b..49b53c2d234 100644 --- a/src/vs/workbench/services/keybinding/common/keybindingEditing.ts +++ b/src/vs/workbench/services/keybinding/common/keybindingEditing.ts @@ -8,24 +8,23 @@ import { Queue } from 'vs/base/common/async'; import * as json from 'vs/base/common/json'; import { setProperty } from 'vs/base/common/jsonEdit'; import { Edit } from 'vs/base/common/jsonFormatter'; -import { Disposable } from 'vs/base/common/lifecycle'; +import { Disposable, IReference } from 'vs/base/common/lifecycle'; import { isArray } from 'vs/base/common/types'; +import { URI } from 'vs/base/common/uri'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { ITextModel } from 'vs/editor/common/model'; +import { ITextModelService, IResolvedTextEditorModel } from 'vs/editor/common/services/resolverService'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { IFileService } from 'vs/platform/files/common/files'; import { ServiceIdentifier, createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { IUserFriendlyKeybinding, USER_KEYBINDINGS_KEY } from 'vs/platform/keybinding/common/keybinding'; +import { IUserFriendlyKeybinding } from 'vs/platform/keybinding/common/keybinding'; import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKeybindingItem'; +import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; -import { IModeService } from 'vs/editor/common/services/modeService'; -import { IModelService } from 'vs/editor/common/services/modelService'; -import { Emitter } from 'vs/base/common/event'; -import { LanguageIdentifier } from 'vs/editor/common/modes'; -import { Schemas } from 'vs/base/common/network'; -import { URI } from 'vs/base/common/uri'; export const IKeybindingEditingService = createDecorator('keybindingEditingService'); @@ -33,8 +32,6 @@ export interface IKeybindingEditingService { _serviceBrand: ServiceIdentifier; - userKeybindingsResource: URI; - editKeybinding(keybindingItem: ResolvedKeybindingItem, key: string, when: string | undefined): Promise; removeKeybinding(keybindingItem: ResolvedKeybindingItem): Promise; @@ -45,17 +42,18 @@ export interface IKeybindingEditingService { export class KeybindingsEditingService extends Disposable implements IKeybindingEditingService { public _serviceBrand: any; - - readonly userKeybindingsResource: URI; private queue: Queue; + private resource: URI = this.environmentService.keybindingsResource; + constructor( - @IUserDataService private readonly userDataService: IUserDataService, - @IModeService private readonly modeService: IModeService, - @IModelService private readonly modelService: IModelService + @ITextModelService private readonly textModelResolverService: ITextModelService, + @ITextFileService private readonly textFileService: ITextFileService, + @IFileService private readonly fileService: IFileService, + @IConfigurationService private readonly configurationService: IConfigurationService, + @IEnvironmentService private readonly environmentService: IEnvironmentService ) { super(); - this.userKeybindingsResource = userDataService.toResource(USER_KEYBINDINGS_KEY); this.queue = new Queue(); } @@ -73,44 +71,45 @@ export class KeybindingsEditingService extends Disposable implements IKeybinding private doEditKeybinding(keybindingItem: ResolvedKeybindingItem, key: string, when: string | undefined): Promise { return this.resolveAndValidate() - .then(model => { + .then(reference => { + const model = reference.object.textEditorModel; const userKeybindingEntries = json.parse(model.getValue()); const userKeybindingEntryIndex = this.findUserKeybindingEntryIndex(keybindingItem, userKeybindingEntries); this.updateKeybinding(keybindingItem, key, when, model, userKeybindingEntryIndex); if (keybindingItem.isDefault && keybindingItem.resolvedKeybinding) { this.removeDefaultKeybinding(keybindingItem, model); } - return this.save(model); + return this.save().then(() => reference.dispose()); }); } private doRemoveKeybinding(keybindingItem: ResolvedKeybindingItem): Promise { return this.resolveAndValidate() - .then(model => { + .then(reference => { + const model = reference.object.textEditorModel; if (keybindingItem.isDefault) { this.removeDefaultKeybinding(keybindingItem, model); } else { this.removeUserKeybinding(keybindingItem, model); } - return this.save(model); + return this.save().then(() => reference.dispose()); }); } private doResetKeybinding(keybindingItem: ResolvedKeybindingItem): Promise { return this.resolveAndValidate() - .then(model => { + .then(reference => { + const model = reference.object.textEditorModel; if (!keybindingItem.isDefault) { this.removeUserKeybinding(keybindingItem, model); this.removeUnassignedDefaultKeybinding(keybindingItem, model); } - return this.save(model); + return this.save().then(() => reference.dispose()); }); } - private async save(model: ITextModel): Promise { - await this.userDataService.write(USER_KEYBINDINGS_KEY, model.getValue()); - model.dispose(); - this.modelService.destroyModel(model.uri); + private save(): Promise { + return this.textFileService.save(this.resource); } private updateKeybinding(keybindingItem: ResolvedKeybindingItem, newKey: string, when: string | undefined, model: ITextModel, userKeybindingEntryIndex: number): void { @@ -208,33 +207,45 @@ export class KeybindingsEditingService extends Disposable implements IKeybinding } - private async resolveModel(): Promise { - const content = (await this.userDataService.read(USER_KEYBINDINGS_KEY)) || '[]'; - const languageIdentifier = this.modeService.getLanguageIdentifier('jsonc'); - return this.modelService.createModel(content, languageIdentifier ? { languageIdentifier, onDidChange: new Emitter().event, dispose: () => { } } : null, this.userKeybindingsResource.with({ scheme: Schemas.vscode })); + private resolveModelReference(): Promise> { + return this.fileService.exists(this.resource) + .then(exists => { + const EOL = this.configurationService.getValue<{}>('files', { overrideIdentifier: 'json' })['eol']; + const result: Promise = exists ? Promise.resolve(null) : this.textFileService.write(this.resource, this.getEmptyContent(EOL), { encoding: 'utf8' }); + return result.then(() => this.textModelResolverService.createModelReference(this.resource)); + }); } - private async resolveAndValidate(): Promise { - const model = await this.resolveModel(); - const EOL = model.getEOL(); - if (model.getValue()) { - const parsed = this.parse(model); - if (parsed.parseErrors.length) { - return Promise.reject(new Error(localize('parseErrors', "Unable to write to the keybindings configuration file. Please open it to correct errors/warnings in the file and try again."))); - } - if (parsed.result) { - if (!isArray(parsed.result)) { - return Promise.reject(new Error(localize('errorInvalidConfiguration', "Unable to write to the keybindings configuration file. It has an object which is not of type Array. Please open the file to clean up and try again."))); - } - } else { - const content = EOL + '[]'; - this.applyEditsToBuffer({ content, length: content.length, offset: model.getValue().length }, model); - } - } else { - const content = this.getEmptyContent(EOL); - this.applyEditsToBuffer({ content, length: content.length, offset: 0 }, model); + private resolveAndValidate(): Promise> { + + // Target cannot be dirty if not writing into buffer + if (this.textFileService.isDirty(this.resource)) { + return Promise.reject(new Error(localize('errorKeybindingsFileDirty', "Unable to write because the keybindings configuration file is dirty. Please save it first and then try again."))); } - return model; + + return this.resolveModelReference() + .then(reference => { + const model = reference.object.textEditorModel; + const EOL = model.getEOL(); + if (model.getValue()) { + const parsed = this.parse(model); + if (parsed.parseErrors.length) { + return Promise.reject(new Error(localize('parseErrors', "Unable to write to the keybindings configuration file. Please open it to correct errors/warnings in the file and try again."))); + } + if (parsed.result) { + if (!isArray(parsed.result)) { + return Promise.reject(new Error(localize('errorInvalidConfiguration', "Unable to write to the keybindings configuration file. It has an object which is not of type Array. Please open the file to clean up and try again."))); + } + } else { + const content = EOL + '[]'; + this.applyEditsToBuffer({ content, length: content.length, offset: model.getValue().length }, model); + } + } else { + const content = this.getEmptyContent(EOL); + this.applyEditsToBuffer({ content, length: content.length, offset: 0 }, model); + } + return reference; + }); } private parse(model: ITextModel): { result: IUserFriendlyKeybinding[], parseErrors: json.ParseError[] } { 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 0466789663a..d3fecf7080d 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 @@ -21,6 +21,7 @@ import { ITextResourcePropertiesService } from 'vs/editor/common/services/resour import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ConfigurationService } from 'vs/platform/configuration/node/configurationService'; import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { IEnvironmentService, ParsedArgs } from 'vs/platform/environment/common/environment'; import { IFileService } from 'vs/platform/files/common/files'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { IUserFriendlyKeybinding } from 'vs/platform/keybinding/common/keybinding'; @@ -44,8 +45,12 @@ import { FileService } from 'vs/workbench/services/files/common/fileService'; import { Schemas } from 'vs/base/common/network'; import { DiskFileSystemProvider } from 'vs/workbench/services/files/node/diskFileSystemProvider'; import { URI } from 'vs/base/common/uri'; -import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; -import { FileUserDataService } from 'vs/workbench/services/userData/common/fileUserDataService'; +import { UserDataFileSystemProvider } from 'vs/workbench/services/userData/common/userDataFileSystemProvider'; +import { FileUserDataProvider } from 'vs/workbench/services/userData/common/fileUserDataProvider'; +import { WorkbenchEnvironmentService } from 'vs/workbench/services/environment/node/environmentService'; +import { IWindowConfiguration } from 'vs/platform/windows/common/windows'; +import { parseArgs } from 'vs/platform/environment/node/argv'; +import { dirname } from 'vs/base/common/resources'; interface Modifiers { metaKey?: boolean; @@ -54,6 +59,14 @@ interface Modifiers { shiftKey?: boolean; } +class SettingsTestEnvironmentService extends WorkbenchEnvironmentService { + constructor(args: ParsedArgs, _execPath: string, private _appSettingsHome: URI) { + super(args, _execPath); + } + + get appSettingsHome(): URI { return this._appSettingsHome; } +} + suite('KeybindingsEditing', () => { let instantiationService: TestInstantiationService; @@ -67,6 +80,8 @@ suite('KeybindingsEditing', () => { instantiationService = new TestInstantiationService(); + const environmentService = new SettingsTestEnvironmentService(parseArgs(process.argv), process.execPath, URI.file(testDir)); + instantiationService.stub(IEnvironmentService, environmentService); instantiationService.stub(IConfigurationService, ConfigurationService); instantiationService.stub(IConfigurationService, 'getValue', { 'eol': '\n' }); instantiationService.stub(IConfigurationService, 'onDidUpdateConfiguration', () => { }); @@ -84,8 +99,8 @@ suite('KeybindingsEditing', () => { instantiationService.stub(IModelService, instantiationService.createInstance(ModelServiceImpl)); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(dirname(environmentService.keybindingsResource), new FileUserDataProvider(environmentService.appSettingsHome, fileService))); instantiationService.stub(IFileService, fileService); - instantiationService.stub(IUserDataService, new FileUserDataService(URI.file(testDir), fileService)); instantiationService.stub(IUntitledEditorService, instantiationService.createInstance(UntitledEditorService)); instantiationService.stub(ITextFileService, instantiationService.createInstance(TestTextFileService)); instantiationService.stub(ITextModelService, instantiationService.createInstance(TextModelResolverService)); @@ -124,6 +139,13 @@ suite('KeybindingsEditing', () => { error => assert.equal(error.message, 'Unable to write to the keybindings configuration file. Please open it to correct errors/warnings in the file and try again.')); }); + test('errors cases - dirty', () => { + instantiationService.stub(ITextFileService, 'isDirty', true); + return testObject.editKeybinding(aResolvedKeybindingItem({ firstPart: { keyCode: KeyCode.Escape } }), 'alt+c', undefined) + .then(() => assert.fail('Should fail with dirty error'), + error => assert.equal(error.message, 'Unable to write because the keybindings configuration file is dirty. Please save it first and then try again.')); + }); + test('errors cases - did not find an array', () => { fs.writeFileSync(keybindingsFile, '{"key": "alt+c", "command": "hello"}'); return testObject.editKeybinding(aResolvedKeybindingItem({ firstPart: { keyCode: KeyCode.Escape } }), 'alt+c', undefined) diff --git a/src/vs/workbench/services/preferences/browser/preferencesService.ts b/src/vs/workbench/services/preferences/browser/preferencesService.ts index ce7695b8f78..ae0e5cf50f4 100644 --- a/src/vs/workbench/services/preferences/browser/preferencesService.ts +++ b/src/vs/workbench/services/preferences/browser/preferencesService.ts @@ -20,6 +20,7 @@ import { ITextModelService } from 'vs/editor/common/services/resolverService'; import * as nls from 'vs/nls'; import { ConfigurationTarget, IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IEditorOptions } from 'vs/platform/editor/common/editor'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { FileOperationError, FileOperationResult } from 'vs/platform/files/common/files'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; @@ -37,7 +38,6 @@ import { defaultKeybindingsContents, DefaultKeybindingsEditorModel, DefaultSetti import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; -import { IKeybindingEditingService } from '../../keybinding/common/keybindingEditing'; const emptyEditableSettingsContent = '{\n}'; @@ -64,7 +64,7 @@ export class PreferencesService extends Disposable implements IPreferencesServic @INotificationService private readonly notificationService: INotificationService, @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, @IInstantiationService private readonly instantiationService: IInstantiationService, - @IKeybindingEditingService private readonly keybindingEditingService: IKeybindingEditingService, + @IEnvironmentService private readonly environmentService: IEnvironmentService, @ITelemetryService private readonly telemetryService: ITelemetryService, @ITextModelService private readonly textModelResolverService: ITextModelService, @IKeybindingService keybindingService: IKeybindingService, @@ -273,7 +273,7 @@ export class PreferencesService extends Disposable implements IPreferencesServic this.telemetryService.publicLog('openKeybindings', { textual }); if (textual) { const emptyContents = '// ' + nls.localize('emptyKeybindingsHeader', "Place your key bindings in this file to override the defaults") + '\n[\n]'; - const editableKeybindings = this.keybindingEditingService.userKeybindingsResource; + const editableKeybindings = this.environmentService.keybindingsResource; const openDefaultKeybindings = !!this.configurationService.getValue('workbench.settings.openDefaultKeybindings'); // Create as needed and open in editor @@ -524,9 +524,9 @@ export class PreferencesService extends Disposable implements IPreferencesServic switch (configurationTarget) { case ConfigurationTarget.USER: case ConfigurationTarget.USER_LOCAL: - return this.configurationService.userSettingsResource; + return this.environmentService.settingsResource; case ConfigurationTarget.USER_REMOTE: - return this.configurationService.userSettingsResource; + return this.environmentService.settingsResource; case ConfigurationTarget.WORKSPACE: if (this.contextService.getWorkbenchState() === WorkbenchState.EMPTY) { return null; @@ -629,4 +629,4 @@ export class PreferencesService extends Disposable implements IPreferencesServic } } -registerSingleton(IPreferencesService, PreferencesService); \ No newline at end of file +registerSingleton(IPreferencesService, PreferencesService); diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts index 60c009b6b56..9a70fd94b6a 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts @@ -30,8 +30,6 @@ import { ILogService } from 'vs/platform/log/common/log'; import { isEqual, isEqualOrParent, extname, basename, joinPath } from 'vs/base/common/resources'; import { onUnexpectedError } from 'vs/base/common/errors'; import { Schemas } from 'vs/base/common/network'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IKeybindingEditingService } from 'vs/workbench/services/keybinding/common/keybindingEditing'; export interface IBackupMetaData { mtime: number; @@ -106,9 +104,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil @IBackupFileService private readonly backupFileService: IBackupFileService, @IEnvironmentService private readonly environmentService: IEnvironmentService, @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, - @ILogService private readonly logService: ILogService, - @IConfigurationService private readonly configurationService: IConfigurationService, - @IKeybindingEditingService private readonly keybindingEditingService: IKeybindingEditingService + @ILogService private readonly logService: ILogService ) { super(modelService, modeService); @@ -779,12 +775,12 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil } // Check for global settings file - if (isEqual(this.resource, this.configurationService.userSettingsResource, !isLinux)) { + if (isEqual(this.resource, this.environmentService.settingsResource, !isLinux)) { return 'global-settings'; } // Check for keybindings file - if (isEqual(this.resource, this.keybindingEditingService.userKeybindingsResource, !isLinux)) { + if (isEqual(this.resource, this.environmentService.keybindingsResource, !isLinux)) { return 'keybindings'; } diff --git a/src/vs/workbench/services/userData/common/customUserDataService.ts b/src/vs/workbench/services/userData/common/customUserDataService.ts deleted file mode 100644 index 491d2a9a319..00000000000 --- a/src/vs/workbench/services/userData/common/customUserDataService.ts +++ /dev/null @@ -1,45 +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 { Event, Emitter } from 'vs/base/common/event'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { IUserDataService, IUserDataChangesEvent, IUserDataProvider, UserDataChangesEvent } from 'vs/workbench/services/userData/common/userData'; -import { URI } from 'vs/base/common/uri'; -import { Schemas } from 'vs/base/common/network'; -import { joinPath, relativePath } from 'vs/base/common/resources'; - -export class CustomUserDataService extends Disposable implements IUserDataService { - _serviceBrand: any; - - private readonly userDataHome: URI; - - private _onDidChange: Emitter = this._register(new Emitter()); - readonly onDidChange: Event = this._onDidChange.event; - - constructor( - private readonly userDataProvider: IUserDataProvider - ) { - super(); - this.userDataHome = URI.file('/User').with({ scheme: Schemas.userData }); - this._register(this.userDataProvider.onDidChange(key => this._onDidChange.fire(new UserDataChangesEvent([key])))); - } - - read(key: string): Promise { - return this.userDataProvider.read(key); - } - - write(key: string, value: string): Promise { - return this.userDataProvider.write(key, value); - } - - toResource(key: string): URI { - return joinPath(this.userDataHome, key); - } - - toKey(resource: URI): string | undefined { - return relativePath(this.userDataHome, resource); - } - -} \ No newline at end of file diff --git a/src/vs/workbench/services/userData/common/fileUserDataService.ts b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts similarity index 54% rename from src/vs/workbench/services/userData/common/fileUserDataService.ts rename to src/vs/workbench/services/userData/common/fileUserDataProvider.ts index ae44e1e5989..61f01d2f1eb 100644 --- a/src/vs/workbench/services/userData/common/fileUserDataService.ts +++ b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts @@ -5,18 +5,16 @@ import { Event, Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; -import { IUserDataService, IUserDataChangesEvent, UserDataChangesEvent } from 'vs/workbench/services/userData/common/userData'; +import { IUserDataProvider } from 'vs/workbench/services/userData/common/userData'; import { IFileService, FileChangesEvent } from 'vs/platform/files/common/files'; import { URI } from 'vs/base/common/uri'; import * as resources from 'vs/base/common/resources'; import { VSBuffer } from 'vs/base/common/buffer'; -import { Schemas } from 'vs/base/common/network'; -export class FileUserDataService extends Disposable implements IUserDataService { - _serviceBrand: any; +export class FileUserDataProvider extends Disposable implements IUserDataProvider { - private _onDidChange: Emitter = this._register(new Emitter()); - readonly onDidChange: Event = this._onDidChange.event; + private _onDidChangeFile: Emitter = this._register(new Emitter()); + readonly onDidChangeFile: Event = this._onDidChangeFile.event; constructor( private readonly userDataHome: URI, @@ -32,46 +30,50 @@ export class FileUserDataService extends Disposable implements IUserDataService private handleFileChanges(event: FileChangesEvent): void { const changedKeys: string[] = []; for (const change of event.changes) { - if (change.resource.scheme !== Schemas.userData) { - const key = this.toKey(change.resource.with({ scheme: Schemas.userData })); + if (change.resource.scheme !== this.userDataHome.scheme) { + const key = this.toKey(change.resource); if (key) { changedKeys.push(key); } } } if (changedKeys.length) { - this._onDidChange.fire(new UserDataChangesEvent(changedKeys)); + this._onDidChangeFile.fire(changedKeys); } } - async read(key: string): Promise { - const resource = this.toFileResource(key); + async readFile(path: string): Promise { + const resource = this.toResource(path); try { const content = await this.fileService.readFile(resource); - return content.value.toString(); + return content.value; } catch (e) { const exists = await this.fileService.exists(resource); if (exists) { throw e; } } - return ''; + return VSBuffer.fromString(''); } - write(key: string, value: string): Promise { - return this.fileService.writeFile(this.toFileResource(key), VSBuffer.fromString(value)).then(() => undefined); + writeFile(path: string, value: VSBuffer): Promise { + return this.fileService.writeFile(this.toResource(path), value).then(() => undefined); } - private toFileResource(key: string): URI { + async readDirectory(path: string): Promise { + const result = await this.fileService.resolve(this.toResource(path)); + return result.children ? result.children.map(c => this.toKey(c.resource)!) : []; + } + + delete(path: string): Promise { + return this.fileService.del(this.toResource(path)); + } + + private toResource(key: string): URI { return resources.joinPath(this.userDataHome, ...key.split('/')); } - toResource(key: string): URI { - return this.toFileResource(key).with({ scheme: Schemas.userData }); + private toKey(resource: URI): string | undefined { + return resources.relativePath(this.userDataHome, resource); } - - toKey(resource: URI): string | undefined { - return resources.relativePath(this.userDataHome.with({ scheme: Schemas.userData }), resource); - } - } \ No newline at end of file diff --git a/src/vs/workbench/services/userData/common/inMemoryUserDataProvider.ts b/src/vs/workbench/services/userData/common/inMemoryUserDataProvider.ts index e4961722ae4..844430bbaf3 100644 --- a/src/vs/workbench/services/userData/common/inMemoryUserDataProvider.ts +++ b/src/vs/workbench/services/userData/common/inMemoryUserDataProvider.ts @@ -6,12 +6,13 @@ import { Event, Emitter } from 'vs/base/common/event'; import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; import { IUserDataProvider } from 'vs/workbench/services/userData/common/userData'; +import { VSBuffer } from 'vs/base/common/buffer'; export class InMemoryUserDataProvider extends Disposable implements IUserDataProvider { _serviceBrand: any; - private _onDidChange: Emitter = this._register(new Emitter()); - readonly onDidChange: Event = this._onDidChange.event; + private _onDidChangeFile: Emitter = this._register(new Emitter()); + readonly onDidChangeFile: Event = this._onDidChangeFile.event; private readonly store: Map = new Map(); @@ -20,18 +21,30 @@ export class InMemoryUserDataProvider extends Disposable implements IUserDataPro this._register(toDisposable(() => this.store.clear())); } - async read(key: string): Promise { - return this.getValue(key); + async readDirectory(path: string): Promise { + return []; } - async write(key: string, value: string): Promise { - if (value !== this.getValue(key)) { - if (value) { - this.store.set(key, value); + async readFile(path: string): Promise { + return VSBuffer.fromString(this.getValue(path)); + } + + async writeFile(path: string, value: VSBuffer): Promise { + const content = value.toString(); + if (content !== this.getValue(path)) { + if (content) { + this.store.set(path, content); + this._onDidChangeFile.fire([path]); } else { - this.store.delete(key); + this.delete(path); } - this._onDidChange.fire(key); + } + } + + async delete(path: string): Promise { + if (this.store.has(path)) { + this.store.delete(path); + this._onDidChangeFile.fire([path]); } } diff --git a/src/vs/workbench/services/userData/common/userData.ts b/src/vs/workbench/services/userData/common/userData.ts index aba73a83f61..f117d58b13d 100644 --- a/src/vs/workbench/services/userData/common/userData.ts +++ b/src/vs/workbench/services/userData/common/userData.ts @@ -3,60 +3,18 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { Event } from 'vs/base/common/event'; -import { URI } from 'vs/base/common/uri'; -import { TernarySearchTree } from 'vs/base/common/map'; - -export const IUserDataService = createDecorator('userDataService'); - -export interface IUserDataChangesEvent { - keys: string[]; - contains(keyOrSegment: string): boolean; -} - -export interface IUserDataService { - _serviceBrand: any; - - onDidChange: Event; - - toResource(key: string): URI; - - toKey(resource: URI): string | undefined; - - read(key: string): Promise; - - write(key: string, value: string): Promise; -} +import { VSBuffer } from 'vs/base/common/buffer'; export interface IUserDataProvider { - onDidChange: Event; + onDidChangeFile: Event; - read(key: string): Promise; + readFile(path: string): Promise; - write(key: string, value: string): Promise; + readDirectory(path: string): Promise; -} - -export class UserDataChangesEvent implements IUserDataChangesEvent { - - private _keysTree: TernarySearchTree | undefined = undefined; - - constructor(readonly keys: string[]) { } - - private get keysTree(): TernarySearchTree { - if (!this._keysTree) { - this._keysTree = TernarySearchTree.forPaths(); - for (const key of this.keys) { - this._keysTree.set(key, key); - } - } - return this._keysTree; - } - - contains(keyOrSegment: string): boolean { - return this.keysTree.findSubstr(keyOrSegment) !== undefined; - } + writeFile(path: string, content: VSBuffer): Promise; + delete(path: string): Promise; } \ No newline at end of file diff --git a/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts b/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts index 8b39afee00f..88b54acb2cc 100644 --- a/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts +++ b/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts @@ -5,14 +5,16 @@ import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; import { FileSystemProviderCapabilities, FileWriteOptions, IStat, FileType, FileDeleteOptions, IWatchOptions, FileOverwriteOptions, IFileSystemProviderWithFileReadWriteCapability, IFileChange, FileChangesEvent, FileChangeType } from 'vs/platform/files/common/files'; -import { IUserDataService } from 'vs/workbench/services/userData/common/userData'; +import { IUserDataProvider } from 'vs/workbench/services/userData/common/userData'; import { URI } from 'vs/base/common/uri'; import { VSBuffer } from 'vs/base/common/buffer'; import { Event, Emitter } from 'vs/base/common/event'; +import * as resources from 'vs/base/common/resources'; +import { TernarySearchTree } from 'vs/base/common/map'; export class UserDataFileSystemProvider extends Disposable implements IFileSystemProviderWithFileReadWriteCapability { - constructor(private readonly userDataService: IUserDataService) { super(); } + private readonly versions: Map = new Map(); readonly capabilities: FileSystemProviderCapabilities = FileSystemProviderCapabilities.FileReadWrite; readonly onDidChangeCapabilities: Event = Event.None; @@ -20,53 +22,93 @@ export class UserDataFileSystemProvider extends Disposable implements IFileSyste private readonly _onDidChangeFile: Emitter = this._register(new Emitter()); readonly onDidChangeFile: Event = this._onDidChangeFile.event; - private versions: Map = new Map(); + + constructor( + private readonly userDataHome: URI, + private readonly userDataProvider: IUserDataProvider + ) { + super(); + } watch(resource: URI, opts: IWatchOptions): IDisposable { - const key = this.userDataService.toKey(resource); - if (!key) { + const path = this.toPath(resource); + if (!path) { throw new Error(`Invalud user data resource ${resource}`); } - return this.userDataService.onDidChange(e => { - if (e.contains(key)) { - this.versions.set(key, (this.versions.get(key) || 1) + 1); + return this.userDataProvider.onDidChangeFile(e => { + if (new UserDataChangesEvent(e).contains(path)) { + this.versions.set(path, (this.versions.get(path) || 1) + 1); this._onDidChangeFile.fire(new FileChangesEvent([{ resource, type: FileChangeType.UPDATED }]).changes); } }); } async stat(resource: URI): Promise { - const key = this.userDataService.toKey(resource); - if (!key) { + const path = this.toPath(resource); + if (!path) { throw new Error(`Invalud user data resource ${resource}`); } return { type: FileType.File, ctime: 0, - mtime: this.versions.get(key) || 0, + mtime: this.versions.get(path) || 0, size: 0 }; } - mkdir(resource: URI): Promise { throw new Error('not supported'); } - readdir(resource: URI): Promise<[string, FileType][]> { throw new Error('not supported'); } - delete(resource: URI, opts: FileDeleteOptions): Promise { throw new Error('not supported'); } + mkdir(resource: URI): Promise { throw new Error('not supported'); } + delete(resource: URI, opts: FileDeleteOptions): Promise { throw new Error('not supported'); } rename(from: URI, to: URI, opts: FileOverwriteOptions): Promise { throw new Error('not supported'); } async readFile(resource: URI): Promise { - const key = this.userDataService.toKey(resource); - if (!key) { + const path = this.toPath(resource); + if (!path) { throw new Error(`Invalud user data resource ${resource}`); } - const content = await this.userDataService.read(key); - return VSBuffer.fromString(content).buffer; + const content = await this.userDataProvider.readFile(path); + return content.buffer; + } + + async readdir(resource: URI): Promise<[string, FileType][]> { + const path = this.toPath(resource); + if (!path) { + throw new Error(`Invalud user data resource ${resource}`); + } + const children = await this.userDataProvider.readDirectory(path); + return children.map(c => [c, FileType.Unknown]); } writeFile(resource: URI, content: Uint8Array, opts: FileWriteOptions): Promise { - const key = this.userDataService.toKey(resource); - if (!key) { + const path = this.toPath(resource); + if (!path) { throw new Error(`Invalud user data resource ${resource}`); } - return this.userDataService.write(key, VSBuffer.wrap(content).toString()); + return this.userDataProvider.writeFile(path, VSBuffer.wrap(content)); } + + private toPath(resource: URI): string | undefined { + return resources.relativePath(this.userDataHome, resource); + } +} + +class UserDataChangesEvent { + + private _pathsTree: TernarySearchTree | undefined = undefined; + + constructor(readonly paths: string[]) { } + + private get pathsTree(): TernarySearchTree { + if (!this._pathsTree) { + this._pathsTree = TernarySearchTree.forPaths(); + for (const path of this.paths) { + this._pathsTree.set(path, path); + } + } + return this._pathsTree; + } + + contains(keyOrSegment: string): boolean { + return this.pathsTree.findSubstr(keyOrSegment) !== undefined; + } + } \ No newline at end of file From b29d860226c259392066bd471de9bedbdb7a0838 Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Mon, 24 Jun 2019 15:26:34 +0200 Subject: [PATCH 0569/1449] node-debug@1.35.3 --- build/builtInExtensions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/builtInExtensions.json b/build/builtInExtensions.json index ed6d6c2662d..7f1c9fd2f6f 100644 --- a/build/builtInExtensions.json +++ b/build/builtInExtensions.json @@ -1,7 +1,7 @@ [ { "name": "ms-vscode.node-debug", - "version": "1.35.2", + "version": "1.35.3", "repo": "https://github.com/Microsoft/vscode-node-debug", "metadata": { "id": "b6ded8fb-a0a0-4c1c-acbd-ab2a3bc995a6", From 6b781c7c26c895290a30f31c4d917ce854ef2d2c Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 24 Jun 2019 15:32:42 +0200 Subject: [PATCH 0570/1449] remove user data service --- src/vs/workbench/browser/web.main.ts | 12 +-- src/vs/workbench/electron-browser/main.ts | 12 +-- .../configuration/browser/configuration.ts | 55 ++--------- .../browser/configurationService.ts | 8 +- .../configurationEditingService.test.ts | 4 +- .../configurationService.test.ts | 35 +++---- .../userData/common/fileUserDataService.ts | 93 ------------------- .../userData/common/userDataService.ts | 32 ------- 8 files changed, 33 insertions(+), 218 deletions(-) delete mode 100644 src/vs/workbench/services/userData/common/fileUserDataService.ts delete mode 100644 src/vs/workbench/services/userData/common/userDataService.ts diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index 9b4051ac410..1986fb66422 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -35,8 +35,6 @@ import { SignService } from 'vs/platform/sign/browser/signService'; import { hash } from 'vs/base/common/hash'; import { IWorkbenchConstructionOptions } from 'vs/workbench/workbench.web.api'; import { ProductService } from 'vs/platform/product/browser/productService'; -import { FileUserDataService } from '../services/userData/common/fileUserDataService'; -import { IUserDataService } from '../services/userData/common/userDataService'; class CodeRendererMain extends Disposable { @@ -119,14 +117,10 @@ class CodeRendererMain extends Disposable { fileService.registerProvider(Schemas.vscodeRemote, remoteFileSystemProvider); } - // User Data Service - const userDataService = this._register(new FileUserDataService(environmentService, fileService)); - serviceCollection.set(IUserDataService, userDataService); - const payload = await this.resolveWorkspaceInitializationPayload(); await Promise.all([ - this.createWorkspaceService(payload, environmentService, fileService, userDataService, remoteAgentService, logService).then(service => { + this.createWorkspaceService(payload, environmentService, fileService, remoteAgentService, logService).then(service => { // Workspace serviceCollection.set(IWorkspaceContextService, service); @@ -141,8 +135,8 @@ class CodeRendererMain extends Disposable { return { serviceCollection, logService }; } - private async createWorkspaceService(payload: IWorkspaceInitializationPayload, environmentService: IWorkbenchEnvironmentService, fileService: FileService, userDataService: IUserDataService, remoteAgentService: IRemoteAgentService, logService: ILogService): Promise { - const workspaceService = new WorkspaceService({ remoteAuthority: this.configuration.remoteAuthority, configurationCache: new ConfigurationCache() }, fileService, userDataService, remoteAgentService); + private async createWorkspaceService(payload: IWorkspaceInitializationPayload, environmentService: IWorkbenchEnvironmentService, fileService: FileService, remoteAgentService: IRemoteAgentService, logService: ILogService): Promise { + const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, remoteAuthority: this.configuration.remoteAuthority, configurationCache: new ConfigurationCache() }, fileService, remoteAgentService); try { await workspaceService.initialize(payload); diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index 2d11615deb9..87259d771c9 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -50,8 +50,6 @@ import { ConfigurationCache } from 'vs/workbench/services/configuration/node/con import { SpdLogService } from 'vs/platform/log/node/spdlogService'; import { SignService } from 'vs/platform/sign/node/signService'; import { ISignService } from 'vs/platform/sign/common/sign'; -import { IUserDataService } from '../services/userData/common/userDataService'; -import { FileUserDataService } from '../services/userData/common/fileUserDataService'; class CodeRendererMain extends Disposable { @@ -207,14 +205,10 @@ class CodeRendererMain extends Disposable { fileService.registerProvider(Schemas.vscodeRemote, remoteFileSystemProvider); } - // User Data Service - const userDataService = this._register(new FileUserDataService(environmentService, fileService)); - serviceCollection.set(IUserDataService, userDataService); - const payload = await this.resolveWorkspaceInitializationPayload(environmentService); const services = await Promise.all([ - this.createWorkspaceService(payload, environmentService, fileService, userDataService, remoteAgentService, logService).then(service => { + this.createWorkspaceService(payload, environmentService, fileService, remoteAgentService, logService).then(service => { // Workspace serviceCollection.set(IWorkspaceContextService, service); @@ -310,8 +304,8 @@ class CodeRendererMain extends Disposable { return; } - private async createWorkspaceService(payload: IWorkspaceInitializationPayload, environmentService: IWorkbenchEnvironmentService, fileService: FileService, userDataService: IUserDataService, remoteAgentService: IRemoteAgentService, logService: ILogService): Promise { - const workspaceService = new WorkspaceService({ remoteAuthority: this.configuration.remoteAuthority, configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); + private async createWorkspaceService(payload: IWorkspaceInitializationPayload, environmentService: IWorkbenchEnvironmentService, fileService: FileService, remoteAgentService: IRemoteAgentService, logService: ILogService): Promise { + const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, remoteAuthority: this.configuration.remoteAuthority, configurationCache: new ConfigurationCache(environmentService) }, fileService, remoteAgentService); try { await workspaceService.initialize(payload); diff --git a/src/vs/workbench/services/configuration/browser/configuration.ts b/src/vs/workbench/services/configuration/browser/configuration.ts index 14bade52756..a2f76032809 100644 --- a/src/vs/workbench/services/configuration/browser/configuration.ts +++ b/src/vs/workbench/services/configuration/browser/configuration.ts @@ -12,7 +12,7 @@ import { RunOnceScheduler } from 'vs/base/common/async'; import { FileChangeType, FileChangesEvent } from 'vs/platform/files/common/files'; import { ConfigurationModel, ConfigurationModelParser } from 'vs/platform/configuration/common/configurationModels'; import { WorkspaceConfigurationModelParser, StandaloneConfigurationModelParser } from 'vs/workbench/services/configuration/common/configurationModels'; -import { FOLDER_SETTINGS_PATH, TASKS_CONFIGURATION_KEY, FOLDER_SETTINGS_NAME, LAUNCH_CONFIGURATION_KEY, IConfigurationCache, ConfigurationKey, REMOTE_MACHINE_SCOPES, FOLDER_SCOPES, WORKSPACE_SCOPES, USER_CONFIGURATION_KEY, ConfigurationFileService } from 'vs/workbench/services/configuration/common/configuration'; +import { FOLDER_SETTINGS_PATH, TASKS_CONFIGURATION_KEY, FOLDER_SETTINGS_NAME, LAUNCH_CONFIGURATION_KEY, IConfigurationCache, ConfigurationKey, REMOTE_MACHINE_SCOPES, FOLDER_SCOPES, WORKSPACE_SCOPES, ConfigurationFileService } from 'vs/workbench/services/configuration/common/configuration'; import { IStoredWorkspaceFolder, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { JSONEditingService } from 'vs/workbench/services/configuration/common/jsonEditingService'; import { WorkbenchState, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; @@ -23,51 +23,12 @@ import { Schemas } from 'vs/base/common/network'; import { IConfigurationModel } from 'vs/platform/configuration/common/configuration'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { hash } from 'vs/base/common/hash'; -import { IUserDataService } from '../../userData/common/userDataService'; - -export class UserConfiguration extends Disposable { - - private readonly parser: ConfigurationModelParser; - private readonly reloadConfigurationScheduler: RunOnceScheduler; - protected readonly _onDidChangeConfiguration: Emitter = this._register(new Emitter()); - readonly onDidChangeConfiguration: Event = this._onDidChangeConfiguration.event; - - constructor( - private readonly scopes: ConfigurationScope[] | undefined, - private readonly userDataService: IUserDataService - ) { - super(); - - this.parser = new ConfigurationModelParser(USER_CONFIGURATION_KEY, this.scopes); - this.reloadConfigurationScheduler = this._register(new RunOnceScheduler(() => this.reload().then(configurationModel => this._onDidChangeConfiguration.fire(configurationModel)), 50)); - this._register(Event.filter(this.userDataService.onDidChange, e => e.contains(USER_CONFIGURATION_KEY))(() => this.reloadConfigurationScheduler.schedule())); - } - - async initialize(): Promise { - return this.reload(); - } - - async reload(): Promise { - try { - const content = (await this.userDataService.read(USER_CONFIGURATION_KEY)) || '{}'; - this.parser.parseContent(content); - return this.parser.configurationModel; - } catch (e) { - return new ConfigurationModel(); - } - } - - reprocess(): ConfigurationModel { - this.parser.parse(); - return this.parser.configurationModel; - } -} export class RemoteUserConfiguration extends Disposable { - private readonly _cachedConfiguration: CachedRemoteUserConfiguration; + private readonly _cachedConfiguration: CachedUserConfiguration; private readonly _configurationFileService: ConfigurationFileService; - private _userConfiguration: FileServiceBasedRemoteUserConfiguration | CachedRemoteUserConfiguration; + private _userConfiguration: UserConfiguration | CachedUserConfiguration; private _userConfigurationInitializationPromise: Promise | null = null; private readonly _onDidChangeConfiguration: Emitter = this._register(new Emitter()); @@ -81,10 +42,10 @@ export class RemoteUserConfiguration extends Disposable { ) { super(); this._configurationFileService = configurationFileService; - this._userConfiguration = this._cachedConfiguration = new CachedRemoteUserConfiguration(remoteAuthority, configurationCache); + this._userConfiguration = this._cachedConfiguration = new CachedUserConfiguration(remoteAuthority, configurationCache); remoteAgentService.getEnvironment().then(async environment => { if (environment) { - const userConfiguration = this._register(new FileServiceBasedRemoteUserConfiguration(environment.settingsPath, REMOTE_MACHINE_SCOPES, this._configurationFileService)); + const userConfiguration = this._register(new UserConfiguration(environment.settingsPath, REMOTE_MACHINE_SCOPES, this._configurationFileService)); this._register(userConfiguration.onDidChangeConfiguration(configurationModel => this.onDidUserConfigurationChange(configurationModel))); this._userConfigurationInitializationPromise = userConfiguration.initialize(); const configurationModel = await this._userConfigurationInitializationPromise; @@ -96,7 +57,7 @@ export class RemoteUserConfiguration extends Disposable { } async initialize(): Promise { - if (this._userConfiguration instanceof FileServiceBasedRemoteUserConfiguration) { + if (this._userConfiguration instanceof UserConfiguration) { return this._userConfiguration.initialize(); } @@ -129,7 +90,7 @@ export class RemoteUserConfiguration extends Disposable { } } -class FileServiceBasedRemoteUserConfiguration extends Disposable { +export class UserConfiguration extends Disposable { private readonly parser: ConfigurationModelParser; private readonly reloadConfigurationScheduler: RunOnceScheduler; @@ -229,7 +190,7 @@ class FileServiceBasedRemoteUserConfiguration extends Disposable { } } -class CachedRemoteUserConfiguration extends Disposable { +class CachedUserConfiguration extends Disposable { private readonly _onDidChange: Emitter = this._register(new Emitter()); readonly onDidChange: Event = this._onDidChange.event; diff --git a/src/vs/workbench/services/configuration/browser/configurationService.ts b/src/vs/workbench/services/configuration/browser/configurationService.ts index bf934755350..0152a86f84a 100644 --- a/src/vs/workbench/services/configuration/browser/configurationService.ts +++ b/src/vs/workbench/services/configuration/browser/configurationService.ts @@ -29,7 +29,6 @@ import { isEqual, dirname } from 'vs/base/common/resources'; import { mark } from 'vs/base/common/performance'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { IFileService } from 'vs/platform/files/common/files'; -import { IUserDataService } from 'vs/workbench/services/userData/common/userDataService'; export class WorkspaceService extends Disposable implements IConfigurationService, IWorkspaceContextService { @@ -68,10 +67,9 @@ export class WorkspaceService extends Disposable implements IConfigurationServic private cyclicDependency = new Promise(resolve => this.cyclicDependencyReady = resolve); constructor( - { remoteAuthority, configurationCache }: { remoteAuthority?: string, configurationCache: IConfigurationCache }, + { userSettingsResource, remoteAuthority, configurationCache }: { userSettingsResource: URI, remoteAuthority?: string, configurationCache: IConfigurationCache }, fileService: IFileService, - userDataService: IUserDataService, - remoteAgentService: IRemoteAgentService + remoteAgentService: IRemoteAgentService, ) { super(); @@ -81,7 +79,7 @@ export class WorkspaceService extends Disposable implements IConfigurationServic this.configurationFileService = new ConfigurationFileService(fileService); this._configuration = new Configuration(this.defaultConfiguration, new ConfigurationModel(), new ConfigurationModel(), new ConfigurationModel(), new ResourceMap(), new ConfigurationModel(), new ResourceMap(), this.workspace); this.cachedFolderConfigs = new ResourceMap(); - this.localUserConfiguration = this._register(new UserConfiguration(remoteAuthority ? LOCAL_MACHINE_SCOPES : undefined, userDataService)); + this.localUserConfiguration = this._register(new UserConfiguration(userSettingsResource, remoteAuthority ? LOCAL_MACHINE_SCOPES : undefined, this.configurationFileService)); this._register(this.localUserConfiguration.onDidChangeConfiguration(userConfiguration => this.onLocalUserConfigurationChanged(userConfiguration))); if (remoteAuthority) { this.remoteUserConfiguration = this._register(new RemoteUserConfiguration(remoteAuthority, configurationCache, this.configurationFileService, remoteAgentService)); 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 f94f09794b4..64b5b994371 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 @@ -39,7 +39,6 @@ import { Schemas } from 'vs/base/common/network'; import { DiskFileSystemProvider } from 'vs/workbench/services/files/node/diskFileSystemProvider'; import { IFileService } from 'vs/platform/files/common/files'; import { ConfigurationCache } from 'vs/workbench/services/configuration/node/configurationCache'; -import { FileUserDataService } from 'vs/workbench/services/userData/common/fileUserDataService'; class SettingsTestEnvironmentService extends EnvironmentService { @@ -108,8 +107,7 @@ suite('ConfigurationEditingService', () => { fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); instantiationService.stub(IFileService, fileService); instantiationService.stub(IRemoteAgentService, remoteAgentService); - const userDataService = new FileUserDataService(environmentService, fileService); - const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); + const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); return workspaceService.initialize(noWorkspace ? { id: '' } : { folder: URI.file(workspaceDir), id: createHash('md5').update(URI.file(workspaceDir).toString()).digest('hex') }).then(() => { instantiationService.stub(IConfigurationService, workspaceService); 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 3e1e4be3e3c..cbd400263ee 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 @@ -31,7 +31,7 @@ import { IJSONEditingService } from 'vs/workbench/services/configuration/common/ import { JSONEditingService } from 'vs/workbench/services/configuration/common/jsonEditingService'; import { createHash } from 'crypto'; import { Schemas } from 'vs/base/common/network'; -import { originalFSPath, dirname } from 'vs/base/common/resources'; +import { originalFSPath } from 'vs/base/common/resources'; import { isLinux } from 'vs/base/common/platform'; import { IWindowConfiguration } from 'vs/platform/windows/common/windows'; import { RemoteAgentService } from 'vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl'; @@ -45,16 +45,14 @@ import { IRemoteAgentEnvironment } from 'vs/platform/remote/common/remoteAgentEn import { IConfigurationCache } from 'vs/workbench/services/configuration/common/configuration'; import { VSBuffer } from 'vs/base/common/buffer'; import { SignService } from 'vs/platform/sign/browser/signService'; -import { FileUserDataService } from 'vs/workbench/services/userData/common/fileUserDataService'; class SettingsTestEnvironmentService extends EnvironmentService { - constructor(args: ParsedArgs, _execPath: string, private _settingsPath: string) { + constructor(args: ParsedArgs, _execPath: string, private customAppSettingsHome: string) { super(args, _execPath); } - get appSettingsHome(): URI { return dirname(this.settingsResource); } - get settingsResource(): URI { return URI.file(this._settingsPath); } + get settingsResource(): URI { return URI.file(this.customAppSettingsHome); } } function setUpFolderWorkspace(folderName: string): Promise<{ parentDir: string, folderDir: string }> { @@ -105,9 +103,7 @@ suite('WorkspaceContextService - Folder', () => { workspaceResource = folderDir; const globalSettingsFile = path.join(parentDir, 'settings.json'); const environmentService = new SettingsTestEnvironmentService(parseArgs(process.argv), process.execPath, globalSettingsFile); - const fileService = new FileService(new NullLogService()); - const userDataService = new FileUserDataService(environmentService, fileService); - workspaceContextService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, new RemoteAgentService({}, environmentService, new RemoteAuthorityResolverService(), new SignService())); + workspaceContextService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, new FileService(new NullLogService()), new RemoteAgentService({}, environmentService, new RemoteAuthorityResolverService(), new SignService())); return (workspaceContextService).initialize(convertToWorkspacePayload(URI.file(folderDir))); }); }); @@ -171,8 +167,7 @@ suite('WorkspaceContextService - Workspace', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const userDataService = new FileUserDataService(environmentService, fileService); - const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); + const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); @@ -230,8 +225,8 @@ suite('WorkspaceContextService - Workspace Editing', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const userDataService = new FileUserDataService(environmentService, fileService); - const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); + const configurationFileService = fileService; + const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, configurationFileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); @@ -490,8 +485,8 @@ suite('WorkspaceService - Initialization', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const userDataService = new FileUserDataService(environmentService, fileService); - const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); + const configurationFileService = fileService; + const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, configurationFileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); instantiationService.stub(IEnvironmentService, environmentService); @@ -753,8 +748,8 @@ suite('WorkspaceConfigurationService - Folder', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const userDataService = new FileUserDataService(environmentService, fileService); - const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); + const configurationFileService = fileService; + const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, configurationFileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); instantiationService.stub(IEnvironmentService, environmentService); @@ -1080,8 +1075,8 @@ suite('WorkspaceConfigurationService-Multiroot', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - const userDataService = new FileUserDataService(environmentService, fileService); - const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, fileService, userDataService, remoteAgentService); + const configurationFileService = fileService; + const workspaceService = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache: new ConfigurationCache(environmentService) }, configurationFileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); @@ -1481,9 +1476,9 @@ suite('WorkspaceConfigurationService - Remote Folder', () => { const remoteAgentService = instantiationService.stub(IRemoteAgentService, >{ getEnvironment: () => remoteEnvironmentPromise }); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, diskFileSystemProvider); + const configurationFileService = fileService; const configurationCache: IConfigurationCache = { read: () => Promise.resolve(''), write: () => Promise.resolve(), remove: () => Promise.resolve() }; - const userDataService = new FileUserDataService(environmentService, fileService); - testObject = new WorkspaceService({ configurationCache, remoteAuthority }, fileService, userDataService, remoteAgentService); + testObject = new WorkspaceService({ userSettingsResource: environmentService.settingsResource, configurationCache, remoteAuthority }, configurationFileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, testObject); instantiationService.stub(IConfigurationService, testObject); instantiationService.stub(IEnvironmentService, environmentService); diff --git a/src/vs/workbench/services/userData/common/fileUserDataService.ts b/src/vs/workbench/services/userData/common/fileUserDataService.ts deleted file mode 100644 index 6096274dc6d..00000000000 --- a/src/vs/workbench/services/userData/common/fileUserDataService.ts +++ /dev/null @@ -1,93 +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 { Event, Emitter } from 'vs/base/common/event'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { IUserDataService, IUserDataChangesEvent } from './userDataService'; -import { IFileService, FileChangesEvent } from 'vs/platform/files/common/files'; -import { URI } from 'vs/base/common/uri'; -import * as resources from 'vs/base/common/resources'; -import { TernarySearchTree } from 'vs/base/common/map'; -import { VSBuffer } from 'vs/base/common/buffer'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; - -export class FileUserDataService extends Disposable implements IUserDataService { - _serviceBrand: any; - - private readonly settingsHome: URI; - - private _onDidChange: Emitter = this._register(new Emitter()); - readonly onDidChange: Event = this._onDidChange.event; - - constructor( - @IEnvironmentService environmentService: IEnvironmentService, - @IFileService private readonly fileService: IFileService - ) { - super(); - // Assumption: This path always exists - this.settingsHome = environmentService.appSettingsHome; - this.fileService.watch(this.settingsHome); - - this._register(this.fileService.onFileChanges(e => this.handleFileChanges(e))); - } - - private handleFileChanges(event: FileChangesEvent): void { - const changedKeys: string[] = []; - for (const change of event.changes) { - const key = resources.relativePath(this.settingsHome, change.resource); - if (key) { - changedKeys.push(key); - } - } - if (changedKeys.length) { - this._onDidChange.fire(new UserDataChangesEvent(changedKeys)); - } - } - - async read(key: string): Promise { - const resource = this.toResource(key); - try { - const content = await this.fileService.readFile(resource); - return content.value.toString(); - } catch (e) { - const exists = await this.fileService.exists(resource); - if (exists) { - throw e; - } - } - return ''; - } - - write(key: string, value: string): Promise { - return this.fileService.writeFile(this.toResource(key), VSBuffer.fromString(value)).then(() => undefined); - } - - private toResource(key: string): URI { - return resources.joinPath(this.settingsHome, ...key.split('/')); - } - -} - -class UserDataChangesEvent implements IUserDataChangesEvent { - - private _keysTree: TernarySearchTree | undefined = undefined; - - constructor(readonly keys: string[]) { } - - private get keysTree(): TernarySearchTree { - if (!this._keysTree) { - this._keysTree = TernarySearchTree.forPaths(); - for (const key of this.keys) { - this._keysTree.set(key, key); - } - } - return this._keysTree; - } - - contains(keyOrSegment: string): boolean { - return this.keysTree.findSubstr(keyOrSegment) !== undefined; - } - -} \ No newline at end of file diff --git a/src/vs/workbench/services/userData/common/userDataService.ts b/src/vs/workbench/services/userData/common/userDataService.ts deleted file mode 100644 index 81c8b5dfd76..00000000000 --- a/src/vs/workbench/services/userData/common/userDataService.ts +++ /dev/null @@ -1,32 +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 { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { Event } from 'vs/base/common/event'; - -export const IUserDataService = createDecorator('userDataService'); - -export interface IUserDataChangesEvent { - keys: string[]; - contains(keyOrSegment: string): boolean; -} - -export interface IUserDataService { - _serviceBrand: any; - - onDidChange: Event; - - read(key: string): Promise; - - write(key: string, value: string): Promise; -} - -export const IUserDataEditorService = createDecorator('userDataEditorService'); - -export interface IUserDataEditorService { - _serviceBrand: any; - - openInEditor(key: string): Promise; -} \ No newline at end of file From 1cbc69e6c58a95dc0c375fdb84dc6f6d944a9737 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 24 Jun 2019 15:38:54 +0200 Subject: [PATCH 0571/1449] revert remove settings resource from env service --- .../sharedProcess/sharedProcessMain.ts | 2 +- src/vs/code/electron-main/main.ts | 2 +- src/vs/code/node/cliProcessMain.ts | 2 +- .../node/configurationService.ts | 14 +++---- .../test/node/configurationService.test.ts | 39 +++++++++---------- 5 files changed, 27 insertions(+), 32 deletions(-) diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts index da1e7be6953..34cd3e48a63 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts @@ -98,7 +98,7 @@ async function main(server: Server, initData: ISharedProcessInitData, configurat disposables.push(logService); logService.info('main', JSON.stringify(configuration)); - const configurationService = new ConfigurationService(environmentService.appSettingsHome); + const configurationService = new ConfigurationService(environmentService.settingsResource); disposables.push(configurationService); await configurationService.initialize(); diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index d1be121aad1..be40bfa20d0 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -142,7 +142,7 @@ class CodeMain { process.once('exit', () => logService.dispose()); services.set(ILogService, logService); - services.set(IConfigurationService, new ConfigurationService(environmentService.appSettingsHome)); + services.set(IConfigurationService, new ConfigurationService(environmentService.settingsResource)); services.set(ILifecycleService, new SyncDescriptor(LifecycleService)); services.set(IStateService, new SyncDescriptor(StateService)); services.set(IRequestService, new SyncDescriptor(RequestService)); diff --git a/src/vs/code/node/cliProcessMain.ts b/src/vs/code/node/cliProcessMain.ts index 63d6cfccca2..dafebd1c91f 100644 --- a/src/vs/code/node/cliProcessMain.ts +++ b/src/vs/code/node/cliProcessMain.ts @@ -285,7 +285,7 @@ export async function main(argv: ParsedArgs): Promise { await Promise.all([environmentService.appSettingsHome.fsPath, environmentService.extensionsPath].map(p => mkdirp(p))); - const configurationService = new ConfigurationService(environmentService.appSettingsHome); + const configurationService = new ConfigurationService(environmentService.settingsResource); await configurationService.initialize(); services.set(IEnvironmentService, environmentService); diff --git a/src/vs/platform/configuration/node/configurationService.ts b/src/vs/platform/configuration/node/configurationService.ts index aa8502dec8f..d3e4dfe09b1 100644 --- a/src/vs/platform/configuration/node/configurationService.ts +++ b/src/vs/platform/configuration/node/configurationService.ts @@ -14,14 +14,11 @@ import { ConfigWatcher } from 'vs/base/node/config'; import { onUnexpectedError } from 'vs/base/common/errors'; import { URI } from 'vs/base/common/uri'; import { Schemas } from 'vs/base/common/network'; -import { joinPath } from 'vs/base/common/resources'; export class ConfigurationService extends Disposable implements IConfigurationService, IDisposable { _serviceBrand: any; - readonly userSettingsResource: URI; - private configuration: Configuration; private userConfigModelWatcher: ConfigWatcher | undefined; @@ -29,10 +26,9 @@ export class ConfigurationService extends Disposable implements IConfigurationSe readonly onDidChangeConfiguration: Event = this._onDidChangeConfiguration.event; constructor( - appSettingsHome: URI + private readonly settingsResource: URI ) { super(); - this.userSettingsResource = joinPath(appSettingsHome, 'settings.json'); this.configuration = new Configuration(new DefaultConfigurationModel(), new ConfigurationModel()); this._register(Registry.as(Extensions.Configuration).onDidUpdateConfiguration(configurationProperties => this.onDidDefaultConfigurationChange(configurationProperties))); } @@ -42,13 +38,13 @@ export class ConfigurationService extends Disposable implements IConfigurationSe this.userConfigModelWatcher.dispose(); } - if (this.userSettingsResource.scheme !== Schemas.file) { + if (this.settingsResource.scheme !== Schemas.file) { return Promise.resolve(); } return new Promise((c, e) => { - this.userConfigModelWatcher = this._register(new ConfigWatcher(this.userSettingsResource.fsPath, { - changeBufferDelay: 300, onError: error => onUnexpectedError(error), defaultConfig: new ConfigurationModelParser(this.userSettingsResource.fsPath), parse: (content: string, parseErrors: any[]) => { - const userConfigModelParser = new ConfigurationModelParser(this.userSettingsResource.fsPath); + this.userConfigModelWatcher = this._register(new ConfigWatcher(this.settingsResource.fsPath, { + changeBufferDelay: 300, onError: error => onUnexpectedError(error), defaultConfig: new ConfigurationModelParser(this.settingsResource.fsPath), parse: (content: string, parseErrors: any[]) => { + const userConfigModelParser = new ConfigurationModelParser(this.settingsResource.fsPath); userConfigModelParser.parseContent(content); parseErrors = [...userConfigModelParser.errors]; return userConfigModelParser; diff --git a/src/vs/platform/configuration/test/node/configurationService.test.ts b/src/vs/platform/configuration/test/node/configurationService.test.ts index 3619e33bdb1..22fdbb6c911 100644 --- a/src/vs/platform/configuration/test/node/configurationService.test.ts +++ b/src/vs/platform/configuration/test/node/configurationService.test.ts @@ -14,15 +14,14 @@ import * as uuid from 'vs/base/common/uuid'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; import { testFile } from 'vs/base/test/node/utils'; import { URI } from 'vs/base/common/uri'; -import { dirname } from 'vs/base/common/resources'; suite('ConfigurationService - Node', () => { test('simple', async () => { - const res = await testFile('config', 'settings.json'); + const res = await testFile('config', 'config.json'); fs.writeFileSync(res.testFile, '{ "foo": "bar" }'); - const service = new ConfigurationService(dirname(URI.file(res.testFile))); + const service = new ConfigurationService(URI.file(res.testFile)); await service.initialize(); const config = service.getValue<{ foo: string; @@ -36,11 +35,11 @@ suite('ConfigurationService - Node', () => { }); test('config gets flattened', async () => { - const res = await testFile('config', 'settings.json'); + const res = await testFile('config', 'config.json'); fs.writeFileSync(res.testFile, '{ "testworkbench.editor.tabs": true }'); - const service = new ConfigurationService(dirname(URI.file(res.testFile))); + const service = new ConfigurationService(URI.file(res.testFile)); await service.initialize(); const config = service.getValue<{ testworkbench: { @@ -59,11 +58,11 @@ suite('ConfigurationService - Node', () => { }); test('error case does not explode', async () => { - const res = await testFile('config', 'settings.json'); + const res = await testFile('config', 'config.json'); fs.writeFileSync(res.testFile, ',,,,'); - const service = new ConfigurationService(dirname(URI.file(res.testFile))); + const service = new ConfigurationService(URI.file(res.testFile)); await service.initialize(); const config = service.getValue<{ foo: string; @@ -78,9 +77,9 @@ suite('ConfigurationService - Node', () => { const id = uuid.generateUuid(); const parentDir = path.join(os.tmpdir(), 'vsctests', id); const newDir = path.join(parentDir, 'config', id); - const testFile = path.join(newDir, 'settings.json'); + const testFile = path.join(newDir, 'config.json'); - const service = new ConfigurationService(dirname(URI.file(testFile))); + const service = new ConfigurationService(URI.file(testFile)); await service.initialize(); const config = service.getValue<{ foo: string }>(); @@ -90,9 +89,9 @@ suite('ConfigurationService - Node', () => { }); test('trigger configuration change event', async () => { - const res = await testFile('config', 'settings.json'); + const res = await testFile('config', 'config.json'); - const service = new ConfigurationService(dirname(URI.file(res.testFile))); + const service = new ConfigurationService(URI.file(res.testFile)); await service.initialize(); return new Promise((c, e) => { service.onDidChangeConfiguration(() => { @@ -106,11 +105,11 @@ suite('ConfigurationService - Node', () => { }); test('reloadConfiguration', async () => { - const res = await testFile('config', 'settings.json'); + const res = await testFile('config', 'config.json'); fs.writeFileSync(res.testFile, '{ "foo": "bar" }'); - const service = new ConfigurationService(dirname(URI.file(res.testFile))); + const service = new ConfigurationService(URI.file(res.testFile)); await service.initialize(); let config = service.getValue<{ foo: string; @@ -159,17 +158,17 @@ suite('ConfigurationService - Node', () => { } }); - let serviceWithoutFile = new ConfigurationService(dirname(URI.file('__testFile'))); + let serviceWithoutFile = new ConfigurationService(URI.file('__testFile')); await serviceWithoutFile.initialize(); let setting = serviceWithoutFile.getValue(); assert.ok(setting); assert.equal(setting.configuration.service.testSetting, 'isSet'); - return testFile('config', 'settings.json').then(async res => { + return testFile('config', 'config.json').then(async res => { fs.writeFileSync(res.testFile, '{ "testworkbench.editor.tabs": true }'); - const service = new ConfigurationService(dirname(URI.file(res.testFile))); + const service = new ConfigurationService(URI.file(res.testFile)); let setting = service.getValue(); @@ -201,8 +200,8 @@ suite('ConfigurationService - Node', () => { } }); - const r = await testFile('config', 'settings.json'); - const service = new ConfigurationService(dirname(URI.file(r.testFile))); + const r = await testFile('config', 'config.json'); + const service = new ConfigurationService(URI.file(r.testFile)); service.initialize(); let res = service.inspect('something.missing'); @@ -239,8 +238,8 @@ suite('ConfigurationService - Node', () => { } }); - const r = await testFile('config', 'settings.json'); - const service = new ConfigurationService(dirname(URI.file(r.testFile))); + const r = await testFile('config', 'config.json'); + const service = new ConfigurationService(URI.file(r.testFile)); service.initialize(); let res = service.inspect('lookup.service.testNullSetting'); From b4aabbf31f30239ea1cc49e3c146f050fafa4994 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 24 Jun 2019 15:40:19 +0200 Subject: [PATCH 0572/1449] use posix.join --- .../src/singlefolder-tests/workspace.fs.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.fs.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.fs.test.ts index 92fe43e125f..cd82f10c17d 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.fs.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.fs.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import * as vscode from 'vscode'; -import { join } from 'path'; +import { posix } from 'path'; suite('workspace-fs', () => { @@ -54,7 +54,7 @@ suite('workspace-fs', () => { test('fs.write/stat/delete', async function () { - const uri = root.with({ path: join(root.path, 'new.file') }); + const uri = root.with({ path: posix.join(root.path, 'new.file') }); await vscode.workspace.fs.writeFile(uri, Buffer.from('HELLO')); const stat = await vscode.workspace.fs.stat(uri); @@ -72,8 +72,8 @@ suite('workspace-fs', () => { test('fs.delete folder', async function () { - const folder = root.with({ path: join(root.path, 'folder') }); - const file = root.with({ path: join(root.path, 'folder/file') }); + const folder = root.with({ path: posix.join(root.path, 'folder') }); + const file = root.with({ path: posix.join(root.path, 'folder/file') }); await vscode.workspace.fs.createDirectory(folder); await vscode.workspace.fs.writeFile(file, Buffer.from('FOO')); From 071348aa2c3379c1a0e23f98ed9272ed7af3081b Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 24 Jun 2019 15:42:43 +0200 Subject: [PATCH 0573/1449] update doc --- src/vs/vscode.proposed.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 0e3c3c9b36e..272d73f6709 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -65,7 +65,7 @@ declare module 'vscode' { * * *Note* that the value is `undefined` when there is no remote extension host but that the * value is defined in all extension hosts (local and remote) in case a remote extension host - * exists. Use [`ExtensionContext#extensionKind`](#ExtensionContext.extensionKind) to know if + * exists. Use [`Extension#extensionKind`](#Extension.extensionKind) to know if * a specific extension runs remote or not. */ export const remoteName: string | undefined; From 11d036631b00153ac33d0d7bcb1ef09a4f563993 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 24 Jun 2019 15:44:25 +0200 Subject: [PATCH 0574/1449] clean up --- src/vs/editor/standalone/browser/simpleServices.ts | 2 -- .../configuration/test/common/testConfigurationService.ts | 2 -- src/vs/platform/keybinding/common/keybinding.ts | 2 -- .../test/electron-browser/configurationResolverService.test.ts | 3 +-- .../services/preferences/browser/preferencesService.ts | 2 +- .../services/textfile/common/textResourcePropertiesService.ts | 2 +- 6 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/vs/editor/standalone/browser/simpleServices.ts b/src/vs/editor/standalone/browser/simpleServices.ts index 9a5ee6ed071..1f44f246486 100644 --- a/src/vs/editor/standalone/browser/simpleServices.ts +++ b/src/vs/editor/standalone/browser/simpleServices.ts @@ -413,8 +413,6 @@ export class SimpleConfigurationService implements IConfigurationService { private readonly _configuration: Configuration; - userSettingsResource = URI.file('settings.json'); - constructor() { this._configuration = new Configuration(new DefaultConfigurationModel(), new ConfigurationModel()); } diff --git a/src/vs/platform/configuration/test/common/testConfigurationService.ts b/src/vs/platform/configuration/test/common/testConfigurationService.ts index e5551acf347..9bb4c8e2208 100644 --- a/src/vs/platform/configuration/test/common/testConfigurationService.ts +++ b/src/vs/platform/configuration/test/common/testConfigurationService.ts @@ -14,8 +14,6 @@ export class TestConfigurationService implements IConfigurationService { private configurationByRoot: TernarySearchTree = TernarySearchTree.forPaths(); - userSettingsResource = URI.file('settings.json'); - public reloadConfiguration(): Promise { return Promise.resolve(this.getValue()); } diff --git a/src/vs/platform/keybinding/common/keybinding.ts b/src/vs/platform/keybinding/common/keybinding.ts index 7ceaf162a3d..57b2f701fce 100644 --- a/src/vs/platform/keybinding/common/keybinding.ts +++ b/src/vs/platform/keybinding/common/keybinding.ts @@ -10,8 +10,6 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' import { IResolveResult } from 'vs/platform/keybinding/common/keybindingResolver'; import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKeybindingItem'; -export const USER_KEYBINDINGS_KEY = 'keybindings.json'; - export interface IUserFriendlyKeybinding { key: string; command: string; 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 d875310f3af..cefee9701c9 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 @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { URI as uri, URI } from 'vs/base/common/uri'; +import { URI as uri } from 'vs/base/common/uri'; import * as platform from 'vs/base/common/platform'; import { IConfigurationService, getConfigurationValue, IConfigurationOverrides } from 'vs/platform/configuration/common/configuration'; import { ICommandService } from 'vs/platform/commands/common/commands'; @@ -494,7 +494,6 @@ suite('Configuration Resolver Service', () => { class MockConfigurationService implements IConfigurationService { public _serviceBrand: any; public serviceId = IConfigurationService; - userSettingsResource = URI.file('settings.json'); public constructor(private configuration: any = {}) { } public inspect(key: string, overrides?: IConfigurationOverrides): any { return { value: getConfigurationValue(this.getValue(), key), default: getConfigurationValue(this.getValue(), key), user: getConfigurationValue(this.getValue(), key), workspaceFolder: undefined, folder: undefined }; } public keys() { return { default: [], user: [], workspace: [], workspaceFolder: [] }; } diff --git a/src/vs/workbench/services/preferences/browser/preferencesService.ts b/src/vs/workbench/services/preferences/browser/preferencesService.ts index ae0e5cf50f4..9f6330fcd37 100644 --- a/src/vs/workbench/services/preferences/browser/preferencesService.ts +++ b/src/vs/workbench/services/preferences/browser/preferencesService.ts @@ -629,4 +629,4 @@ export class PreferencesService extends Disposable implements IPreferencesServic } } -registerSingleton(IPreferencesService, PreferencesService); +registerSingleton(IPreferencesService, PreferencesService); \ No newline at end of file diff --git a/src/vs/workbench/services/textfile/common/textResourcePropertiesService.ts b/src/vs/workbench/services/textfile/common/textResourcePropertiesService.ts index 14a488aafc6..ce097d6fdf5 100644 --- a/src/vs/workbench/services/textfile/common/textResourcePropertiesService.ts +++ b/src/vs/workbench/services/textfile/common/textResourcePropertiesService.ts @@ -44,7 +44,7 @@ export class TextResourcePropertiesService implements ITextResourcePropertiesSer const remoteAuthority = this.environmentService.configuration.remoteAuthority; if (remoteAuthority) { - if (resource.scheme === Schemas.vscodeRemote) { + if (resource.scheme !== Schemas.file) { const osCacheKey = `resource.authority.os.${remoteAuthority}`; os = this.remoteEnvironment ? this.remoteEnvironment.os : /* Get it from cache */ this.storageService.getNumber(osCacheKey, StorageScope.WORKSPACE, OS); this.storageService.store(osCacheKey, os, StorageScope.WORKSPACE); From a35956820b21f8b7c9d22b457fe0a1ee6c0f1d25 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Mon, 24 Jun 2019 15:49:56 +0200 Subject: [PATCH 0575/1449] Add -1 tab index to status bar entries This keeps them out of the tab order, but allows them to be read with a screen reader Fixes #41406 --- src/vs/workbench/browser/parts/statusbar/statusbarPart.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts index dcc9d5da3de..ab4e44c096d 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts @@ -661,6 +661,7 @@ class StatusbarEntryItem extends Disposable { // Label Container this.labelContainer = document.createElement('a'); + this.labelContainer.tabIndex = -1; // allows screen readers to read title, but still prevents tab focus. // Label this.label = new OcticonLabel(this.labelContainer); @@ -718,7 +719,7 @@ class StatusbarEntryItem extends Disposable { this.applyColor(this.labelContainer, entry.color); } - // Update: Backgroud + // Update: Background if (!this.entry || entry.backgroundColor !== this.entry.backgroundColor) { if (entry.backgroundColor) { this.applyColor(this.container, entry.backgroundColor, true); From cbb1c724cdf5bcaa09602beb0eef978373deb7d2 Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 24 Jun 2019 15:55:44 +0200 Subject: [PATCH 0576/1449] empty view polish labels for remote case microsoft/vscode-remote-release#511 --- .../contrib/files/browser/views/emptyView.ts | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/files/browser/views/emptyView.ts b/src/vs/workbench/contrib/files/browser/views/emptyView.ts index dc40cbe11c2..cad0e825ff0 100644 --- a/src/vs/workbench/contrib/files/browser/views/emptyView.ts +++ b/src/vs/workbench/contrib/files/browser/views/emptyView.ts @@ -21,6 +21,9 @@ import { ViewletPanel, IViewletPanelOptions } from 'vs/workbench/browser/parts/v import { ResourcesDropHandler, DragAndDropObserver } from 'vs/workbench/browser/dnd'; import { listDropBackground } from 'vs/platform/theme/common/colorRegistry'; import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; +import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { ILabelService } from 'vs/platform/label/common/label'; +import { Schemas } from 'vs/base/common/network'; export class EmptyView extends ViewletPanel { @@ -38,10 +41,13 @@ export class EmptyView extends ViewletPanel { @IKeybindingService keybindingService: IKeybindingService, @IContextMenuService contextMenuService: IContextMenuService, @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, - @IConfigurationService configurationService: IConfigurationService + @IConfigurationService configurationService: IConfigurationService, + @IWorkbenchEnvironmentService private environmentService: IWorkbenchEnvironmentService, + @ILabelService private labelService: ILabelService ) { super({ ...(options as IViewletPanelOptions), ariaHeaderLabel: nls.localize('explorerSection', "Files Explorer Section") }, keybindingService, contextMenuService, configurationService); - this.contextService.onDidChangeWorkbenchState(() => this.setLabels()); + this._register(this.contextService.onDidChangeWorkbenchState(() => this.setLabels())); + this._register(this.labelService.onDidChangeFormatters(() => this.setLabels())); } renderHeader(container: HTMLElement): void { @@ -117,7 +123,12 @@ export class EmptyView extends ViewletPanel { } this.titleElement.textContent = EmptyView.NAME; } else { - this.messageElement.textContent = nls.localize('noFolderHelp', "You have not yet opened a folder."); + if (this.environmentService.configuration.remoteAuthority) { + const hostLabel = this.labelService.getHostLabel(Schemas.vscodeRemote, this.environmentService.configuration.remoteAuthority); + this.messageElement.textContent = hostLabel ? nls.localize('remoteNoFolderHelp', "Connected to {0}", hostLabel) : nls.localize('connecting', "Connecting..."); + } else { + this.messageElement.textContent = nls.localize('noFolderHelp', "You have not yet opened a folder."); + } if (this.button) { this.button.label = nls.localize('openFolder', "Open Folder"); } From d346e98e197bc0bf33fc22f4afa42952f657cc17 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 24 Jun 2019 15:56:45 +0200 Subject: [PATCH 0577/1449] clean up --- .../configurationEditingService.test.ts | 63 ++++++++----------- 1 file changed, 25 insertions(+), 38 deletions(-) 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 0c295fcd0af..d2cbcc44cdb 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 @@ -150,12 +150,6 @@ suite('ConfigurationEditingService', () => { }).then(() => parentDir = null!); } - test('errors cases - invalid key (user)', () => { - return testObject.writeConfiguration(EditableConfigurationTarget.USER_LOCAL, { key: 'unknown.key', value: 'value' }) - .then(() => assert.fail('Should fail with ERROR_UNKNOWN_KEY'), - (error: ConfigurationEditingError) => assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_UNKNOWN_KEY)); - }); - test('errors cases - invalid key', () => { return testObject.writeConfiguration(EditableConfigurationTarget.WORKSPACE, { key: 'unknown.key', value: 'value' }) .then(() => assert.fail('Should fail with ERROR_UNKNOWN_KEY'), @@ -182,6 +176,31 @@ suite('ConfigurationEditingService', () => { (error: ConfigurationEditingError) => assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION)); }); + test('errors cases - dirty', () => { + instantiationService.stub(ITextFileService, 'isDirty', true); + return testObject.writeConfiguration(EditableConfigurationTarget.USER_LOCAL, { key: 'configurationEditing.service.testSetting', value: 'value' }) + .then(() => assert.fail('Should fail with ERROR_CONFIGURATION_FILE_DIRTY error.'), + (error: ConfigurationEditingError) => assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY)); + }); + + test('dirty error is not thrown if not asked to save', () => { + instantiationService.stub(ITextFileService, 'isDirty', true); + return testObject.writeConfiguration(EditableConfigurationTarget.USER_LOCAL, { key: 'configurationEditing.service.testSetting', value: 'value' }, { donotSave: true }) + .then(() => null, error => assert.fail('Should not fail.')); + }); + + test('do not notify error', () => { + instantiationService.stub(ITextFileService, 'isDirty', true); + const target = sinon.stub(); + instantiationService.stub(INotificationService, { prompt: target, _serviceBrand: null!, notify: null!, error: null!, info: null!, warn: null!, status: null! }); + return testObject.writeConfiguration(EditableConfigurationTarget.USER_LOCAL, { key: 'configurationEditing.service.testSetting', value: 'value' }, { donotNotifyError: true }) + .then(() => assert.fail('Should fail with ERROR_CONFIGURATION_FILE_DIRTY error.'), + (error: ConfigurationEditingError) => { + assert.equal(false, target.calledOnce); + assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY); + }); + }); + test('write one setting - empty file', () => { return testObject.writeConfiguration(EditableConfigurationTarget.USER_LOCAL, { key: 'configurationEditing.service.testSetting', value: 'value' }) .then(() => { @@ -224,38 +243,6 @@ suite('ConfigurationEditingService', () => { }); }); - test('errors cases - invalid configuration (workspace_', () => { - fs.writeFileSync(globalSettingsFile, ',,,,,,,,,,,,,,'); - return testObject.writeConfiguration(EditableConfigurationTarget.USER_LOCAL, { key: 'configurationEditing.service.testSetting', value: 'value' }) - .then(() => assert.fail('Should fail with ERROR_INVALID_CONFIGURATION'), - (error: ConfigurationEditingError) => assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION)); - }); - - test('errors cases - dirty', () => { - instantiationService.stub(ITextFileService, 'isDirty', true); - return testObject.writeConfiguration(EditableConfigurationTarget.WORKSPACE, { key: 'tasks.service.testSetting', value: 'value' }) - .then(() => assert.fail('Should fail with ERROR_CONFIGURATION_FILE_DIRTY error.'), - (error: ConfigurationEditingError) => assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY)); - }); - - test('dirty error is not thrown if not asked to save', () => { - instantiationService.stub(ITextFileService, 'isDirty', true); - return testObject.writeConfiguration(EditableConfigurationTarget.WORKSPACE, { key: 'tasks.service.testSetting', value: 'value' }, { donotSave: true }) - .then(() => null, error => assert.fail('Should not fail.')); - }); - - test('do not notify error', () => { - instantiationService.stub(ITextFileService, 'isDirty', true); - const target = sinon.stub(); - instantiationService.stub(INotificationService, { prompt: target, _serviceBrand: null!, notify: null!, error: null!, info: null!, warn: null!, status: null! }); - return testObject.writeConfiguration(EditableConfigurationTarget.WORKSPACE, { key: 'tasks.service.testSetting', value: 'value' }, { donotNotifyError: true }) - .then(() => assert.fail('Should fail with ERROR_CONFIGURATION_FILE_DIRTY error.'), - (error: ConfigurationEditingError) => { - assert.equal(false, target.calledOnce); - assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY); - }); - }); - test('write workspace standalone setting - empty file', () => { return testObject.writeConfiguration(EditableConfigurationTarget.WORKSPACE, { key: 'tasks.service.testSetting', value: 'value' }) .then(() => { From f16c39cfc44884d4c3cc45191812b4a02cdc90b1 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 24 Jun 2019 16:12:10 +0200 Subject: [PATCH 0578/1449] send remote watcher error to file service (fixes microsoft/vscode-remote-release#329) --- src/vs/platform/files/common/files.ts | 2 +- .../remote/common/remoteAgentFileSystemChannel.ts | 13 +++++++++++-- .../workbench/services/files/common/fileService.ts | 2 +- .../services/files/node/diskFileSystemProvider.ts | 8 ++++---- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index ac73dd3de19..69b1fb785d4 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -208,7 +208,7 @@ export interface IFileSystemProvider { readonly capabilities: FileSystemProviderCapabilities; readonly onDidChangeCapabilities: Event; - readonly onDidErrorOccur?: Event; // TODO@ben remove once file watchers are solid + readonly onDidErrorOccur?: Event; // TODO@ben remove once file watchers are solid readonly onDidChangeFile: Event; watch(resource: URI, opts: IWatchOptions): IDisposable; diff --git a/src/vs/platform/remote/common/remoteAgentFileSystemChannel.ts b/src/vs/platform/remote/common/remoteAgentFileSystemChannel.ts index fdc022b18d9..edc89fb407e 100644 --- a/src/vs/platform/remote/common/remoteAgentFileSystemChannel.ts +++ b/src/vs/platform/remote/common/remoteAgentFileSystemChannel.ts @@ -27,6 +27,9 @@ export class RemoteExtensionsFileSystemProvider extends Disposable implements IF private readonly _onDidChange = this._register(new Emitter()); readonly onDidChangeFile: Event = this._onDidChange.event; + private _onDidWatchErrorOccur: Emitter = this._register(new Emitter()); + get onDidErrorOccur(): Event { return this._onDidWatchErrorOccur.event; } + private readonly _onDidChangeCapabilities = this._register(new Emitter()); readonly onDidChangeCapabilities: Event = this._onDidChangeCapabilities.event; @@ -43,8 +46,14 @@ export class RemoteExtensionsFileSystemProvider extends Disposable implements IF } private registerListeners(): void { - this._register(this.channel.listen('filechange', [this.session])((events) => { - this._onDidChange.fire(events.map(event => ({ resource: URI.revive(event.resource), type: event.type }))); + this._register(this.channel.listen('filechange', [this.session])((eventsOrError) => { + if (Array.isArray(eventsOrError)) { + const events = eventsOrError; + this._onDidChange.fire(events.map(event => ({ resource: URI.revive(event.resource), type: event.type }))); + } else { + const error = eventsOrError; + this._onDidWatchErrorOccur.fire(error); + } })); } diff --git a/src/vs/workbench/services/files/common/fileService.ts b/src/vs/workbench/services/files/common/fileService.ts index fd0a0d9f4e9..a788aadc1fd 100644 --- a/src/vs/workbench/services/files/common/fileService.ts +++ b/src/vs/workbench/services/files/common/fileService.ts @@ -52,7 +52,7 @@ export class FileService extends Disposable implements IFileService { const providerDisposables = new DisposableStore(); providerDisposables.add(provider.onDidChangeFile(changes => this._onFileChanges.fire(new FileChangesEvent(changes)))); if (typeof provider.onDidErrorOccur === 'function') { - providerDisposables.add(provider.onDidErrorOccur(error => this._onError.fire(error))); + providerDisposables.add(provider.onDidErrorOccur(error => this._onError.fire(new Error(error)))); } return toDisposable(() => { diff --git a/src/vs/workbench/services/files/node/diskFileSystemProvider.ts b/src/vs/workbench/services/files/node/diskFileSystemProvider.ts index a645ac84ef0..9cdf02e1438 100644 --- a/src/vs/workbench/services/files/node/diskFileSystemProvider.ts +++ b/src/vs/workbench/services/files/node/diskFileSystemProvider.ts @@ -338,8 +338,8 @@ export class DiskFileSystemProvider extends Disposable implements IFileSystemPro //#region File Watching - private _onDidWatchErrorOccur: Emitter = this._register(new Emitter()); - get onDidErrorOccur(): Event { return this._onDidWatchErrorOccur.event; } + private _onDidWatchErrorOccur: Emitter = this._register(new Emitter()); + get onDidErrorOccur(): Event { return this._onDidWatchErrorOccur.event; } private _onDidChangeFile: Emitter = this._register(new Emitter()); get onDidChangeFile(): Event { return this._onDidChangeFile.event; } @@ -441,7 +441,7 @@ export class DiskFileSystemProvider extends Disposable implements IFileSystemPro event => this._onDidChangeFile.fire(toFileChanges(event)), msg => { if (msg.type === 'error') { - this._onDidWatchErrorOccur.fire(new Error(msg.message)); + this._onDidWatchErrorOccur.fire(msg.message); } this.logService[msg.type](msg.message); }, @@ -466,7 +466,7 @@ export class DiskFileSystemProvider extends Disposable implements IFileSystemPro changes => this._onDidChangeFile.fire(toFileChanges(changes)), msg => { if (msg.type === 'error') { - this._onDidWatchErrorOccur.fire(new Error(msg.message)); + this._onDidWatchErrorOccur.fire(msg.message); } this.logService[msg.type](msg.message); }, From 59e50ff7993addab248a3775faa15dbaf4bb97f1 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 24 Jun 2019 16:19:57 +0200 Subject: [PATCH 0579/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0f4051616ea..bbd1ab905ce 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "05595573cc7515041a708d6ba0596dfeef29c250", + "distro": "d2c482aba7912623c65fa4da1ea722f32558197c", "author": { "name": "Microsoft Corporation" }, From 18dfdcbf52eddc54b23e7f4756d9db1e6d83a92c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 24 Jun 2019 07:47:26 -0700 Subject: [PATCH 0580/1449] better error handling in case of loader error in tests --- test/electron/index.js | 7 +++++++ test/electron/renderer.js | 9 ++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/test/electron/index.js b/test/electron/index.js index ebd97e3b98b..b0d82f6d1bd 100644 --- a/test/electron/index.js +++ b/test/electron/index.js @@ -100,6 +100,13 @@ function parseReporterOption(value) { app.on('ready', () => { + ipcMain.on('error', (_, err) => { + if (!argv.debug) { + console.error(err); + app.exit(1); + } + }); + const win = new BrowserWindow({ height: 600, width: 800, diff --git a/test/electron/renderer.js b/test/electron/renderer.js index addb1f0b93c..bd8cba69214 100644 --- a/test/electron/renderer.js +++ b/test/electron/renderer.js @@ -273,5 +273,12 @@ function runTests(opts) { ipcRenderer.on('run', (e, opts) => { initLoader(opts); - runTests(opts).catch(err => console.error(typeof err === 'string' ? err : JSON.stringify(err))); + runTests(opts).catch(err => { + if (!(typeof err !== 'string')) { + err = JSON.stringify(err); + } + + console.error(err); + ipcRenderer.send('error', err); + }); }); From dbb361ebd0b9b176de4ac78114ef194ce941e54e Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 24 Jun 2019 16:55:06 +0200 Subject: [PATCH 0581/1449] fix win 32 bits unit tests --- build/azure-pipelines/win32/product-build-win32.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 18758af4f99..3fe19e4b847 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -22,8 +22,6 @@ steps: . build/azure-pipelines/win32/exec.ps1 $ErrorActionPreference = "Stop" "machine monacotools.visualstudio.com`npassword $(devops-pat)`nmachine github.com`nlogin vscode`npassword $(github-distro-mixin-password)" | Out-File "$env:USERPROFILE\_netrc" -Encoding ASCII - $env:npm_config_arch="$(VSCODE_ARCH)" - $env:CHILD_CONCURRENCY="1" exec { git config user.email "vscode@microsoft.com" } exec { git config user.name "VSCode" } @@ -40,6 +38,8 @@ steps: - powershell: | . build/azure-pipelines/win32/exec.ps1 $ErrorActionPreference = "Stop" + $env:npm_config_arch="$(VSCODE_ARCH)" + $env:CHILD_CONCURRENCY="1" exec { yarn } displayName: Install dependencies From 28a51a3f4506a18caa776c02a7a49747d3009b95 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 24 Jun 2019 17:05:19 +0200 Subject: [PATCH 0582/1449] electron@4.2.5 (#76020) --- .yarnrc | 2 +- cgmanifest.json | 4 ++-- src/typings/electron.d.ts | 2 +- test/smoke/package.json | 2 +- test/smoke/yarn.lock | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.yarnrc b/.yarnrc index e3807c54e51..441b5a2e69a 100644 --- a/.yarnrc +++ b/.yarnrc @@ -1,3 +1,3 @@ disturl "https://atom.io/download/electron" -target "4.2.4" +target "4.2.5" runtime "electron" diff --git a/cgmanifest.json b/cgmanifest.json index 42a65648e59..b8c4f3bfefc 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -60,12 +60,12 @@ "git": { "name": "electron", "repositoryUrl": "https://github.com/electron/electron", - "commitHash": "c1b5a1cfc8a14a337540193daecfa5d0f50dd7bb" + "commitHash": "5d67ec3da5376a5058990e8a9557bc9124ad59a8" } }, "isOnlyProductionDependency": true, "license": "MIT", - "version": "4.2.4" + "version": "4.2.5" }, { "component": { diff --git a/src/typings/electron.d.ts b/src/typings/electron.d.ts index df64e7a0b28..c52a879c36f 100644 --- a/src/typings/electron.d.ts +++ b/src/typings/electron.d.ts @@ -1,4 +1,4 @@ -// Type definitions for Electron 4.2.4 +// Type definitions for Electron 4.2.5 // Project: http://electronjs.org/ // Definitions by: The Electron Team // Definitions: https://github.com/electron/electron-typescript-definitions diff --git a/test/smoke/package.json b/test/smoke/package.json index 2aff1bced09..80f93f04d89 100644 --- a/test/smoke/package.json +++ b/test/smoke/package.json @@ -22,7 +22,7 @@ "@types/webdriverio": "4.6.1", "concurrently": "^3.5.1", "cpx": "^1.5.0", - "electron": "4.2.4", + "electron": "4.2.5", "htmlparser2": "^3.9.2", "mkdirp": "^0.5.1", "mocha": "^5.2.0", diff --git a/test/smoke/yarn.lock b/test/smoke/yarn.lock index da2b5b77ed5..b6424c799b9 100644 --- a/test/smoke/yarn.lock +++ b/test/smoke/yarn.lock @@ -596,10 +596,10 @@ electron-download@^4.1.0: semver "^5.4.1" sumchecker "^2.0.2" -electron@4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/electron/-/electron-4.2.4.tgz#68ca7bd4ff2c16b9205549322f0f1cda4ebc9ff9" - integrity sha512-d4wEwJluMsRyRgbukLmFVTb6l1J+mc3RLB1ctbpMlSWDFvs+zknPWa+cHBzTWwrdgwINLddr69qsAW1ku6FqYw== +electron@4.2.5: + version "4.2.5" + resolved "https://registry.yarnpkg.com/electron/-/electron-4.2.5.tgz#1d1432c38e2b2190318f7ca30897cdfdcf942e5a" + integrity sha512-P132MXzTtyn2ZaekhKi5JeHzmTAMuR/uQt4hrg3vfJV7fpncx9SL6UFwHAK1DU13iiyZJqqIziNUu+o8nODHsA== dependencies: "@types/node" "^10.12.18" electron-download "^4.1.0" From 99ebdaa7dc7592987aafa9ab88bd82633104a17e Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 24 Jun 2019 18:10:47 +0200 Subject: [PATCH 0583/1449] Code-insiders started from WSL doesn't return to console/ doesn't connect. Fixes microsoft/vscode-remote-release#780 --- resources/win32/bin/code.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/win32/bin/code.sh b/resources/win32/bin/code.sh index 28c48b8d72d..5d92383c496 100644 --- a/resources/win32/bin/code.sh +++ b/resources/win32/bin/code.sh @@ -16,7 +16,7 @@ if grep -qi Microsoft /proc/version; then WSL_BUILD=18362 else WSL_BUILD=$(uname -r | sed -E 's/^.+-([0-9]+)-Microsoft/\1/') - if ! [ -z "$WSL_BUILD" ]; then + if [ -z "$WSL_BUILD" ]; then WSL_BUILD=0 fi fi From b86b7f1ba07b092d25ab2fbcbe1b8e2fd906871b Mon Sep 17 00:00:00 2001 From: Rachel Macfarlane Date: Mon, 24 Jun 2019 09:19:07 -0700 Subject: [PATCH 0584/1449] Group decorations by line before rendering --- .../browser/viewParts/minimap/minimap.ts | 58 ++++++++++++------- 1 file changed, 36 insertions(+), 22 deletions(-) diff --git a/src/vs/editor/browser/viewParts/minimap/minimap.ts b/src/vs/editor/browser/viewParts/minimap/minimap.ts index fa023adedd5..bb68a3af249 100644 --- a/src/vs/editor/browser/viewParts/minimap/minimap.ts +++ b/src/vs/editor/browser/viewParts/minimap/minimap.ts @@ -737,50 +737,64 @@ export class Minimap extends ViewPart { const lineHeightRatio = renderMinimap === RenderMinimap.LargeBlocks || renderMinimap === RenderMinimap.SmallBlocks ? 0.5 : 1; const height = lineHeight * lineHeightRatio; - for (let i = 0; i < decorations.length; i++) { - if (decorations[i].options.minimap) { - this.renderDecoration(canvasContext, decorations[i], layout, height, lineHeight, tabSize, characterWidth); + // Loop over decorations, ignoring those that don't have the minimap property set and rendering those on the same line together + let i = 0; + for (; i < decorations.length; i++) { + if (!decorations[i].options.minimap) { + continue; } + + let decorationsForLine = [decorations[i]]; + let currentLine = decorations[i].range.startLineNumber; + let j = i + 1; + while (j < decorations.length && decorations[j].range.startLineNumber === currentLine) { + if (decorations[j].options.minimap) { + decorationsForLine.push(decorations[j]); + } + + j += 1; + } + + i = j - 1; + this.renderDecorationsForLine(canvasContext, decorationsForLine, layout, currentLine, height, lineHeight, tabSize, characterWidth); } } } - private renderDecoration(canvasContext: CanvasRenderingContext2D, - decoration: ViewModelDecoration, + private renderDecorationsForLine(canvasContext: CanvasRenderingContext2D, + decorations: ViewModelDecoration[], layout: MinimapLayout, + startLineNumber: number, height: number, lineHeight: number, tabSize: number, charWidth: number) { - const { startLineNumber, startColumn, endColumn } = decoration.range; - - const startIndex = startColumn - 1; - const endIndex = endColumn - 1; - const y = (startLineNumber - layout.startLineNumber) * lineHeight; - // Get the offset of the decoration in the line. Have to read line data to see how much space each character takes. - let x = 0; - let endPosition = 0; const lineData = this._context.model.getLineContent(startLineNumber); - for (let i = 0; i < endIndex; i++) { - const charCode = lineData.charCodeAt(i); + const lineIndexToXOffset = [0]; + for (let i = 1; i < lineData.length + 1; i++) { + const charCode = lineData.charCodeAt(i - 1); const dx = charCode === CharCode.Tab ? tabSize * charWidth : strings.isFullWidthCharacter(charCode) ? 2 * charWidth : charWidth; - if (i < startIndex) { - x += dx; - } - - endPosition += dx; + lineIndexToXOffset[i] = lineIndexToXOffset[i - 1] + dx; } - const width = endPosition - x; + for (let i = 0; i < decorations.length; i++) { + const currentDecoration = decorations[i]; + const { startColumn, endColumn } = currentDecoration.range; + const x = lineIndexToXOffset[startColumn - 1]; + const width = lineIndexToXOffset[endColumn - 1] - x; - const minimapOptions = decoration.options.minimap; + this.renderADecoration(canvasContext, currentDecoration.options.minimap, x, y, width, height); + } + } + + private renderADecoration(canvasContext: CanvasRenderingContext2D, minimapOptions: ModelDecorationMinimapOptions, x: number, y: number, width: number, height: number) { const decorationColor = minimapOptions.getColor(this._context.theme); canvasContext.fillStyle = decorationColor; From 4a15a87336c6450681f2b2b70bec1bf840d2b8d3 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 24 Jun 2019 18:21:47 +0200 Subject: [PATCH 0585/1449] disable support for simple fullscreen (#75054) --- src/vs/code/electron-main/window.ts | 17 +++++++++-------- src/vs/platform/windows/common/windows.ts | 2 +- .../electron-browser/main.contribution.ts | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index 83e0aad634e..885ecc6d4c3 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -869,16 +869,17 @@ export class CodeWindow extends Disposable implements ICodeWindow { } private useNativeFullScreen(): boolean { - const windowConfig = this.configurationService.getValue('window'); - if (!windowConfig || typeof windowConfig.nativeFullScreen !== 'boolean') { - return true; // default - } + return true; + // const windowConfig = this.configurationService.getValue('window'); + // if (!windowConfig || typeof windowConfig.nativeFullScreen !== 'boolean') { + // return true; // default + // } - if (windowConfig.nativeTabs) { - return true; // https://github.com/electron/electron/issues/16142 - } + // if (windowConfig.nativeTabs) { + // return true; // https://github.com/electron/electron/issues/16142 + // } - return windowConfig.nativeFullScreen !== false; + // return windowConfig.nativeFullScreen !== false; } isMinimized(): boolean { diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index b8cf79dd68d..9075b9e7416 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -300,7 +300,7 @@ export function getTitleBarStyle(configurationService: IConfigurationService, en return 'native'; // native tabs on sierra do not work with custom title style } - const useSimpleFullScreen = isMacintosh && configuration.nativeFullScreen === false; + const useSimpleFullScreen = false; //isMacintosh && configuration.nativeFullScreen === false; if (useSimpleFullScreen) { return 'native'; // simple fullscreen does not work well with custom title style (https://github.com/Microsoft/vscode/issues/63291) } diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index 9b217d89457..e6adc96847a 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -560,7 +560,7 @@ import product from 'vs/platform/product/node/product'; 'default': true, 'description': nls.localize('window.nativeFullScreen', "Controls if native full-screen should be used on macOS. Disable this option to prevent macOS from creating a new space when going full-screen."), 'scope': ConfigurationScope.APPLICATION, - 'included': isMacintosh + 'included': false /* isMacintosh */ }, 'window.clickThroughInactive': { 'type': 'boolean', From 0de5cef5c72f095452c8d217ae56bd3e8de2e1ea Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 24 Jun 2019 18:22:32 +0200 Subject: [PATCH 0586/1449] telemetry - add window.nativeFullScreen --- src/vs/platform/telemetry/common/telemetryUtils.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/platform/telemetry/common/telemetryUtils.ts b/src/vs/platform/telemetry/common/telemetryUtils.ts index d9e73fab37c..e2284474798 100644 --- a/src/vs/platform/telemetry/common/telemetryUtils.ts +++ b/src/vs/platform/telemetry/common/telemetryUtils.ts @@ -179,6 +179,7 @@ const configurationValueWhitelist = [ 'terminal.integrated.fontFamily', 'window.openFilesInNewWindow', 'window.restoreWindows', + 'window.nativeFullScreen', 'window.zoomLevel', 'workbench.editor.enablePreview', 'workbench.editor.enablePreviewFromQuickOpen', From e35db87ce7329cca6a2249f9a58479dfd81bbfa9 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 24 Jun 2019 18:32:18 +0200 Subject: [PATCH 0587/1449] move API to stable, #74188 --- src/vs/vscode.d.ts | 37 +++++++++++++++ src/vs/vscode.proposed.d.ts | 47 ------------------- src/vs/workbench/api/node/extHost.api.impl.ts | 1 - 3 files changed, 37 insertions(+), 48 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 8010b442641..953cfb92259 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -4674,6 +4674,23 @@ declare module 'vscode' { dispose(): void; } + /** + * In a remote window the extension kind describes if an extension + * runs where the UI (window) runs or if an extension runs remotely. + */ + export enum ExtensionKind { + + /** + * Extension runs where the UI runs. + */ + UI = 1, + + /** + * Extension runs where the remote extension host runs. + */ + Workspace = 2 + } + /** * Represents an extension. * @@ -4701,6 +4718,15 @@ declare module 'vscode' { */ readonly packageJSON: any; + /** + * The extension kind describes if an extension runs where the UI runs + * or if an extension runs where the remote extension host runs. The extension kind + * if defined in the `package.json` file of extensions but can also be refined + * via the the `remote.extensionKind`-setting. When no remote extension host exists, + * the value is [`ExtensionKind.UI`](#ExtensionKind.UI). + */ + extensionKind: ExtensionKind; + /** * The public API exported by this extension. It is an invalid action * to access this field before this extension has been activated. @@ -6042,6 +6068,17 @@ declare module 'vscode' { */ export const sessionId: string; + /** + * The name of a remote. Defined by extensions, popular samples are `wsl` for the Windows + * Subsystem for Linux or `ssh-remote` for remotes using a secure shell. + * + * *Note* that the value is `undefined` when there is no remote extension host but that the + * value is defined in all extension hosts (local and remote) in case a remote extension host + * exists. Use [`Extension#extensionKind`](#Extension.extensionKind) to know if + * a specific extension runs remote or not. + */ + export const remoteName: string | undefined; + /** * Opens an *external* item, e.g. a http(s) or mailto-link, using the * default application. diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 272d73f6709..86d4ae370b6 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -27,53 +27,6 @@ declare module 'vscode' { } //#endregion - //#region Joh - ExtensionKind, vscode.env.remoteKind - - /** - * In a remote window the extension kind describes if an extension - * runs where the UI (window) runs or if an extension runs remotely. - */ - export enum ExtensionKind { - - /** - * Extension runs where the UI runs. - */ - UI = 1, - - /** - * Extension runs where the remote extension host runs. - */ - Workspace = 2 - } - - export interface Extension { - - /** - * The extension kind describes if an extension runs where the UI runs - * or if an extension runs where the remote extension host runs. The extension kind - * if defined in the `package.json` file of extensions but can also be refined - * via the the `remote.extensionKind`-setting. When no remote extension host exists, - * the value is [`ExtensionKind.UI`](#ExtensionKind.UI). - */ - extensionKind: ExtensionKind; - } - - export namespace env { - /** - * The name of a remote. Defined by extensions, popular samples are `wsl` for the Windows - * Subsystem for Linux or `ssh-remote` for remotes using a secure shell. - * - * *Note* that the value is `undefined` when there is no remote extension host but that the - * value is defined in all extension hosts (local and remote) in case a remote extension host - * exists. Use [`Extension#extensionKind`](#Extension.extensionKind) to know if - * a specific extension runs remote or not. - */ - export const remoteName: string | undefined; - } - - //#endregion - - //#region Joh - call hierarchy export enum CallHierarchyDirection { diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 104c034e3ff..9cff724bc75 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -267,7 +267,6 @@ export function createApiFactory( return initData.environment.webviewResourceRoot; }, get remoteName() { - checkProposedApiEnabled(extension); if (!initData.remote.authority) { return undefined; } From e42a1b0878b00be84365155240a29d04e20e9de4 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 24 Jun 2019 18:54:27 +0200 Subject: [PATCH 0588/1449] build - add and use --disable-inspect for integration tests (#74898) --- scripts/test-integration.bat | 14 ++++---- scripts/test-integration.sh | 10 +++--- .../environment/common/environment.ts | 1 + .../environment/node/environmentService.ts | 2 +- .../electron-browser/extensionHost.ts | 33 ++++++++----------- 5 files changed, 27 insertions(+), 33 deletions(-) diff --git a/scripts/test-integration.bat b/scripts/test-integration.bat index 1c189ec7b1b..20567bc77cf 100644 --- a/scripts/test-integration.bat +++ b/scripts/test-integration.bat @@ -10,25 +10,25 @@ call .\scripts\test.bat --runGlob **\*.integrationTest.js %* if %errorlevel% neq 0 exit /b %errorlevel% :: Tests in the extension host -call .\scripts\code.bat %~dp0\..\extensions\vscode-api-tests\testWorkspace --extensionDevelopmentPath=%~dp0\..\extensions\vscode-api-tests --extensionTestsPath=%~dp0\..\extensions\vscode-api-tests\out\singlefolder-tests --disable-extensions --user-data-dir=%VSCODEUSERDATADIR% +call .\scripts\code.bat %~dp0\..\extensions\vscode-api-tests\testWorkspace --extensionDevelopmentPath=%~dp0\..\extensions\vscode-api-tests --extensionTestsPath=%~dp0\..\extensions\vscode-api-tests\out\singlefolder-tests --disable-extensions --disable-inspect --user-data-dir=%VSCODEUSERDATADIR% if %errorlevel% neq 0 exit /b %errorlevel% -call .\scripts\code.bat %~dp0\..\extensions\vscode-api-tests\testworkspace.code-workspace --extensionDevelopmentPath=%~dp0\..\extensions\vscode-api-tests --extensionTestsPath=%~dp0\..\extensions\vscode-api-tests\out\workspace-tests --disable-extensions --user-data-dir=%VSCODEUSERDATADIR% +call .\scripts\code.bat %~dp0\..\extensions\vscode-api-tests\testworkspace.code-workspace --extensionDevelopmentPath=%~dp0\..\extensions\vscode-api-tests --extensionTestsPath=%~dp0\..\extensions\vscode-api-tests\out\workspace-tests --disable-extensions --disable-inspect --user-data-dir=%VSCODEUSERDATADIR% if %errorlevel% neq 0 exit /b %errorlevel% -call .\scripts\code.bat %~dp0\..\extensions\vscode-colorize-tests\test --extensionDevelopmentPath=%~dp0\..\extensions\vscode-colorize-tests --extensionTestsPath=%~dp0\..\extensions\vscode-colorize-tests\out --disable-extensions --user-data-dir=%VSCODEUSERDATADIR% +call .\scripts\code.bat %~dp0\..\extensions\vscode-colorize-tests\test --extensionDevelopmentPath=%~dp0\..\extensions\vscode-colorize-tests --extensionTestsPath=%~dp0\..\extensions\vscode-colorize-tests\out --disable-extensions --disable-inspect --user-data-dir=%VSCODEUSERDATADIR% if %errorlevel% neq 0 exit /b %errorlevel% -call .\scripts\code.bat $%~dp0\..\extensions\emmet\test-fixtures --extensionDevelopmentPath=%~dp0\..\extensions\emmet --extensionTestsPath=%~dp0\..\extensions\emmet\out\test --disable-extensions --user-data-dir=%VSCODEUSERDATADIR% . +call .\scripts\code.bat $%~dp0\..\extensions\emmet\test-fixtures --extensionDevelopmentPath=%~dp0\..\extensions\emmet --extensionTestsPath=%~dp0\..\extensions\emmet\out\test --disable-extensions --disable-inspect --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% -REM if exist ".\resources\server\test\test-remote-integration.bat" ( -REM call .\resources\server\test\test-remote-integration.bat -REM ) +if exist ".\resources\server\test\test-remote-integration.bat" ( + call .\resources\server\test\test-remote-integration.bat +) rmdir /s /q %VSCODEUSERDATADIR% diff --git a/scripts/test-integration.sh b/scripts/test-integration.sh index 3d397ed204e..7bb861252a7 100755 --- a/scripts/test-integration.sh +++ b/scripts/test-integration.sh @@ -16,13 +16,13 @@ cd $ROOT ./scripts/test.sh --runGlob **/*.integrationTest.js "$@" # Tests in the extension host -./scripts/code.sh $ROOT/extensions/vscode-api-tests/testWorkspace --extensionDevelopmentPath=$ROOT/extensions/vscode-api-tests --extensionTestsPath=$ROOT/extensions/vscode-api-tests/out/singlefolder-tests --disable-extensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started -./scripts/code.sh $ROOT/extensions/vscode-api-tests/testworkspace.code-workspace --extensionDevelopmentPath=$ROOT/extensions/vscode-api-tests --extensionTestsPath=$ROOT/extensions/vscode-api-tests/out/workspace-tests --disable-extensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started -./scripts/code.sh $ROOT/extensions/vscode-colorize-tests/test --extensionDevelopmentPath=$ROOT/extensions/vscode-colorize-tests --extensionTestsPath=$ROOT/extensions/vscode-colorize-tests/out --disable-extensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started -./scripts/code.sh $ROOT/extensions/markdown-language-features/test-fixtures --extensionDevelopmentPath=$ROOT/extensions/markdown-language-features --extensionTestsPath=$ROOT/extensions/markdown-language-features/out/test --disable-extensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started +./scripts/code.sh $ROOT/extensions/vscode-api-tests/testWorkspace --extensionDevelopmentPath=$ROOT/extensions/vscode-api-tests --extensionTestsPath=$ROOT/extensions/vscode-api-tests/out/singlefolder-tests --disable-extensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started --disable-inspect +./scripts/code.sh $ROOT/extensions/vscode-api-tests/testworkspace.code-workspace --extensionDevelopmentPath=$ROOT/extensions/vscode-api-tests --extensionTestsPath=$ROOT/extensions/vscode-api-tests/out/workspace-tests --disable-extensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started --disable-inspect +./scripts/code.sh $ROOT/extensions/vscode-colorize-tests/test --extensionDevelopmentPath=$ROOT/extensions/vscode-colorize-tests --extensionTestsPath=$ROOT/extensions/vscode-colorize-tests/out --disable-extensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started --disable-inspect +./scripts/code.sh $ROOT/extensions/markdown-language-features/test-fixtures --extensionDevelopmentPath=$ROOT/extensions/markdown-language-features --extensionTestsPath=$ROOT/extensions/markdown-language-features/out/test --disable-extensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started --disable-inspect mkdir -p $ROOT/extensions/emmet/test-fixtures -./scripts/code.sh $ROOT/extensions/emmet/test-fixtures --extensionDevelopmentPath=$ROOT/extensions/emmet --extensionTestsPath=$ROOT/extensions/emmet/out/test --disable-extensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started +./scripts/code.sh $ROOT/extensions/emmet/test-fixtures --extensionDevelopmentPath=$ROOT/extensions/emmet --extensionTestsPath=$ROOT/extensions/emmet/out/test --disable-extensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started --disable-inspect rm -rf $ROOT/extensions/emmet/test-fixtures if [ -f ./resources/server/test/test-remote-integration.sh ]; then diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index 210ac5080a3..443e430fcd0 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -69,6 +69,7 @@ export interface ParsedArgs { remote?: string; 'disable-user-env-probe'?: boolean; 'enable-remote-auto-shutdown'?: boolean; + 'disable-inspect'?: boolean; } export const IEnvironmentService = createDecorator('environmentService'); diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts index 12881effa53..55c3d8302ae 100644 --- a/src/vs/platform/environment/node/environmentService.ts +++ b/src/vs/platform/environment/node/environmentService.ts @@ -294,7 +294,7 @@ export function parseSearchPort(args: ParsedArgs, isBuild: boolean): IDebugParam return parseDebugPort(args['inspect-search'], args['inspect-brk-search'], 5876, isBuild); } -export function parseDebugPort(debugArg: string | undefined, debugBrkArg: string | undefined, defaultBuildPort: number, isBuild: boolean, debugId?: string): IExtensionHostDebugParams { +function parseDebugPort(debugArg: string | undefined, debugBrkArg: string | undefined, defaultBuildPort: number, isBuild: boolean, debugId?: string): IExtensionHostDebugParams { const portStr = debugBrkArg || debugArg; const port = Number(portStr) || (!isBuild ? defaultBuildPort : null); const brk = port ? Boolean(!!debugBrkArg) : false; diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts index bb552cc31d7..860845137fc 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts @@ -57,7 +57,7 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter { // Resources, in order they get acquired/created when .start() is called: private _namedPipeServer: Server | null; - private _inspectPort: number; + private _inspectPort: number | null; private _extensionHostProcess: ChildProcess | null; private _extensionHostConnection: Socket | null; private _messageProtocol: Promise | null; @@ -123,7 +123,10 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter { } if (!this._messageProtocol) { - this._messageProtocol = Promise.all([this._tryListenOnPipe(), this._tryFindDebugPort()]).then(data => { + this._messageProtocol = Promise.all([ + this._tryListenOnPipe(), + !this._environmentService.args['disable-inspect'] ? this._tryFindDebugPort() : Promise.resolve(null) + ]).then(data => { const pipeName = data[0]; const portData = data[1]; @@ -146,7 +149,7 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter { silent: true }; - if (portData.actual) { + if (portData && portData.actual) { opts.execArgv = [ '--nolazy', (this._isExtensionDevDebugBrk ? '--inspect-brk=' : '--inspect=') + portData.actual @@ -213,10 +216,12 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter { this._extensionHostProcess.on('exit', (code: number, signal: string) => this._onExtHostProcessExit(code, signal)); // Notify debugger that we are ready to attach to the process if we run a development extension - if (this._isExtensionDevHost && portData.actual && this._isExtensionDevDebug && this._environmentService.debugExtensionHost.debugId) { - this._extensionHostDebugService.attachSession(this._environmentService.debugExtensionHost.debugId, portData.actual); + if (portData) { + if (this._isExtensionDevHost && portData.actual && this._isExtensionDevDebug && this._environmentService.debugExtensionHost.debugId) { + this._extensionHostDebugService.attachSession(this._environmentService.debugExtensionHost.debugId, portData.actual); + } + this._inspectPort = portData.actual; } - this._inspectPort = portData.actual; // Help in case we fail to start it let startupTimeoutHandle: any; @@ -457,20 +462,8 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter { this._onExit.fire([code, signal]); } - public enableInspector(): Promise { - if (this._inspectPort) { - return Promise.resolve(); - } - // send SIGUSR1 and wait a little the actual port is read from the process stdout which we - // scan here: https://github.com/Microsoft/vscode/blob/67ffab8dcd1a6752d8b62bcd13d7020101eef568/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts#L225-L240 - if (this._extensionHostProcess) { - this._extensionHostProcess.kill('SIGUSR1'); - } - return timeout(1000); - } - - public getInspectPort(): number { - return this._inspectPort; + public getInspectPort(): number | undefined { + return withNullAsUndefined(this._inspectPort); } public terminate(): void { From b2a456e7f9402e966513cb7d74a5a94024b61e0f Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 24 Jun 2019 18:57:37 +0200 Subject: [PATCH 0589/1449] :lipstick: --- scripts/test-integration.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/test-integration.sh b/scripts/test-integration.sh index 7bb861252a7..45595a5f0a3 100755 --- a/scripts/test-integration.sh +++ b/scripts/test-integration.sh @@ -16,13 +16,13 @@ cd $ROOT ./scripts/test.sh --runGlob **/*.integrationTest.js "$@" # Tests in the extension host -./scripts/code.sh $ROOT/extensions/vscode-api-tests/testWorkspace --extensionDevelopmentPath=$ROOT/extensions/vscode-api-tests --extensionTestsPath=$ROOT/extensions/vscode-api-tests/out/singlefolder-tests --disable-extensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started --disable-inspect -./scripts/code.sh $ROOT/extensions/vscode-api-tests/testworkspace.code-workspace --extensionDevelopmentPath=$ROOT/extensions/vscode-api-tests --extensionTestsPath=$ROOT/extensions/vscode-api-tests/out/workspace-tests --disable-extensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started --disable-inspect -./scripts/code.sh $ROOT/extensions/vscode-colorize-tests/test --extensionDevelopmentPath=$ROOT/extensions/vscode-colorize-tests --extensionTestsPath=$ROOT/extensions/vscode-colorize-tests/out --disable-extensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started --disable-inspect -./scripts/code.sh $ROOT/extensions/markdown-language-features/test-fixtures --extensionDevelopmentPath=$ROOT/extensions/markdown-language-features --extensionTestsPath=$ROOT/extensions/markdown-language-features/out/test --disable-extensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started --disable-inspect +./scripts/code.sh $ROOT/extensions/vscode-api-tests/testWorkspace --extensionDevelopmentPath=$ROOT/extensions/vscode-api-tests --extensionTestsPath=$ROOT/extensions/vscode-api-tests/out/singlefolder-tests --disable-extensions --skip-getting-started --disable-inspect --user-data-dir=$VSCODEUSERDATADIR +./scripts/code.sh $ROOT/extensions/vscode-api-tests/testworkspace.code-workspace --extensionDevelopmentPath=$ROOT/extensions/vscode-api-tests --extensionTestsPath=$ROOT/extensions/vscode-api-tests/out/workspace-tests --disable-extensions --skip-getting-started --disable-inspect --user-data-dir=$VSCODEUSERDATADIR +./scripts/code.sh $ROOT/extensions/vscode-colorize-tests/test --extensionDevelopmentPath=$ROOT/extensions/vscode-colorize-tests --extensionTestsPath=$ROOT/extensions/vscode-colorize-tests/out --disable-extensions --skip-getting-started --disable-inspect --user-data-dir=$VSCODEUSERDATADIR +./scripts/code.sh $ROOT/extensions/markdown-language-features/test-fixtures --extensionDevelopmentPath=$ROOT/extensions/markdown-language-features --extensionTestsPath=$ROOT/extensions/markdown-language-features/out/test --disable-extensions --skip-getting-started --disable-inspect --user-data-dir=$VSCODEUSERDATADIR mkdir -p $ROOT/extensions/emmet/test-fixtures -./scripts/code.sh $ROOT/extensions/emmet/test-fixtures --extensionDevelopmentPath=$ROOT/extensions/emmet --extensionTestsPath=$ROOT/extensions/emmet/out/test --disable-extensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started --disable-inspect +./scripts/code.sh $ROOT/extensions/emmet/test-fixtures --extensionDevelopmentPath=$ROOT/extensions/emmet --extensionTestsPath=$ROOT/extensions/emmet/out/test --disable-extensions --skip-getting-started --disable-inspect --user-data-dir=$VSCODEUSERDATADIR rm -rf $ROOT/extensions/emmet/test-fixtures if [ -f ./resources/server/test/test-remote-integration.sh ]; then From ae057d43a88dd5dafa23a203e05441f08c612855 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 24 Jun 2019 19:00:38 +0200 Subject: [PATCH 0590/1449] bump distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bbd1ab905ce..7755b30ebef 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "d2c482aba7912623c65fa4da1ea722f32558197c", + "distro": "6e5b8dfbbda7ce121811e397d16842251bd666aa", "author": { "name": "Microsoft Corporation" }, From 3a6605a3c0da06c4008880976673002c202f90d8 Mon Sep 17 00:00:00 2001 From: Rachel Macfarlane Date: Mon, 24 Jun 2019 10:25:30 -0700 Subject: [PATCH 0591/1449] Report workspace stats in shared process --- .../sharedProcess/sharedProcessMain.ts | 13 +- src/vs/code/electron-main/app.ts | 6 + src/vs/code/electron-main/main.ts | 11 +- .../diagnostics/common/diagnosticsService.ts | 21 + .../electron-main/diagnosticsService.ts | 389 ---------------- .../diagnostics/node/diagnosticsIpc.ts | 58 +++ .../diagnostics/node/diagnosticsService.ts | 420 +++++++++++++++++- .../issue/electron-main/issueService.ts | 43 +- .../platform/launch/common/launchService.ts | 21 + .../launch/electron-main/launchService.ts | 23 +- .../experimentService.ts | 2 +- .../electron-browser/experimentalPrompt.ts | 2 +- .../experiments.contribution.ts | 2 +- .../experimentService.test.ts | 2 +- .../experimentalPrompts.test.ts | 2 +- .../electron-browser/extensionTipsService.ts | 4 +- .../electron-browser/extensionsViews.ts | 2 +- .../extensionsTipsService.test.ts | 2 +- .../electron-browser/extensionsViews.test.ts | 2 +- .../stats.contribution.ts | 2 +- .../workspaceStats.ts | 7 +- .../contrib/stats/test/workspaceStats.test.ts | 2 +- .../electron-browser/telemetryOptOut.ts | 2 +- src/vs/workbench/workbench.main.ts | 2 +- 24 files changed, 576 insertions(+), 464 deletions(-) delete mode 100644 src/vs/platform/diagnostics/electron-main/diagnosticsService.ts create mode 100644 src/vs/platform/diagnostics/node/diagnosticsIpc.ts create mode 100644 src/vs/platform/launch/common/launchService.ts rename src/vs/workbench/contrib/experiments/{node => electron-browser}/experimentService.ts (99%) rename src/vs/workbench/contrib/stats/{node => electron-browser}/stats.contribution.ts (89%) rename src/vs/workbench/contrib/stats/{node => electron-browser}/workspaceStats.ts (98%) diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts index 34cd3e48a63..c1cda361423 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts @@ -48,6 +48,9 @@ import { LogsDataCleaner } from 'vs/code/electron-browser/sharedProcess/contrib/ import { IMainProcessService } from 'vs/platform/ipc/electron-browser/mainProcessService'; import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; import { SpdLogService } from 'vs/platform/log/node/spdlogService'; +import { DiagnosticsService } from 'vs/platform/diagnostics/node/diagnosticsService'; +import { IDiagnosticsService } from 'vs/platform/diagnostics/common/diagnosticsService'; +import { DiagnosticsChannel } from 'vs/platform/diagnostics/node/diagnosticsIpc'; export interface ISharedProcessConfiguration { readonly machineId: string; @@ -121,6 +124,7 @@ async function main(server: Server, initData: ISharedProcessInitData, configurat const instantiationService = new InstantiationService(services); + let telemetryService: ITelemetryService; instantiationService.invokeFunction(accessor => { const services = new ServiceCollection(); const environmentService = accessor.get(IEnvironmentService); @@ -141,8 +145,10 @@ async function main(server: Server, initData: ISharedProcessInitData, configurat piiPaths: [appRoot, extensionsPath] }; - services.set(ITelemetryService, new SyncDescriptor(TelemetryService, [config])); + telemetryService = new TelemetryService(config, configurationService); + services.set(ITelemetryService, telemetryService); } else { + telemetryService = NullTelemetryService; services.set(ITelemetryService, NullTelemetryService); } server.registerChannel('telemetryAppender', new TelemetryAppenderChannel(appInsightsAppender)); @@ -150,6 +156,7 @@ async function main(server: Server, initData: ISharedProcessInitData, configurat services.set(IExtensionManagementService, new SyncDescriptor(ExtensionManagementService)); services.set(IExtensionGalleryService, new SyncDescriptor(ExtensionGalleryService)); services.set(ILocalizationsService, new SyncDescriptor(LocalizationsService)); + services.set(IDiagnosticsService, new SyncDescriptor(DiagnosticsService)); const instantiationService2 = instantiationService.createChild(services); @@ -163,6 +170,10 @@ async function main(server: Server, initData: ISharedProcessInitData, configurat const localizationsChannel = new LocalizationsChannel(localizationsService); server.registerChannel('localizations', localizationsChannel); + const diagnosticsService = accessor.get(IDiagnosticsService); + const diagnosticsChannel = new DiagnosticsChannel(diagnosticsService); + server.registerChannel('diagnostics', diagnosticsChannel); + // clean up deprecated extensions (extensionManagementService as ExtensionManagementService).removeDeprecatedExtensions(); // update localizations cache diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index a829266dc51..e9afa5d4ae6 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -81,6 +81,8 @@ import { nodeWebSocketFactory } from 'vs/platform/remote/node/nodeWebSocketFacto import { VSBuffer } from 'vs/base/common/buffer'; import { statSync } from 'fs'; import { ISignService } from 'vs/platform/sign/common/sign'; +import { IDiagnosticsService } from 'vs/platform/diagnostics/common/diagnosticsService'; +import { DiagnosticsService } from 'vs/platform/diagnostics/node/diagnosticsIpc'; export class CodeApplication extends Disposable { @@ -407,6 +409,10 @@ export class CodeApplication extends Disposable { services.set(IWindowsMainService, new SyncDescriptor(WindowsManager, [machineId, this.userEnv])); services.set(IWindowsService, new SyncDescriptor(WindowsService, [sharedProcess])); services.set(ILaunchService, new SyncDescriptor(LaunchService)); + + const diagnosticsChannel = getDelayedChannel(sharedProcessClient.then(client => client.getChannel('diagnostics'))); + services.set(IDiagnosticsService, new SyncDescriptor(DiagnosticsService, [diagnosticsChannel])); + services.set(IIssueService, new SyncDescriptor(IssueService, [machineId, this.userEnv])); services.set(IMenubarService, new SyncDescriptor(MenubarService)); diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index be40bfa20d0..97578e19252 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -33,7 +33,6 @@ import { CodeApplication } from 'vs/code/electron-main/app'; import { localize } from 'vs/nls'; import { mnemonicButtonLabel } from 'vs/base/common/labels'; import { SpdLogService } from 'vs/platform/log/node/spdlogService'; -import { IDiagnosticsService, DiagnosticsService } from 'vs/platform/diagnostics/electron-main/diagnosticsService'; import { BufferLogService } from 'vs/platform/log/common/bufferLog'; import { setUnexpectedErrorHandler } from 'vs/base/common/errors'; import { IThemeMainService, ThemeMainService } from 'vs/platform/theme/electron-main/themeMainService'; @@ -41,6 +40,7 @@ import { Client } from 'vs/base/parts/ipc/common/ipc.net'; import { once } from 'vs/base/common/functional'; import { ISignService } from 'vs/platform/sign/common/sign'; import { SignService } from 'vs/platform/sign/node/signService'; +import { DiagnosticsService } from 'vs/platform/diagnostics/node/diagnosticsIpc'; class ExpectedError extends Error { readonly isExpected = true; @@ -146,7 +146,6 @@ class CodeMain { services.set(ILifecycleService, new SyncDescriptor(LifecycleService)); services.set(IStateService, new SyncDescriptor(StateService)); services.set(IRequestService, new SyncDescriptor(RequestService)); - services.set(IDiagnosticsService, new SyncDescriptor(DiagnosticsService)); services.set(IThemeMainService, new SyncDescriptor(ThemeMainService)); services.set(ISignService, new SyncDescriptor(SignService)); @@ -277,7 +276,13 @@ class CodeMain { // Process Info if (environmentService.args.status) { return instantiationService.invokeFunction(async accessor => { - const diagnostics = await accessor.get(IDiagnosticsService).getDiagnostics(launchClient); + // Create a diagnostic service connected to the existing shared process + const sharedProcessClient = await connect(environmentService.sharedIPCHandle, 'main'); + const diagnosticsChannel = sharedProcessClient.getChannel('diagnostics'); + const diagnosticsService = new DiagnosticsService(diagnosticsChannel); + const mainProcessInfo = await launchClient.getMainProcessInfo(); + const remoteDiagnostics = await launchClient.getRemoteDiagnostics({ includeProcesses: true, includeWorkspaceMetadata: true }); + const diagnostics = await diagnosticsService.getDiagnostics(mainProcessInfo, remoteDiagnostics); console.log(diagnostics); throw new ExpectedError(); diff --git a/src/vs/platform/diagnostics/common/diagnosticsService.ts b/src/vs/platform/diagnostics/common/diagnosticsService.ts index 21cd8952e13..496b75397c0 100644 --- a/src/vs/platform/diagnostics/common/diagnosticsService.ts +++ b/src/vs/platform/diagnostics/common/diagnosticsService.ts @@ -5,6 +5,9 @@ import { UriComponents } from 'vs/base/common/uri'; import { ProcessItem } from 'vs/base/common/processes'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { IMainProcessInfo } from 'vs/platform/launch/common/launchService'; +import { IWorkspace } from 'vs/platform/workspace/common/workspace'; export interface IMachineInfo { os: string; @@ -51,6 +54,24 @@ export interface WorkspaceStats { configFiles: WorkspaceStatItem[]; fileCount: number; maxFilesReached: boolean; + launchConfigFiles: WorkspaceStatItem[]; +} + +export interface PerformanceInfo { + processInfo?: string; + workspaceInfo?: string; +} + +export const ID = 'diagnosticsService'; +export const IDiagnosticsService = createDecorator(ID); + +export interface IDiagnosticsService { + _serviceBrand: any; + + getPerformanceInfo(mainProcessInfo: IMainProcessInfo, remoteInfo: (IRemoteDiagnosticInfo | IRemoteDiagnosticError)[]): Promise; + getSystemInfo(mainProcessInfo: IMainProcessInfo, remoteInfo: (IRemoteDiagnosticInfo | IRemoteDiagnosticError)[]): Promise; + getDiagnostics(mainProcessInfo: IMainProcessInfo, remoteInfo: (IRemoteDiagnosticInfo | IRemoteDiagnosticError)[]): Promise; + reportWorkspaceStats(workspace: IWorkspace): Promise; } export function isRemoteDiagnosticError(x: any): x is IRemoteDiagnosticError { diff --git a/src/vs/platform/diagnostics/electron-main/diagnosticsService.ts b/src/vs/platform/diagnostics/electron-main/diagnosticsService.ts deleted file mode 100644 index 1b7eb413e8c..00000000000 --- a/src/vs/platform/diagnostics/electron-main/diagnosticsService.ts +++ /dev/null @@ -1,389 +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 { IMainProcessInfo, ILaunchService } from 'vs/platform/launch/electron-main/launchService'; -import { listProcesses } from 'vs/base/node/ps'; -import product from 'vs/platform/product/node/product'; -import pkg from 'vs/platform/product/node/package'; -import * as osLib from 'os'; -import { virtualMachineHint } from 'vs/base/node/id'; -import { repeat, pad } from 'vs/base/common/strings'; -import { isWindows } from 'vs/base/common/platform'; -import { app } from 'electron'; -import { basename } from 'vs/base/common/path'; -import { URI } from 'vs/base/common/uri'; -import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { IMachineInfo, WorkspaceStats, SystemInfo, IRemoteDiagnosticInfo, isRemoteDiagnosticError } from 'vs/platform/diagnostics/common/diagnosticsService'; -import { collectWorkspaceStats, getMachineInfo } from 'vs/platform/diagnostics/node/diagnosticsService'; -import { ProcessItem } from 'vs/base/common/processes'; - -export const ID = 'diagnosticsService'; -export const IDiagnosticsService = createDecorator(ID); - -export interface IDiagnosticsService { - _serviceBrand: any; - - getPerformanceInfo(launchService: ILaunchService): Promise; - getSystemInfo(launchService: ILaunchService): Promise; - getDiagnostics(launchService: ILaunchService): Promise; -} - -export interface VersionInfo { - vscodeVersion: string; - os: string; -} - -export interface ProcessInfo { - cpu: number; - memory: number; - pid: number; - name: string; -} - -export interface PerformanceInfo { - processInfo?: string; - workspaceInfo?: string; -} -export class DiagnosticsService implements IDiagnosticsService { - - _serviceBrand: any; - - private formatMachineInfo(info: IMachineInfo): string { - const output: string[] = []; - output.push(`OS Version: ${info.os}`); - output.push(`CPUs: ${info.cpus}`); - output.push(`Memory (System): ${info.memory}`); - output.push(`VM: ${info.vmHint}`); - - return output.join('\n'); - } - - private formatEnvironment(info: IMainProcessInfo): string { - const MB = 1024 * 1024; - const GB = 1024 * MB; - - const output: string[] = []; - output.push(`Version: ${pkg.name} ${pkg.version} (${product.commit || 'Commit unknown'}, ${product.date || 'Date unknown'})`); - output.push(`OS Version: ${osLib.type()} ${osLib.arch()} ${osLib.release()}`); - const cpus = osLib.cpus(); - if (cpus && cpus.length > 0) { - output.push(`CPUs: ${cpus[0].model} (${cpus.length} x ${cpus[0].speed})`); - } - output.push(`Memory (System): ${(osLib.totalmem() / GB).toFixed(2)}GB (${(osLib.freemem() / GB).toFixed(2)}GB free)`); - if (!isWindows) { - output.push(`Load (avg): ${osLib.loadavg().map(l => Math.round(l)).join(', ')}`); // only provided on Linux/macOS - } - output.push(`VM: ${Math.round((virtualMachineHint.value() * 100))}%`); - output.push(`Screen Reader: ${app.isAccessibilitySupportEnabled() ? 'yes' : 'no'}`); - output.push(`Process Argv: ${info.mainArguments.join(' ')}`); - output.push(`GPU Status: ${this.expandGPUFeatures()}`); - - return output.join('\n'); - } - - async getPerformanceInfo(launchService: ILaunchService): Promise { - const info = await launchService.getMainProcessInfo(); - return Promise.all([listProcesses(info.mainPID), this.formatWorkspaceMetadata(info)]).then(async result => { - let [rootProcess, workspaceInfo] = result; - let processInfo = this.formatProcessList(info, rootProcess); - - try { - const remoteData = await launchService.getRemoteDiagnostics({ includeProcesses: true, includeWorkspaceMetadata: true }); - remoteData.forEach(diagnostics => { - if (isRemoteDiagnosticError(diagnostics)) { - processInfo += `\n${diagnostics.errorMessage}`; - workspaceInfo += `\n${diagnostics.errorMessage}`; - } else { - processInfo += `\n\nRemote: ${diagnostics.hostName}`; - if (diagnostics.processes) { - processInfo += `\n${this.formatProcessList(info, diagnostics.processes)}`; - } - - if (diagnostics.workspaceMetadata) { - workspaceInfo += `\n| Remote: ${diagnostics.hostName}`; - for (const folder of Object.keys(diagnostics.workspaceMetadata)) { - const metadata = diagnostics.workspaceMetadata[folder]; - - let countMessage = `${metadata.fileCount} files`; - if (metadata.maxFilesReached) { - countMessage = `more than ${countMessage}`; - } - - workspaceInfo += `| Folder (${folder}): ${countMessage}`; - workspaceInfo += this.formatWorkspaceStats(metadata); - } - } - } - }); - } catch (e) { - processInfo += `\nFetching remote data failed: ${e}`; - workspaceInfo += `\nFetching remote data failed: ${e}`; - } - - return { - processInfo, - workspaceInfo - }; - }); - } - - async getSystemInfo(launchService: ILaunchService): Promise { - const info = await launchService.getMainProcessInfo(); - const { memory, vmHint, os, cpus } = getMachineInfo(); - const systemInfo: SystemInfo = { - os, - memory, - cpus, - vmHint, - processArgs: `${info.mainArguments.join(' ')}`, - gpuStatus: app.getGPUFeatureStatus(), - screenReader: `${app.isAccessibilitySupportEnabled() ? 'yes' : 'no'}`, - remoteData: (await launchService.getRemoteDiagnostics({ includeProcesses: false, includeWorkspaceMetadata: false })).filter((x): x is IRemoteDiagnosticInfo => !(x instanceof Error)) - }; - - - if (!isWindows) { - systemInfo.load = `${osLib.loadavg().map(l => Math.round(l)).join(', ')}`; - } - - return Promise.resolve(systemInfo); - } - - async getDiagnostics(launchService: ILaunchService): Promise { - const output: string[] = []; - const info = await launchService.getMainProcessInfo(); - return listProcesses(info.mainPID).then(async rootProcess => { - - // Environment Info - output.push(''); - output.push(this.formatEnvironment(info)); - - // Process List - output.push(''); - output.push(this.formatProcessList(info, rootProcess)); - - // Workspace Stats - if (info.windows.some(window => window.folderURIs && window.folderURIs.length > 0 && !window.remoteAuthority)) { - output.push(''); - output.push('Workspace Stats: '); - output.push(await this.formatWorkspaceMetadata(info)); - } - - try { - const data = await launchService.getRemoteDiagnostics({ includeProcesses: true, includeWorkspaceMetadata: true }); - data.forEach(diagnostics => { - if (isRemoteDiagnosticError(diagnostics)) { - output.push(`\n${diagnostics.errorMessage}`); - } else { - output.push('\n\n'); - output.push(`Remote: ${diagnostics.hostName}`); - output.push(this.formatMachineInfo(diagnostics.machineInfo)); - - if (diagnostics.processes) { - output.push(this.formatProcessList(info, diagnostics.processes)); - } - - if (diagnostics.workspaceMetadata) { - for (const folder of Object.keys(diagnostics.workspaceMetadata)) { - const metadata = diagnostics.workspaceMetadata[folder]; - - let countMessage = `${metadata.fileCount} files`; - if (metadata.maxFilesReached) { - countMessage = `more than ${countMessage}`; - } - - output.push(`Folder (${folder}): ${countMessage}`); - output.push(this.formatWorkspaceStats(metadata)); - } - } - } - }); - } catch (e) { - output.push('\n\n'); - output.push(`Fetching status information from remotes failed: ${e.message}`); - } - - output.push(''); - output.push(''); - - return output.join('\n'); - }); - } - - private formatWorkspaceStats(workspaceStats: WorkspaceStats): string { - const output: string[] = []; - const lineLength = 60; - let col = 0; - - const appendAndWrap = (name: string, count: number) => { - const item = ` ${name}(${count})`; - - if (col + item.length > lineLength) { - output.push(line); - line = '| '; - col = line.length; - } - else { - col += item.length; - } - line += item; - }; - - // File Types - let line = '| File types:'; - const maxShown = 10; - let max = workspaceStats.fileTypes.length > maxShown ? maxShown : workspaceStats.fileTypes.length; - for (let i = 0; i < max; i++) { - const item = workspaceStats.fileTypes[i]; - appendAndWrap(item.name, item.count); - } - output.push(line); - - // Conf Files - if (workspaceStats.configFiles.length >= 0) { - line = '| Conf files:'; - col = 0; - workspaceStats.configFiles.forEach((item) => { - appendAndWrap(item.name, item.count); - }); - output.push(line); - } - - // if (workspaceStats.launchConfigFiles.length > 0) { - // let line = '| Launch Configs:'; - // workspaceStats.launchConfigFiles.forEach(each => { - // const item = each.count > 1 ? ` ${each.name}(${each.count})` : ` ${each.name}`; - // line += item; - // }); - // output.push(line); - // } - return output.join('\n'); - } - - private expandGPUFeatures(): string { - const gpuFeatures = app.getGPUFeatureStatus(); - const longestFeatureName = Math.max(...Object.keys(gpuFeatures).map(feature => feature.length)); - // Make columns aligned by adding spaces after feature name - return Object.keys(gpuFeatures).map(feature => `${feature}: ${repeat(' ', longestFeatureName - feature.length)} ${gpuFeatures[feature]}`).join('\n '); - } - - private formatWorkspaceMetadata(info: IMainProcessInfo): Promise { - const output: string[] = []; - const workspaceStatPromises: Promise[] = []; - - info.windows.forEach(window => { - if (window.folderURIs.length === 0 || !!window.remoteAuthority) { - return; - } - - output.push(`| Window (${window.title})`); - - window.folderURIs.forEach(uriComponents => { - const folderUri = URI.revive(uriComponents); - if (folderUri.scheme === 'file') { - const folder = folderUri.fsPath; - workspaceStatPromises.push(collectWorkspaceStats(folder, ['node_modules', '.git']).then(stats => { - let countMessage = `${stats.fileCount} files`; - if (stats.maxFilesReached) { - countMessage = `more than ${countMessage}`; - } - output.push(`| Folder (${basename(folder)}): ${countMessage}`); - output.push(this.formatWorkspaceStats(stats)); - - }).catch(error => { - output.push(`| Error: Unable to collect workspace stats for folder ${folder} (${error.toString()})`); - })); - } else { - output.push(`| Folder (${folderUri.toString()}): Workspace stats not available.`); - } - }); - }); - - return Promise.all(workspaceStatPromises) - .then(_ => output.join('\n')) - .catch(e => `Unable to collect workspace stats: ${e}`); - } - - private formatProcessList(info: IMainProcessInfo, rootProcess: ProcessItem): string { - const mapPidToWindowTitle = new Map(); - info.windows.forEach(window => mapPidToWindowTitle.set(window.pid, window.title)); - - const output: string[] = []; - - output.push('CPU %\tMem MB\t PID\tProcess'); - - if (rootProcess) { - this.formatProcessItem(info.mainPID, mapPidToWindowTitle, output, rootProcess, 0); - } - - return output.join('\n'); - } - - private formatProcessItem(mainPid: number, mapPidToWindowTitle: Map, output: string[], item: ProcessItem, indent: number): void { - const isRoot = (indent === 0); - - const MB = 1024 * 1024; - - // Format name with indent - let name: string; - if (isRoot) { - name = item.pid === mainPid ? `${product.applicationName} main` : 'remote agent'; - } else { - name = `${repeat(' ', indent)} ${item.name}`; - - if (item.name === 'window') { - name = `${name} (${mapPidToWindowTitle.get(item.pid)})`; - } - } - const memory = process.platform === 'win32' ? item.mem : (osLib.totalmem() * (item.mem / 100)); - output.push(`${pad(Number(item.load.toFixed(0)), 5, ' ')}\t${pad(Number((memory / MB).toFixed(0)), 6, ' ')}\t${pad(Number((item.pid).toFixed(0)), 6, ' ')}\t${name}`); - - // Recurse into children if any - if (Array.isArray(item.children)) { - item.children.forEach(child => this.formatProcessItem(mainPid, mapPidToWindowTitle, output, child, indent + 1)); - } - } -} - -// function collectLaunchConfigs(folder: string): Promise { -// const launchConfigs = new Map(); - -// const launchConfig = join(folder, '.vscode', 'launch.json'); -// return new Promise((resolve, reject) => { -// exists(launchConfig, (doesExist) => { -// if (doesExist) { -// readFile(launchConfig, (err, contents) => { -// if (err) { -// return resolve([]); -// } - -// const errors: ParseError[] = []; -// const json = parse(contents.toString(), errors); -// if (errors.length) { -// output.push(`Unable to parse ${launchConfig}`); -// return resolve([]); -// } - -// if (json['configurations']) { -// for (const each of json['configurations']) { -// const type = each['type']; -// if (type) { -// if (launchConfigs.has(type)) { -// launchConfigs.set(type, launchConfigs.get(type)! + 1); -// } else { -// launchConfigs.set(type, 1); -// } -// } -// } -// } - -// return resolve(asSortedItems(launchConfigs)); -// }); -// } else { -// return resolve([]); -// } -// }); -// }); -// } diff --git a/src/vs/platform/diagnostics/node/diagnosticsIpc.ts b/src/vs/platform/diagnostics/node/diagnosticsIpc.ts new file mode 100644 index 00000000000..28cabc55e7b --- /dev/null +++ b/src/vs/platform/diagnostics/node/diagnosticsIpc.ts @@ -0,0 +1,58 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IServerChannel, IChannel } from 'vs/base/parts/ipc/common/ipc'; +import { IDiagnosticsService, IRemoteDiagnosticInfo, IRemoteDiagnosticError, SystemInfo, PerformanceInfo } from 'vs/platform/diagnostics/common/diagnosticsService'; +import { Event } from 'vs/base/common/event'; +import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; +import { IMainProcessInfo } from 'vs/platform/launch/common/launchService'; +import { IWorkspace } from 'vs/platform/workspace/common/workspace'; + +export class DiagnosticsChannel implements IServerChannel { + + constructor(private service: IDiagnosticsService) { } + + listen(context: any, event: string): Event { + throw new Error('Invalid listen'); + } + + call(context: any, command: string, args?: any): Promise { + switch (command) { + case 'getDiagnostics': + return this.service.getDiagnostics(args[0], args[1]); + case 'getSystemInfo': + return this.service.getSystemInfo(args[0], args[1]); + case 'getPerformanceInfo': + return this.service.getPerformanceInfo(args[0], args[1]); + case 'reportWorkspaceStats': + return this.service.reportWorkspaceStats(args); + } + + throw new Error('Invalid call'); + } +} + +export class DiagnosticsService implements IDiagnosticsService { + + _serviceBrand: ServiceIdentifier; + + constructor(private channel: IChannel) { } + + public getDiagnostics(mainProcessInfo: IMainProcessInfo, remoteInfo: (IRemoteDiagnosticInfo | IRemoteDiagnosticError)[]): Promise { + return this.channel.call('getDiagnostics', [mainProcessInfo, remoteInfo]); + } + + public getSystemInfo(mainProcessInfo: IMainProcessInfo, remoteInfo: (IRemoteDiagnosticInfo | IRemoteDiagnosticError)[]): Promise { + return this.channel.call('getSystemInfo', [mainProcessInfo, remoteInfo]); + } + + public getPerformanceInfo(mainProcessInfo: IMainProcessInfo, remoteInfo: (IRemoteDiagnosticInfo | IRemoteDiagnosticError)[]): Promise { + return this.channel.call('getPerformanceInfo', [mainProcessInfo, remoteInfo]); + } + + public reportWorkspaceStats(workspace: IWorkspace): Promise { + return this.channel.call('reportWorkspaceStats', workspace); + } +} \ No newline at end of file diff --git a/src/vs/platform/diagnostics/node/diagnosticsService.ts b/src/vs/platform/diagnostics/node/diagnosticsService.ts index ae056538ab9..9fd4e15fea7 100644 --- a/src/vs/platform/diagnostics/node/diagnosticsService.ts +++ b/src/vs/platform/diagnostics/node/diagnosticsService.ts @@ -2,28 +2,33 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as os from 'os'; +import * as osLib from 'os'; import { virtualMachineHint } from 'vs/base/node/id'; -import { IMachineInfo, WorkspaceStats, WorkspaceStatItem } from 'vs/platform/diagnostics/common/diagnosticsService'; -import { readdir, stat } from 'fs'; -import { join } from 'vs/base/common/path'; +import { IMachineInfo, WorkspaceStats, WorkspaceStatItem, IDiagnosticsService, PerformanceInfo, SystemInfo, IRemoteDiagnosticInfo, IRemoteDiagnosticError, isRemoteDiagnosticError } from 'vs/platform/diagnostics/common/diagnosticsService'; +import { readdir, stat, exists, readFile } from 'fs'; +import { join, basename } from 'vs/base/common/path'; +import { parse, ParseError } from 'vs/base/common/json'; +import { listProcesses } from 'vs/base/node/ps'; +import product from 'vs/platform/product/node/product'; +import pkg from 'vs/platform/product/node/package'; +import { repeat, pad } from 'vs/base/common/strings'; +import { isWindows } from 'vs/base/common/platform'; +import { URI } from 'vs/base/common/uri'; +import { ProcessItem } from 'vs/base/common/processes'; +import { IMainProcessInfo } from 'vs/platform/launch/common/launchService'; +import { IWorkspace } from 'vs/platform/workspace/common/workspace'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -export function getMachineInfo(): IMachineInfo { - const MB = 1024 * 1024; - const GB = 1024 * MB; +export interface VersionInfo { + vscodeVersion: string; + os: string; +} - const machineInfo: IMachineInfo = { - os: `${os.type()} ${os.arch()} ${os.release()}`, - memory: `${(os.totalmem() / GB).toFixed(2)}GB (${(os.freemem() / GB).toFixed(2)}GB free)`, - vmHint: `${Math.round((virtualMachineHint.value() * 100))}%`, - }; - - const cpus = os.cpus(); - if (cpus && cpus.length > 0) { - machineInfo.cpus = `${cpus[0].model} (${cpus.length} x ${cpus[0].speed})`; - } - - return machineInfo; +export interface ProcessInfo { + cpu: number; + memory: number; + pid: number; + name: string; } export function collectWorkspaceStats(folder: string, filter: string[]): Promise { @@ -145,16 +150,14 @@ export function collectWorkspaceStats(folder: string, filter: string[]): Promise walk(folder, filter, token, async (files) => { files.forEach(acceptFile); - // TODO@rachel commented out due to severe performance issues - // see https://github.com/Microsoft/vscode/issues/70563 - // const launchConfigs = await collectLaunchConfigs(folder); + const launchConfigs = await collectLaunchConfigs(folder); resolve({ configFiles: asSortedItems(configFiles), fileTypes: asSortedItems(fileTypes), fileCount: token.count, maxFilesReached: token.maxReached, - // launchConfigFiles: launchConfigs + launchConfigFiles: launchConfigs }); }); }); @@ -164,4 +167,375 @@ function asSortedItems(map: Map): WorkspaceStatItem[] { const a: WorkspaceStatItem[] = []; map.forEach((value, index) => a.push({ name: index, count: value })); return a.sort((a, b) => b.count - a.count); +} + +export function getMachineInfo(): IMachineInfo { + const MB = 1024 * 1024; + const GB = 1024 * MB; + + const machineInfo: IMachineInfo = { + os: `${osLib.type()} ${osLib.arch()} ${osLib.release()}`, + memory: `${(osLib.totalmem() / GB).toFixed(2)}GB (${(osLib.freemem() / GB).toFixed(2)}GB free)`, + vmHint: `${Math.round((virtualMachineHint.value() * 100))}%`, + }; + + const cpus = osLib.cpus(); + if (cpus && cpus.length > 0) { + machineInfo.cpus = `${cpus[0].model} (${cpus.length} x ${cpus[0].speed})`; + } + + return machineInfo; +} + +export function collectLaunchConfigs(folder: string): Promise { + let launchConfigs = new Map(); + + let launchConfig = join(folder, '.vscode', 'launch.json'); + return new Promise((resolve, reject) => { + exists(launchConfig, (doesExist) => { + if (doesExist) { + readFile(launchConfig, (err, contents) => { + if (err) { + return resolve([]); + } + + const errors: ParseError[] = []; + const json = parse(contents.toString(), errors); + if (errors.length) { + console.log(`Unable to parse ${launchConfig}`); + return resolve([]); + } + + if (json['configurations']) { + for (const each of json['configurations']) { + const type = each['type']; + if (type) { + if (launchConfigs.has(type)) { + launchConfigs.set(type, launchConfigs.get(type)! + 1); + } else { + launchConfigs.set(type, 1); + } + } + } + } + + return resolve(asSortedItems(launchConfigs)); + }); + } else { + return resolve([]); + } + }); + }); +} + +export class DiagnosticsService implements IDiagnosticsService { + + _serviceBrand: any; + + constructor(@ITelemetryService private readonly telemetryService: ITelemetryService) { } + + private formatMachineInfo(info: IMachineInfo): string { + const output: string[] = []; + output.push(`OS Version: ${info.os}`); + output.push(`CPUs: ${info.cpus}`); + output.push(`Memory (System): ${info.memory}`); + output.push(`VM: ${info.vmHint}`); + + return output.join('\n'); + } + + private formatEnvironment(info: IMainProcessInfo): string { + const MB = 1024 * 1024; + const GB = 1024 * MB; + + const output: string[] = []; + output.push(`Version: ${pkg.name} ${pkg.version} (${product.commit || 'Commit unknown'}, ${product.date || 'Date unknown'})`); + output.push(`OS Version: ${osLib.type()} ${osLib.arch()} ${osLib.release()}`); + const cpus = osLib.cpus(); + if (cpus && cpus.length > 0) { + output.push(`CPUs: ${cpus[0].model} (${cpus.length} x ${cpus[0].speed})`); + } + output.push(`Memory (System): ${(osLib.totalmem() / GB).toFixed(2)}GB (${(osLib.freemem() / GB).toFixed(2)}GB free)`); + if (!isWindows) { + output.push(`Load (avg): ${osLib.loadavg().map(l => Math.round(l)).join(', ')}`); // only provided on Linux/macOS + } + output.push(`VM: ${Math.round((virtualMachineHint.value() * 100))}%`); + output.push(`Screen Reader: ${info.screenReader ? 'yes' : 'no'}`); + output.push(`Process Argv: ${info.mainArguments.join(' ')}`); + output.push(`GPU Status: ${this.expandGPUFeatures(info.gpuFeatureStatus)}`); + + return output.join('\n'); + } + + public async getPerformanceInfo(info: IMainProcessInfo, remoteData: (IRemoteDiagnosticInfo | IRemoteDiagnosticError)[]): Promise { + return Promise.all([listProcesses(info.mainPID), this.formatWorkspaceMetadata(info)]).then(async result => { + let [rootProcess, workspaceInfo] = result; + let processInfo = this.formatProcessList(info, rootProcess); + + remoteData.forEach(diagnostics => { + if (isRemoteDiagnosticError(diagnostics)) { + processInfo += `\n${diagnostics.errorMessage}`; + workspaceInfo += `\n${diagnostics.errorMessage}`; + } else { + processInfo += `\n\nRemote: ${diagnostics.hostName}`; + if (diagnostics.processes) { + processInfo += `\n${this.formatProcessList(info, diagnostics.processes)}`; + } + + if (diagnostics.workspaceMetadata) { + workspaceInfo += `\n| Remote: ${diagnostics.hostName}`; + for (const folder of Object.keys(diagnostics.workspaceMetadata)) { + const metadata = diagnostics.workspaceMetadata[folder]; + + let countMessage = `${metadata.fileCount} files`; + if (metadata.maxFilesReached) { + countMessage = `more than ${countMessage}`; + } + + workspaceInfo += `| Folder (${folder}): ${countMessage}`; + workspaceInfo += this.formatWorkspaceStats(metadata); + } + } + } + }); + + return { + processInfo, + workspaceInfo + }; + }); + } + + public async getSystemInfo(info: IMainProcessInfo, remoteData: (IRemoteDiagnosticInfo | IRemoteDiagnosticError)[]): Promise { + const { memory, vmHint, os, cpus } = getMachineInfo(); + const systemInfo: SystemInfo = { + os, + memory, + cpus, + vmHint, + processArgs: `${info.mainArguments.join(' ')}`, + gpuStatus: info.gpuFeatureStatus, + screenReader: `${info.screenReader ? 'yes' : 'no'}`, + remoteData + }; + + + if (!isWindows) { + systemInfo.load = `${osLib.loadavg().map(l => Math.round(l)).join(', ')}`; + } + + return Promise.resolve(systemInfo); + } + + public async getDiagnostics(info: IMainProcessInfo, remoteDiagnostics: (IRemoteDiagnosticInfo | IRemoteDiagnosticError)[]): Promise { + const output: string[] = []; + return listProcesses(info.mainPID).then(async rootProcess => { + + // Environment Info + output.push(''); + output.push(this.formatEnvironment(info)); + + // Process List + output.push(''); + output.push(this.formatProcessList(info, rootProcess)); + + // Workspace Stats + if (info.windows.some(window => window.folderURIs && window.folderURIs.length > 0 && !window.remoteAuthority)) { + output.push(''); + output.push('Workspace Stats: '); + output.push(await this.formatWorkspaceMetadata(info)); + } + + remoteDiagnostics.forEach(diagnostics => { + if (isRemoteDiagnosticError(diagnostics)) { + output.push(`\n${diagnostics.errorMessage}`); + } else { + output.push('\n\n'); + output.push(`Remote: ${diagnostics.hostName}`); + output.push(this.formatMachineInfo(diagnostics.machineInfo)); + + if (diagnostics.processes) { + output.push(this.formatProcessList(info, diagnostics.processes)); + } + + if (diagnostics.workspaceMetadata) { + for (const folder of Object.keys(diagnostics.workspaceMetadata)) { + const metadata = diagnostics.workspaceMetadata[folder]; + + let countMessage = `${metadata.fileCount} files`; + if (metadata.maxFilesReached) { + countMessage = `more than ${countMessage}`; + } + + output.push(`Folder (${folder}): ${countMessage}`); + output.push(this.formatWorkspaceStats(metadata)); + } + } + } + }); + + output.push(''); + output.push(''); + + return output.join('\n'); + }); + } + + private formatWorkspaceStats(workspaceStats: WorkspaceStats): string { + const output: string[] = []; + const lineLength = 60; + let col = 0; + + const appendAndWrap = (name: string, count: number) => { + const item = ` ${name}(${count})`; + + if (col + item.length > lineLength) { + output.push(line); + line = '| '; + col = line.length; + } + else { + col += item.length; + } + line += item; + }; + + // File Types + let line = '| File types:'; + const maxShown = 10; + let max = workspaceStats.fileTypes.length > maxShown ? maxShown : workspaceStats.fileTypes.length; + for (let i = 0; i < max; i++) { + const item = workspaceStats.fileTypes[i]; + appendAndWrap(item.name, item.count); + } + output.push(line); + + // Conf Files + if (workspaceStats.configFiles.length >= 0) { + line = '| Conf files:'; + col = 0; + workspaceStats.configFiles.forEach((item) => { + appendAndWrap(item.name, item.count); + }); + output.push(line); + } + + if (workspaceStats.launchConfigFiles.length > 0) { + let line = '| Launch Configs:'; + workspaceStats.launchConfigFiles.forEach(each => { + const item = each.count > 1 ? ` ${each.name}(${each.count})` : ` ${each.name}`; + line += item; + }); + output.push(line); + } + return output.join('\n'); + } + + private expandGPUFeatures(gpuFeatures: any): string { + const longestFeatureName = Math.max(...Object.keys(gpuFeatures).map(feature => feature.length)); + // Make columns aligned by adding spaces after feature name + return Object.keys(gpuFeatures).map(feature => `${feature}: ${repeat(' ', longestFeatureName - feature.length)} ${gpuFeatures[feature]}`).join('\n '); + } + + private formatWorkspaceMetadata(info: IMainProcessInfo): Promise { + const output: string[] = []; + const workspaceStatPromises: Promise[] = []; + + info.windows.forEach(window => { + if (window.folderURIs.length === 0 || !!window.remoteAuthority) { + return; + } + + output.push(`| Window (${window.title})`); + + window.folderURIs.forEach(uriComponents => { + const folderUri = URI.revive(uriComponents); + if (folderUri.scheme === 'file') { + const folder = folderUri.fsPath; + workspaceStatPromises.push(collectWorkspaceStats(folder, ['node_modules', '.git']).then(stats => { + let countMessage = `${stats.fileCount} files`; + if (stats.maxFilesReached) { + countMessage = `more than ${countMessage}`; + } + output.push(`| Folder (${basename(folder)}): ${countMessage}`); + output.push(this.formatWorkspaceStats(stats)); + + }).catch(error => { + output.push(`| Error: Unable to collect workspace stats for folder ${folder} (${error.toString()})`); + })); + } else { + output.push(`| Folder (${folderUri.toString()}): Workspace stats not available.`); + } + }); + }); + + return Promise.all(workspaceStatPromises) + .then(_ => output.join('\n')) + .catch(e => `Unable to collect workspace stats: ${e}`); + } + + private formatProcessList(info: IMainProcessInfo, rootProcess: ProcessItem): string { + const mapPidToWindowTitle = new Map(); + info.windows.forEach(window => mapPidToWindowTitle.set(window.pid, window.title)); + + const output: string[] = []; + + output.push('CPU %\tMem MB\t PID\tProcess'); + + if (rootProcess) { + this.formatProcessItem(info.mainPID, mapPidToWindowTitle, output, rootProcess, 0); + } + + return output.join('\n'); + } + + private formatProcessItem(mainPid: number, mapPidToWindowTitle: Map, output: string[], item: ProcessItem, indent: number): void { + const isRoot = (indent === 0); + + const MB = 1024 * 1024; + + // Format name with indent + let name: string; + if (isRoot) { + name = item.pid === mainPid ? `${product.applicationName} main` : 'remote agent'; + } else { + name = `${repeat(' ', indent)} ${item.name}`; + + if (item.name === 'window') { + name = `${name} (${mapPidToWindowTitle.get(item.pid)})`; + } + } + const memory = process.platform === 'win32' ? item.mem : (osLib.totalmem() * (item.mem / 100)); + output.push(`${pad(Number(item.load.toFixed(0)), 5, ' ')}\t${pad(Number((memory / MB).toFixed(0)), 6, ' ')}\t${pad(Number((item.pid).toFixed(0)), 6, ' ')}\t${name}`); + + // Recurse into children if any + if (Array.isArray(item.children)) { + item.children.forEach(child => this.formatProcessItem(mainPid, mapPidToWindowTitle, output, child, indent + 1)); + } + } + + public async reportWorkspaceStats(workspace: IWorkspace): Promise { + workspace.folders.forEach(folder => { + const folderUri = URI.revive(folder.uri); + if (folderUri.scheme === 'file') { + const folder = folderUri.fsPath; + collectWorkspaceStats(folder, ['node_modules', '.git']).then(stats => { + /* __GDPR__ + "workspace.metadata" : { + "fileTypes" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "configTypes" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "launchConfigs" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true } + } + */ + this.telemetryService.publicLog('workspace.metadata', { + fileTypes: stats.fileTypes, + configTypes: stats.configFiles, + launchConfigs: stats.launchConfigFiles + }); + }).catch(_ => { + // Report nothing if collecting metadata fails. + }); + } + }); + } } \ No newline at end of file diff --git a/src/vs/platform/issue/electron-main/issueService.ts b/src/vs/platform/issue/electron-main/issueService.ts index b794f8ffc8a..5fc1f5464f1 100644 --- a/src/vs/platform/issue/electron-main/issueService.ts +++ b/src/vs/platform/issue/electron-main/issueService.ts @@ -9,14 +9,13 @@ import { parseArgs } from 'vs/platform/environment/node/argv'; import { IIssueService, IssueReporterData, IssueReporterFeatures, ProcessExplorerData } from 'vs/platform/issue/common/issue'; import { BrowserWindow, ipcMain, screen, Event, dialog } from 'electron'; import { ILaunchService } from 'vs/platform/launch/electron-main/launchService'; -import { PerformanceInfo, IDiagnosticsService } from 'vs/platform/diagnostics/electron-main/diagnosticsService'; +import { PerformanceInfo, IDiagnosticsService, isRemoteDiagnosticError } from 'vs/platform/diagnostics/common/diagnosticsService'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { isMacintosh, IProcessEnvironment } from 'vs/base/common/platform'; import { ILogService } from 'vs/platform/log/common/log'; import { IWindowsService } from 'vs/platform/windows/common/windows'; import { IWindowState } from 'vs/platform/windows/electron-main/windows'; import { listProcesses } from 'vs/base/node/ps'; -import { isRemoteDiagnosticError } from 'vs/platform/diagnostics/common/diagnosticsService'; const DEFAULT_BACKGROUND_COLOR = '#1E1E1E'; @@ -40,10 +39,14 @@ export class IssueService implements IIssueService { } private registerListeners(): void { - ipcMain.on('vscode:issueSystemInfoRequest', (event: Event) => { - this.diagnosticsService.getSystemInfo(this.launchService).then(msg => { - event.sender.send('vscode:issueSystemInfoResponse', msg); - }); + ipcMain.on('vscode:issueSystemInfoRequest', async (event: Event) => { + Promise.all([this.launchService.getMainProcessInfo(), this.launchService.getRemoteDiagnostics({ includeProcesses: false, includeWorkspaceMetadata: false })]) + .then(result => { + const [info, remoteData] = result; + this.diagnosticsService.getSystemInfo(info, remoteData).then(msg => { + event.sender.send('vscode:issueSystemInfoResponse', msg); + }); + }); }); ipcMain.on('vscode:listProcesses', async (event: Event) => { @@ -262,8 +265,12 @@ export class IssueService implements IIssueService { }); } - public getSystemStatus(): Promise { - return this.diagnosticsService.getDiagnostics(this.launchService); + public async getSystemStatus(): Promise { + return Promise.all([this.launchService.getMainProcessInfo(), this.launchService.getRemoteDiagnostics({ includeProcesses: false, includeWorkspaceMetadata: false })]) + .then(result => { + const [info, remoteData] = result; + return this.diagnosticsService.getDiagnostics(info, remoteData); + }); } private getWindowPosition(parentWindow: BrowserWindow, defaultWidth: number, defaultHeight: number): IWindowState { @@ -335,14 +342,18 @@ export class IssueService implements IIssueService { } private getPerformanceInfo(): Promise { - return new Promise((resolve, reject) => { - this.diagnosticsService.getPerformanceInfo(this.launchService) - .then(diagnosticInfo => { - resolve(diagnosticInfo); - }) - .catch(err => { - this.logService.warn('issueService#getPerformanceInfo ', err.message); - reject(err); + return new Promise(async (resolve, reject) => { + Promise.all([this.launchService.getMainProcessInfo(), this.launchService.getRemoteDiagnostics({ includeProcesses: true, includeWorkspaceMetadata: true })]) + .then(result => { + const [info, remoteData] = result; + this.diagnosticsService.getPerformanceInfo(info, remoteData) + .then(diagnosticInfo => { + resolve(diagnosticInfo); + }) + .catch(err => { + this.logService.warn('issueService#getPerformanceInfo ', err.message); + reject(err); + }); }); }); } diff --git a/src/vs/platform/launch/common/launchService.ts b/src/vs/platform/launch/common/launchService.ts new file mode 100644 index 00000000000..0c0e1db2134 --- /dev/null +++ b/src/vs/platform/launch/common/launchService.ts @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +import { UriComponents } from 'vs/base/common/uri'; + +export interface IWindowInfo { + pid: number; + title: string; + folderURIs: UriComponents[]; + remoteAuthority?: string; +} + +export interface IMainProcessInfo { + mainPID: number; + // All arguments after argv[0], the exec path + mainArguments: string[]; + windows: IWindowInfo[]; + screenReader: boolean; + gpuFeatureStatus: any; +} \ No newline at end of file diff --git a/src/vs/platform/launch/electron-main/launchService.ts b/src/vs/platform/launch/electron-main/launchService.ts index d5d81a70bf8..c192151f915 100644 --- a/src/vs/platform/launch/electron-main/launchService.ts +++ b/src/vs/platform/launch/electron-main/launchService.ts @@ -14,12 +14,13 @@ import { IWindowsMainService, ICodeWindow } from 'vs/platform/windows/electron-m import { whenDeleted } from 'vs/base/node/pfs'; import { IWorkspacesMainService } from 'vs/platform/workspaces/common/workspaces'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { URI, UriComponents } from 'vs/base/common/uri'; -import { BrowserWindow, ipcMain, Event as IpcEvent } from 'electron'; +import { URI } from 'vs/base/common/uri'; +import { BrowserWindow, ipcMain, Event as IpcEvent, app } from 'electron'; import { Event } from 'vs/base/common/event'; import { hasArgs } from 'vs/platform/environment/node/argv'; import { coalesce } from 'vs/base/common/arrays'; import { IDiagnosticInfoOptions, IDiagnosticInfo, IRemoteDiagnosticInfo, IRemoteDiagnosticError } from 'vs/platform/diagnostics/common/diagnosticsService'; +import { IMainProcessInfo, IWindowInfo } from 'vs/platform/launch/common/launchService'; export const ID = 'launchService'; export const ILaunchService = createDecorator(ID); @@ -29,20 +30,6 @@ export interface IStartArguments { userEnv: IProcessEnvironment; } -export interface IWindowInfo { - pid: number; - title: string; - folderURIs: UriComponents[]; - remoteAuthority?: string; -} - -export interface IMainProcessInfo { - mainPID: number; - // All arguments after argv[0], the exec path - mainArguments: string[]; - windows: IWindowInfo[]; -} - export interface IRemoteDiagnosticOptions { includeProcesses?: boolean; includeWorkspaceMetadata?: boolean; @@ -280,7 +267,9 @@ export class LaunchService implements ILaunchService { return Promise.resolve({ mainPID: process.pid, mainArguments: process.argv.slice(1), - windows + windows, + screenReader: app.isAccessibilitySupportEnabled(), + gpuFeatureStatus: app.getGPUFeatureStatus() }); } diff --git a/src/vs/workbench/contrib/experiments/node/experimentService.ts b/src/vs/workbench/contrib/experiments/electron-browser/experimentService.ts similarity index 99% rename from src/vs/workbench/contrib/experiments/node/experimentService.ts rename to src/vs/workbench/contrib/experiments/electron-browser/experimentService.ts index b20c247e95a..3a451dc20bd 100644 --- a/src/vs/workbench/contrib/experiments/node/experimentService.ts +++ b/src/vs/workbench/contrib/experiments/electron-browser/experimentService.ts @@ -19,7 +19,7 @@ import { match } from 'vs/base/common/glob'; import { asJson } from 'vs/base/node/request'; import { Emitter, Event } from 'vs/base/common/event'; import { ITextFileService, StateChange } from 'vs/workbench/services/textfile/common/textfiles'; -import { WorkspaceStats } from 'vs/workbench/contrib/stats/node/workspaceStats'; +import { WorkspaceStats } from 'vs/workbench/contrib/stats/electron-browser/workspaceStats'; import { CancellationToken } from 'vs/base/common/cancellation'; import { distinct } from 'vs/base/common/arrays'; import { lastSessionDateStorageKey } from 'vs/platform/telemetry/node/workbenchCommonProperties'; diff --git a/src/vs/workbench/contrib/experiments/electron-browser/experimentalPrompt.ts b/src/vs/workbench/contrib/experiments/electron-browser/experimentalPrompt.ts index 29d91beb05e..3581351f6e0 100644 --- a/src/vs/workbench/contrib/experiments/electron-browser/experimentalPrompt.ts +++ b/src/vs/workbench/contrib/experiments/electron-browser/experimentalPrompt.ts @@ -5,7 +5,7 @@ import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { INotificationService, Severity, IPromptChoice } from 'vs/platform/notification/common/notification'; -import { IExperimentService, IExperiment, ExperimentActionType, IExperimentActionPromptProperties, IExperimentActionPromptCommand, ExperimentState } from 'vs/workbench/contrib/experiments/node/experimentService'; +import { IExperimentService, IExperiment, ExperimentActionType, IExperimentActionPromptProperties, IExperimentActionPromptCommand, ExperimentState } from 'vs/workbench/contrib/experiments/electron-browser/experimentService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IExtensionsViewlet } from 'vs/workbench/contrib/extensions/common/extensions'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; diff --git a/src/vs/workbench/contrib/experiments/electron-browser/experiments.contribution.ts b/src/vs/workbench/contrib/experiments/electron-browser/experiments.contribution.ts index b11ad64d0ce..f3dcaf5074e 100644 --- a/src/vs/workbench/contrib/experiments/electron-browser/experiments.contribution.ts +++ b/src/vs/workbench/contrib/experiments/electron-browser/experiments.contribution.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { IExperimentService, ExperimentService } from 'vs/workbench/contrib/experiments/node/experimentService'; +import { IExperimentService, ExperimentService } from 'vs/workbench/contrib/experiments/electron-browser/experimentService'; import { Registry } from 'vs/platform/registry/common/platform'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; 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 69f2ac4cc51..d98057ee111 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 @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { ExperimentService, ExperimentActionType, ExperimentState, IExperiment } from 'vs/workbench/contrib/experiments/node/experimentService'; +import { ExperimentService, ExperimentActionType, ExperimentState, IExperiment } from 'vs/workbench/contrib/experiments/electron-browser/experimentService'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { TestLifecycleService } from 'vs/workbench/test/workbenchTestServices'; 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 16bfb425613..bd21a63a6a2 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 @@ -13,7 +13,7 @@ import { IStorageService, StorageScope } from 'vs/platform/storage/common/storag import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; import { ExperimentalPrompts } from 'vs/workbench/contrib/experiments/electron-browser/experimentalPrompt'; -import { ExperimentActionType, ExperimentState, IExperiment, IExperimentActionPromptProperties, IExperimentService } from 'vs/workbench/contrib/experiments/node/experimentService'; +import { ExperimentActionType, ExperimentState, IExperiment, IExperimentActionPromptProperties, IExperimentService } from 'vs/workbench/contrib/experiments/electron-browser/experimentService'; import { TestExperimentService } from 'vs/workbench/contrib/experiments/test/electron-browser/experimentService.test'; import { TestLifecycleService } from 'vs/workbench/test/workbenchTestServices'; diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionTipsService.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionTipsService.ts index e16509f850d..efa09426215 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionTipsService.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionTipsService.ts @@ -31,7 +31,7 @@ import { flatten, distinct, shuffle, coalesce } from 'vs/base/common/arrays'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { guessMimeTypes, MIME_UNKNOWN } from 'vs/base/common/mime'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; -import { getHashedRemotesFromUri } from 'vs/workbench/contrib/stats/node/workspaceStats'; +import { getHashedRemotesFromUri } from 'vs/workbench/contrib/stats/electron-browser/workspaceStats'; import { IRequestService } from 'vs/platform/request/node/request'; import { asJson } from 'vs/base/node/request'; import { isNumber } from 'vs/base/common/types'; @@ -41,7 +41,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import { assign } from 'vs/base/common/objects'; import { URI } from 'vs/base/common/uri'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; -import { IExperimentService, ExperimentActionType, ExperimentState } from 'vs/workbench/contrib/experiments/node/experimentService'; +import { IExperimentService, ExperimentActionType, ExperimentState } from 'vs/workbench/contrib/experiments/electron-browser/experimentService'; import { CancellationToken } from 'vs/base/common/cancellation'; import { ExtensionType } from 'vs/platform/extensions/common/extensions'; import { extname } from 'vs/base/common/resources'; diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionsViews.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsViews.ts index e5f177c88b1..4b3f428cede 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionsViews.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsViews.ts @@ -34,7 +34,7 @@ import { INotificationService, Severity } from 'vs/platform/notification/common/ import { ViewletPanel, IViewletPanelOptions } from 'vs/workbench/browser/parts/views/panelViewlet'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { distinct, coalesce } from 'vs/base/common/arrays'; -import { IExperimentService, IExperiment, ExperimentActionType } from 'vs/workbench/contrib/experiments/node/experimentService'; +import { IExperimentService, IExperiment, ExperimentActionType } from 'vs/workbench/contrib/experiments/electron-browser/experimentService'; import { alert } from 'vs/base/browser/ui/aria/aria'; import { IListContextMenuEvent } from 'vs/base/browser/ui/list/list'; import { createErrorWithActions } from 'vs/base/common/errorsWithActions'; 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 32d569b0b57..90b0616f421 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 @@ -41,7 +41,7 @@ import { IModelService } from 'vs/editor/common/services/modelService'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { INotificationService, Severity, IPromptChoice, IPromptOptions } from 'vs/platform/notification/common/notification'; import { URLService } from 'vs/platform/url/common/urlService'; -import { IExperimentService } from 'vs/workbench/contrib/experiments/node/experimentService'; +import { IExperimentService } from 'vs/workbench/contrib/experiments/electron-browser/experimentService'; import { TestExperimentService } from 'vs/workbench/contrib/experiments/test/electron-browser/experimentService.test'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { ExtensionType } from 'vs/platform/extensions/common/extensions'; 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 1425d24366c..2f80ab3c8bf 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 @@ -34,7 +34,7 @@ import { URLService } from 'vs/platform/url/common/urlService'; import { URI } from 'vs/base/common/uri'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { SinonStub } from 'sinon'; -import { IExperimentService, ExperimentService, ExperimentState, ExperimentActionType } from 'vs/workbench/contrib/experiments/node/experimentService'; +import { IExperimentService, ExperimentService, ExperimentState, ExperimentActionType } from 'vs/workbench/contrib/experiments/electron-browser/experimentService'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { RemoteAgentService } from 'vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl'; import { ExtensionIdentifier, ExtensionType, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; diff --git a/src/vs/workbench/contrib/stats/node/stats.contribution.ts b/src/vs/workbench/contrib/stats/electron-browser/stats.contribution.ts similarity index 89% rename from src/vs/workbench/contrib/stats/node/stats.contribution.ts rename to src/vs/workbench/contrib/stats/electron-browser/stats.contribution.ts index ee3b9b175d5..b2db16dac1c 100644 --- a/src/vs/workbench/contrib/stats/node/stats.contribution.ts +++ b/src/vs/workbench/contrib/stats/electron-browser/stats.contribution.ts @@ -5,7 +5,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; -import { WorkspaceStats } from 'vs/workbench/contrib/stats/node/workspaceStats'; +import { WorkspaceStats } from 'vs/workbench/contrib/stats/electron-browser/workspaceStats'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; // Register Workspace Stats Contribution diff --git a/src/vs/workbench/contrib/stats/node/workspaceStats.ts b/src/vs/workbench/contrib/stats/electron-browser/workspaceStats.ts similarity index 98% rename from src/vs/workbench/contrib/stats/node/workspaceStats.ts rename to src/vs/workbench/contrib/stats/electron-browser/workspaceStats.ts index db4fcadd84a..8504522b3ef 100644 --- a/src/vs/workbench/contrib/stats/node/workspaceStats.ts +++ b/src/vs/workbench/contrib/stats/electron-browser/workspaceStats.ts @@ -21,6 +21,7 @@ import { IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/commo import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { joinPath } from 'vs/base/common/resources'; import { ITextFileService, ITextFileContent } from 'vs/workbench/services/textfile/common/textfiles'; +import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; const SshProtocolMatcher = /^([^@:]+@)?([^:]+):/; const SshUrlMatcher = /^([^@:]+@)?([^:]+):(.+)$/; @@ -224,7 +225,8 @@ export class WorkspaceStats implements IWorkbenchContribution { @INotificationService private readonly notificationService: INotificationService, @IQuickInputService private readonly quickInputService: IQuickInputService, @IStorageService private readonly storageService: IStorageService, - @ITextFileService private readonly textFileService: ITextFileService + @ITextFileService private readonly textFileService: ITextFileService, + @ISharedProcessService private readonly sharedProcessService: ISharedProcessService ) { this.report(); } @@ -239,6 +241,9 @@ export class WorkspaceStats implements IWorkbenchContribution { this.reportCloudStats(); this.reportProxyStats(); + + const diagnosticsChannel = this.sharedProcessService.getChannel('diagnostics'); + diagnosticsChannel.call('reportWorkspaceStats', this.contextService.getWorkspace()); } private static searchArray(arr: string[], regEx: RegExp): boolean | undefined { diff --git a/src/vs/workbench/contrib/stats/test/workspaceStats.test.ts b/src/vs/workbench/contrib/stats/test/workspaceStats.test.ts index 3543931c185..3cb2162ecdb 100644 --- a/src/vs/workbench/contrib/stats/test/workspaceStats.test.ts +++ b/src/vs/workbench/contrib/stats/test/workspaceStats.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import * as crypto from 'crypto'; -import { getDomainsOfRemotes, getRemotes, getHashedRemotesFromConfig } from 'vs/workbench/contrib/stats/node/workspaceStats'; +import { getDomainsOfRemotes, getRemotes, getHashedRemotesFromConfig } from 'vs/workbench/contrib/stats/electron-browser/workspaceStats'; function hash(value: string): string { return crypto.createHash('sha1').update(value.toString()).digest('hex'); diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/electron-browser/telemetryOptOut.ts b/src/vs/workbench/contrib/welcome/gettingStarted/electron-browser/telemetryOptOut.ts index 2c31578abdc..67edffb9c5f 100644 --- a/src/vs/workbench/contrib/welcome/gettingStarted/electron-browser/telemetryOptOut.ts +++ b/src/vs/workbench/contrib/welcome/gettingStarted/electron-browser/telemetryOptOut.ts @@ -13,7 +13,7 @@ import { URI } from 'vs/base/common/uri'; import { localize } from 'vs/nls'; import { onUnexpectedError } from 'vs/base/common/errors'; import { IWindowService, IWindowsService } from 'vs/platform/windows/common/windows'; -import { IExperimentService, ExperimentState } from 'vs/workbench/contrib/experiments/node/experimentService'; +import { IExperimentService, ExperimentState } from 'vs/workbench/contrib/experiments/electron-browser/experimentService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { language, locale } from 'vs/base/common/platform'; import { IExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionManagement'; diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index b1130436d6d..1175acef2f5 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -215,7 +215,7 @@ import 'vs/workbench/contrib/files/browser/files.contribution'; import 'vs/workbench/contrib/backup/common/backup.contribution'; // Stats -import 'vs/workbench/contrib/stats/node/stats.contribution'; +import 'vs/workbench/contrib/stats/electron-browser/stats.contribution'; // Rapid Render Splash import 'vs/workbench/contrib/splash/electron-browser/partsSplash.contribution'; From 6f37438d9da9dc513aba006b6abda0782a6520bf Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 21 Jun 2019 17:46:21 -0700 Subject: [PATCH 0592/1449] Make return undefined explicit --- src/vs/workbench/contrib/webview/common/portMapping.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/webview/common/portMapping.ts b/src/vs/workbench/contrib/webview/common/portMapping.ts index 487ee92148e..964c0ac6da0 100644 --- a/src/vs/workbench/contrib/webview/common/portMapping.ts +++ b/src/vs/workbench/contrib/webview/common/portMapping.ts @@ -39,8 +39,9 @@ export class WebviewPortMappingManager extends Disposable { const uri = URI.parse(url); const requestLocalHostInfo = extractLocalHostUriMetaDataForPortMapping(uri); if (!requestLocalHostInfo) { - return requestLocalHostInfo; + return undefined; } + for (const mapping of this.mappings()) { if (mapping.webviewPort === requestLocalHostInfo.port) { if (this.extensionLocation && this.extensionLocation.scheme === REMOTE_HOST_SCHEME) { From 8455bc9eb67bc789ef6697e4d0d06392d6fe86d8 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 24 Jun 2019 10:42:20 -0700 Subject: [PATCH 0593/1449] Add missing return --- src/vs/workbench/contrib/webview/browser/pre/host.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/host.js b/src/vs/workbench/contrib/webview/browser/pre/host.js index 903bf54e1c7..6dd66c5b642 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/host.js +++ b/src/vs/workbench/contrib/webview/browser/pre/host.js @@ -37,7 +37,7 @@ const workerReady = new Promise(async (resolveWorkerReady) => { if (!navigator.serviceWorker) { - resolveWorkerReady(); + return resolveWorkerReady(); } const expectedWorkerVersion = 1; From a8fd4499abf1eb85d8fc10e1de63e27f2a89a01a Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 24 Jun 2019 10:46:24 -0700 Subject: [PATCH 0594/1449] Use explicit window.createWebviewManager --- src/vs/workbench/contrib/webview/browser/pre/host.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/host.js b/src/vs/workbench/contrib/webview/browser/pre/host.js index 6dd66c5b642..3ffd33bdb72 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/host.js +++ b/src/vs/workbench/contrib/webview/browser/pre/host.js @@ -80,8 +80,8 @@ } }); }); - var createWebviewManager; - createWebviewManager({ + + window.createWebviewManager({ postMessage: hostMessaging.postMessage.bind(hostMessaging), onMessage: hostMessaging.onMessage.bind(hostMessaging), ready: workerReady, From 0dd15c5120128c4fb6f1d0eea70c419e32ba7098 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Mon, 24 Jun 2019 09:50:25 -0700 Subject: [PATCH 0595/1449] gdpr comments --- src/vs/workbench/services/keybinding/common/keymapInfo.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/services/keybinding/common/keymapInfo.ts b/src/vs/workbench/services/keybinding/common/keymapInfo.ts index cc1108c5ca4..d0ff2d40469 100644 --- a/src/vs/workbench/services/keybinding/common/keymapInfo.ts +++ b/src/vs/workbench/services/keybinding/common/keymapInfo.ts @@ -79,7 +79,7 @@ export interface ILinuxKeyboardLayoutInfo { /* __GDPR__FRAGMENT__ "IKeyboardLayoutInfo" : { "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "lang": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } + "lang": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, "localizedName": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } } */ From 41b3cbc1dc6b9e69a740c044bcd890294383369c Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Mon, 24 Jun 2019 10:41:31 -0700 Subject: [PATCH 0596/1449] webkit fullscreen detection --- src/vs/base/browser/dom.ts | 1 + src/vs/workbench/browser/web.simpleservices.ts | 10 ++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index 3fb6d8b35fc..e201902ae24 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -858,6 +858,7 @@ export const EventType = { RESIZE: 'resize', SCROLL: 'scroll', FULLSCREEN_CHANGE: 'fullscreenchange', + WK_FULLSCREEN_CHANGE: 'webkitfullscreenchange', // Form SELECT: 'select', CHANGE: 'change', diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index f5bccc1b42d..193cb07fd31 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -760,6 +760,14 @@ export class SimpleWindowService extends Disposable implements IWindowService { browser.setFullscreen(false); } })); + + this._register(addDisposableListener(document, EventType.WK_FULLSCREEN_CHANGE, () => { + if (document.fullscreenElement || (document).webkitFullscreenElement || (document).webkitIsFullScreen) { + browser.setFullscreen(true); + } else { + browser.setFullscreen(false); + } + })); } isFocused(): Promise { @@ -832,10 +840,8 @@ export class SimpleWindowService extends Disposable implements IWindowService { try { if (!(document).webkitIsFullScreen) { (target).webkitRequestFullscreen(); // it's async, but doesn't return a real promise. - browser.setFullscreen(true); // we have to set this proactively because Safari doesn't emit fullscreenchange event. } else { (document).webkitExitFullscreen(); // it's async, but doesn't return a real promise. - browser.setFullscreen(false); } } catch { console.warn('Enter/Exit Full Screen failed'); From 777010a73437c92b599e27f25d703703b91017e7 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 24 Jun 2019 11:54:34 -0700 Subject: [PATCH 0597/1449] Fix file name spelling --- .../src/tsServer/{spanwer.ts => spawner.ts} | 0 .../typescript-language-features/src/typescriptServiceClient.ts | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename extensions/typescript-language-features/src/tsServer/{spanwer.ts => spawner.ts} (100%) diff --git a/extensions/typescript-language-features/src/tsServer/spanwer.ts b/extensions/typescript-language-features/src/tsServer/spawner.ts similarity index 100% rename from extensions/typescript-language-features/src/tsServer/spanwer.ts rename to extensions/typescript-language-features/src/tsServer/spawner.ts diff --git a/extensions/typescript-language-features/src/typescriptServiceClient.ts b/extensions/typescript-language-features/src/typescriptServiceClient.ts index 6285981756a..996478d6c22 100644 --- a/extensions/typescript-language-features/src/typescriptServiceClient.ts +++ b/extensions/typescript-language-features/src/typescriptServiceClient.ts @@ -25,7 +25,7 @@ import Tracer from './utils/tracer'; import { inferredProjectConfig } from './utils/tsconfig'; import { TypeScriptVersionPicker } from './utils/versionPicker'; import { TypeScriptVersion, TypeScriptVersionProvider } from './utils/versionProvider'; -import { TypeScriptServerSpawner } from './tsServer/spanwer'; +import { TypeScriptServerSpawner } from './tsServer/spawner'; const localize = nls.loadMessageBundle(); From 89012792f805ad61a64bcf272cca6e8dd9a509cf Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Mon, 24 Jun 2019 12:00:13 -0700 Subject: [PATCH 0598/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7755b30ebef..e7c10b4b0a7 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "6e5b8dfbbda7ce121811e397d16842251bd666aa", + "distro": "f22db93b3c64b0787d98aef556519af82c64860b", "author": { "name": "Microsoft Corporation" }, From a36931eb31deee60e1cc051c0396db0a8ce75620 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 24 Jun 2019 20:40:14 +0200 Subject: [PATCH 0599/1449] add logging --- .../extensionManagement/node/extensionManagementIpc.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/platform/extensionManagement/node/extensionManagementIpc.ts b/src/vs/platform/extensionManagement/node/extensionManagementIpc.ts index f66cde1d510..e290cc0b069 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementIpc.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementIpc.ts @@ -12,6 +12,7 @@ import { cloneAndChange } from 'vs/base/common/objects'; import { ExtensionType } from 'vs/platform/extensions/common/extensions'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { ILogService } from 'vs/platform/log/common/log'; +import { toErrorMessage } from 'vs/base/common/errorMessage'; function transformIncomingURI(uri: UriComponents, transformer: IURITransformer | null): URI { return URI.revive(transformer ? transformer.transformIncoming(uri) : uri); @@ -110,11 +111,14 @@ export class ExtensionManagementChannelClient implements IExtensionManagementSer } catch (error) { if (this.remote) { try { + this.logService.error(`Error while installing '${extension.identifier.id}' extension in the remote server.`, toErrorMessage(error)); + this.logService.info(`Trying to download '${extension.identifier.id}' extension locally and install`); const compatible = await this.galleryService.getCompatibleExtension(extension); if (compatible) { const installed = await this.getInstalled(ExtensionType.User); const location = await this.galleryService.download(compatible, installed.filter(i => areSameExtensions(i.identifier, extension.identifier))[0] ? InstallOperation.Update : InstallOperation.Install); await this.install(URI.file(location)); + this.logService.info(`Successfully installed '${extension.identifier.id}' extension`); return; } } catch (e) { From ba398b6ddde91284c1c1ecb8f4a6f6503cbedc44 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 24 Jun 2019 20:40:32 +0200 Subject: [PATCH 0600/1449] disabling installing extension from gallery when not enabled --- .../extensionManagement/node/extensionManagementService.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 36fc28f7e00..082fea1589a 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -265,6 +265,9 @@ export class ExtensionManagementService extends Disposable implements IExtension } async installFromGallery(extension: IGalleryExtension): Promise { + if (!this.galleryService.isEnabled()) { + return Promise.reject(new Error(nls.localize('MarketPlaceDisabled', "Marketplace is not enabled"))); + } const startTime = new Date().getTime(); const onDidInstallExtensionSuccess = (extension: IGalleryExtension, operation: InstallOperation, local: ILocalExtension) => { From 0bd9e94685ef6be3e51ea48649d7588d7c0ce84a Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Mon, 24 Jun 2019 12:13:11 -0700 Subject: [PATCH 0601/1449] Update intellisense icons --- .../documentSymbols/media/BooleanData_16x.svg | 1 - .../media/BooleanData_16x_darkp.svg | 1 - .../documentSymbols/media/Class_16x.svg | 1 - .../documentSymbols/media/Class_16x_darkp.svg | 1 - .../media/ColorPalette_ColorPalette_16x.svg | 1 - .../ColorPalette_ColorPalette_16x_darkp.svg | 1 - .../documentSymbols/media/Constant_16x.svg | 1 - .../media/Constant_16x_inverse.svg | 1 - .../documentSymbols/media/Document_16x.svg | 1 - .../media/Document_16x_darkp.svg | 1 - .../documentSymbols/media/EnumItem_16x.svg | 1 - .../media/EnumItem_inverse_16x.svg | 1 - .../documentSymbols/media/Enumerator_16x.svg | 1 - .../media/Enumerator_inverse_16x.svg | 1 - .../media/Event_16x_vscode.svg | 1 - .../media/Event_16x_vscode_inverse.svg | 1 - .../documentSymbols/media/Field_16x.svg | 1 - .../documentSymbols/media/Field_16x_darkp.svg | 1 - .../documentSymbols/media/Indexer_16x.svg | 1 - .../media/Indexer_16x_darkp.svg | 1 - .../media/IntelliSenseKeyword_16x.svg | 1 - .../media/IntelliSenseKeyword_16x_darkp.svg | 1 - .../documentSymbols/media/Interface_16x.svg | 1 - .../media/Interface_16x_darkp.svg | 1 - .../media/LocalVariable_16x_vscode.svg | 1 - .../LocalVariable_16x_vscode_inverse.svg | 1 - .../documentSymbols/media/Method_16x.svg | 1 - .../media/Method_16x_darkp.svg | 1 - .../documentSymbols/media/Namespace_16x.svg | 1 - .../media/Namespace_16x_darkp.svg | 1 - .../documentSymbols/media/Numeric_16x.svg | 1 - .../media/Numeric_16x_darkp.svg | 1 - .../media/Operator_16x_vscode.svg | 1 - .../media/Operator_16x_vscode_inverse.svg | 1 - .../documentSymbols/media/Property_16x.svg | 1 - .../media/Property_16x_darkp.svg | 1 - .../documentSymbols/media/Snippet_16x.svg | 1 - .../media/Snippet_16x_darkp.svg | 1 - .../documentSymbols/media/String_16x.svg | 1 - .../media/String_16x_darkp.svg | 1 - .../media/Structure_16x_vscode.svg | 1 - .../media/Structure_16x_vscode_inverse.svg | 1 - .../media/Template_16x_vscode.svg | 1 - .../media/Template_16x_vscode_inverse.svg | 1 - .../documentSymbols/media/boolean-dark.svg | 4 + .../documentSymbols/media/boolean-light.svg | 4 + .../documentSymbols/media/class-dark.svg | 7 ++ .../documentSymbols/media/class-light.svg | 7 ++ .../documentSymbols/media/constant-dark.svg | 4 + .../documentSymbols/media/constant-light.svg | 4 + .../documentSymbols/media/enumerator-dark.svg | 7 ++ .../media/enumerator-item-dark.svg | 3 + .../media/enumerator-item-light.svg | 3 + .../media/enumerator-light.svg | 7 ++ .../documentSymbols/media/event-dark.svg | 3 + .../documentSymbols/media/event-light.svg | 3 + .../documentSymbols/media/field-dark.svg | 3 + .../documentSymbols/media/field-light.svg | 3 + .../documentSymbols/media/file-dark.svg | 3 + .../documentSymbols/media/file-light.svg | 3 + .../documentSymbols/media/indexer-dark.svg | 4 + .../documentSymbols/media/indexer-light.svg | 4 + .../documentSymbols/media/interface-dark.svg | 5 + .../documentSymbols/media/interface-light.svg | 5 + .../documentSymbols/media/keyword-dark.svg | 3 + .../documentSymbols/media/keyword-light.svg | 3 + .../documentSymbols/media/method-dark.svg | 3 + .../documentSymbols/media/method-light.svg | 3 + .../documentSymbols/media/namespace-dark.svg | 4 + .../documentSymbols/media/namespace-light.svg | 4 + .../documentSymbols/media/numeric-dark.svg | 6 + .../documentSymbols/media/numeric-light.svg | 6 + .../documentSymbols/media/operator-dark.svg | 15 +++ .../documentSymbols/media/operator-light.svg | 15 +++ .../documentSymbols/media/property-dark.svg | 3 + .../documentSymbols/media/property-light.svg | 3 + .../documentSymbols/media/snippet-dark.svg | 10 ++ .../documentSymbols/media/snippet-light.svg | 10 ++ .../documentSymbols/media/string-dark.svg | 8 ++ .../documentSymbols/media/string-light.svg | 8 ++ .../documentSymbols/media/structure-dark.svg | 5 + .../documentSymbols/media/structure-light.svg | 5 + .../documentSymbols/media/symbol-icons.css | 116 +++++++++--------- .../documentSymbols/media/template-dark.svg | 5 + .../documentSymbols/media/template-light.svg | 5 + .../documentSymbols/media/variable-dark.svg | 4 + .../documentSymbols/media/variable-light.svg | 4 + .../contrib/suggest/media/boolean-dark.svg | 4 + .../contrib/suggest/media/boolean-light.svg | 4 + .../contrib/suggest/media/class-dark.svg | 7 ++ .../contrib/suggest/media/class-light.svg | 7 ++ .../contrib/suggest/media/color-dark.svg | 3 + .../contrib/suggest/media/color-light.svg | 3 + .../contrib/suggest/media/constant-dark.svg | 4 + .../contrib/suggest/media/constant-light.svg | 4 + .../contrib/suggest/media/enumerator-dark.svg | 6 + .../suggest/media/enumerator-item-dark.svg | 3 + .../suggest/media/enumerator-item-light.svg | 3 + .../suggest/media/enumerator-light.svg | 6 + .../contrib/suggest/media/event-dark.svg | 3 + .../contrib/suggest/media/event-light.svg | 3 + .../contrib/suggest/media/field-dark.svg | 3 + .../contrib/suggest/media/field-light.svg | 3 + .../contrib/suggest/media/file-dark.svg | 3 + .../contrib/suggest/media/file-light.svg | 3 + .../contrib/suggest/media/folder-dark.svg | 3 + .../contrib/suggest/media/folder-light.svg | 3 + .../contrib/suggest/media/indexer-dark.svg | 4 + .../contrib/suggest/media/indexer-light.svg | 4 + .../contrib/suggest/media/interface-dark.svg | 5 + .../contrib/suggest/media/interface-light.svg | 5 + .../contrib/suggest/media/keyword-dark.svg | 3 + .../contrib/suggest/media/keyword-light.svg | 3 + .../contrib/suggest/media/method-dark.svg | 3 + .../contrib/suggest/media/method-light.svg | 3 + .../contrib/suggest/media/namespace-dark.svg | 4 + .../contrib/suggest/media/namespace-light.svg | 4 + .../contrib/suggest/media/numeric-dark.svg | 6 + .../contrib/suggest/media/numeric-light.svg | 6 + .../contrib/suggest/media/operator-dark.svg | 15 +++ .../contrib/suggest/media/operator-light.svg | 15 +++ .../contrib/suggest/media/property-dark.svg | 3 + .../contrib/suggest/media/property-light.svg | 3 + .../contrib/suggest/media/reference-dark.svg | 4 + .../contrib/suggest/media/reference-light.svg | 4 + .../contrib/suggest/media/ruler-dark.svg | 4 + .../contrib/suggest/media/ruler-light.svg | 4 + .../contrib/suggest/media/snippet-dark.svg | 10 ++ .../contrib/suggest/media/snippet-light.svg | 10 ++ .../contrib/suggest/media/string-dark.svg | 8 ++ .../contrib/suggest/media/string-light.svg | 8 ++ .../contrib/suggest/media/structure-dark.svg | 5 + .../contrib/suggest/media/structure-light.svg | 5 + .../editor/contrib/suggest/media/suggest.css | 88 ++++++------- .../contrib/suggest/media/template-dark.svg | 5 + .../contrib/suggest/media/template-light.svg | 5 + .../contrib/suggest/media/variable-dark.svg | 4 + .../contrib/suggest/media/variable-light.svg | 4 + 138 files changed, 564 insertions(+), 146 deletions(-) delete mode 100644 src/vs/editor/contrib/documentSymbols/media/BooleanData_16x.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/BooleanData_16x_darkp.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Class_16x.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Class_16x_darkp.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/ColorPalette_ColorPalette_16x.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/ColorPalette_ColorPalette_16x_darkp.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Constant_16x.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Constant_16x_inverse.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Document_16x.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Document_16x_darkp.svg delete mode 100755 src/vs/editor/contrib/documentSymbols/media/EnumItem_16x.svg delete mode 100755 src/vs/editor/contrib/documentSymbols/media/EnumItem_inverse_16x.svg delete mode 100755 src/vs/editor/contrib/documentSymbols/media/Enumerator_16x.svg delete mode 100755 src/vs/editor/contrib/documentSymbols/media/Enumerator_inverse_16x.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Event_16x_vscode.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Event_16x_vscode_inverse.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Field_16x.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Field_16x_darkp.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Indexer_16x.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Indexer_16x_darkp.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/IntelliSenseKeyword_16x.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/IntelliSenseKeyword_16x_darkp.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Interface_16x.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Interface_16x_darkp.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/LocalVariable_16x_vscode.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/LocalVariable_16x_vscode_inverse.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Method_16x.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Method_16x_darkp.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Namespace_16x.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Namespace_16x_darkp.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Numeric_16x.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Numeric_16x_darkp.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Operator_16x_vscode.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Operator_16x_vscode_inverse.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Property_16x.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Property_16x_darkp.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Snippet_16x.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Snippet_16x_darkp.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/String_16x.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/String_16x_darkp.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Structure_16x_vscode.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Structure_16x_vscode_inverse.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Template_16x_vscode.svg delete mode 100644 src/vs/editor/contrib/documentSymbols/media/Template_16x_vscode_inverse.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/boolean-dark.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/boolean-light.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/class-dark.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/class-light.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/constant-dark.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/constant-light.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/enumerator-dark.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/enumerator-item-dark.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/enumerator-item-light.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/enumerator-light.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/event-dark.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/event-light.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/field-dark.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/field-light.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/file-dark.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/file-light.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/indexer-dark.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/indexer-light.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/interface-dark.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/interface-light.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/keyword-dark.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/keyword-light.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/method-dark.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/method-light.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/namespace-dark.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/namespace-light.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/numeric-dark.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/numeric-light.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/operator-dark.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/operator-light.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/property-dark.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/property-light.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/snippet-dark.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/snippet-light.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/string-dark.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/string-light.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/structure-dark.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/structure-light.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/template-dark.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/template-light.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/variable-dark.svg create mode 100644 src/vs/editor/contrib/documentSymbols/media/variable-light.svg create mode 100644 src/vs/editor/contrib/suggest/media/boolean-dark.svg create mode 100644 src/vs/editor/contrib/suggest/media/boolean-light.svg create mode 100644 src/vs/editor/contrib/suggest/media/class-dark.svg create mode 100644 src/vs/editor/contrib/suggest/media/class-light.svg create mode 100644 src/vs/editor/contrib/suggest/media/color-dark.svg create mode 100644 src/vs/editor/contrib/suggest/media/color-light.svg create mode 100644 src/vs/editor/contrib/suggest/media/constant-dark.svg create mode 100644 src/vs/editor/contrib/suggest/media/constant-light.svg create mode 100644 src/vs/editor/contrib/suggest/media/enumerator-dark.svg create mode 100644 src/vs/editor/contrib/suggest/media/enumerator-item-dark.svg create mode 100644 src/vs/editor/contrib/suggest/media/enumerator-item-light.svg create mode 100644 src/vs/editor/contrib/suggest/media/enumerator-light.svg create mode 100644 src/vs/editor/contrib/suggest/media/event-dark.svg create mode 100644 src/vs/editor/contrib/suggest/media/event-light.svg create mode 100644 src/vs/editor/contrib/suggest/media/field-dark.svg create mode 100644 src/vs/editor/contrib/suggest/media/field-light.svg create mode 100644 src/vs/editor/contrib/suggest/media/file-dark.svg create mode 100644 src/vs/editor/contrib/suggest/media/file-light.svg create mode 100644 src/vs/editor/contrib/suggest/media/folder-dark.svg create mode 100644 src/vs/editor/contrib/suggest/media/folder-light.svg create mode 100644 src/vs/editor/contrib/suggest/media/indexer-dark.svg create mode 100644 src/vs/editor/contrib/suggest/media/indexer-light.svg create mode 100644 src/vs/editor/contrib/suggest/media/interface-dark.svg create mode 100644 src/vs/editor/contrib/suggest/media/interface-light.svg create mode 100644 src/vs/editor/contrib/suggest/media/keyword-dark.svg create mode 100644 src/vs/editor/contrib/suggest/media/keyword-light.svg create mode 100644 src/vs/editor/contrib/suggest/media/method-dark.svg create mode 100644 src/vs/editor/contrib/suggest/media/method-light.svg create mode 100644 src/vs/editor/contrib/suggest/media/namespace-dark.svg create mode 100644 src/vs/editor/contrib/suggest/media/namespace-light.svg create mode 100644 src/vs/editor/contrib/suggest/media/numeric-dark.svg create mode 100644 src/vs/editor/contrib/suggest/media/numeric-light.svg create mode 100644 src/vs/editor/contrib/suggest/media/operator-dark.svg create mode 100644 src/vs/editor/contrib/suggest/media/operator-light.svg create mode 100644 src/vs/editor/contrib/suggest/media/property-dark.svg create mode 100644 src/vs/editor/contrib/suggest/media/property-light.svg create mode 100644 src/vs/editor/contrib/suggest/media/reference-dark.svg create mode 100644 src/vs/editor/contrib/suggest/media/reference-light.svg create mode 100644 src/vs/editor/contrib/suggest/media/ruler-dark.svg create mode 100644 src/vs/editor/contrib/suggest/media/ruler-light.svg create mode 100644 src/vs/editor/contrib/suggest/media/snippet-dark.svg create mode 100644 src/vs/editor/contrib/suggest/media/snippet-light.svg create mode 100644 src/vs/editor/contrib/suggest/media/string-dark.svg create mode 100644 src/vs/editor/contrib/suggest/media/string-light.svg create mode 100644 src/vs/editor/contrib/suggest/media/structure-dark.svg create mode 100644 src/vs/editor/contrib/suggest/media/structure-light.svg create mode 100644 src/vs/editor/contrib/suggest/media/template-dark.svg create mode 100644 src/vs/editor/contrib/suggest/media/template-light.svg create mode 100644 src/vs/editor/contrib/suggest/media/variable-dark.svg create mode 100644 src/vs/editor/contrib/suggest/media/variable-light.svg diff --git a/src/vs/editor/contrib/documentSymbols/media/BooleanData_16x.svg b/src/vs/editor/contrib/documentSymbols/media/BooleanData_16x.svg deleted file mode 100644 index d9fd295d0b6..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/BooleanData_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/BooleanData_16x_darkp.svg b/src/vs/editor/contrib/documentSymbols/media/BooleanData_16x_darkp.svg deleted file mode 100644 index 48e8c5a3838..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/BooleanData_16x_darkp.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Class_16x.svg b/src/vs/editor/contrib/documentSymbols/media/Class_16x.svg deleted file mode 100644 index e553c3633e5..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Class_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Class_16x_darkp.svg b/src/vs/editor/contrib/documentSymbols/media/Class_16x_darkp.svg deleted file mode 100644 index c43aad29efd..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Class_16x_darkp.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/ColorPalette_ColorPalette_16x.svg b/src/vs/editor/contrib/documentSymbols/media/ColorPalette_ColorPalette_16x.svg deleted file mode 100644 index 2af5cc6faef..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/ColorPalette_ColorPalette_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/ColorPalette_ColorPalette_16x_darkp.svg b/src/vs/editor/contrib/documentSymbols/media/ColorPalette_ColorPalette_16x_darkp.svg deleted file mode 100644 index a2df3032cb1..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/ColorPalette_ColorPalette_16x_darkp.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Constant_16x.svg b/src/vs/editor/contrib/documentSymbols/media/Constant_16x.svg deleted file mode 100644 index ed2a1751005..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Constant_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Constant_16x_inverse.svg b/src/vs/editor/contrib/documentSymbols/media/Constant_16x_inverse.svg deleted file mode 100644 index 173e427f964..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Constant_16x_inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Document_16x.svg b/src/vs/editor/contrib/documentSymbols/media/Document_16x.svg deleted file mode 100644 index 7b36178ab46..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Document_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Document_16x_darkp.svg b/src/vs/editor/contrib/documentSymbols/media/Document_16x_darkp.svg deleted file mode 100644 index bced3a467ee..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Document_16x_darkp.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/EnumItem_16x.svg b/src/vs/editor/contrib/documentSymbols/media/EnumItem_16x.svg deleted file mode 100755 index aa901ec1934..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/EnumItem_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/EnumItem_inverse_16x.svg b/src/vs/editor/contrib/documentSymbols/media/EnumItem_inverse_16x.svg deleted file mode 100755 index 791759092fc..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/EnumItem_inverse_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Enumerator_16x.svg b/src/vs/editor/contrib/documentSymbols/media/Enumerator_16x.svg deleted file mode 100755 index e4a9551fd5a..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Enumerator_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Enumerator_inverse_16x.svg b/src/vs/editor/contrib/documentSymbols/media/Enumerator_inverse_16x.svg deleted file mode 100755 index d8e9f4f107a..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Enumerator_inverse_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Event_16x_vscode.svg b/src/vs/editor/contrib/documentSymbols/media/Event_16x_vscode.svg deleted file mode 100644 index 0e202ec10be..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Event_16x_vscode.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Event_16x_vscode_inverse.svg b/src/vs/editor/contrib/documentSymbols/media/Event_16x_vscode_inverse.svg deleted file mode 100644 index a508edcd3d6..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Event_16x_vscode_inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Field_16x.svg b/src/vs/editor/contrib/documentSymbols/media/Field_16x.svg deleted file mode 100644 index e1b5aa5e31d..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Field_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Field_16x_darkp.svg b/src/vs/editor/contrib/documentSymbols/media/Field_16x_darkp.svg deleted file mode 100644 index 5fc48ceff0f..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Field_16x_darkp.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Indexer_16x.svg b/src/vs/editor/contrib/documentSymbols/media/Indexer_16x.svg deleted file mode 100644 index ff55f31ffa3..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Indexer_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Indexer_16x_darkp.svg b/src/vs/editor/contrib/documentSymbols/media/Indexer_16x_darkp.svg deleted file mode 100644 index 2f3788e7730..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Indexer_16x_darkp.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/IntelliSenseKeyword_16x.svg b/src/vs/editor/contrib/documentSymbols/media/IntelliSenseKeyword_16x.svg deleted file mode 100644 index 7a80c7fe260..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/IntelliSenseKeyword_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/IntelliSenseKeyword_16x_darkp.svg b/src/vs/editor/contrib/documentSymbols/media/IntelliSenseKeyword_16x_darkp.svg deleted file mode 100644 index ef98b5133fd..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/IntelliSenseKeyword_16x_darkp.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Interface_16x.svg b/src/vs/editor/contrib/documentSymbols/media/Interface_16x.svg deleted file mode 100644 index 0c08c8d50af..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Interface_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Interface_16x_darkp.svg b/src/vs/editor/contrib/documentSymbols/media/Interface_16x_darkp.svg deleted file mode 100644 index f7c2934a55c..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Interface_16x_darkp.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/LocalVariable_16x_vscode.svg b/src/vs/editor/contrib/documentSymbols/media/LocalVariable_16x_vscode.svg deleted file mode 100644 index e78894b6c63..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/LocalVariable_16x_vscode.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/LocalVariable_16x_vscode_inverse.svg b/src/vs/editor/contrib/documentSymbols/media/LocalVariable_16x_vscode_inverse.svg deleted file mode 100644 index 44a44b489d1..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/LocalVariable_16x_vscode_inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Method_16x.svg b/src/vs/editor/contrib/documentSymbols/media/Method_16x.svg deleted file mode 100644 index e1b587f9cc0..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Method_16x.svg +++ /dev/null @@ -1 +0,0 @@ -Method_16x \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Method_16x_darkp.svg b/src/vs/editor/contrib/documentSymbols/media/Method_16x_darkp.svg deleted file mode 100644 index 0b7dd26efd3..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Method_16x_darkp.svg +++ /dev/null @@ -1 +0,0 @@ -Method_16x \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Namespace_16x.svg b/src/vs/editor/contrib/documentSymbols/media/Namespace_16x.svg deleted file mode 100644 index 772b9152cb5..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Namespace_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Namespace_16x_darkp.svg b/src/vs/editor/contrib/documentSymbols/media/Namespace_16x_darkp.svg deleted file mode 100644 index dc052a068ca..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Namespace_16x_darkp.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Numeric_16x.svg b/src/vs/editor/contrib/documentSymbols/media/Numeric_16x.svg deleted file mode 100644 index ac848f89b8c..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Numeric_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Numeric_16x_darkp.svg b/src/vs/editor/contrib/documentSymbols/media/Numeric_16x_darkp.svg deleted file mode 100644 index 4144eea0c06..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Numeric_16x_darkp.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Operator_16x_vscode.svg b/src/vs/editor/contrib/documentSymbols/media/Operator_16x_vscode.svg deleted file mode 100644 index ba2f2d091cf..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Operator_16x_vscode.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Operator_16x_vscode_inverse.svg b/src/vs/editor/contrib/documentSymbols/media/Operator_16x_vscode_inverse.svg deleted file mode 100644 index 21e1e814b2e..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Operator_16x_vscode_inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Property_16x.svg b/src/vs/editor/contrib/documentSymbols/media/Property_16x.svg deleted file mode 100644 index cac629e1132..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Property_16x.svg +++ /dev/null @@ -1 +0,0 @@ -Property_16x \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Property_16x_darkp.svg b/src/vs/editor/contrib/documentSymbols/media/Property_16x_darkp.svg deleted file mode 100644 index bad83c9a321..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Property_16x_darkp.svg +++ /dev/null @@ -1 +0,0 @@ -Property_16x \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Snippet_16x.svg b/src/vs/editor/contrib/documentSymbols/media/Snippet_16x.svg deleted file mode 100644 index 640c247786e..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Snippet_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Snippet_16x_darkp.svg b/src/vs/editor/contrib/documentSymbols/media/Snippet_16x_darkp.svg deleted file mode 100644 index 0fb4b8bc9e3..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Snippet_16x_darkp.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/String_16x.svg b/src/vs/editor/contrib/documentSymbols/media/String_16x.svg deleted file mode 100644 index 880d50dd03f..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/String_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/String_16x_darkp.svg b/src/vs/editor/contrib/documentSymbols/media/String_16x_darkp.svg deleted file mode 100644 index de3ea3b37eb..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/String_16x_darkp.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Structure_16x_vscode.svg b/src/vs/editor/contrib/documentSymbols/media/Structure_16x_vscode.svg deleted file mode 100644 index e776cbc5651..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Structure_16x_vscode.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Structure_16x_vscode_inverse.svg b/src/vs/editor/contrib/documentSymbols/media/Structure_16x_vscode_inverse.svg deleted file mode 100644 index 1b76b62be9a..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Structure_16x_vscode_inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Template_16x_vscode.svg b/src/vs/editor/contrib/documentSymbols/media/Template_16x_vscode.svg deleted file mode 100644 index 788cc8d6450..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Template_16x_vscode.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/Template_16x_vscode_inverse.svg b/src/vs/editor/contrib/documentSymbols/media/Template_16x_vscode_inverse.svg deleted file mode 100644 index 6cec71cb033..00000000000 --- a/src/vs/editor/contrib/documentSymbols/media/Template_16x_vscode_inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/documentSymbols/media/boolean-dark.svg b/src/vs/editor/contrib/documentSymbols/media/boolean-dark.svg new file mode 100644 index 00000000000..d9bcbe9dac0 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/boolean-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/boolean-light.svg b/src/vs/editor/contrib/documentSymbols/media/boolean-light.svg new file mode 100644 index 00000000000..647040941d1 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/boolean-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/class-dark.svg b/src/vs/editor/contrib/documentSymbols/media/class-dark.svg new file mode 100644 index 00000000000..8643ca84051 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/class-dark.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/class-light.svg b/src/vs/editor/contrib/documentSymbols/media/class-light.svg new file mode 100644 index 00000000000..5e338c8fc61 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/class-light.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/constant-dark.svg b/src/vs/editor/contrib/documentSymbols/media/constant-dark.svg new file mode 100644 index 00000000000..0e90ecafcd8 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/constant-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/constant-light.svg b/src/vs/editor/contrib/documentSymbols/media/constant-light.svg new file mode 100644 index 00000000000..1a369c1d8aa --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/constant-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/enumerator-dark.svg b/src/vs/editor/contrib/documentSymbols/media/enumerator-dark.svg new file mode 100644 index 00000000000..8643ca84051 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/enumerator-dark.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/enumerator-item-dark.svg b/src/vs/editor/contrib/documentSymbols/media/enumerator-item-dark.svg new file mode 100644 index 00000000000..23c697fdf17 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/enumerator-item-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/enumerator-item-light.svg b/src/vs/editor/contrib/documentSymbols/media/enumerator-item-light.svg new file mode 100644 index 00000000000..a99045d3352 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/enumerator-item-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/enumerator-light.svg b/src/vs/editor/contrib/documentSymbols/media/enumerator-light.svg new file mode 100644 index 00000000000..5e338c8fc61 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/enumerator-light.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/event-dark.svg b/src/vs/editor/contrib/documentSymbols/media/event-dark.svg new file mode 100644 index 00000000000..051bef316e9 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/event-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/event-light.svg b/src/vs/editor/contrib/documentSymbols/media/event-light.svg new file mode 100644 index 00000000000..712344d1f92 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/event-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/field-dark.svg b/src/vs/editor/contrib/documentSymbols/media/field-dark.svg new file mode 100644 index 00000000000..15623061c5d --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/field-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/field-light.svg b/src/vs/editor/contrib/documentSymbols/media/field-light.svg new file mode 100644 index 00000000000..72dd79504f6 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/field-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/file-dark.svg b/src/vs/editor/contrib/documentSymbols/media/file-dark.svg new file mode 100644 index 00000000000..5ed5762a1f0 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/file-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/file-light.svg b/src/vs/editor/contrib/documentSymbols/media/file-light.svg new file mode 100644 index 00000000000..ad54e13b1b1 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/file-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/indexer-dark.svg b/src/vs/editor/contrib/documentSymbols/media/indexer-dark.svg new file mode 100644 index 00000000000..f45aebbdb3d --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/indexer-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/indexer-light.svg b/src/vs/editor/contrib/documentSymbols/media/indexer-light.svg new file mode 100644 index 00000000000..31a880850e2 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/indexer-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/interface-dark.svg b/src/vs/editor/contrib/documentSymbols/media/interface-dark.svg new file mode 100644 index 00000000000..42156059c6a --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/interface-dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/interface-light.svg b/src/vs/editor/contrib/documentSymbols/media/interface-light.svg new file mode 100644 index 00000000000..4b63ceb782f --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/interface-light.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/keyword-dark.svg b/src/vs/editor/contrib/documentSymbols/media/keyword-dark.svg new file mode 100644 index 00000000000..70ba6ea9331 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/keyword-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/keyword-light.svg b/src/vs/editor/contrib/documentSymbols/media/keyword-light.svg new file mode 100644 index 00000000000..fc57528a3ef --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/keyword-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/method-dark.svg b/src/vs/editor/contrib/documentSymbols/media/method-dark.svg new file mode 100644 index 00000000000..970d7b61480 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/method-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/method-light.svg b/src/vs/editor/contrib/documentSymbols/media/method-light.svg new file mode 100644 index 00000000000..403a9b90dd9 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/method-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/namespace-dark.svg b/src/vs/editor/contrib/documentSymbols/media/namespace-dark.svg new file mode 100644 index 00000000000..17989d852de --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/namespace-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/namespace-light.svg b/src/vs/editor/contrib/documentSymbols/media/namespace-light.svg new file mode 100644 index 00000000000..f1e10c55c98 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/namespace-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/numeric-dark.svg b/src/vs/editor/contrib/documentSymbols/media/numeric-dark.svg new file mode 100644 index 00000000000..9b7874a43ec --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/numeric-dark.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/numeric-light.svg b/src/vs/editor/contrib/documentSymbols/media/numeric-light.svg new file mode 100644 index 00000000000..c6e9a426a9f --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/numeric-light.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/operator-dark.svg b/src/vs/editor/contrib/documentSymbols/media/operator-dark.svg new file mode 100644 index 00000000000..de1650a86d2 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/operator-dark.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/operator-light.svg b/src/vs/editor/contrib/documentSymbols/media/operator-light.svg new file mode 100644 index 00000000000..4818a644a10 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/operator-light.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/property-dark.svg b/src/vs/editor/contrib/documentSymbols/media/property-dark.svg new file mode 100644 index 00000000000..7137a9d7bb5 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/property-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/property-light.svg b/src/vs/editor/contrib/documentSymbols/media/property-light.svg new file mode 100644 index 00000000000..60f77501db7 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/property-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/snippet-dark.svg b/src/vs/editor/contrib/documentSymbols/media/snippet-dark.svg new file mode 100644 index 00000000000..394ad9e4b28 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/snippet-dark.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/snippet-light.svg b/src/vs/editor/contrib/documentSymbols/media/snippet-light.svg new file mode 100644 index 00000000000..d4f45485987 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/snippet-light.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/string-dark.svg b/src/vs/editor/contrib/documentSymbols/media/string-dark.svg new file mode 100644 index 00000000000..315ca4537a4 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/string-dark.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/string-light.svg b/src/vs/editor/contrib/documentSymbols/media/string-light.svg new file mode 100644 index 00000000000..c902ea2faf3 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/string-light.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/structure-dark.svg b/src/vs/editor/contrib/documentSymbols/media/structure-dark.svg new file mode 100644 index 00000000000..599b10565e5 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/structure-dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/structure-light.svg b/src/vs/editor/contrib/documentSymbols/media/structure-light.svg new file mode 100644 index 00000000000..9de849e9f43 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/structure-light.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/symbol-icons.css b/src/vs/editor/contrib/documentSymbols/media/symbol-icons.css index 2a6a31185fa..3494d1440a9 100644 --- a/src/vs/editor/contrib/documentSymbols/media/symbol-icons.css +++ b/src/vs/editor/contrib/documentSymbols/media/symbol-icons.css @@ -19,264 +19,264 @@ /* default icons */ .monaco-workbench .symbol-icon { - background-image: url('Field_16x.svg'); + background-image: url('field-light.svg'); background-repeat: no-repeat; } .vs-dark .monaco-workbench .symbol-icon, .hc-black .monaco-workbench .symbol-icon { - background-image: url('Field_16x_darkp.svg'); + background-image: url('field-dark.svg'); } /* constant */ .monaco-workbench .symbol-icon.constant { - background-image: url('Constant_16x.svg'); + background-image: url('constant-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.constant, .hc-black .monaco-workbench .symbol-icon.constant { - background-image: url('Constant_16x_inverse.svg'); + background-image: url('constant-dark.svg'); } /* enum */ .monaco-workbench .symbol-icon.enum { - background-image: url('Enumerator_16x.svg'); + background-image: url('enumerator-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.enum, .hc-black .monaco-workbench .symbol-icon.enum { - background-image: url('Enumerator_inverse_16x.svg'); + background-image: url('enumerator-dark.svg'); } /* enum-member */ .monaco-workbench .symbol-icon.enum-member { - background-image: url('EnumItem_16x.svg'); + background-image: url('enumerator-item-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.enum-member, .hc-black .monaco-workbench .symbol-icon.enum-member { - background-image: url('EnumItem_inverse_16x.svg'); + background-image: url('enumerator-item-dark.svg'); } /* struct */ .monaco-workbench .symbol-icon.struct { - background-image: url('Structure_16x_vscode.svg'); + background-image: url('structure-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.struct, .hc-black .monaco-workbench .symbol-icon.struct { - background-image: url('Structure_16x_vscode_inverse.svg'); + background-image: url('structure-dark.svg'); } /* event */ .monaco-workbench .symbol-icon.event { - background-image: url('Event_16x_vscode.svg'); + background-image: url('event-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.event, .hc-black .monaco-workbench .symbol-icon.event { - background-image: url('Event_16x_vscode_inverse.svg'); + background-image: url('event-dark.svg'); } /* operator */ .monaco-workbench .symbol-icon.operator { - background-image: url('Operator_16x_vscode.svg'); + background-image: url('operator-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.operator, .hc-black .monaco-workbench .symbol-icon.operator { - background-image: url('Operator_16x_vscode_inverse.svg'); + background-image: url('operator-dark.svg'); } /* type paramter */ .monaco-workbench .symbol-icon.type-parameter { - background-image: url('Template_16x_vscode.svg'); + background-image: url('template-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.type-parameter, .hc-black .monaco-workbench .symbol-icon.type-parameter { - background-image: url('Template_16x_vscode_inverse.svg'); + background-image: url('template-dark.svg'); } /* boolean, null */ .monaco-workbench .symbol-icon.boolean { - background-image: url('BooleanData_16x.svg'); + background-image: url('boolean-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.boolean, .hc-black .monaco-workbench .symbol-icon.boolean { - background-image: url('BooleanData_16x_darkp.svg'); + background-image: url('boolean-dark.svg'); } /* null */ .monaco-workbench .symbol-icon.null { - background-image: url('BooleanData_16x.svg'); + background-image: url('boolean-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.null, .hc-black .monaco-workbench .symbol-icon.null { - background-image: url('BooleanData_16x_darkp.svg'); + background-image: url('boolean-dark.svg'); } /* class */ .monaco-workbench .symbol-icon.class { - background-image: url('Class_16x.svg'); + background-image: url('class-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.class, .hc-black .monaco-workbench .symbol-icon.class { - background-image: url('Class_16x_darkp.svg'); + background-image: url('class-dark.svg'); } /* constructor */ .monaco-workbench .symbol-icon.constructor { - background-image: url('Method_16x.svg'); + background-image: url('method-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.constructor, .hc-black .monaco-workbench .symbol-icon.constructor { - background-image: url('Method_16x_darkp.svg'); + background-image: url('method-dark.svg'); } /* file */ .monaco-workbench .symbol-icon.file { - background-image: url('Document_16x.svg'); + background-image: url('file-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.file, .hc-black .monaco-workbench .symbol-icon.file { - background-image: url('Document_16x_darkp.svg'); + background-image: url('file-dark.svg'); } /* field */ .monaco-workbench .symbol-icon.field { - background-image: url('Field_16x.svg'); + background-image: url('field-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.field, .hc-black .monaco-workbench .symbol-icon.field { - background-image: url('Field_16x_darkp.svg'); + background-image: url('field-dark.svg'); } /* variable */ .monaco-workbench .symbol-icon.variable { - background-image: url('LocalVariable_16x_vscode.svg'); + background-image: url('variable-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.variable, .hc-black .monaco-workbench .symbol-icon.variable { - background-image: url('LocalVariable_16x_vscode_inverse.svg'); + background-image: url('variable-dark.svg'); } /* array */ .monaco-workbench .symbol-icon.array { - background-image: url('Indexer_16x.svg'); + background-image: url('indexer-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.array, .hc-black .monaco-workbench .symbol-icon.array { - background-image: url('Indexer_16x_darkp.svg'); + background-image: url('indexer-dark.svg'); } /* keyword */ /* todo@joh not used? */ .monaco-workbench .symbol-icon.keyword { - background-image: url('IntelliSenseKeyword_16x.svg'); + background-image: url('keyword-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.keyword, .hc-black .monaco-workbench .symbol-icon.keyword { - background-image: url('IntelliSenseKeyword_16x_darkp.svg'); + background-image: url('keyword-light.svg'); } /* interface */ .monaco-workbench .symbol-icon.interface { - background-image: url('Interface_16x.svg'); + background-image: url('interface-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.interface, .hc-black .monaco-workbench .symbol-icon.interface { - background-image: url('Interface_16x_darkp.svg'); + background-image: url('interface-dark.svg'); } /* method */ .monaco-workbench .symbol-icon.method { - background-image: url('Method_16x.svg'); + background-image: url('method-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.method, .hc-black .monaco-workbench .symbol-icon.method { - background-image: url('Method_16x_darkp.svg'); + background-image: url('method-dark.svg'); } /* function */ .monaco-workbench .symbol-icon.function { - background-image: url('Method_16x.svg'); + background-image: url('method-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.function, .hc-black .monaco-workbench .symbol-icon.function { - background-image: url('Method_16x_darkp.svg'); + background-image: url('method-dark.svg'); } /* object */ .monaco-workbench .symbol-icon.object { - background-image: url('Namespace_16x.svg'); + background-image: url('namespace-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.object, .hc-black .monaco-workbench .symbol-icon.object { - background-image: url('Namespace_16x_darkp.svg'); + background-image: url('namespace-dark.svg'); } /* namespace */ .monaco-workbench .symbol-icon.namespace { - background-image: url('Namespace_16x.svg'); + background-image: url('namespace-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.namespace, .hc-black .monaco-workbench .symbol-icon.namespace { - background-image: url('Namespace_16x_darkp.svg'); + background-image: url('namespace-dark.svg'); } /* package */ .monaco-workbench .symbol-icon.package { - background-image: url('Namespace_16x.svg'); + background-image: url('namespace-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.package, .hc-black .monaco-workbench .symbol-icon.package { - background-image: url('Namespace_16x_darkp.svg'); + background-image: url('namespace-dark.svg'); } /* module */ .monaco-workbench .symbol-icon.module { - background-image: url('Namespace_16x.svg'); + background-image: url('namespace-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.module, .hc-black .monaco-workbench .symbol-icon.module { - background-image: url('Namespace_16x_darkp.svg'); + background-image: url('namespace-dark.svg'); } /* number */ .monaco-workbench .symbol-icon.number { - background-image: url('Numeric_16x.svg'); + background-image: url('numeric-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.number, .hc-black .monaco-workbench .symbol-icon.number { - background-image: url('Numeric_16x_darkp.svg'); + background-image: url('numeric-dark.svg'); } /* property */ .monaco-workbench .symbol-icon.property { - background-image: url('Property_16x.svg'); + background-image: url('property-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.property, .hc-black .monaco-workbench .symbol-icon.property { - background-image: url('Property_16x_darkp.svg'); + background-image: url('property-dark.svg'); } /* snippet */ /* todo@joh unused? */ .monaco-workbench .symbol-icon.snippet { - background-image: url('Snippet_16x.svg'); + background-image: url('snippet-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.snippet, .hc-black .monaco-workbench .symbol-icon.snippet { - background-image: url('Snippet_16x_darkp.svg'); + background-image: url('snippet-dark.svg'); } /* string */ .monaco-workbench .symbol-icon.string { - background-image: url('String_16x.svg'); + background-image: url('string-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.string, .hc-black .monaco-workbench .symbol-icon.string { - background-image: url('String_16x_darkp.svg'); + background-image: url('string-dark.svg'); } /* key */ .monaco-workbench .symbol-icon.key { - background-image: url('String_16x.svg'); + background-image: url('string-light.svg'); } .vs-dark .monaco-workbench .symbol-icon.key, .hc-black .monaco-workbench .symbol-icon.key { - background-image: url('String_16x_darkp.svg'); + background-image: url('string-dark.svg'); } diff --git a/src/vs/editor/contrib/documentSymbols/media/template-dark.svg b/src/vs/editor/contrib/documentSymbols/media/template-dark.svg new file mode 100644 index 00000000000..39ca49dfd43 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/template-dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/template-light.svg b/src/vs/editor/contrib/documentSymbols/media/template-light.svg new file mode 100644 index 00000000000..34c96e6dd7e --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/template-light.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/variable-dark.svg b/src/vs/editor/contrib/documentSymbols/media/variable-dark.svg new file mode 100644 index 00000000000..0719bddfa6f --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/variable-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/documentSymbols/media/variable-light.svg b/src/vs/editor/contrib/documentSymbols/media/variable-light.svg new file mode 100644 index 00000000000..c24d7f20950 --- /dev/null +++ b/src/vs/editor/contrib/documentSymbols/media/variable-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/suggest/media/boolean-dark.svg b/src/vs/editor/contrib/suggest/media/boolean-dark.svg new file mode 100644 index 00000000000..d9bcbe9dac0 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/boolean-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/suggest/media/boolean-light.svg b/src/vs/editor/contrib/suggest/media/boolean-light.svg new file mode 100644 index 00000000000..647040941d1 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/boolean-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/suggest/media/class-dark.svg b/src/vs/editor/contrib/suggest/media/class-dark.svg new file mode 100644 index 00000000000..8643ca84051 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/class-dark.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/vs/editor/contrib/suggest/media/class-light.svg b/src/vs/editor/contrib/suggest/media/class-light.svg new file mode 100644 index 00000000000..5e338c8fc61 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/class-light.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/vs/editor/contrib/suggest/media/color-dark.svg b/src/vs/editor/contrib/suggest/media/color-dark.svg new file mode 100644 index 00000000000..0914abcdbd3 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/color-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/suggest/media/color-light.svg b/src/vs/editor/contrib/suggest/media/color-light.svg new file mode 100644 index 00000000000..ca089a1bf2a --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/color-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/suggest/media/constant-dark.svg b/src/vs/editor/contrib/suggest/media/constant-dark.svg new file mode 100644 index 00000000000..0e90ecafcd8 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/constant-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/suggest/media/constant-light.svg b/src/vs/editor/contrib/suggest/media/constant-light.svg new file mode 100644 index 00000000000..1a369c1d8aa --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/constant-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/suggest/media/enumerator-dark.svg b/src/vs/editor/contrib/suggest/media/enumerator-dark.svg new file mode 100644 index 00000000000..06c70f1aa02 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/enumerator-dark.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/vs/editor/contrib/suggest/media/enumerator-item-dark.svg b/src/vs/editor/contrib/suggest/media/enumerator-item-dark.svg new file mode 100644 index 00000000000..23c697fdf17 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/enumerator-item-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/suggest/media/enumerator-item-light.svg b/src/vs/editor/contrib/suggest/media/enumerator-item-light.svg new file mode 100644 index 00000000000..a99045d3352 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/enumerator-item-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/suggest/media/enumerator-light.svg b/src/vs/editor/contrib/suggest/media/enumerator-light.svg new file mode 100644 index 00000000000..7961eec7b17 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/enumerator-light.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/vs/editor/contrib/suggest/media/event-dark.svg b/src/vs/editor/contrib/suggest/media/event-dark.svg new file mode 100644 index 00000000000..051bef316e9 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/event-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/suggest/media/event-light.svg b/src/vs/editor/contrib/suggest/media/event-light.svg new file mode 100644 index 00000000000..712344d1f92 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/event-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/suggest/media/field-dark.svg b/src/vs/editor/contrib/suggest/media/field-dark.svg new file mode 100644 index 00000000000..15623061c5d --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/field-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/suggest/media/field-light.svg b/src/vs/editor/contrib/suggest/media/field-light.svg new file mode 100644 index 00000000000..72dd79504f6 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/field-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/suggest/media/file-dark.svg b/src/vs/editor/contrib/suggest/media/file-dark.svg new file mode 100644 index 00000000000..5ed5762a1f0 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/file-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/suggest/media/file-light.svg b/src/vs/editor/contrib/suggest/media/file-light.svg new file mode 100644 index 00000000000..ad54e13b1b1 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/file-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/suggest/media/folder-dark.svg b/src/vs/editor/contrib/suggest/media/folder-dark.svg new file mode 100644 index 00000000000..43d454e7e5a --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/folder-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/suggest/media/folder-light.svg b/src/vs/editor/contrib/suggest/media/folder-light.svg new file mode 100644 index 00000000000..8daecdac6a3 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/folder-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/suggest/media/indexer-dark.svg b/src/vs/editor/contrib/suggest/media/indexer-dark.svg new file mode 100644 index 00000000000..f45aebbdb3d --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/indexer-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/suggest/media/indexer-light.svg b/src/vs/editor/contrib/suggest/media/indexer-light.svg new file mode 100644 index 00000000000..31a880850e2 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/indexer-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/suggest/media/interface-dark.svg b/src/vs/editor/contrib/suggest/media/interface-dark.svg new file mode 100644 index 00000000000..42156059c6a --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/interface-dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/editor/contrib/suggest/media/interface-light.svg b/src/vs/editor/contrib/suggest/media/interface-light.svg new file mode 100644 index 00000000000..4b63ceb782f --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/interface-light.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/editor/contrib/suggest/media/keyword-dark.svg b/src/vs/editor/contrib/suggest/media/keyword-dark.svg new file mode 100644 index 00000000000..70ba6ea9331 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/keyword-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/suggest/media/keyword-light.svg b/src/vs/editor/contrib/suggest/media/keyword-light.svg new file mode 100644 index 00000000000..fc57528a3ef --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/keyword-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/suggest/media/method-dark.svg b/src/vs/editor/contrib/suggest/media/method-dark.svg new file mode 100644 index 00000000000..970d7b61480 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/method-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/suggest/media/method-light.svg b/src/vs/editor/contrib/suggest/media/method-light.svg new file mode 100644 index 00000000000..403a9b90dd9 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/method-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/suggest/media/namespace-dark.svg b/src/vs/editor/contrib/suggest/media/namespace-dark.svg new file mode 100644 index 00000000000..17989d852de --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/namespace-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/suggest/media/namespace-light.svg b/src/vs/editor/contrib/suggest/media/namespace-light.svg new file mode 100644 index 00000000000..f1e10c55c98 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/namespace-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/suggest/media/numeric-dark.svg b/src/vs/editor/contrib/suggest/media/numeric-dark.svg new file mode 100644 index 00000000000..9b7874a43ec --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/numeric-dark.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/vs/editor/contrib/suggest/media/numeric-light.svg b/src/vs/editor/contrib/suggest/media/numeric-light.svg new file mode 100644 index 00000000000..c6e9a426a9f --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/numeric-light.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/vs/editor/contrib/suggest/media/operator-dark.svg b/src/vs/editor/contrib/suggest/media/operator-dark.svg new file mode 100644 index 00000000000..de1650a86d2 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/operator-dark.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/vs/editor/contrib/suggest/media/operator-light.svg b/src/vs/editor/contrib/suggest/media/operator-light.svg new file mode 100644 index 00000000000..4818a644a10 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/operator-light.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/vs/editor/contrib/suggest/media/property-dark.svg b/src/vs/editor/contrib/suggest/media/property-dark.svg new file mode 100644 index 00000000000..7137a9d7bb5 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/property-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/suggest/media/property-light.svg b/src/vs/editor/contrib/suggest/media/property-light.svg new file mode 100644 index 00000000000..60f77501db7 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/property-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/suggest/media/reference-dark.svg b/src/vs/editor/contrib/suggest/media/reference-dark.svg new file mode 100644 index 00000000000..7030885c039 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/reference-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/suggest/media/reference-light.svg b/src/vs/editor/contrib/suggest/media/reference-light.svg new file mode 100644 index 00000000000..017eabca6d2 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/reference-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/suggest/media/ruler-dark.svg b/src/vs/editor/contrib/suggest/media/ruler-dark.svg new file mode 100644 index 00000000000..81eef496b26 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/ruler-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/suggest/media/ruler-light.svg b/src/vs/editor/contrib/suggest/media/ruler-light.svg new file mode 100644 index 00000000000..9f299147548 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/ruler-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/suggest/media/snippet-dark.svg b/src/vs/editor/contrib/suggest/media/snippet-dark.svg new file mode 100644 index 00000000000..394ad9e4b28 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/snippet-dark.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/vs/editor/contrib/suggest/media/snippet-light.svg b/src/vs/editor/contrib/suggest/media/snippet-light.svg new file mode 100644 index 00000000000..d4f45485987 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/snippet-light.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/vs/editor/contrib/suggest/media/string-dark.svg b/src/vs/editor/contrib/suggest/media/string-dark.svg new file mode 100644 index 00000000000..315ca4537a4 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/string-dark.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/vs/editor/contrib/suggest/media/string-light.svg b/src/vs/editor/contrib/suggest/media/string-light.svg new file mode 100644 index 00000000000..c902ea2faf3 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/string-light.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/vs/editor/contrib/suggest/media/structure-dark.svg b/src/vs/editor/contrib/suggest/media/structure-dark.svg new file mode 100644 index 00000000000..599b10565e5 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/structure-dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/editor/contrib/suggest/media/structure-light.svg b/src/vs/editor/contrib/suggest/media/structure-light.svg new file mode 100644 index 00000000000..9de849e9f43 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/structure-light.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/editor/contrib/suggest/media/suggest.css b/src/vs/editor/contrib/suggest/media/suggest.css index b5b3eb956b5..df6c223bb74 100644 --- a/src/vs/editor/contrib/suggest/media/suggest.css +++ b/src/vs/editor/contrib/suggest/media/suggest.css @@ -187,30 +187,30 @@ .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.method::before, .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.function::before, -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.constructor::before { background-image: url('Method_16x.svg'); } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.field::before { background-image: url('Field_16x.svg'); } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.event::before { background-image: url('Event_16x_vscode.svg'); } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.operator::before { background-image: url('Operator_16x_vscode.svg'); } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.variable::before { background-image: url('LocalVariable_16x_vscode.svg'); } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.class::before { background-image: url('Class_16x.svg'); } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.interface::before { background-image: url('Interface_16x.svg'); } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.struct::before { background-image: url('Structure_16x_vscode.svg'); } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.type-parameter::before { background-image: url('Template_16x_vscode.svg'); } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.module::before { background-image: url('Namespace_16x.svg'); } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.property::before { background-image: url('Property_16x.svg'); } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.unit::before { background-image: url('Ruler_16x.svg'); } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.constant::before { background-image: url('Constant_16x.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.constructor::before { background-image: url('method-light.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.field::before { background-image: url('field-light.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.event::before { background-image: url('event-light.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.operator::before { background-image: url('operator-light.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.variable::before { background-image: url('variable-light.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.class::before { background-image: url('class-light.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.interface::before { background-image: url('interface-light.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.struct::before { background-image: url('structure-light.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.type-parameter::before { background-image: url('template-light.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.module::before { background-image: url('namespace-light.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.property::before { background-image: url('property-light.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.unit::before { background-image: url('ruler-light.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.constant::before { background-image: url('constant-light.svg'); } .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.value::before, -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.enum::before { background-image: url('Enumerator_16x.svg'); } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.enum-member::before { background-image: url('EnumItem_16x.svg'); } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.keyword::before { background-image: url('IntelliSenseKeyword_16x.svg'); } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.text::before { background-image: url('String_16x.svg'); } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.color::before { background-image: url('ColorPalette_16x.svg'); } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.file::before { background-image: url('Document_16x.svg'); } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.reference::before { background-image: url('ImportFile_16x_vscode.svg'); } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.snippet::before { background-image: url('Snippet_16x.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.enum::before { background-image: url('enumerator-light.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.enum-member::before { background-image: url('enumerator-item-light.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.keyword::before { background-image: url('keyword-light.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.text::before { background-image: url('string-light.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.color::before { background-image: url('color-light.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.file::before { background-image: url('file-light.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.reference::before { background-image: url('reference-light.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.snippet::before { background-image: url('snippet-light.svg'); } .monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.customcolor::before { background-image: none; } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.folder::before { background-image: url('Folder_16x.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon.folder::before { background-image: url('folder-light.svg'); } .monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.customcolor .colorspan { margin: 0 0 0 0.3em; @@ -309,72 +309,72 @@ .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .suggest-icon.function::before, .monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.function::before, .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .suggest-icon.constructor::before, -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.constructor::before { background-image: url('Method_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.constructor::before { background-image: url('method-dark.svg'); } .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .suggest-icon.field::before, -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.field::before { background-image: url('Field_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.field::before { background-image: url('field-dark.svg'); } .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .suggest-icon.event::before, -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.event::before { background-image: url('Event_16x_vscode_inverse.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.event::before { background-image: url('event-dark.svg'); } .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .suggest-icon.operator::before, -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.operator::before { background-image: url('Operator_16x_vscode_inverse.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.operator::before { background-image: url('operator-dark.svg'); } .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .suggest-icon.variable::before, -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.variable::before { background-image: url('LocalVariable_16x_vscode_inverse.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.variable::before { background-image: url('variable-dark.svg'); } .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .suggest-icon.class::before, -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.class::before { background-image: url('Class_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.class::before { background-image: url('class-dark.svg'); } .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .suggest-icon.interface::before, -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.interface::before { background-image: url('Interface_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.interface::before { background-image: url('interface-dark.svg'); } .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .suggest-icon.struct::before, -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.struct::before { background-image: url('Structure_16x_vscode_inverse.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.struct::before { background-image: url('structure-dark.svg'); } .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .suggest-icon.type-parameter::before, -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.type-parameter::before { background-image: url('Template_16x_vscode_inverse.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.type-parameter::before { background-image: url('template-dark.svg'); } .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .suggest-icon.module::before, -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.module::before { background-image: url('Namespace_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.module::before { background-image: url('namespace-dark.svg'); } .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .suggest-icon.property::before, -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.property::before { background-image: url('Property_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.property::before { background-image: url('property-dark.svg'); } .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .suggest-icon.unit::before, -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.unit::before { background-image: url('Ruler_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.unit::before { background-image: url('ruler-dark.svg'); } .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .suggest-icon.constant::before, -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.constant::before { background-image: url('Constant_16x_inverse.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.constant::before { background-image: url('constant-dark.svg'); } .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .suggest-icon.value::before, .monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.value::before, .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .suggest-icon.enum::before, -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.enum::before { background-image: url('Enumerator_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.enum::before { background-image: url('enumerator-dark.svg'); } .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .suggest-icon.enum-member::before, -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.enum-member::before { background-image: url('EnumItem_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.enum-member::before { background-image: url('enumerator-item-dark.svg'); } .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .suggest-icon.keyword::before, -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.keyword::before { background-image: url('IntelliSenseKeyword_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.keyword::before { background-image: url('keyword-dark.svg'); } .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .suggest-icon.text::before, -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.text::before { background-image: url('String_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.text::before { background-image: url('string-dark.svg'); } .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .suggest-icon.color::before, -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.color::before { background-image: url('ColorPalette_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.color::before { background-image: url('color-dark.svg'); } .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .suggest-icon.file::before, -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.file::before { background-image: url('Document_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.file::before { background-image: url('file-dark.svg'); } .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .suggest-icon.reference::before, -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.reference::before { background-image: url('ImportFile_16x_vscode_inverse.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.reference::before { background-image: url('reference-dark.svg'); } .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .suggest-icon.snippet::before, -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.snippet::before { background-image: url('Snippet_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.snippet::before { background-image: url('snippet-dark.svg'); } .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .suggest-icon.customcolor::before, .monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.customcolor::before { background-image: none; } .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .suggest-icon.folder::before, -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.folder::before { background-image: url('Folder_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon.folder::before { background-image: url('folder-dark.svg'); } diff --git a/src/vs/editor/contrib/suggest/media/template-dark.svg b/src/vs/editor/contrib/suggest/media/template-dark.svg new file mode 100644 index 00000000000..39ca49dfd43 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/template-dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/editor/contrib/suggest/media/template-light.svg b/src/vs/editor/contrib/suggest/media/template-light.svg new file mode 100644 index 00000000000..34c96e6dd7e --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/template-light.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/editor/contrib/suggest/media/variable-dark.svg b/src/vs/editor/contrib/suggest/media/variable-dark.svg new file mode 100644 index 00000000000..0719bddfa6f --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/variable-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/suggest/media/variable-light.svg b/src/vs/editor/contrib/suggest/media/variable-light.svg new file mode 100644 index 00000000000..c24d7f20950 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/variable-light.svg @@ -0,0 +1,4 @@ + + + + From 607412c0f5ea708ad96457bd783a91472275214e Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Mon, 24 Jun 2019 12:13:43 -0700 Subject: [PATCH 0602/1449] Update activity bar icons --- .../media/settings-activity-bar.svg | 2 +- .../browser/media/debug-activity-bar.svg | 12 +++-------- .../media/extensions-activity-bar.svg | 5 +---- .../browser/media/files-activity-bar.svg | 2 +- .../scm/browser/media/scm-activity-bar.svg | 20 +++++++++++++++---- .../browser/media/search-activity-bar.svg | 3 +-- 6 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/vs/workbench/browser/parts/activitybar/media/settings-activity-bar.svg b/src/vs/workbench/browser/parts/activitybar/media/settings-activity-bar.svg index a8213c3d01e..7e2c729438a 100644 --- a/src/vs/workbench/browser/parts/activitybar/media/settings-activity-bar.svg +++ b/src/vs/workbench/browser/parts/activitybar/media/settings-activity-bar.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/debug-activity-bar.svg b/src/vs/workbench/contrib/debug/browser/media/debug-activity-bar.svg index 153086d1d80..fcb9413c8c2 100644 --- a/src/vs/workbench/contrib/debug/browser/media/debug-activity-bar.svg +++ b/src/vs/workbench/contrib/debug/browser/media/debug-activity-bar.svg @@ -1,11 +1,5 @@ - - - - - - - - - + + + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/extensions-activity-bar.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/extensions-activity-bar.svg index b23d1b23e27..16dfefd854b 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/extensions-activity-bar.svg +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/extensions-activity-bar.svg @@ -1,6 +1,3 @@ - - - - + diff --git a/src/vs/workbench/contrib/files/browser/media/files-activity-bar.svg b/src/vs/workbench/contrib/files/browser/media/files-activity-bar.svg index 14c2bb322a8..0ca109747e7 100644 --- a/src/vs/workbench/contrib/files/browser/media/files-activity-bar.svg +++ b/src/vs/workbench/contrib/files/browser/media/files-activity-bar.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/scm/browser/media/scm-activity-bar.svg b/src/vs/workbench/contrib/scm/browser/media/scm-activity-bar.svg index 3dda8c0e3b7..eef0b63dbdb 100644 --- a/src/vs/workbench/contrib/scm/browser/media/scm-activity-bar.svg +++ b/src/vs/workbench/contrib/scm/browser/media/scm-activity-bar.svg @@ -1,6 +1,18 @@ - - - - + + + + + + + + + + + + + + + + diff --git a/src/vs/workbench/contrib/search/browser/media/search-activity-bar.svg b/src/vs/workbench/contrib/search/browser/media/search-activity-bar.svg index 50bda7ce9d1..b40063bef31 100644 --- a/src/vs/workbench/contrib/search/browser/media/search-activity-bar.svg +++ b/src/vs/workbench/contrib/search/browser/media/search-activity-bar.svg @@ -1,4 +1,3 @@ - - + From bf00b3ecbf94e5e819dbc8b54a8fbe605ffeb32e Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Mon, 24 Jun 2019 12:24:26 -0700 Subject: [PATCH 0603/1449] Update lightbulb and intellisense description icons --- src/vs/editor/contrib/codeAction/lightBulbWidget.css | 4 ++-- .../contrib/codeAction/lightbulb-autofix-dark.svg | 10 ++-------- .../editor/contrib/codeAction/lightbulb-autofix-hc.svg | 4 ++++ .../contrib/codeAction/lightbulb-autofix-light.svg | 4 ++++ src/vs/editor/contrib/codeAction/lightbulb-dark.svg | 4 +++- src/vs/editor/contrib/codeAction/lightbulb-hc.svg | 3 +++ src/vs/editor/contrib/codeAction/lightbulb-light.svg | 4 ++++ src/vs/editor/contrib/suggest/media/close-dark.svg | 5 ++++- src/vs/editor/contrib/suggest/media/close-light.svg | 4 ++++ src/vs/editor/contrib/suggest/media/close.svg | 1 - src/vs/editor/contrib/suggest/media/info-dark.svg | 8 ++++++++ src/vs/editor/contrib/suggest/media/info-light.svg | 7 +++++++ src/vs/editor/contrib/suggest/media/info.svg | 1 - src/vs/editor/contrib/suggest/media/suggest.css | 4 ++-- .../markers/browser/media/lightbulb-autofix-dark.svg | 2 +- .../markers/browser/media/lightbulb-autofix-hc.svg | 2 +- .../markers/browser/media/lightbulb-autofix-light.svg | 2 +- .../contrib/markers/browser/media/lightbulb-dark.svg | 2 +- .../contrib/markers/browser/media/lightbulb-hc.svg | 2 +- .../contrib/markers/browser/media/lightbulb-light.svg | 4 ++-- .../contrib/markers/browser/media/markers.css | 6 +++--- 21 files changed, 57 insertions(+), 26 deletions(-) create mode 100644 src/vs/editor/contrib/codeAction/lightbulb-autofix-hc.svg create mode 100644 src/vs/editor/contrib/codeAction/lightbulb-autofix-light.svg create mode 100644 src/vs/editor/contrib/codeAction/lightbulb-hc.svg create mode 100644 src/vs/editor/contrib/codeAction/lightbulb-light.svg create mode 100644 src/vs/editor/contrib/suggest/media/close-light.svg delete mode 100644 src/vs/editor/contrib/suggest/media/close.svg create mode 100644 src/vs/editor/contrib/suggest/media/info-dark.svg create mode 100644 src/vs/editor/contrib/suggest/media/info-light.svg delete mode 100644 src/vs/editor/contrib/suggest/media/info.svg diff --git a/src/vs/editor/contrib/codeAction/lightBulbWidget.css b/src/vs/editor/contrib/codeAction/lightBulbWidget.css index e496371d9a4..df27dfd2104 100644 --- a/src/vs/editor/contrib/codeAction/lightBulbWidget.css +++ b/src/vs/editor/contrib/codeAction/lightBulbWidget.css @@ -18,11 +18,11 @@ } .monaco-editor.vs .lightbulb-glyph { - background: url('lightbulb.svg') center center no-repeat; + background: url('lightbulb-light.svg') center center no-repeat; } .monaco-editor.vs .lightbulb-glyph.autofixable { - background: url('lightbulb-autofix.svg') center center no-repeat; + background: url('lightbulb-autofix-light.svg') center center no-repeat; } .monaco-editor.vs-dark .lightbulb-glyph, diff --git a/src/vs/editor/contrib/codeAction/lightbulb-autofix-dark.svg b/src/vs/editor/contrib/codeAction/lightbulb-autofix-dark.svg index 40678e79d7d..34d4f3aedf6 100644 --- a/src/vs/editor/contrib/codeAction/lightbulb-autofix-dark.svg +++ b/src/vs/editor/contrib/codeAction/lightbulb-autofix-dark.svg @@ -1,10 +1,4 @@ - - - - - - - - + + diff --git a/src/vs/editor/contrib/codeAction/lightbulb-autofix-hc.svg b/src/vs/editor/contrib/codeAction/lightbulb-autofix-hc.svg new file mode 100644 index 00000000000..34d4f3aedf6 --- /dev/null +++ b/src/vs/editor/contrib/codeAction/lightbulb-autofix-hc.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/codeAction/lightbulb-autofix-light.svg b/src/vs/editor/contrib/codeAction/lightbulb-autofix-light.svg new file mode 100644 index 00000000000..c34a0c2805d --- /dev/null +++ b/src/vs/editor/contrib/codeAction/lightbulb-autofix-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/codeAction/lightbulb-dark.svg b/src/vs/editor/contrib/codeAction/lightbulb-dark.svg index 520f78f3e55..d2b6e1287a1 100644 --- a/src/vs/editor/contrib/codeAction/lightbulb-dark.svg +++ b/src/vs/editor/contrib/codeAction/lightbulb-dark.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/src/vs/editor/contrib/codeAction/lightbulb-hc.svg b/src/vs/editor/contrib/codeAction/lightbulb-hc.svg new file mode 100644 index 00000000000..d2b6e1287a1 --- /dev/null +++ b/src/vs/editor/contrib/codeAction/lightbulb-hc.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/codeAction/lightbulb-light.svg b/src/vs/editor/contrib/codeAction/lightbulb-light.svg new file mode 100644 index 00000000000..8572effd089 --- /dev/null +++ b/src/vs/editor/contrib/codeAction/lightbulb-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/suggest/media/close-dark.svg b/src/vs/editor/contrib/suggest/media/close-dark.svg index 751e89b3b02..e0475f7b85a 100644 --- a/src/vs/editor/contrib/suggest/media/close-dark.svg +++ b/src/vs/editor/contrib/suggest/media/close-dark.svg @@ -1 +1,4 @@ - \ No newline at end of file + + + + diff --git a/src/vs/editor/contrib/suggest/media/close-light.svg b/src/vs/editor/contrib/suggest/media/close-light.svg new file mode 100644 index 00000000000..3bd44674699 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/close-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/suggest/media/close.svg b/src/vs/editor/contrib/suggest/media/close.svg deleted file mode 100644 index fde34404d4e..00000000000 --- a/src/vs/editor/contrib/suggest/media/close.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/info-dark.svg b/src/vs/editor/contrib/suggest/media/info-dark.svg new file mode 100644 index 00000000000..4046543c182 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/info-dark.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/vs/editor/contrib/suggest/media/info-light.svg b/src/vs/editor/contrib/suggest/media/info-light.svg new file mode 100644 index 00000000000..3e600326ccb --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/info-light.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/vs/editor/contrib/suggest/media/info.svg b/src/vs/editor/contrib/suggest/media/info.svg deleted file mode 100644 index 6578b81ea3f..00000000000 --- a/src/vs/editor/contrib/suggest/media/info.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/suggest.css b/src/vs/editor/contrib/suggest/media/suggest.css index df6c223bb74..a93e5b8be49 100644 --- a/src/vs/editor/contrib/suggest/media/suggest.css +++ b/src/vs/editor/contrib/suggest/media/suggest.css @@ -109,13 +109,13 @@ } .monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .header > .close { - background-image: url('./close.svg'); + background-image: url('./close-light.svg'); float: right; margin-right: 5px; } .monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .readMore { - background-image: url('./info.svg'); + background-image: url('./info-light.svg'); } .monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .header > .close:hover, diff --git a/src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix-dark.svg b/src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix-dark.svg index f74bffe92ad..34d4f3aedf6 100644 --- a/src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix-dark.svg +++ b/src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix-dark.svg @@ -1,4 +1,4 @@ - + diff --git a/src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix-hc.svg b/src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix-hc.svg index f74bffe92ad..34d4f3aedf6 100644 --- a/src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix-hc.svg +++ b/src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix-hc.svg @@ -1,4 +1,4 @@ - + diff --git a/src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix-light.svg b/src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix-light.svg index 7bddb1c563d..c34a0c2805d 100644 --- a/src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix-light.svg +++ b/src/vs/workbench/contrib/markers/browser/media/lightbulb-autofix-light.svg @@ -1,4 +1,4 @@ - + diff --git a/src/vs/workbench/contrib/markers/browser/media/lightbulb-dark.svg b/src/vs/workbench/contrib/markers/browser/media/lightbulb-dark.svg index 9a72cf90233..d2b6e1287a1 100644 --- a/src/vs/workbench/contrib/markers/browser/media/lightbulb-dark.svg +++ b/src/vs/workbench/contrib/markers/browser/media/lightbulb-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/markers/browser/media/lightbulb-hc.svg b/src/vs/workbench/contrib/markers/browser/media/lightbulb-hc.svg index 9a72cf90233..d2b6e1287a1 100644 --- a/src/vs/workbench/contrib/markers/browser/media/lightbulb-hc.svg +++ b/src/vs/workbench/contrib/markers/browser/media/lightbulb-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/markers/browser/media/lightbulb-light.svg b/src/vs/workbench/contrib/markers/browser/media/lightbulb-light.svg index 4c2c0f8db96..8572effd089 100644 --- a/src/vs/workbench/contrib/markers/browser/media/lightbulb-light.svg +++ b/src/vs/workbench/contrib/markers/browser/media/lightbulb-light.svg @@ -1,4 +1,4 @@ - - + + diff --git a/src/vs/workbench/contrib/markers/browser/media/markers.css b/src/vs/workbench/contrib/markers/browser/media/markers.css index af371a13b18..7cbfe050394 100644 --- a/src/vs/workbench/contrib/markers/browser/media/markers.css +++ b/src/vs/workbench/contrib/markers/browser/media/markers.css @@ -167,7 +167,7 @@ } .markers-panel .monaco-tl-contents .actions .action-label.icon.markers-panel-action-quickfix { - background: url('lightbulb-light.svg') center/80% no-repeat; + background: url('lightbulb-light.svg') center no-repeat; margin-right: 0px; } @@ -176,11 +176,11 @@ } .vs-dark .markers-panel .monaco-tl-contents .actions .action-label.icon.markers-panel-action-quickfix { - background: url('lightbulb-dark.svg') center/80% no-repeat; + background: url('lightbulb-dark.svg') center no-repeat; } .hc-black .markers-panel .monaco-tl-contents .actions .action-label.icon.markers-panel-action-quickfix { - background: url('lightbulb-hc.svg') center/80% no-repeat; + background: url('lightbulb-hc.svg') center no-repeat; } .vs-dark .markers-panel .monaco-tl-contents .actions .action-label.icon.markers-panel-action-quickfix.autofixable { From 6a4d9707bccb79e8afd9e62a4c5165a5e2b92120 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Mon, 24 Jun 2019 12:24:52 -0700 Subject: [PATCH 0604/1449] Reduce spacing between results find widget --- src/vs/editor/contrib/find/findWidget.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/contrib/find/findWidget.css b/src/vs/editor/contrib/find/findWidget.css index b6fbab87454..70198672fee 100644 --- a/src/vs/editor/contrib/find/findWidget.css +++ b/src/vs/editor/contrib/find/findWidget.css @@ -96,8 +96,8 @@ display: flex; display: -webkit-flex; flex: initial; - margin: 0 1px 0 3px; - padding: 2px 2px 0 2px; + margin: 0 0 0 3px; + padding: 2px 0 0 2px; height: 25px; vertical-align: middle; box-sizing: border-box; From 6ccde14427c40ab87318fa2458a7b48ee9825fe4 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Mon, 24 Jun 2019 13:00:16 -0700 Subject: [PATCH 0605/1449] Remove unused suggest widget icons --- .../contrib/suggest/media/Class_16x.svg | 1 - .../suggest/media/Class_inverse_16x.svg | 1 - .../suggest/media/ColorPalette_16x.svg | 1 - .../media/ColorPalette_inverse_16x.svg | 1 - .../contrib/suggest/media/Constant_16x.svg | 1 - .../suggest/media/Constant_16x_inverse.svg | 1 - .../contrib/suggest/media/Document_16x.svg | 1 - .../suggest/media/Document_inverse_16x.svg | 1 - .../contrib/suggest/media/EnumItem_16x.svg | 1 - .../suggest/media/EnumItem_inverse_16x.svg | 1 - .../contrib/suggest/media/Enumerator_16x.svg | 1 - .../suggest/media/Enumerator_inverse_16x.svg | 1 - .../suggest/media/Event_16x_vscode.svg | 1 - .../media/Event_16x_vscode_inverse.svg | 1 - .../contrib/suggest/media/Field_16x.svg | 1 - .../suggest/media/Field_inverse_16x.svg | 1 - .../contrib/suggest/media/Folder_16x.svg | 1 - .../suggest/media/Folder_inverse_16x.svg | 1 - .../suggest/media/ImportFile_16x_vscode.svg | 1 - .../media/ImportFile_16x_vscode_inverse.svg | 1 - .../suggest/media/IntelliSenseKeyword_16x.svg | 1 - .../media/IntelliSenseKeyword_inverse_16x.svg | 1 - .../contrib/suggest/media/Interface_16x.svg | 1 - .../suggest/media/Interface_inverse_16x.svg | 1 - .../media/LocalVariable_16x_vscode.svg | 1 - .../LocalVariable_16x_vscode_inverse.svg | 1 - .../contrib/suggest/media/Method_16x.svg | 1 - .../suggest/media/Method_inverse_16x.svg | 1 - .../suggest/media/Misc_inverse_16x.svg | 1 - .../contrib/suggest/media/Namespace_16x.svg | 1 - .../suggest/media/Namespace_inverse_16x.svg | 1 - .../suggest/media/Operator_16x_vscode.svg | 1 - .../media/Operator_16x_vscode_inverse.svg | 1 - .../contrib/suggest/media/Property_16x.svg | 1 - .../suggest/media/Property_inverse_16x.svg | 1 - .../contrib/suggest/media/Ruler_16x.svg | 1 - .../suggest/media/Ruler_inverse_16x.svg | 1 - .../contrib/suggest/media/Snippet_16x.svg | 47 ------------------- .../suggest/media/Snippet_inverse_16x.svg | 43 ----------------- .../contrib/suggest/media/String_16x.svg | 1 - .../suggest/media/String_inverse_16x.svg | 1 - .../suggest/media/Structure_16x_vscode.svg | 1 - .../media/Structure_16x_vscode_inverse.svg | 1 - .../suggest/media/Template_16x_vscode.svg | 1 - .../media/Template_16x_vscode_inverse.svg | 1 - 45 files changed, 133 deletions(-) delete mode 100755 src/vs/editor/contrib/suggest/media/Class_16x.svg delete mode 100755 src/vs/editor/contrib/suggest/media/Class_inverse_16x.svg delete mode 100755 src/vs/editor/contrib/suggest/media/ColorPalette_16x.svg delete mode 100755 src/vs/editor/contrib/suggest/media/ColorPalette_inverse_16x.svg delete mode 100644 src/vs/editor/contrib/suggest/media/Constant_16x.svg delete mode 100644 src/vs/editor/contrib/suggest/media/Constant_16x_inverse.svg delete mode 100755 src/vs/editor/contrib/suggest/media/Document_16x.svg delete mode 100755 src/vs/editor/contrib/suggest/media/Document_inverse_16x.svg delete mode 100755 src/vs/editor/contrib/suggest/media/EnumItem_16x.svg delete mode 100755 src/vs/editor/contrib/suggest/media/EnumItem_inverse_16x.svg delete mode 100755 src/vs/editor/contrib/suggest/media/Enumerator_16x.svg delete mode 100755 src/vs/editor/contrib/suggest/media/Enumerator_inverse_16x.svg delete mode 100644 src/vs/editor/contrib/suggest/media/Event_16x_vscode.svg delete mode 100644 src/vs/editor/contrib/suggest/media/Event_16x_vscode_inverse.svg delete mode 100755 src/vs/editor/contrib/suggest/media/Field_16x.svg delete mode 100755 src/vs/editor/contrib/suggest/media/Field_inverse_16x.svg delete mode 100644 src/vs/editor/contrib/suggest/media/Folder_16x.svg delete mode 100755 src/vs/editor/contrib/suggest/media/Folder_inverse_16x.svg delete mode 100644 src/vs/editor/contrib/suggest/media/ImportFile_16x_vscode.svg delete mode 100644 src/vs/editor/contrib/suggest/media/ImportFile_16x_vscode_inverse.svg delete mode 100755 src/vs/editor/contrib/suggest/media/IntelliSenseKeyword_16x.svg delete mode 100755 src/vs/editor/contrib/suggest/media/IntelliSenseKeyword_inverse_16x.svg delete mode 100755 src/vs/editor/contrib/suggest/media/Interface_16x.svg delete mode 100755 src/vs/editor/contrib/suggest/media/Interface_inverse_16x.svg delete mode 100644 src/vs/editor/contrib/suggest/media/LocalVariable_16x_vscode.svg delete mode 100644 src/vs/editor/contrib/suggest/media/LocalVariable_16x_vscode_inverse.svg delete mode 100755 src/vs/editor/contrib/suggest/media/Method_16x.svg delete mode 100755 src/vs/editor/contrib/suggest/media/Method_inverse_16x.svg delete mode 100755 src/vs/editor/contrib/suggest/media/Misc_inverse_16x.svg delete mode 100755 src/vs/editor/contrib/suggest/media/Namespace_16x.svg delete mode 100755 src/vs/editor/contrib/suggest/media/Namespace_inverse_16x.svg delete mode 100644 src/vs/editor/contrib/suggest/media/Operator_16x_vscode.svg delete mode 100644 src/vs/editor/contrib/suggest/media/Operator_16x_vscode_inverse.svg delete mode 100755 src/vs/editor/contrib/suggest/media/Property_16x.svg delete mode 100755 src/vs/editor/contrib/suggest/media/Property_inverse_16x.svg delete mode 100755 src/vs/editor/contrib/suggest/media/Ruler_16x.svg delete mode 100755 src/vs/editor/contrib/suggest/media/Ruler_inverse_16x.svg delete mode 100644 src/vs/editor/contrib/suggest/media/Snippet_16x.svg delete mode 100644 src/vs/editor/contrib/suggest/media/Snippet_inverse_16x.svg delete mode 100755 src/vs/editor/contrib/suggest/media/String_16x.svg delete mode 100755 src/vs/editor/contrib/suggest/media/String_inverse_16x.svg delete mode 100644 src/vs/editor/contrib/suggest/media/Structure_16x_vscode.svg delete mode 100644 src/vs/editor/contrib/suggest/media/Structure_16x_vscode_inverse.svg delete mode 100644 src/vs/editor/contrib/suggest/media/Template_16x_vscode.svg delete mode 100644 src/vs/editor/contrib/suggest/media/Template_16x_vscode_inverse.svg diff --git a/src/vs/editor/contrib/suggest/media/Class_16x.svg b/src/vs/editor/contrib/suggest/media/Class_16x.svg deleted file mode 100755 index 5ef1c6f80bc..00000000000 --- a/src/vs/editor/contrib/suggest/media/Class_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Class_inverse_16x.svg b/src/vs/editor/contrib/suggest/media/Class_inverse_16x.svg deleted file mode 100755 index c43aad29efd..00000000000 --- a/src/vs/editor/contrib/suggest/media/Class_inverse_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/ColorPalette_16x.svg b/src/vs/editor/contrib/suggest/media/ColorPalette_16x.svg deleted file mode 100755 index 2af5cc6faef..00000000000 --- a/src/vs/editor/contrib/suggest/media/ColorPalette_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/ColorPalette_inverse_16x.svg b/src/vs/editor/contrib/suggest/media/ColorPalette_inverse_16x.svg deleted file mode 100755 index 7afb32b895e..00000000000 --- a/src/vs/editor/contrib/suggest/media/ColorPalette_inverse_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Constant_16x.svg b/src/vs/editor/contrib/suggest/media/Constant_16x.svg deleted file mode 100644 index ed2a1751005..00000000000 --- a/src/vs/editor/contrib/suggest/media/Constant_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Constant_16x_inverse.svg b/src/vs/editor/contrib/suggest/media/Constant_16x_inverse.svg deleted file mode 100644 index 173e427f964..00000000000 --- a/src/vs/editor/contrib/suggest/media/Constant_16x_inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Document_16x.svg b/src/vs/editor/contrib/suggest/media/Document_16x.svg deleted file mode 100755 index 13ded2953eb..00000000000 --- a/src/vs/editor/contrib/suggest/media/Document_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Document_inverse_16x.svg b/src/vs/editor/contrib/suggest/media/Document_inverse_16x.svg deleted file mode 100755 index 949a376216a..00000000000 --- a/src/vs/editor/contrib/suggest/media/Document_inverse_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/EnumItem_16x.svg b/src/vs/editor/contrib/suggest/media/EnumItem_16x.svg deleted file mode 100755 index aa901ec1934..00000000000 --- a/src/vs/editor/contrib/suggest/media/EnumItem_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/EnumItem_inverse_16x.svg b/src/vs/editor/contrib/suggest/media/EnumItem_inverse_16x.svg deleted file mode 100755 index 791759092fc..00000000000 --- a/src/vs/editor/contrib/suggest/media/EnumItem_inverse_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Enumerator_16x.svg b/src/vs/editor/contrib/suggest/media/Enumerator_16x.svg deleted file mode 100755 index e4a9551fd5a..00000000000 --- a/src/vs/editor/contrib/suggest/media/Enumerator_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Enumerator_inverse_16x.svg b/src/vs/editor/contrib/suggest/media/Enumerator_inverse_16x.svg deleted file mode 100755 index d8e9f4f107a..00000000000 --- a/src/vs/editor/contrib/suggest/media/Enumerator_inverse_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Event_16x_vscode.svg b/src/vs/editor/contrib/suggest/media/Event_16x_vscode.svg deleted file mode 100644 index 0e202ec10be..00000000000 --- a/src/vs/editor/contrib/suggest/media/Event_16x_vscode.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Event_16x_vscode_inverse.svg b/src/vs/editor/contrib/suggest/media/Event_16x_vscode_inverse.svg deleted file mode 100644 index a508edcd3d6..00000000000 --- a/src/vs/editor/contrib/suggest/media/Event_16x_vscode_inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Field_16x.svg b/src/vs/editor/contrib/suggest/media/Field_16x.svg deleted file mode 100755 index c6cb5362b3b..00000000000 --- a/src/vs/editor/contrib/suggest/media/Field_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Field_inverse_16x.svg b/src/vs/editor/contrib/suggest/media/Field_inverse_16x.svg deleted file mode 100755 index 5fc48ceff0f..00000000000 --- a/src/vs/editor/contrib/suggest/media/Field_inverse_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Folder_16x.svg b/src/vs/editor/contrib/suggest/media/Folder_16x.svg deleted file mode 100644 index 3d64ae71db4..00000000000 --- a/src/vs/editor/contrib/suggest/media/Folder_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Folder_inverse_16x.svg b/src/vs/editor/contrib/suggest/media/Folder_inverse_16x.svg deleted file mode 100755 index 13b18d18016..00000000000 --- a/src/vs/editor/contrib/suggest/media/Folder_inverse_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/ImportFile_16x_vscode.svg b/src/vs/editor/contrib/suggest/media/ImportFile_16x_vscode.svg deleted file mode 100644 index 5511fc9e239..00000000000 --- a/src/vs/editor/contrib/suggest/media/ImportFile_16x_vscode.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/ImportFile_16x_vscode_inverse.svg b/src/vs/editor/contrib/suggest/media/ImportFile_16x_vscode_inverse.svg deleted file mode 100644 index 604d994cbd5..00000000000 --- a/src/vs/editor/contrib/suggest/media/ImportFile_16x_vscode_inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/IntelliSenseKeyword_16x.svg b/src/vs/editor/contrib/suggest/media/IntelliSenseKeyword_16x.svg deleted file mode 100755 index 4a69c4a038b..00000000000 --- a/src/vs/editor/contrib/suggest/media/IntelliSenseKeyword_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/IntelliSenseKeyword_inverse_16x.svg b/src/vs/editor/contrib/suggest/media/IntelliSenseKeyword_inverse_16x.svg deleted file mode 100755 index decbf2c403e..00000000000 --- a/src/vs/editor/contrib/suggest/media/IntelliSenseKeyword_inverse_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Interface_16x.svg b/src/vs/editor/contrib/suggest/media/Interface_16x.svg deleted file mode 100755 index 958a792742a..00000000000 --- a/src/vs/editor/contrib/suggest/media/Interface_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Interface_inverse_16x.svg b/src/vs/editor/contrib/suggest/media/Interface_inverse_16x.svg deleted file mode 100755 index f7c2934a55c..00000000000 --- a/src/vs/editor/contrib/suggest/media/Interface_inverse_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/LocalVariable_16x_vscode.svg b/src/vs/editor/contrib/suggest/media/LocalVariable_16x_vscode.svg deleted file mode 100644 index e78894b6c63..00000000000 --- a/src/vs/editor/contrib/suggest/media/LocalVariable_16x_vscode.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/LocalVariable_16x_vscode_inverse.svg b/src/vs/editor/contrib/suggest/media/LocalVariable_16x_vscode_inverse.svg deleted file mode 100644 index 44a44b489d1..00000000000 --- a/src/vs/editor/contrib/suggest/media/LocalVariable_16x_vscode_inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Method_16x.svg b/src/vs/editor/contrib/suggest/media/Method_16x.svg deleted file mode 100755 index 2be9daa5f5d..00000000000 --- a/src/vs/editor/contrib/suggest/media/Method_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Method_inverse_16x.svg b/src/vs/editor/contrib/suggest/media/Method_inverse_16x.svg deleted file mode 100755 index d3c2c571d98..00000000000 --- a/src/vs/editor/contrib/suggest/media/Method_inverse_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Misc_inverse_16x.svg b/src/vs/editor/contrib/suggest/media/Misc_inverse_16x.svg deleted file mode 100755 index 50a038657b2..00000000000 --- a/src/vs/editor/contrib/suggest/media/Misc_inverse_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Namespace_16x.svg b/src/vs/editor/contrib/suggest/media/Namespace_16x.svg deleted file mode 100755 index dab07dd5ad9..00000000000 --- a/src/vs/editor/contrib/suggest/media/Namespace_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Namespace_inverse_16x.svg b/src/vs/editor/contrib/suggest/media/Namespace_inverse_16x.svg deleted file mode 100755 index 9b9a44c52d2..00000000000 --- a/src/vs/editor/contrib/suggest/media/Namespace_inverse_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Operator_16x_vscode.svg b/src/vs/editor/contrib/suggest/media/Operator_16x_vscode.svg deleted file mode 100644 index ba2f2d091cf..00000000000 --- a/src/vs/editor/contrib/suggest/media/Operator_16x_vscode.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Operator_16x_vscode_inverse.svg b/src/vs/editor/contrib/suggest/media/Operator_16x_vscode_inverse.svg deleted file mode 100644 index 21e1e814b2e..00000000000 --- a/src/vs/editor/contrib/suggest/media/Operator_16x_vscode_inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Property_16x.svg b/src/vs/editor/contrib/suggest/media/Property_16x.svg deleted file mode 100755 index fb1c74cf773..00000000000 --- a/src/vs/editor/contrib/suggest/media/Property_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Property_inverse_16x.svg b/src/vs/editor/contrib/suggest/media/Property_inverse_16x.svg deleted file mode 100755 index f90781897a7..00000000000 --- a/src/vs/editor/contrib/suggest/media/Property_inverse_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Ruler_16x.svg b/src/vs/editor/contrib/suggest/media/Ruler_16x.svg deleted file mode 100755 index 2e8e88fef0d..00000000000 --- a/src/vs/editor/contrib/suggest/media/Ruler_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Ruler_inverse_16x.svg b/src/vs/editor/contrib/suggest/media/Ruler_inverse_16x.svg deleted file mode 100755 index 373ab812f92..00000000000 --- a/src/vs/editor/contrib/suggest/media/Ruler_inverse_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Snippet_16x.svg b/src/vs/editor/contrib/suggest/media/Snippet_16x.svg deleted file mode 100644 index 8bf3b9f67d6..00000000000 --- a/src/vs/editor/contrib/suggest/media/Snippet_16x.svg +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/src/vs/editor/contrib/suggest/media/Snippet_inverse_16x.svg b/src/vs/editor/contrib/suggest/media/Snippet_inverse_16x.svg deleted file mode 100644 index 501ff9c6177..00000000000 --- a/src/vs/editor/contrib/suggest/media/Snippet_inverse_16x.svg +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/src/vs/editor/contrib/suggest/media/String_16x.svg b/src/vs/editor/contrib/suggest/media/String_16x.svg deleted file mode 100755 index 35e744ce90d..00000000000 --- a/src/vs/editor/contrib/suggest/media/String_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/String_inverse_16x.svg b/src/vs/editor/contrib/suggest/media/String_inverse_16x.svg deleted file mode 100755 index 1ac0cf99ac8..00000000000 --- a/src/vs/editor/contrib/suggest/media/String_inverse_16x.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Structure_16x_vscode.svg b/src/vs/editor/contrib/suggest/media/Structure_16x_vscode.svg deleted file mode 100644 index e776cbc5651..00000000000 --- a/src/vs/editor/contrib/suggest/media/Structure_16x_vscode.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Structure_16x_vscode_inverse.svg b/src/vs/editor/contrib/suggest/media/Structure_16x_vscode_inverse.svg deleted file mode 100644 index 1b76b62be9a..00000000000 --- a/src/vs/editor/contrib/suggest/media/Structure_16x_vscode_inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Template_16x_vscode.svg b/src/vs/editor/contrib/suggest/media/Template_16x_vscode.svg deleted file mode 100644 index 788cc8d6450..00000000000 --- a/src/vs/editor/contrib/suggest/media/Template_16x_vscode.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/media/Template_16x_vscode_inverse.svg b/src/vs/editor/contrib/suggest/media/Template_16x_vscode_inverse.svg deleted file mode 100644 index 6cec71cb033..00000000000 --- a/src/vs/editor/contrib/suggest/media/Template_16x_vscode_inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file From 4f6c6c7f81bf6793f1b7841bf70495961a96781c Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Mon, 24 Jun 2019 13:14:40 -0700 Subject: [PATCH 0606/1449] status.workbench.keyboardLayout --- .../contrib/preferences/browser/keyboardLayoutPicker.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts b/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts index ddab5c033e4..043e3dd6e2a 100644 --- a/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts +++ b/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts @@ -41,8 +41,8 @@ export class KeyboardLayoutPickerContribution extends Disposable implements IWor // tooltip: nls.localize('keyboard.layout.tooltip', "If you are not using a Screen Reader, please change the setting `editor.accessibilitySupport` to \"off\"."), command: KEYBOARD_LAYOUT_OPEN_PICKER }, - 'status.editor.screenReaderMode', - nls.localize('status.editor.screenReaderMode', "Screen Reader Mode"), + 'status.workbench.keyboardLayout', + nls.localize('status.workbench.keyboardLayout', "Current keyboard layout"), StatusbarAlignment.RIGHT ); } From e899b1c6b1ead0ffaf9af31cd5af8e09e5c390d1 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Mon, 24 Jun 2019 13:37:10 -0700 Subject: [PATCH 0607/1449] Move Inspect Keyboard Layout JSON to workbench --- .../codeEditor/browser/inspectKeybindings.ts | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/vs/workbench/contrib/codeEditor/browser/inspectKeybindings.ts b/src/vs/workbench/contrib/codeEditor/browser/inspectKeybindings.ts index 8c7aaaf0e33..ec27d6a2e22 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/inspectKeybindings.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/inspectKeybindings.ts @@ -9,6 +9,10 @@ import { EditorAction, ServicesAccessor, registerEditorAction } from 'vs/editor/ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IUntitledResourceInput } from 'vs/workbench/common/editor'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; +import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; +import { Action } from 'vs/base/common/actions'; class InspectKeyMap extends EditorAction { @@ -31,23 +35,23 @@ class InspectKeyMap extends EditorAction { registerEditorAction(InspectKeyMap); -class InspectKeyMapJSON extends EditorAction { +class InspectKeyMapJSON extends Action { + public static readonly ID = 'workbench.action.inspectKeyMappingsJSON'; + public static readonly LABEL = nls.localize('workbench.action.inspectKeyMapJSON', "Developer: Inspect Key Mappings (JSON)"); - constructor() { - super({ - id: 'workbench.action.inspectKeyMappingsJSON', - label: nls.localize('workbench.action.inspectKeyMapJSON', "Developer: Inspect Key Mappings (JSON)"), - alias: 'Developer: Inspect Key Mappings (JSON)', - precondition: undefined - }); + constructor( + id: string, + label: string, + @IKeybindingService private readonly _keybindingService: IKeybindingService, + @IEditorService private readonly _editorService: IEditorService + ) { + super(id, label); } - public run(accessor: ServicesAccessor, editor: ICodeEditor): void { - const keybindingService = accessor.get(IKeybindingService); - const editorService = accessor.get(IEditorService); - - editorService.openEditor({ contents: keybindingService._dumpDebugInfoJSON(), options: { pinned: true } } as IUntitledResourceInput); + public run(): Promise { + return this._editorService.openEditor({ contents: this._keybindingService._dumpDebugInfoJSON(), options: { pinned: true } } as IUntitledResourceInput); } } -registerEditorAction(InspectKeyMapJSON); +const registry = Registry.as(ActionExtensions.WorkbenchActions); +registry.registerWorkbenchAction(new SyncActionDescriptor(InspectKeyMapJSON, InspectKeyMapJSON.ID, InspectKeyMapJSON.LABEL), 'Developer: Inspect Key Mappings (JSON)'); From 77dd9117304b1be4a6d36777f075f03be265f307 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Mon, 24 Jun 2019 14:08:31 -0700 Subject: [PATCH 0608/1449] Update notifications and warning icons --- .../severityIcon/common/severityIcon.ts | 24 ++++++++--------- .../notifications/media/close-all-dark.svg | 4 +++ .../notifications/media/close-all-light.svg | 4 +++ .../parts/notifications/media/close-dark.svg | 4 +++ .../notifications/media/close-inverse.svg | 1 - .../parts/notifications/media/close-light.svg | 4 +++ .../parts/notifications/media/close.svg | 1 - .../notifications/media/closeall-inverse.svg | 1 - .../parts/notifications/media/closeall.svg | 1 - .../notifications/media/configure-dark.svg | 3 +++ .../notifications/media/configure-inverse.svg | 1 - .../notifications/media/configure-light.svg | 3 +++ .../parts/notifications/media/configure.svg | 1 - .../notifications/media/down-inverse.svg | 1 - .../parts/notifications/media/down.svg | 1 - .../parts/notifications/media/error-dark.svg | 3 +++ .../notifications/media/error-inverse.svg | 26 ------------------- .../parts/notifications/media/error-light.svg | 3 +++ .../parts/notifications/media/info-dark.svg | 4 +++ .../notifications/media/info-inverse.svg | 17 ------------ .../parts/notifications/media/info-light.svg | 10 +++++++ .../media/notificationsActions.css | 24 ++++++++--------- .../notifications/media/notificationsList.css | 12 ++++----- .../media/tree-collapsed-dark.svg | 3 +++ .../media/tree-collapsed-light.svg | 3 +++ .../media/tree-expanded-dark.svg | 3 +++ .../media/tree-expanded-light.svg | 3 +++ .../parts/notifications/media/up-inverse.svg | 1 - .../browser/parts/notifications/media/up.svg | 1 - .../notifications/media/warning-dark.svg | 3 +++ .../notifications/media/warning-inverse.svg | 15 ----------- .../notifications/media/warning-light.svg | 4 +++ 32 files changed, 91 insertions(+), 98 deletions(-) create mode 100644 src/vs/workbench/browser/parts/notifications/media/close-all-dark.svg create mode 100644 src/vs/workbench/browser/parts/notifications/media/close-all-light.svg create mode 100644 src/vs/workbench/browser/parts/notifications/media/close-dark.svg delete mode 100644 src/vs/workbench/browser/parts/notifications/media/close-inverse.svg create mode 100644 src/vs/workbench/browser/parts/notifications/media/close-light.svg delete mode 100644 src/vs/workbench/browser/parts/notifications/media/close.svg delete mode 100644 src/vs/workbench/browser/parts/notifications/media/closeall-inverse.svg delete mode 100644 src/vs/workbench/browser/parts/notifications/media/closeall.svg create mode 100644 src/vs/workbench/browser/parts/notifications/media/configure-dark.svg delete mode 100644 src/vs/workbench/browser/parts/notifications/media/configure-inverse.svg create mode 100644 src/vs/workbench/browser/parts/notifications/media/configure-light.svg delete mode 100644 src/vs/workbench/browser/parts/notifications/media/configure.svg delete mode 100755 src/vs/workbench/browser/parts/notifications/media/down-inverse.svg delete mode 100755 src/vs/workbench/browser/parts/notifications/media/down.svg create mode 100644 src/vs/workbench/browser/parts/notifications/media/error-dark.svg delete mode 100755 src/vs/workbench/browser/parts/notifications/media/error-inverse.svg create mode 100644 src/vs/workbench/browser/parts/notifications/media/error-light.svg create mode 100644 src/vs/workbench/browser/parts/notifications/media/info-dark.svg delete mode 100755 src/vs/workbench/browser/parts/notifications/media/info-inverse.svg create mode 100644 src/vs/workbench/browser/parts/notifications/media/info-light.svg create mode 100644 src/vs/workbench/browser/parts/notifications/media/tree-collapsed-dark.svg create mode 100644 src/vs/workbench/browser/parts/notifications/media/tree-collapsed-light.svg create mode 100644 src/vs/workbench/browser/parts/notifications/media/tree-expanded-dark.svg create mode 100644 src/vs/workbench/browser/parts/notifications/media/tree-expanded-light.svg delete mode 100755 src/vs/workbench/browser/parts/notifications/media/up-inverse.svg delete mode 100755 src/vs/workbench/browser/parts/notifications/media/up.svg create mode 100644 src/vs/workbench/browser/parts/notifications/media/warning-dark.svg delete mode 100755 src/vs/workbench/browser/parts/notifications/media/warning-inverse.svg create mode 100644 src/vs/workbench/browser/parts/notifications/media/warning-light.svg diff --git a/src/vs/platform/severityIcon/common/severityIcon.ts b/src/vs/platform/severityIcon/common/severityIcon.ts index 343774e5b09..00da253ce7e 100644 --- a/src/vs/platform/severityIcon/common/severityIcon.ts +++ b/src/vs/platform/severityIcon/common/severityIcon.ts @@ -7,20 +7,20 @@ import Severity from 'vs/base/common/severity'; import { registerThemingParticipant, ITheme, LIGHT } from 'vs/platform/theme/common/themeService'; import { Color } from 'vs/base/common/color'; -const errorStart = encodeURIComponent(``); -const errorDarkStart = encodeURIComponent(``); +const errorStart = encodeURIComponent(``); +const errorDarkStart = encodeURIComponent(``); -const warningStart = encodeURIComponent(``); -const warningDarkStart = encodeURIComponent(``); +const warningStart = encodeURIComponent(``); +const warningDarkStart = encodeURIComponent(``); -const infoStart = encodeURIComponent(``); -const infoDarkStart = encodeURIComponent(``); +const infoStart = encodeURIComponent(``); +const infoDarkStart = encodeURIComponent(``); export namespace SeverityIcon { diff --git a/src/vs/workbench/browser/parts/notifications/media/close-all-dark.svg b/src/vs/workbench/browser/parts/notifications/media/close-all-dark.svg new file mode 100644 index 00000000000..35e5fb44226 --- /dev/null +++ b/src/vs/workbench/browser/parts/notifications/media/close-all-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/browser/parts/notifications/media/close-all-light.svg b/src/vs/workbench/browser/parts/notifications/media/close-all-light.svg new file mode 100644 index 00000000000..6c7cec7461c --- /dev/null +++ b/src/vs/workbench/browser/parts/notifications/media/close-all-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/browser/parts/notifications/media/close-dark.svg b/src/vs/workbench/browser/parts/notifications/media/close-dark.svg new file mode 100644 index 00000000000..e0475f7b85a --- /dev/null +++ b/src/vs/workbench/browser/parts/notifications/media/close-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/browser/parts/notifications/media/close-inverse.svg b/src/vs/workbench/browser/parts/notifications/media/close-inverse.svg deleted file mode 100644 index 751e89b3b02..00000000000 --- a/src/vs/workbench/browser/parts/notifications/media/close-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/notifications/media/close-light.svg b/src/vs/workbench/browser/parts/notifications/media/close-light.svg new file mode 100644 index 00000000000..3bd44674699 --- /dev/null +++ b/src/vs/workbench/browser/parts/notifications/media/close-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/browser/parts/notifications/media/close.svg b/src/vs/workbench/browser/parts/notifications/media/close.svg deleted file mode 100644 index fde34404d4e..00000000000 --- a/src/vs/workbench/browser/parts/notifications/media/close.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/notifications/media/closeall-inverse.svg b/src/vs/workbench/browser/parts/notifications/media/closeall-inverse.svg deleted file mode 100644 index 74e8dd8a024..00000000000 --- a/src/vs/workbench/browser/parts/notifications/media/closeall-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/notifications/media/closeall.svg b/src/vs/workbench/browser/parts/notifications/media/closeall.svg deleted file mode 100644 index 7250ff6b54e..00000000000 --- a/src/vs/workbench/browser/parts/notifications/media/closeall.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/notifications/media/configure-dark.svg b/src/vs/workbench/browser/parts/notifications/media/configure-dark.svg new file mode 100644 index 00000000000..4e4bc65c207 --- /dev/null +++ b/src/vs/workbench/browser/parts/notifications/media/configure-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/notifications/media/configure-inverse.svg b/src/vs/workbench/browser/parts/notifications/media/configure-inverse.svg deleted file mode 100644 index 61baaea2b8b..00000000000 --- a/src/vs/workbench/browser/parts/notifications/media/configure-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/notifications/media/configure-light.svg b/src/vs/workbench/browser/parts/notifications/media/configure-light.svg new file mode 100644 index 00000000000..fb7ffea770b --- /dev/null +++ b/src/vs/workbench/browser/parts/notifications/media/configure-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/notifications/media/configure.svg b/src/vs/workbench/browser/parts/notifications/media/configure.svg deleted file mode 100644 index 3dec2ba50fd..00000000000 --- a/src/vs/workbench/browser/parts/notifications/media/configure.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/notifications/media/down-inverse.svg b/src/vs/workbench/browser/parts/notifications/media/down-inverse.svg deleted file mode 100755 index f914c8bff14..00000000000 --- a/src/vs/workbench/browser/parts/notifications/media/down-inverse.svg +++ /dev/null @@ -1 +0,0 @@ -CollapseChevronDown_md_16x \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/notifications/media/down.svg b/src/vs/workbench/browser/parts/notifications/media/down.svg deleted file mode 100755 index dc21a6633d1..00000000000 --- a/src/vs/workbench/browser/parts/notifications/media/down.svg +++ /dev/null @@ -1 +0,0 @@ -CollapseChevronDown_md_16x \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/notifications/media/error-dark.svg b/src/vs/workbench/browser/parts/notifications/media/error-dark.svg new file mode 100644 index 00000000000..efdc5f2ae2d --- /dev/null +++ b/src/vs/workbench/browser/parts/notifications/media/error-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/notifications/media/error-inverse.svg b/src/vs/workbench/browser/parts/notifications/media/error-inverse.svg deleted file mode 100755 index 51e9dc81b99..00000000000 --- a/src/vs/workbench/browser/parts/notifications/media/error-inverse.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/src/vs/workbench/browser/parts/notifications/media/error-light.svg b/src/vs/workbench/browser/parts/notifications/media/error-light.svg new file mode 100644 index 00000000000..d646c72c740 --- /dev/null +++ b/src/vs/workbench/browser/parts/notifications/media/error-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/notifications/media/info-dark.svg b/src/vs/workbench/browser/parts/notifications/media/info-dark.svg new file mode 100644 index 00000000000..6fe5889fbf0 --- /dev/null +++ b/src/vs/workbench/browser/parts/notifications/media/info-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/browser/parts/notifications/media/info-inverse.svg b/src/vs/workbench/browser/parts/notifications/media/info-inverse.svg deleted file mode 100755 index 64b801a63be..00000000000 --- a/src/vs/workbench/browser/parts/notifications/media/info-inverse.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - diff --git a/src/vs/workbench/browser/parts/notifications/media/info-light.svg b/src/vs/workbench/browser/parts/notifications/media/info-light.svg new file mode 100644 index 00000000000..51de3eb6e08 --- /dev/null +++ b/src/vs/workbench/browser/parts/notifications/media/info-light.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/vs/workbench/browser/parts/notifications/media/notificationsActions.css b/src/vs/workbench/browser/parts/notifications/media/notificationsActions.css index 8240a601abe..d5b23828af9 100644 --- a/src/vs/workbench/browser/parts/notifications/media/notificationsActions.css +++ b/src/vs/workbench/browser/parts/notifications/media/notificationsActions.css @@ -15,55 +15,55 @@ } .vs .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-toolbar-container .clear-notification-action { - background-image: url('close.svg'); + background-image: url('close-light.svg'); } .vs-dark .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-toolbar-container .clear-notification-action, .hc-black .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-toolbar-container .clear-notification-action { - background-image: url('close-inverse.svg'); + background-image: url('close-dark.svg'); } .vs .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-toolbar-container .expand-notification-action { - background-image: url('up.svg'); + background-image: url('tree-collapsed-light.svg'); } .vs-dark .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-toolbar-container .expand-notification-action, .hc-black .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-toolbar-container .expand-notification-action { - background-image: url('up-inverse.svg'); + background-image: url('tree-collapsed-dark.svg'); } .vs .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-toolbar-container .collapse-notification-action { - background-image: url('down.svg'); + background-image: url('tree-expanded-light.svg'); } .vs-dark .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-toolbar-container .collapse-notification-action, .hc-black .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-toolbar-container .collapse-notification-action { - background-image: url('down-inverse.svg'); + background-image: url('tree-expanded-dark.svg'); } .vs .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-toolbar-container .configure-notification-action { - background-image: url('configure.svg'); + background-image: url('configure-light.svg'); } .vs-dark .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-toolbar-container .configure-notification-action, .hc-black .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-toolbar-container .configure-notification-action { - background-image: url('configure-inverse.svg'); + background-image: url('configure-dark.svg'); } .vs-dark .monaco-workbench > .notifications-center > .notifications-center-header .clear-all-notifications-action, .hc-black .monaco-workbench > .notifications-center > .notifications-center-header .clear-all-notifications-action { - background-image: url('closeall-inverse.svg'); + background-image: url('close-all-dark.svg'); } .vs .monaco-workbench > .notifications-center > .notifications-center-header .clear-all-notifications-action { - background-image: url('closeall.svg'); + background-image: url('close-all-light.svg'); } .vs-dark .monaco-workbench > .notifications-center > .notifications-center-header .hide-all-notifications-action, .hc-black .monaco-workbench > .notifications-center > .notifications-center-header .hide-all-notifications-action { - background-image: url('down-inverse.svg'); + background-image: url('tree-expanded-dark.svg'); } .vs .monaco-workbench > .notifications-center > .notifications-center-header .hide-all-notifications-action { - background-image: url('down.svg'); + background-image: url('tree-expanded-light.svg'); } \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/notifications/media/notificationsList.css b/src/vs/workbench/browser/parts/notifications/media/notificationsList.css index 8d1a1d81dbd..f97e52b3507 100644 --- a/src/vs/workbench/browser/parts/notifications/media/notificationsList.css +++ b/src/vs/workbench/browser/parts/notifications/media/notificationsList.css @@ -41,30 +41,30 @@ } .vs .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-icon.icon-info { - background-image: url('info.svg'); + background-image: url('info-light.svg'); } .vs .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-icon.icon-warning { - background-image: url('warning.svg'); + background-image: url('warning-light.svg'); } .vs .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-icon.icon-error { - background-image: url('error.svg'); + background-image: url('error-light.svg'); } .vs-dark .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-icon.icon-info, .hc-black .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-icon.icon-info { - background-image: url('info-inverse.svg'); + background-image: url('info-dark.svg'); } .vs-dark .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-icon.icon-warning, .hc-black .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-icon.icon-warning { - background-image: url('warning-inverse.svg'); + background-image: url('warning-dark.svg'); } .vs-dark .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-icon.icon-error, .hc-black .monaco-workbench .notifications-list-container .notification-list-item .notification-list-item-icon.icon-error { - background-image: url('error-inverse.svg'); + background-image: url('error-dark.svg'); } /** Notification: Message */ diff --git a/src/vs/workbench/browser/parts/notifications/media/tree-collapsed-dark.svg b/src/vs/workbench/browser/parts/notifications/media/tree-collapsed-dark.svg new file mode 100644 index 00000000000..25150f44af4 --- /dev/null +++ b/src/vs/workbench/browser/parts/notifications/media/tree-collapsed-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/notifications/media/tree-collapsed-light.svg b/src/vs/workbench/browser/parts/notifications/media/tree-collapsed-light.svg new file mode 100644 index 00000000000..17fe3be98b3 --- /dev/null +++ b/src/vs/workbench/browser/parts/notifications/media/tree-collapsed-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/notifications/media/tree-expanded-dark.svg b/src/vs/workbench/browser/parts/notifications/media/tree-expanded-dark.svg new file mode 100644 index 00000000000..a1df6a8d44a --- /dev/null +++ b/src/vs/workbench/browser/parts/notifications/media/tree-expanded-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/notifications/media/tree-expanded-light.svg b/src/vs/workbench/browser/parts/notifications/media/tree-expanded-light.svg new file mode 100644 index 00000000000..e60e357f573 --- /dev/null +++ b/src/vs/workbench/browser/parts/notifications/media/tree-expanded-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/notifications/media/up-inverse.svg b/src/vs/workbench/browser/parts/notifications/media/up-inverse.svg deleted file mode 100755 index bf7107e6785..00000000000 --- a/src/vs/workbench/browser/parts/notifications/media/up-inverse.svg +++ /dev/null @@ -1 +0,0 @@ -CollapseChevronUp_md_16x \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/notifications/media/up.svg b/src/vs/workbench/browser/parts/notifications/media/up.svg deleted file mode 100755 index 5311bb787ac..00000000000 --- a/src/vs/workbench/browser/parts/notifications/media/up.svg +++ /dev/null @@ -1 +0,0 @@ -CollapseChevronUp_md_16x \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/notifications/media/warning-dark.svg b/src/vs/workbench/browser/parts/notifications/media/warning-dark.svg new file mode 100644 index 00000000000..a267963e585 --- /dev/null +++ b/src/vs/workbench/browser/parts/notifications/media/warning-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/notifications/media/warning-inverse.svg b/src/vs/workbench/browser/parts/notifications/media/warning-inverse.svg deleted file mode 100755 index a7f4afbcc9c..00000000000 --- a/src/vs/workbench/browser/parts/notifications/media/warning-inverse.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - -StatusWarning_16x - - - - - diff --git a/src/vs/workbench/browser/parts/notifications/media/warning-light.svg b/src/vs/workbench/browser/parts/notifications/media/warning-light.svg new file mode 100644 index 00000000000..f2e2aa741e5 --- /dev/null +++ b/src/vs/workbench/browser/parts/notifications/media/warning-light.svg @@ -0,0 +1,4 @@ + + + + From 397629a1ad9482367990dffe99a26106495f5e8e Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 24 Jun 2019 22:29:13 +0200 Subject: [PATCH 0609/1449] return local extension after install --- .../common/extensionManagement.ts | 4 ++-- .../node/extensionManagementIpc.ts | 13 +++++++------ .../node/extensionManagementService.ts | 14 +++++++------- src/vs/workbench/browser/web.simpleservices.ts | 10 ++++++---- .../extensions/node/extensionsWorkbenchService.ts | 6 +++--- .../extensions/node/multiExtensionManagement.ts | 10 +++++----- 6 files changed, 30 insertions(+), 27 deletions(-) diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index 8b024db44b2..833fedd1fcc 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -196,8 +196,8 @@ export interface IExtensionManagementService { zip(extension: ILocalExtension): Promise; unzip(zipLocation: URI, type: ExtensionType): Promise; - install(vsix: URI): Promise; - installFromGallery(extension: IGalleryExtension): Promise; + install(vsix: URI): Promise; + installFromGallery(extension: IGalleryExtension): Promise; uninstall(extension: ILocalExtension, force?: boolean): Promise; reinstallFromGallery(extension: ILocalExtension): Promise; getInstalled(type?: ExtensionType): Promise; diff --git a/src/vs/platform/extensionManagement/node/extensionManagementIpc.ts b/src/vs/platform/extensionManagement/node/extensionManagementIpc.ts index e290cc0b069..9e49db285cc 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementIpc.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementIpc.ts @@ -101,13 +101,14 @@ export class ExtensionManagementChannelClient implements IExtensionManagementSer return Promise.resolve(this.channel.call('unzip', [zipLocation, type])); } - install(vsix: URI): Promise { - return Promise.resolve(this.channel.call('install', [vsix])); + install(vsix: URI): Promise { + return Promise.resolve(this.channel.call('install', [vsix])).then(local => transformIncomingExtension(local, null)); } - async installFromGallery(extension: IGalleryExtension): Promise { + async installFromGallery(extension: IGalleryExtension): Promise { try { - await Promise.resolve(this.channel.call('installFromGallery', [extension])); + const local = await Promise.resolve(this.channel.call('installFromGallery', [extension])); + return transformIncomingExtension(local, null); } catch (error) { if (this.remote) { try { @@ -117,9 +118,9 @@ export class ExtensionManagementChannelClient implements IExtensionManagementSer if (compatible) { const installed = await this.getInstalled(ExtensionType.User); const location = await this.galleryService.download(compatible, installed.filter(i => areSameExtensions(i.identifier, extension.identifier))[0] ? InstallOperation.Update : InstallOperation.Install); - await this.install(URI.file(location)); + const local = await this.install(URI.file(location)); this.logService.info(`Successfully installed '${extension.identifier.id}' extension`); - return; + return local; } } catch (e) { this.logService.error(e); diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 082fea1589a..90b0c0f7bce 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -109,7 +109,7 @@ export class ExtensionManagementService extends Disposable implements IExtension private uninstalledFileLimiter: Queue; private reportedExtensions: Promise | undefined; private lastReportTimestamp = 0; - private readonly installingExtensions: Map> = new Map>(); + private readonly installingExtensions: Map> = new Map>(); private readonly uninstallingExtensions: Map> = new Map>(); private readonly manifestCache: ExtensionsManifestCache; private readonly extensionLifecycle: ExtensionsLifecycle; @@ -158,7 +158,7 @@ export class ExtensionManagementService extends Disposable implements IExtension unzip(zipLocation: URI, type: ExtensionType): Promise { this.logService.trace('ExtensionManagementService#unzip', zipLocation.toString()); - return this.install(zipLocation, type); + return this.install(zipLocation, type).then(local => local.identifier); } private collectFiles(extension: ILocalExtension): Promise { @@ -187,7 +187,7 @@ export class ExtensionManagementService extends Disposable implements IExtension } - install(vsix: URI, type: ExtensionType = ExtensionType.User): Promise { + install(vsix: URI, type: ExtensionType = ExtensionType.User): Promise { this.logService.trace('ExtensionManagementService#install', vsix.toString()); return createCancelablePromise(token => { return this.downloadVsix(vsix).then(downloadLocation => { @@ -222,7 +222,7 @@ export class ExtensionManagementService extends Disposable implements IExtension metadata => this.installFromZipPath(identifierWithVersion, zipPath, metadata, type, operation, token), () => this.installFromZipPath(identifierWithVersion, zipPath, null, type, operation, token)) .then( - () => { this.logService.info('Successfully installed the extension:', identifier.id); return identifier; }, + local => { this.logService.info('Successfully installed the extension:', identifier.id); return local; }, e => { this.logService.error('Failed to install the extension:', identifier.id, e.message); return Promise.reject(e); @@ -264,7 +264,7 @@ export class ExtensionManagementService extends Disposable implements IExtension )); } - async installFromGallery(extension: IGalleryExtension): Promise { + async installFromGallery(extension: IGalleryExtension): Promise { if (!this.galleryService.isEnabled()) { return Promise.reject(new Error(nls.localize('MarketPlaceDisabled', "Marketplace is not enabled"))); } @@ -301,7 +301,7 @@ export class ExtensionManagementService extends Disposable implements IExtension this._onInstallExtension.fire({ identifier: extension.identifier, gallery: extension }); let operation: InstallOperation = InstallOperation.Install; - let cancellationToken: CancellationToken, successCallback: (a?: any) => void, errorCallback: (e?: any) => any | null; + let cancellationToken: CancellationToken, successCallback: (local: ILocalExtension) => void, errorCallback: (e?: any) => any | null; cancellablePromise = createCancelablePromise(token => { cancellationToken = token; return new Promise((c, e) => { successCallback = c; errorCallback = e; }); }); this.installingExtensions.set(key, cancellablePromise); try { @@ -323,7 +323,7 @@ export class ExtensionManagementService extends Disposable implements IExtension } this.installingExtensions.delete(key); onDidInstallExtensionSuccess(extension, operation, local); - successCallback(null); + successCallback(local); }, error => { this.installingExtensions.delete(key); diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index 193cb07fd31..17851c24994 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -401,12 +401,13 @@ export class SimpleExtensionManagementService implements IExtensionManagementSer return Promise.resolve(undefined); } - install(vsix: URI): Promise { + install(vsix: URI): Promise { // @ts-ignore return Promise.resolve(undefined); } - installFromGallery(extension: IGalleryExtension): Promise { + installFromGallery(extension: IGalleryExtension): Promise { + // @ts-ignore return Promise.resolve(undefined); } @@ -488,12 +489,13 @@ export class SimpleMultiExtensionsManagementService implements IExtensionManagem return Promise.resolve(undefined); } - install(vsix: URI): Promise { + install(vsix: URI): Promise { // @ts-ignore return Promise.resolve(undefined); } - installFromGallery(extension: IGalleryExtension): Promise { + installFromGallery(extension: IGalleryExtension): Promise { + // @ts-ignore return Promise.resolve(undefined); } diff --git a/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts index 64eac307ad3..d91ddb52882 100644 --- a/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts @@ -761,9 +761,9 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension install(extension: string | IExtension): Promise { if (typeof extension === 'string') { return this.installWithProgress(async () => { - const extensionIdentifier = await this.extensionService.install(URI.file(extension)); - this.checkAndEnableDisabledDependencies(extensionIdentifier); - return this.local.filter(local => areSameExtensions(local.identifier, extensionIdentifier))[0]; + const { identifier } = await this.extensionService.install(URI.file(extension)); + this.checkAndEnableDisabledDependencies(identifier); + return this.local.filter(local => areSameExtensions(local.identifier, identifier))[0]; }); } diff --git a/src/vs/workbench/services/extensions/node/multiExtensionManagement.ts b/src/vs/workbench/services/extensions/node/multiExtensionManagement.ts index e27a2a7ed46..1425161d0d7 100644 --- a/src/vs/workbench/services/extensions/node/multiExtensionManagement.ts +++ b/src/vs/workbench/services/extensions/node/multiExtensionManagement.ts @@ -134,13 +134,13 @@ export class MultiExtensionManagementService extends Disposable implements IExte return Promise.all(this.servers.map(({ extensionManagementService }) => extensionManagementService.unzip(zipLocation, type))).then(([extensionIdentifier]) => extensionIdentifier); } - async install(vsix: URI): Promise { + async install(vsix: URI): Promise { if (this.extensionManagementServerService.remoteExtensionManagementServer) { const manifest = await getManifest(vsix.fsPath); if (isLanguagePackExtension(manifest)) { // Install on both servers - const [extensionIdentifier] = await Promise.all(this.servers.map(server => server.extensionManagementService.install(vsix))); - return extensionIdentifier; + const [local] = await Promise.all(this.servers.map(server => server.extensionManagementService.install(vsix))); + return local; } if (isUIExtension(manifest, this.productService, this.configurationService)) { // Install only on local server @@ -155,13 +155,13 @@ export class MultiExtensionManagementService extends Disposable implements IExte return this.extensionManagementServerService.localExtensionManagementServer.extensionManagementService.install(vsix); } - async installFromGallery(gallery: IGalleryExtension): Promise { + async installFromGallery(gallery: IGalleryExtension): Promise { if (this.extensionManagementServerService.remoteExtensionManagementServer) { const manifest = await this.extensionGalleryService.getManifest(gallery, CancellationToken.None); if (manifest) { if (isLanguagePackExtension(manifest)) { // Install on both servers - return Promise.all(this.servers.map(server => server.extensionManagementService.installFromGallery(gallery))).then(() => undefined); + return Promise.all(this.servers.map(server => server.extensionManagementService.installFromGallery(gallery))).then(([local]) => local); } if (isUIExtension(manifest, this.productService, this.configurationService)) { // Install only on local server From eb451dd57ab306b7eaea2cac2e06a79ab89911f4 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 24 Jun 2019 23:17:20 +0200 Subject: [PATCH 0610/1449] install deps and packs while installing from gallery --- .../node/extensionManagementIpc.ts | 33 +---- .../extensionsActions.test.ts | 3 +- .../electron-browser/extensionsViews.test.ts | 3 +- .../extensionManagementServerService.ts | 9 +- .../remoteExtensionManagementIpc.ts | 140 ++++++++++++++++++ .../node/multiExtensionManagement.ts | 64 +------- 6 files changed, 157 insertions(+), 95 deletions(-) create mode 100644 src/vs/workbench/services/extensions/electron-browser/remoteExtensionManagementIpc.ts diff --git a/src/vs/platform/extensionManagement/node/extensionManagementIpc.ts b/src/vs/platform/extensionManagement/node/extensionManagementIpc.ts index 9e49db285cc..b88350f44c7 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementIpc.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementIpc.ts @@ -4,15 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { IChannel, IServerChannel } from 'vs/base/parts/ipc/common/ipc'; -import { IExtensionManagementService, ILocalExtension, InstallExtensionEvent, DidInstallExtensionEvent, IGalleryExtension, DidUninstallExtensionEvent, IExtensionIdentifier, IGalleryMetadata, IReportedExtension, IExtensionGalleryService, InstallOperation } from '../common/extensionManagement'; +import { IExtensionManagementService, ILocalExtension, InstallExtensionEvent, DidInstallExtensionEvent, IGalleryExtension, DidUninstallExtensionEvent, IExtensionIdentifier, IGalleryMetadata, IReportedExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; import { Event } from 'vs/base/common/event'; import { URI, UriComponents } from 'vs/base/common/uri'; import { IURITransformer, DefaultURITransformer, transformAndReviveIncomingURIs } from 'vs/base/common/uriIpc'; import { cloneAndChange } from 'vs/base/common/objects'; import { ExtensionType } from 'vs/platform/extensions/common/extensions'; -import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; -import { ILogService } from 'vs/platform/log/common/log'; -import { toErrorMessage } from 'vs/base/common/errorMessage'; function transformIncomingURI(uri: UriComponents, transformer: IURITransformer | null): URI { return URI.revive(transformer ? transformer.transformIncoming(uri) : uri); @@ -83,9 +80,6 @@ export class ExtensionManagementChannelClient implements IExtensionManagementSer constructor( private readonly channel: IChannel, - private readonly remote: boolean, - private readonly galleryService: IExtensionGalleryService, - private readonly logService: ILogService ) { } get onInstallExtension(): Event { return this.channel.listen('onInstallExtension'); } @@ -105,29 +99,8 @@ export class ExtensionManagementChannelClient implements IExtensionManagementSer return Promise.resolve(this.channel.call('install', [vsix])).then(local => transformIncomingExtension(local, null)); } - async installFromGallery(extension: IGalleryExtension): Promise { - try { - const local = await Promise.resolve(this.channel.call('installFromGallery', [extension])); - return transformIncomingExtension(local, null); - } catch (error) { - if (this.remote) { - try { - this.logService.error(`Error while installing '${extension.identifier.id}' extension in the remote server.`, toErrorMessage(error)); - this.logService.info(`Trying to download '${extension.identifier.id}' extension locally and install`); - const compatible = await this.galleryService.getCompatibleExtension(extension); - if (compatible) { - const installed = await this.getInstalled(ExtensionType.User); - const location = await this.galleryService.download(compatible, installed.filter(i => areSameExtensions(i.identifier, extension.identifier))[0] ? InstallOperation.Update : InstallOperation.Install); - const local = await this.install(URI.file(location)); - this.logService.info(`Successfully installed '${extension.identifier.id}' extension`); - return local; - } - } catch (e) { - this.logService.error(e); - } - } - throw error; - } + installFromGallery(extension: IGalleryExtension): Promise { + return Promise.resolve(this.channel.call('installFromGallery', [extension])).then(local => transformIncomingExtension(local, null)); } uninstall(extension: ILocalExtension, force = false): Promise { 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 68f6b32c349..9d1919ae5e5 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 @@ -40,6 +40,7 @@ import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedPr import { CancellationToken } from 'vs/base/common/cancellation'; import { ILabelService } from 'vs/platform/label/common/label'; import { ExtensionManagementServerService } from 'vs/workbench/services/extensions/electron-browser/extensionManagementServerService'; +import { IProductService } from 'vs/platform/product/common/product'; suite('ExtensionsActions Test', () => { @@ -78,7 +79,7 @@ suite('ExtensionsActions Test', () => { instantiationService.stub(IExtensionManagementServerService, new class extends ExtensionManagementServerService { private _localExtensionManagementServer: IExtensionManagementServer = { extensionManagementService: instantiationService.get(IExtensionManagementService), label: 'local', authority: 'vscode-local' }; constructor() { - super(instantiationService.get(ISharedProcessService), instantiationService.get(IRemoteAgentService), instantiationService.get(IExtensionGalleryService), instantiationService.get(ILogService)); + super(instantiationService.get(ISharedProcessService), instantiationService.get(IRemoteAgentService), instantiationService.get(IExtensionGalleryService), instantiationService.get(IConfigurationService), instantiationService.get(IProductService), instantiationService.get(ILogService)); } get localExtensionManagementServer(): IExtensionManagementServer { return this._localExtensionManagementServer; } set localExtensionManagementServer(server: IExtensionManagementServer) { } 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 2f80ab3c8bf..c9ad5d996c8 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 @@ -40,6 +40,7 @@ import { RemoteAgentService } from 'vs/workbench/services/remote/electron-browse import { ExtensionIdentifier, ExtensionType, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; import { ExtensionManagementServerService } from 'vs/workbench/services/extensions/electron-browser/extensionManagementServerService'; +import { IProductService } from 'vs/platform/product/common/product'; suite('ExtensionsListView Tests', () => { @@ -93,7 +94,7 @@ suite('ExtensionsListView Tests', () => { instantiationService.stub(IExtensionManagementServerService, new class extends ExtensionManagementServerService { private _localExtensionManagementServer: IExtensionManagementServer = { extensionManagementService: instantiationService.get(IExtensionManagementService), label: 'local', authority: 'vscode-local' }; constructor() { - super(instantiationService.get(ISharedProcessService), instantiationService.get(IRemoteAgentService), instantiationService.get(IExtensionGalleryService), instantiationService.get(ILogService)); + super(instantiationService.get(ISharedProcessService), instantiationService.get(IRemoteAgentService), instantiationService.get(IExtensionGalleryService), instantiationService.get(IConfigurationService), instantiationService.get(IProductService), instantiationService.get(ILogService)); } get localExtensionManagementServer(): IExtensionManagementServer { return this._localExtensionManagementServer; } set localExtensionManagementServer(server: IExtensionManagementServer) { } diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionManagementServerService.ts b/src/vs/workbench/services/extensions/electron-browser/extensionManagementServerService.ts index b574fa9d9af..611ab9aec95 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionManagementServerService.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionManagementServerService.ts @@ -14,6 +14,9 @@ import { IChannel } from 'vs/base/parts/ipc/common/ipc'; import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ILogService } from 'vs/platform/log/common/log'; +import { RemoteExtensionManagementChannelClient } from 'vs/workbench/services/extensions/electron-browser/remoteExtensionManagementIpc'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IProductService } from 'vs/platform/product/common/product'; const localExtensionManagementServerAuthority: string = 'vscode-local'; @@ -28,14 +31,16 @@ export class ExtensionManagementServerService implements IExtensionManagementSer @ISharedProcessService sharedProcessService: ISharedProcessService, @IRemoteAgentService remoteAgentService: IRemoteAgentService, @IExtensionGalleryService galleryService: IExtensionGalleryService, + @IConfigurationService configurationService: IConfigurationService, + @IProductService productService: IProductService, @ILogService logService: ILogService ) { - const localExtensionManagementService = new ExtensionManagementChannelClient(sharedProcessService.getChannel('extensions'), false, galleryService, logService); + const localExtensionManagementService = new ExtensionManagementChannelClient(sharedProcessService.getChannel('extensions')); this.localExtensionManagementServer = { extensionManagementService: localExtensionManagementService, authority: localExtensionManagementServerAuthority, label: localize('local', "Local") }; const remoteAgentConnection = remoteAgentService.getConnection(); if (remoteAgentConnection) { - const extensionManagementService = new ExtensionManagementChannelClient(remoteAgentConnection.getChannel('extensions'), true, galleryService, logService); + const extensionManagementService = new RemoteExtensionManagementChannelClient(remoteAgentConnection.getChannel('extensions'), this.localExtensionManagementServer.extensionManagementService, galleryService, logService, configurationService, productService); this.remoteExtensionManagementServer = { authority: remoteAgentConnection.remoteAuthority, extensionManagementService, label: localize('remote', "Remote") }; } } diff --git a/src/vs/workbench/services/extensions/electron-browser/remoteExtensionManagementIpc.ts b/src/vs/workbench/services/extensions/electron-browser/remoteExtensionManagementIpc.ts new file mode 100644 index 00000000000..0879eb39178 --- /dev/null +++ b/src/vs/workbench/services/extensions/electron-browser/remoteExtensionManagementIpc.ts @@ -0,0 +1,140 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IChannel } from 'vs/base/parts/ipc/common/ipc'; +import { IExtensionManagementService, ILocalExtension, IGalleryExtension, IExtensionGalleryService, InstallOperation } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { URI } from 'vs/base/common/uri'; +import { ExtensionType, IExtensionManifest } from 'vs/platform/extensions/common/extensions'; +import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; +import { ILogService } from 'vs/platform/log/common/log'; +import { toErrorMessage } from 'vs/base/common/errorMessage'; +import { isUIExtension } from 'vs/workbench/services/extensions/common/extensionsUtil'; +import { isNonEmptyArray } from 'vs/base/common/arrays'; +import { values } from 'vs/base/common/map'; +import { CancellationToken } from 'vs/base/common/cancellation'; +import { localize } from 'vs/nls'; +import { IProductService } from 'vs/platform/product/common/product'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { ExtensionManagementChannelClient } from 'vs/platform/extensionManagement/node/extensionManagementIpc'; + +export class RemoteExtensionManagementChannelClient extends ExtensionManagementChannelClient { + + _serviceBrand: any; + + constructor( + channel: IChannel, + private readonly localExtensionManagementService: IExtensionManagementService, + private readonly galleryService: IExtensionGalleryService, + private readonly logService: ILogService, + private readonly configurationService: IConfigurationService, + private readonly productService: IProductService + ) { + super(channel); + } + + async install(vsix: URI): Promise { + const local = await super.install(vsix); + await this.installUIDependenciesAndPackedExtensions(local); + return local; + } + + async installFromGallery(extension: IGalleryExtension): Promise { + const local = await this.doInstallFromGallery(extension); + await this.installUIDependenciesAndPackedExtensions(local); + return local; + } + + private async doInstallFromGallery(extension: IGalleryExtension): Promise { + try { + const local = await super.installFromGallery(extension); + return local; + } catch (error) { + try { + this.logService.error(`Error while installing '${extension.identifier.id}' extension in the remote server.`, toErrorMessage(error)); + this.logService.info(`Trying to download '${extension.identifier.id}' extension locally and install`); + const local = await this.downloadCompatibleAndInstall(extension); + this.logService.info(`Successfully installed '${extension.identifier.id}' extension`); + return local; + } catch (e) { + this.logService.error(e); + throw error; + } + } + } + + private async downloadCompatibleAndInstall(extension: IGalleryExtension): Promise { + const installed = await this.getInstalled(ExtensionType.User); + const compatible = await this.galleryService.getCompatibleExtension(extension); + if (!compatible) { + return Promise.reject(new Error(localize('incompatible', "Unable to install extension '{0}' as it is not compatible with VS Code '{1}'.", extension.identifier.id, this.productService.version))); + } + const local = await this.downloadAndInstall(extension, installed); + const workspaceExtensions = await this.getAllWorkspaceDependenciesAndPackedExtensions(local.manifest, CancellationToken.None); + await Promise.all(workspaceExtensions.map(e => this.downloadAndInstall(e, installed))); + return local; + } + + private async downloadAndInstall(extension: IGalleryExtension, installed: ILocalExtension[]): Promise { + const location = await this.galleryService.download(extension, installed.filter(i => areSameExtensions(i.identifier, extension.identifier))[0] ? InstallOperation.Update : InstallOperation.Install); + return super.install(URI.file(location)); + } + + private async installUIDependenciesAndPackedExtensions(local: ILocalExtension): Promise { + const uiExtensions = await this.getAllUIDependenciesAndPackedExtensions(local.manifest, CancellationToken.None); + const installed = await this.localExtensionManagementService.getInstalled(); + const toInstall = uiExtensions.filter(e => installed.every(i => !areSameExtensions(i.identifier, e.identifier))); + await Promise.all(toInstall.map(d => this.localExtensionManagementService.installFromGallery(d))); + } + + private async getAllUIDependenciesAndPackedExtensions(manifest: IExtensionManifest, token: CancellationToken): Promise { + const result = new Map(); + const extensions = [...(manifest.extensionPack || []), ...(manifest.extensionDependencies || [])]; + await this.getDependenciesAndPackedExtensionsRecursively(extensions, result, true, token); + return values(result); + } + + private async getAllWorkspaceDependenciesAndPackedExtensions(manifest: IExtensionManifest, token: CancellationToken): Promise { + const result = new Map(); + const extensions = [...(manifest.extensionPack || []), ...(manifest.extensionDependencies || [])]; + await this.getDependenciesAndPackedExtensionsRecursively(extensions, result, false, token); + return values(result); + } + + private async getDependenciesAndPackedExtensionsRecursively(toGet: string[], result: Map, uiExtension: boolean, token: CancellationToken): Promise { + if (toGet.length === 0) { + return Promise.resolve(); + } + + const extensions = (await this.galleryService.query({ names: toGet, pageSize: toGet.length }, token)).firstPage; + const manifests = await Promise.all(extensions.map(e => this.galleryService.getManifest(e, token))); + const extensionsManifests: IExtensionManifest[] = []; + for (let idx = 0; idx < extensions.length; idx++) { + const extension = extensions[idx]; + const manifest = manifests[idx]; + if (manifest && isUIExtension(manifest, this.productService, this.configurationService) === uiExtension) { + result.set(extension.identifier.id.toLowerCase(), extension); + extensionsManifests.push(manifest); + } + } + toGet = []; + for (const extensionManifest of extensionsManifests) { + if (isNonEmptyArray(extensionManifest.extensionDependencies)) { + for (const id of extensionManifest.extensionDependencies) { + if (!result.has(id.toLowerCase())) { + toGet.push(id); + } + } + } + if (isNonEmptyArray(extensionManifest.extensionPack)) { + for (const id of extensionManifest.extensionPack) { + if (!result.has(id.toLowerCase())) { + toGet.push(id); + } + } + } + } + return this.getDependenciesAndPackedExtensionsRecursively(toGet, result, uiExtension, token); + } +} \ No newline at end of file diff --git a/src/vs/workbench/services/extensions/node/multiExtensionManagement.ts b/src/vs/workbench/services/extensions/node/multiExtensionManagement.ts index 1425161d0d7..1760b4d5fc3 100644 --- a/src/vs/workbench/services/extensions/node/multiExtensionManagement.ts +++ b/src/vs/workbench/services/extensions/node/multiExtensionManagement.ts @@ -8,7 +8,7 @@ import { IExtensionManagementService, ILocalExtension, IGalleryExtension, InstallExtensionEvent, DidInstallExtensionEvent, IExtensionIdentifier, DidUninstallExtensionEvent, IReportedExtension, IGalleryMetadata, IExtensionManagementServerService, IExtensionManagementServer, IExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { ExtensionType, IExtensionManifest, isLanguagePackExtension } from 'vs/platform/extensions/common/extensions'; +import { ExtensionType, isLanguagePackExtension } from 'vs/platform/extensions/common/extensions'; import { URI } from 'vs/base/common/uri'; import { Disposable } from 'vs/base/common/lifecycle'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -18,8 +18,6 @@ import { areSameExtensions } from 'vs/platform/extensionManagement/common/extens import { localize } from 'vs/nls'; import { isUIExtension } from 'vs/workbench/services/extensions/common/extensionsUtil'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { isNonEmptyArray } from 'vs/base/common/arrays'; -import { values } from 'vs/base/common/map'; import { IProductService } from 'vs/platform/product/common/product'; export class MultiExtensionManagementService extends Disposable implements IExtensionManagementService { @@ -147,10 +145,7 @@ export class MultiExtensionManagementService extends Disposable implements IExte return this.extensionManagementServerService.localExtensionManagementServer.extensionManagementService.install(vsix); } // Install only on remote server - const promise = this.extensionManagementServerService.remoteExtensionManagementServer.extensionManagementService.install(vsix); - // Install UI Dependencies on local server - await this.installUIDependenciesAndPackedExtensions(manifest); - return promise; + return this.extensionManagementServerService.remoteExtensionManagementServer.extensionManagementService.install(vsix); } return this.extensionManagementServerService.localExtensionManagementServer.extensionManagementService.install(vsix); } @@ -168,10 +163,7 @@ export class MultiExtensionManagementService extends Disposable implements IExte return this.extensionManagementServerService.localExtensionManagementServer.extensionManagementService.installFromGallery(gallery); } // Install only on remote server - const promise = this.extensionManagementServerService.remoteExtensionManagementServer.extensionManagementService.installFromGallery(gallery); - // Install UI dependencies and packed extensions on local server - await this.installUIDependenciesAndPackedExtensions(manifest); - return promise; + return this.extensionManagementServerService.remoteExtensionManagementServer.extensionManagementService.installFromGallery(gallery); } else { return Promise.reject(localize('Manifest is not found', "Installing Extension {0} failed: Manifest is not found.", gallery.displayName || gallery.name)); } @@ -179,13 +171,6 @@ export class MultiExtensionManagementService extends Disposable implements IExte return this.extensionManagementServerService.localExtensionManagementServer.extensionManagementService.installFromGallery(gallery); } - private async installUIDependenciesAndPackedExtensions(manifest: IExtensionManifest): Promise { - const uiExtensions = await this.getAllUIDependenciesAndPackedExtensions(manifest, CancellationToken.None); - const installed = await this.extensionManagementServerService.localExtensionManagementServer.extensionManagementService.getInstalled(); - const toInstall = uiExtensions.filter(e => installed.every(i => !areSameExtensions(i.identifier, e.identifier))); - await Promise.all(toInstall.map(d => this.extensionManagementServerService.localExtensionManagementServer.extensionManagementService.installFromGallery(d))); - } - getExtensionsReport(): Promise { return this.extensionManagementServerService.localExtensionManagementServer.extensionManagementService.getExtensionsReport(); } @@ -193,49 +178,6 @@ export class MultiExtensionManagementService extends Disposable implements IExte private getServer(extension: ILocalExtension): IExtensionManagementServer | null { return this.extensionManagementServerService.getExtensionManagementServer(extension.location); } - - private async getAllUIDependenciesAndPackedExtensions(manifest: IExtensionManifest, token: CancellationToken): Promise { - const result = new Map(); - const extensions = [...(manifest.extensionPack || []), ...(manifest.extensionDependencies || [])]; - await this.getAllUIDependenciesAndPackedExtensionsRecursively(extensions, result, token); - return values(result); - } - - private async getAllUIDependenciesAndPackedExtensionsRecursively(toGet: string[], result: Map, token: CancellationToken): Promise { - if (toGet.length === 0) { - return Promise.resolve(); - } - - const extensions = (await this.extensionGalleryService.query({ names: toGet, pageSize: toGet.length }, token)).firstPage; - const manifests = await Promise.all(extensions.map(e => this.extensionGalleryService.getManifest(e, token))); - const uiExtensionsManifests: IExtensionManifest[] = []; - for (let idx = 0; idx < extensions.length; idx++) { - const extension = extensions[idx]; - const manifest = manifests[idx]; - if (manifest && isUIExtension(manifest, this.productService, this.configurationService)) { - result.set(extension.identifier.id.toLowerCase(), extension); - uiExtensionsManifests.push(manifest); - } - } - toGet = []; - for (const uiExtensionManifest of uiExtensionsManifests) { - if (isNonEmptyArray(uiExtensionManifest.extensionDependencies)) { - for (const id of uiExtensionManifest.extensionDependencies) { - if (!result.has(id.toLowerCase())) { - toGet.push(id); - } - } - } - if (isNonEmptyArray(uiExtensionManifest.extensionPack)) { - for (const id of uiExtensionManifest.extensionPack) { - if (!result.has(id.toLowerCase())) { - toGet.push(id); - } - } - } - } - return this.getAllUIDependenciesAndPackedExtensionsRecursively(toGet, result, token); - } } registerSingleton(IExtensionManagementService, MultiExtensionManagementService); \ No newline at end of file From 3ca3689ae7fae340e8db3f900fa392a483313353 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Mon, 24 Jun 2019 14:20:24 -0700 Subject: [PATCH 0611/1449] Updat peek error icons --- .../media/chevron-next-dark.svg | 3 +++ .../media/chevron-next-light.svg | 3 +++ .../media/chevron-previous-dark.svg | 4 +++ .../media/chevron-previous-light.svg | 4 +++ .../referenceSearch/media/close-dark.svg | 4 +++ .../referenceSearch/media/close-light.svg | 4 +++ .../referenceSearch/media/peekViewWidget.css | 25 +++++++------------ 7 files changed, 31 insertions(+), 16 deletions(-) create mode 100644 src/vs/editor/contrib/referenceSearch/media/chevron-next-dark.svg create mode 100644 src/vs/editor/contrib/referenceSearch/media/chevron-next-light.svg create mode 100644 src/vs/editor/contrib/referenceSearch/media/chevron-previous-dark.svg create mode 100644 src/vs/editor/contrib/referenceSearch/media/chevron-previous-light.svg create mode 100644 src/vs/editor/contrib/referenceSearch/media/close-dark.svg create mode 100644 src/vs/editor/contrib/referenceSearch/media/close-light.svg diff --git a/src/vs/editor/contrib/referenceSearch/media/chevron-next-dark.svg b/src/vs/editor/contrib/referenceSearch/media/chevron-next-dark.svg new file mode 100644 index 00000000000..455532ddb7a --- /dev/null +++ b/src/vs/editor/contrib/referenceSearch/media/chevron-next-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/referenceSearch/media/chevron-next-light.svg b/src/vs/editor/contrib/referenceSearch/media/chevron-next-light.svg new file mode 100644 index 00000000000..a443086f358 --- /dev/null +++ b/src/vs/editor/contrib/referenceSearch/media/chevron-next-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/referenceSearch/media/chevron-previous-dark.svg b/src/vs/editor/contrib/referenceSearch/media/chevron-previous-dark.svg new file mode 100644 index 00000000000..fef5fd0ed43 --- /dev/null +++ b/src/vs/editor/contrib/referenceSearch/media/chevron-previous-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/referenceSearch/media/chevron-previous-light.svg b/src/vs/editor/contrib/referenceSearch/media/chevron-previous-light.svg new file mode 100644 index 00000000000..be113938535 --- /dev/null +++ b/src/vs/editor/contrib/referenceSearch/media/chevron-previous-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/referenceSearch/media/close-dark.svg b/src/vs/editor/contrib/referenceSearch/media/close-dark.svg new file mode 100644 index 00000000000..e0475f7b85a --- /dev/null +++ b/src/vs/editor/contrib/referenceSearch/media/close-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/referenceSearch/media/close-light.svg b/src/vs/editor/contrib/referenceSearch/media/close-light.svg new file mode 100644 index 00000000000..3bd44674699 --- /dev/null +++ b/src/vs/editor/contrib/referenceSearch/media/close-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/referenceSearch/media/peekViewWidget.css b/src/vs/editor/contrib/referenceSearch/media/peekViewWidget.css index ac669d39341..8b5b64413fc 100644 --- a/src/vs/editor/contrib/referenceSearch/media/peekViewWidget.css +++ b/src/vs/editor/contrib/referenceSearch/media/peekViewWidget.css @@ -57,7 +57,7 @@ } .monaco-editor .peekview-widget .head .peekview-actions .action-label.icon.close-peekview-action { - background: url('close.svg') center center no-repeat; + background: url('close-light.svg') center center no-repeat; } .monaco-editor .peekview-widget > .body { @@ -70,30 +70,23 @@ .monaco-editor.hc-black .peekview-widget .head .peekview-actions .action-label.icon.close-peekview-action, .monaco-editor.vs-dark .peekview-widget .head .peekview-actions .action-label.icon.close-peekview-action { - background: url('close-inverse.svg') center center no-repeat; + background: url('close-dark.svg') center center no-repeat; } .monaco-editor .peekview-widget .peekview-actions .icon.chevron-up { - background: url('chevron-up-inverse.svg') center center no-repeat; -} - -.vs-dark .monaco-editor .peekview-widget .peekview-actions .icon.chevron-up { - background: url('chevron-up.svg') center center no-repeat; + background: url('chevron-previous-light.svg') center center no-repeat; } +.vs-dark .monaco-editor .peekview-widget .peekview-actions .icon.chevron-up, .hc-black .monaco-editor .peekview-widget .peekview-actions .icon.chevron-up { - background: url('chevron-up-inverse-hc.svg') center center no-repeat; + background: url('chevron-previous-dark.svg') center center no-repeat; } .monaco-editor .peekview-widget .peekview-actions .icon.chevron-down { - background: url('chevron-down-inverse.svg') center center no-repeat; -} - -.vs-dark .monaco-editor .peekview-widget .peekview-actions .icon.chevron-down { - background: url('chevron-down.svg') center center no-repeat; + background: url('chevron-next-light.svg') center center no-repeat; } +.vs-dark .monaco-editor .peekview-widget .peekview-actions .icon.chevron-down, .hc-black .monaco-editor .peekview-widget .peekview-actions .icon.chevron-down { - background: url('chevron-down-hc.svg') center center no-repeat; -} - + background: url('chevron-next-dark.svg') center center no-repeat; +} \ No newline at end of file From 1bbd3e6659803c233dfac2a749ecd636ed0ddcfe Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 24 Jun 2019 14:22:22 -0700 Subject: [PATCH 0612/1449] Fix default shell selector outside of Windows Fixes #76040 --- .../contrib/terminal/common/terminalService.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/common/terminalService.ts b/src/vs/workbench/contrib/terminal/common/terminalService.ts index 1f8e90b6407..58cca1cbc6e 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalService.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalService.ts @@ -17,7 +17,7 @@ import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { IFileService } from 'vs/platform/files/common/files'; import { escapeNonWindowsPath } from 'vs/workbench/contrib/terminal/common/terminalEnvironment'; -import { isWindows } from 'vs/base/common/platform'; +import { isWindows, isMacintosh, OperatingSystem } from 'vs/base/common/platform'; import { basename } from 'vs/base/common/path'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { timeout } from 'vs/base/common/async'; @@ -549,7 +549,14 @@ export abstract class TerminalService implements ITerminalService { return undefined; } const shell = value.description; - await this._configurationService.updateValue('terminal.integrated.shell.windows', shell, ConfigurationTarget.USER).then(() => shell); + const env = await this._remoteAgentService.getEnvironment(); + let platformKey: string; + if (env) { + platformKey = env.os === OperatingSystem.Windows ? 'windows' : (OperatingSystem.Macintosh ? 'osx' : 'linux'); + } else { + platformKey = isWindows ? 'windows' : (isMacintosh ? 'osx' : 'linux'); + } + await this._configurationService.updateValue(`terminal.integrated.shell.${platformKey}`, shell, ConfigurationTarget.USER).then(() => shell); return Promise.resolve(); }); }); From ebd724546c1ba82ad0599af391fe23dde5466092 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Mon, 24 Jun 2019 14:41:03 -0700 Subject: [PATCH 0613/1449] Update find widget icons --- src/vs/editor/contrib/find/findWidget.css | 32 +++++++++---------- .../contrib/find/images/chevron-next-dark.svg | 3 ++ .../find/images/chevron-next-light.svg | 3 ++ .../find/images/chevron-previous-dark.svg | 4 +++ .../find/images/chevron-previous-light.svg | 4 +++ .../editor/contrib/find/images/close-dark.svg | 5 ++- .../contrib/find/images/close-light.svg | 4 +++ .../find/images/find-selection-dark.svg | 3 ++ .../find/images/find-selection-light.svg | 3 ++ .../contrib/find/images/replace-all-dark.svg | 11 +++++++ .../contrib/find/images/replace-all-light.svg | 11 +++++++ .../contrib/find/images/replace-dark.svg | 6 ++++ .../contrib/find/images/replace-light.svg | 6 ++++ .../find/images/tree-collapsed-dark.svg | 3 ++ .../find/images/tree-collapsed-light.svg | 3 ++ .../find/images/tree-expanded-dark.svg | 3 ++ .../find/images/tree-expanded-light.svg | 3 ++ 17 files changed, 90 insertions(+), 17 deletions(-) create mode 100644 src/vs/editor/contrib/find/images/chevron-next-dark.svg create mode 100644 src/vs/editor/contrib/find/images/chevron-next-light.svg create mode 100644 src/vs/editor/contrib/find/images/chevron-previous-dark.svg create mode 100644 src/vs/editor/contrib/find/images/chevron-previous-light.svg create mode 100644 src/vs/editor/contrib/find/images/close-light.svg create mode 100644 src/vs/editor/contrib/find/images/find-selection-dark.svg create mode 100644 src/vs/editor/contrib/find/images/find-selection-light.svg create mode 100644 src/vs/editor/contrib/find/images/replace-all-dark.svg create mode 100644 src/vs/editor/contrib/find/images/replace-all-light.svg create mode 100644 src/vs/editor/contrib/find/images/replace-dark.svg create mode 100644 src/vs/editor/contrib/find/images/replace-light.svg create mode 100644 src/vs/editor/contrib/find/images/tree-collapsed-dark.svg create mode 100644 src/vs/editor/contrib/find/images/tree-collapsed-light.svg create mode 100644 src/vs/editor/contrib/find/images/tree-expanded-dark.svg create mode 100644 src/vs/editor/contrib/find/images/tree-expanded-light.svg diff --git a/src/vs/editor/contrib/find/findWidget.css b/src/vs/editor/contrib/find/findWidget.css index 70198672fee..0f2a7720c67 100644 --- a/src/vs/editor/contrib/find/findWidget.css +++ b/src/vs/editor/contrib/find/findWidget.css @@ -151,11 +151,11 @@ } .monaco-editor .find-widget .previous { - background-image: url('images/previous.svg'); + background-image: url('images/chevron-previous-light.svg'); } .monaco-editor .find-widget .next { - background-image: url('images/next.svg'); + background-image: url('images/chevron-next-light.svg'); } .monaco-editor .find-widget .disabled { @@ -175,8 +175,8 @@ content: ''; display: inline-block; background-repeat: no-repeat; - background-position: 0 0; - background-image: url('images/cancelSelectionFind.svg'); + background-position: center; + background-image: url('images/find-selection-light.svg'); width: 20px; height: 20px; border: none; @@ -200,23 +200,23 @@ } .monaco-editor .find-widget .close-fw { - background-image: url('images/close.svg'); + background-image: url('images/close-light.svg'); } .monaco-editor .find-widget .expand { - background-image: url('images/expando-expanded.svg'); + background-image: url('images/tree-expanded-light.svg'); } .monaco-editor .find-widget .collapse { - background-image: url('images/expando-collapsed.svg'); + background-image: url('images/tree-collapsed-light.svg'); } .monaco-editor .find-widget .replace { - background-image: url('images/replace.svg'); + background-image: url('images/replace-light.svg'); } .monaco-editor .find-widget .replace-all { - background-image: url('images/replace-all.svg'); + background-image: url('images/replace-all-light.svg'); } .monaco-editor .find-widget > .replace-part { @@ -272,17 +272,17 @@ .monaco-editor.hc-black .find-widget .previous, .monaco-editor.vs-dark .find-widget .previous { - background-image: url('images/previous-inverse.svg'); + background-image: url('images/chevron-previous-dark.svg'); } .monaco-editor.hc-black .find-widget .next, .monaco-editor.vs-dark .find-widget .next { - background-image: url('images/next-inverse.svg'); + background-image: url('images/chevron-next-dark.svg'); } .monaco-editor.hc-black .find-widget .monaco-checkbox .label, .monaco-editor.vs-dark .find-widget .monaco-checkbox .label { - background-image: url('images/cancelSelectionFind-inverse.svg'); + background-image: url('images/find-selection-dark.svg'); } .monaco-editor.vs-dark .find-widget .monaco-checkbox .checkbox:not(:disabled):hover:before + .label { @@ -300,22 +300,22 @@ .monaco-editor.hc-black .find-widget .replace, .monaco-editor.vs-dark .find-widget .replace { - background-image: url('images/replace-inverse.svg'); + background-image: url('images/replace-dark.svg'); } .monaco-editor.hc-black .find-widget .replace-all, .monaco-editor.vs-dark .find-widget .replace-all { - background-image: url('images/replace-all-inverse.svg'); + background-image: url('images/replace-all-dark.svg'); } .monaco-editor.hc-black .find-widget .expand, .monaco-editor.vs-dark .find-widget .expand { - background-image: url('images/expando-expanded-dark.svg'); + background-image: url('images/tree-expanded-dark.svg'); } .monaco-editor.hc-black .find-widget .collapse, .monaco-editor.vs-dark .find-widget .collapse { - background-image: url('images/expando-collapsed-dark.svg'); + background-image: url('images/tree-collapsed-dark.svg'); } .monaco-editor.hc-black .find-widget .button:not(.disabled):hover, diff --git a/src/vs/editor/contrib/find/images/chevron-next-dark.svg b/src/vs/editor/contrib/find/images/chevron-next-dark.svg new file mode 100644 index 00000000000..dbe70d742de --- /dev/null +++ b/src/vs/editor/contrib/find/images/chevron-next-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/find/images/chevron-next-light.svg b/src/vs/editor/contrib/find/images/chevron-next-light.svg new file mode 100644 index 00000000000..ec824f41cc0 --- /dev/null +++ b/src/vs/editor/contrib/find/images/chevron-next-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/find/images/chevron-previous-dark.svg b/src/vs/editor/contrib/find/images/chevron-previous-dark.svg new file mode 100644 index 00000000000..5f93ad2d719 --- /dev/null +++ b/src/vs/editor/contrib/find/images/chevron-previous-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/find/images/chevron-previous-light.svg b/src/vs/editor/contrib/find/images/chevron-previous-light.svg new file mode 100644 index 00000000000..b160b014948 --- /dev/null +++ b/src/vs/editor/contrib/find/images/chevron-previous-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/find/images/close-dark.svg b/src/vs/editor/contrib/find/images/close-dark.svg index 751e89b3b02..e0475f7b85a 100644 --- a/src/vs/editor/contrib/find/images/close-dark.svg +++ b/src/vs/editor/contrib/find/images/close-dark.svg @@ -1 +1,4 @@ - \ No newline at end of file + + + + diff --git a/src/vs/editor/contrib/find/images/close-light.svg b/src/vs/editor/contrib/find/images/close-light.svg new file mode 100644 index 00000000000..3bd44674699 --- /dev/null +++ b/src/vs/editor/contrib/find/images/close-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/editor/contrib/find/images/find-selection-dark.svg b/src/vs/editor/contrib/find/images/find-selection-dark.svg new file mode 100644 index 00000000000..6fc07d81a55 --- /dev/null +++ b/src/vs/editor/contrib/find/images/find-selection-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/find/images/find-selection-light.svg b/src/vs/editor/contrib/find/images/find-selection-light.svg new file mode 100644 index 00000000000..3608b15d29e --- /dev/null +++ b/src/vs/editor/contrib/find/images/find-selection-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/find/images/replace-all-dark.svg b/src/vs/editor/contrib/find/images/replace-all-dark.svg new file mode 100644 index 00000000000..5bcc9b7919c --- /dev/null +++ b/src/vs/editor/contrib/find/images/replace-all-dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/vs/editor/contrib/find/images/replace-all-light.svg b/src/vs/editor/contrib/find/images/replace-all-light.svg new file mode 100644 index 00000000000..76e27fa4ad8 --- /dev/null +++ b/src/vs/editor/contrib/find/images/replace-all-light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/vs/editor/contrib/find/images/replace-dark.svg b/src/vs/editor/contrib/find/images/replace-dark.svg new file mode 100644 index 00000000000..ecd7d60c2a8 --- /dev/null +++ b/src/vs/editor/contrib/find/images/replace-dark.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/vs/editor/contrib/find/images/replace-light.svg b/src/vs/editor/contrib/find/images/replace-light.svg new file mode 100644 index 00000000000..e0c6ac89315 --- /dev/null +++ b/src/vs/editor/contrib/find/images/replace-light.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/vs/editor/contrib/find/images/tree-collapsed-dark.svg b/src/vs/editor/contrib/find/images/tree-collapsed-dark.svg new file mode 100644 index 00000000000..17de497f336 --- /dev/null +++ b/src/vs/editor/contrib/find/images/tree-collapsed-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/find/images/tree-collapsed-light.svg b/src/vs/editor/contrib/find/images/tree-collapsed-light.svg new file mode 100644 index 00000000000..296499b8e5c --- /dev/null +++ b/src/vs/editor/contrib/find/images/tree-collapsed-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/find/images/tree-expanded-dark.svg b/src/vs/editor/contrib/find/images/tree-expanded-dark.svg new file mode 100644 index 00000000000..c18c081278b --- /dev/null +++ b/src/vs/editor/contrib/find/images/tree-expanded-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/contrib/find/images/tree-expanded-light.svg b/src/vs/editor/contrib/find/images/tree-expanded-light.svg new file mode 100644 index 00000000000..324b08e461b --- /dev/null +++ b/src/vs/editor/contrib/find/images/tree-expanded-light.svg @@ -0,0 +1,3 @@ + + + From 6e84eb00ddd125cacb71f798504f0fe4e40e4cbd Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Mon, 24 Jun 2019 14:50:07 -0700 Subject: [PATCH 0614/1449] Update editor icons --- .../browser/media/edit-json-dark.svg | 5 ++++ .../browser/media/edit-json-inverse.svg | 3 --- .../browser/media/edit-json-light.svg | 5 ++++ .../preferences/browser/media/edit-json.svg | 3 --- .../browser/media/preferences-editor-dark.svg | 4 ++++ .../media/preferences-editor-inverse.svg | 4 ---- .../media/preferences-editor-light.svg | 4 ++++ .../browser/media/preferences-editor.svg | 4 ---- .../browser/preferences.contribution.ts | 24 +++++++++---------- 9 files changed, 30 insertions(+), 26 deletions(-) create mode 100644 src/vs/workbench/contrib/preferences/browser/media/edit-json-dark.svg delete mode 100644 src/vs/workbench/contrib/preferences/browser/media/edit-json-inverse.svg create mode 100644 src/vs/workbench/contrib/preferences/browser/media/edit-json-light.svg delete mode 100644 src/vs/workbench/contrib/preferences/browser/media/edit-json.svg create mode 100644 src/vs/workbench/contrib/preferences/browser/media/preferences-editor-dark.svg delete mode 100644 src/vs/workbench/contrib/preferences/browser/media/preferences-editor-inverse.svg create mode 100644 src/vs/workbench/contrib/preferences/browser/media/preferences-editor-light.svg delete mode 100644 src/vs/workbench/contrib/preferences/browser/media/preferences-editor.svg diff --git a/src/vs/workbench/contrib/preferences/browser/media/edit-json-dark.svg b/src/vs/workbench/contrib/preferences/browser/media/edit-json-dark.svg new file mode 100644 index 00000000000..3f2e2a05e19 --- /dev/null +++ b/src/vs/workbench/contrib/preferences/browser/media/edit-json-dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/edit-json-inverse.svg b/src/vs/workbench/contrib/preferences/browser/media/edit-json-inverse.svg deleted file mode 100644 index 6dc96a9e122..00000000000 --- a/src/vs/workbench/contrib/preferences/browser/media/edit-json-inverse.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/contrib/preferences/browser/media/edit-json-light.svg b/src/vs/workbench/contrib/preferences/browser/media/edit-json-light.svg new file mode 100644 index 00000000000..e154f4c4ac1 --- /dev/null +++ b/src/vs/workbench/contrib/preferences/browser/media/edit-json-light.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/edit-json.svg b/src/vs/workbench/contrib/preferences/browser/media/edit-json.svg deleted file mode 100644 index 747e2706bc0..00000000000 --- a/src/vs/workbench/contrib/preferences/browser/media/edit-json.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/contrib/preferences/browser/media/preferences-editor-dark.svg b/src/vs/workbench/contrib/preferences/browser/media/preferences-editor-dark.svg new file mode 100644 index 00000000000..7030885c039 --- /dev/null +++ b/src/vs/workbench/contrib/preferences/browser/media/preferences-editor-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/preferences-editor-inverse.svg b/src/vs/workbench/contrib/preferences/browser/media/preferences-editor-inverse.svg deleted file mode 100644 index 817e57f8fe1..00000000000 --- a/src/vs/workbench/contrib/preferences/browser/media/preferences-editor-inverse.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/contrib/preferences/browser/media/preferences-editor-light.svg b/src/vs/workbench/contrib/preferences/browser/media/preferences-editor-light.svg new file mode 100644 index 00000000000..017eabca6d2 --- /dev/null +++ b/src/vs/workbench/contrib/preferences/browser/media/preferences-editor-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/preferences-editor.svg b/src/vs/workbench/contrib/preferences/browser/media/preferences-editor.svg deleted file mode 100644 index 300562f07d9..00000000000 --- a/src/vs/workbench/contrib/preferences/browser/media/preferences-editor.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts b/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts index 20c9985f632..00670dcbdb1 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts @@ -381,8 +381,8 @@ class PreferencesActionsContribution extends Disposable implements IWorkbenchCon id: OpenGlobalKeybindingsAction.ID, title: OpenGlobalKeybindingsAction.LABEL, iconLocation: { - light: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/browser/media/preferences-editor.svg`)), - dark: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/browser/media/preferences-editor-inverse.svg`)) + light: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/browser/media/preferences-editor-light.svg`)), + dark: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/browser/media/preferences-editor-dark.svg`)) } }, when: ResourceContextKey.Resource.isEqualTo(environmentService.keybindingsResource.toString()), @@ -397,8 +397,8 @@ class PreferencesActionsContribution extends Disposable implements IWorkbenchCon id: commandId, title: OpenSettings2Action.LABEL, iconLocation: { - light: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/browser/media/preferences-editor.svg`)), - dark: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/browser/media/preferences-editor-inverse.svg`)) + light: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/browser/media/preferences-editor-light.svg`)), + dark: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/browser/media/preferences-editor-dark.svg`)) } }, when: ResourceContextKey.Resource.isEqualTo(environmentService.settingsResource.toString()), @@ -438,8 +438,8 @@ class PreferencesActionsContribution extends Disposable implements IWorkbenchCon id: commandId, title: OpenSettings2Action.LABEL, iconLocation: { - light: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/browser/media/preferences-editor.svg`)), - dark: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/browser/media/preferences-editor-inverse.svg`)) + light: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/browser/media/preferences-editor-light.svg`)), + dark: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/browser/media/preferences-editor-dark.svg`)) } }, when: ContextKeyExpr.and(ResourceContextKey.Resource.isEqualTo(this.preferencesService.workspaceSettingsResource!.toString()), WorkbenchStateContext.isEqualTo('workspace')), @@ -466,8 +466,8 @@ class PreferencesActionsContribution extends Disposable implements IWorkbenchCon id: commandId, title: OpenSettings2Action.LABEL, iconLocation: { - light: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/browser/media/preferences-editor.svg`)), - dark: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/browser/media/preferences-editor-inverse.svg`)) + light: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/browser/media/preferences-editor-light.svg`)), + dark: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/browser/media/preferences-editor-dark.svg`)) } }, when: ContextKeyExpr.and(ResourceContextKey.Resource.isEqualTo(this.preferencesService.getFolderSettingsResource(folder.uri)!.toString())), @@ -533,8 +533,8 @@ MenuRegistry.appendMenuItem(MenuId.EditorTitle, { id: OpenGlobalKeybindingsFileAction.ID, title: OpenGlobalKeybindingsFileAction.LABEL, iconLocation: { - light: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/browser/media/edit-json.svg`)), - dark: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/browser/media/edit-json-inverse.svg`)) + light: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/browser/media/edit-json-light.svg`)), + dark: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/browser/media/edit-json-dark.svg`)) } }, when: ContextKeyExpr.and(CONTEXT_KEYBINDINGS_EDITOR), @@ -817,8 +817,8 @@ MenuRegistry.appendMenuItem(MenuId.EditorTitle, { id: SETTINGS_EDITOR_COMMAND_SWITCH_TO_JSON, title: nls.localize('openSettingsJson', "Open Settings (JSON)"), iconLocation: { - dark: URI.parse(require.toUrl('vs/workbench/contrib/preferences/browser/media/edit-json-inverse.svg')), - light: URI.parse(require.toUrl('vs/workbench/contrib/preferences/browser/media/edit-json.svg')) + dark: URI.parse(require.toUrl('vs/workbench/contrib/preferences/browser/media/edit-json-dark.svg')), + light: URI.parse(require.toUrl('vs/workbench/contrib/preferences/browser/media/edit-json-light.svg')) } }, group: 'navigation', From 8701fade6a8af87d9a271e160653a8e8bd6de512 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Mon, 24 Jun 2019 14:54:41 -0700 Subject: [PATCH 0615/1449] Update close buttons --- .../contrib/files/browser/media/action-close-dark.svg | 5 ++++- .../contrib/files/browser/media/action-close-light.svg | 4 ++++ src/vs/workbench/contrib/files/browser/media/fileactions.css | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 src/vs/workbench/contrib/files/browser/media/action-close-light.svg diff --git a/src/vs/workbench/contrib/files/browser/media/action-close-dark.svg b/src/vs/workbench/contrib/files/browser/media/action-close-dark.svg index 751e89b3b02..e0475f7b85a 100644 --- a/src/vs/workbench/contrib/files/browser/media/action-close-dark.svg +++ b/src/vs/workbench/contrib/files/browser/media/action-close-dark.svg @@ -1 +1,4 @@ - \ No newline at end of file + + + + diff --git a/src/vs/workbench/contrib/files/browser/media/action-close-light.svg b/src/vs/workbench/contrib/files/browser/media/action-close-light.svg new file mode 100644 index 00000000000..3bd44674699 --- /dev/null +++ b/src/vs/workbench/contrib/files/browser/media/action-close-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/workbench/contrib/files/browser/media/fileactions.css b/src/vs/workbench/contrib/files/browser/media/fileactions.css index 9bf17de9261..0744d21091c 100644 --- a/src/vs/workbench/contrib/files/browser/media/fileactions.css +++ b/src/vs/workbench/contrib/files/browser/media/fileactions.css @@ -117,7 +117,7 @@ } .explorer-viewlet .explorer-open-editors .close-editor-action { - background: url("action-close.svg") center center no-repeat; + background: url("action-close-light.svg") center center no-repeat; } .explorer-viewlet .explorer-open-editors .focused .monaco-list-row.selected:not(.highlighted) .close-editor-action { From 85ab838037b1283a1401a870bc79c3e3ca4cdcfe Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 24 Jun 2019 15:19:03 -0700 Subject: [PATCH 0616/1449] Add explicit win32 gheck for using user specific temp folder --- extensions/typescript-language-features/src/utils/electron.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/typescript-language-features/src/utils/electron.ts b/extensions/typescript-language-features/src/utils/electron.ts index 1f542fe07cc..ea16bae4277 100644 --- a/extensions/typescript-language-features/src/utils/electron.ts +++ b/extensions/typescript-language-features/src/utils/electron.ts @@ -14,7 +14,7 @@ const getRootTempDir = (() => { let dir: string | undefined; return () => { if (!dir) { - dir = temp.getTempFile(`vscode-typescript${process.getuid ? process.getuid() : ''}`); + dir = temp.getTempFile(`vscode-typescript${process.platform !== 'win32' && process.getuid ? process.getuid() : ''}`); } if (!fs.existsSync(dir)) { fs.mkdirSync(dir); From 8ac732d11388f60938c421d26aa9aa123e81180f Mon Sep 17 00:00:00 2001 From: Rachel Macfarlane Date: Mon, 24 Jun 2019 16:21:36 -0700 Subject: [PATCH 0617/1449] Always use settings UI when querying online services, fixes #75542 --- .../contrib/preferences/browser/preferences.contribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts b/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts index 20c9985f632..4f8fae9ac52 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts @@ -742,7 +742,7 @@ CommandsRegistry.registerCommand(SETTINGS_EDITOR_COMMAND_FILTER_ONLINE, serviceA if (control instanceof SettingsEditor2) { control.focusSearch(`@tag:usesOnlineServices`); } else { - serviceAccessor.get(IPreferencesService).openSettings(undefined, '@tag:usesOnlineServices'); + serviceAccessor.get(IPreferencesService).openSettings(false, '@tag:usesOnlineServices'); } }); From 10831237586049f51630d308eb4c85d488fa4f93 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 24 Jun 2019 16:51:11 -0700 Subject: [PATCH 0618/1449] Disable conpty in terminal when accessibility mode is on Fixes #76043 --- .../workbench/api/node/extHostTerminalService.ts | 1 + .../contrib/terminal/browser/terminalInstance.ts | 2 +- .../terminal/browser/terminalProcessManager.ts | 14 ++++++++++---- .../workbench/contrib/terminal/common/terminal.ts | 2 +- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index d0d8920c25c..d7432604d4d 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -538,6 +538,7 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { // Fork the process and listen for messages this._logService.debug(`Terminal process launching on ext host`, shellLaunchConfig, initialCwd, cols, rows, env); // TODO: Support conpty on remote, it doesn't seem to work for some reason? + // TODO: When conpty is enabled, only enable it when accessibilityMode is off const enableConpty = false; //terminalConfig.get('windowsEnableConpty') as boolean; const p = new TerminalProcess(shellLaunchConfig, initialCwd, cols, rows, env, enableConpty, this._logService); p.onProcessReady((e: { pid: number, cwd: string }) => this._proxy.$sendProcessReady(id, e.pid, e.cwd)); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index 95c3afd0445..0c0f6721e9e 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -970,7 +970,7 @@ export class TerminalInstance implements ITerminalInstance { // Create the process asynchronously to allow the terminal's container // to be created so dimensions are accurate setTimeout(() => { - this._processManager!.createProcess(this._shellLaunchConfig, this._cols, this._rows); + this._processManager!.createProcess(this._shellLaunchConfig, this._cols, this._rows, this._isScreenReaderOptimized()); }, 0); } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts index 723cbe41cd4..2f3f3600781 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts @@ -100,7 +100,8 @@ export class TerminalProcessManager implements ITerminalProcessManager { public async createProcess( shellLaunchConfig: IShellLaunchConfig, cols: number, - rows: number + rows: number, + isScreenReaderModeEnabled: boolean ): Promise { const forceExtHostProcess = (this._configHelper.config as any).extHostProcess; if (shellLaunchConfig.cwd && typeof shellLaunchConfig.cwd === 'object') { @@ -127,7 +128,7 @@ export class TerminalProcessManager implements ITerminalProcessManager { const activeWorkspaceRootUri = this._historyService.getLastActiveWorkspaceRoot(); this._process = this._instantiationService.createInstance(TerminalProcessExtHostProxy, this._terminalId, shellLaunchConfig, activeWorkspaceRootUri, cols, rows, this._configHelper); } else { - this._process = await this._launchProcess(shellLaunchConfig, cols, rows); + this._process = await this._launchProcess(shellLaunchConfig, cols, rows, isScreenReaderModeEnabled); } this.processState = ProcessState.LAUNCHING; @@ -161,7 +162,12 @@ export class TerminalProcessManager implements ITerminalProcessManager { }, LAUNCHING_DURATION); } - private async _launchProcess(shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number): Promise { + private async _launchProcess( + shellLaunchConfig: IShellLaunchConfig, + cols: number, + rows: number, + isScreenReaderModeEnabled: boolean + ): Promise { if (!shellLaunchConfig.executable) { const defaultConfig = await this._terminalInstanceService.getDefaultShellAndArgs(); shellLaunchConfig.executable = defaultConfig.shell; @@ -178,7 +184,7 @@ export class TerminalProcessManager implements ITerminalProcessManager { const baseEnv = this._configHelper.config.inheritEnv ? process.env as platform.IProcessEnvironment : await this._terminalInstanceService.getMainProcessParentEnv(); const env = terminalEnvironment.createTerminalEnvironment(shellLaunchConfig, lastActiveWorkspace, envFromConfigValue, this._configurationResolverService, isWorkspaceShellAllowed, this._productService.version, this._configHelper.config.setLocaleVariables, baseEnv); - const useConpty = this._configHelper.config.windowsEnableConpty; + const useConpty = this._configHelper.config.windowsEnableConpty && !isScreenReaderModeEnabled; return this._terminalInstanceService.createTerminalProcess(shellLaunchConfig, initialCwd, cols, rows, env, useConpty); } diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index a241d24ace0..7d237e386ed 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -701,7 +701,7 @@ export interface ITerminalProcessManager extends IDisposable { readonly onProcessExit: Event; dispose(immediate?: boolean): void; - createProcess(shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number): Promise; + createProcess(shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number, isScreenReaderModeEnabled: boolean): Promise; write(data: string): void; setDimensions(cols: number, rows: number): void; From 8119b4aee7eba7e4370e2aebd7cd7340881607e8 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 24 Jun 2019 15:42:14 -0700 Subject: [PATCH 0619/1449] Move the webviewResourceRoot property to be set on each webview instead of as a global property For #72155 This allows us to potentially change the resource root per webview --- .../src/features/preview.ts | 2 +- .../src/features/previewContentProvider.ts | 51 ++++++++++--------- .../src/markdownExtensions.ts | 3 +- .../src/util/resources.ts | 4 +- .../src/singlefolder-tests/webview.test.ts | 2 +- src/vs/vscode.proposed.d.ts | 4 +- .../api/browser/mainThreadCodeInsets.ts | 6 +++ .../api/browser/mainThreadWebview.ts | 6 +++ .../workbench/api/common/extHost.protocol.ts | 3 +- .../workbench/api/common/extHostCodeInsets.ts | 4 ++ src/vs/workbench/api/common/extHostWebview.ts | 4 ++ src/vs/workbench/api/node/extHost.api.impl.ts | 4 -- .../common/remoteExtensionHostClient.ts | 1 - .../electron-browser/extensionHost.ts | 1 - 14 files changed, 57 insertions(+), 38 deletions(-) diff --git a/extensions/markdown-language-features/src/features/preview.ts b/extensions/markdown-language-features/src/features/preview.ts index 0bb67dccd4c..5f4a03275ff 100644 --- a/extensions/markdown-language-features/src/features/preview.ts +++ b/extensions/markdown-language-features/src/features/preview.ts @@ -412,7 +412,7 @@ export class MarkdownPreview extends Disposable { this.currentVersion = pendingVersion; if (this._resource === resource) { - const content = await this._contentProvider.provideTextDocumentContent(document, this._previewConfigurations, this.line, this.state); + const content = await this._contentProvider.provideTextDocumentContent(document, await this.editor.webview.resourceRoot, this._previewConfigurations, this.line, this.state); // Another call to `doUpdate` may have happened. // Make sure we are still updating for the correct document if (this.currentVersion && this.currentVersion.equals(pendingVersion)) { diff --git a/extensions/markdown-language-features/src/features/previewContentProvider.ts b/extensions/markdown-language-features/src/features/previewContentProvider.ts index 57edf1bd26d..00bcf723aab 100644 --- a/extensions/markdown-language-features/src/features/previewContentProvider.ts +++ b/extensions/markdown-language-features/src/features/previewContentProvider.ts @@ -51,6 +51,7 @@ export class MarkdownContentProvider { public async provideTextDocumentContent( markdownDocument: vscode.TextDocument, + webviewResourceRoot: string, previewConfigurations: MarkdownPreviewConfigurationManager, initialLine: number | undefined = undefined, state?: any @@ -65,14 +66,14 @@ export class MarkdownContentProvider { scrollEditorWithPreview: config.scrollEditorWithPreview, doubleClickToSwitchToEditor: config.doubleClickToSwitchToEditor, disableSecurityWarnings: this.cspArbiter.shouldDisableSecurityWarnings(), - webviewResourceRoot: vscode.env.webviewResourceRoot, + webviewResourceRoot: webviewResourceRoot, }; this.logger.log('provideTextDocumentContent', initialData); // Content Security Policy const nonce = new Date().getTime() + '' + new Date().getMilliseconds(); - const csp = this.getCspForResource(sourceUri, nonce); + const csp = this.getCspForResource(webviewResourceRoot, sourceUri, nonce); const body = await this.engine.render(markdownDocument); return ` @@ -84,14 +85,14 @@ export class MarkdownContentProvider { data-settings="${escapeAttribute(JSON.stringify(initialData))}" data-strings="${escapeAttribute(JSON.stringify(previewStrings))}" data-state="${escapeAttribute(JSON.stringify(state || {}))}"> - - ${this.getStyles(sourceUri, nonce, config, state)} - + + ${this.getStyles(webviewResourceRoot, sourceUri, nonce, config, state)} + ${body}

- ${this.getScripts(nonce)} + ${this.getScripts(webviewResourceRoot, nonce)} `; } @@ -109,12 +110,12 @@ export class MarkdownContentProvider { `; } - private extensionResourcePath(mediaFile: string): string { - return toResoruceUri(vscode.Uri.file(this.context.asAbsolutePath(path.join('media', mediaFile)))) + private extensionResourcePath(webviewResourceRoot: string, mediaFile: string): string { + return toResoruceUri(webviewResourceRoot, vscode.Uri.file(this.context.asAbsolutePath(path.join('media', mediaFile)))) .toString(); } - private fixHref(resource: vscode.Uri, href: string): string { + private fixHref(webviewResourceRoot: string, resource: vscode.Uri, href: string): string { if (!href) { return href; } @@ -125,23 +126,23 @@ export class MarkdownContentProvider { // Assume it must be a local file if (path.isAbsolute(href)) { - return toResoruceUri(vscode.Uri.file(href)).toString(); + return toResoruceUri(webviewResourceRoot, vscode.Uri.file(href)).toString(); } // Use a workspace relative path if there is a workspace const root = vscode.workspace.getWorkspaceFolder(resource); if (root) { - return toResoruceUri(vscode.Uri.file(path.join(root.uri.fsPath, href))).toString(); + return toResoruceUri(webviewResourceRoot, vscode.Uri.file(path.join(root.uri.fsPath, href))).toString(); } // Otherwise look relative to the markdown file - return toResoruceUri(vscode.Uri.file(path.join(path.dirname(resource.fsPath), href))).toString(); + return toResoruceUri(webviewResourceRoot, vscode.Uri.file(path.join(path.dirname(resource.fsPath), href))).toString(); } - private computeCustomStyleSheetIncludes(resource: vscode.Uri, config: MarkdownPreviewConfiguration): string { + private computeCustomStyleSheetIncludes(webviewResourceRoot: string, resource: vscode.Uri, config: MarkdownPreviewConfiguration): string { if (Array.isArray(config.styles)) { return config.styles.map(style => { - return ``; + return ``; }).join('\n'); } return ''; @@ -172,37 +173,41 @@ export class MarkdownContentProvider { return ret; } - private getStyles(resource: vscode.Uri, nonce: string, config: MarkdownPreviewConfiguration, state?: any): string { + private getStyles(webviewResourceRoot: string, resource: vscode.Uri, nonce: string, config: MarkdownPreviewConfiguration, state?: any): string { const baseStyles = this.contributionProvider.contributions.previewStyles - .map(resource => ``) + .map(resource => ``) .join('\n'); return `${baseStyles} ${this.getSettingsOverrideStyles(nonce, config)} - ${this.computeCustomStyleSheetIncludes(resource, config)} + ${this.computeCustomStyleSheetIncludes(webviewResourceRoot, resource, config)} ${this.getImageStabilizerStyles(state)}`; } - private getScripts(nonce: string): string { + private getScripts(resourceRoot: string, nonce: string): string { return this.contributionProvider.contributions.previewScripts - .map(resource => ``) + .map(resource => ``) .join('\n'); } - private getCspForResource(resource: vscode.Uri, nonce: string): string { + private getCspForResource( + webviewResourceRoot: string, + resource: vscode.Uri, + nonce: string + ): string { switch (this.cspArbiter.getSecurityLevelForResource(resource)) { case MarkdownPreviewSecurityLevel.AllowInsecureContent: - return ``; + return ``; case MarkdownPreviewSecurityLevel.AllowInsecureLocalContent: - return ``; + return ``; case MarkdownPreviewSecurityLevel.AllowScriptsAndAllContent: return ''; case MarkdownPreviewSecurityLevel.Strict: default: - return ``; + return ``; } } } diff --git a/extensions/markdown-language-features/src/markdownExtensions.ts b/extensions/markdown-language-features/src/markdownExtensions.ts index ffbdc3054b8..b03c5df80bd 100644 --- a/extensions/markdown-language-features/src/markdownExtensions.ts +++ b/extensions/markdown-language-features/src/markdownExtensions.ts @@ -7,10 +7,9 @@ import * as vscode from 'vscode'; import * as path from 'path'; import { Disposable } from './util/dispose'; import * as arrays from './util/arrays'; -import { toResoruceUri } from './util/resources'; const resolveExtensionResource = (extension: vscode.Extension, resourcePath: string): vscode.Uri => { - return toResoruceUri(vscode.Uri.file(path.join(extension.extensionPath, resourcePath))); + return vscode.Uri.file(path.join(extension.extensionPath, resourcePath)); }; const resolveExtensionResources = (extension: vscode.Extension, resourcePaths: unknown): vscode.Uri[] => { diff --git a/extensions/markdown-language-features/src/util/resources.ts b/extensions/markdown-language-features/src/util/resources.ts index f7133f5a0c4..cb9b8cb56d6 100644 --- a/extensions/markdown-language-features/src/util/resources.ts +++ b/extensions/markdown-language-features/src/util/resources.ts @@ -5,9 +5,9 @@ import * as vscode from 'vscode'; -const rootUri = vscode.Uri.parse(vscode.env.webviewResourceRoot); -export function toResoruceUri(uri: vscode.Uri): vscode.Uri { +export function toResoruceUri(webviewResourceRoot: string, uri: vscode.Uri): vscode.Uri { + const rootUri = vscode.Uri.parse(webviewResourceRoot); return rootUri.with({ path: rootUri.path + uri.path, query: uri.query, diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/webview.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/webview.test.ts index 01e8b460efa..8ef8cec74d6 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/webview.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/webview.test.ts @@ -251,7 +251,7 @@ suite('Webview tests', () => { }); `); - const workspaceRootUri = vscode.env.webviewResourceRoot + vscode.Uri.file(vscode.workspace.rootPath!).path; + const workspaceRootUri = webview.webview.resourceRoot + vscode.Uri.file(vscode.workspace.rootPath!).path; { const imagePath = workspaceRootUri.toString() + '/image.png'; diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 86d4ae370b6..f1849eb35e9 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1461,14 +1461,14 @@ declare module 'vscode' { //#region Webview Resource Roots - export namespace env { + export interface Webview { /** * Root url from which local resources are loaded inside of webviews. * * This is `vscode-resource:` when vscode is run on the desktop. When vscode is run * on the web, this points to a server endpoint. */ - export const webviewResourceRoot: string; + readonly resourceRoot: Thenable; } //#endregion diff --git a/src/vs/workbench/api/browser/mainThreadCodeInsets.ts b/src/vs/workbench/api/browser/mainThreadCodeInsets.ts index 378fb000ddb..e06a5dc3ea9 100644 --- a/src/vs/workbench/api/browser/mainThreadCodeInsets.ts +++ b/src/vs/workbench/api/browser/mainThreadCodeInsets.ts @@ -12,6 +12,7 @@ import { IWebviewService, Webview } from 'vs/workbench/contrib/webview/common/we import { DisposableStore } from 'vs/base/common/lifecycle'; import { IActiveCodeEditor, IViewZone } from 'vs/editor/browser/editorBrowser'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; // todo@joh move these things back into something like contrib/insets class EditorWebviewZone implements IViewZone { @@ -59,6 +60,7 @@ export class MainThreadEditorInsets implements MainThreadEditorInsetsShape { constructor( context: IExtHostContext, + @IEnvironmentService private readonly _environmentService: IEnvironmentService, @ICodeEditorService private readonly _editorService: ICodeEditorService, @IWebviewService private readonly _webviewService: IWebviewService, ) { @@ -144,4 +146,8 @@ export class MainThreadEditorInsets implements MainThreadEditorInsetsShape { } return Promise.resolve(false); } + + async $getResourceRoot(_handle: number): Promise { + return this._environmentService.webviewResourceRoot; + } } diff --git a/src/vs/workbench/api/browser/mainThreadWebview.ts b/src/vs/workbench/api/browser/mainThreadWebview.ts index 83b6403e4f5..5dd98e6e0d6 100644 --- a/src/vs/workbench/api/browser/mainThreadWebview.ts +++ b/src/vs/workbench/api/browser/mainThreadWebview.ts @@ -23,6 +23,7 @@ import { ACTIVE_GROUP, IEditorService } from 'vs/workbench/services/editor/commo import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { extHostNamedCustomer } from '../common/extHostCustomers'; import { IProductService } from 'vs/platform/product/common/product'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @extHostNamedCustomer(MainContext.MainThreadWebviews) export class MainThreadWebviews extends Disposable implements MainThreadWebviewsShape { @@ -54,6 +55,7 @@ export class MainThreadWebviews extends Disposable implements MainThreadWebviews @IOpenerService private readonly _openerService: IOpenerService, @ITelemetryService private readonly _telemetryService: ITelemetryService, @IProductService private readonly _productService: IProductService, + @IEnvironmentService private readonly _environmentService: IEnvironmentService, ) { super(); @@ -139,6 +141,10 @@ export class MainThreadWebviews extends Disposable implements MainThreadWebviews webview.setOptions(reviveWebviewOptions(options as any /*todo@mat */)); } + async $getResourceRoot(_handle: WebviewPanelHandle): Promise { + return this._environmentService.webviewResourceRoot; + } + public $reveal(handle: WebviewPanelHandle, showOptions: WebviewPanelShowOptions): void { const webview = this.getWebview(handle); if (webview.isDisposed()) { diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index f40201b71c3..2de33214423 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -59,7 +59,6 @@ export interface IEnvironment { extensionTestsLocationURI?: URI; globalStorageHome: URI; userHome: URI; - webviewResourceRoot: string; } export interface IStaticWorkspaceData { @@ -519,6 +518,7 @@ export interface MainThreadEditorInsetsShape extends IDisposable { $setHtml(handle: number, value: string): void; $setOptions(handle: number, options: modes.IWebviewOptions): void; $postMessage(handle: number, value: any): Promise; + $getResourceRoot(handle: number): Promise; } export interface ExtHostEditorInsetsShape { @@ -543,6 +543,7 @@ export interface MainThreadWebviewsShape extends IDisposable { $setHtml(handle: WebviewPanelHandle, value: string): void; $setOptions(handle: WebviewPanelHandle, options: modes.IWebviewOptions): void; $postMessage(handle: WebviewPanelHandle, value: any): Promise; + $getResourceRoot(handle: WebviewPanelHandle): Promise; $registerSerializer(viewType: string): void; $unregisterSerializer(viewType: string): void; diff --git a/src/vs/workbench/api/common/extHostCodeInsets.ts b/src/vs/workbench/api/common/extHostCodeInsets.ts index 5a6773d4438..5b40af3d04d 100644 --- a/src/vs/workbench/api/common/extHostCodeInsets.ts +++ b/src/vs/workbench/api/common/extHostCodeInsets.ts @@ -61,6 +61,10 @@ export class ExtHostEditorInsets implements ExtHostEditorInsetsShape { private _html: string = ''; private _options: vscode.WebviewOptions; + get resourceRoot(): Promise { + return that._proxy.$getResourceRoot(handle); + } + set options(value: vscode.WebviewOptions) { this._options = value; that._proxy.$setOptions(handle, value); diff --git a/src/vs/workbench/api/common/extHostWebview.ts b/src/vs/workbench/api/common/extHostWebview.ts index b6ad9c09ee2..98d6631c2a0 100644 --- a/src/vs/workbench/api/common/extHostWebview.ts +++ b/src/vs/workbench/api/common/extHostWebview.ts @@ -39,6 +39,10 @@ export class ExtHostWebview implements vscode.Webview { this._onMessageEmitter.dispose(); } + public get resourceRoot(): Promise { + return this._proxy.$getResourceRoot(this._handle); + } + public get html(): string { this.assertNotDisposed(); return this._html; diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 9cff724bc75..0548192c903 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -262,10 +262,6 @@ export function createApiFactory( openExternal(uri: URI) { return extHostWindow.openUri(uri, { allowTunneling: !!initData.remote.isRemote }); }, - get webviewResourceRoot() { - checkProposedApiEnabled(extension); - return initData.environment.webviewResourceRoot; - }, get remoteName() { if (!initData.remote.authority) { return undefined; diff --git a/src/vs/workbench/services/extensions/common/remoteExtensionHostClient.ts b/src/vs/workbench/services/extensions/common/remoteExtensionHostClient.ts index 5ab1b30e06c..f43a59b9663 100644 --- a/src/vs/workbench/services/extensions/common/remoteExtensionHostClient.ts +++ b/src/vs/workbench/services/extensions/common/remoteExtensionHostClient.ts @@ -190,7 +190,6 @@ export class RemoteExtensionHostClient extends Disposable implements IExtensionH extensionTestsLocationURI: this._environmentService.extensionTestsLocationURI, globalStorageHome: remoteExtensionHostData.globalStorageHome, userHome: remoteExtensionHostData.userHome, - webviewResourceRoot: this._environmentService.webviewResourceRoot, }, workspace: this._contextService.getWorkbenchState() === WorkbenchState.EMPTY ? null : { configuration: workspace.configuration, diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts index 860845137fc..3d324296b01 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts @@ -400,7 +400,6 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter { extensionTestsLocationURI: this._environmentService.extensionTestsLocationURI, globalStorageHome: URI.file(this._environmentService.globalStorageHome), userHome: URI.file(this._environmentService.userHome), - webviewResourceRoot: this._environmentService.webviewResourceRoot, }, workspace: this._contextService.getWorkbenchState() === WorkbenchState.EMPTY ? undefined : { configuration: withNullAsUndefined(workspace.configuration), From e32e2a90c5ae5d914d161b7d66cd818a656223b7 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 24 Jun 2019 16:27:17 -0700 Subject: [PATCH 0620/1449] Make RelativeWorkspacePathResolver a static class --- .../src/utils/pluginPathsProvider.ts | 3 +-- .../src/utils/relativePathResolver.ts | 2 +- .../typescript-language-features/src/utils/versionProvider.ts | 3 +-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/extensions/typescript-language-features/src/utils/pluginPathsProvider.ts b/extensions/typescript-language-features/src/utils/pluginPathsProvider.ts index 547660f0649..de6d03cd980 100644 --- a/extensions/typescript-language-features/src/utils/pluginPathsProvider.ts +++ b/extensions/typescript-language-features/src/utils/pluginPathsProvider.ts @@ -9,7 +9,6 @@ import { RelativeWorkspacePathResolver } from './relativePathResolver'; export class TypeScriptPluginPathsProvider { - public readonly relativePathResolver: RelativeWorkspacePathResolver = new RelativeWorkspacePathResolver(); public constructor( private configuration: TypeScriptServiceConfiguration @@ -32,7 +31,7 @@ export class TypeScriptPluginPathsProvider { return [pluginPath]; } - const workspacePath = this.relativePathResolver.asAbsoluteWorkspacePath(pluginPath); + const workspacePath = RelativeWorkspacePathResolver.asAbsoluteWorkspacePath(pluginPath); if (workspacePath !== undefined) { return [workspacePath]; } diff --git a/extensions/typescript-language-features/src/utils/relativePathResolver.ts b/extensions/typescript-language-features/src/utils/relativePathResolver.ts index 85b72a55d6b..64dff66fb53 100644 --- a/extensions/typescript-language-features/src/utils/relativePathResolver.ts +++ b/extensions/typescript-language-features/src/utils/relativePathResolver.ts @@ -6,7 +6,7 @@ import * as path from 'path'; import * as vscode from 'vscode'; export class RelativeWorkspacePathResolver { - public asAbsoluteWorkspacePath(relativePath: string): string | undefined { + public static asAbsoluteWorkspacePath(relativePath: string): string | undefined { for (const root of vscode.workspace.workspaceFolders || []) { const rootPrefixes = [`./${root.name}/`, `${root.name}/`, `.\\${root.name}\\`, `${root.name}\\`]; for (const rootPrefix of rootPrefixes) { diff --git a/extensions/typescript-language-features/src/utils/versionProvider.ts b/extensions/typescript-language-features/src/utils/versionProvider.ts index 901446130bd..8e9e9a2a8c6 100644 --- a/extensions/typescript-language-features/src/utils/versionProvider.ts +++ b/extensions/typescript-language-features/src/utils/versionProvider.ts @@ -88,7 +88,6 @@ export class TypeScriptVersion { } export class TypeScriptVersionProvider { - private readonly relativePathResolver: RelativeWorkspacePathResolver = new RelativeWorkspacePathResolver(); public constructor( private configuration: TypeScriptServiceConfiguration @@ -179,7 +178,7 @@ export class TypeScriptVersionProvider { return [new TypeScriptVersion(tsdkPathSetting)]; } - const workspacePath = this.relativePathResolver.asAbsoluteWorkspacePath(tsdkPathSetting); + const workspacePath = RelativeWorkspacePathResolver.asAbsoluteWorkspacePath(tsdkPathSetting); if (workspacePath !== undefined) { return [new TypeScriptVersion(workspacePath, tsdkPathSetting)]; } From 14bc8002eb6e8c438cabeccfdd8bd0f7f69d45fb Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 24 Jun 2019 16:28:15 -0700 Subject: [PATCH 0621/1449] Use openExternal --- .../typescript-language-features/src/utils/versionPicker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/typescript-language-features/src/utils/versionPicker.ts b/extensions/typescript-language-features/src/utils/versionPicker.ts index afbda6ef206..d1827002ee3 100644 --- a/extensions/typescript-language-features/src/utils/versionPicker.ts +++ b/extensions/typescript-language-features/src/utils/versionPicker.ts @@ -113,7 +113,7 @@ export class TypeScriptVersionPicker { return { oldVersion: previousVersion, newVersion: shippedVersion }; case MessageAction.learnMore: - vscode.commands.executeCommand('vscode.open', vscode.Uri.parse('https://go.microsoft.com/fwlink/?linkid=839919')); + vscode.env.openExternal(vscode.Uri.parse('https://go.microsoft.com/fwlink/?linkid=839919')); return { oldVersion: this.currentVersion }; default: From 8c8f79dcefde77a5df7a09c22fd85d9309706ab1 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 24 Jun 2019 16:35:15 -0700 Subject: [PATCH 0622/1449] Auto restart when changing typescript.experimental.useSeparateSyntaxServer --- .../typescript-language-features/package.nls.json | 2 +- .../src/tsServer/spawner.ts | 13 ++++++------- .../src/utils/configuration.ts | 9 ++++++++- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/extensions/typescript-language-features/package.nls.json b/extensions/typescript-language-features/package.nls.json index 569685dec0d..10fdddec382 100644 --- a/extensions/typescript-language-features/package.nls.json +++ b/extensions/typescript-language-features/package.nls.json @@ -49,7 +49,7 @@ "typescript.problemMatchers.tsc.label": "TypeScript problems", "typescript.problemMatchers.tscWatch.label": "TypeScript problems (watch mode)", "configuration.suggest.paths": "Enable/disable suggestions for paths in import statements and require calls.", - "configuration.experimental.useSeparateSyntaxServer": "Enable/disable spawning a separate TypeScript server that can more quickly respond to syntax related operations, such as calculating folding or computing document symbols. Note that you must restart the TypeScript server after changing this setting. Requires using TypeScript 3.4.0 or newer in the workspace.", + "configuration.experimental.useSeparateSyntaxServer": "Enable/disable spawning a separate TypeScript server that can more quickly respond to syntax related operations, such as calculating folding or computing document symbols. Requires using TypeScript 3.4.0 or newer in the workspace.", "typescript.locale": "Sets the locale used to report JavaScript and TypeScript errors. Requires using TypeScript 2.6.0 or newer in the workspace. Default of `null` uses VS Code's locale.", "javascript.implicitProjectConfig.experimentalDecorators": "Enable/disable `experimentalDecorators` for JavaScript files that are not part of a project. Existing jsconfig.json or tsconfig.json files override this setting. Requires using TypeScript 2.3.1 or newer in the workspace.", "configuration.suggest.autoImports": "Enable/disable auto import suggestions. Requires using TypeScript 2.6.1 or newer in the workspace.", diff --git a/extensions/typescript-language-features/src/tsServer/spawner.ts b/extensions/typescript-language-features/src/tsServer/spawner.ts index a7be07a0806..599abe32ca1 100644 --- a/extensions/typescript-language-features/src/tsServer/spawner.ts +++ b/extensions/typescript-language-features/src/tsServer/spawner.ts @@ -37,7 +37,7 @@ export class TypeScriptServerSpawner { configuration: TypeScriptServiceConfiguration, pluginManager: PluginManager ): ITypeScriptServer { - if (this.shouldUseSeparateSyntaxServer(version)) { + if (this.shouldUseSeparateSyntaxServer(version, configuration)) { const syntaxServer = this.spawnTsServer('syntax', version, configuration, pluginManager); const semanticServer = this.spawnTsServer('semantic', version, configuration, pluginManager); return new SyntaxRoutingTsServer(syntaxServer, semanticServer); @@ -46,12 +46,11 @@ export class TypeScriptServerSpawner { return this.spawnTsServer('main', version, configuration, pluginManager); } - private shouldUseSeparateSyntaxServer(version: TypeScriptVersion): boolean { - if (!version.apiVersion || version.apiVersion.lt(API.v340)) { - return false; - } - return vscode.workspace.getConfiguration('typescript') - .get('experimental.useSeparateSyntaxServer', false); + private shouldUseSeparateSyntaxServer( + version: TypeScriptVersion, + configuration: TypeScriptServiceConfiguration, + ): boolean { + return configuration.useSeparateSyntaxServer && !!version.apiVersion && version.apiVersion.gte(API.v340); } private spawnTsServer( diff --git a/extensions/typescript-language-features/src/utils/configuration.ts b/extensions/typescript-language-features/src/utils/configuration.ts index 3babc53c91b..97619282256 100644 --- a/extensions/typescript-language-features/src/utils/configuration.ts +++ b/extensions/typescript-language-features/src/utils/configuration.ts @@ -54,6 +54,7 @@ export class TypeScriptServiceConfiguration { public readonly checkJs: boolean; public readonly experimentalDecorators: boolean; public readonly disableAutomaticTypeAcquisition: boolean; + public readonly useSeparateSyntaxServer: boolean; public static loadFromWorkspace(): TypeScriptServiceConfiguration { return new TypeScriptServiceConfiguration(); @@ -71,6 +72,7 @@ export class TypeScriptServiceConfiguration { this.checkJs = TypeScriptServiceConfiguration.readCheckJs(configuration); this.experimentalDecorators = TypeScriptServiceConfiguration.readExperimentalDecorators(configuration); this.disableAutomaticTypeAcquisition = TypeScriptServiceConfiguration.readDisableAutomaticTypeAcquisition(configuration); + this.useSeparateSyntaxServer = TypeScriptServiceConfiguration.readUseSeparateSyntaxServer(configuration); } public isEqualTo(other: TypeScriptServiceConfiguration): boolean { @@ -82,7 +84,8 @@ export class TypeScriptServiceConfiguration { && this.checkJs === other.checkJs && this.experimentalDecorators === other.experimentalDecorators && this.disableAutomaticTypeAcquisition === other.disableAutomaticTypeAcquisition - && arrays.equals(this.tsServerPluginPaths, other.tsServerPluginPaths); + && arrays.equals(this.tsServerPluginPaths, other.tsServerPluginPaths) + && this.useSeparateSyntaxServer === other.useSeparateSyntaxServer; } private static fixPathPrefixes(inspectValue: string): string { @@ -139,4 +142,8 @@ export class TypeScriptServiceConfiguration { private static extractLocale(configuration: vscode.WorkspaceConfiguration): string | null { return configuration.get('typescript.locale', null); } + + private static readUseSeparateSyntaxServer(configuration: vscode.WorkspaceConfiguration): boolean { + return configuration.get('typescript.experimental.useSeparateSyntaxServer', false); + } } From a77402669cb9d5192974e7cc2da828c52e39fba2 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 24 Jun 2019 17:22:03 -0700 Subject: [PATCH 0623/1449] Fix regular expression for rewriting iframe webview html replacing quotes --- src/vs/workbench/contrib/webview/browser/webviewElement.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/webview/browser/webviewElement.ts b/src/vs/workbench/contrib/webview/browser/webviewElement.ts index 98cfb4c0891..1b6c671a68e 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewElement.ts @@ -172,7 +172,7 @@ export class IFrameWebview extends Disposable implements Webview { } private preprocessHtml(value: string): string { - return value.replace(/(?:["'])vscode-resource:([^\s'"]+)(?:["'])/gi, '/vscode-resource$1'); + return value.replace(/(?<=["'])vscode-resource:([^\s'"]+)(?=["'])/gi, '/vscode-resource$1'); } public update(html: string, options: WebviewContentOptions, retainContextWhenHidden: boolean) { From b6d467429b04344678b4e93dcc1beecc04fe69b2 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 24 Jun 2019 17:49:28 -0700 Subject: [PATCH 0624/1449] Floor scrolled line in command tracking Fixes #76032 --- .../contrib/terminal/browser/terminalCommandTracker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalCommandTracker.ts b/src/vs/workbench/contrib/terminal/browser/terminalCommandTracker.ts index c50fcfc8496..77822137bcd 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalCommandTracker.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalCommandTracker.ts @@ -112,7 +112,7 @@ export class TerminalCommandTracker implements ITerminalCommandTracker, IDisposa private _scrollToMarker(marker: IMarker, position: ScrollPosition): void { let line = marker.line; if (position === ScrollPosition.Middle) { - line = Math.max(line - this._xterm.rows / 2, 0); + line = Math.max(line - Math.floor(this._xterm.rows / 2), 0); } this._xterm.scrollToLine(line); } From 4a69a7106505b04a82f2be18b89a128198cca651 Mon Sep 17 00:00:00 2001 From: Logan Ramos Date: Mon, 24 Jun 2019 18:47:12 -0700 Subject: [PATCH 0625/1449] Telemetry Command (#76029) * Added telemetry command * Initial Build support * Added build logic for telemetry * Linux Builds * Windows builds sort of work * Remove arm telemetry extraction * Remove alpine telemetry extraction * Remove accidental s * More try catch --- .../darwin/product-build-darwin.yml | 15 ++++++++ .../linux/product-build-linux.yml | 15 ++++++++ .../win32/product-build-win32.yml | 17 +++++++++ build/gulpfile.vscode.js | 4 ++- resources/completions/zsh/_code | 1 + src/vs/code/node/cli.ts | 3 +- src/vs/code/node/cliProcessMain.ts | 3 ++ .../environment/common/environment.ts | 1 + src/vs/platform/environment/node/argv.ts | 36 ++++++++++++++++++- 9 files changed, 92 insertions(+), 3 deletions(-) diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index b465ef9a095..0b9a362c075 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -59,6 +59,21 @@ steps: node build/lib/builtInExtensions.js displayName: Install distro dependencies and extensions +- script: | + set -e + cd .. + git clone https://github.com/microsoft/vscode-telemetry-extractor.git + cd vscode-telemetry-extractor + npm install + ./node_modules/typescript/bin/tsc + npm run setup-extension-repos + node ./out/cli-extract.js --sourceDir ../s --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents + node ./out/cli-extract-extensions.js --sourceDir ./src/telemetry-sources/ --outputDir . --applyEndpoints --includeIsMeasurement + mv declarations-resolved.json ../s/src/telemetry-core.json + mv declarations-extensions-resolved.json ../s/src/telemetry-extensions.json + echo 'Moved Files' + displayName: Extract Telemetry + - script: | set -e VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index fa26c26dd1c..210798a4776 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -60,6 +60,21 @@ steps: node build/lib/builtInExtensions.js displayName: Install distro dependencies and extensions +- script: | + set -e + cd .. + git clone https://github.com/microsoft/vscode-telemetry-extractor.git + cd vscode-telemetry-extractor + npm install + ./node_modules/typescript/bin/tsc + npm run setup-extension-repos + node ./out/cli-extract.js --sourceDir ../s --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents + node ./out/cli-extract-extensions.js --sourceDir ./src/telemetry-sources/ --outputDir . --applyEndpoints --includeIsMeasurement + mv declarations-resolved.json ../s/src/telemetry-core.json + mv declarations-extensions-resolved.json ../s/src/telemetry-extensions.json + echo 'Moved Files' + displayName: Extract Telemetry + - script: | set -e VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 3fe19e4b847..31ff866b76a 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -65,6 +65,23 @@ steps: exec { node build/lib/builtInExtensions.js } displayName: Install distro dependencies and extensions +- powershell: | + . build/azure-pipelines/win32/exec.ps1 + $ErrorActionPreference = "Stop" + cd .. + git clone https://github.com/microsoft/vscode-telemetry-extractor.git + cd vscode-telemetry-extractor + npm install + npm install -g typescript + tsc + npm run setup-extension-repos + node ./out/cli-extract.js --sourceDir ../s --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents + node ./out/cli-extract-extensions.js --sourceDir ./src/telemetry-sources/ --outputDir . --applyEndpoints --includeIsMeasurement + mv declarations-resolved.json ../s/src/telemetry-core.json + mv declarations-extensions-resolved.json ../s/src/telemetry-extensions.json + echo 'Moved Files' + displayName: Extract Telemetry + - powershell: | . build/azure-pipelines/win32/exec.ps1 $ErrorActionPreference = "Stop" diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 9c32df0bf81..4fc0a7ff414 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -62,6 +62,8 @@ const vscodeResources = [ 'out-build/bootstrap-amd.js', 'out-build/bootstrap-window.js', 'out-build/paths.js', + 'out-build/telemetry-core.json', + 'out-build/telemetry-extensions.json', 'out-build/vs/**/*.{svg,png,cur,html}', '!out-build/vs/code/browser/**/*.html', 'out-build/vs/base/common/performance.js', @@ -327,7 +329,7 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op .pipe(createAsar(path.join(process.cwd(), 'node_modules'), ['**/*.node', '**/vscode-ripgrep/bin/*', '**/node-pty/build/Release/*'], 'app/node_modules.asar')); let all = es.merge( - packageJsonStream, + packageJsonStream, productJsonStream, license, api, diff --git a/resources/completions/zsh/_code b/resources/completions/zsh/_code index 8c4415ac59f..054ab351e91 100644 --- a/resources/completions/zsh/_code +++ b/resources/completions/zsh/_code @@ -14,6 +14,7 @@ arguments=( '--user-data-dir[specify the directory that user data is kept in]:directory:_directories' '(- *)'{-v,--version}'[print version]' '(- *)'{-h,--help}'[print usage]' + '(- *)'{--telemetry}'[Shows all telemetry events which VS code collects.]' '--extensions-dir[set the root path for extensions]:root path:_directories' '--list-extensions[list the installed extensions]' '--show-versions[show versions of installed extensions, when using --list-extension]' diff --git a/src/vs/code/node/cli.ts b/src/vs/code/node/cli.ts index 45f4ff7d670..978ecdd42b8 100644 --- a/src/vs/code/node/cli.ts +++ b/src/vs/code/node/cli.ts @@ -25,7 +25,8 @@ function shouldSpawnCliProcess(argv: ParsedArgs): boolean { || !!argv['list-extensions'] || !!argv['install-extension'] || !!argv['uninstall-extension'] - || !!argv['locate-extension']; + || !!argv['locate-extension'] + || !!argv['telemetry']; } interface IMainCli { diff --git a/src/vs/code/node/cliProcessMain.ts b/src/vs/code/node/cliProcessMain.ts index dafebd1c91f..5caccaf03b9 100644 --- a/src/vs/code/node/cliProcessMain.ts +++ b/src/vs/code/node/cliProcessMain.ts @@ -41,6 +41,7 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { LocalizationsService } from 'vs/platform/localizations/node/localizations'; import { Schemas } from 'vs/base/common/network'; import { SpdLogService } from 'vs/platform/log/node/spdlogService'; +import { buildTelemetryMessage } from 'vs/platform/environment/node/argv'; const notFound = (id: string) => localize('notFound', "Extension '{0}' not found.", id); const notInstalled = (id: string) => localize('notInstalled', "Extension '{0}' is not installed.", id); @@ -94,6 +95,8 @@ export class Main { const arg = argv['locate-extension']; const ids: string[] = typeof arg === 'string' ? [arg] : arg; await this.locateExtension(ids); + } else if (argv['telemetry']) { + console.log(buildTelemetryMessage(this.environmentService.appRoot, this.environmentService.extensionsPath)); } } diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index 443e430fcd0..dc75380ba18 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -13,6 +13,7 @@ export interface ParsedArgs { _urls?: string[]; help?: boolean; version?: boolean; + telemetry?: boolean; status?: boolean; wait?: boolean; waitMarkerFilePath?: string; diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts index b53a29f370a..a8715ddccae 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts @@ -8,7 +8,8 @@ import * as os from 'os'; import { localize } from 'vs/nls'; import { ParsedArgs } from 'vs/platform/environment/common/environment'; import { join } from 'vs/base/common/path'; -import { writeFileSync } from 'vs/base/node/pfs'; +import { statSync, readFileSync } from 'fs'; +import { writeFileSync, readdirSync } from 'vs/base/node/pfs'; /** * This code is also used by standalone cli's. Avoid adding any other dependencies. @@ -41,6 +42,7 @@ export const options: Option[] = [ { id: 'user-data-dir', type: 'string', cat: 'o', args: 'dir', description: localize('userDataDir', "Specifies the directory that user data is kept in. Can be used to open multiple distinct instances of Code.") }, { id: 'version', type: 'boolean', cat: 'o', alias: 'v', description: localize('version', "Print version.") }, { id: 'help', type: 'boolean', cat: 'o', alias: 'h', description: localize('help', "Print usage.") }, + { id: 'telemetry', type: 'boolean', cat: 'o', description: localize('telemetry', "Shows all telemetry events which VS code collects.") }, { id: 'folder-uri', type: 'string', cat: 'o', args: 'uri', description: localize('folderUri', "Opens a window with given folder uri(s)") }, { id: 'file-uri', type: 'string', cat: 'o', args: 'uri', description: localize('fileUri', "Opens a window with given file uri(s)") }, @@ -217,6 +219,38 @@ export function buildVersionMessage(version: string | undefined, commit: string return `${version || localize('unknownVersion', "Unknown version")}\n${commit || localize('unknownCommit', "Unknown commit")}\n${process.arch}`; } +export function buildTelemetryMessage(appRoot: string, extensionsPath: string): string { + try { + // Gets all the directories inside the extension directory + const dirs = readdirSync(extensionsPath).filter(files => statSync(join(extensionsPath, files)).isDirectory()); + const telemetryJsonFolders: string[] = []; + dirs.forEach((dir) => { + const files = readdirSync(join(extensionsPath, dir)).filter(file => file === 'telemetry.json'); + // We know it contains a telemetry.json file so we add it to the list of folders which have one + if (files.length === 1) { + telemetryJsonFolders.push(dir); + } + }); + const mergedTelemetry = Object.create(null); + // Simple function to merge the telemetry into one json object + const mergeTelemetry = (contents: string, dirName: string) => { + const telemetryData = JSON.parse(contents); + mergedTelemetry[dirName] = telemetryData; + }; + telemetryJsonFolders.forEach((folder) => { + const contents = readFileSync(join(extensionsPath, folder, 'telemetry.json')).toString(); + mergeTelemetry(contents, folder); + }); + let contents = readFileSync(join(appRoot, 'out/', 'telemetry-core.json')).toString(); + mergeTelemetry(contents, 'vscode-core'); + contents = readFileSync(join(appRoot, 'out/', 'telemetry-extensions.json')).toString(); + mergeTelemetry(contents, 'vscode-extensions'); + return JSON.stringify(mergedTelemetry, null, 4); + } catch (err) { + return 'Unable to read VS Code telemetry events!'; + } +} + /** * Converts an argument into an array * @param arg a argument value. Can be undefined, an entry or an array From 9690e3b17e060b356a6c871234c29f82f69f7b73 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 24 Jun 2019 17:56:40 -0700 Subject: [PATCH 0626/1449] Use full resource uri for transforming webview resources This ensures we still work even if there is no base uri set --- product.json | 9 ++++++++- .../workbench/contrib/webview/browser/webviewElement.ts | 4 ++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/product.json b/product.json index 4103352af85..8037965bff0 100644 --- a/product.json +++ b/product.json @@ -22,5 +22,12 @@ "urlProtocol": "code-oss", "extensionAllowedProposedApi": [ "ms-vscode.references-view" - ] + ], + "extensionsGallery": { + "serviceUrl": "https://marketplace.visualstudio.com/_apis/public/gallery", + "cacheUrl": "https://vscode.blob.core.windows.net/gallery/index", + "itemUrl": "https://marketplace.visualstudio.com/items", + "controlUrl": "https://az764295.vo.msecnd.net/extensions/marketplace.json", + "recommendationsUrl": "https://az764295.vo.msecnd.net/extensions/workspaceRecommendations.json.gz" + } } \ No newline at end of file diff --git a/src/vs/workbench/contrib/webview/browser/webviewElement.ts b/src/vs/workbench/contrib/webview/browser/webviewElement.ts index 1b6c671a68e..f64f439ece0 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewElement.ts @@ -40,8 +40,8 @@ export class IFrameWebview extends Disposable implements Webview { private _options: WebviewOptions, contentOptions: WebviewContentOptions, @IThemeService themeService: IThemeService, - @IEnvironmentService environmentService: IEnvironmentService, @ITunnelService tunnelService: ITunnelService, + @IEnvironmentService private readonly environmentService: IEnvironmentService, @IFileService private readonly fileService: IFileService, @IConfigurationService private readonly _configurationService: IConfigurationService, ) { @@ -172,7 +172,7 @@ export class IFrameWebview extends Disposable implements Webview { } private preprocessHtml(value: string): string { - return value.replace(/(?<=["'])vscode-resource:([^\s'"]+)(?=["'])/gi, '/vscode-resource$1'); + return value.replace(/(?<=["'])vscode-resource:([^\s'"]+)(?=["'])/gi, `${this.environmentService.webviewEndpoint}/vscode-resource$1`); } public update(html: string, options: WebviewContentOptions, retainContextWhenHidden: boolean) { From c281e61ad17bf7be379d835371a746b540c718af Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 24 Jun 2019 19:51:02 -0700 Subject: [PATCH 0627/1449] Use outerHtml to make sure we write `` element from extensions too --- src/vs/workbench/contrib/webview/browser/pre/main.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index c30f0c79592..c4f638e1ce2 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -370,8 +370,7 @@ newFrame.contentWindow.addEventListener('DOMContentLoaded', e => { if (FAKE_LOAD) { newFrame.contentDocument.open(); - newFrame.contentDocument.write(''); - newFrame.contentDocument.write(newDocument.documentElement.innerHTML); + newFrame.contentDocument.write('\n' + newDocument.documentElement.outerHTML); newFrame.contentDocument.close(); hookupOnLoadHandlers(newFrame); } @@ -496,4 +495,4 @@ } else { window.createWebviewManager = createWebviewManager; } -}()); \ No newline at end of file +}()); From 7a6ed6d5c94551dfa3bd22cc3837a6fbe90eccfe Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 24 Jun 2019 19:51:26 -0700 Subject: [PATCH 0628/1449] Use a regexp that works across browsers --- src/vs/workbench/contrib/webview/browser/webviewElement.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/webview/browser/webviewElement.ts b/src/vs/workbench/contrib/webview/browser/webviewElement.ts index f64f439ece0..1d82afae006 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewElement.ts @@ -172,7 +172,8 @@ export class IFrameWebview extends Disposable implements Webview { } private preprocessHtml(value: string): string { - return value.replace(/(?<=["'])vscode-resource:([^\s'"]+)(?=["'])/gi, `${this.environmentService.webviewEndpoint}/vscode-resource$1`); + return value.replace(/(["'])vscode-resource:([^\s'"]+?)(["'])/gi, (_, startQuote, path, endQuote) => + `${startQuote}${this.environmentService.webviewEndpoint}/vscode-resource${path}${endQuote}`); } public update(html: string, options: WebviewContentOptions, retainContextWhenHidden: boolean) { From b78d8d5056331efaee1e2790fa1041550cb8934d Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 24 Jun 2019 19:51:51 -0700 Subject: [PATCH 0629/1449] Implement reload on iframe based webview Elements --- src/vs/workbench/contrib/webview/browser/webviewElement.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/webview/browser/webviewElement.ts b/src/vs/workbench/contrib/webview/browser/webviewElement.ts index 1d82afae006..247c1366e72 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewElement.ts @@ -246,8 +246,9 @@ export class IFrameWebview extends Disposable implements Webview { } reload(): void { - throw new Error('Method not implemented.'); + this.doUpdateContent(); } + selectAll(): void { throw new Error('Method not implemented.'); } From c673aa0cdc211510b6d88b783971b20c4745b054 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 25 Jun 2019 06:43:05 +0200 Subject: [PATCH 0630/1449] fix various nls issues --- .../codeEditor/browser/inspectKeybindings.ts | 4 ++-- .../preferences/browser/keyboardLayoutPicker.ts | 16 +++++++--------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/contrib/codeEditor/browser/inspectKeybindings.ts b/src/vs/workbench/contrib/codeEditor/browser/inspectKeybindings.ts index ec27d6a2e22..381de357c7e 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/inspectKeybindings.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/inspectKeybindings.ts @@ -37,7 +37,7 @@ registerEditorAction(InspectKeyMap); class InspectKeyMapJSON extends Action { public static readonly ID = 'workbench.action.inspectKeyMappingsJSON'; - public static readonly LABEL = nls.localize('workbench.action.inspectKeyMapJSON', "Developer: Inspect Key Mappings (JSON)"); + public static readonly LABEL = nls.localize('workbench.action.inspectKeyMapJSON', "Inspect Key Mappings (JSON)"); constructor( id: string, @@ -54,4 +54,4 @@ class InspectKeyMapJSON extends Action { } const registry = Registry.as(ActionExtensions.WorkbenchActions); -registry.registerWorkbenchAction(new SyncActionDescriptor(InspectKeyMapJSON, InspectKeyMapJSON.ID, InspectKeyMapJSON.LABEL), 'Developer: Inspect Key Mappings (JSON)'); +registry.registerWorkbenchAction(new SyncActionDescriptor(InspectKeyMapJSON, InspectKeyMapJSON.ID, InspectKeyMapJSON.LABEL), 'Developer: Inspect Key Mappings (JSON)', nls.localize('developer', "Developer")); diff --git a/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts b/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts index 043e3dd6e2a..1c35cfab123 100644 --- a/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts +++ b/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts @@ -37,12 +37,11 @@ export class KeyboardLayoutPickerContribution extends Disposable implements IWor let layoutInfo = parseKeyboardLayoutDescription(layout); this.pickerElement.value = this.statusbarService.addEntry( { - text: `Layout: ${layoutInfo.label}`, - // tooltip: nls.localize('keyboard.layout.tooltip', "If you are not using a Screen Reader, please change the setting `editor.accessibilitySupport` to \"off\"."), + text: nls.localize('keyboardLayout', "Layout: {0}", layoutInfo.label), command: KEYBOARD_LAYOUT_OPEN_PICKER }, 'status.workbench.keyboardLayout', - nls.localize('status.workbench.keyboardLayout', "Current keyboard layout"), + nls.localize('status.workbench.keyboardLayout', "Current Keyboard Layout"), StatusbarAlignment.RIGHT ); } @@ -53,18 +52,17 @@ export class KeyboardLayoutPickerContribution extends Disposable implements IWor if (this.pickerElement.value) { this.pickerElement.value.update({ - text: `Layout: ${layoutInfo.label}`, + text: nls.localize('keyboardLayout', "Layout: {0}", layoutInfo.label), command: KEYBOARD_LAYOUT_OPEN_PICKER }); } else { this.pickerElement.value = this.statusbarService.addEntry( { - text: `Layout: ${layoutInfo}`, - // tooltip: nls.localize('keyboard.layout.tooltip', "If you are not using a Screen Reader, please change the setting `editor.accessibilitySupport` to \"off\"."), + text: nls.localize('keyboardLayout', "Layout: {0}", layoutInfo.label), command: KEYBOARD_LAYOUT_OPEN_PICKER }, 'status.workbench.keyboardLayout', - nls.localize('status.workbench.keyboardLayout', "Current keyboard layout"), + nls.localize('status.workbench.keyboardLayout', "Current Keyboard Layout"), StatusbarAlignment.RIGHT ); } @@ -81,7 +79,7 @@ interface LayoutQuickPickItem extends IQuickPickItem { export class KeyboardLayoutPickerAction extends Action { static readonly ID = KEYBOARD_LAYOUT_OPEN_PICKER; - static readonly LABEL = nls.localize('keyboard.chooseLayout', "Change keyboard layout"); + static readonly LABEL = nls.localize('keyboard.chooseLayout', "Change Keyboard Layout"); private static DEFAULT_CONTENT: string = [ `// ${nls.localize('displayLanguage', 'Defines the keyboard layout used in VS Code in the browser environment.')}`, @@ -180,4 +178,4 @@ export class KeyboardLayoutPickerAction extends Action { } const registry = Registry.as(ActionExtensions.WorkbenchActions); -registry.registerWorkbenchAction(new SyncActionDescriptor(KeyboardLayoutPickerAction, KeyboardLayoutPickerAction.ID, KeyboardLayoutPickerAction.LABEL, {}), 'Change Language Mode'); +registry.registerWorkbenchAction(new SyncActionDescriptor(KeyboardLayoutPickerAction, KeyboardLayoutPickerAction.ID, KeyboardLayoutPickerAction.LABEL, {}), 'Preferences: Change Keyboard Layout', nls.localize('preferences', "Preferences")); From cd206b1f4962f2bd421ecbe87c5a98f630a28860 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 25 Jun 2019 06:46:04 +0200 Subject: [PATCH 0631/1449] :lipstick: --- .../contrib/preferences/browser/keyboardLayoutPicker.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts b/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts index 1c35cfab123..35a40b06fea 100644 --- a/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts +++ b/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker.ts @@ -41,7 +41,7 @@ export class KeyboardLayoutPickerContribution extends Disposable implements IWor command: KEYBOARD_LAYOUT_OPEN_PICKER }, 'status.workbench.keyboardLayout', - nls.localize('status.workbench.keyboardLayout', "Current Keyboard Layout"), + nls.localize('status.workbench.keyboardLayout', "Keyboard Layout"), StatusbarAlignment.RIGHT ); } @@ -62,7 +62,7 @@ export class KeyboardLayoutPickerContribution extends Disposable implements IWor command: KEYBOARD_LAYOUT_OPEN_PICKER }, 'status.workbench.keyboardLayout', - nls.localize('status.workbench.keyboardLayout', "Current Keyboard Layout"), + nls.localize('status.workbench.keyboardLayout', "Keyboard Layout"), StatusbarAlignment.RIGHT ); } From 8ad4bab72127a98c217f84351bac1a43f17a8ed0 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 25 Jun 2019 08:20:10 +0200 Subject: [PATCH 0632/1449] add debug output (#76024) --- build/azure-pipelines/common/symbols.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/build/azure-pipelines/common/symbols.ts b/build/azure-pipelines/common/symbols.ts index a42342ce7f7..e719e79842e 100644 --- a/build/azure-pipelines/common/symbols.ts +++ b/build/azure-pipelines/common/symbols.ts @@ -146,6 +146,10 @@ async function ensureVersionAndSymbols(options: IOptions) { // Check version does not exist console.log(`HockeyApp: checking for existing version ${options.versions.code} (${options.platform})`); const versions = await getVersions({ accessToken: options.access.hockeyAppToken, appId: options.access.hockeyAppId }); + if (!Array.isArray(versions.app_versions)) { + throw new Error(`Unexpected response: ${JSON.stringify(versions)}`); + } + if (versions.app_versions.some(v => v.version === options.versions.code)) { console.log(`HockeyApp: Returning without uploading symbols because version ${options.versions.code} (${options.platform}) was already found`); return; @@ -211,7 +215,7 @@ if (repository && codeVersion && electronVersion && (product.quality === 'stable }).then(() => { console.log('HockeyApp: done'); }).catch(error => { - console.error(`HockeyApp: error (${error})`); + console.error(`HockeyApp: error ${error} (AppID: ${hockeyAppId})`); }); } else { console.log(`HockeyApp: skipping due to unexpected context (repository: ${repository}, codeVersion: ${codeVersion}, electronVersion: ${electronVersion}, quality: ${product.quality})`); From 33eae179e458f2334636e0f90f35f625f34c663b Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Tue, 25 Jun 2019 09:36:57 +0200 Subject: [PATCH 0633/1449] Fix tasks platform for quoting Fixes #75774 --- .../workbench/contrib/tasks/browser/terminalTaskSystem.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts index 4b33e41969b..b9739fc6809 100644 --- a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts @@ -145,9 +145,9 @@ export class TerminalTaskSystem implements ITaskSystem { }; private static osShellQuotes: IStringDictionary = { - 'linux': TerminalTaskSystem.shellQuotes['bash'], - 'darwin': TerminalTaskSystem.shellQuotes['bash'], - 'win32': TerminalTaskSystem.shellQuotes['powershell'] + 'Linux': TerminalTaskSystem.shellQuotes['bash'], + 'Mac': TerminalTaskSystem.shellQuotes['bash'], + 'Windows': TerminalTaskSystem.shellQuotes['powershell'] }; private activeTasks: IStringDictionary; @@ -1123,7 +1123,7 @@ export class TerminalTaskSystem implements ITaskSystem { if (shellOptions && shellOptions.quoting) { return shellOptions.quoting; } - return TerminalTaskSystem.shellQuotes[shellBasename] || TerminalTaskSystem.osShellQuotes[platform]; + return TerminalTaskSystem.shellQuotes[shellBasename] || TerminalTaskSystem.osShellQuotes[Platform.PlatformToString(platform)]; } private collectTaskVariables(variables: Set, task: CustomTask | ContributedTask): void { From 6e3e8e80180792b2ddfabcb6f72cb9fafd778572 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 25 Jun 2019 09:38:14 +0200 Subject: [PATCH 0634/1449] fix watching --- .../workbench/services/userData/common/fileUserDataProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/services/userData/common/fileUserDataProvider.ts b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts index 61f01d2f1eb..8aebbcdc065 100644 --- a/src/vs/workbench/services/userData/common/fileUserDataProvider.ts +++ b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts @@ -30,7 +30,7 @@ export class FileUserDataProvider extends Disposable implements IUserDataProvide private handleFileChanges(event: FileChangesEvent): void { const changedKeys: string[] = []; for (const change of event.changes) { - if (change.resource.scheme !== this.userDataHome.scheme) { + if (change.resource.scheme === this.userDataHome.scheme) { const key = this.toKey(change.resource); if (key) { changedKeys.push(key); From 97108901287435324a993d6da4be38f7f982a935 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 25 Jun 2019 09:45:56 +0200 Subject: [PATCH 0635/1449] fix hockeyapp symbols and report errors (fix #76024) --- build/azure-pipelines/common/symbols.ts | 6 ++++++ build/azure-pipelines/win32/product-build-win32.yml | 1 + 2 files changed, 7 insertions(+) diff --git a/build/azure-pipelines/common/symbols.ts b/build/azure-pipelines/common/symbols.ts index e719e79842e..153be4f25b1 100644 --- a/build/azure-pipelines/common/symbols.ts +++ b/build/azure-pipelines/common/symbols.ts @@ -188,6 +188,10 @@ const hockeyAppToken = process.argv[3]; const is64 = process.argv[4] === 'x64'; const hockeyAppId = process.argv[5]; +if (process.argv.length !== 6) { + throw new Error(`HockeyApp: Unexpected number of arguments. Got ${process.argv}`); +} + let platform: Platform; if (process.platform === 'darwin') { platform = Platform.MAC_OS; @@ -216,6 +220,8 @@ if (repository && codeVersion && electronVersion && (product.quality === 'stable console.log('HockeyApp: done'); }).catch(error => { console.error(`HockeyApp: error ${error} (AppID: ${hockeyAppId})`); + + return process.exit(1); }); } else { console.log(`HockeyApp: skipping due to unexpected context (repository: ${repository}, codeVersion: ${codeVersion}, electronVersion: ${electronVersion}, quality: ${product.quality})`); diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 31ff866b76a..6efaa050dcc 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -185,6 +185,7 @@ steps: $env:AZURE_STORAGE_ACCESS_KEY_2 = "$(vscode-storage-key)" $env:AZURE_DOCUMENTDB_MASTERKEY = "$(builds-docdb-key-readwrite)" $env:VSCODE_HOCKEYAPP_TOKEN = "$(vscode-hockeyapp-token)" + $env:VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" .\build\azure-pipelines\win32\publish.ps1 displayName: Publish From 57b7f06fac63e3f87c85bed74879ed21bfabcf0d Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 25 Jun 2019 09:46:32 +0200 Subject: [PATCH 0636/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e7c10b4b0a7..f8690b7cfbc 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "f22db93b3c64b0787d98aef556519af82c64860b", + "distro": "49ce758993a685b0f621eb6cd9353908ea4eeda4", "author": { "name": "Microsoft Corporation" }, From c7b6044d0f09f1f563ec2a7b86e494b3d55937c9 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 25 Jun 2019 11:40:46 +0200 Subject: [PATCH 0637/1449] fix bad watch --- extensions/git/src/repository.ts | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index 6018648f468..bec7ce5ead7 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -488,7 +488,10 @@ class DotGitWatcher implements IFileWatcher { private transientDisposables: IDisposable[] = []; private disposables: IDisposable[] = []; - constructor(private repository: Repository) { + constructor( + private repository: Repository, + private outputChannel: OutputChannel + ) { const rootWatcher = watch(repository.dotGit); this.disposables.push(rootWatcher); @@ -511,9 +514,15 @@ class DotGitWatcher implements IFileWatcher { const { name, remote } = this.repository.HEAD.upstream; const upstreamPath = path.join(this.repository.dotGit, 'refs', 'remotes', remote, name); - const upstreamWatcher = watch(upstreamPath); - this.transientDisposables.push(upstreamWatcher); - upstreamWatcher.event(this.emitter.fire, this.emitter, this.transientDisposables); + try { + const upstreamWatcher = watch(upstreamPath); + this.transientDisposables.push(upstreamWatcher); + upstreamWatcher.event(this.emitter.fire, this.emitter, this.transientDisposables); + } catch (err) { + if (env.logLevel <= LogLevel.Info) { + this.outputChannel.appendLine(`Failed to watch ref '${upstreamPath}'. Ref is most likely packed.`); + } + } } dispose() { @@ -642,7 +651,7 @@ export class Repository implements Disposable { const onWorkspaceRepositoryFileChange = filterEvent(onWorkspaceFileChange, uri => isDescendant(repository.root, uri.fsPath)); const onWorkspaceWorkingTreeFileChange = filterEvent(onWorkspaceRepositoryFileChange, uri => !/\/\.git($|\/)/.test(uri.path)); - const dotGitFileWatcher = new DotGitWatcher(this); + const dotGitFileWatcher = new DotGitWatcher(this, outputChannel); this.disposables.push(dotGitFileWatcher); // FS changes should trigger `git status`: From d978e48bc6ff4b364b661ea0c8d8a7fc53a3927a Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 25 Jun 2019 12:36:32 +0200 Subject: [PATCH 0638/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f8690b7cfbc..83d12480989 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "49ce758993a685b0f621eb6cd9353908ea4eeda4", + "distro": "b7c9b0b730030fb30876d201daa85476c077e57e", "author": { "name": "Microsoft Corporation" }, From 7f365d2ff2522dc9a4ba5b715a36064f75f4f4c7 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Tue, 25 Jun 2019 16:36:45 +0200 Subject: [PATCH 0639/1449] Fix drive letter casing on typescript tasks Occurs when opening by double clicking on workspace file. Fixes #75084 --- extensions/typescript-language-features/src/features/task.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/typescript-language-features/src/features/task.ts b/extensions/typescript-language-features/src/features/task.ts index 8c393ade672..e366748f725 100644 --- a/extensions/typescript-language-features/src/features/task.ts +++ b/extensions/typescript-language-features/src/features/task.ts @@ -234,7 +234,7 @@ class TscTaskProvider implements vscode.TaskProvider { private getLabelForTasks(project: TSConfig): string { if (project.workspaceFolder) { - return path.posix.relative(project.workspaceFolder.uri.path, project.posixPath); + return path.posix.relative(path.posix.normalize(project.workspaceFolder.uri.path), path.posix.normalize(project.posixPath)); } return project.posixPath; } From 50c71bd80733776a17f8f5177c84fb46c460ae15 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 25 Jun 2019 16:59:35 +0200 Subject: [PATCH 0640/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 83d12480989..fc129412f71 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "b7c9b0b730030fb30876d201daa85476c077e57e", + "distro": "a711cd231d7ec027ffd521d5877fea20a6ca0335", "author": { "name": "Microsoft Corporation" }, From 5d37d79ee12697cdbe5bba9d96dbb418e1437134 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 25 Jun 2019 17:06:07 +0200 Subject: [PATCH 0641/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fc129412f71..18b397ee547 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "a711cd231d7ec027ffd521d5877fea20a6ca0335", + "distro": "1d4ee5533d98dc54e6de1e084a8b6f902c146bfc", "author": { "name": "Microsoft Corporation" }, From 75fed4073fa2b692a2538d6bd47b305975a10196 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Tue, 25 Jun 2019 16:12:56 +0200 Subject: [PATCH 0642/1449] Test remoteName and extensionKind (for #76028) --- .../src/singlefolder-tests/env.test.ts | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/env.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/env.test.ts index 31d6d4ce312..6cfc6f60408 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/env.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/env.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { env } from 'vscode'; +import { env, extensions, ExtensionKind } from 'vscode'; suite('env-namespace', () => { @@ -24,4 +24,22 @@ suite('env-namespace', () => { assert.throws(() => (env as any).sessionId = '234'); }); + test('env.remoteName', function () { + const remoteName = env.remoteName; + const apiTestExtension = extensions.getExtension('vscode.vscode-api-tests'); + const testResolverExtension = extensions.getExtension('vscode.vscode-test-resolver'); + if (typeof remoteName === 'undefined') { + assert.ok(apiTestExtension); + assert.ok(testResolverExtension); + assert.equal(ExtensionKind.UI, apiTestExtension!.extensionKind); + assert.equal(ExtensionKind.UI, testResolverExtension!.extensionKind); + } else if (typeof remoteName === 'string') { + assert.ok(apiTestExtension); + assert.ok(!testResolverExtension); // we currently can only access extensions that run on same host + assert.equal(ExtensionKind.Workspace, apiTestExtension!.extensionKind); + } else { + assert.fail(); + } + }); + }); From 1d851ecfe2b0c36fc5cb15bfeff0176d050f4dc0 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Tue, 25 Jun 2019 17:20:41 +0200 Subject: [PATCH 0643/1449] MainThreadFileSystem does not await --- src/vs/workbench/api/browser/mainThreadFileSystem.ts | 8 ++++---- src/vs/workbench/api/common/extHostFileSystem.ts | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadFileSystem.ts b/src/vs/workbench/api/browser/mainThreadFileSystem.ts index 5a52faf060e..cb84e3c1323 100644 --- a/src/vs/workbench/api/browser/mainThreadFileSystem.ts +++ b/src/vs/workbench/api/browser/mainThreadFileSystem.ts @@ -96,19 +96,19 @@ export class MainThreadFileSystem implements MainThreadFileSystemShape { } async $rename(source: UriComponents, target: UriComponents, opts: FileOverwriteOptions): Promise { - this._fileService.move(URI.revive(source), URI.revive(target), opts.overwrite); + await this._fileService.move(URI.revive(source), URI.revive(target), opts.overwrite); } async $copy(source: UriComponents, target: UriComponents, opts: FileOverwriteOptions): Promise { - this._fileService.copy(URI.revive(source), URI.revive(target), opts.overwrite); + await this._fileService.copy(URI.revive(source), URI.revive(target), opts.overwrite); } async $mkdir(uri: UriComponents): Promise { - this._fileService.createFolder(URI.revive(uri)); + await this._fileService.createFolder(URI.revive(uri)); } async $delete(uri: UriComponents, opts: FileDeleteOptions): Promise { - this._fileService.del(URI.revive(uri), opts); + await this._fileService.del(URI.revive(uri), opts); } } diff --git a/src/vs/workbench/api/common/extHostFileSystem.ts b/src/vs/workbench/api/common/extHostFileSystem.ts index 0159b6403eb..778a5cb67ad 100644 --- a/src/vs/workbench/api/common/extHostFileSystem.ts +++ b/src/vs/workbench/api/common/extHostFileSystem.ts @@ -124,7 +124,7 @@ class ConsumerFileSystem implements vscode.FileSystem { return this._proxy.$writeFile(uri, VSBuffer.wrap(content), options); } delete(uri: vscode.Uri, options: { recursive: boolean; } = { recursive: false }): Promise { - return this._proxy.$delete(uri, { ...options, useTrash: true }); //todo@joh useTrash + return this._proxy.$delete(uri, { ...options, useTrash: false }); //todo@joh useTrash } rename(oldUri: vscode.Uri, newUri: vscode.Uri, options: { overwrite: boolean; } = { overwrite: false }): Promise { return this._proxy.$rename(oldUri, newUri, options); From 90b3c0ad5b5717c142212141b9bc3d0ec1bca44f Mon Sep 17 00:00:00 2001 From: Pine Wu Date: Tue, 25 Jun 2019 09:46:18 -0700 Subject: [PATCH 0644/1449] Fix #76096 --- src/vs/workbench/api/node/extHostExtensionService.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts index 643f65a6aaf..c5360322431 100644 --- a/src/vs/workbench/api/node/extHostExtensionService.ts +++ b/src/vs/workbench/api/node/extHostExtensionService.ts @@ -562,8 +562,8 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { c(); this._gracefulExit(0); }) - .catch((err) => { - e(err); + .catch((err: Error) => { + e(err.toString()); this._gracefulExit(1); }); } From 3ce04754ad00225a988446efa7b04fb4a2c186f1 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 25 Jun 2019 10:53:30 -0700 Subject: [PATCH 0645/1449] Rename runInBackground to hideFromUser See #75278 --- .../src/singlefolder-tests/window.test.ts | 8 ++++---- src/vs/vscode.d.ts | 2 +- src/vs/vscode.proposed.d.ts | 12 ++++++++++++ .../api/browser/mainThreadTerminalService.ts | 4 ++-- src/vs/workbench/api/common/extHost.protocol.ts | 2 +- src/vs/workbench/api/node/extHost.api.impl.ts | 1 + src/vs/workbench/api/node/extHostTerminalService.ts | 6 +++--- .../contrib/terminal/browser/terminalService.ts | 4 ++-- src/vs/workbench/contrib/terminal/common/terminal.ts | 2 +- .../contrib/terminal/common/terminalService.ts | 4 ++-- 10 files changed, 29 insertions(+), 16 deletions(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts index 321e885acbb..19184284108 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts @@ -738,8 +738,8 @@ suite('window namespace tests', () => { terminal1.show(); }); - test('runInBackground terminal: onDidWriteData should work', done => { - const terminal = window.createTerminal({ name: 'bg', runInBackground: true }); + test('hideFromUser terminal: onDidWriteData should work', done => { + const terminal = window.createTerminal({ name: 'bg', hideFromUser: true }); let data = ''; terminal.onDidWriteData(e => { data += e; @@ -751,8 +751,8 @@ suite('window namespace tests', () => { terminal.sendText('foo'); }); - test('runInBackground terminal: should be available to terminals API', done => { - const terminal = window.createTerminal({ name: 'bg', runInBackground: true }); + test('hideFromUser terminal: should be available to terminals API', done => { + const terminal = window.createTerminal({ name: 'bg', hideFromUser: true }); window.onDidOpenTerminal(t => { assert.equal(t, terminal); assert.equal(t.name, 'bg'); diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 953cfb92259..34cb0b46abb 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -7042,7 +7042,7 @@ declare module 'vscode' { * interaction is needed. Note that the terminals will still be exposed to all extensions * as normal. */ - runInBackground?: boolean; + hideFromUser?: boolean; } /** diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index f1849eb35e9..60b108c952c 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1121,6 +1121,18 @@ declare module 'vscode' { readonly onDidWriteData: Event; } + + export interface TerminalOptions { + /** + * When enabled the terminal will run the process as normal but not be surfaced to the user + * until `Terminal.show` is called. The typical usage for this is when you need to run + * something that may need interactivity but only want to tell the user about it when + * interaction is needed. Note that the terminals will still be exposed to all extensions + * as normal. + */ + runInBackground?: boolean; + } + /** * Represents the dimensions of a terminal. */ diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index a607cab17b6..f31996419f7 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -74,7 +74,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape // when the extension host process goes down ? } - public $createTerminal(name?: string, shellPath?: string, shellArgs?: string[] | string, cwd?: string | UriComponents, env?: { [key: string]: string }, waitOnExit?: boolean, strictEnv?: boolean, runInBackground?: boolean): Promise<{ id: number, name: string }> { + public $createTerminal(name?: string, shellPath?: string, shellArgs?: string[] | string, cwd?: string | UriComponents, env?: { [key: string]: string }, waitOnExit?: boolean, strictEnv?: boolean, hideFromUser?: boolean): Promise<{ id: number, name: string }> { const shellLaunchConfig: IShellLaunchConfig = { name, executable: shellPath, @@ -84,7 +84,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape ignoreConfigurationCwd: true, env, strictEnv, - runInBackground + hideFromUser }; const terminal = this._terminalService.createTerminal(shellLaunchConfig); return Promise.resolve({ diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 2de33214423..2f51c54ee7c 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -390,7 +390,7 @@ export interface MainThreadProgressShape extends IDisposable { } export interface MainThreadTerminalServiceShape extends IDisposable { - $createTerminal(name?: string, shellPath?: string, shellArgs?: string[] | string, cwd?: string | UriComponents, env?: { [key: string]: string | null }, waitOnExit?: boolean, strictEnv?: boolean, runInBackground?: boolean): Promise<{ id: number, name: string }>; + $createTerminal(name?: string, shellPath?: string, shellArgs?: string[] | string, cwd?: string | UriComponents, env?: { [key: string]: string | null }, waitOnExit?: boolean, strictEnv?: boolean, hideFromUser?: boolean): Promise<{ id: number, name: string }>; $createTerminalRenderer(name: string): Promise; $dispose(terminalId: number): void; $hide(terminalId: number): void; diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 0548192c903..3ad15b30f7d 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -524,6 +524,7 @@ export function createApiFactory( }, createTerminal(nameOrOptions?: vscode.TerminalOptions | string, shellPath?: string, shellArgs?: string[] | string): vscode.Terminal { if (typeof nameOrOptions === 'object') { + nameOrOptions.hideFromUser = nameOrOptions.hideFromUser || (nameOrOptions.runInBackground && extension.enableProposedApi); return extHostTerminalService.createTerminalFromOptions(nameOrOptions); } return extHostTerminalService.createTerminal(nameOrOptions, shellPath, shellArgs); diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index d7432604d4d..fb3081ff495 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -115,9 +115,9 @@ export class ExtHostTerminal extends BaseExtHostTerminal implements vscode.Termi env?: { [key: string]: string | null }, waitOnExit?: boolean, strictEnv?: boolean, - runInBackground?: boolean + hideFromUser?: boolean ): void { - this._proxy.$createTerminal(this._name, shellPath, shellArgs, cwd, env, waitOnExit, strictEnv, runInBackground).then(terminal => { + this._proxy.$createTerminal(this._name, shellPath, shellArgs, cwd, env, waitOnExit, strictEnv, hideFromUser).then(terminal => { this._name = terminal.name; this._runQueuedRequests(terminal.id); }); @@ -312,7 +312,7 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { public createTerminalFromOptions(options: vscode.TerminalOptions): vscode.Terminal { const terminal = new ExtHostTerminal(this._proxy, options.name); - terminal.create(options.shellPath, options.shellArgs, options.cwd, options.env, /*options.waitOnExit*/ undefined, options.strictEnv, options.runInBackground); + terminal.create(options.shellPath, options.shellArgs, options.cwd, options.env, /*options.waitOnExit*/ undefined, options.strictEnv, options.hideFromUser); this._terminals.push(terminal); return terminal; } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalService.ts b/src/vs/workbench/contrib/terminal/browser/terminalService.ts index 1e2017721bc..1b117021f53 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalService.ts @@ -56,7 +56,7 @@ export class TerminalService extends CommonTerminalService implements ITerminalS } public createTerminal(shell: IShellLaunchConfig = {}): ITerminalInstance { - if (shell.runInBackground) { + if (shell.hideFromUser) { const instance = this.createInstance(this._terminalFocusContextKey, this.configHelper, undefined, @@ -86,7 +86,7 @@ export class TerminalService extends CommonTerminalService implements ITerminalS protected _showBackgroundTerminal(instance: ITerminalInstance): void { this._backgroundedTerminalInstances.splice(this._backgroundedTerminalInstances.indexOf(instance), 1); - instance.shellLaunchConfig.runInBackground = false; + instance.shellLaunchConfig.hideFromUser = false; const terminalTab = this._instantiationService.createInstance(TerminalTab, this._terminalFocusContextKey, this.configHelper, diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index 7d237e386ed..af35201e56a 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -204,7 +204,7 @@ export interface IShellLaunchConfig { * interaction is needed. Note that the terminals will still be exposed to all extensions * as normal. */ - runInBackground?: boolean; + hideFromUser?: boolean; } export interface ITerminalService { diff --git a/src/vs/workbench/contrib/terminal/common/terminalService.ts b/src/vs/workbench/contrib/terminal/common/terminalService.ts index 58cca1cbc6e..da5d0bcfe48 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalService.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalService.ts @@ -282,9 +282,9 @@ export abstract class TerminalService implements ITerminalService { } public setActiveInstance(terminalInstance: ITerminalInstance): void { - // If this was a runInBackground terminal created by the API this was triggered by show, + // If this was a hideFromUser terminal created by the API this was triggered by show, // in which case we need to create the terminal tab - if (terminalInstance.shellLaunchConfig.runInBackground) { + if (terminalInstance.shellLaunchConfig.hideFromUser) { this._showBackgroundTerminal(terminalInstance); } this.setActiveInstanceByIndex(this._getIndexFromId(terminalInstance.id)); From 53a1a3506869dbb5530f6b09b5bff990aad8fc02 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 25 Jun 2019 11:42:59 -0700 Subject: [PATCH 0646/1449] Update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 18b397ee547..c042e80daac 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "1d4ee5533d98dc54e6de1e084a8b6f902c146bfc", + "distro": "017ad2e70f6427c6603b82e7d27dd54fa281923d", "author": { "name": "Microsoft Corporation" }, From bd7458a3bd3fbbbe7ad5cfcddc6b4433949e5406 Mon Sep 17 00:00:00 2001 From: Rachel Macfarlane Date: Tue, 25 Jun 2019 13:59:24 -0700 Subject: [PATCH 0647/1449] Fix minimap decoration rendering on horizontal scroll, fixes #76128 --- src/vs/editor/browser/viewParts/minimap/minimap.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/vs/editor/browser/viewParts/minimap/minimap.ts b/src/vs/editor/browser/viewParts/minimap/minimap.ts index bb68a3af249..a4dd63a6504 100644 --- a/src/vs/editor/browser/viewParts/minimap/minimap.ts +++ b/src/vs/editor/browser/viewParts/minimap/minimap.ts @@ -451,7 +451,7 @@ export class Minimap extends ViewPart { private _options: MinimapOptions; private _lastRenderData: RenderData | null; - private _decorationsChanged: boolean = false; + private _renderDecorations: boolean = false; private _buffers: MinimapBuffers | null; constructor(context: ViewContext) { @@ -650,6 +650,7 @@ export class Minimap extends ViewPart { return true; } public onScrollChanged(e: viewEvents.ViewScrollChangedEvent): boolean { + this._renderDecorations = true; return true; } public onTokensChanged(e: viewEvents.ViewTokensChangedEvent): boolean { @@ -669,7 +670,7 @@ export class Minimap extends ViewPart { } public onDecorationsChanged(e: viewEvents.ViewDecorationsChangedEvent): boolean { - this._decorationsChanged = true; + this._renderDecorations = true; return true; } @@ -720,9 +721,8 @@ export class Minimap extends ViewPart { } private renderDecorations(layout: MinimapLayout) { - const scrollHasChanged = this._lastRenderData && !this._lastRenderData.scrollEquals(layout); - if (scrollHasChanged || this._decorationsChanged) { - this._decorationsChanged = false; + if (this._renderDecorations) { + this._renderDecorations = false; const decorations = this._context.model.getDecorationsInViewport(new Range(layout.startLineNumber, 1, layout.endLineNumber, this._context.model.getLineMaxColumn(layout.endLineNumber))); const { renderMinimap, canvasInnerWidth, canvasInnerHeight } = this._options; @@ -790,11 +790,11 @@ export class Minimap extends ViewPart { const x = lineIndexToXOffset[startColumn - 1]; const width = lineIndexToXOffset[endColumn - 1] - x; - this.renderADecoration(canvasContext, currentDecoration.options.minimap, x, y, width, height); + this.renderDecoration(canvasContext, currentDecoration.options.minimap, x, y, width, height); } } - private renderADecoration(canvasContext: CanvasRenderingContext2D, minimapOptions: ModelDecorationMinimapOptions, x: number, y: number, width: number, height: number) { + private renderDecoration(canvasContext: CanvasRenderingContext2D, minimapOptions: ModelDecorationMinimapOptions, x: number, y: number, width: number, height: number) { const decorationColor = minimapOptions.getColor(this._context.theme); canvasContext.fillStyle = decorationColor; From a55b1545824e427b3461570e35fc9eab36d4c429 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 25 Jun 2019 15:13:54 -0700 Subject: [PATCH 0648/1449] Handle windows paths correctly when loading webvie resources --- .../contrib/webview/browser/webviewElement.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/webviewElement.ts b/src/vs/workbench/contrib/webview/browser/webviewElement.ts index 247c1366e72..a72107be72e 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewElement.ts @@ -114,8 +114,9 @@ export class IFrameWebview extends Disposable implements Webview { case 'load-resource': { - const uri = URI.file(e.data.data.path); - this.loadResource(uri); + const requestPath = e.data.data.path; + const uri = URI.file(decodeURIComponent(requestPath)); + this.loadResource(requestPath, uri); return; } @@ -301,7 +302,7 @@ export class IFrameWebview extends Disposable implements Webview { this._send('styles', { styles, activeTheme }); } - private async loadResource(uri: URI) { + private async loadResource(requestPath: string, uri: URI) { try { const result = await loadLocalResource(uri, this.fileService, this._options.extension ? this._options.extension.location : undefined, () => (this.content.options.localResourceRoots || [])); @@ -309,7 +310,7 @@ export class IFrameWebview extends Disposable implements Webview { if (result.type === 'success') { return this._send('did-load-resource', { status: 200, - path: uri.path, + path: requestPath, mime: result.mimeType, data: result.data.buffer }); @@ -332,4 +333,3 @@ export class IFrameWebview extends Disposable implements Webview { }); } } - From fa7002641745ef5ce59b522a52c57ce33e4798c5 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 25 Jun 2019 15:32:47 -0700 Subject: [PATCH 0649/1449] Fix standard link handler for iframe based webviews --- src/vs/workbench/contrib/webview/browser/webviewElement.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/webview/browser/webviewElement.ts b/src/vs/workbench/contrib/webview/browser/webviewElement.ts index a72107be72e..0c57649c8b6 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewElement.ts @@ -84,7 +84,7 @@ export class IFrameWebview extends Disposable implements Webview { return; case 'did-click-link': - const [uri] = e.data.data; + const uri = e.data.data; this._onDidClickLink.fire(URI.parse(uri)); return; From 53f050c0f37845c81b08094fc10d59fc8d075cc9 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 25 Jun 2019 15:41:10 -0700 Subject: [PATCH 0650/1449] Mark extensions.all as readonly This iteration, we marked a few other arrays as readonly. We should do the same for extensions.all --- src/vs/vscode.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 34cb0b46abb..6a886a0e5a7 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -8994,7 +8994,7 @@ declare module 'vscode' { /** * All extensions currently known to the system. */ - export let all: Extension[]; + export const all: ReadonlyArray>; /** * An event which fires when `extensions.all` changes. This can happen when extensions are From f4f0afa78acef9069d62202ed82bafdaea5d2426 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Tue, 25 Jun 2019 16:15:20 -0700 Subject: [PATCH 0651/1449] Fix #75927. --- src/vs/editor/browser/viewParts/minimap/minimap.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/vs/editor/browser/viewParts/minimap/minimap.ts b/src/vs/editor/browser/viewParts/minimap/minimap.ts index a4dd63a6504..f5fb181844b 100644 --- a/src/vs/editor/browser/viewParts/minimap/minimap.ts +++ b/src/vs/editor/browser/viewParts/minimap/minimap.ts @@ -472,17 +472,18 @@ export class Minimap extends ViewPart { this._shadow.setClassName('minimap-shadow-hidden'); this._domNode.appendChild(this._shadow); - this._canvas = createFastDomNode(document.createElement('canvas')); - this._canvas.setPosition('absolute'); - this._canvas.setLeft(0); - this._domNode.appendChild(this._canvas); - this._decorationsCanvas = createFastDomNode(document.createElement('canvas')); this._decorationsCanvas.setPosition('absolute'); this._decorationsCanvas.setClassName('minimap-decorations-layer'); this._decorationsCanvas.setLeft(0); this._domNode.appendChild(this._decorationsCanvas); + // text are rendered at the top, similar to editor view lines. + this._canvas = createFastDomNode(document.createElement('canvas')); + this._canvas.setPosition('absolute'); + this._canvas.setLeft(0); + this._domNode.appendChild(this._canvas); + this._slider = createFastDomNode(document.createElement('div')); this._slider.setPosition('absolute'); this._slider.setClassName('minimap-slider'); From 6bb4a2530064c4b73de00e5466ca32598b7c1f3f Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Tue, 25 Jun 2019 16:19:46 -0700 Subject: [PATCH 0652/1449] Register mouse down on container dom node. --- src/vs/editor/browser/viewParts/minimap/minimap.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/vs/editor/browser/viewParts/minimap/minimap.ts b/src/vs/editor/browser/viewParts/minimap/minimap.ts index f5fb181844b..a8bc3b789e8 100644 --- a/src/vs/editor/browser/viewParts/minimap/minimap.ts +++ b/src/vs/editor/browser/viewParts/minimap/minimap.ts @@ -472,18 +472,17 @@ export class Minimap extends ViewPart { this._shadow.setClassName('minimap-shadow-hidden'); this._domNode.appendChild(this._shadow); + this._canvas = createFastDomNode(document.createElement('canvas')); + this._canvas.setPosition('absolute'); + this._canvas.setLeft(0); + this._domNode.appendChild(this._canvas); + this._decorationsCanvas = createFastDomNode(document.createElement('canvas')); this._decorationsCanvas.setPosition('absolute'); this._decorationsCanvas.setClassName('minimap-decorations-layer'); this._decorationsCanvas.setLeft(0); this._domNode.appendChild(this._decorationsCanvas); - // text are rendered at the top, similar to editor view lines. - this._canvas = createFastDomNode(document.createElement('canvas')); - this._canvas.setPosition('absolute'); - this._canvas.setLeft(0); - this._domNode.appendChild(this._canvas); - this._slider = createFastDomNode(document.createElement('div')); this._slider.setPosition('absolute'); this._slider.setClassName('minimap-slider'); @@ -499,7 +498,7 @@ export class Minimap extends ViewPart { this._applyLayout(); - this._mouseDownListener = dom.addStandardDisposableListener(this._canvas.domNode, 'mousedown', (e) => { + this._mouseDownListener = dom.addStandardDisposableListener(this._domNode.domNode, 'mousedown', (e) => { e.preventDefault(); const renderMinimap = this._options.renderMinimap; From 9670060267d4a44e9c9833bdb23662a8e76041db Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 25 Jun 2019 16:22:13 -0700 Subject: [PATCH 0653/1449] Make sure we never cancel a request to just one of the ts servers Fixes #76143 --- .../src/tsServer/server.ts | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/extensions/typescript-language-features/src/tsServer/server.ts b/extensions/typescript-language-features/src/tsServer/server.ts index 9fbe7e80fac..2bcfbf6a9ef 100644 --- a/extensions/typescript-language-features/src/tsServer/server.ts +++ b/extensions/typescript-language-features/src/tsServer/server.ts @@ -357,8 +357,34 @@ export class SyntaxRoutingTsServer extends Disposable implements ITypeScriptServ return this.syntaxServer.executeImpl(command, args, executeInfo); } else if (SyntaxRoutingTsServer.sharedCommands.has(command)) { // Dispatch to both server but only return from syntax one - this.semanticServer.executeImpl(command, args, executeInfo); - return this.syntaxServer.executeImpl(command, args, executeInfo); + + // Also make sure we never cancel requests to just one server + let hasCompletedSyntax = false; + let hasCompletedSemantic = false; + let token: vscode.CancellationToken | undefined = undefined; + if (executeInfo.token) { + const source = new vscode.CancellationTokenSource(); + executeInfo.token.onCancellationRequested(() => { + if (hasCompletedSyntax && !hasCompletedSemantic || hasCompletedSemantic && !hasCompletedSyntax) { + // Don't cancel. + // One of the servers completed this request so we don't want to leave the other + // in a different state + return; + } + source.cancel(); + }); + token = source.token; + } + + const semanticRequest = this.semanticServer.executeImpl(command, args, { ...executeInfo, token }); + if (semanticRequest) { + semanticRequest.finally(() => { hasCompletedSemantic = true; }); + } + const syntaxRequest = this.syntaxServer.executeImpl(command, args, { ...executeInfo, token }); + if (syntaxRequest) { + syntaxRequest.finally(() => { hasCompletedSyntax = true; }); + } + return syntaxRequest; } else { return this.semanticServer.executeImpl(command, args, executeInfo); } From be41fd02a2141ecd0a544b08f51c414a486c4474 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 25 Jun 2019 16:38:38 -0700 Subject: [PATCH 0654/1449] Show document link tooltip first and put click instructions in parens Fixes #76077 This change also update our standard link hovers to follow this format --- .../src/features/documentLinkProvider.ts | 2 +- src/vs/editor/contrib/links/links.ts | 24 +++++++++---------- src/vs/vscode.d.ts | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/extensions/markdown-language-features/src/features/documentLinkProvider.ts b/extensions/markdown-language-features/src/features/documentLinkProvider.ts index 9ae4bcfed29..c4344a632bd 100644 --- a/extensions/markdown-language-features/src/features/documentLinkProvider.ts +++ b/extensions/markdown-language-features/src/features/documentLinkProvider.ts @@ -39,7 +39,7 @@ function parseLink( return { uri: OpenDocumentLinkCommand.createCommandUri(resourcePath, tempUri.fragment), - tooltip: localize('documentLink.tooltip', 'follow link') + tooltip: localize('documentLink.tooltip', 'Follow link') }; } diff --git a/src/vs/editor/contrib/links/links.ts b/src/vs/editor/contrib/links/links.ts index ed3b65ef042..58f50952234 100644 --- a/src/vs/editor/contrib/links/links.ts +++ b/src/vs/editor/contrib/links/links.ts @@ -27,26 +27,26 @@ import { registerThemingParticipant } from 'vs/platform/theme/common/themeServic const HOVER_MESSAGE_GENERAL_META = new MarkdownString().appendText( platform.isMacintosh - ? nls.localize('links.navigate.mac', "Cmd + click to follow link") - : nls.localize('links.navigate', "Ctrl + click to follow link") + ? nls.localize('links.navigate.mac', "Follow link (cmd + click)") + : nls.localize('links.navigate', "Follow link (cmd + click)") ); const HOVER_MESSAGE_COMMAND_META = new MarkdownString().appendText( platform.isMacintosh - ? nls.localize('links.command.mac', "Cmd + click to execute command") - : nls.localize('links.command', "Ctrl + click to execute command") + ? nls.localize('links.command.mac', "Execute command (cmd + click)") + : nls.localize('links.command', "Execute command (cmd + click)") ); const HOVER_MESSAGE_GENERAL_ALT = new MarkdownString().appendText( platform.isMacintosh - ? nls.localize('links.navigate.al.mac', "Option + click to follow link") - : nls.localize('links.navigate.al', "Alt + click to follow link") + ? nls.localize('links.navigate.al.mac', "Follow link (cption + click)") + : nls.localize('links.navigate.al', "Follow link (alt + click)") ); const HOVER_MESSAGE_COMMAND_ALT = new MarkdownString().appendText( platform.isMacintosh - ? nls.localize('links.command.al.mac', "Option + click to execute command") - : nls.localize('links.command.al', "Alt + click to execute command") + ? nls.localize('links.command.al.mac', "Execute command (cption + click)") + : nls.localize('links.command.al', "Execute command (alt + click)") ); const decoration = { @@ -116,11 +116,11 @@ class LinkOccurrence { const message = new MarkdownString().appendText( platform.isMacintosh ? useMetaKey - ? nls.localize('links.custom.mac', "Cmd + click to {0}", link.tooltip) - : nls.localize('links.custom.mac.al', "Option + click to {0}", link.tooltip) + ? nls.localize('links.custom.mac', "{0} (cmd + click)", link.tooltip) + : nls.localize('links.custom.mac.al', "{0} (option + click)", link.tooltip) : useMetaKey - ? nls.localize('links.custom', "Ctrl + click to {0}", link.tooltip) - : nls.localize('links.custom.al', "Alt + click to {0}", link.tooltip) + ? nls.localize('links.custom', "{0} (ctrl + click)", link.tooltip) + : nls.localize('links.custom.al', "{0} (alt + click)", link.tooltip) ); options.hoverMessage = message; } diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 6a886a0e5a7..d99f3d12f56 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -3548,7 +3548,7 @@ declare module 'vscode' { * The tooltip text when you hover over this link. * * If a tooltip is provided, is will be displayed in a string that includes instructions on how to - * trigger the link, such as `cmd + click to {0}`. The specific instructions vary depending on OS, + * trigger the link, such as `{0} (ctrl + click)`. The specific instructions vary depending on OS, * user settings, and localization. */ tooltip?: string; From 1e7b87a3206606555a4746fa1ba23129dac30c18 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Tue, 25 Jun 2019 16:46:51 -0700 Subject: [PATCH 0655/1449] reset listener once users choose a dedicated keyboard layout --- src/vs/workbench/services/keybinding/browser/keymapService.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/services/keybinding/browser/keymapService.ts b/src/vs/workbench/services/keybinding/browser/keymapService.ts index 21546ac6d36..c183d82b28a 100644 --- a/src/vs/workbench/services/keybinding/browser/keymapService.ts +++ b/src/vs/workbench/services/keybinding/browser/keymapService.ts @@ -521,6 +521,7 @@ class BrowserKeymapService extends Disposable implements IKeymapService { BrowserKeyboardMapperFactory.INSTANCE.onKeyboardLayoutChanged(); } else { BrowserKeyboardMapperFactory.INSTANCE.setKeyboardLayout(layout); + this.layoutChangeListener.clear(); } } })); From cc8c1758a5ba86c59ce7c8060364233882589cb6 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Tue, 25 Jun 2019 19:29:13 -0700 Subject: [PATCH 0656/1449] switch to a new layout only when the score is higher. --- .../keybinding/browser/keymapService.ts | 17 +++++++++++++++-- .../services/keybinding/common/keymapInfo.ts | 8 +++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/services/keybinding/browser/keymapService.ts b/src/vs/workbench/services/keybinding/browser/keymapService.ts index c183d82b28a..5de1307f32c 100644 --- a/src/vs/workbench/services/keybinding/browser/keymapService.ts +++ b/src/vs/workbench/services/keybinding/browser/keymapService.ts @@ -154,7 +154,20 @@ export class BrowserKeyboardMapperFactoryBase { } setActiveKeyMapping(keymap: IKeyboardMapping | null) { - this._activeKeymapInfo = this.getMatchedKeymapInfo(keymap) || this.getUSStandardLayout(); + let matchedKeyboardLayout = this.getMatchedKeymapInfo(keymap); + if (matchedKeyboardLayout) { + if (!this._activeKeymapInfo) { + this._activeKeymapInfo = matchedKeyboardLayout; + } else if (keymap) { + if (matchedKeyboardLayout.getScore(keymap) > this._activeKeymapInfo.getScore(keymap)) { + this._activeKeymapInfo = matchedKeyboardLayout; + } + } + } + + if (!this._activeKeymapInfo) { + this._activeKeymapInfo = this.getUSStandardLayout(); + } if (!this._activeKeymapInfo) { return; @@ -348,7 +361,7 @@ export class BrowserKeyboardMapperFactoryBase { const matchedKeyboardLayout = this.getMatchedKeymapInfo(ret); if (matchedKeyboardLayout) { - return matchedKeyboardLayout.mapping; + return ret; } return null; diff --git a/src/vs/workbench/services/keybinding/common/keymapInfo.ts b/src/vs/workbench/services/keybinding/common/keymapInfo.ts index d0ff2d40469..edea5fd675c 100644 --- a/src/vs/workbench/services/keybinding/common/keymapInfo.ts +++ b/src/vs/workbench/services/keybinding/common/keymapInfo.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Event } from 'vs/base/common/event'; -import { isWindows } from 'vs/base/common/platform'; +import { isWindows, isLinux } from 'vs/base/common/platform'; import { createDecorator, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; import { DispatchConfig } from 'vs/workbench/services/keybinding/common/dispatchConfig'; import { IKeyboardMapper } from 'vs/workbench/services/keybinding/common/keyboardMapper'; @@ -286,6 +286,12 @@ export class KeymapInfo { // keymap from Chromium is probably wrong. continue; } + + if (isLinux && (key === 'Backspace' || key === 'Escape')) { + // native keymap doesn't align with keyboard event + continue; + } + if (this.mapping[key] === undefined) { score -= 1; } From 41691474e5fa22a279d49fc4b58af66bc11ce41b Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Tue, 25 Jun 2019 19:42:47 -0700 Subject: [PATCH 0657/1449] Fix kb unit test --- src/vs/workbench/services/keybinding/browser/keymapService.ts | 4 ++++ .../services/keybinding/test/browserKeyboardMapper.test.ts | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/services/keybinding/browser/keymapService.ts b/src/vs/workbench/services/keybinding/browser/keymapService.ts index 5de1307f32c..cff794267bf 100644 --- a/src/vs/workbench/services/keybinding/browser/keymapService.ts +++ b/src/vs/workbench/services/keybinding/browser/keymapService.ts @@ -153,6 +153,10 @@ export class BrowserKeyboardMapperFactoryBase { return this._activeKeymapInfo && keymap && this._activeKeymapInfo.fuzzyEqual(keymap); } + setUSKeyboardLayout() { + this._activeKeymapInfo = this.getUSStandardLayout(); + } + setActiveKeyMapping(keymap: IKeyboardMapping | null) { let matchedKeyboardLayout = this.getMatchedKeymapInfo(keymap); if (matchedKeyboardLayout) { diff --git a/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts b/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts index 6f817dc867d..9ea8f70d1e3 100644 --- a/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts +++ b/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts @@ -110,7 +110,7 @@ suite('keyboard layout loader', () => { }, }), true); - TestKeyboardMapperFactory.INSTANCE.setActiveKeyMapping(null); + TestKeyboardMapperFactory.INSTANCE.setUSKeyboardLayout(); assert.equal(TestKeyboardMapperFactory.INSTANCE.activeKeyboardLayout!.isUSStandard, true); }); @@ -130,7 +130,7 @@ suite('keyboard layout loader', () => { }, }), true); - TestKeyboardMapperFactory.INSTANCE.setActiveKeyMapping(null); + TestKeyboardMapperFactory.INSTANCE.setUSKeyboardLayout(); assert.equal(TestKeyboardMapperFactory.INSTANCE.activeKeyboardLayout!.isUSStandard, true); }); }); \ No newline at end of file From 159a49279bc8eded08844e0bd980afc9098d092e Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 25 Jun 2019 22:16:13 -0700 Subject: [PATCH 0658/1449] Potential workaround for electron 4 eating mouse events For #75090 See #75090 for information about issue. This PR attempts to workaround this bug by broadcasting synthetic mouse move and mouseup events from the webview back to the main window --- .../contrib/webview/browser/pre/main.js | 26 +++++++++++++++++++ .../electron-browser/webviewElement.ts | 12 +++++++++ 2 files changed, 38 insertions(+) diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index c4f638e1ce2..a6be033e074 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -410,6 +410,9 @@ } }; + /** + * @param {HTMLIFrameElement} newFrame + */ function hookupOnLoadHandlers(newFrame) { clearTimeout(loadTimeout); loadTimeout = undefined; @@ -442,6 +445,29 @@ // Bubble out link clicks newFrame.contentWindow.addEventListener('click', handleInnerClick); + + // Electron 4 eats mouseup events from inside webviews + // https://github.com/microsoft/vscode/issues/75090 + // Try to fix this by rebroadcasting mouse moves and mouseups so that we can + // emulate these on the main window + if (!FAKE_LOAD) { + let isMouseDown = false; + + newFrame.contentWindow.addEventListener('mousedown', () => { + isMouseDown = true; + }); + + const tryDispatchSyntheticMouseEvent = (e) => { + if (!isMouseDown) { + host.postMessage('synthetic-mouse-event', { type: e.type, screenX: e.screenX, screenY: e.screenY, clientX: e.clientX, clientY: e.clientY }); + } + }; + newFrame.contentWindow.addEventListener('mouseup', e => { + tryDispatchSyntheticMouseEvent(e); + isMouseDown = false; + }); + newFrame.contentWindow.addEventListener('mousemove', tryDispatchSyntheticMouseEvent); + } } if (!FAKE_LOAD) { diff --git a/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts index f0f599d1049..67ca21ee160 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts @@ -391,6 +391,18 @@ export class WebviewElement extends Disposable implements Webview { this._onDidClickLink.fire(URI.parse(uri)); return; + case 'synthetic-mouse-event': + { + const rawEvent = event.args[0]; + const bounds = this._webview.getBoundingClientRect(); + window.dispatchEvent(new MouseEvent(rawEvent.type, { + ...rawEvent, + clientX: rawEvent.clientX + bounds.left, + clientY: rawEvent.clientY + bounds.top, + })); + return; + } + case 'did-set-content': this._webview.style.flex = ''; this._webview.style.width = '100%'; From b0d568409dd971390a7e007554ef2567a97ae197 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 26 Jun 2019 07:56:30 +0200 Subject: [PATCH 0659/1449] fix #76149 --- .../browser/actions/developerActions.ts | 199 ++++++++++++++++++ .../browser/actions/windowActions.ts | 40 +++- .../workbench/browser/web.simpleservices.ts | 2 + .../electron-browser/remote.contribution.ts | 2 +- .../actions/developerActions.ts | 183 ---------------- .../electron-browser/actions/windowActions.ts | 20 -- .../electron-browser/main.contribution.ts | 14 +- src/vs/workbench/workbench.main.ts | 1 + src/vs/workbench/workbench.web.main.ts | 1 + 9 files changed, 242 insertions(+), 220 deletions(-) create mode 100644 src/vs/workbench/browser/actions/developerActions.ts diff --git a/src/vs/workbench/browser/actions/developerActions.ts b/src/vs/workbench/browser/actions/developerActions.ts new file mode 100644 index 00000000000..60c6f23f234 --- /dev/null +++ b/src/vs/workbench/browser/actions/developerActions.ts @@ -0,0 +1,199 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Action } from 'vs/base/common/actions'; +import { IWindowService } from 'vs/platform/windows/common/windows'; +import * as nls from 'vs/nls'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { domEvent } from 'vs/base/browser/event'; +import { Event } from 'vs/base/common/event'; +import { IDisposable, toDisposable, dispose, Disposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { getDomNodePagePosition, createStyleSheet, createCSSRule, append, $ } from 'vs/base/browser/dom'; +import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { Context } from 'vs/platform/contextkey/browser/contextKeyService'; +import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { timeout } from 'vs/base/common/async'; +import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; +import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/actions'; + +export class InspectContextKeysAction extends Action { + + static readonly ID = 'workbench.action.inspectContextKeys'; + static LABEL = nls.localize('inspect context keys', "Inspect Context Keys"); + + constructor( + id: string, + label: string, + @IContextKeyService private readonly contextKeyService: IContextKeyService, + @IWindowService private readonly windowService: IWindowService, + ) { + super(id, label); + } + + run(): Promise { + const disposables = new DisposableStore(); + + const stylesheet = createStyleSheet(); + disposables.add(toDisposable(() => { + if (stylesheet.parentNode) { + stylesheet.parentNode.removeChild(stylesheet); + } + })); + createCSSRule('*', 'cursor: crosshair !important;', stylesheet); + + const hoverFeedback = document.createElement('div'); + document.body.appendChild(hoverFeedback); + disposables.add(toDisposable(() => document.body.removeChild(hoverFeedback))); + + hoverFeedback.style.position = 'absolute'; + hoverFeedback.style.pointerEvents = 'none'; + hoverFeedback.style.backgroundColor = 'rgba(255, 0, 0, 0.5)'; + hoverFeedback.style.zIndex = '1000'; + + const onMouseMove = domEvent(document.body, 'mousemove', true); + disposables.add(onMouseMove(e => { + const target = e.target as HTMLElement; + const position = getDomNodePagePosition(target); + + hoverFeedback.style.top = `${position.top}px`; + hoverFeedback.style.left = `${position.left}px`; + hoverFeedback.style.width = `${position.width}px`; + hoverFeedback.style.height = `${position.height}px`; + })); + + const onMouseDown = Event.once(domEvent(document.body, 'mousedown', true)); + onMouseDown(e => { e.preventDefault(); e.stopPropagation(); }, null, disposables); + + const onMouseUp = Event.once(domEvent(document.body, 'mouseup', true)); + onMouseUp(e => { + e.preventDefault(); + e.stopPropagation(); + + const context = this.contextKeyService.getContext(e.target as HTMLElement) as Context; + console.log(context.collectAllValues()); + this.windowService.openDevTools(); + + dispose(disposables); + }, null, disposables); + + return Promise.resolve(); + } +} + +export class ToggleScreencastModeAction extends Action { + + static readonly ID = 'workbench.action.toggleScreencastMode'; + static LABEL = nls.localize('toggle screencast mode', "Toggle Screencast Mode"); + + static disposable: IDisposable | undefined; + + constructor( + id: string, + label: string, + @IKeybindingService private readonly keybindingService: IKeybindingService, + @IWorkbenchLayoutService private readonly layoutService: IWorkbenchLayoutService + ) { + super(id, label); + } + + async run(): Promise { + if (ToggleScreencastModeAction.disposable) { + ToggleScreencastModeAction.disposable.dispose(); + ToggleScreencastModeAction.disposable = undefined; + return; + } + + const container = this.layoutService.getWorkbenchElement(); + + const mouseMarker = append(container, $('div')); + mouseMarker.style.position = 'absolute'; + mouseMarker.style.border = '2px solid red'; + mouseMarker.style.borderRadius = '20px'; + mouseMarker.style.width = '20px'; + mouseMarker.style.height = '20px'; + mouseMarker.style.top = '0'; + mouseMarker.style.left = '0'; + mouseMarker.style.zIndex = '100000'; + mouseMarker.style.content = ' '; + mouseMarker.style.pointerEvents = 'none'; + mouseMarker.style.display = 'none'; + + const onMouseDown = domEvent(container, 'mousedown', true); + const onMouseUp = domEvent(container, 'mouseup', true); + const onMouseMove = domEvent(container, 'mousemove', true); + + const mouseListener = onMouseDown(e => { + mouseMarker.style.top = `${e.clientY - 10}px`; + mouseMarker.style.left = `${e.clientX - 10}px`; + mouseMarker.style.display = 'block'; + + const mouseMoveListener = onMouseMove(e => { + mouseMarker.style.top = `${e.clientY - 10}px`; + mouseMarker.style.left = `${e.clientX - 10}px`; + }); + + Event.once(onMouseUp)(() => { + mouseMarker.style.display = 'none'; + mouseMoveListener.dispose(); + }); + }); + + const keyboardMarker = append(container, $('div')); + keyboardMarker.style.position = 'absolute'; + keyboardMarker.style.backgroundColor = 'rgba(0, 0, 0 ,0.5)'; + keyboardMarker.style.width = '100%'; + keyboardMarker.style.height = '100px'; + keyboardMarker.style.bottom = '20%'; + keyboardMarker.style.left = '0'; + keyboardMarker.style.zIndex = '100000'; + keyboardMarker.style.pointerEvents = 'none'; + keyboardMarker.style.color = 'white'; + keyboardMarker.style.lineHeight = '100px'; + keyboardMarker.style.textAlign = 'center'; + keyboardMarker.style.fontSize = '56px'; + keyboardMarker.style.display = 'none'; + + const onKeyDown = domEvent(container, 'keydown', true); + let keyboardTimeout: IDisposable = Disposable.None; + + const keyboardListener = onKeyDown(e => { + keyboardTimeout.dispose(); + + const event = new StandardKeyboardEvent(e); + const keybinding = this.keybindingService.resolveKeyboardEvent(event); + const label = keybinding.getLabel(); + + if (!event.ctrlKey && !event.altKey && !event.metaKey && !event.shiftKey && this.keybindingService.mightProducePrintableCharacter(event) && label) { + keyboardMarker.textContent += ' ' + label; + } else { + keyboardMarker.textContent = label; + } + + keyboardMarker.style.display = 'block'; + + const promise = timeout(800); + keyboardTimeout = toDisposable(() => promise.cancel()); + + promise.then(() => { + keyboardMarker.textContent = ''; + keyboardMarker.style.display = 'none'; + }); + }); + + ToggleScreencastModeAction.disposable = toDisposable(() => { + mouseListener.dispose(); + keyboardListener.dispose(); + mouseMarker.remove(); + keyboardMarker.remove(); + }); + } +} + +const developerCategory = nls.localize('developer', "Developer"); +const registry = Registry.as(Extensions.WorkbenchActions); +registry.registerWorkbenchAction(new SyncActionDescriptor(InspectContextKeysAction, InspectContextKeysAction.ID, InspectContextKeysAction.LABEL), 'Developer: Inspect Context Keys', developerCategory); +registry.registerWorkbenchAction(new SyncActionDescriptor(ToggleScreencastModeAction, ToggleScreencastModeAction.ID, ToggleScreencastModeAction.LABEL), 'Developer: Toggle Screencast Mode', developerCategory); diff --git a/src/vs/workbench/browser/actions/windowActions.ts b/src/vs/workbench/browser/actions/windowActions.ts index 744f230607d..cc2ad1776af 100644 --- a/src/vs/workbench/browser/actions/windowActions.ts +++ b/src/vs/workbench/browser/actions/windowActions.ts @@ -9,12 +9,10 @@ import { IWindowService } from 'vs/platform/windows/common/windows'; import { SyncActionDescriptor, MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; import { Registry } from 'vs/platform/registry/common/platform'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; -import { IsFullscreenContext } from 'vs/workbench/browser/contextkeys'; +import { IsFullscreenContext, IsDevelopmentContext } from 'vs/workbench/browser/contextkeys'; import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/actions'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; - -const registry = Registry.as(Extensions.WorkbenchActions); -const viewCategory = nls.localize('view', "View"); +import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; export class ToggleFullScreenAction extends Action { @@ -31,12 +29,46 @@ export class ToggleFullScreenAction extends Action { run(): Promise { const container = this.layoutService.getWorkbenchElement(); + return this.windowService.toggleFullScreen(container); } } +export class ReloadWindowAction extends Action { + + static readonly ID = 'workbench.action.reloadWindow'; + static LABEL = nls.localize('reloadWindow', "Reload Window"); + + constructor( + id: string, + label: string, + @IWindowService private readonly windowService: IWindowService + ) { + super(id, label); + } + + async run(): Promise { + await this.windowService.reloadWindow(); + + return true; + } +} + +const registry = Registry.as(Extensions.WorkbenchActions); + +const viewCategory = nls.localize('view', "View"); registry.registerWorkbenchAction(new SyncActionDescriptor(ToggleFullScreenAction, ToggleFullScreenAction.ID, ToggleFullScreenAction.LABEL, { primary: KeyCode.F11, mac: { primary: KeyMod.CtrlCmd | KeyMod.WinCtrl | KeyCode.KEY_F } }), 'View: Toggle Full Screen', viewCategory); +const developerCategory = nls.localize('developer', "Developer"); +registry.registerWorkbenchAction(new SyncActionDescriptor(ReloadWindowAction, ReloadWindowAction.ID, ReloadWindowAction.LABEL), 'Developer: Reload Window', developerCategory); + +KeybindingsRegistry.registerKeybindingRule({ + id: ReloadWindowAction.ID, + weight: KeybindingWeight.WorkbenchContrib + 50, + when: IsDevelopmentContext, + primary: KeyMod.CtrlCmd | KeyCode.KEY_R +}); + // Appereance menu MenuRegistry.appendMenuItem(MenuId.MenubarAppearanceMenu, { group: '1_toggle_view', diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index 17851c24994..6df0b784daf 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -797,6 +797,8 @@ export class SimpleWindowService extends Disposable implements IWindowService { } reloadWindow(): Promise { + window.location.reload(); + return Promise.resolve(); } diff --git a/src/vs/workbench/contrib/remote/electron-browser/remote.contribution.ts b/src/vs/workbench/contrib/remote/electron-browser/remote.contribution.ts index d211130515b..78264965a27 100644 --- a/src/vs/workbench/contrib/remote/electron-browser/remote.contribution.ts +++ b/src/vs/workbench/contrib/remote/electron-browser/remote.contribution.ts @@ -34,7 +34,7 @@ import { PersistenConnectionEventType } from 'vs/platform/remote/common/remoteAg import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; import Severity from 'vs/base/common/severity'; -import { ReloadWindowAction } from 'vs/workbench/electron-browser/actions/windowActions'; +import { ReloadWindowAction } from 'vs/workbench/browser/actions/windowActions'; import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { IWindowsService } from 'vs/platform/windows/common/windows'; import { RemoteConnectionState } from 'vs/workbench/browser/contextkeys'; diff --git a/src/vs/workbench/electron-browser/actions/developerActions.ts b/src/vs/workbench/electron-browser/actions/developerActions.ts index 811c9ecac13..4da3b429e48 100644 --- a/src/vs/workbench/electron-browser/actions/developerActions.ts +++ b/src/vs/workbench/electron-browser/actions/developerActions.ts @@ -6,16 +6,6 @@ import { Action } from 'vs/base/common/actions'; import { IWindowService, IWindowsService } from 'vs/platform/windows/common/windows'; import * as nls from 'vs/nls'; -import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { domEvent } from 'vs/base/browser/event'; -import { Event } from 'vs/base/common/event'; -import { IDisposable, toDisposable, dispose, Disposable, DisposableStore } from 'vs/base/common/lifecycle'; -import { getDomNodePagePosition, createStyleSheet, createCSSRule, append, $ } from 'vs/base/browser/dom'; -import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { Context } from 'vs/platform/contextkey/browser/contextKeyService'; -import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import { timeout } from 'vs/base/common/async'; -import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; export class ToggleDevToolsAction extends Action { @@ -44,176 +34,3 @@ export class ToggleSharedProcessAction extends Action { return this.windowsService.toggleSharedProcess(); } } - -export class InspectContextKeysAction extends Action { - - static readonly ID = 'workbench.action.inspectContextKeys'; - static LABEL = nls.localize('inspect context keys', "Inspect Context Keys"); - - constructor( - id: string, - label: string, - @IContextKeyService private readonly contextKeyService: IContextKeyService, - @IWindowService private readonly windowService: IWindowService, - ) { - super(id, label); - } - - run(): Promise { - const disposables = new DisposableStore(); - - const stylesheet = createStyleSheet(); - disposables.add(toDisposable(() => { - if (stylesheet.parentNode) { - stylesheet.parentNode.removeChild(stylesheet); - } - })); - createCSSRule('*', 'cursor: crosshair !important;', stylesheet); - - const hoverFeedback = document.createElement('div'); - document.body.appendChild(hoverFeedback); - disposables.add(toDisposable(() => document.body.removeChild(hoverFeedback))); - - hoverFeedback.style.position = 'absolute'; - hoverFeedback.style.pointerEvents = 'none'; - hoverFeedback.style.backgroundColor = 'rgba(255, 0, 0, 0.5)'; - hoverFeedback.style.zIndex = '1000'; - - const onMouseMove = domEvent(document.body, 'mousemove', true); - disposables.add(onMouseMove(e => { - const target = e.target as HTMLElement; - const position = getDomNodePagePosition(target); - - hoverFeedback.style.top = `${position.top}px`; - hoverFeedback.style.left = `${position.left}px`; - hoverFeedback.style.width = `${position.width}px`; - hoverFeedback.style.height = `${position.height}px`; - })); - - const onMouseDown = Event.once(domEvent(document.body, 'mousedown', true)); - onMouseDown(e => { e.preventDefault(); e.stopPropagation(); }, null, disposables); - - const onMouseUp = Event.once(domEvent(document.body, 'mouseup', true)); - onMouseUp(e => { - e.preventDefault(); - e.stopPropagation(); - - const context = this.contextKeyService.getContext(e.target as HTMLElement) as Context; - console.log(context.collectAllValues()); - this.windowService.openDevTools(); - - dispose(disposables); - }, null, disposables); - - return Promise.resolve(); - } -} - -export class ToggleScreencastModeAction extends Action { - - static readonly ID = 'workbench.action.toggleScreencastMode'; - static LABEL = nls.localize('toggle screencast mode', "Toggle Screencast Mode"); - - static disposable: IDisposable | undefined; - - constructor( - id: string, - label: string, - @IKeybindingService private readonly keybindingService: IKeybindingService, - @IWorkbenchLayoutService private readonly layoutService: IWorkbenchLayoutService - ) { - super(id, label); - } - - async run(): Promise { - if (ToggleScreencastModeAction.disposable) { - ToggleScreencastModeAction.disposable.dispose(); - ToggleScreencastModeAction.disposable = undefined; - return; - } - - const container = this.layoutService.getWorkbenchElement(); - - const mouseMarker = append(container, $('div')); - mouseMarker.style.position = 'absolute'; - mouseMarker.style.border = '2px solid red'; - mouseMarker.style.borderRadius = '20px'; - mouseMarker.style.width = '20px'; - mouseMarker.style.height = '20px'; - mouseMarker.style.top = '0'; - mouseMarker.style.left = '0'; - mouseMarker.style.zIndex = '100000'; - mouseMarker.style.content = ' '; - mouseMarker.style.pointerEvents = 'none'; - mouseMarker.style.display = 'none'; - - const onMouseDown = domEvent(container, 'mousedown', true); - const onMouseUp = domEvent(container, 'mouseup', true); - const onMouseMove = domEvent(container, 'mousemove', true); - - const mouseListener = onMouseDown(e => { - mouseMarker.style.top = `${e.clientY - 10}px`; - mouseMarker.style.left = `${e.clientX - 10}px`; - mouseMarker.style.display = 'block'; - - const mouseMoveListener = onMouseMove(e => { - mouseMarker.style.top = `${e.clientY - 10}px`; - mouseMarker.style.left = `${e.clientX - 10}px`; - }); - - Event.once(onMouseUp)(() => { - mouseMarker.style.display = 'none'; - mouseMoveListener.dispose(); - }); - }); - - const keyboardMarker = append(container, $('div')); - keyboardMarker.style.position = 'absolute'; - keyboardMarker.style.backgroundColor = 'rgba(0, 0, 0 ,0.5)'; - keyboardMarker.style.width = '100%'; - keyboardMarker.style.height = '100px'; - keyboardMarker.style.bottom = '20%'; - keyboardMarker.style.left = '0'; - keyboardMarker.style.zIndex = '100000'; - keyboardMarker.style.pointerEvents = 'none'; - keyboardMarker.style.color = 'white'; - keyboardMarker.style.lineHeight = '100px'; - keyboardMarker.style.textAlign = 'center'; - keyboardMarker.style.fontSize = '56px'; - keyboardMarker.style.display = 'none'; - - const onKeyDown = domEvent(container, 'keydown', true); - let keyboardTimeout: IDisposable = Disposable.None; - - const keyboardListener = onKeyDown(e => { - keyboardTimeout.dispose(); - - const event = new StandardKeyboardEvent(e); - const keybinding = this.keybindingService.resolveKeyboardEvent(event); - const label = keybinding.getLabel(); - - if (!event.ctrlKey && !event.altKey && !event.metaKey && !event.shiftKey && this.keybindingService.mightProducePrintableCharacter(event) && label) { - keyboardMarker.textContent += ' ' + label; - } else { - keyboardMarker.textContent = label; - } - - keyboardMarker.style.display = 'block'; - - const promise = timeout(800); - keyboardTimeout = toDisposable(() => promise.cancel()); - - promise.then(() => { - keyboardMarker.textContent = ''; - keyboardMarker.style.display = 'none'; - }); - }); - - ToggleScreencastModeAction.disposable = toDisposable(() => { - mouseListener.dispose(); - keyboardListener.dispose(); - mouseMarker.remove(); - keyboardMarker.remove(); - }); - } -} diff --git a/src/vs/workbench/electron-browser/actions/windowActions.ts b/src/vs/workbench/electron-browser/actions/windowActions.ts index 1277463c355..58b52edeb51 100644 --- a/src/vs/workbench/electron-browser/actions/windowActions.ts +++ b/src/vs/workbench/electron-browser/actions/windowActions.ts @@ -150,26 +150,6 @@ export class ZoomResetAction extends BaseZoomAction { } } -export class ReloadWindowAction extends Action { - - static readonly ID = 'workbench.action.reloadWindow'; - static LABEL = nls.localize('reloadWindow', "Reload Window"); - - constructor( - id: string, - label: string, - @IWindowService private readonly windowService: IWindowService - ) { - super(id, label); - } - - async run(): Promise { - await this.windowService.reloadWindow(); - - return true; - } -} - export class ReloadWindowWithExtensionsDisabledAction extends Action { static readonly ID = 'workbench.action.reloadWindowWithExtensionsDisabled'; diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index e6adc96847a..9d2b119c091 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -12,8 +12,8 @@ import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/action import { KeyMod, KeyChord, KeyCode } from 'vs/base/common/keyCodes'; import { isWindows, isLinux, isMacintosh } from 'vs/base/common/platform'; import { KeybindingsReferenceAction, OpenDocumentationUrlAction, OpenIntroductoryVideosUrlAction, OpenTipsAndTricksUrlAction, OpenTwitterUrlAction, OpenRequestFeatureUrlAction, OpenPrivacyStatementUrlAction, OpenLicenseUrlAction, OpenNewsletterSignupUrlAction } from 'vs/workbench/electron-browser/actions/helpActions'; -import { ToggleSharedProcessAction, InspectContextKeysAction, ToggleScreencastModeAction, ToggleDevToolsAction } from 'vs/workbench/electron-browser/actions/developerActions'; -import { ShowAboutDialogAction, ZoomResetAction, ZoomOutAction, ZoomInAction, CloseCurrentWindowAction, SwitchWindow, NewWindowAction, QuickSwitchWindow, QuickOpenRecentAction, inRecentFilesPickerContextKey, OpenRecentAction, ReloadWindowWithExtensionsDisabledAction, NewWindowTabHandler, ReloadWindowAction, ShowPreviousWindowTabHandler, ShowNextWindowTabHandler, MoveWindowTabToNewWindowHandler, MergeWindowTabsHandlerHandler, ToggleWindowTabsBarHandler } from 'vs/workbench/electron-browser/actions/windowActions'; +import { ToggleSharedProcessAction, ToggleDevToolsAction } from 'vs/workbench/electron-browser/actions/developerActions'; +import { ShowAboutDialogAction, ZoomResetAction, ZoomOutAction, ZoomInAction, CloseCurrentWindowAction, SwitchWindow, NewWindowAction, QuickSwitchWindow, QuickOpenRecentAction, inRecentFilesPickerContextKey, OpenRecentAction, ReloadWindowWithExtensionsDisabledAction, NewWindowTabHandler, ShowPreviousWindowTabHandler, ShowNextWindowTabHandler, MoveWindowTabToNewWindowHandler, MergeWindowTabsHandlerHandler, ToggleWindowTabsBarHandler } from 'vs/workbench/electron-browser/actions/windowActions'; import { AddRootFolderAction, GlobalRemoveRootFolderAction, SaveWorkspaceAsAction, OpenWorkspaceConfigFileAction, DuplicateWorkspaceInNewWindowAction, CloseWorkspaceAction } from 'vs/workbench/browser/actions/workspaceActions'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { inQuickOpenContext, getQuickNavigateHandler } from 'vs/workbench/browser/parts/quickopen/quickopen'; @@ -149,20 +149,10 @@ import product from 'vs/platform/product/node/product'; (function registerDeveloperActions(): void { const developerCategory = nls.localize('developer', "Developer"); registry.registerWorkbenchAction(new SyncActionDescriptor(ToggleSharedProcessAction, ToggleSharedProcessAction.ID, ToggleSharedProcessAction.LABEL), 'Developer: Toggle Shared Process', developerCategory); - registry.registerWorkbenchAction(new SyncActionDescriptor(InspectContextKeysAction, InspectContextKeysAction.ID, InspectContextKeysAction.LABEL), 'Developer: Inspect Context Keys', developerCategory); - registry.registerWorkbenchAction(new SyncActionDescriptor(ToggleScreencastModeAction, ToggleScreencastModeAction.ID, ToggleScreencastModeAction.LABEL), 'Developer: Toggle Screencast Mode', developerCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(ReloadWindowWithExtensionsDisabledAction, ReloadWindowWithExtensionsDisabledAction.ID, ReloadWindowWithExtensionsDisabledAction.LABEL), 'Developer: Reload Window With Extensions Disabled', developerCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(LogStorageAction, LogStorageAction.ID, LogStorageAction.LABEL), 'Developer: Log Storage Database Contents', developerCategory); - registry.registerWorkbenchAction(new SyncActionDescriptor(ReloadWindowAction, ReloadWindowAction.ID, ReloadWindowAction.LABEL), 'Developer: Reload Window', developerCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(ToggleDevToolsAction, ToggleDevToolsAction.ID, ToggleDevToolsAction.LABEL), 'Developer: Toggle Developer Tools', developerCategory); - KeybindingsRegistry.registerKeybindingRule({ - id: ReloadWindowAction.ID, - weight: KeybindingWeight.WorkbenchContrib + 50, - when: IsDevelopmentContext, - primary: KeyMod.CtrlCmd | KeyCode.KEY_R - }); - KeybindingsRegistry.registerKeybindingRule({ id: ToggleDevToolsAction.ID, weight: KeybindingWeight.WorkbenchContrib + 50, diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index 1175acef2f5..8535066a63b 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -21,6 +21,7 @@ import 'vs/workbench/electron-browser/main'; import 'vs/workbench/browser/actions/layoutActions'; import 'vs/workbench/browser/actions/windowActions'; +import 'vs/workbench/browser/actions/developerActions'; import 'vs/workbench/browser/actions/listCommands'; import 'vs/workbench/browser/actions/navigationActions'; import 'vs/workbench/browser/parts/quickopen/quickOpenActions'; diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index 456e293452b..c28adc0ad98 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -20,6 +20,7 @@ import 'vs/workbench/browser/web.main'; import 'vs/workbench/browser/actions/layoutActions'; import 'vs/workbench/browser/actions/windowActions'; +import 'vs/workbench/browser/actions/developerActions'; import 'vs/workbench/browser/actions/listCommands'; import 'vs/workbench/browser/actions/navigationActions'; import 'vs/workbench/browser/parts/quickopen/quickOpenActions'; From f9587710deadfdef6a03b5a7492e9056c2f72235 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 26 Jun 2019 07:56:41 +0200 Subject: [PATCH 0660/1449] web - document some API --- src/vs/workbench/workbench.web.api.ts | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/vs/workbench/workbench.web.api.ts b/src/vs/workbench/workbench.web.api.ts index d8070d0ce4c..30d2fd8b79b 100644 --- a/src/vs/workbench/workbench.web.api.ts +++ b/src/vs/workbench/workbench.web.api.ts @@ -9,13 +9,33 @@ import { UriComponents } from 'vs/base/common/uri'; import { Event } from 'vs/base/common/event'; export interface IWorkbenchConstructionOptions { + + /** + * Experimental: the remote authority is the IP:PORT from where the workbench is served + * from. It is for example being used for the websocket connections as address. + */ remoteAuthority: string; + /** + * Experimental: An endpoint to serve iframe content ("webview") from. This is required + * to provide full security isolation from the workbench host. + */ webviewEndpoint?: string; + /** + * Experimental: An optional folder that is set as workspace context for the workbench. + */ folderUri?: UriComponents; + + /** + * Experimental: An optional workspace that is set as workspace context for the workbench. + */ workspaceUri?: UriComponents; + /** + * Experimental: The userData namespace is used to handle user specific application + * data like settings, keybindings, UI state and snippets. + */ userData?: { read(key: string): Promise; write(key: string, value: string): Promise; @@ -23,6 +43,12 @@ export interface IWorkbenchConstructionOptions { }; } +/** + * Experimental: Creates the workbench with the provided options in the provided container. + * + * @param domElement the container to create the workbench in + * @param options for setting up the workbench + */ function create(domElement: HTMLElement, options: IWorkbenchConstructionOptions): Promise { return main(domElement, options); } From 30b6b2e992971e8687b139ed5d3dd63b8e86fea9 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 26 Jun 2019 08:32:36 +0200 Subject: [PATCH 0661/1449] :lipstick: workbench API --- src/vs/workbench/workbench.web.api.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/workbench.web.api.ts b/src/vs/workbench/workbench.web.api.ts index 30d2fd8b79b..1fda1a6beca 100644 --- a/src/vs/workbench/workbench.web.api.ts +++ b/src/vs/workbench/workbench.web.api.ts @@ -7,6 +7,7 @@ import 'vs/workbench/workbench.web.main'; import { main } from 'vs/workbench/browser/web.main'; import { UriComponents } from 'vs/base/common/uri'; import { Event } from 'vs/base/common/event'; +import { VSBuffer } from 'vs/base/common/buffer'; export interface IWorkbenchConstructionOptions { @@ -36,10 +37,15 @@ export interface IWorkbenchConstructionOptions { * Experimental: The userData namespace is used to handle user specific application * data like settings, keybindings, UI state and snippets. */ - userData?: { - read(key: string): Promise; - write(key: string, value: string): Promise; - onDidChange: Event; + userDataProvider?: { + readonly onDidChangeFile: Event; + + readFile(path: string): Promise; + readDirectory(path: string): Promise; + + writeFile(path: string, content: VSBuffer): Promise; + + delete(path: string): Promise; }; } From 87d19fe45e82b1061aeb392eab1fbad8504e2ac5 Mon Sep 17 00:00:00 2001 From: ironyman Date: Wed, 26 Jun 2019 00:38:17 -0700 Subject: [PATCH 0662/1449] Add border between tabs and breadcrumbs in HC --- .../browser/parts/editor/tabsTitleControl.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts index 667ec403730..8fa00b20595 100644 --- a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts +++ b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts @@ -24,7 +24,7 @@ import { IDisposable, dispose, DisposableStore, combinedDisposable, MutableDispo import { ScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement'; import { ScrollbarVisibility } from 'vs/base/common/scrollable'; import { getOrSet } from 'vs/base/common/map'; -import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; +import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector, HIGH_CONTRAST } from 'vs/platform/theme/common/themeService'; import { TAB_INACTIVE_BACKGROUND, TAB_ACTIVE_BACKGROUND, TAB_ACTIVE_FOREGROUND, TAB_INACTIVE_FOREGROUND, TAB_BORDER, EDITOR_DRAG_AND_DROP_BACKGROUND, TAB_UNFOCUSED_ACTIVE_FOREGROUND, TAB_UNFOCUSED_INACTIVE_FOREGROUND, TAB_UNFOCUSED_ACTIVE_BACKGROUND, TAB_UNFOCUSED_ACTIVE_BORDER, TAB_ACTIVE_BORDER, TAB_HOVER_BACKGROUND, TAB_HOVER_BORDER, TAB_UNFOCUSED_HOVER_BACKGROUND, TAB_UNFOCUSED_HOVER_BORDER, EDITOR_GROUP_HEADER_TABS_BACKGROUND, WORKBENCH_BACKGROUND, TAB_ACTIVE_BORDER_TOP, TAB_UNFOCUSED_ACTIVE_BORDER_TOP, TAB_ACTIVE_MODIFIED_BORDER, TAB_INACTIVE_MODIFIED_BORDER, TAB_UNFOCUSED_ACTIVE_MODIFIED_BORDER, TAB_UNFOCUSED_INACTIVE_MODIFIED_BORDER } from 'vs/workbench/common/theme'; import { activeContrastBorder, contrastBorder, editorBackground, breadcrumbsBackground } from 'vs/platform/theme/common/colorRegistry'; import { ResourcesDropHandler, fillResourceDataTransfers, DraggedEditorIdentifier, DraggedEditorGroupIdentifier, DragAndDropObserver } from 'vs/workbench/browser/dnd'; @@ -1154,7 +1154,15 @@ export class TabsTitleControl extends TitleControl { } registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { - + // Add border between tabs and breadcrumbs in high contrast mode. + if (theme.type === HIGH_CONTRAST) { + const borderColor = (theme.getColor(TAB_BORDER) || theme.getColor(contrastBorder)); + collector.addRule(` + .monaco-workbench div.tabs-and-actions-container { + border-bottom: 1px solid ${borderColor}; + } + `); + } // Styling with Outline color (e.g. high contrast theme) const activeContrastBorderColor = theme.getColor(activeContrastBorder); if (activeContrastBorderColor) { From 86306cce8a7bf5320b7d320196401b39bb8835a1 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 26 Jun 2019 11:06:41 +0200 Subject: [PATCH 0663/1449] disable arm and alpine for stable fixes #76159 --- build/azure-pipelines/product-build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 60d99b36ed4..85de2d3f351 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -51,7 +51,7 @@ jobs: - template: linux/snap-build-linux.yml - job: LinuxArmhf - condition: eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true') + condition: and(eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) timeoutInMinutes: 120 pool: vmImage: 'Ubuntu-16.04' @@ -61,7 +61,7 @@ jobs: - template: linux/product-build-linux-arm.yml - job: LinuxAlpine - condition: eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true') + condition: and(eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable'))) timeoutInMinutes: 120 pool: vmImage: 'Ubuntu-16.04' From b266566c3b65f500c26588049a010a11123a1686 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Wed, 26 Jun 2019 11:11:56 +0200 Subject: [PATCH 0664/1449] Fix extra auto complete on fast delete (#74675) Fixes #vscode-remote-release/4 --- .../dialogs/browser/remoteFileDialog.ts | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts b/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts index 6a3b741424e..0ae7ef8a596 100644 --- a/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts +++ b/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts @@ -331,6 +331,7 @@ export class RemoteFileDialog { } } else { this.filePickBox.activeItems = []; + this.userEnteredPathSegment = ''; } } } catch { @@ -369,7 +370,11 @@ export class RemoteFileDialog { } private constructFullUserPath(): string { - return this.pathAppend(this.currentFolder, this.userEnteredPathSegment); + if (equalsIgnoreCase(this.filePickBox.value.substr(0, this.userEnteredPathSegment.length), this.userEnteredPathSegment)) { + return this.pathFromUri(this.currentFolder); + } else { + return this.pathAppend(this.currentFolder, this.userEnteredPathSegment); + } } private filePickBoxValue(): URI { @@ -492,11 +497,13 @@ export class RemoteFileDialog { const userPath = this.constructFullUserPath(); if (equalsIgnoreCase(userPath, value.substring(0, userPath.length))) { let hasMatch = false; - for (let i = 0; i < this.filePickBox.items.length; i++) { - const item = this.filePickBox.items[i]; - if (this.setAutoComplete(value, inputBasename, item)) { - hasMatch = true; - break; + if (inputBasename.length > this.userEnteredPathSegment.length) { + for (let i = 0; i < this.filePickBox.items.length; i++) { + const item = this.filePickBox.items[i]; + if (this.setAutoComplete(value, inputBasename, item)) { + hasMatch = true; + break; + } } } if (!hasMatch) { @@ -505,11 +512,7 @@ export class RemoteFileDialog { this.filePickBox.activeItems = []; } } else { - if (!equalsIgnoreCase(inputBasename, resources.basename(this.currentFolder))) { - this.userEnteredPathSegment = inputBasename; - } else { - this.userEnteredPathSegment = ''; - } + this.userEnteredPathSegment = inputBasename; this.autoCompletePathSegment = ''; } } From f15e5a706bc6bb756d3ae66a422baf188aefdb78 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 26 Jun 2019 11:17:26 +0200 Subject: [PATCH 0665/1449] use yarn --frozen-lockfile for builds --- build/azure-pipelines/darwin/continuous-build-darwin.yml | 2 +- build/azure-pipelines/darwin/product-build-darwin.yml | 2 +- build/azure-pipelines/linux/continuous-build-linux.yml | 2 +- .../azure-pipelines/linux/product-build-linux-alpine.yml | 2 +- build/azure-pipelines/linux/product-build-linux-arm.yml | 2 +- build/azure-pipelines/linux/product-build-linux.yml | 2 +- build/azure-pipelines/win32/continuous-build-win32.yml | 2 +- build/azure-pipelines/win32/product-build-win32.yml | 2 +- build/npm/postinstall.js | 9 +++------ 9 files changed, 11 insertions(+), 14 deletions(-) diff --git a/build/azure-pipelines/darwin/continuous-build-darwin.yml b/build/azure-pipelines/darwin/continuous-build-darwin.yml index 776c1172bea..d84beb2e597 100644 --- a/build/azure-pipelines/darwin/continuous-build-darwin.yml +++ b/build/azure-pipelines/darwin/continuous-build-darwin.yml @@ -11,7 +11,7 @@ steps: inputs: versionSpec: "1.10.1" - script: | - yarn + yarn --frozen-lockfile displayName: Install Dependencies condition: ne(variables['CacheRestored'], 'true') - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index 0b9a362c075..5cb5d7243d2 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -37,7 +37,7 @@ steps: - script: | set -e - yarn + yarn --frozen-lockfile displayName: Install dependencies - script: | diff --git a/build/azure-pipelines/linux/continuous-build-linux.yml b/build/azure-pipelines/linux/continuous-build-linux.yml index ee47a8d4320..bce42a665fe 100644 --- a/build/azure-pipelines/linux/continuous-build-linux.yml +++ b/build/azure-pipelines/linux/continuous-build-linux.yml @@ -19,7 +19,7 @@ steps: inputs: versionSpec: "1.10.1" - script: | - yarn + yarn --frozen-lockfile displayName: Install Dependencies condition: ne(variables['CacheRestored'], 'true') - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 diff --git a/build/azure-pipelines/linux/product-build-linux-alpine.yml b/build/azure-pipelines/linux/product-build-linux-alpine.yml index 107f7fa0cec..5bce791dcf6 100644 --- a/build/azure-pipelines/linux/product-build-linux-alpine.yml +++ b/build/azure-pipelines/linux/product-build-linux-alpine.yml @@ -46,7 +46,7 @@ steps: - script: | set -e - CHILD_CONCURRENCY=1 yarn + CHILD_CONCURRENCY=1 yarn --frozen-lockfile displayName: Install dependencies - script: | diff --git a/build/azure-pipelines/linux/product-build-linux-arm.yml b/build/azure-pipelines/linux/product-build-linux-arm.yml index ffa6d18f68e..6aac72535bc 100644 --- a/build/azure-pipelines/linux/product-build-linux-arm.yml +++ b/build/azure-pipelines/linux/product-build-linux-arm.yml @@ -46,7 +46,7 @@ steps: - script: | set -e - CHILD_CONCURRENCY=1 yarn + CHILD_CONCURRENCY=1 yarn --frozen-lockfile displayName: Install dependencies - script: | diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 210798a4776..a93dd8edd0d 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -38,7 +38,7 @@ steps: - script: | set -e - CHILD_CONCURRENCY=1 yarn + CHILD_CONCURRENCY=1 yarn --frozen-lockfile displayName: Install dependencies - script: | diff --git a/build/azure-pipelines/win32/continuous-build-win32.yml b/build/azure-pipelines/win32/continuous-build-win32.yml index 36336276814..85d648e8f41 100644 --- a/build/azure-pipelines/win32/continuous-build-win32.yml +++ b/build/azure-pipelines/win32/continuous-build-win32.yml @@ -15,7 +15,7 @@ steps: targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: '$(ArtifactFeed)' - powershell: | - yarn + yarn --frozen-lockfile displayName: Install Dependencies condition: ne(variables['CacheRestored'], 'true') - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 6efaa050dcc..06c6342b81e 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -40,7 +40,7 @@ steps: $ErrorActionPreference = "Stop" $env:npm_config_arch="$(VSCODE_ARCH)" $env:CHILD_CONCURRENCY="1" - exec { yarn } + exec { yarn --frozen-lockfile } displayName: Install dependencies - powershell: | diff --git a/build/npm/postinstall.js b/build/npm/postinstall.js index edc5e35ade3..80a4f0eeb5c 100644 --- a/build/npm/postinstall.js +++ b/build/npm/postinstall.js @@ -20,13 +20,10 @@ function yarnInstall(location, opts) { const raw = process.env['npm_config_argv'] || '{}'; const argv = JSON.parse(raw); const original = argv.original || []; - const args = ['install']; + const args = original.filter(arg => arg === '--ignore-optional' || arg === '--frozen-lockfile'); - if (original.indexOf('--ignore-optional') > -1) { - args.push('--ignore-optional'); - } - - console.log('Installing dependencies in \'%s\'.', location); + console.log(`Installing dependencies in ${location}...`); + console.log(`$ yarn ${args.join(' ')}`); const result = cp.spawnSync(yarn, args, opts); if (result.error || result.status !== 0) { From aae636e246a90f3ceeb8a96986cafacaab89fc27 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 26 Jun 2019 11:19:19 +0200 Subject: [PATCH 0666/1449] remove `update.enableWindowsBackgroundUpdates` from online settings --- src/vs/platform/update/node/update.config.contribution.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/platform/update/node/update.config.contribution.ts b/src/vs/platform/update/node/update.config.contribution.ts index 26e63ea0fe8..b6ef43b29fa 100644 --- a/src/vs/platform/update/node/update.config.contribution.ts +++ b/src/vs/platform/update/node/update.config.contribution.ts @@ -41,7 +41,6 @@ configurationRegistry.registerConfiguration({ scope: ConfigurationScope.APPLICATION, title: localize('enableWindowsBackgroundUpdatesTitle', "Enable Background Updates on Windows"), description: localize('enableWindowsBackgroundUpdates', "Enable to download and install new VS Code Versions in the background on Windows"), - tags: ['usesOnlineServices'], included: isWindows }, 'update.showReleaseNotes': { From d52846203f9f7db0626188ae50934f098b943897 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 26 Jun 2019 11:24:42 +0200 Subject: [PATCH 0667/1449] fix #76076 --- src/vs/base/common/buffer.ts | 7 +++- .../base/test/{common => node}/buffer.test.ts | 38 +++++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) rename src/vs/base/test/{common => node}/buffer.test.ts (90%) diff --git a/src/vs/base/common/buffer.ts b/src/vs/base/common/buffer.ts index cf34296e74c..7b4e9cc8d66 100644 --- a/src/vs/base/common/buffer.ts +++ b/src/vs/base/common/buffer.ts @@ -78,7 +78,10 @@ export class VSBuffer { } slice(start?: number, end?: number): VSBuffer { - return new VSBuffer(this.buffer.slice(start, end)); + // IMPORTANT: use subarray instead of slice because TypedArray#slice + // creates shallow copy and NodeBuffer#slice doesn't. The use of subarray + // ensures the same, performant, behaviour. + return new VSBuffer(this.buffer.subarray(start!/*bad lib.d.ts*/, end)); } set(array: VSBuffer, offset?: number): void { @@ -437,4 +440,4 @@ class VSBufferWriteableStreamImpl implements VSBufferWriteableStream { this.listeners.end.length = 0; } } -} \ No newline at end of file +} diff --git a/src/vs/base/test/common/buffer.test.ts b/src/vs/base/test/node/buffer.test.ts similarity index 90% rename from src/vs/base/test/common/buffer.test.ts rename to src/vs/base/test/node/buffer.test.ts index c5a3cd676ee..65f84a66ddf 100644 --- a/src/vs/base/test/common/buffer.test.ts +++ b/src/vs/base/test/node/buffer.test.ts @@ -364,4 +364,42 @@ suite('Buffer', () => { assert.equal(ended, false); assert.equal(errors.length, 0); }); + + test('Performance issue with VSBuffer#slice #76076', function () { + // Buffer#slice creates a view + { + const buff = Buffer.from([10, 20, 30, 40]); + const b2 = buff.slice(1, 3); + assert.equal(buff[1], 20); + assert.equal(b2[0], 20); + + buff[1] = 17; // modify buff AND b2 + assert.equal(buff[1], 17); + assert.equal(b2[0], 17); + } + + // TypedArray#slice creates a copy + { + const unit = new Uint8Array([10, 20, 30, 40]); + const u2 = unit.slice(1, 3); + assert.equal(unit[1], 20); + assert.equal(u2[0], 20); + + unit[1] = 17; // modify unit, NOT b2 + assert.equal(unit[1], 17); + assert.equal(u2[0], 20); + } + + // TypedArray#subarray creates a view + { + const unit = new Uint8Array([10, 20, 30, 40]); + const u2 = unit.subarray(1, 3); + assert.equal(unit[1], 20); + assert.equal(u2[0], 20); + + unit[1] = 17; // modify unit AND b2 + assert.equal(unit[1], 17); + assert.equal(u2[0], 17); + } + }); }); From d67b5df66803918e9f098db0693c8c6340c6aed2 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 26 Jun 2019 11:48:06 +0200 Subject: [PATCH 0668/1449] revert the change --- product.json | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/product.json b/product.json index 8037965bff0..4103352af85 100644 --- a/product.json +++ b/product.json @@ -22,12 +22,5 @@ "urlProtocol": "code-oss", "extensionAllowedProposedApi": [ "ms-vscode.references-view" - ], - "extensionsGallery": { - "serviceUrl": "https://marketplace.visualstudio.com/_apis/public/gallery", - "cacheUrl": "https://vscode.blob.core.windows.net/gallery/index", - "itemUrl": "https://marketplace.visualstudio.com/items", - "controlUrl": "https://az764295.vo.msecnd.net/extensions/marketplace.json", - "recommendationsUrl": "https://az764295.vo.msecnd.net/extensions/workspaceRecommendations.json.gz" - } + ] } \ No newline at end of file From ffed70a39967c0d067e48873a36982448cb3e4fb Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 26 Jun 2019 12:40:53 +0200 Subject: [PATCH 0669/1449] prevent product.json containing gallery --- build/gulpfile.hygiene.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/build/gulpfile.hygiene.js b/build/gulpfile.hygiene.js index 50082693334..a66723ec7e4 100644 --- a/build/gulpfile.hygiene.js +++ b/build/gulpfile.hygiene.js @@ -175,6 +175,17 @@ gulp.task('tslint', () => { function hygiene(some) { let errorCount = 0; + const productJson = es.through(function (file) { + const product = JSON.parse(file.contents.toString('utf8')); + + if (product.extensionsGallery) { + console.error('product.json: Contains "extensionsGallery"'); + errorCount++; + } + + this.emit('data', file); + }); + const indentation = es.through(function (file) { const lines = file.contents.toString('utf8').split(/\r\n|\r|\n/); file.__lines = lines; @@ -258,8 +269,13 @@ function hygiene(some) { input = some; } + const productJsonFilter = filter('product.json', { restore: true }); + const result = input .pipe(filter(f => !f.stat.isDirectory())) + .pipe(productJsonFilter) + .pipe(productJson) + .pipe(productJsonFilter.restore) .pipe(filter(indentationFilter)) .pipe(indentation) .pipe(filter(copyrightFilter)) From 66dd9c69db7b3565b5618f77ebac38f1e01ac8d5 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 26 Jun 2019 14:01:06 +0200 Subject: [PATCH 0670/1449] fix #76074 --- src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts index 12d9ee5b662..dbfe7f49635 100644 --- a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts +++ b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts @@ -628,7 +628,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ } }); KeybindingsRegistry.registerCommandAndKeybindingRule({ - id: 'breadcrumbs.focusPrevious', + id: 'breadcrumbs.focusPreviousWithPicker', weight: KeybindingWeight.WorkbenchContrib + 1, primary: KeyMod.CtrlCmd | KeyCode.LeftArrow, mac: { From d30e71f75f801c7b741a0a19c488812c63f9bb9c Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 26 Jun 2019 14:15:02 +0200 Subject: [PATCH 0671/1449] fixes #54084 --- src/vs/workbench/contrib/debug/browser/debug.contribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/debug/browser/debug.contribution.ts b/src/vs/workbench/contrib/debug/browser/debug.contribution.ts index 88b70660848..e54b4d4e5d4 100644 --- a/src/vs/workbench/contrib/debug/browser/debug.contribution.ts +++ b/src/vs/workbench/contrib/debug/browser/debug.contribution.ts @@ -539,7 +539,7 @@ if (isMacintosh) { command: { id, title, - iconLocation: { dark: URI.parse(require.toUrl(`vs/workbench/contrib/debug/electron-browser/media/${icon}`)) } + iconLocation: { dark: URI.parse(require.toUrl(`vs/workbench/contrib/debug/browser/media/${icon}`)) } }, when, group: '9_debug', From d0c362792aa27ae6b6648f8b99d8d78e6095d537 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 26 Jun 2019 14:24:23 +0200 Subject: [PATCH 0672/1449] Fix #76105 --- .../extensions/node/extensionsWorkbenchService.ts | 2 +- .../electron-browser/remoteExtensionManagementIpc.ts | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts index d91ddb52882..a332c2733bb 100644 --- a/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts @@ -861,7 +861,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension this.queryGallery({ names, ids, pageSize: 1 }, CancellationToken.None); } finally { this.installing = this.installing.filter(e => e !== extension); - this._onChange.fire(extension); + this._onChange.fire(this.local.filter(e => areSameExtensions(e.identifier, extension.identifier))[0]); } } diff --git a/src/vs/workbench/services/extensions/electron-browser/remoteExtensionManagementIpc.ts b/src/vs/workbench/services/extensions/electron-browser/remoteExtensionManagementIpc.ts index 0879eb39178..6fd6dc821e8 100644 --- a/src/vs/workbench/services/extensions/electron-browser/remoteExtensionManagementIpc.ts +++ b/src/vs/workbench/services/extensions/electron-browser/remoteExtensionManagementIpc.ts @@ -70,10 +70,12 @@ export class RemoteExtensionManagementChannelClient extends ExtensionManagementC if (!compatible) { return Promise.reject(new Error(localize('incompatible', "Unable to install extension '{0}' as it is not compatible with VS Code '{1}'.", extension.identifier.id, this.productService.version))); } - const local = await this.downloadAndInstall(extension, installed); - const workspaceExtensions = await this.getAllWorkspaceDependenciesAndPackedExtensions(local.manifest, CancellationToken.None); - await Promise.all(workspaceExtensions.map(e => this.downloadAndInstall(e, installed))); - return local; + const manifest = await this.galleryService.getManifest(compatible, CancellationToken.None); + if (manifest) { + const workspaceExtensions = await this.getAllWorkspaceDependenciesAndPackedExtensions(manifest, CancellationToken.None); + await Promise.all(workspaceExtensions.map(e => this.downloadAndInstall(e, installed))); + } + return this.downloadAndInstall(extension, installed); } private async downloadAndInstall(extension: IGalleryExtension, installed: ILocalExtension[]): Promise { From 56af1b0a07df07aa2efa70aceac570aeade7c72f Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 26 Jun 2019 14:54:34 +0200 Subject: [PATCH 0673/1449] fix #75904 --- src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts index dbfe7f49635..1ca86d59405 100644 --- a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts +++ b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts @@ -704,7 +704,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ handler(accessor) { const editors = accessor.get(IEditorService); const lists = accessor.get(IListService); - const element = lists.lastFocusedList ? lists.lastFocusedList.getFocus() : undefined; + const element = lists.lastFocusedList ? lists.lastFocusedList.getFocus()[0] : undefined; if (element instanceof OutlineElement) { const outlineElement = OutlineModel.get(element); if (!outlineElement) { From 6507e4272c3c3fae935f73a4a608a0ccd6e1a927 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 26 Jun 2019 15:06:51 +0200 Subject: [PATCH 0674/1449] workaround for #74934 --- src/vs/editor/contrib/documentSymbols/outlineTree.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/documentSymbols/outlineTree.ts b/src/vs/editor/contrib/documentSymbols/outlineTree.ts index dc34e90fcfb..a24e8cd4d39 100644 --- a/src/vs/editor/contrib/documentSymbols/outlineTree.ts +++ b/src/vs/editor/contrib/documentSymbols/outlineTree.ts @@ -22,6 +22,7 @@ import { OutlineConfigKeys } from 'vs/editor/contrib/documentSymbols/outline'; import { MarkerSeverity } from 'vs/platform/markers/common/markers'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { listErrorForeground, listWarningForeground } from 'vs/platform/theme/common/colorRegistry'; +import { KeyCode } from 'vs/base/common/keyCodes'; export type OutlineItem = OutlineGroup | OutlineElement; @@ -38,7 +39,7 @@ export class OutlineNavigationLabelProvider implements IKeyboardNavigationLabelP } mightProducePrintableCharacter(event: IKeyboardEvent): boolean { - return this._keybindingService.mightProducePrintableCharacter(event); + return event.keyCode !== KeyCode.Escape && this._keybindingService.mightProducePrintableCharacter(event); } } From eedf49f65b78c5610fb5a3b71c7b0b7e167ba0e2 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 26 Jun 2019 15:35:34 +0200 Subject: [PATCH 0675/1449] Revert "workaround for #74934" This reverts commit 6507e4272c3c3fae935f73a4a608a0ccd6e1a927. --- src/vs/editor/contrib/documentSymbols/outlineTree.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/vs/editor/contrib/documentSymbols/outlineTree.ts b/src/vs/editor/contrib/documentSymbols/outlineTree.ts index a24e8cd4d39..dc34e90fcfb 100644 --- a/src/vs/editor/contrib/documentSymbols/outlineTree.ts +++ b/src/vs/editor/contrib/documentSymbols/outlineTree.ts @@ -22,7 +22,6 @@ import { OutlineConfigKeys } from 'vs/editor/contrib/documentSymbols/outline'; import { MarkerSeverity } from 'vs/platform/markers/common/markers'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { listErrorForeground, listWarningForeground } from 'vs/platform/theme/common/colorRegistry'; -import { KeyCode } from 'vs/base/common/keyCodes'; export type OutlineItem = OutlineGroup | OutlineElement; @@ -39,7 +38,7 @@ export class OutlineNavigationLabelProvider implements IKeyboardNavigationLabelP } mightProducePrintableCharacter(event: IKeyboardEvent): boolean { - return event.keyCode !== KeyCode.Escape && this._keybindingService.mightProducePrintableCharacter(event); + return this._keybindingService.mightProducePrintableCharacter(event); } } From 382e1a0289a16d62be04ff9ec4a1b40f297c9637 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 26 Jun 2019 15:41:51 +0200 Subject: [PATCH 0676/1449] fixes #74934 --- src/vs/base/browser/ui/tree/asyncDataTree.ts | 1 + src/vs/editor/contrib/documentSymbols/outlineTree.ts | 7 ------- src/vs/workbench/browser/parts/editor/breadcrumbsPicker.ts | 2 +- src/vs/workbench/contrib/outline/browser/outlinePanel.ts | 2 +- .../services/keybinding/browser/keybindingService.ts | 4 ++++ 5 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/vs/base/browser/ui/tree/asyncDataTree.ts b/src/vs/base/browser/ui/tree/asyncDataTree.ts index 70beeb2145d..6208e4e8cce 100644 --- a/src/vs/base/browser/ui/tree/asyncDataTree.ts +++ b/src/vs/base/browser/ui/tree/asyncDataTree.ts @@ -225,6 +225,7 @@ function asObjectTreeOptions(options?: IAsyncDataTreeOpt } }, keyboardNavigationLabelProvider: options.keyboardNavigationLabelProvider && { + ...options.keyboardNavigationLabelProvider, getKeyboardNavigationLabel(e) { return options.keyboardNavigationLabelProvider!.getKeyboardNavigationLabel(e.element as T); } diff --git a/src/vs/editor/contrib/documentSymbols/outlineTree.ts b/src/vs/editor/contrib/documentSymbols/outlineTree.ts index dc34e90fcfb..2ac8baff8b5 100644 --- a/src/vs/editor/contrib/documentSymbols/outlineTree.ts +++ b/src/vs/editor/contrib/documentSymbols/outlineTree.ts @@ -15,7 +15,6 @@ import { Range } from 'vs/editor/common/core/range'; import { SymbolKind, symbolKindToCssClass } from 'vs/editor/common/modes'; import { OutlineElement, OutlineGroup, OutlineModel, TreeElement } from 'vs/editor/contrib/documentSymbols/outlineModel'; import { localize } from 'vs/nls'; -import { IKeybindingService, IKeyboardEvent } from 'vs/platform/keybinding/common/keybinding'; import { IconLabel } from 'vs/base/browser/ui/iconLabel/iconLabel'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { OutlineConfigKeys } from 'vs/editor/contrib/documentSymbols/outline'; @@ -27,8 +26,6 @@ export type OutlineItem = OutlineGroup | OutlineElement; export class OutlineNavigationLabelProvider implements IKeyboardNavigationLabelProvider { - constructor(@IKeybindingService private readonly _keybindingService: IKeybindingService) { } - getKeyboardNavigationLabel(element: OutlineItem): { toString(): string; } { if (element instanceof OutlineGroup) { return element.provider.displayName || element.id; @@ -36,10 +33,6 @@ export class OutlineNavigationLabelProvider implements IKeyboardNavigationLabelP return element.symbol.name; } } - - mightProducePrintableCharacter(event: IKeyboardEvent): boolean { - return this._keybindingService.mightProducePrintableCharacter(event); - } } diff --git a/src/vs/workbench/browser/parts/editor/breadcrumbsPicker.ts b/src/vs/workbench/browser/parts/editor/breadcrumbsPicker.ts index 3da86172b0c..7d0376877c1 100644 --- a/src/vs/workbench/browser/parts/editor/breadcrumbsPicker.ts +++ b/src/vs/workbench/browser/parts/editor/breadcrumbsPicker.ts @@ -459,7 +459,7 @@ export class BreadcrumbsOutlinePicker extends BreadcrumbsPicker { multipleSelectionSupport: false, sorter: new OutlineItemComparator(this._getOutlineItemCompareType()), identityProvider: new OutlineIdentityProvider(), - keyboardNavigationLabelProvider: this._instantiationService.createInstance(OutlineNavigationLabelProvider) + keyboardNavigationLabelProvider: new OutlineNavigationLabelProvider() } ) as WorkbenchDataTree; } diff --git a/src/vs/workbench/contrib/outline/browser/outlinePanel.ts b/src/vs/workbench/contrib/outline/browser/outlinePanel.ts index 7b5eaee508e..0dcc8ef9184 100644 --- a/src/vs/workbench/contrib/outline/browser/outlinePanel.ts +++ b/src/vs/workbench/contrib/outline/browser/outlinePanel.ts @@ -327,7 +327,7 @@ export class OutlinePanel extends ViewletPanel { filterOnType: this._outlineViewState.filterOnType, sorter: this._treeComparator, identityProvider: new OutlineIdentityProvider(), - keyboardNavigationLabelProvider: this._instantiationService.createInstance(OutlineNavigationLabelProvider) + keyboardNavigationLabelProvider: new OutlineNavigationLabelProvider() } ) as WorkbenchDataTree; diff --git a/src/vs/workbench/services/keybinding/browser/keybindingService.ts b/src/vs/workbench/services/keybinding/browser/keybindingService.ts index fb7e5465845..1ba9d627f16 100644 --- a/src/vs/workbench/services/keybinding/browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/browser/keybindingService.ts @@ -531,6 +531,10 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { // ignore ctrl/cmd-combination but not shift/alt-combinatios return false; } + if (event.keyCode === KeyCode.Escape) { + // https://github.com/microsoft/vscode/issues/74934 + return false; + } // consult the KeyboardMapperFactory to check the given event for // a printable value. const mapping = this.keymapService.getRawKeyboardMapping(); From f1742df0a341e183339cfac63c7b72384f820402 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 26 Jun 2019 15:46:30 +0200 Subject: [PATCH 0677/1449] fixes #76168 --- src/vs/workbench/contrib/debug/browser/debugActions.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/debug/browser/debugActions.ts b/src/vs/workbench/contrib/debug/browser/debugActions.ts index be84b6827f3..0f16da0f89f 100644 --- a/src/vs/workbench/contrib/debug/browser/debugActions.ts +++ b/src/vs/workbench/contrib/debug/browser/debugActions.ts @@ -323,6 +323,7 @@ export class AddWatchExpressionAction extends AbstractDebugAction { constructor(id: string, label: string, @IDebugService debugService: IDebugService, @IKeybindingService keybindingService: IKeybindingService) { super(id, label, 'debug-action add-watch-expression', debugService, keybindingService); this.toDispose.push(this.debugService.getModel().onDidChangeWatchExpressions(() => this.updateEnablement())); + this.toDispose.push(this.debugService.getViewModel().onDidSelectExpression(() => this.updateEnablement())); } public run(): Promise { @@ -331,7 +332,8 @@ export class AddWatchExpressionAction extends AbstractDebugAction { } protected isEnabled(state: State): boolean { - return super.isEnabled(state) && this.debugService.getModel().getWatchExpressions().every(we => !!we.name); + const focusedExpression = this.debugService.getViewModel().getSelectedExpression(); + return super.isEnabled(state) && this.debugService.getModel().getWatchExpressions().every(we => !!we.name && we !== focusedExpression); } } From 2af25a68b7bb7a68ccac3ddb2dde5733c2911929 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 26 Jun 2019 16:18:25 +0200 Subject: [PATCH 0678/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c042e80daac..5913bb88e2c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "017ad2e70f6427c6603b82e7d27dd54fa281923d", + "distro": "91a142dcfffea6350fc4b171ee60e14218fb20fd", "author": { "name": "Microsoft Corporation" }, From d9c8d85aa2516e78805a03f33b5de8851d77773c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 26 Jun 2019 16:19:42 +0200 Subject: [PATCH 0679/1449] fix continuous build --- build/azure-pipelines/darwin/continuous-build-darwin.yml | 2 +- build/azure-pipelines/linux/continuous-build-linux.yml | 2 +- build/azure-pipelines/win32/continuous-build-win32.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build/azure-pipelines/darwin/continuous-build-darwin.yml b/build/azure-pipelines/darwin/continuous-build-darwin.yml index d84beb2e597..0588b0ae961 100644 --- a/build/azure-pipelines/darwin/continuous-build-darwin.yml +++ b/build/azure-pipelines/darwin/continuous-build-darwin.yml @@ -13,7 +13,7 @@ steps: - script: | yarn --frozen-lockfile displayName: Install Dependencies - condition: ne(variables['CacheRestored'], 'true') + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' diff --git a/build/azure-pipelines/linux/continuous-build-linux.yml b/build/azure-pipelines/linux/continuous-build-linux.yml index bce42a665fe..d1e38506f5d 100644 --- a/build/azure-pipelines/linux/continuous-build-linux.yml +++ b/build/azure-pipelines/linux/continuous-build-linux.yml @@ -21,7 +21,7 @@ steps: - script: | yarn --frozen-lockfile displayName: Install Dependencies - condition: ne(variables['CacheRestored'], 'true') + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' diff --git a/build/azure-pipelines/win32/continuous-build-win32.yml b/build/azure-pipelines/win32/continuous-build-win32.yml index 85d648e8f41..7f10e74d7c5 100644 --- a/build/azure-pipelines/win32/continuous-build-win32.yml +++ b/build/azure-pipelines/win32/continuous-build-win32.yml @@ -17,7 +17,7 @@ steps: - powershell: | yarn --frozen-lockfile displayName: Install Dependencies - condition: ne(variables['CacheRestored'], 'true') + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' From d2914f5b58db36e54e06f5d12e7ee2af86f0635e Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 26 Jun 2019 16:56:25 +0200 Subject: [PATCH 0680/1449] Remove all old threads which are no longer part of the update fixes #75980 --- src/vs/workbench/contrib/debug/browser/debugSession.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/vs/workbench/contrib/debug/browser/debugSession.ts b/src/vs/workbench/contrib/debug/browser/debugSession.ts index a75db88dfc8..ca53f26dbf5 100644 --- a/src/vs/workbench/contrib/debug/browser/debugSession.ts +++ b/src/vs/workbench/contrib/debug/browser/debugSession.ts @@ -577,7 +577,9 @@ export class DebugSession implements IDebugSession { } rawUpdate(data: IRawModelUpdate): void { + const threadIds: number[] = []; data.threads.forEach(thread => { + threadIds.push(thread.id); if (!this.threads.has(thread.id)) { // A new thread came in, initialize it. this.threads.set(thread.id, new Thread(this, thread.name, thread.id)); @@ -589,6 +591,12 @@ export class DebugSession implements IDebugSession { } } }); + this.threads.forEach(t => { + // Remove all old threads which are no longer part of the update #75980 + if (threadIds.indexOf(t.threadId) === -1) { + this.threads.delete(t.threadId); + } + }); const stoppedDetails = data.stoppedDetails; if (stoppedDetails) { From d0cee50fba19c6c8b3531a86898916c2819bbae1 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 26 Jun 2019 17:29:59 +0200 Subject: [PATCH 0681/1449] fixes #75825 --- src/vs/workbench/contrib/files/browser/fileActions.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/files/browser/fileActions.ts b/src/vs/workbench/contrib/files/browser/fileActions.ts index 837f66be83b..46a01a9e86e 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.ts @@ -898,7 +898,9 @@ export const renameHandler = (accessor: ServicesAccessor) => { if (success) { const parentResource = stat.parent!.resource; const targetResource = resources.joinPath(parentResource, value); - textFileService.move(stat.resource, targetResource).then(() => refreshIfSeparator(value, explorerService), onUnexpectedError); + if (stat.resource.toString() !== targetResource.toString()) { + textFileService.move(stat.resource, targetResource).then(() => refreshIfSeparator(value, explorerService), onUnexpectedError); + } } explorerService.setEditable(stat, null); } From d6c5e387dd1e1532e98e89c58c523f2741dc6628 Mon Sep 17 00:00:00 2001 From: Julien Brianceau Date: Wed, 26 Jun 2019 17:44:46 +0200 Subject: [PATCH 0682/1449] Fix 'postion' typos --- src/vs/editor/common/core/position.ts | 2 +- .../model/pieceTreeTextBuffer/pieceTreeBase.ts | 18 +++++++++--------- .../common/services/resourceConfiguration.ts | 2 +- .../editor/contrib/dnd/dragAndDropCommand.ts | 2 +- src/vs/monaco.d.ts | 2 +- src/vs/vscode.d.ts | 2 +- src/vs/vscode.proposed.d.ts | 2 +- .../callHierarchy/common/callHierarchy.ts | 2 +- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/vs/editor/common/core/position.ts b/src/vs/editor/common/core/position.ts index 4c711e9142c..e9f64d97b72 100644 --- a/src/vs/editor/common/core/position.ts +++ b/src/vs/editor/common/core/position.ts @@ -36,7 +36,7 @@ export class Position { } /** - * Create a new postion from this position. + * Create a new position from this position. * * @param newLineNumber new line number * @param newColumn new column diff --git a/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase.ts b/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase.ts index 04de0bc01fc..445ddde972f 100644 --- a/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase.ts +++ b/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase.ts @@ -611,25 +611,25 @@ export class PieceTreeBase { let resultLen = 0; const searcher = new Searcher(searchData.wordSeparators, searchData.regex); - let startPostion = this.nodeAt2(searchRange.startLineNumber, searchRange.startColumn); - if (startPostion === null) { + let startPosition = this.nodeAt2(searchRange.startLineNumber, searchRange.startColumn); + if (startPosition === null) { return []; } let endPosition = this.nodeAt2(searchRange.endLineNumber, searchRange.endColumn); if (endPosition === null) { return []; } - let start = this.positionInBuffer(startPostion.node, startPostion.remainder); + let start = this.positionInBuffer(startPosition.node, startPosition.remainder); let end = this.positionInBuffer(endPosition.node, endPosition.remainder); - if (startPostion.node === endPosition.node) { - this.findMatchesInNode(startPostion.node, searcher, searchRange.startLineNumber, searchRange.startColumn, start, end, searchData, captureMatches, limitResultCount, resultLen, result); + if (startPosition.node === endPosition.node) { + this.findMatchesInNode(startPosition.node, searcher, searchRange.startLineNumber, searchRange.startColumn, start, end, searchData, captureMatches, limitResultCount, resultLen, result); return result; } let startLineNumber = searchRange.startLineNumber; - let currentNode = startPostion.node; + let currentNode = startPosition.node; while (currentNode !== endPosition.node) { let lineBreakCnt = this.getLineFeedCnt(currentNode.piece.bufferIndex, start, currentNode.piece.end); @@ -663,9 +663,9 @@ export class PieceTreeBase { } startLineNumber++; - startPostion = this.nodeAt2(startLineNumber, 1); - currentNode = startPostion.node; - start = this.positionInBuffer(startPostion.node, startPostion.remainder); + startPosition = this.nodeAt2(startLineNumber, 1); + currentNode = startPosition.node; + start = this.positionInBuffer(startPosition.node, startPosition.remainder); } if (startLineNumber === searchRange.endLineNumber) { diff --git a/src/vs/editor/common/services/resourceConfiguration.ts b/src/vs/editor/common/services/resourceConfiguration.ts index 79e3624f425..311556df882 100644 --- a/src/vs/editor/common/services/resourceConfiguration.ts +++ b/src/vs/editor/common/services/resourceConfiguration.ts @@ -25,7 +25,7 @@ export interface ITextResourceConfigurationService { * Value can be of native type or an object keyed off the section name. * * @param resource - Resource for which the configuration has to be fetched. - * @param postion - Position in the resource for which configuration has to be fetched. + * @param position - Position in the resource for which configuration has to be fetched. * @param section - Section of the configuraion. * */ diff --git a/src/vs/editor/contrib/dnd/dragAndDropCommand.ts b/src/vs/editor/contrib/dnd/dragAndDropCommand.ts index 12d405648c9..f2c9aa86932 100644 --- a/src/vs/editor/contrib/dnd/dragAndDropCommand.ts +++ b/src/vs/editor/contrib/dnd/dragAndDropCommand.ts @@ -91,7 +91,7 @@ export class DragAndDropCommand implements editorCommon.ICommand { this.selection.endColumn ); } else { - // The target position is before the selection's end postion. Since the selection doesn't contain the target position, the selection is one-line and target position is before this selection. + // The target position is before the selection's end position. Since the selection doesn't contain the target position, the selection is one-line and target position is before this selection. this.targetSelection = new Selection( this.targetPosition.lineNumber - this.selection.endLineNumber + this.selection.startLineNumber, this.targetPosition.column, diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 3b1c5237e83..a1b4a10a6a4 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -453,7 +453,7 @@ declare namespace monaco { readonly column: number; constructor(lineNumber: number, column: number); /** - * Create a new postion from this position. + * Create a new position from this position. * * @param newLineNumber new line number * @param newColumn new column diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index d99f3d12f56..b7994e862a2 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -3826,7 +3826,7 @@ declare module 'vscode' { /** * Provide selection ranges for the given positions. * - * Selection ranges should be computed individually and independend for each postion. The editor will merge + * Selection ranges should be computed individually and independend for each position. The editor will merge * and deduplicate ranges but providers must return hierarchies of selection ranges so that a range * is [contained](#Range.contains) by its parent. * diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 60b108c952c..9fec616de5a 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -53,7 +53,7 @@ declare module 'vscode' { */ provideCallHierarchyItem( document: TextDocument, - postion: Position, + position: Position, token: CancellationToken ): ProviderResult; diff --git a/src/vs/workbench/contrib/callHierarchy/common/callHierarchy.ts b/src/vs/workbench/contrib/callHierarchy/common/callHierarchy.ts index 95876374639..4c448e4d8fa 100644 --- a/src/vs/workbench/contrib/callHierarchy/common/callHierarchy.ts +++ b/src/vs/workbench/contrib/callHierarchy/common/callHierarchy.ts @@ -30,7 +30,7 @@ export interface CallHierarchyProvider { provideCallHierarchyItem( document: ITextModel, - postion: IPosition, + position: IPosition, token: CancellationToken ): ProviderResult; From f49c5d837164cff38ac1abfc3a55580a8929a3e4 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Wed, 26 Jun 2019 09:32:44 -0700 Subject: [PATCH 0683/1449] Fix #76180. Ctrl on Windows --- src/vs/editor/contrib/links/links.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/contrib/links/links.ts b/src/vs/editor/contrib/links/links.ts index 58f50952234..410d83aba20 100644 --- a/src/vs/editor/contrib/links/links.ts +++ b/src/vs/editor/contrib/links/links.ts @@ -28,13 +28,13 @@ import { registerThemingParticipant } from 'vs/platform/theme/common/themeServic const HOVER_MESSAGE_GENERAL_META = new MarkdownString().appendText( platform.isMacintosh ? nls.localize('links.navigate.mac', "Follow link (cmd + click)") - : nls.localize('links.navigate', "Follow link (cmd + click)") + : nls.localize('links.navigate', "Follow link (ctrl + click)") ); const HOVER_MESSAGE_COMMAND_META = new MarkdownString().appendText( platform.isMacintosh ? nls.localize('links.command.mac', "Execute command (cmd + click)") - : nls.localize('links.command', "Execute command (cmd + click)") + : nls.localize('links.command', "Execute command (ctrl + click)") ); const HOVER_MESSAGE_GENERAL_ALT = new MarkdownString().appendText( From d55bc0b945bd275e16a24e92352c895bde9ec923 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 26 Jun 2019 19:00:02 +0200 Subject: [PATCH 0684/1449] Fix #76035 --- .../services/extensions/electron-browser/extensionService.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts index be2007b0449..39eff375160 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts @@ -213,6 +213,9 @@ export class ExtensionService extends AbstractExtensionService implements IExten this._logOrShowMessage(Severity.Error, nls.localize('looping', "The following extensions contain dependency loops and have been disabled: {0}", result.removedDueToLooping.map(e => `'${e.identifier.value}'`).join(', '))); } + // enable or disable proposed API per extension + this._checkEnableProposedApi(toAdd); + // Update extension points this._rehandleExtensionPoints(([]).concat(toAdd).concat(toRemove)); From 3d5deba781ec7bb7cf650643bc14e66549c0e60f Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 26 Jun 2019 10:10:41 -0700 Subject: [PATCH 0685/1449] Fix shell selector OS check Fixes #76040 --- src/vs/workbench/contrib/terminal/common/terminalService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/terminal/common/terminalService.ts b/src/vs/workbench/contrib/terminal/common/terminalService.ts index da5d0bcfe48..789b89d0907 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalService.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalService.ts @@ -552,7 +552,7 @@ export abstract class TerminalService implements ITerminalService { const env = await this._remoteAgentService.getEnvironment(); let platformKey: string; if (env) { - platformKey = env.os === OperatingSystem.Windows ? 'windows' : (OperatingSystem.Macintosh ? 'osx' : 'linux'); + platformKey = env.os === OperatingSystem.Windows ? 'windows' : (env.os === OperatingSystem.Macintosh ? 'osx' : 'linux'); } else { platformKey = isWindows ? 'windows' : (isMacintosh ? 'osx' : 'linux'); } From 327d49e36f9b1ec35cd734daf0e9904d6a5bba90 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 26 Jun 2019 11:01:32 -0700 Subject: [PATCH 0686/1449] Fix spelling Fixes #76077 --- src/vs/editor/contrib/links/links.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/contrib/links/links.ts b/src/vs/editor/contrib/links/links.ts index 410d83aba20..056e2cb5b35 100644 --- a/src/vs/editor/contrib/links/links.ts +++ b/src/vs/editor/contrib/links/links.ts @@ -39,13 +39,13 @@ const HOVER_MESSAGE_COMMAND_META = new MarkdownString().appendText( const HOVER_MESSAGE_GENERAL_ALT = new MarkdownString().appendText( platform.isMacintosh - ? nls.localize('links.navigate.al.mac', "Follow link (cption + click)") + ? nls.localize('links.navigate.al.mac', "Follow link (option + click)") : nls.localize('links.navigate.al', "Follow link (alt + click)") ); const HOVER_MESSAGE_COMMAND_ALT = new MarkdownString().appendText( platform.isMacintosh - ? nls.localize('links.command.al.mac', "Execute command (cption + click)") + ? nls.localize('links.command.al.mac', "Execute command (option + click)") : nls.localize('links.command.al', "Execute command (alt + click)") ); From 00eee140d92ce94933d99c36c702a578f2ad1c49 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 26 Jun 2019 11:49:52 -0700 Subject: [PATCH 0687/1449] Don't send available shells request to both ext hosts Part of #76049 --- .../api/browser/mainThreadTerminalService.ts | 11 +++++++++-- src/vs/workbench/contrib/terminal/common/terminal.ts | 7 ++++++- .../contrib/terminal/common/terminalService.ts | 12 ++++++++---- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index f31996419f7..5871551035c 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { ITerminalService, ITerminalInstance, IShellLaunchConfig, ITerminalProcessExtHostProxy, ITerminalProcessExtHostRequest, ITerminalDimensions, EXT_HOST_CREATION_DELAY } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ITerminalService, ITerminalInstance, IShellLaunchConfig, ITerminalProcessExtHostProxy, ITerminalProcessExtHostRequest, ITerminalDimensions, EXT_HOST_CREATION_DELAY, IAvailableShellsRequest } from 'vs/workbench/contrib/terminal/common/terminal'; import { ExtHostContext, ExtHostTerminalServiceShape, MainThreadTerminalServiceShape, MainContext, IExtHostContext, ShellLaunchConfigDto } from 'vs/workbench/api/common/extHost.protocol'; import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { UriComponents, URI } from 'vs/base/common/uri'; @@ -47,7 +47,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape this._toDispose.push(_terminalService.onActiveInstanceChanged(instance => this._onActiveTerminalChanged(instance ? instance.id : null))); this._toDispose.push(_terminalService.onInstanceTitleChanged(instance => this._onTitleChanged(instance.id, instance.title))); this._toDispose.push(_terminalService.configHelper.onWorkspacePermissionsChanged(isAllowed => this._onWorkspacePermissionsChanged(isAllowed))); - this._toDispose.push(_terminalService.onRequestAvailableShells(r => this._proxy.$requestAvailableShells().then(e => r(e)))); + this._toDispose.push(_terminalService.onRequestAvailableShells(e => this._onRequestAvailableShells(e))); // ITerminalInstanceService listeners if (terminalInstanceService.onRequestDefaultShellAndArgs) { @@ -290,4 +290,11 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape } this._terminalProcesses[terminalId].emitLatency(sum / COUNT); } + + private _onRequestAvailableShells(request: IAvailableShellsRequest): void { + if (request.remoteAuthority !== this._remoteAuthority) { + return; + } + this._proxy.$requestAvailableShells().then(e => request.callback(e)); + } } diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index af35201e56a..2d02c731e15 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -226,7 +226,7 @@ export interface ITerminalService { onInstancesChanged: Event; onInstanceTitleChanged: Event; onActiveInstanceChanged: Event; - onRequestAvailableShells: Event<(shells: IShellDefinition[]) => void>; + onRequestAvailableShells: Event; /** * Creates a terminal. @@ -757,6 +757,11 @@ export interface ITerminalProcessExtHostRequest { isWorkspaceShellAllowed: boolean; } +export interface IAvailableShellsRequest { + remoteAuthority: string | null; + callback: (shells: IShellDefinition[]) => void; +} + export enum LinuxDistro { Fedora, Ubuntu, diff --git a/src/vs/workbench/contrib/terminal/common/terminalService.ts b/src/vs/workbench/contrib/terminal/common/terminalService.ts index 789b89d0907..3ab88936cb7 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalService.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalService.ts @@ -8,7 +8,7 @@ import { Event, Emitter } from 'vs/base/common/event'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; -import { ITerminalService, ITerminalInstance, IShellLaunchConfig, ITerminalConfigHelper, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, TERMINAL_PANEL_ID, ITerminalTab, ITerminalProcessExtHostProxy, ITerminalProcessExtHostRequest, KEYBINDING_CONTEXT_TERMINAL_IS_OPEN, ITerminalNativeService, IShellDefinition } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ITerminalService, ITerminalInstance, IShellLaunchConfig, ITerminalConfigHelper, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, TERMINAL_PANEL_ID, ITerminalTab, ITerminalProcessExtHostProxy, ITerminalProcessExtHostRequest, KEYBINDING_CONTEXT_TERMINAL_IS_OPEN, ITerminalNativeService, IShellDefinition, IAvailableShellsRequest } from 'vs/workbench/contrib/terminal/common/terminal'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { URI } from 'vs/base/common/uri'; import { FindReplaceState } from 'vs/editor/contrib/find/findState'; @@ -67,8 +67,8 @@ export abstract class TerminalService implements ITerminalService { public get onActiveInstanceChanged(): Event { return this._onActiveInstanceChanged.event; } protected readonly _onTabDisposed = new Emitter(); public get onTabDisposed(): Event { return this._onTabDisposed.event; } - protected readonly _onRequestAvailableShells = new Emitter<(shells: IShellDefinition[]) => void>(); - public get onRequestAvailableShells(): Event<(shells: IShellDefinition[]) => void> { return this._onRequestAvailableShells.event; } + protected readonly _onRequestAvailableShells = new Emitter(); + public get onRequestAvailableShells(): Event { return this._onRequestAvailableShells.event; } public abstract get configHelper(): ITerminalConfigHelper; @@ -563,6 +563,10 @@ export abstract class TerminalService implements ITerminalService { } private _detectWindowsShells(): Promise { - return new Promise(r => this._onRequestAvailableShells.fire(r)); + const conn = this._remoteAgentService.getConnection(); + return new Promise(r => this._onRequestAvailableShells.fire({ + remoteAuthority: conn ? conn.remoteAuthority : null, + callback: r + })); } } From bdd15725a92276d2b892daf157cbd99143559fa5 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 26 Jun 2019 11:59:15 -0700 Subject: [PATCH 0688/1449] Push ext host check to mainThread, apply fix to request defaults too Fixes #76049 --- .../api/browser/mainThreadTerminalService.ts | 30 ++++++++++++++----- .../contrib/terminal/common/terminal.ts | 11 ++++--- .../terminal/common/terminalService.ts | 6 +--- 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index 5871551035c..b975524b5f6 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -4,12 +4,13 @@ *--------------------------------------------------------------------------------------------*/ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { ITerminalService, ITerminalInstance, IShellLaunchConfig, ITerminalProcessExtHostProxy, ITerminalProcessExtHostRequest, ITerminalDimensions, EXT_HOST_CREATION_DELAY, IAvailableShellsRequest } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ITerminalService, ITerminalInstance, IShellLaunchConfig, ITerminalProcessExtHostProxy, ITerminalProcessExtHostRequest, ITerminalDimensions, EXT_HOST_CREATION_DELAY, IAvailableShellsRequest, IDefaultShellAndArgsRequest } from 'vs/workbench/contrib/terminal/common/terminal'; import { ExtHostContext, ExtHostTerminalServiceShape, MainThreadTerminalServiceShape, MainContext, IExtHostContext, ShellLaunchConfigDto } from 'vs/workbench/api/common/extHost.protocol'; import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { UriComponents, URI } from 'vs/base/common/uri'; import { StopWatch } from 'vs/base/common/stopwatch'; import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal'; +import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; @extHostNamedCustomer(MainContext.MainThreadTerminalService) export class MainThreadTerminalService implements MainThreadTerminalServiceShape { @@ -24,7 +25,8 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape constructor( extHostContext: IExtHostContext, @ITerminalService private readonly _terminalService: ITerminalService, - @ITerminalInstanceService readonly terminalInstanceService: ITerminalInstanceService + @ITerminalInstanceService readonly terminalInstanceService: ITerminalInstanceService, + @IRemoteAgentService readonly _remoteAgentService: IRemoteAgentService ) { this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostTerminalService); this._remoteAuthority = extHostContext.remoteAuthority; @@ -51,7 +53,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape // ITerminalInstanceService listeners if (terminalInstanceService.onRequestDefaultShellAndArgs) { - this._toDispose.push(terminalInstanceService.onRequestDefaultShellAndArgs(r => this._proxy.$requestDefaultShellAndArgs().then(e => r(e.shell, e.args)))); + this._toDispose.push(terminalInstanceService.onRequestDefaultShellAndArgs(e => this._onRequestDefaultShellAndArgs(e))); } // Set initial ext host state @@ -291,10 +293,24 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape this._terminalProcesses[terminalId].emitLatency(sum / COUNT); } - private _onRequestAvailableShells(request: IAvailableShellsRequest): void { - if (request.remoteAuthority !== this._remoteAuthority) { - return; + private _isPrimaryExtHost(): boolean { + // The "primary" ext host is the remote ext host if there is one, otherwise the local + const conn = this._remoteAgentService.getConnection(); + if (conn) { + return this._remoteAuthority === conn.remoteAuthority; + } + return true; + } + + private _onRequestAvailableShells(request: IAvailableShellsRequest): void { + if (this._isPrimaryExtHost()) { + this._proxy.$requestAvailableShells().then(e => request(e)); + } + } + + private _onRequestDefaultShellAndArgs(request: IDefaultShellAndArgsRequest): void { + if (this._isPrimaryExtHost()) { + this._proxy.$requestDefaultShellAndArgs().then(e => request(e.shell, e.args)); } - this._proxy.$requestAvailableShells().then(e => request.callback(e)); } } diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index 2d02c731e15..7f9eb86c400 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -758,8 +758,11 @@ export interface ITerminalProcessExtHostRequest { } export interface IAvailableShellsRequest { - remoteAuthority: string | null; - callback: (shells: IShellDefinition[]) => void; + (shells: IShellDefinition[]): void; +} + +export interface IDefaultShellAndArgsRequest { + (shell: string, args: string[] | string | undefined): void; } export enum LinuxDistro { @@ -796,7 +799,3 @@ export interface ITerminalChildProcess { getCwd(): Promise; getLatency(): Promise; } - -export interface IDefaultShellAndArgsRequest { - (shell: string, args: string[] | string | undefined): void; -} \ No newline at end of file diff --git a/src/vs/workbench/contrib/terminal/common/terminalService.ts b/src/vs/workbench/contrib/terminal/common/terminalService.ts index 3ab88936cb7..a5d78c06cf5 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalService.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalService.ts @@ -563,10 +563,6 @@ export abstract class TerminalService implements ITerminalService { } private _detectWindowsShells(): Promise { - const conn = this._remoteAgentService.getConnection(); - return new Promise(r => this._onRequestAvailableShells.fire({ - remoteAuthority: conn ? conn.remoteAuthority : null, - callback: r - })); + return new Promise(r => this._onRequestAvailableShells.fire(r)); } } From b015adc16104c081660732335b593e95def84bc3 Mon Sep 17 00:00:00 2001 From: Rachel Macfarlane Date: Wed, 26 Jun 2019 13:42:23 -0700 Subject: [PATCH 0689/1449] Fix build yml for linux alpine --- build/azure-pipelines/product-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 85de2d3f351..2e55abb4719 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -61,7 +61,7 @@ jobs: - template: linux/product-build-linux-arm.yml - job: LinuxAlpine - condition: and(eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable'))) + condition: and(eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) timeoutInMinutes: 120 pool: vmImage: 'Ubuntu-16.04' From a122c88b4e56318f778d9d2e3800395ee18ecba8 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 26 Jun 2019 22:57:28 +0200 Subject: [PATCH 0690/1449] fix build --- build/gulpfile.hygiene.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/gulpfile.hygiene.js b/build/gulpfile.hygiene.js index a66723ec7e4..b49bc069366 100644 --- a/build/gulpfile.hygiene.js +++ b/build/gulpfile.hygiene.js @@ -274,7 +274,7 @@ function hygiene(some) { const result = input .pipe(filter(f => !f.stat.isDirectory())) .pipe(productJsonFilter) - .pipe(productJson) + .pipe(process.env['BUILD_SOURCEVERSION'] ? es.through() : productJson) .pipe(productJsonFilter.restore) .pipe(filter(indentationFilter)) .pipe(indentation) From cefbf36d1d5c1be0941a890d5312e4b329efef32 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 26 Jun 2019 15:17:08 -0700 Subject: [PATCH 0691/1449] Add docCommentTemplate to syntax commands --- extensions/typescript-language-features/src/tsServer/server.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/extensions/typescript-language-features/src/tsServer/server.ts b/extensions/typescript-language-features/src/tsServer/server.ts index 2bcfbf6a9ef..c51aab0fa4b 100644 --- a/extensions/typescript-language-features/src/tsServer/server.ts +++ b/extensions/typescript-language-features/src/tsServer/server.ts @@ -340,6 +340,7 @@ export class SyntaxRoutingTsServer extends Disposable implements ITypeScriptServ 'selectionRange', 'format', 'formatonkey', + 'docCommentTemplate', ]); private static readonly sharedCommands = new Set([ 'change', From 9f7dd28e6d6771392ac8fa40bac0a38546c352f1 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Wed, 26 Jun 2019 15:46:15 -0700 Subject: [PATCH 0692/1449] Update icons --- extensions/git/resources/icons/dark/check.svg | 2 +- extensions/git/resources/icons/dark/clean.svg | 2 +- .../git/resources/icons/dark/open-change.svg | 7 +------ .../git/resources/icons/dark/open-file.svg | 4 +--- .../git/resources/icons/light/check.svg | 2 +- .../git/resources/icons/light/clean.svg | 2 +- .../git/resources/icons/light/open-change.svg | 7 +------ .../git/resources/icons/light/open-file.svg | 4 +--- .../media/preview-dark.svg | 6 +----- .../media/preview-light.svg | 6 +----- .../media/view-source-dark.svg | 4 +--- .../media/view-source-light.svg | 4 +--- .../ui/breadcrumbs/tree-collapsed-dark.svg | 2 +- .../ui/breadcrumbs/tree-collapsed-hc.svg | 2 +- .../ui/breadcrumbs/tree-collapsed-light.svg | 2 +- .../ui/findinput/case-sensitive-dark.svg | 3 +-- .../ui/findinput/case-sensitive-hc.svg | 3 +-- .../ui/findinput/case-sensitive-light.svg | 3 +-- .../base/browser/ui/findinput/regex-dark.svg | 3 +-- src/vs/base/browser/ui/findinput/regex-hc.svg | 3 +-- .../base/browser/ui/findinput/regex-light.svg | 3 +-- .../browser/ui/findinput/whole-word-dark.svg | 6 +----- .../browser/ui/findinput/whole-word-hc.svg | 6 +----- .../browser/ui/findinput/whole-word-light.svg | 6 +----- .../ui/splitview/tree-collapsed-dark.svg | 2 +- .../ui/splitview/tree-collapsed-hc.svg | 2 +- .../ui/splitview/tree-collapsed-light.svg | 2 +- .../ui/splitview/tree-expanded-dark.svg | 2 +- .../browser/ui/splitview/tree-expanded-hc.svg | 2 +- .../ui/splitview/tree-expanded-light.svg | 2 +- .../ui/tree/media/tree-collapsed-dark.svg | 2 +- .../ui/tree/media/tree-collapsed-hc.svg | 2 +- .../ui/tree/media/tree-collapsed-light.svg | 2 +- .../ui/tree/media/tree-expanded-dark.svg | 2 +- .../ui/tree/media/tree-expanded-hc.svg | 2 +- .../ui/tree/media/tree-expanded-light.svg | 2 +- .../parts/tree/browser/collapse-all-dark.svg | 2 +- .../parts/tree/browser/collapse-all-hc.svg | 2 +- .../parts/tree/browser/collapse-all-light.svg | 2 +- .../tree/browser/tree-collapsed-dark.svg | 2 +- .../parts/tree/browser/tree-collapsed-hc.svg | 2 +- .../tree/browser/tree-collapsed-light.svg | 2 +- .../parts/tree/browser/tree-expanded-dark.svg | 2 +- .../parts/tree/browser/tree-expanded-hc.svg | 2 +- .../tree/browser/tree-expanded-light.svg | 2 +- .../documentSymbols/media/boolean-dark.svg | 3 +-- .../documentSymbols/media/boolean-light.svg | 3 +-- .../documentSymbols/media/class-dark.svg | 6 +----- .../documentSymbols/media/class-light.svg | 6 +----- .../documentSymbols/media/enumerator-dark.svg | 6 +----- .../media/enumerator-light.svg | 6 +----- .../documentSymbols/media/indexer-dark.svg | 3 +-- .../documentSymbols/media/indexer-light.svg | 3 +-- .../documentSymbols/media/interface-dark.svg | 4 +--- .../documentSymbols/media/interface-light.svg | 4 +--- .../documentSymbols/media/namespace-dark.svg | 3 +-- .../documentSymbols/media/namespace-light.svg | 3 +-- .../documentSymbols/media/numeric-dark.svg | 5 +---- .../documentSymbols/media/numeric-light.svg | 5 +---- .../documentSymbols/media/operator-dark.svg | 14 +------------ .../documentSymbols/media/operator-light.svg | 14 +------------ .../documentSymbols/media/snippet-dark.svg | 9 +-------- .../documentSymbols/media/snippet-light.svg | 9 +-------- .../documentSymbols/media/string-dark.svg | 7 +------ .../documentSymbols/media/string-light.svg | 7 +------ .../documentSymbols/media/structure-dark.svg | 4 +--- .../documentSymbols/media/structure-light.svg | 4 +--- .../documentSymbols/media/template-dark.svg | 4 +--- .../documentSymbols/media/template-light.svg | 4 +--- .../documentSymbols/media/variable-dark.svg | 3 +-- .../documentSymbols/media/variable-light.svg | 3 +-- .../images/cancelSelectionFind-inverse.svg | 8 -------- .../find/images/cancelSelectionFind.svg | 8 -------- .../find/images/chevron-previous-dark.svg | 1 - .../find/images/chevron-previous-light.svg | 1 - .../editor/contrib/find/images/close-dark.svg | 3 +-- .../contrib/find/images/close-light.svg | 3 +-- src/vs/editor/contrib/find/images/close.svg | 1 - .../contrib/find/images/next-inverse.svg | 5 ----- src/vs/editor/contrib/find/images/next.svg | 5 ----- .../contrib/find/images/previous-inverse.svg | 5 ----- .../editor/contrib/find/images/previous.svg | 5 ----- .../contrib/find/images/replace-all-dark.svg | 10 +--------- .../find/images/replace-all-inverse.svg | 11 ---------- .../contrib/find/images/replace-all-light.svg | 10 +--------- .../contrib/find/images/replace-all.svg | 11 ---------- .../contrib/find/images/replace-dark.svg | 5 +---- .../contrib/find/images/replace-inverse.svg | 13 ------------ .../contrib/find/images/replace-light.svg | 5 +---- src/vs/editor/contrib/find/images/replace.svg | 13 ------------ .../find/images/tree-expanded-dark.svg | 2 +- .../find/images/tree-expanded-light.svg | 2 +- .../editor/contrib/find/simpleFindWidget.css | 10 +++++----- .../contrib/folding/tree-collapsed-dark.svg | 2 +- .../contrib/folding/tree-collapsed-hc.svg | 2 +- .../contrib/folding/tree-collapsed-light.svg | 2 +- .../contrib/folding/tree-expanded-dark.svg | 2 +- .../contrib/folding/tree-expanded-hc.svg | 2 +- .../contrib/folding/tree-expanded-light.svg | 2 +- .../media/chevron-previous-dark.svg | 1 - .../media/chevron-previous-light.svg | 1 - .../referenceSearch/media/close-dark.svg | 3 +-- .../referenceSearch/media/close-light.svg | 3 +-- .../contrib/suggest/media/boolean-dark.svg | 3 +-- .../contrib/suggest/media/boolean-light.svg | 3 +-- .../contrib/suggest/media/class-dark.svg | 6 +----- .../contrib/suggest/media/class-light.svg | 6 +----- .../contrib/suggest/media/close-dark.svg | 3 +-- .../contrib/suggest/media/close-light.svg | 3 +-- .../contrib/suggest/media/enumerator-dark.svg | 5 +---- .../suggest/media/enumerator-light.svg | 5 +---- .../contrib/suggest/media/event-dark.svg | 2 +- .../contrib/suggest/media/indexer-dark.svg | 3 +-- .../contrib/suggest/media/indexer-light.svg | 3 +-- .../contrib/suggest/media/info-dark.svg | 7 +------ .../contrib/suggest/media/info-light.svg | 6 +----- .../contrib/suggest/media/interface-dark.svg | 4 +--- .../contrib/suggest/media/interface-light.svg | 4 +--- .../contrib/suggest/media/namespace-dark.svg | 3 +-- .../contrib/suggest/media/namespace-light.svg | 3 +-- .../contrib/suggest/media/numeric-dark.svg | 5 +---- .../contrib/suggest/media/numeric-light.svg | 5 +---- .../contrib/suggest/media/operator-dark.svg | 14 +------------ .../contrib/suggest/media/operator-light.svg | 14 +------------ .../contrib/suggest/media/reference-dark.svg | 3 +-- .../contrib/suggest/media/reference-light.svg | 3 +-- .../contrib/suggest/media/ruler-dark.svg | 3 +-- .../contrib/suggest/media/ruler-light.svg | 3 +-- .../contrib/suggest/media/snippet-dark.svg | 9 +-------- .../contrib/suggest/media/snippet-light.svg | 9 +-------- .../contrib/suggest/media/string-dark.svg | 7 +------ .../contrib/suggest/media/string-light.svg | 7 +------ .../contrib/suggest/media/structure-dark.svg | 4 +--- .../contrib/suggest/media/structure-light.svg | 4 +--- .../contrib/suggest/media/template-dark.svg | 4 +--- .../contrib/suggest/media/template-light.svg | 4 +--- .../contrib/suggest/media/variable-dark.svg | 3 +-- .../contrib/suggest/media/variable-light.svg | 3 +-- .../parts/editor/media/close-all-dark.svg | 2 +- .../parts/editor/media/close-all-light.svg | 2 +- .../browser/parts/editor/media/close-dark.svg | 3 +-- .../browser/parts/editor/media/close-hc.svg | 3 +-- .../parts/editor/media/close-light.svg | 3 +-- .../parts/editor/media/next-diff-dark.svg | 2 +- .../parts/editor/media/next-diff-light.svg | 2 +- .../parts/editor/media/previous-diff-dark.svg | 2 +- .../editor/media/previous-diff-light.svg | 2 +- .../media/split-editor-horizontal-dark.svg | 3 +-- .../media/split-editor-horizontal-hc.svg | 3 +-- .../media/split-editor-horizontal-light.svg | 7 +++++-- .../media/split-editor-vertical-dark.svg | 3 +-- .../editor/media/split-editor-vertical-hc.svg | 3 +-- .../media/split-editor-vertical-light.svg | 7 +++++-- .../parts/notifications/media/close-dark.svg | 3 +-- .../parts/notifications/media/close-light.svg | 3 +-- .../notifications/media/configure-dark.svg | 2 +- .../parts/notifications/media/info-dark.svg | 3 +-- .../parts/notifications/media/info-light.svg | 10 ++-------- .../parts/panel/media/chevron-down-dark.svg | 2 +- .../parts/panel/media/chevron-down-hc.svg | 2 +- .../parts/panel/media/chevron-down-light.svg | 2 +- .../parts/panel/media/chevron-left-dark.svg | 2 +- .../parts/panel/media/chevron-left-hc.svg | 2 +- .../parts/panel/media/chevron-left-light.svg | 2 +- .../parts/panel/media/chevron-right-dark.svg | 2 +- .../parts/panel/media/chevron-right-hc.svg | 2 +- .../parts/panel/media/chevron-right-light.svg | 2 +- .../parts/panel/media/chevron-up-dark.svg | 2 +- .../parts/panel/media/chevron-up-hc.svg | 2 +- .../parts/panel/media/chevron-up-light.svg | 2 +- .../parts/views/media/tree-collapsed-dark.svg | 2 +- .../parts/views/media/tree-collapsed-hc.svg | 2 +- .../views/media/tree-collapsed-light.svg | 2 +- .../parts/views/media/tree-expanded-dark.svg | 2 +- .../parts/views/media/tree-expanded-hc.svg | 2 +- .../parts/views/media/tree-expanded-light.svg | 2 +- .../media/breakpoint-conditional-disabled.svg | 2 +- .../breakpoint-conditional-unverified.svg | 2 +- .../browser/media/breakpoint-conditional.svg | 2 +- .../media/breakpoint-function-disabled.svg | 2 +- .../media/breakpoint-function-unverified.svg | 2 +- .../browser/media/breakpoint-function.svg | 2 +- .../debug/browser/media/breakpoint-hint.svg | 2 +- .../browser/media/breakpoint-log-disabled.svg | 2 +- .../media/breakpoint-log-unverified.svg | 2 +- .../debug/browser/media/breakpoint-log.svg | 2 +- .../browser/media/breakpoint-unsupported.svg | 2 +- .../browser/media/breakpoint-unverified.svg | 2 +- .../debug/browser/media/breakpoint.svg | 2 +- .../debug/browser/media/close-all-dark.svg | 2 +- .../debug/browser/media/close-all-hc.svg | 2 +- .../debug/browser/media/close-all-light.svg | 2 +- .../debug/browser/media/configure-dark.svg | 2 +- .../debug/browser/media/configure-hc.svg | 2 +- .../debug/browser/media/configure-light.svg | 2 +- .../debug/browser/media/console-dark.svg | 3 +-- .../debug/browser/media/console-hc.svg | 3 +-- .../debug/browser/media/console-light.svg | 3 +-- .../debug/browser/media/continue-dark.svg | 3 +-- .../debug/browser/media/continue-light.svg | 3 +-- .../browser/media/current-and-breakpoint.svg | 4 ++-- .../debug/browser/media/current-arrow.svg | 3 +-- .../debug/browser/media/disconnect-dark.svg | 2 +- .../debug/browser/media/disconnect-light.svg | 2 +- .../contrib/debug/browser/media/drag.svg | 7 +------ .../debug/browser/media/pause-dark.svg | 2 +- .../debug/browser/media/pause-light.svg | 2 +- .../debug/browser/media/restart-dark.svg | 4 +--- .../debug/browser/media/restart-light.svg | 4 +--- .../browser/media/reverse-continue-dark.svg | 3 +-- .../browser/media/reverse-continue-light.svg | 3 +-- .../media/stackframe-and-breakpoint.svg | 4 ++-- .../debug/browser/media/stackframe-arrow.svg | 3 +-- .../debug/browser/media/start-dark.svg | 2 +- .../contrib/debug/browser/media/start-hc.svg | 2 +- .../debug/browser/media/start-light.svg | 2 +- .../debug/browser/media/step-back-dark.svg | 8 +------- .../debug/browser/media/step-back-light.svg | 8 +------- .../debug/browser/media/step-into-dark.svg | 3 +-- .../debug/browser/media/step-into-light.svg | 3 +-- .../debug/browser/media/step-out-dark.svg | 3 +-- .../debug/browser/media/step-out-light.svg | 3 +-- .../debug/browser/media/step-over-dark.svg | 8 +------- .../debug/browser/media/step-over-light.svg | 8 +------- .../contrib/debug/browser/media/stop-dark.svg | 2 +- .../debug/browser/media/stop-light.svg | 2 +- .../browser/media/toggle-breakpoints-dark.svg | 2 +- .../browser/media/toggle-breakpoints-hc.svg | 2 +- .../media/toggle-breakpoints-light.svg | 2 +- .../electron-browser/media/configure-dark.svg | 2 +- .../electron-browser/media/configure-hc.svg | 2 +- .../media/configure-light.svg | 2 +- .../electron-browser/media/star-empty.svg | 3 +-- .../electron-browser/media/star-full.svg | 3 +-- .../electron-browser/media/star-half.svg | 2 +- .../electron-browser/media/star-small.svg | 10 ++++++++++ .../files/browser/media/action-close-dark.svg | 3 +-- .../browser/media/action-close-light.svg | 3 +-- .../files/browser/media/add-file-dark.svg | 4 +--- .../files/browser/media/add-file-hc.svg | 4 +--- .../files/browser/media/add-file-light.svg | 4 +--- .../files/browser/media/add-folder-dark.svg | 6 ++---- .../files/browser/media/add-folder-hc.svg | 6 ++---- .../files/browser/media/add-folder-light.svg | 6 ++---- .../files/browser/media/close-all-dark.svg | 2 +- .../files/browser/media/close-all-hc.svg | 2 +- .../files/browser/media/close-all-light.svg | 2 +- .../files/browser/media/collapse-all-dark.svg | 2 +- .../files/browser/media/collapse-all-hc.svg | 2 +- .../browser/media/collapse-all-light.svg | 2 +- .../browser/media/files-activity-bar.svg | 2 +- .../files/browser/media/preview-dark.svg | 2 +- .../files/browser/media/preview-light.svg | 2 +- .../files/browser/media/save-all-dark.svg | 4 +--- .../files/browser/media/save-all-hc.svg | 4 +--- .../files/browser/media/save-all-light.svg | 4 +--- .../media/split-editor-horizontal-dark.svg | 3 +-- .../media/split-editor-horizontal-hc.svg | 3 +-- .../media/split-editor-horizontal-light.svg | 7 +++++-- .../media/split-editor-vertical-dark.svg | 3 +-- .../media/split-editor-vertical-hc.svg | 3 +-- .../media/split-editor-vertical-light.svg | 7 +++++-- .../browser/media/exclude-settings-dark.svg | 3 +-- .../browser/media/exclude-settings-hc.svg | 3 +-- .../browser/media/exclude-settings-light.svg | 3 +-- .../output/browser/media/clear-dark.svg | 2 +- .../contrib/output/browser/media/clear-hc.svg | 2 +- .../output/browser/media/clear-light.svg | 2 +- .../output/browser/media/locked-dark.svg | 2 +- .../output/browser/media/locked-hc.svg | 2 +- .../output/browser/media/locked-light.svg | 2 +- .../output/browser/media/open-file-dark.svg | 4 +--- .../output/browser/media/open-file-hc.svg | 4 +--- .../output/browser/media/open-file-light.svg | 4 +--- .../output/browser/media/unlocked-dark.svg | 2 +- .../output/browser/media/unlocked-hc.svg | 2 +- .../output/browser/media/unlocked-light.svg | 2 +- .../browser/media/action-remove-dark.svg | 1 - .../browser/media/action-remove.svg | 1 - .../preferences/browser/media/add-dark.svg | 3 +++ .../preferences/browser/media/add-light.svg | 3 +++ .../preferences/browser/media/check-dark.svg | 3 +++ .../browser/media/check-inverse.svg | 1 - .../preferences/browser/media/check-light.svg | 3 +++ .../preferences/browser/media/check.svg | 1 - .../preferences/browser/media/clear-dark.svg | 7 +++++++ .../browser/media/clear-inverse.svg | 1 - .../preferences/browser/media/clear-light.svg | 7 +++++++ .../preferences/browser/media/clear.svg | 1 - .../browser/media/configure-dark.svg | 3 +++ .../browser/media/configure-inverse.svg | 1 - .../browser/media/configure-light.svg | 3 +++ .../preferences/browser/media/configure.svg | 1 - .../preferences/browser/media/edit-dark.svg | 3 +++ .../browser/media/edit-json-dark.svg | 4 +--- .../browser/media/edit-json-light.svg | 4 +--- .../preferences/browser/media/edit-light.svg | 3 +++ .../browser/media/keybindingsEditor.css | 20 +++++++++---------- .../browser/media/preferences-editor-dark.svg | 3 +-- .../media/preferences-editor-light.svg | 3 +-- .../preferences/browser/media/preferences.css | 13 ++++++------ .../browser/media/record-keys-dark.svg | 3 +++ .../browser/media/record-keys-inverse.svg | 3 --- .../browser/media/record-keys-light.svg | 3 +++ .../preferences/browser/media/record-keys.svg | 3 --- .../preferences/browser/media/remove-dark.svg | 3 +++ .../browser/media/remove-light.svg | 3 +++ .../browser/media/settingsEditor2.css | 8 ++++---- .../browser/media/settingsWidgets.css | 8 ++++---- .../browser/media/sort-precedence-dark.svg | 3 +++ .../browser/media/sort-precedence-light.svg | 3 +++ .../browser/media/sort_precedence.svg | 1 - .../browser/media/sort_precedence_inverse.svg | 1 - .../browser/media/tree-collapsed-dark.svg | 3 +++ .../browser/media/tree-collapsed-light.svg | 3 +++ .../browser/media/tree-expanded-dark.svg | 3 +++ .../browser/media/tree-expanded-light.svg | 3 +++ .../browser/media/collapse-all-dark.svg | 2 +- .../search/browser/media/collapse-all-hc.svg | 2 +- .../browser/media/collapse-all-light.svg | 2 +- .../browser/media/exclude-settings-dark.svg | 3 +-- .../browser/media/exclude-settings-hc.svg | 3 +-- .../browser/media/exclude-settings-light.svg | 3 +-- .../search/browser/media/remove-dark.svg | 3 +-- .../search/browser/media/remove-hc.svg | 3 +-- .../search/browser/media/remove-light.svg | 3 +-- .../search/browser/media/replace-dark.svg | 5 +---- .../search/browser/media/replace-hc.svg | 5 +---- .../search/browser/media/replace-light.svg | 5 +---- .../search/browser/media/stop-dark.svg | 2 +- .../contrib/search/browser/media/stop-hc.svg | 2 +- .../search/browser/media/stop-light.svg | 2 +- .../browser/media/tree-collapsed-dark.svg | 2 +- .../browser/media/tree-collapsed-hc.svg | 2 +- .../browser/media/tree-collapsed-light.svg | 2 +- .../browser/media/tree-expanded-dark.svg | 2 +- .../search/browser/media/tree-expanded-hc.svg | 2 +- .../browser/media/tree-expanded-light.svg | 2 +- .../tasks/common/media/configure-dark.svg | 3 +++ .../tasks/common/media/configure-inverse.svg | 1 - .../tasks/common/media/configure-light.svg | 3 +++ .../contrib/tasks/common/media/configure.svg | 1 - .../tasks/common/media/task.contribution.css | 4 ++-- .../terminal/browser/media/configure-dark.svg | 2 +- .../terminal/browser/media/configure-hc.svg | 2 +- .../browser/media/configure-light.svg | 2 +- .../terminal/browser/media/kill-dark.svg | 7 +------ .../terminal/browser/media/kill-hc.svg | 7 +------ .../terminal/browser/media/kill-light.svg | 7 +------ .../media/split-editor-horizontal-dark.svg | 3 +-- .../media/split-editor-horizontal-hc.svg | 3 +-- .../media/split-editor-horizontal-light.svg | 3 +-- .../media/split-editor-vertical-dark.svg | 3 +-- .../media/split-editor-vertical-hc.svg | 3 +-- .../media/split-editor-vertical-light.svg | 3 +-- 355 files changed, 435 insertions(+), 847 deletions(-) delete mode 100644 src/vs/editor/contrib/find/images/cancelSelectionFind-inverse.svg delete mode 100644 src/vs/editor/contrib/find/images/cancelSelectionFind.svg delete mode 100644 src/vs/editor/contrib/find/images/close.svg delete mode 100644 src/vs/editor/contrib/find/images/next-inverse.svg delete mode 100644 src/vs/editor/contrib/find/images/next.svg delete mode 100644 src/vs/editor/contrib/find/images/previous-inverse.svg delete mode 100644 src/vs/editor/contrib/find/images/previous.svg delete mode 100644 src/vs/editor/contrib/find/images/replace-all-inverse.svg delete mode 100644 src/vs/editor/contrib/find/images/replace-all.svg delete mode 100644 src/vs/editor/contrib/find/images/replace-inverse.svg delete mode 100644 src/vs/editor/contrib/find/images/replace.svg create mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/star-small.svg delete mode 100644 src/vs/workbench/contrib/preferences/browser/media/action-remove-dark.svg delete mode 100644 src/vs/workbench/contrib/preferences/browser/media/action-remove.svg create mode 100644 src/vs/workbench/contrib/preferences/browser/media/add-dark.svg create mode 100644 src/vs/workbench/contrib/preferences/browser/media/add-light.svg create mode 100644 src/vs/workbench/contrib/preferences/browser/media/check-dark.svg delete mode 100644 src/vs/workbench/contrib/preferences/browser/media/check-inverse.svg create mode 100644 src/vs/workbench/contrib/preferences/browser/media/check-light.svg delete mode 100644 src/vs/workbench/contrib/preferences/browser/media/check.svg create mode 100644 src/vs/workbench/contrib/preferences/browser/media/clear-dark.svg delete mode 100644 src/vs/workbench/contrib/preferences/browser/media/clear-inverse.svg create mode 100644 src/vs/workbench/contrib/preferences/browser/media/clear-light.svg delete mode 100644 src/vs/workbench/contrib/preferences/browser/media/clear.svg create mode 100644 src/vs/workbench/contrib/preferences/browser/media/configure-dark.svg delete mode 100644 src/vs/workbench/contrib/preferences/browser/media/configure-inverse.svg create mode 100644 src/vs/workbench/contrib/preferences/browser/media/configure-light.svg delete mode 100644 src/vs/workbench/contrib/preferences/browser/media/configure.svg create mode 100644 src/vs/workbench/contrib/preferences/browser/media/edit-dark.svg create mode 100644 src/vs/workbench/contrib/preferences/browser/media/edit-light.svg create mode 100644 src/vs/workbench/contrib/preferences/browser/media/record-keys-dark.svg delete mode 100644 src/vs/workbench/contrib/preferences/browser/media/record-keys-inverse.svg create mode 100644 src/vs/workbench/contrib/preferences/browser/media/record-keys-light.svg delete mode 100644 src/vs/workbench/contrib/preferences/browser/media/record-keys.svg create mode 100644 src/vs/workbench/contrib/preferences/browser/media/remove-dark.svg create mode 100644 src/vs/workbench/contrib/preferences/browser/media/remove-light.svg create mode 100644 src/vs/workbench/contrib/preferences/browser/media/sort-precedence-dark.svg create mode 100644 src/vs/workbench/contrib/preferences/browser/media/sort-precedence-light.svg delete mode 100644 src/vs/workbench/contrib/preferences/browser/media/sort_precedence.svg delete mode 100644 src/vs/workbench/contrib/preferences/browser/media/sort_precedence_inverse.svg create mode 100644 src/vs/workbench/contrib/preferences/browser/media/tree-collapsed-dark.svg create mode 100644 src/vs/workbench/contrib/preferences/browser/media/tree-collapsed-light.svg create mode 100644 src/vs/workbench/contrib/preferences/browser/media/tree-expanded-dark.svg create mode 100644 src/vs/workbench/contrib/preferences/browser/media/tree-expanded-light.svg create mode 100644 src/vs/workbench/contrib/tasks/common/media/configure-dark.svg delete mode 100644 src/vs/workbench/contrib/tasks/common/media/configure-inverse.svg create mode 100644 src/vs/workbench/contrib/tasks/common/media/configure-light.svg delete mode 100644 src/vs/workbench/contrib/tasks/common/media/configure.svg diff --git a/extensions/git/resources/icons/dark/check.svg b/extensions/git/resources/icons/dark/check.svg index 5f69de8fc69..865cc83c347 100644 --- a/extensions/git/resources/icons/dark/check.svg +++ b/extensions/git/resources/icons/dark/check.svg @@ -1,3 +1,3 @@ - + diff --git a/extensions/git/resources/icons/dark/clean.svg b/extensions/git/resources/icons/dark/clean.svg index eb7bfecd100..de85d6ba679 100644 --- a/extensions/git/resources/icons/dark/clean.svg +++ b/extensions/git/resources/icons/dark/clean.svg @@ -1,3 +1,3 @@ - + diff --git a/extensions/git/resources/icons/dark/open-change.svg b/extensions/git/resources/icons/dark/open-change.svg index ebcd291d745..41ebc85a8c8 100644 --- a/extensions/git/resources/icons/dark/open-change.svg +++ b/extensions/git/resources/icons/dark/open-change.svg @@ -1,8 +1,3 @@ - - - - - - + diff --git a/extensions/git/resources/icons/dark/open-file.svg b/extensions/git/resources/icons/dark/open-file.svg index 5cebcad2a8d..ed302ae1398 100644 --- a/extensions/git/resources/icons/dark/open-file.svg +++ b/extensions/git/resources/icons/dark/open-file.svg @@ -1,5 +1,3 @@ - - - + diff --git a/extensions/git/resources/icons/light/check.svg b/extensions/git/resources/icons/light/check.svg index 2b6712efcc1..e1a546660ed 100644 --- a/extensions/git/resources/icons/light/check.svg +++ b/extensions/git/resources/icons/light/check.svg @@ -1,3 +1,3 @@ - + diff --git a/extensions/git/resources/icons/light/clean.svg b/extensions/git/resources/icons/light/clean.svg index ccef86a530f..b70626957d0 100644 --- a/extensions/git/resources/icons/light/clean.svg +++ b/extensions/git/resources/icons/light/clean.svg @@ -1,3 +1,3 @@ - + diff --git a/extensions/git/resources/icons/light/open-change.svg b/extensions/git/resources/icons/light/open-change.svg index 5d361a749f3..772c3c198fc 100644 --- a/extensions/git/resources/icons/light/open-change.svg +++ b/extensions/git/resources/icons/light/open-change.svg @@ -1,8 +1,3 @@ - - - - - - + diff --git a/extensions/git/resources/icons/light/open-file.svg b/extensions/git/resources/icons/light/open-file.svg index e5b2a034bf8..392a840c5ef 100644 --- a/extensions/git/resources/icons/light/open-file.svg +++ b/extensions/git/resources/icons/light/open-file.svg @@ -1,5 +1,3 @@ - - - + diff --git a/extensions/markdown-language-features/media/preview-dark.svg b/extensions/markdown-language-features/media/preview-dark.svg index b22cf9dbbb1..ec71ea81143 100644 --- a/extensions/markdown-language-features/media/preview-dark.svg +++ b/extensions/markdown-language-features/media/preview-dark.svg @@ -1,7 +1,3 @@ - - - - - + diff --git a/extensions/markdown-language-features/media/preview-light.svg b/extensions/markdown-language-features/media/preview-light.svg index 4ae1a8b7159..4a6b85b5839 100644 --- a/extensions/markdown-language-features/media/preview-light.svg +++ b/extensions/markdown-language-features/media/preview-light.svg @@ -1,7 +1,3 @@ - - - - - + diff --git a/extensions/markdown-language-features/media/view-source-dark.svg b/extensions/markdown-language-features/media/view-source-dark.svg index 5cebcad2a8d..ed302ae1398 100644 --- a/extensions/markdown-language-features/media/view-source-dark.svg +++ b/extensions/markdown-language-features/media/view-source-dark.svg @@ -1,5 +1,3 @@ - - - + diff --git a/extensions/markdown-language-features/media/view-source-light.svg b/extensions/markdown-language-features/media/view-source-light.svg index e5b2a034bf8..392a840c5ef 100644 --- a/extensions/markdown-language-features/media/view-source-light.svg +++ b/extensions/markdown-language-features/media/view-source-light.svg @@ -1,5 +1,3 @@ - - - + diff --git a/src/vs/base/browser/ui/breadcrumbs/tree-collapsed-dark.svg b/src/vs/base/browser/ui/breadcrumbs/tree-collapsed-dark.svg index 019cce05ef0..243be1451cc 100644 --- a/src/vs/base/browser/ui/breadcrumbs/tree-collapsed-dark.svg +++ b/src/vs/base/browser/ui/breadcrumbs/tree-collapsed-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/base/browser/ui/breadcrumbs/tree-collapsed-hc.svg b/src/vs/base/browser/ui/breadcrumbs/tree-collapsed-hc.svg index 2206da82fb0..40ba72b7086 100644 --- a/src/vs/base/browser/ui/breadcrumbs/tree-collapsed-hc.svg +++ b/src/vs/base/browser/ui/breadcrumbs/tree-collapsed-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/base/browser/ui/breadcrumbs/tree-collapsed-light.svg b/src/vs/base/browser/ui/breadcrumbs/tree-collapsed-light.svg index 14220b8d99e..0d746558a4f 100644 --- a/src/vs/base/browser/ui/breadcrumbs/tree-collapsed-light.svg +++ b/src/vs/base/browser/ui/breadcrumbs/tree-collapsed-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/base/browser/ui/findinput/case-sensitive-dark.svg b/src/vs/base/browser/ui/findinput/case-sensitive-dark.svg index eb86779a59d..40c9ed3262c 100644 --- a/src/vs/base/browser/ui/findinput/case-sensitive-dark.svg +++ b/src/vs/base/browser/ui/findinput/case-sensitive-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/base/browser/ui/findinput/case-sensitive-hc.svg b/src/vs/base/browser/ui/findinput/case-sensitive-hc.svg index 591d050b0f6..82501418dae 100644 --- a/src/vs/base/browser/ui/findinput/case-sensitive-hc.svg +++ b/src/vs/base/browser/ui/findinput/case-sensitive-hc.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/base/browser/ui/findinput/case-sensitive-light.svg b/src/vs/base/browser/ui/findinput/case-sensitive-light.svg index cbb44fdaa1e..aa1dbd353e4 100644 --- a/src/vs/base/browser/ui/findinput/case-sensitive-light.svg +++ b/src/vs/base/browser/ui/findinput/case-sensitive-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/base/browser/ui/findinput/regex-dark.svg b/src/vs/base/browser/ui/findinput/regex-dark.svg index 4f07c9e57d8..cf43e9d952e 100644 --- a/src/vs/base/browser/ui/findinput/regex-dark.svg +++ b/src/vs/base/browser/ui/findinput/regex-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/base/browser/ui/findinput/regex-hc.svg b/src/vs/base/browser/ui/findinput/regex-hc.svg index bffb311a5be..116c547d15f 100644 --- a/src/vs/base/browser/ui/findinput/regex-hc.svg +++ b/src/vs/base/browser/ui/findinput/regex-hc.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/base/browser/ui/findinput/regex-light.svg b/src/vs/base/browser/ui/findinput/regex-light.svg index bca6f0e8f87..b329c104fa2 100644 --- a/src/vs/base/browser/ui/findinput/regex-light.svg +++ b/src/vs/base/browser/ui/findinput/regex-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/base/browser/ui/findinput/whole-word-dark.svg b/src/vs/base/browser/ui/findinput/whole-word-dark.svg index d37676e0e2b..6c38eb215d3 100644 --- a/src/vs/base/browser/ui/findinput/whole-word-dark.svg +++ b/src/vs/base/browser/ui/findinput/whole-word-dark.svg @@ -1,7 +1,3 @@ - - - - - + diff --git a/src/vs/base/browser/ui/findinput/whole-word-hc.svg b/src/vs/base/browser/ui/findinput/whole-word-hc.svg index 28e2087cab6..fc1ff43268b 100644 --- a/src/vs/base/browser/ui/findinput/whole-word-hc.svg +++ b/src/vs/base/browser/ui/findinput/whole-word-hc.svg @@ -1,7 +1,3 @@ - - - - - + diff --git a/src/vs/base/browser/ui/findinput/whole-word-light.svg b/src/vs/base/browser/ui/findinput/whole-word-light.svg index 9c8af3270a0..345e65b2a5c 100644 --- a/src/vs/base/browser/ui/findinput/whole-word-light.svg +++ b/src/vs/base/browser/ui/findinput/whole-word-light.svg @@ -1,7 +1,3 @@ - - - - - + diff --git a/src/vs/base/browser/ui/splitview/tree-collapsed-dark.svg b/src/vs/base/browser/ui/splitview/tree-collapsed-dark.svg index a14b1021a0c..c2c2298dd5c 100644 --- a/src/vs/base/browser/ui/splitview/tree-collapsed-dark.svg +++ b/src/vs/base/browser/ui/splitview/tree-collapsed-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/base/browser/ui/splitview/tree-collapsed-hc.svg b/src/vs/base/browser/ui/splitview/tree-collapsed-hc.svg index 3346c4c86da..3732cbc04b8 100644 --- a/src/vs/base/browser/ui/splitview/tree-collapsed-hc.svg +++ b/src/vs/base/browser/ui/splitview/tree-collapsed-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/base/browser/ui/splitview/tree-collapsed-light.svg b/src/vs/base/browser/ui/splitview/tree-collapsed-light.svg index 9d49125d64c..1952ad63f84 100644 --- a/src/vs/base/browser/ui/splitview/tree-collapsed-light.svg +++ b/src/vs/base/browser/ui/splitview/tree-collapsed-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/base/browser/ui/splitview/tree-expanded-dark.svg b/src/vs/base/browser/ui/splitview/tree-expanded-dark.svg index f94f6902fbd..5570923e175 100644 --- a/src/vs/base/browser/ui/splitview/tree-expanded-dark.svg +++ b/src/vs/base/browser/ui/splitview/tree-expanded-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/base/browser/ui/splitview/tree-expanded-hc.svg b/src/vs/base/browser/ui/splitview/tree-expanded-hc.svg index d45a54b24c0..b370009330c 100644 --- a/src/vs/base/browser/ui/splitview/tree-expanded-hc.svg +++ b/src/vs/base/browser/ui/splitview/tree-expanded-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/base/browser/ui/splitview/tree-expanded-light.svg b/src/vs/base/browser/ui/splitview/tree-expanded-light.svg index 84a3e0c5fa1..939ebc8b969 100644 --- a/src/vs/base/browser/ui/splitview/tree-expanded-light.svg +++ b/src/vs/base/browser/ui/splitview/tree-expanded-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/base/browser/ui/tree/media/tree-collapsed-dark.svg b/src/vs/base/browser/ui/tree/media/tree-collapsed-dark.svg index 7c05748ad45..c2c2298dd5c 100644 --- a/src/vs/base/browser/ui/tree/media/tree-collapsed-dark.svg +++ b/src/vs/base/browser/ui/tree/media/tree-collapsed-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/base/browser/ui/tree/media/tree-collapsed-hc.svg b/src/vs/base/browser/ui/tree/media/tree-collapsed-hc.svg index 53f2710bfbc..3732cbc04b8 100644 --- a/src/vs/base/browser/ui/tree/media/tree-collapsed-hc.svg +++ b/src/vs/base/browser/ui/tree/media/tree-collapsed-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/base/browser/ui/tree/media/tree-collapsed-light.svg b/src/vs/base/browser/ui/tree/media/tree-collapsed-light.svg index 4788b3d81a1..1952ad63f84 100644 --- a/src/vs/base/browser/ui/tree/media/tree-collapsed-light.svg +++ b/src/vs/base/browser/ui/tree/media/tree-collapsed-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/base/browser/ui/tree/media/tree-expanded-dark.svg b/src/vs/base/browser/ui/tree/media/tree-expanded-dark.svg index c418ef63e84..5570923e175 100644 --- a/src/vs/base/browser/ui/tree/media/tree-expanded-dark.svg +++ b/src/vs/base/browser/ui/tree/media/tree-expanded-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/base/browser/ui/tree/media/tree-expanded-hc.svg b/src/vs/base/browser/ui/tree/media/tree-expanded-hc.svg index 3321f110f32..b370009330c 100644 --- a/src/vs/base/browser/ui/tree/media/tree-expanded-hc.svg +++ b/src/vs/base/browser/ui/tree/media/tree-expanded-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/base/browser/ui/tree/media/tree-expanded-light.svg b/src/vs/base/browser/ui/tree/media/tree-expanded-light.svg index 3893bdf5485..939ebc8b969 100644 --- a/src/vs/base/browser/ui/tree/media/tree-expanded-light.svg +++ b/src/vs/base/browser/ui/tree/media/tree-expanded-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/base/parts/tree/browser/collapse-all-dark.svg b/src/vs/base/parts/tree/browser/collapse-all-dark.svg index 4a3ae7f6009..4862c55dbeb 100644 --- a/src/vs/base/parts/tree/browser/collapse-all-dark.svg +++ b/src/vs/base/parts/tree/browser/collapse-all-dark.svg @@ -1,4 +1,4 @@ - + diff --git a/src/vs/base/parts/tree/browser/collapse-all-hc.svg b/src/vs/base/parts/tree/browser/collapse-all-hc.svg index f2e0e5dd5f6..05f920b29b6 100644 --- a/src/vs/base/parts/tree/browser/collapse-all-hc.svg +++ b/src/vs/base/parts/tree/browser/collapse-all-hc.svg @@ -1,4 +1,4 @@ - + diff --git a/src/vs/base/parts/tree/browser/collapse-all-light.svg b/src/vs/base/parts/tree/browser/collapse-all-light.svg index cb5e5229717..6359b42e623 100644 --- a/src/vs/base/parts/tree/browser/collapse-all-light.svg +++ b/src/vs/base/parts/tree/browser/collapse-all-light.svg @@ -1,4 +1,4 @@ - + diff --git a/src/vs/base/parts/tree/browser/tree-collapsed-dark.svg b/src/vs/base/parts/tree/browser/tree-collapsed-dark.svg index 7c05748ad45..c2c2298dd5c 100644 --- a/src/vs/base/parts/tree/browser/tree-collapsed-dark.svg +++ b/src/vs/base/parts/tree/browser/tree-collapsed-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/base/parts/tree/browser/tree-collapsed-hc.svg b/src/vs/base/parts/tree/browser/tree-collapsed-hc.svg index 53f2710bfbc..3732cbc04b8 100644 --- a/src/vs/base/parts/tree/browser/tree-collapsed-hc.svg +++ b/src/vs/base/parts/tree/browser/tree-collapsed-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/base/parts/tree/browser/tree-collapsed-light.svg b/src/vs/base/parts/tree/browser/tree-collapsed-light.svg index 4788b3d81a1..1952ad63f84 100644 --- a/src/vs/base/parts/tree/browser/tree-collapsed-light.svg +++ b/src/vs/base/parts/tree/browser/tree-collapsed-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/base/parts/tree/browser/tree-expanded-dark.svg b/src/vs/base/parts/tree/browser/tree-expanded-dark.svg index c418ef63e84..d844b383ed3 100644 --- a/src/vs/base/parts/tree/browser/tree-expanded-dark.svg +++ b/src/vs/base/parts/tree/browser/tree-expanded-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/base/parts/tree/browser/tree-expanded-hc.svg b/src/vs/base/parts/tree/browser/tree-expanded-hc.svg index 3321f110f32..9faa2b2a6ed 100644 --- a/src/vs/base/parts/tree/browser/tree-expanded-hc.svg +++ b/src/vs/base/parts/tree/browser/tree-expanded-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/base/parts/tree/browser/tree-expanded-light.svg b/src/vs/base/parts/tree/browser/tree-expanded-light.svg index 3893bdf5485..f09125caf91 100644 --- a/src/vs/base/parts/tree/browser/tree-expanded-light.svg +++ b/src/vs/base/parts/tree/browser/tree-expanded-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/editor/contrib/documentSymbols/media/boolean-dark.svg b/src/vs/editor/contrib/documentSymbols/media/boolean-dark.svg index d9bcbe9dac0..e009568b131 100644 --- a/src/vs/editor/contrib/documentSymbols/media/boolean-dark.svg +++ b/src/vs/editor/contrib/documentSymbols/media/boolean-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/editor/contrib/documentSymbols/media/boolean-light.svg b/src/vs/editor/contrib/documentSymbols/media/boolean-light.svg index 647040941d1..06613f8bedd 100644 --- a/src/vs/editor/contrib/documentSymbols/media/boolean-light.svg +++ b/src/vs/editor/contrib/documentSymbols/media/boolean-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/editor/contrib/documentSymbols/media/class-dark.svg b/src/vs/editor/contrib/documentSymbols/media/class-dark.svg index 8643ca84051..a71e221f6bd 100644 --- a/src/vs/editor/contrib/documentSymbols/media/class-dark.svg +++ b/src/vs/editor/contrib/documentSymbols/media/class-dark.svg @@ -1,7 +1,3 @@ - - - - - + diff --git a/src/vs/editor/contrib/documentSymbols/media/class-light.svg b/src/vs/editor/contrib/documentSymbols/media/class-light.svg index 5e338c8fc61..aa106f18f87 100644 --- a/src/vs/editor/contrib/documentSymbols/media/class-light.svg +++ b/src/vs/editor/contrib/documentSymbols/media/class-light.svg @@ -1,7 +1,3 @@ - - - - - + diff --git a/src/vs/editor/contrib/documentSymbols/media/enumerator-dark.svg b/src/vs/editor/contrib/documentSymbols/media/enumerator-dark.svg index 8643ca84051..82d4ff29c44 100644 --- a/src/vs/editor/contrib/documentSymbols/media/enumerator-dark.svg +++ b/src/vs/editor/contrib/documentSymbols/media/enumerator-dark.svg @@ -1,7 +1,3 @@ - - - - - + diff --git a/src/vs/editor/contrib/documentSymbols/media/enumerator-light.svg b/src/vs/editor/contrib/documentSymbols/media/enumerator-light.svg index 5e338c8fc61..e2441a0dc16 100644 --- a/src/vs/editor/contrib/documentSymbols/media/enumerator-light.svg +++ b/src/vs/editor/contrib/documentSymbols/media/enumerator-light.svg @@ -1,7 +1,3 @@ - - - - - + diff --git a/src/vs/editor/contrib/documentSymbols/media/indexer-dark.svg b/src/vs/editor/contrib/documentSymbols/media/indexer-dark.svg index f45aebbdb3d..e92131d3d02 100644 --- a/src/vs/editor/contrib/documentSymbols/media/indexer-dark.svg +++ b/src/vs/editor/contrib/documentSymbols/media/indexer-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/editor/contrib/documentSymbols/media/indexer-light.svg b/src/vs/editor/contrib/documentSymbols/media/indexer-light.svg index 31a880850e2..207899642c8 100644 --- a/src/vs/editor/contrib/documentSymbols/media/indexer-light.svg +++ b/src/vs/editor/contrib/documentSymbols/media/indexer-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/editor/contrib/documentSymbols/media/interface-dark.svg b/src/vs/editor/contrib/documentSymbols/media/interface-dark.svg index 42156059c6a..6d482b2abde 100644 --- a/src/vs/editor/contrib/documentSymbols/media/interface-dark.svg +++ b/src/vs/editor/contrib/documentSymbols/media/interface-dark.svg @@ -1,5 +1,3 @@ - - - + diff --git a/src/vs/editor/contrib/documentSymbols/media/interface-light.svg b/src/vs/editor/contrib/documentSymbols/media/interface-light.svg index 4b63ceb782f..a397dd00b00 100644 --- a/src/vs/editor/contrib/documentSymbols/media/interface-light.svg +++ b/src/vs/editor/contrib/documentSymbols/media/interface-light.svg @@ -1,5 +1,3 @@ - - - + diff --git a/src/vs/editor/contrib/documentSymbols/media/namespace-dark.svg b/src/vs/editor/contrib/documentSymbols/media/namespace-dark.svg index 17989d852de..9a725bb41fd 100644 --- a/src/vs/editor/contrib/documentSymbols/media/namespace-dark.svg +++ b/src/vs/editor/contrib/documentSymbols/media/namespace-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/editor/contrib/documentSymbols/media/namespace-light.svg b/src/vs/editor/contrib/documentSymbols/media/namespace-light.svg index f1e10c55c98..1339da7ce21 100644 --- a/src/vs/editor/contrib/documentSymbols/media/namespace-light.svg +++ b/src/vs/editor/contrib/documentSymbols/media/namespace-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/editor/contrib/documentSymbols/media/numeric-dark.svg b/src/vs/editor/contrib/documentSymbols/media/numeric-dark.svg index 9b7874a43ec..a1573df0107 100644 --- a/src/vs/editor/contrib/documentSymbols/media/numeric-dark.svg +++ b/src/vs/editor/contrib/documentSymbols/media/numeric-dark.svg @@ -1,6 +1,3 @@ - - - - + diff --git a/src/vs/editor/contrib/documentSymbols/media/numeric-light.svg b/src/vs/editor/contrib/documentSymbols/media/numeric-light.svg index c6e9a426a9f..ea0e56e0225 100644 --- a/src/vs/editor/contrib/documentSymbols/media/numeric-light.svg +++ b/src/vs/editor/contrib/documentSymbols/media/numeric-light.svg @@ -1,6 +1,3 @@ - - - - + diff --git a/src/vs/editor/contrib/documentSymbols/media/operator-dark.svg b/src/vs/editor/contrib/documentSymbols/media/operator-dark.svg index de1650a86d2..06ff14030c2 100644 --- a/src/vs/editor/contrib/documentSymbols/media/operator-dark.svg +++ b/src/vs/editor/contrib/documentSymbols/media/operator-dark.svg @@ -1,15 +1,3 @@ - - - - - - - - - - - - - + diff --git a/src/vs/editor/contrib/documentSymbols/media/operator-light.svg b/src/vs/editor/contrib/documentSymbols/media/operator-light.svg index 4818a644a10..bf6ed57996a 100644 --- a/src/vs/editor/contrib/documentSymbols/media/operator-light.svg +++ b/src/vs/editor/contrib/documentSymbols/media/operator-light.svg @@ -1,15 +1,3 @@ - - - - - - - - - - - - - + diff --git a/src/vs/editor/contrib/documentSymbols/media/snippet-dark.svg b/src/vs/editor/contrib/documentSymbols/media/snippet-dark.svg index 394ad9e4b28..79799f98c26 100644 --- a/src/vs/editor/contrib/documentSymbols/media/snippet-dark.svg +++ b/src/vs/editor/contrib/documentSymbols/media/snippet-dark.svg @@ -1,10 +1,3 @@ - - - - - - - - + diff --git a/src/vs/editor/contrib/documentSymbols/media/snippet-light.svg b/src/vs/editor/contrib/documentSymbols/media/snippet-light.svg index d4f45485987..45fa3a001e8 100644 --- a/src/vs/editor/contrib/documentSymbols/media/snippet-light.svg +++ b/src/vs/editor/contrib/documentSymbols/media/snippet-light.svg @@ -1,10 +1,3 @@ - - - - - - - - + diff --git a/src/vs/editor/contrib/documentSymbols/media/string-dark.svg b/src/vs/editor/contrib/documentSymbols/media/string-dark.svg index 315ca4537a4..80fb9d6567d 100644 --- a/src/vs/editor/contrib/documentSymbols/media/string-dark.svg +++ b/src/vs/editor/contrib/documentSymbols/media/string-dark.svg @@ -1,8 +1,3 @@ - - - - - - + diff --git a/src/vs/editor/contrib/documentSymbols/media/string-light.svg b/src/vs/editor/contrib/documentSymbols/media/string-light.svg index c902ea2faf3..02a0282e906 100644 --- a/src/vs/editor/contrib/documentSymbols/media/string-light.svg +++ b/src/vs/editor/contrib/documentSymbols/media/string-light.svg @@ -1,8 +1,3 @@ - - - - - - + diff --git a/src/vs/editor/contrib/documentSymbols/media/structure-dark.svg b/src/vs/editor/contrib/documentSymbols/media/structure-dark.svg index 599b10565e5..13766a5dcea 100644 --- a/src/vs/editor/contrib/documentSymbols/media/structure-dark.svg +++ b/src/vs/editor/contrib/documentSymbols/media/structure-dark.svg @@ -1,5 +1,3 @@ - - - + diff --git a/src/vs/editor/contrib/documentSymbols/media/structure-light.svg b/src/vs/editor/contrib/documentSymbols/media/structure-light.svg index 9de849e9f43..c96bcfa61b0 100644 --- a/src/vs/editor/contrib/documentSymbols/media/structure-light.svg +++ b/src/vs/editor/contrib/documentSymbols/media/structure-light.svg @@ -1,5 +1,3 @@ - - - + diff --git a/src/vs/editor/contrib/documentSymbols/media/template-dark.svg b/src/vs/editor/contrib/documentSymbols/media/template-dark.svg index 39ca49dfd43..425ced36f0e 100644 --- a/src/vs/editor/contrib/documentSymbols/media/template-dark.svg +++ b/src/vs/editor/contrib/documentSymbols/media/template-dark.svg @@ -1,5 +1,3 @@ - - - + diff --git a/src/vs/editor/contrib/documentSymbols/media/template-light.svg b/src/vs/editor/contrib/documentSymbols/media/template-light.svg index 34c96e6dd7e..496d8f7c85c 100644 --- a/src/vs/editor/contrib/documentSymbols/media/template-light.svg +++ b/src/vs/editor/contrib/documentSymbols/media/template-light.svg @@ -1,5 +1,3 @@ - - - + diff --git a/src/vs/editor/contrib/documentSymbols/media/variable-dark.svg b/src/vs/editor/contrib/documentSymbols/media/variable-dark.svg index 0719bddfa6f..687fcabfff5 100644 --- a/src/vs/editor/contrib/documentSymbols/media/variable-dark.svg +++ b/src/vs/editor/contrib/documentSymbols/media/variable-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/editor/contrib/documentSymbols/media/variable-light.svg b/src/vs/editor/contrib/documentSymbols/media/variable-light.svg index c24d7f20950..ede7e9434dd 100644 --- a/src/vs/editor/contrib/documentSymbols/media/variable-light.svg +++ b/src/vs/editor/contrib/documentSymbols/media/variable-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/editor/contrib/find/images/cancelSelectionFind-inverse.svg b/src/vs/editor/contrib/find/images/cancelSelectionFind-inverse.svg deleted file mode 100644 index d776fcde98a..00000000000 --- a/src/vs/editor/contrib/find/images/cancelSelectionFind-inverse.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/src/vs/editor/contrib/find/images/cancelSelectionFind.svg b/src/vs/editor/contrib/find/images/cancelSelectionFind.svg deleted file mode 100644 index cdff5731a82..00000000000 --- a/src/vs/editor/contrib/find/images/cancelSelectionFind.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/src/vs/editor/contrib/find/images/chevron-previous-dark.svg b/src/vs/editor/contrib/find/images/chevron-previous-dark.svg index 5f93ad2d719..5db4f79da85 100644 --- a/src/vs/editor/contrib/find/images/chevron-previous-dark.svg +++ b/src/vs/editor/contrib/find/images/chevron-previous-dark.svg @@ -1,4 +1,3 @@ - diff --git a/src/vs/editor/contrib/find/images/chevron-previous-light.svg b/src/vs/editor/contrib/find/images/chevron-previous-light.svg index b160b014948..aac3a5020cd 100644 --- a/src/vs/editor/contrib/find/images/chevron-previous-light.svg +++ b/src/vs/editor/contrib/find/images/chevron-previous-light.svg @@ -1,4 +1,3 @@ - diff --git a/src/vs/editor/contrib/find/images/close-dark.svg b/src/vs/editor/contrib/find/images/close-dark.svg index e0475f7b85a..75644595d19 100644 --- a/src/vs/editor/contrib/find/images/close-dark.svg +++ b/src/vs/editor/contrib/find/images/close-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/editor/contrib/find/images/close-light.svg b/src/vs/editor/contrib/find/images/close-light.svg index 3bd44674699..cf5f28ca35c 100644 --- a/src/vs/editor/contrib/find/images/close-light.svg +++ b/src/vs/editor/contrib/find/images/close-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/editor/contrib/find/images/close.svg b/src/vs/editor/contrib/find/images/close.svg deleted file mode 100644 index fde34404d4e..00000000000 --- a/src/vs/editor/contrib/find/images/close.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/find/images/next-inverse.svg b/src/vs/editor/contrib/find/images/next-inverse.svg deleted file mode 100644 index 50482917af1..00000000000 --- a/src/vs/editor/contrib/find/images/next-inverse.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/src/vs/editor/contrib/find/images/next.svg b/src/vs/editor/contrib/find/images/next.svg deleted file mode 100644 index a2a011453aa..00000000000 --- a/src/vs/editor/contrib/find/images/next.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/src/vs/editor/contrib/find/images/previous-inverse.svg b/src/vs/editor/contrib/find/images/previous-inverse.svg deleted file mode 100644 index 8ff41da5daf..00000000000 --- a/src/vs/editor/contrib/find/images/previous-inverse.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/src/vs/editor/contrib/find/images/previous.svg b/src/vs/editor/contrib/find/images/previous.svg deleted file mode 100644 index 3c8b367a934..00000000000 --- a/src/vs/editor/contrib/find/images/previous.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/src/vs/editor/contrib/find/images/replace-all-dark.svg b/src/vs/editor/contrib/find/images/replace-all-dark.svg index 5bcc9b7919c..07bd41a789f 100644 --- a/src/vs/editor/contrib/find/images/replace-all-dark.svg +++ b/src/vs/editor/contrib/find/images/replace-all-dark.svg @@ -1,11 +1,3 @@ - - - - - - - - - + diff --git a/src/vs/editor/contrib/find/images/replace-all-inverse.svg b/src/vs/editor/contrib/find/images/replace-all-inverse.svg deleted file mode 100644 index 45312b60899..00000000000 --- a/src/vs/editor/contrib/find/images/replace-all-inverse.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - diff --git a/src/vs/editor/contrib/find/images/replace-all-light.svg b/src/vs/editor/contrib/find/images/replace-all-light.svg index 76e27fa4ad8..cd3974fae7e 100644 --- a/src/vs/editor/contrib/find/images/replace-all-light.svg +++ b/src/vs/editor/contrib/find/images/replace-all-light.svg @@ -1,11 +1,3 @@ - - - - - - - - - + diff --git a/src/vs/editor/contrib/find/images/replace-all.svg b/src/vs/editor/contrib/find/images/replace-all.svg deleted file mode 100644 index 4254f7c6d10..00000000000 --- a/src/vs/editor/contrib/find/images/replace-all.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - diff --git a/src/vs/editor/contrib/find/images/replace-dark.svg b/src/vs/editor/contrib/find/images/replace-dark.svg index ecd7d60c2a8..5882b22c589 100644 --- a/src/vs/editor/contrib/find/images/replace-dark.svg +++ b/src/vs/editor/contrib/find/images/replace-dark.svg @@ -1,6 +1,3 @@ - - - - + diff --git a/src/vs/editor/contrib/find/images/replace-inverse.svg b/src/vs/editor/contrib/find/images/replace-inverse.svg deleted file mode 100644 index 9a59e263780..00000000000 --- a/src/vs/editor/contrib/find/images/replace-inverse.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - diff --git a/src/vs/editor/contrib/find/images/replace-light.svg b/src/vs/editor/contrib/find/images/replace-light.svg index e0c6ac89315..220f2aba40c 100644 --- a/src/vs/editor/contrib/find/images/replace-light.svg +++ b/src/vs/editor/contrib/find/images/replace-light.svg @@ -1,6 +1,3 @@ - - - - + diff --git a/src/vs/editor/contrib/find/images/replace.svg b/src/vs/editor/contrib/find/images/replace.svg deleted file mode 100644 index 8b1eb0de23c..00000000000 --- a/src/vs/editor/contrib/find/images/replace.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - diff --git a/src/vs/editor/contrib/find/images/tree-expanded-dark.svg b/src/vs/editor/contrib/find/images/tree-expanded-dark.svg index c18c081278b..a1df6a8d44a 100644 --- a/src/vs/editor/contrib/find/images/tree-expanded-dark.svg +++ b/src/vs/editor/contrib/find/images/tree-expanded-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/editor/contrib/find/images/tree-expanded-light.svg b/src/vs/editor/contrib/find/images/tree-expanded-light.svg index 324b08e461b..e60e357f573 100644 --- a/src/vs/editor/contrib/find/images/tree-expanded-light.svg +++ b/src/vs/editor/contrib/find/images/tree-expanded-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/editor/contrib/find/simpleFindWidget.css b/src/vs/editor/contrib/find/simpleFindWidget.css index 136970945a4..2e638662fe3 100644 --- a/src/vs/editor/contrib/find/simpleFindWidget.css +++ b/src/vs/editor/contrib/find/simpleFindWidget.css @@ -52,25 +52,25 @@ } .monaco-workbench .simple-find-part .button.previous { - background-image: url('images/previous.svg'); + background-image: url('images/chevron-previous-light.svg'); } .monaco-workbench .simple-find-part .button.next { - background-image: url('images/next.svg'); + background-image: url('images/chevron-next-light.svg'); } .monaco-workbench .simple-find-part .button.close-fw { - background-image: url('images/close.svg'); + background-image: url('images/close-light.svg'); } .hc-black .monaco-workbench .simple-find-part .button.previous, .vs-dark .monaco-workbench .simple-find-part .button.previous { - background-image: url('images/previous-inverse.svg'); + background-image: url('images/chevron-previous-dark.svg'); } .hc-black .monaco-workbench .simple-find-part .button.next, .vs-dark .monaco-workbench .simple-find-part .button.next { - background-image: url('images/next-inverse.svg'); + background-image: url('images/chevron-next-dark.svg'); } .hc-black .monaco-workbench .simple-find-part .button.close-fw, diff --git a/src/vs/editor/contrib/folding/tree-collapsed-dark.svg b/src/vs/editor/contrib/folding/tree-collapsed-dark.svg index 019cce05ef0..243be1451cc 100644 --- a/src/vs/editor/contrib/folding/tree-collapsed-dark.svg +++ b/src/vs/editor/contrib/folding/tree-collapsed-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/editor/contrib/folding/tree-collapsed-hc.svg b/src/vs/editor/contrib/folding/tree-collapsed-hc.svg index 2206da82fb0..40ba72b7086 100644 --- a/src/vs/editor/contrib/folding/tree-collapsed-hc.svg +++ b/src/vs/editor/contrib/folding/tree-collapsed-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/editor/contrib/folding/tree-collapsed-light.svg b/src/vs/editor/contrib/folding/tree-collapsed-light.svg index 14220b8d99e..0d746558a4f 100644 --- a/src/vs/editor/contrib/folding/tree-collapsed-light.svg +++ b/src/vs/editor/contrib/folding/tree-collapsed-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/editor/contrib/folding/tree-expanded-dark.svg b/src/vs/editor/contrib/folding/tree-expanded-dark.svg index 1283b2e79be..5570923e175 100644 --- a/src/vs/editor/contrib/folding/tree-expanded-dark.svg +++ b/src/vs/editor/contrib/folding/tree-expanded-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/editor/contrib/folding/tree-expanded-hc.svg b/src/vs/editor/contrib/folding/tree-expanded-hc.svg index a22d12eb25a..b370009330c 100644 --- a/src/vs/editor/contrib/folding/tree-expanded-hc.svg +++ b/src/vs/editor/contrib/folding/tree-expanded-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/editor/contrib/folding/tree-expanded-light.svg b/src/vs/editor/contrib/folding/tree-expanded-light.svg index 2c2ca562464..939ebc8b969 100644 --- a/src/vs/editor/contrib/folding/tree-expanded-light.svg +++ b/src/vs/editor/contrib/folding/tree-expanded-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/editor/contrib/referenceSearch/media/chevron-previous-dark.svg b/src/vs/editor/contrib/referenceSearch/media/chevron-previous-dark.svg index fef5fd0ed43..5ca3526019f 100644 --- a/src/vs/editor/contrib/referenceSearch/media/chevron-previous-dark.svg +++ b/src/vs/editor/contrib/referenceSearch/media/chevron-previous-dark.svg @@ -1,4 +1,3 @@ - diff --git a/src/vs/editor/contrib/referenceSearch/media/chevron-previous-light.svg b/src/vs/editor/contrib/referenceSearch/media/chevron-previous-light.svg index be113938535..87e179a7f3c 100644 --- a/src/vs/editor/contrib/referenceSearch/media/chevron-previous-light.svg +++ b/src/vs/editor/contrib/referenceSearch/media/chevron-previous-light.svg @@ -1,4 +1,3 @@ - diff --git a/src/vs/editor/contrib/referenceSearch/media/close-dark.svg b/src/vs/editor/contrib/referenceSearch/media/close-dark.svg index e0475f7b85a..bffa4e9dabb 100644 --- a/src/vs/editor/contrib/referenceSearch/media/close-dark.svg +++ b/src/vs/editor/contrib/referenceSearch/media/close-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/editor/contrib/referenceSearch/media/close-light.svg b/src/vs/editor/contrib/referenceSearch/media/close-light.svg index 3bd44674699..b44dee661af 100644 --- a/src/vs/editor/contrib/referenceSearch/media/close-light.svg +++ b/src/vs/editor/contrib/referenceSearch/media/close-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/editor/contrib/suggest/media/boolean-dark.svg b/src/vs/editor/contrib/suggest/media/boolean-dark.svg index d9bcbe9dac0..e009568b131 100644 --- a/src/vs/editor/contrib/suggest/media/boolean-dark.svg +++ b/src/vs/editor/contrib/suggest/media/boolean-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/editor/contrib/suggest/media/boolean-light.svg b/src/vs/editor/contrib/suggest/media/boolean-light.svg index 647040941d1..06613f8bedd 100644 --- a/src/vs/editor/contrib/suggest/media/boolean-light.svg +++ b/src/vs/editor/contrib/suggest/media/boolean-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/editor/contrib/suggest/media/class-dark.svg b/src/vs/editor/contrib/suggest/media/class-dark.svg index 8643ca84051..a71e221f6bd 100644 --- a/src/vs/editor/contrib/suggest/media/class-dark.svg +++ b/src/vs/editor/contrib/suggest/media/class-dark.svg @@ -1,7 +1,3 @@ - - - - - + diff --git a/src/vs/editor/contrib/suggest/media/class-light.svg b/src/vs/editor/contrib/suggest/media/class-light.svg index 5e338c8fc61..aa106f18f87 100644 --- a/src/vs/editor/contrib/suggest/media/class-light.svg +++ b/src/vs/editor/contrib/suggest/media/class-light.svg @@ -1,7 +1,3 @@ - - - - - + diff --git a/src/vs/editor/contrib/suggest/media/close-dark.svg b/src/vs/editor/contrib/suggest/media/close-dark.svg index e0475f7b85a..556e2e20992 100644 --- a/src/vs/editor/contrib/suggest/media/close-dark.svg +++ b/src/vs/editor/contrib/suggest/media/close-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/editor/contrib/suggest/media/close-light.svg b/src/vs/editor/contrib/suggest/media/close-light.svg index 3bd44674699..c84816a0324 100644 --- a/src/vs/editor/contrib/suggest/media/close-light.svg +++ b/src/vs/editor/contrib/suggest/media/close-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/editor/contrib/suggest/media/enumerator-dark.svg b/src/vs/editor/contrib/suggest/media/enumerator-dark.svg index 06c70f1aa02..82d4ff29c44 100644 --- a/src/vs/editor/contrib/suggest/media/enumerator-dark.svg +++ b/src/vs/editor/contrib/suggest/media/enumerator-dark.svg @@ -1,6 +1,3 @@ - - - - + diff --git a/src/vs/editor/contrib/suggest/media/enumerator-light.svg b/src/vs/editor/contrib/suggest/media/enumerator-light.svg index 7961eec7b17..e2441a0dc16 100644 --- a/src/vs/editor/contrib/suggest/media/enumerator-light.svg +++ b/src/vs/editor/contrib/suggest/media/enumerator-light.svg @@ -1,6 +1,3 @@ - - - - + diff --git a/src/vs/editor/contrib/suggest/media/event-dark.svg b/src/vs/editor/contrib/suggest/media/event-dark.svg index 051bef316e9..712344d1f92 100644 --- a/src/vs/editor/contrib/suggest/media/event-dark.svg +++ b/src/vs/editor/contrib/suggest/media/event-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/editor/contrib/suggest/media/indexer-dark.svg b/src/vs/editor/contrib/suggest/media/indexer-dark.svg index f45aebbdb3d..e92131d3d02 100644 --- a/src/vs/editor/contrib/suggest/media/indexer-dark.svg +++ b/src/vs/editor/contrib/suggest/media/indexer-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/editor/contrib/suggest/media/indexer-light.svg b/src/vs/editor/contrib/suggest/media/indexer-light.svg index 31a880850e2..207899642c8 100644 --- a/src/vs/editor/contrib/suggest/media/indexer-light.svg +++ b/src/vs/editor/contrib/suggest/media/indexer-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/editor/contrib/suggest/media/info-dark.svg b/src/vs/editor/contrib/suggest/media/info-dark.svg index 4046543c182..3f2d84fa649 100644 --- a/src/vs/editor/contrib/suggest/media/info-dark.svg +++ b/src/vs/editor/contrib/suggest/media/info-dark.svg @@ -1,8 +1,3 @@ - - - - - - + diff --git a/src/vs/editor/contrib/suggest/media/info-light.svg b/src/vs/editor/contrib/suggest/media/info-light.svg index 3e600326ccb..f25ac7c78d6 100644 --- a/src/vs/editor/contrib/suggest/media/info-light.svg +++ b/src/vs/editor/contrib/suggest/media/info-light.svg @@ -1,7 +1,3 @@ - - - - - + diff --git a/src/vs/editor/contrib/suggest/media/interface-dark.svg b/src/vs/editor/contrib/suggest/media/interface-dark.svg index 42156059c6a..6d482b2abde 100644 --- a/src/vs/editor/contrib/suggest/media/interface-dark.svg +++ b/src/vs/editor/contrib/suggest/media/interface-dark.svg @@ -1,5 +1,3 @@ - - - + diff --git a/src/vs/editor/contrib/suggest/media/interface-light.svg b/src/vs/editor/contrib/suggest/media/interface-light.svg index 4b63ceb782f..a397dd00b00 100644 --- a/src/vs/editor/contrib/suggest/media/interface-light.svg +++ b/src/vs/editor/contrib/suggest/media/interface-light.svg @@ -1,5 +1,3 @@ - - - + diff --git a/src/vs/editor/contrib/suggest/media/namespace-dark.svg b/src/vs/editor/contrib/suggest/media/namespace-dark.svg index 17989d852de..9a725bb41fd 100644 --- a/src/vs/editor/contrib/suggest/media/namespace-dark.svg +++ b/src/vs/editor/contrib/suggest/media/namespace-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/editor/contrib/suggest/media/namespace-light.svg b/src/vs/editor/contrib/suggest/media/namespace-light.svg index f1e10c55c98..1339da7ce21 100644 --- a/src/vs/editor/contrib/suggest/media/namespace-light.svg +++ b/src/vs/editor/contrib/suggest/media/namespace-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/editor/contrib/suggest/media/numeric-dark.svg b/src/vs/editor/contrib/suggest/media/numeric-dark.svg index 9b7874a43ec..a1573df0107 100644 --- a/src/vs/editor/contrib/suggest/media/numeric-dark.svg +++ b/src/vs/editor/contrib/suggest/media/numeric-dark.svg @@ -1,6 +1,3 @@ - - - - + diff --git a/src/vs/editor/contrib/suggest/media/numeric-light.svg b/src/vs/editor/contrib/suggest/media/numeric-light.svg index c6e9a426a9f..ea0e56e0225 100644 --- a/src/vs/editor/contrib/suggest/media/numeric-light.svg +++ b/src/vs/editor/contrib/suggest/media/numeric-light.svg @@ -1,6 +1,3 @@ - - - - + diff --git a/src/vs/editor/contrib/suggest/media/operator-dark.svg b/src/vs/editor/contrib/suggest/media/operator-dark.svg index de1650a86d2..06ff14030c2 100644 --- a/src/vs/editor/contrib/suggest/media/operator-dark.svg +++ b/src/vs/editor/contrib/suggest/media/operator-dark.svg @@ -1,15 +1,3 @@ - - - - - - - - - - - - - + diff --git a/src/vs/editor/contrib/suggest/media/operator-light.svg b/src/vs/editor/contrib/suggest/media/operator-light.svg index 4818a644a10..bf6ed57996a 100644 --- a/src/vs/editor/contrib/suggest/media/operator-light.svg +++ b/src/vs/editor/contrib/suggest/media/operator-light.svg @@ -1,15 +1,3 @@ - - - - - - - - - - - - - + diff --git a/src/vs/editor/contrib/suggest/media/reference-dark.svg b/src/vs/editor/contrib/suggest/media/reference-dark.svg index 7030885c039..ed302ae1398 100644 --- a/src/vs/editor/contrib/suggest/media/reference-dark.svg +++ b/src/vs/editor/contrib/suggest/media/reference-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/editor/contrib/suggest/media/reference-light.svg b/src/vs/editor/contrib/suggest/media/reference-light.svg index 017eabca6d2..392a840c5ef 100644 --- a/src/vs/editor/contrib/suggest/media/reference-light.svg +++ b/src/vs/editor/contrib/suggest/media/reference-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/editor/contrib/suggest/media/ruler-dark.svg b/src/vs/editor/contrib/suggest/media/ruler-dark.svg index 81eef496b26..1957dbad34e 100644 --- a/src/vs/editor/contrib/suggest/media/ruler-dark.svg +++ b/src/vs/editor/contrib/suggest/media/ruler-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/editor/contrib/suggest/media/ruler-light.svg b/src/vs/editor/contrib/suggest/media/ruler-light.svg index 9f299147548..bc321cdffa3 100644 --- a/src/vs/editor/contrib/suggest/media/ruler-light.svg +++ b/src/vs/editor/contrib/suggest/media/ruler-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/editor/contrib/suggest/media/snippet-dark.svg b/src/vs/editor/contrib/suggest/media/snippet-dark.svg index 394ad9e4b28..79799f98c26 100644 --- a/src/vs/editor/contrib/suggest/media/snippet-dark.svg +++ b/src/vs/editor/contrib/suggest/media/snippet-dark.svg @@ -1,10 +1,3 @@ - - - - - - - - + diff --git a/src/vs/editor/contrib/suggest/media/snippet-light.svg b/src/vs/editor/contrib/suggest/media/snippet-light.svg index d4f45485987..45fa3a001e8 100644 --- a/src/vs/editor/contrib/suggest/media/snippet-light.svg +++ b/src/vs/editor/contrib/suggest/media/snippet-light.svg @@ -1,10 +1,3 @@ - - - - - - - - + diff --git a/src/vs/editor/contrib/suggest/media/string-dark.svg b/src/vs/editor/contrib/suggest/media/string-dark.svg index 315ca4537a4..80fb9d6567d 100644 --- a/src/vs/editor/contrib/suggest/media/string-dark.svg +++ b/src/vs/editor/contrib/suggest/media/string-dark.svg @@ -1,8 +1,3 @@ - - - - - - + diff --git a/src/vs/editor/contrib/suggest/media/string-light.svg b/src/vs/editor/contrib/suggest/media/string-light.svg index c902ea2faf3..02a0282e906 100644 --- a/src/vs/editor/contrib/suggest/media/string-light.svg +++ b/src/vs/editor/contrib/suggest/media/string-light.svg @@ -1,8 +1,3 @@ - - - - - - + diff --git a/src/vs/editor/contrib/suggest/media/structure-dark.svg b/src/vs/editor/contrib/suggest/media/structure-dark.svg index 599b10565e5..13766a5dcea 100644 --- a/src/vs/editor/contrib/suggest/media/structure-dark.svg +++ b/src/vs/editor/contrib/suggest/media/structure-dark.svg @@ -1,5 +1,3 @@ - - - + diff --git a/src/vs/editor/contrib/suggest/media/structure-light.svg b/src/vs/editor/contrib/suggest/media/structure-light.svg index 9de849e9f43..c96bcfa61b0 100644 --- a/src/vs/editor/contrib/suggest/media/structure-light.svg +++ b/src/vs/editor/contrib/suggest/media/structure-light.svg @@ -1,5 +1,3 @@ - - - + diff --git a/src/vs/editor/contrib/suggest/media/template-dark.svg b/src/vs/editor/contrib/suggest/media/template-dark.svg index 39ca49dfd43..425ced36f0e 100644 --- a/src/vs/editor/contrib/suggest/media/template-dark.svg +++ b/src/vs/editor/contrib/suggest/media/template-dark.svg @@ -1,5 +1,3 @@ - - - + diff --git a/src/vs/editor/contrib/suggest/media/template-light.svg b/src/vs/editor/contrib/suggest/media/template-light.svg index 34c96e6dd7e..496d8f7c85c 100644 --- a/src/vs/editor/contrib/suggest/media/template-light.svg +++ b/src/vs/editor/contrib/suggest/media/template-light.svg @@ -1,5 +1,3 @@ - - - + diff --git a/src/vs/editor/contrib/suggest/media/variable-dark.svg b/src/vs/editor/contrib/suggest/media/variable-dark.svg index 0719bddfa6f..687fcabfff5 100644 --- a/src/vs/editor/contrib/suggest/media/variable-dark.svg +++ b/src/vs/editor/contrib/suggest/media/variable-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/editor/contrib/suggest/media/variable-light.svg b/src/vs/editor/contrib/suggest/media/variable-light.svg index c24d7f20950..ede7e9434dd 100644 --- a/src/vs/editor/contrib/suggest/media/variable-light.svg +++ b/src/vs/editor/contrib/suggest/media/variable-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/browser/parts/editor/media/close-all-dark.svg b/src/vs/workbench/browser/parts/editor/media/close-all-dark.svg index 690174de730..d69cc9c8351 100644 --- a/src/vs/workbench/browser/parts/editor/media/close-all-dark.svg +++ b/src/vs/workbench/browser/parts/editor/media/close-all-dark.svg @@ -1,4 +1,4 @@ - + diff --git a/src/vs/workbench/browser/parts/editor/media/close-all-light.svg b/src/vs/workbench/browser/parts/editor/media/close-all-light.svg index 9d5038d29da..9fcf77fe72e 100644 --- a/src/vs/workbench/browser/parts/editor/media/close-all-light.svg +++ b/src/vs/workbench/browser/parts/editor/media/close-all-light.svg @@ -1,4 +1,4 @@ - + diff --git a/src/vs/workbench/browser/parts/editor/media/close-dark.svg b/src/vs/workbench/browser/parts/editor/media/close-dark.svg index e0475f7b85a..44ece771f45 100644 --- a/src/vs/workbench/browser/parts/editor/media/close-dark.svg +++ b/src/vs/workbench/browser/parts/editor/media/close-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/browser/parts/editor/media/close-hc.svg b/src/vs/workbench/browser/parts/editor/media/close-hc.svg index 64618b61760..fa205f4ee12 100644 --- a/src/vs/workbench/browser/parts/editor/media/close-hc.svg +++ b/src/vs/workbench/browser/parts/editor/media/close-hc.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/browser/parts/editor/media/close-light.svg b/src/vs/workbench/browser/parts/editor/media/close-light.svg index 3bd44674699..742fcae4ae7 100644 --- a/src/vs/workbench/browser/parts/editor/media/close-light.svg +++ b/src/vs/workbench/browser/parts/editor/media/close-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/browser/parts/editor/media/next-diff-dark.svg b/src/vs/workbench/browser/parts/editor/media/next-diff-dark.svg index 368d538fe4d..455532ddb7a 100644 --- a/src/vs/workbench/browser/parts/editor/media/next-diff-dark.svg +++ b/src/vs/workbench/browser/parts/editor/media/next-diff-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/browser/parts/editor/media/next-diff-light.svg b/src/vs/workbench/browser/parts/editor/media/next-diff-light.svg index 162ee4d2863..a443086f358 100644 --- a/src/vs/workbench/browser/parts/editor/media/next-diff-light.svg +++ b/src/vs/workbench/browser/parts/editor/media/next-diff-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/browser/parts/editor/media/previous-diff-dark.svg b/src/vs/workbench/browser/parts/editor/media/previous-diff-dark.svg index e6aa2fb27ea..5ca3526019f 100644 --- a/src/vs/workbench/browser/parts/editor/media/previous-diff-dark.svg +++ b/src/vs/workbench/browser/parts/editor/media/previous-diff-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/browser/parts/editor/media/previous-diff-light.svg b/src/vs/workbench/browser/parts/editor/media/previous-diff-light.svg index 3ccc6d2183f..87e179a7f3c 100644 --- a/src/vs/workbench/browser/parts/editor/media/previous-diff-light.svg +++ b/src/vs/workbench/browser/parts/editor/media/previous-diff-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/browser/parts/editor/media/split-editor-horizontal-dark.svg b/src/vs/workbench/browser/parts/editor/media/split-editor-horizontal-dark.svg index ac4121490eb..8c22a7c5bfe 100644 --- a/src/vs/workbench/browser/parts/editor/media/split-editor-horizontal-dark.svg +++ b/src/vs/workbench/browser/parts/editor/media/split-editor-horizontal-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/browser/parts/editor/media/split-editor-horizontal-hc.svg b/src/vs/workbench/browser/parts/editor/media/split-editor-horizontal-hc.svg index c92025ddd92..82c19d0c8fc 100644 --- a/src/vs/workbench/browser/parts/editor/media/split-editor-horizontal-hc.svg +++ b/src/vs/workbench/browser/parts/editor/media/split-editor-horizontal-hc.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/browser/parts/editor/media/split-editor-horizontal-light.svg b/src/vs/workbench/browser/parts/editor/media/split-editor-horizontal-light.svg index b7701615a9d..400952cdda8 100644 --- a/src/vs/workbench/browser/parts/editor/media/split-editor-horizontal-light.svg +++ b/src/vs/workbench/browser/parts/editor/media/split-editor-horizontal-light.svg @@ -1,4 +1,7 @@ - - + + + + + diff --git a/src/vs/workbench/browser/parts/editor/media/split-editor-vertical-dark.svg b/src/vs/workbench/browser/parts/editor/media/split-editor-vertical-dark.svg index dfe68163a9e..419c21be4f6 100644 --- a/src/vs/workbench/browser/parts/editor/media/split-editor-vertical-dark.svg +++ b/src/vs/workbench/browser/parts/editor/media/split-editor-vertical-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/browser/parts/editor/media/split-editor-vertical-hc.svg b/src/vs/workbench/browser/parts/editor/media/split-editor-vertical-hc.svg index f407c08fa34..7565fd3c168 100644 --- a/src/vs/workbench/browser/parts/editor/media/split-editor-vertical-hc.svg +++ b/src/vs/workbench/browser/parts/editor/media/split-editor-vertical-hc.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/browser/parts/editor/media/split-editor-vertical-light.svg b/src/vs/workbench/browser/parts/editor/media/split-editor-vertical-light.svg index e7eca812f95..405291c14dd 100644 --- a/src/vs/workbench/browser/parts/editor/media/split-editor-vertical-light.svg +++ b/src/vs/workbench/browser/parts/editor/media/split-editor-vertical-light.svg @@ -1,4 +1,7 @@ - - + + + + + diff --git a/src/vs/workbench/browser/parts/notifications/media/close-dark.svg b/src/vs/workbench/browser/parts/notifications/media/close-dark.svg index e0475f7b85a..080eb9f0426 100644 --- a/src/vs/workbench/browser/parts/notifications/media/close-dark.svg +++ b/src/vs/workbench/browser/parts/notifications/media/close-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/browser/parts/notifications/media/close-light.svg b/src/vs/workbench/browser/parts/notifications/media/close-light.svg index 3bd44674699..2223c53fb17 100644 --- a/src/vs/workbench/browser/parts/notifications/media/close-light.svg +++ b/src/vs/workbench/browser/parts/notifications/media/close-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/browser/parts/notifications/media/configure-dark.svg b/src/vs/workbench/browser/parts/notifications/media/configure-dark.svg index 4e4bc65c207..a0ddc9b9fd1 100644 --- a/src/vs/workbench/browser/parts/notifications/media/configure-dark.svg +++ b/src/vs/workbench/browser/parts/notifications/media/configure-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/browser/parts/notifications/media/info-dark.svg b/src/vs/workbench/browser/parts/notifications/media/info-dark.svg index 6fe5889fbf0..bb851afdfe5 100644 --- a/src/vs/workbench/browser/parts/notifications/media/info-dark.svg +++ b/src/vs/workbench/browser/parts/notifications/media/info-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/browser/parts/notifications/media/info-light.svg b/src/vs/workbench/browser/parts/notifications/media/info-light.svg index 51de3eb6e08..6faf670cccc 100644 --- a/src/vs/workbench/browser/parts/notifications/media/info-light.svg +++ b/src/vs/workbench/browser/parts/notifications/media/info-light.svg @@ -1,10 +1,4 @@ - - - - - - - - + + diff --git a/src/vs/workbench/browser/parts/panel/media/chevron-down-dark.svg b/src/vs/workbench/browser/parts/panel/media/chevron-down-dark.svg index 64e67427103..a1df6a8d44a 100644 --- a/src/vs/workbench/browser/parts/panel/media/chevron-down-dark.svg +++ b/src/vs/workbench/browser/parts/panel/media/chevron-down-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/browser/parts/panel/media/chevron-down-hc.svg b/src/vs/workbench/browser/parts/panel/media/chevron-down-hc.svg index a1085f2ad07..4f2ec146927 100644 --- a/src/vs/workbench/browser/parts/panel/media/chevron-down-hc.svg +++ b/src/vs/workbench/browser/parts/panel/media/chevron-down-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/browser/parts/panel/media/chevron-down-light.svg b/src/vs/workbench/browser/parts/panel/media/chevron-down-light.svg index 169ce8a356a..e60e357f573 100644 --- a/src/vs/workbench/browser/parts/panel/media/chevron-down-light.svg +++ b/src/vs/workbench/browser/parts/panel/media/chevron-down-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/browser/parts/panel/media/chevron-left-dark.svg b/src/vs/workbench/browser/parts/panel/media/chevron-left-dark.svg index 9367ad6e69f..dbc37784a70 100644 --- a/src/vs/workbench/browser/parts/panel/media/chevron-left-dark.svg +++ b/src/vs/workbench/browser/parts/panel/media/chevron-left-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/browser/parts/panel/media/chevron-left-hc.svg b/src/vs/workbench/browser/parts/panel/media/chevron-left-hc.svg index beedb2a1a61..3767c200513 100644 --- a/src/vs/workbench/browser/parts/panel/media/chevron-left-hc.svg +++ b/src/vs/workbench/browser/parts/panel/media/chevron-left-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/browser/parts/panel/media/chevron-left-light.svg b/src/vs/workbench/browser/parts/panel/media/chevron-left-light.svg index 97a676e3d9d..2bd4c96832f 100644 --- a/src/vs/workbench/browser/parts/panel/media/chevron-left-light.svg +++ b/src/vs/workbench/browser/parts/panel/media/chevron-left-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/browser/parts/panel/media/chevron-right-dark.svg b/src/vs/workbench/browser/parts/panel/media/chevron-right-dark.svg index 6cfda49f3b8..f518fc1632a 100644 --- a/src/vs/workbench/browser/parts/panel/media/chevron-right-dark.svg +++ b/src/vs/workbench/browser/parts/panel/media/chevron-right-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/browser/parts/panel/media/chevron-right-hc.svg b/src/vs/workbench/browser/parts/panel/media/chevron-right-hc.svg index 829e53760f2..40ba72b7086 100644 --- a/src/vs/workbench/browser/parts/panel/media/chevron-right-hc.svg +++ b/src/vs/workbench/browser/parts/panel/media/chevron-right-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/browser/parts/panel/media/chevron-right-light.svg b/src/vs/workbench/browser/parts/panel/media/chevron-right-light.svg index 2da1410a45e..0d746558a4f 100644 --- a/src/vs/workbench/browser/parts/panel/media/chevron-right-light.svg +++ b/src/vs/workbench/browser/parts/panel/media/chevron-right-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/browser/parts/panel/media/chevron-up-dark.svg b/src/vs/workbench/browser/parts/panel/media/chevron-up-dark.svg index 69d9383d90a..5b9da8932e1 100644 --- a/src/vs/workbench/browser/parts/panel/media/chevron-up-dark.svg +++ b/src/vs/workbench/browser/parts/panel/media/chevron-up-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/browser/parts/panel/media/chevron-up-hc.svg b/src/vs/workbench/browser/parts/panel/media/chevron-up-hc.svg index bba316df104..13bad537364 100644 --- a/src/vs/workbench/browser/parts/panel/media/chevron-up-hc.svg +++ b/src/vs/workbench/browser/parts/panel/media/chevron-up-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/browser/parts/panel/media/chevron-up-light.svg b/src/vs/workbench/browser/parts/panel/media/chevron-up-light.svg index 9657f8034df..5498cda5bc4 100644 --- a/src/vs/workbench/browser/parts/panel/media/chevron-up-light.svg +++ b/src/vs/workbench/browser/parts/panel/media/chevron-up-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/browser/parts/views/media/tree-collapsed-dark.svg b/src/vs/workbench/browser/parts/views/media/tree-collapsed-dark.svg index 7c05748ad45..c2c2298dd5c 100644 --- a/src/vs/workbench/browser/parts/views/media/tree-collapsed-dark.svg +++ b/src/vs/workbench/browser/parts/views/media/tree-collapsed-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/browser/parts/views/media/tree-collapsed-hc.svg b/src/vs/workbench/browser/parts/views/media/tree-collapsed-hc.svg index 53f2710bfbc..3732cbc04b8 100644 --- a/src/vs/workbench/browser/parts/views/media/tree-collapsed-hc.svg +++ b/src/vs/workbench/browser/parts/views/media/tree-collapsed-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/browser/parts/views/media/tree-collapsed-light.svg b/src/vs/workbench/browser/parts/views/media/tree-collapsed-light.svg index 4788b3d81a1..1952ad63f84 100644 --- a/src/vs/workbench/browser/parts/views/media/tree-collapsed-light.svg +++ b/src/vs/workbench/browser/parts/views/media/tree-collapsed-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/browser/parts/views/media/tree-expanded-dark.svg b/src/vs/workbench/browser/parts/views/media/tree-expanded-dark.svg index c418ef63e84..5570923e175 100644 --- a/src/vs/workbench/browser/parts/views/media/tree-expanded-dark.svg +++ b/src/vs/workbench/browser/parts/views/media/tree-expanded-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/browser/parts/views/media/tree-expanded-hc.svg b/src/vs/workbench/browser/parts/views/media/tree-expanded-hc.svg index 3321f110f32..b370009330c 100644 --- a/src/vs/workbench/browser/parts/views/media/tree-expanded-hc.svg +++ b/src/vs/workbench/browser/parts/views/media/tree-expanded-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/browser/parts/views/media/tree-expanded-light.svg b/src/vs/workbench/browser/parts/views/media/tree-expanded-light.svg index 3893bdf5485..939ebc8b969 100644 --- a/src/vs/workbench/browser/parts/views/media/tree-expanded-light.svg +++ b/src/vs/workbench/browser/parts/views/media/tree-expanded-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional-disabled.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional-disabled.svg index 478803a7573..75c0a500f4d 100644 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional-disabled.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional-disabled.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional-unverified.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional-unverified.svg index 4b35f04b857..85a35a44ff6 100644 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional-unverified.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional-unverified.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional.svg index 6d71b5adeee..382507ebcdf 100644 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint-function-disabled.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-function-disabled.svg index 2c99cc1fac0..cd71f6e462e 100755 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint-function-disabled.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint-function-disabled.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint-function-unverified.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-function-unverified.svg index a6b6b1ba5e2..9e2354d67bd 100755 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint-function-unverified.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint-function-unverified.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint-function.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-function.svg index 22114168c04..f25e57ffde9 100755 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint-function.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint-function.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint-hint.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-hint.svg index 83e4bf90560..d622c6cf0c4 100644 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint-hint.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint-hint.svg @@ -1,5 +1,5 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint-log-disabled.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-log-disabled.svg index bdb4bfeba38..faf015508c6 100644 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint-log-disabled.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint-log-disabled.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint-log-unverified.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-log-unverified.svg index fb44ee34922..f83544babf6 100644 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint-log-unverified.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint-log-unverified.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint-log.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-log.svg index 769ecf93620..509e255b91e 100644 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint-log.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint-log.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint-unsupported.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-unsupported.svg index e6fb5e7be34..4a40c0fd1e4 100644 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint-unsupported.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint-unsupported.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint-unverified.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-unverified.svg index 2887202ddd7..0f39b8b7c8f 100644 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint-unverified.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint-unverified.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint.svg index 80f39becea4..af02a874950 100644 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/close-all-dark.svg b/src/vs/workbench/contrib/debug/browser/media/close-all-dark.svg index 26d4c7b7a50..35e5fb44226 100644 --- a/src/vs/workbench/contrib/debug/browser/media/close-all-dark.svg +++ b/src/vs/workbench/contrib/debug/browser/media/close-all-dark.svg @@ -1,4 +1,4 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/close-all-hc.svg b/src/vs/workbench/contrib/debug/browser/media/close-all-hc.svg index 6dc04a3659c..def744d1ab9 100644 --- a/src/vs/workbench/contrib/debug/browser/media/close-all-hc.svg +++ b/src/vs/workbench/contrib/debug/browser/media/close-all-hc.svg @@ -1,4 +1,4 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/close-all-light.svg b/src/vs/workbench/contrib/debug/browser/media/close-all-light.svg index 5d2398a9d16..6c7cec7461c 100644 --- a/src/vs/workbench/contrib/debug/browser/media/close-all-light.svg +++ b/src/vs/workbench/contrib/debug/browser/media/close-all-light.svg @@ -1,4 +1,4 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/configure-dark.svg b/src/vs/workbench/contrib/debug/browser/media/configure-dark.svg index 4d1909627a7..a0ddc9b9fd1 100644 --- a/src/vs/workbench/contrib/debug/browser/media/configure-dark.svg +++ b/src/vs/workbench/contrib/debug/browser/media/configure-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/configure-hc.svg b/src/vs/workbench/contrib/debug/browser/media/configure-hc.svg index cb206a1fb99..66e90b0f5f6 100644 --- a/src/vs/workbench/contrib/debug/browser/media/configure-hc.svg +++ b/src/vs/workbench/contrib/debug/browser/media/configure-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/configure-light.svg b/src/vs/workbench/contrib/debug/browser/media/configure-light.svg index 727a34f26f3..fb7ffea770b 100644 --- a/src/vs/workbench/contrib/debug/browser/media/configure-light.svg +++ b/src/vs/workbench/contrib/debug/browser/media/configure-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/console-dark.svg b/src/vs/workbench/contrib/debug/browser/media/console-dark.svg index 0086b59f7cc..1e2d3b4ee13 100644 --- a/src/vs/workbench/contrib/debug/browser/media/console-dark.svg +++ b/src/vs/workbench/contrib/debug/browser/media/console-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/debug/browser/media/console-hc.svg b/src/vs/workbench/contrib/debug/browser/media/console-hc.svg index 10a458941a1..44b59552d8b 100644 --- a/src/vs/workbench/contrib/debug/browser/media/console-hc.svg +++ b/src/vs/workbench/contrib/debug/browser/media/console-hc.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/debug/browser/media/console-light.svg b/src/vs/workbench/contrib/debug/browser/media/console-light.svg index 667f9c1061b..429cb22b71f 100644 --- a/src/vs/workbench/contrib/debug/browser/media/console-light.svg +++ b/src/vs/workbench/contrib/debug/browser/media/console-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/debug/browser/media/continue-dark.svg b/src/vs/workbench/contrib/debug/browser/media/continue-dark.svg index 45aeeee8daf..7c58386cccc 100644 --- a/src/vs/workbench/contrib/debug/browser/media/continue-dark.svg +++ b/src/vs/workbench/contrib/debug/browser/media/continue-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/debug/browser/media/continue-light.svg b/src/vs/workbench/contrib/debug/browser/media/continue-light.svg index 5104547b5b1..7c58386cccc 100644 --- a/src/vs/workbench/contrib/debug/browser/media/continue-light.svg +++ b/src/vs/workbench/contrib/debug/browser/media/continue-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/debug/browser/media/current-and-breakpoint.svg b/src/vs/workbench/contrib/debug/browser/media/current-and-breakpoint.svg index 2913fed3e34..89f72e4bb8f 100755 --- a/src/vs/workbench/contrib/debug/browser/media/current-and-breakpoint.svg +++ b/src/vs/workbench/contrib/debug/browser/media/current-and-breakpoint.svg @@ -1,4 +1,4 @@ - - + + diff --git a/src/vs/workbench/contrib/debug/browser/media/current-arrow.svg b/src/vs/workbench/contrib/debug/browser/media/current-arrow.svg index d2e0b3df7e9..85f288efcd3 100755 --- a/src/vs/workbench/contrib/debug/browser/media/current-arrow.svg +++ b/src/vs/workbench/contrib/debug/browser/media/current-arrow.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/debug/browser/media/disconnect-dark.svg b/src/vs/workbench/contrib/debug/browser/media/disconnect-dark.svg index f018d812952..71aae0dd887 100644 --- a/src/vs/workbench/contrib/debug/browser/media/disconnect-dark.svg +++ b/src/vs/workbench/contrib/debug/browser/media/disconnect-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/disconnect-light.svg b/src/vs/workbench/contrib/debug/browser/media/disconnect-light.svg index f47adbbe228..06fc4c31553 100644 --- a/src/vs/workbench/contrib/debug/browser/media/disconnect-light.svg +++ b/src/vs/workbench/contrib/debug/browser/media/disconnect-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/drag.svg b/src/vs/workbench/contrib/debug/browser/media/drag.svg index b6b93f31fdf..b2bc17dfa7e 100644 --- a/src/vs/workbench/contrib/debug/browser/media/drag.svg +++ b/src/vs/workbench/contrib/debug/browser/media/drag.svg @@ -1,8 +1,3 @@ - - - - - - + diff --git a/src/vs/workbench/contrib/debug/browser/media/pause-dark.svg b/src/vs/workbench/contrib/debug/browser/media/pause-dark.svg index 9cd9f466130..5fda61c7702 100644 --- a/src/vs/workbench/contrib/debug/browser/media/pause-dark.svg +++ b/src/vs/workbench/contrib/debug/browser/media/pause-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/pause-light.svg b/src/vs/workbench/contrib/debug/browser/media/pause-light.svg index 01d3cbc290c..4e8c46550d0 100644 --- a/src/vs/workbench/contrib/debug/browser/media/pause-light.svg +++ b/src/vs/workbench/contrib/debug/browser/media/pause-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/restart-dark.svg b/src/vs/workbench/contrib/debug/browser/media/restart-dark.svg index f45c9c967ac..fc48916d5a6 100644 --- a/src/vs/workbench/contrib/debug/browser/media/restart-dark.svg +++ b/src/vs/workbench/contrib/debug/browser/media/restart-dark.svg @@ -1,5 +1,3 @@ - - - + diff --git a/src/vs/workbench/contrib/debug/browser/media/restart-light.svg b/src/vs/workbench/contrib/debug/browser/media/restart-light.svg index aa9b912c0d8..4964d5bfaf1 100644 --- a/src/vs/workbench/contrib/debug/browser/media/restart-light.svg +++ b/src/vs/workbench/contrib/debug/browser/media/restart-light.svg @@ -1,5 +1,3 @@ - - - + diff --git a/src/vs/workbench/contrib/debug/browser/media/reverse-continue-dark.svg b/src/vs/workbench/contrib/debug/browser/media/reverse-continue-dark.svg index 24094753931..e0bbfb4202e 100644 --- a/src/vs/workbench/contrib/debug/browser/media/reverse-continue-dark.svg +++ b/src/vs/workbench/contrib/debug/browser/media/reverse-continue-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/debug/browser/media/reverse-continue-light.svg b/src/vs/workbench/contrib/debug/browser/media/reverse-continue-light.svg index 336005e1bb8..e0bbfb4202e 100644 --- a/src/vs/workbench/contrib/debug/browser/media/reverse-continue-light.svg +++ b/src/vs/workbench/contrib/debug/browser/media/reverse-continue-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/debug/browser/media/stackframe-and-breakpoint.svg b/src/vs/workbench/contrib/debug/browser/media/stackframe-and-breakpoint.svg index f7cab86cf13..0279a733d92 100644 --- a/src/vs/workbench/contrib/debug/browser/media/stackframe-and-breakpoint.svg +++ b/src/vs/workbench/contrib/debug/browser/media/stackframe-and-breakpoint.svg @@ -1,4 +1,4 @@ - - + + diff --git a/src/vs/workbench/contrib/debug/browser/media/stackframe-arrow.svg b/src/vs/workbench/contrib/debug/browser/media/stackframe-arrow.svg index b66e3885eaf..38b63a34c53 100644 --- a/src/vs/workbench/contrib/debug/browser/media/stackframe-arrow.svg +++ b/src/vs/workbench/contrib/debug/browser/media/stackframe-arrow.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/debug/browser/media/start-dark.svg b/src/vs/workbench/contrib/debug/browser/media/start-dark.svg index 9debdf8c625..5d91244bff1 100644 --- a/src/vs/workbench/contrib/debug/browser/media/start-dark.svg +++ b/src/vs/workbench/contrib/debug/browser/media/start-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/start-hc.svg b/src/vs/workbench/contrib/debug/browser/media/start-hc.svg index 9debdf8c625..5d91244bff1 100644 --- a/src/vs/workbench/contrib/debug/browser/media/start-hc.svg +++ b/src/vs/workbench/contrib/debug/browser/media/start-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/start-light.svg b/src/vs/workbench/contrib/debug/browser/media/start-light.svg index dac8bdae31f..b6effa36f71 100644 --- a/src/vs/workbench/contrib/debug/browser/media/start-light.svg +++ b/src/vs/workbench/contrib/debug/browser/media/start-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/step-back-dark.svg b/src/vs/workbench/contrib/debug/browser/media/step-back-dark.svg index 0822ef90f01..5a6ada3e113 100644 --- a/src/vs/workbench/contrib/debug/browser/media/step-back-dark.svg +++ b/src/vs/workbench/contrib/debug/browser/media/step-back-dark.svg @@ -1,9 +1,3 @@ - - - - - - - + diff --git a/src/vs/workbench/contrib/debug/browser/media/step-back-light.svg b/src/vs/workbench/contrib/debug/browser/media/step-back-light.svg index 56662bf1622..b5a994d4252 100644 --- a/src/vs/workbench/contrib/debug/browser/media/step-back-light.svg +++ b/src/vs/workbench/contrib/debug/browser/media/step-back-light.svg @@ -1,9 +1,3 @@ - - - - - - - + diff --git a/src/vs/workbench/contrib/debug/browser/media/step-into-dark.svg b/src/vs/workbench/contrib/debug/browser/media/step-into-dark.svg index 6665b1a9d3a..570ae02aafa 100644 --- a/src/vs/workbench/contrib/debug/browser/media/step-into-dark.svg +++ b/src/vs/workbench/contrib/debug/browser/media/step-into-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/debug/browser/media/step-into-light.svg b/src/vs/workbench/contrib/debug/browser/media/step-into-light.svg index 0a213e557cf..55c47062f5c 100644 --- a/src/vs/workbench/contrib/debug/browser/media/step-into-light.svg +++ b/src/vs/workbench/contrib/debug/browser/media/step-into-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/debug/browser/media/step-out-dark.svg b/src/vs/workbench/contrib/debug/browser/media/step-out-dark.svg index b42ed8cb51e..33a7a2fdb72 100644 --- a/src/vs/workbench/contrib/debug/browser/media/step-out-dark.svg +++ b/src/vs/workbench/contrib/debug/browser/media/step-out-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/debug/browser/media/step-out-light.svg b/src/vs/workbench/contrib/debug/browser/media/step-out-light.svg index 2e465b2197f..6ac2139659d 100644 --- a/src/vs/workbench/contrib/debug/browser/media/step-out-light.svg +++ b/src/vs/workbench/contrib/debug/browser/media/step-out-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/debug/browser/media/step-over-dark.svg b/src/vs/workbench/contrib/debug/browser/media/step-over-dark.svg index 9bed265fba2..5bf10674eec 100644 --- a/src/vs/workbench/contrib/debug/browser/media/step-over-dark.svg +++ b/src/vs/workbench/contrib/debug/browser/media/step-over-dark.svg @@ -1,9 +1,3 @@ - - - - - - - + diff --git a/src/vs/workbench/contrib/debug/browser/media/step-over-light.svg b/src/vs/workbench/contrib/debug/browser/media/step-over-light.svg index 23dcfbef24c..b874a2564b5 100644 --- a/src/vs/workbench/contrib/debug/browser/media/step-over-light.svg +++ b/src/vs/workbench/contrib/debug/browser/media/step-over-light.svg @@ -1,9 +1,3 @@ - - - - - - - + diff --git a/src/vs/workbench/contrib/debug/browser/media/stop-dark.svg b/src/vs/workbench/contrib/debug/browser/media/stop-dark.svg index c503a66969c..9a28f77a9f9 100644 --- a/src/vs/workbench/contrib/debug/browser/media/stop-dark.svg +++ b/src/vs/workbench/contrib/debug/browser/media/stop-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/stop-light.svg b/src/vs/workbench/contrib/debug/browser/media/stop-light.svg index 11719ced07c..9a28f77a9f9 100644 --- a/src/vs/workbench/contrib/debug/browser/media/stop-light.svg +++ b/src/vs/workbench/contrib/debug/browser/media/stop-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-dark.svg b/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-dark.svg index 76a4d5d3bac..2e8b9f34e5e 100644 --- a/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-dark.svg +++ b/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-hc.svg b/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-hc.svg index 08a3991311a..ab1b9e54f98 100644 --- a/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-hc.svg +++ b/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-light.svg b/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-light.svg index a73684ef2b6..479dc5f81e5 100644 --- a/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-light.svg +++ b/src/vs/workbench/contrib/debug/browser/media/toggle-breakpoints-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/configure-dark.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-dark.svg index 4d1909627a7..a0ddc9b9fd1 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/configure-dark.svg +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/configure-hc.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-hc.svg index cb206a1fb99..66e90b0f5f6 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/configure-hc.svg +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/configure-light.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-light.svg index 727a34f26f3..fb7ffea770b 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/configure-light.svg +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/star-empty.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/star-empty.svg index acd3675de08..999de681817 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/star-empty.svg +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/star-empty.svg @@ -1,6 +1,5 @@ - - + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/star-full.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/star-full.svg index 23b5c9c0bd4..1603b080b27 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/star-full.svg +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/star-full.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/star-half.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/star-half.svg index 9193e4a596c..7615f581654 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/star-half.svg +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/star-half.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/star-small.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/star-small.svg new file mode 100644 index 00000000000..41c128627fe --- /dev/null +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/star-small.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/vs/workbench/contrib/files/browser/media/action-close-dark.svg b/src/vs/workbench/contrib/files/browser/media/action-close-dark.svg index e0475f7b85a..f8af265cc44 100644 --- a/src/vs/workbench/contrib/files/browser/media/action-close-dark.svg +++ b/src/vs/workbench/contrib/files/browser/media/action-close-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/files/browser/media/action-close-light.svg b/src/vs/workbench/contrib/files/browser/media/action-close-light.svg index 3bd44674699..7acc4103388 100644 --- a/src/vs/workbench/contrib/files/browser/media/action-close-light.svg +++ b/src/vs/workbench/contrib/files/browser/media/action-close-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/files/browser/media/add-file-dark.svg b/src/vs/workbench/contrib/files/browser/media/add-file-dark.svg index f365b0fdf69..f162f2046e6 100644 --- a/src/vs/workbench/contrib/files/browser/media/add-file-dark.svg +++ b/src/vs/workbench/contrib/files/browser/media/add-file-dark.svg @@ -1,5 +1,3 @@ - - - + diff --git a/src/vs/workbench/contrib/files/browser/media/add-file-hc.svg b/src/vs/workbench/contrib/files/browser/media/add-file-hc.svg index 37891831f7b..79d286c4279 100644 --- a/src/vs/workbench/contrib/files/browser/media/add-file-hc.svg +++ b/src/vs/workbench/contrib/files/browser/media/add-file-hc.svg @@ -1,5 +1,3 @@ - - - + diff --git a/src/vs/workbench/contrib/files/browser/media/add-file-light.svg b/src/vs/workbench/contrib/files/browser/media/add-file-light.svg index 9a2d2956e28..048c2d98241 100644 --- a/src/vs/workbench/contrib/files/browser/media/add-file-light.svg +++ b/src/vs/workbench/contrib/files/browser/media/add-file-light.svg @@ -1,5 +1,3 @@ - - - + diff --git a/src/vs/workbench/contrib/files/browser/media/add-folder-dark.svg b/src/vs/workbench/contrib/files/browser/media/add-folder-dark.svg index 6a37c63e480..b1a959cf637 100644 --- a/src/vs/workbench/contrib/files/browser/media/add-folder-dark.svg +++ b/src/vs/workbench/contrib/files/browser/media/add-folder-dark.svg @@ -1,13 +1,11 @@ - - - + - + diff --git a/src/vs/workbench/contrib/files/browser/media/add-folder-hc.svg b/src/vs/workbench/contrib/files/browser/media/add-folder-hc.svg index c104237262b..24036cfb09c 100644 --- a/src/vs/workbench/contrib/files/browser/media/add-folder-hc.svg +++ b/src/vs/workbench/contrib/files/browser/media/add-folder-hc.svg @@ -1,13 +1,11 @@ - - - + - + diff --git a/src/vs/workbench/contrib/files/browser/media/add-folder-light.svg b/src/vs/workbench/contrib/files/browser/media/add-folder-light.svg index fc87c0a02f0..ed99ce33a7f 100644 --- a/src/vs/workbench/contrib/files/browser/media/add-folder-light.svg +++ b/src/vs/workbench/contrib/files/browser/media/add-folder-light.svg @@ -1,13 +1,11 @@ - - - + - + diff --git a/src/vs/workbench/contrib/files/browser/media/close-all-dark.svg b/src/vs/workbench/contrib/files/browser/media/close-all-dark.svg index 9f36d92bef7..12a89f8e397 100644 --- a/src/vs/workbench/contrib/files/browser/media/close-all-dark.svg +++ b/src/vs/workbench/contrib/files/browser/media/close-all-dark.svg @@ -1,4 +1,4 @@ - + diff --git a/src/vs/workbench/contrib/files/browser/media/close-all-hc.svg b/src/vs/workbench/contrib/files/browser/media/close-all-hc.svg index e72191af0a1..3cbd40ee697 100644 --- a/src/vs/workbench/contrib/files/browser/media/close-all-hc.svg +++ b/src/vs/workbench/contrib/files/browser/media/close-all-hc.svg @@ -1,4 +1,4 @@ - + diff --git a/src/vs/workbench/contrib/files/browser/media/close-all-light.svg b/src/vs/workbench/contrib/files/browser/media/close-all-light.svg index 13873698045..53421f0121c 100644 --- a/src/vs/workbench/contrib/files/browser/media/close-all-light.svg +++ b/src/vs/workbench/contrib/files/browser/media/close-all-light.svg @@ -1,4 +1,4 @@ - + diff --git a/src/vs/workbench/contrib/files/browser/media/collapse-all-dark.svg b/src/vs/workbench/contrib/files/browser/media/collapse-all-dark.svg index 4a3ae7f6009..4862c55dbeb 100644 --- a/src/vs/workbench/contrib/files/browser/media/collapse-all-dark.svg +++ b/src/vs/workbench/contrib/files/browser/media/collapse-all-dark.svg @@ -1,4 +1,4 @@ - + diff --git a/src/vs/workbench/contrib/files/browser/media/collapse-all-hc.svg b/src/vs/workbench/contrib/files/browser/media/collapse-all-hc.svg index f2e0e5dd5f6..05f920b29b6 100644 --- a/src/vs/workbench/contrib/files/browser/media/collapse-all-hc.svg +++ b/src/vs/workbench/contrib/files/browser/media/collapse-all-hc.svg @@ -1,4 +1,4 @@ - + diff --git a/src/vs/workbench/contrib/files/browser/media/collapse-all-light.svg b/src/vs/workbench/contrib/files/browser/media/collapse-all-light.svg index cb5e5229717..6359b42e623 100644 --- a/src/vs/workbench/contrib/files/browser/media/collapse-all-light.svg +++ b/src/vs/workbench/contrib/files/browser/media/collapse-all-light.svg @@ -1,4 +1,4 @@ - + diff --git a/src/vs/workbench/contrib/files/browser/media/files-activity-bar.svg b/src/vs/workbench/contrib/files/browser/media/files-activity-bar.svg index 0ca109747e7..09c943426e0 100644 --- a/src/vs/workbench/contrib/files/browser/media/files-activity-bar.svg +++ b/src/vs/workbench/contrib/files/browser/media/files-activity-bar.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/files/browser/media/preview-dark.svg b/src/vs/workbench/contrib/files/browser/media/preview-dark.svg index 569cecf9d5a..1d59877196b 100644 --- a/src/vs/workbench/contrib/files/browser/media/preview-dark.svg +++ b/src/vs/workbench/contrib/files/browser/media/preview-dark.svg @@ -1,4 +1,4 @@ - + diff --git a/src/vs/workbench/contrib/files/browser/media/preview-light.svg b/src/vs/workbench/contrib/files/browser/media/preview-light.svg index f6c3f035a88..3f1152fc3cd 100644 --- a/src/vs/workbench/contrib/files/browser/media/preview-light.svg +++ b/src/vs/workbench/contrib/files/browser/media/preview-light.svg @@ -1,4 +1,4 @@ - + diff --git a/src/vs/workbench/contrib/files/browser/media/save-all-dark.svg b/src/vs/workbench/contrib/files/browser/media/save-all-dark.svg index ae5949ef1d4..8acad37a99c 100644 --- a/src/vs/workbench/contrib/files/browser/media/save-all-dark.svg +++ b/src/vs/workbench/contrib/files/browser/media/save-all-dark.svg @@ -1,5 +1,3 @@ - - - + diff --git a/src/vs/workbench/contrib/files/browser/media/save-all-hc.svg b/src/vs/workbench/contrib/files/browser/media/save-all-hc.svg index 3cc9cfaef09..5d519f76051 100644 --- a/src/vs/workbench/contrib/files/browser/media/save-all-hc.svg +++ b/src/vs/workbench/contrib/files/browser/media/save-all-hc.svg @@ -1,5 +1,3 @@ - - - + diff --git a/src/vs/workbench/contrib/files/browser/media/save-all-light.svg b/src/vs/workbench/contrib/files/browser/media/save-all-light.svg index a4a9424a956..529e489a816 100644 --- a/src/vs/workbench/contrib/files/browser/media/save-all-light.svg +++ b/src/vs/workbench/contrib/files/browser/media/save-all-light.svg @@ -1,5 +1,3 @@ - - - + diff --git a/src/vs/workbench/contrib/files/browser/media/split-editor-horizontal-dark.svg b/src/vs/workbench/contrib/files/browser/media/split-editor-horizontal-dark.svg index ac4121490eb..8c22a7c5bfe 100644 --- a/src/vs/workbench/contrib/files/browser/media/split-editor-horizontal-dark.svg +++ b/src/vs/workbench/contrib/files/browser/media/split-editor-horizontal-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/files/browser/media/split-editor-horizontal-hc.svg b/src/vs/workbench/contrib/files/browser/media/split-editor-horizontal-hc.svg index c92025ddd92..82c19d0c8fc 100644 --- a/src/vs/workbench/contrib/files/browser/media/split-editor-horizontal-hc.svg +++ b/src/vs/workbench/contrib/files/browser/media/split-editor-horizontal-hc.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/files/browser/media/split-editor-horizontal-light.svg b/src/vs/workbench/contrib/files/browser/media/split-editor-horizontal-light.svg index b7701615a9d..400952cdda8 100644 --- a/src/vs/workbench/contrib/files/browser/media/split-editor-horizontal-light.svg +++ b/src/vs/workbench/contrib/files/browser/media/split-editor-horizontal-light.svg @@ -1,4 +1,7 @@ - - + + + + + diff --git a/src/vs/workbench/contrib/files/browser/media/split-editor-vertical-dark.svg b/src/vs/workbench/contrib/files/browser/media/split-editor-vertical-dark.svg index dfe68163a9e..419c21be4f6 100644 --- a/src/vs/workbench/contrib/files/browser/media/split-editor-vertical-dark.svg +++ b/src/vs/workbench/contrib/files/browser/media/split-editor-vertical-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/files/browser/media/split-editor-vertical-hc.svg b/src/vs/workbench/contrib/files/browser/media/split-editor-vertical-hc.svg index f407c08fa34..7565fd3c168 100644 --- a/src/vs/workbench/contrib/files/browser/media/split-editor-vertical-hc.svg +++ b/src/vs/workbench/contrib/files/browser/media/split-editor-vertical-hc.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/files/browser/media/split-editor-vertical-light.svg b/src/vs/workbench/contrib/files/browser/media/split-editor-vertical-light.svg index e7eca812f95..405291c14dd 100644 --- a/src/vs/workbench/contrib/files/browser/media/split-editor-vertical-light.svg +++ b/src/vs/workbench/contrib/files/browser/media/split-editor-vertical-light.svg @@ -1,4 +1,7 @@ - - + + + + + diff --git a/src/vs/workbench/contrib/markers/browser/media/exclude-settings-dark.svg b/src/vs/workbench/contrib/markers/browser/media/exclude-settings-dark.svg index 1bfca289bd7..22cc3c421a6 100644 --- a/src/vs/workbench/contrib/markers/browser/media/exclude-settings-dark.svg +++ b/src/vs/workbench/contrib/markers/browser/media/exclude-settings-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/markers/browser/media/exclude-settings-hc.svg b/src/vs/workbench/contrib/markers/browser/media/exclude-settings-hc.svg index ab06ba33068..46a365e3b2d 100644 --- a/src/vs/workbench/contrib/markers/browser/media/exclude-settings-hc.svg +++ b/src/vs/workbench/contrib/markers/browser/media/exclude-settings-hc.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/markers/browser/media/exclude-settings-light.svg b/src/vs/workbench/contrib/markers/browser/media/exclude-settings-light.svg index 8adf3e518fc..3248beed377 100644 --- a/src/vs/workbench/contrib/markers/browser/media/exclude-settings-light.svg +++ b/src/vs/workbench/contrib/markers/browser/media/exclude-settings-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/output/browser/media/clear-dark.svg b/src/vs/workbench/contrib/output/browser/media/clear-dark.svg index 1062295b4e9..04d64ab41ca 100644 --- a/src/vs/workbench/contrib/output/browser/media/clear-dark.svg +++ b/src/vs/workbench/contrib/output/browser/media/clear-dark.svg @@ -2,6 +2,6 @@ - + diff --git a/src/vs/workbench/contrib/output/browser/media/clear-hc.svg b/src/vs/workbench/contrib/output/browser/media/clear-hc.svg index f0c5bdc29d9..44a41edd3b3 100644 --- a/src/vs/workbench/contrib/output/browser/media/clear-hc.svg +++ b/src/vs/workbench/contrib/output/browser/media/clear-hc.svg @@ -2,6 +2,6 @@ - + diff --git a/src/vs/workbench/contrib/output/browser/media/clear-light.svg b/src/vs/workbench/contrib/output/browser/media/clear-light.svg index 295bb2ca62e..f6a51c856f0 100644 --- a/src/vs/workbench/contrib/output/browser/media/clear-light.svg +++ b/src/vs/workbench/contrib/output/browser/media/clear-light.svg @@ -2,6 +2,6 @@ - + diff --git a/src/vs/workbench/contrib/output/browser/media/locked-dark.svg b/src/vs/workbench/contrib/output/browser/media/locked-dark.svg index 903d26b6043..ebdc1c0078a 100644 --- a/src/vs/workbench/contrib/output/browser/media/locked-dark.svg +++ b/src/vs/workbench/contrib/output/browser/media/locked-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/output/browser/media/locked-hc.svg b/src/vs/workbench/contrib/output/browser/media/locked-hc.svg index 70d268965a0..350dc417710 100644 --- a/src/vs/workbench/contrib/output/browser/media/locked-hc.svg +++ b/src/vs/workbench/contrib/output/browser/media/locked-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/output/browser/media/locked-light.svg b/src/vs/workbench/contrib/output/browser/media/locked-light.svg index 6342c0a75da..03b03513688 100644 --- a/src/vs/workbench/contrib/output/browser/media/locked-light.svg +++ b/src/vs/workbench/contrib/output/browser/media/locked-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/output/browser/media/open-file-dark.svg b/src/vs/workbench/contrib/output/browser/media/open-file-dark.svg index 5cebcad2a8d..ed302ae1398 100644 --- a/src/vs/workbench/contrib/output/browser/media/open-file-dark.svg +++ b/src/vs/workbench/contrib/output/browser/media/open-file-dark.svg @@ -1,5 +1,3 @@ - - - + diff --git a/src/vs/workbench/contrib/output/browser/media/open-file-hc.svg b/src/vs/workbench/contrib/output/browser/media/open-file-hc.svg index aabfc34c3e4..bba63494e6f 100644 --- a/src/vs/workbench/contrib/output/browser/media/open-file-hc.svg +++ b/src/vs/workbench/contrib/output/browser/media/open-file-hc.svg @@ -1,5 +1,3 @@ - - - + diff --git a/src/vs/workbench/contrib/output/browser/media/open-file-light.svg b/src/vs/workbench/contrib/output/browser/media/open-file-light.svg index e5b2a034bf8..392a840c5ef 100644 --- a/src/vs/workbench/contrib/output/browser/media/open-file-light.svg +++ b/src/vs/workbench/contrib/output/browser/media/open-file-light.svg @@ -1,5 +1,3 @@ - - - + diff --git a/src/vs/workbench/contrib/output/browser/media/unlocked-dark.svg b/src/vs/workbench/contrib/output/browser/media/unlocked-dark.svg index 6d234b718f8..3b7947f9752 100644 --- a/src/vs/workbench/contrib/output/browser/media/unlocked-dark.svg +++ b/src/vs/workbench/contrib/output/browser/media/unlocked-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/output/browser/media/unlocked-hc.svg b/src/vs/workbench/contrib/output/browser/media/unlocked-hc.svg index cf8268d37d2..100cfc1385a 100644 --- a/src/vs/workbench/contrib/output/browser/media/unlocked-hc.svg +++ b/src/vs/workbench/contrib/output/browser/media/unlocked-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/output/browser/media/unlocked-light.svg b/src/vs/workbench/contrib/output/browser/media/unlocked-light.svg index 7b10223810c..0c3cb4b93b0 100644 --- a/src/vs/workbench/contrib/output/browser/media/unlocked-light.svg +++ b/src/vs/workbench/contrib/output/browser/media/unlocked-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/preferences/browser/media/action-remove-dark.svg b/src/vs/workbench/contrib/preferences/browser/media/action-remove-dark.svg deleted file mode 100644 index 751e89b3b02..00000000000 --- a/src/vs/workbench/contrib/preferences/browser/media/action-remove-dark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/preferences/browser/media/action-remove.svg b/src/vs/workbench/contrib/preferences/browser/media/action-remove.svg deleted file mode 100644 index fde34404d4e..00000000000 --- a/src/vs/workbench/contrib/preferences/browser/media/action-remove.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/preferences/browser/media/add-dark.svg b/src/vs/workbench/contrib/preferences/browser/media/add-dark.svg new file mode 100644 index 00000000000..4d9389336b9 --- /dev/null +++ b/src/vs/workbench/contrib/preferences/browser/media/add-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/add-light.svg b/src/vs/workbench/contrib/preferences/browser/media/add-light.svg new file mode 100644 index 00000000000..01a9de7d5ab --- /dev/null +++ b/src/vs/workbench/contrib/preferences/browser/media/add-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/check-dark.svg b/src/vs/workbench/contrib/preferences/browser/media/check-dark.svg new file mode 100644 index 00000000000..865cc83c347 --- /dev/null +++ b/src/vs/workbench/contrib/preferences/browser/media/check-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/check-inverse.svg b/src/vs/workbench/contrib/preferences/browser/media/check-inverse.svg deleted file mode 100644 index c225b2f597f..00000000000 --- a/src/vs/workbench/contrib/preferences/browser/media/check-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/preferences/browser/media/check-light.svg b/src/vs/workbench/contrib/preferences/browser/media/check-light.svg new file mode 100644 index 00000000000..e1a546660ed --- /dev/null +++ b/src/vs/workbench/contrib/preferences/browser/media/check-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/check.svg b/src/vs/workbench/contrib/preferences/browser/media/check.svg deleted file mode 100644 index 3f365c4800e..00000000000 --- a/src/vs/workbench/contrib/preferences/browser/media/check.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/preferences/browser/media/clear-dark.svg b/src/vs/workbench/contrib/preferences/browser/media/clear-dark.svg new file mode 100644 index 00000000000..04d64ab41ca --- /dev/null +++ b/src/vs/workbench/contrib/preferences/browser/media/clear-dark.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/clear-inverse.svg b/src/vs/workbench/contrib/preferences/browser/media/clear-inverse.svg deleted file mode 100644 index 85e7ec4bdaf..00000000000 --- a/src/vs/workbench/contrib/preferences/browser/media/clear-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/preferences/browser/media/clear-light.svg b/src/vs/workbench/contrib/preferences/browser/media/clear-light.svg new file mode 100644 index 00000000000..f6a51c856f0 --- /dev/null +++ b/src/vs/workbench/contrib/preferences/browser/media/clear-light.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/clear.svg b/src/vs/workbench/contrib/preferences/browser/media/clear.svg deleted file mode 100644 index ef02703e10b..00000000000 --- a/src/vs/workbench/contrib/preferences/browser/media/clear.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/preferences/browser/media/configure-dark.svg b/src/vs/workbench/contrib/preferences/browser/media/configure-dark.svg new file mode 100644 index 00000000000..4e4bc65c207 --- /dev/null +++ b/src/vs/workbench/contrib/preferences/browser/media/configure-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/configure-inverse.svg b/src/vs/workbench/contrib/preferences/browser/media/configure-inverse.svg deleted file mode 100644 index bbfbd366eb9..00000000000 --- a/src/vs/workbench/contrib/preferences/browser/media/configure-inverse.svg +++ /dev/null @@ -1 +0,0 @@ -configure \ No newline at end of file diff --git a/src/vs/workbench/contrib/preferences/browser/media/configure-light.svg b/src/vs/workbench/contrib/preferences/browser/media/configure-light.svg new file mode 100644 index 00000000000..fb7ffea770b --- /dev/null +++ b/src/vs/workbench/contrib/preferences/browser/media/configure-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/configure.svg b/src/vs/workbench/contrib/preferences/browser/media/configure.svg deleted file mode 100644 index c97bb48bdcc..00000000000 --- a/src/vs/workbench/contrib/preferences/browser/media/configure.svg +++ /dev/null @@ -1 +0,0 @@ -configure \ No newline at end of file diff --git a/src/vs/workbench/contrib/preferences/browser/media/edit-dark.svg b/src/vs/workbench/contrib/preferences/browser/media/edit-dark.svg new file mode 100644 index 00000000000..c455cadaddc --- /dev/null +++ b/src/vs/workbench/contrib/preferences/browser/media/edit-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/edit-json-dark.svg b/src/vs/workbench/contrib/preferences/browser/media/edit-json-dark.svg index 3f2e2a05e19..9a725bb41fd 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/edit-json-dark.svg +++ b/src/vs/workbench/contrib/preferences/browser/media/edit-json-dark.svg @@ -1,5 +1,3 @@ - - - + diff --git a/src/vs/workbench/contrib/preferences/browser/media/edit-json-light.svg b/src/vs/workbench/contrib/preferences/browser/media/edit-json-light.svg index e154f4c4ac1..1339da7ce21 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/edit-json-light.svg +++ b/src/vs/workbench/contrib/preferences/browser/media/edit-json-light.svg @@ -1,5 +1,3 @@ - - - + diff --git a/src/vs/workbench/contrib/preferences/browser/media/edit-light.svg b/src/vs/workbench/contrib/preferences/browser/media/edit-light.svg new file mode 100644 index 00000000000..4c6c9b14261 --- /dev/null +++ b/src/vs/workbench/contrib/preferences/browser/media/edit-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/keybindingsEditor.css b/src/vs/workbench/contrib/preferences/browser/media/keybindingsEditor.css index 3e73bc7fbfb..3fd18df42d1 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/keybindingsEditor.css +++ b/src/vs/workbench/contrib/preferences/browser/media/keybindingsEditor.css @@ -46,30 +46,30 @@ } .keybindings-editor .monaco-action-bar .action-item > .sort-by-precedence { - background: url('sort_precedence.svg') center center no-repeat; + background: url('sort-precedence-light.svg') center center no-repeat; } .hc-black .keybindings-editor .monaco-action-bar .action-item > .sort-by-precedence, .vs-dark .keybindings-editor .monaco-action-bar .action-item > .sort-by-precedence { - background: url('sort_precedence_inverse.svg') center center no-repeat; + background: url('sort-precedence-dark.svg') center center no-repeat; } .keybindings-editor .monaco-action-bar .action-item > .record-keys { - background: url('record-keys.svg') center center no-repeat; + background: url('record-keys-light.svg') center center no-repeat; } .hc-black .keybindings-editor .monaco-action-bar .action-item > .record-keys, .vs-dark .keybindings-editor .monaco-action-bar .action-item > .record-keys { - background: url('record-keys-inverse.svg') center center no-repeat; + background: url('record-keys-dark.svg') center center no-repeat; } .keybindings-editor .monaco-action-bar .action-item > .clear-input { - background: url('clear.svg') center center no-repeat; + background: url('clear-light.svg') center center no-repeat; } .hc-black .keybindings-editor .monaco-action-bar .action-item > .clear-input, .vs-dark .keybindings-editor .monaco-action-bar .action-item > .clear-input { - background: url('clear-inverse.svg') center center no-repeat; + background: url('clear-dark.svg') center center no-repeat; } .keybindings-editor > .keybindings-header .open-keybindings-container { @@ -208,20 +208,20 @@ } .keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row > .column .monaco-action-bar .action-item > .icon.edit { - background: url('edit.svg') center center no-repeat; + background: url('edit-light.svg') center center no-repeat; transform: rotate(-90deg); } .hc-black .keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row > .column .monaco-action-bar .action-item > .icon.edit, .vs-dark .keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row > .column .monaco-action-bar .action-item > .icon.edit { - background: url('edit_inverse.svg') center center no-repeat; + background: url('edit-dark.svg') center center no-repeat; } .keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row > .column .monaco-action-bar .action-item > .icon.add { - background: url('add.svg') center center no-repeat; + background: url('add-light.svg') center center no-repeat; } .hc-black .keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row > .column .monaco-action-bar .action-item > .icon.add, .vs-dark .keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row > .column .monaco-action-bar .action-item > .icon.add { - background: url('add_inverse.svg') center center no-repeat; + background: url('add-dark.svg') center center no-repeat; } diff --git a/src/vs/workbench/contrib/preferences/browser/media/preferences-editor-dark.svg b/src/vs/workbench/contrib/preferences/browser/media/preferences-editor-dark.svg index 7030885c039..ed302ae1398 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/preferences-editor-dark.svg +++ b/src/vs/workbench/contrib/preferences/browser/media/preferences-editor-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/preferences/browser/media/preferences-editor-light.svg b/src/vs/workbench/contrib/preferences/browser/media/preferences-editor-light.svg index 017eabca6d2..392a840c5ef 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/preferences-editor-light.svg +++ b/src/vs/workbench/contrib/preferences/browser/media/preferences-editor-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/preferences/browser/media/preferences.css b/src/vs/workbench/contrib/preferences/browser/media/preferences.css index 453deb5f120..3d93ba5a766 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/preferences.css +++ b/src/vs/workbench/contrib/preferences/browser/media/preferences.css @@ -199,27 +199,28 @@ } .monaco-editor .settings-group-title-widget .title-container .expand-collapse-icon { - background: url(expanded.svg) 50% 50% no-repeat; + background: url("tree-expanded-light.svg") 50% 50% no-repeat; + margin-right: 2px; width: 16px; height: 100%; } .monaco-editor.vs-dark .settings-group-title-widget .title-container .expand-collapse-icon, .monaco-editor.hc-black .settings-group-title-widget .title-container .expand-collapse-icon { - background: url(expanded-dark.svg) 50% 50% no-repeat; + background: url("tree-expanded-dark.svg") 50% 50% no-repeat; } .monaco-editor .settings-group-title-widget .title-container.collapsed .expand-collapse-icon { - background: url(collapsed.svg) 50% 50% no-repeat; + background: url("tree-collapsed-light.svg") 50% 50% no-repeat; } .monaco-editor.vs-dark .settings-group-title-widget .title-container.collapsed .expand-collapse-icon, .monaco-editor.hc-black .settings-group-title-widget .title-container.collapsed .expand-collapse-icon { - background: url(collapsed-dark.svg) 50% 50% no-repeat; + background: url("tree-collapsed-dark.svg") 50% 50% no-repeat; } .monaco-editor .edit-preferences-widget { - background: url('edit.svg') center center no-repeat; + background: url('edit-light.svg') center center no-repeat; transform: rotate(-90deg); width:16px; height: 16px; @@ -233,7 +234,7 @@ .monaco-editor.hc-black .edit-preferences-widget, .monaco-editor.vs-dark .edit-preferences-widget { - background: url('edit_inverse.svg') center center no-repeat; + background: url('edit-dark.svg') center center no-repeat; } .monaco-editor .dim-configuration { diff --git a/src/vs/workbench/contrib/preferences/browser/media/record-keys-dark.svg b/src/vs/workbench/contrib/preferences/browser/media/record-keys-dark.svg new file mode 100644 index 00000000000..4341206b83d --- /dev/null +++ b/src/vs/workbench/contrib/preferences/browser/media/record-keys-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/record-keys-inverse.svg b/src/vs/workbench/contrib/preferences/browser/media/record-keys-inverse.svg deleted file mode 100644 index c41db87e707..00000000000 --- a/src/vs/workbench/contrib/preferences/browser/media/record-keys-inverse.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/contrib/preferences/browser/media/record-keys-light.svg b/src/vs/workbench/contrib/preferences/browser/media/record-keys-light.svg new file mode 100644 index 00000000000..af980359439 --- /dev/null +++ b/src/vs/workbench/contrib/preferences/browser/media/record-keys-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/record-keys.svg b/src/vs/workbench/contrib/preferences/browser/media/record-keys.svg deleted file mode 100644 index d552b363145..00000000000 --- a/src/vs/workbench/contrib/preferences/browser/media/record-keys.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/vs/workbench/contrib/preferences/browser/media/remove-dark.svg b/src/vs/workbench/contrib/preferences/browser/media/remove-dark.svg new file mode 100644 index 00000000000..75644595d19 --- /dev/null +++ b/src/vs/workbench/contrib/preferences/browser/media/remove-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/remove-light.svg b/src/vs/workbench/contrib/preferences/browser/media/remove-light.svg new file mode 100644 index 00000000000..cf5f28ca35c --- /dev/null +++ b/src/vs/workbench/contrib/preferences/browser/media/remove-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css b/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css index 07a0d93e5a8..4b11273f830 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css +++ b/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css @@ -172,11 +172,11 @@ } .vs .settings-editor > .settings-body .settings-tree-container .monaco-toolbar .toolbar-toggle-more { - background-image: url('configure.svg'); + background-image: url('configure-light.svg'); } .vs-dark .settings-editor > .settings-body .settings-tree-container .monaco-toolbar .toolbar-toggle-more { - background-image: url('configure-inverse.svg'); + background-image: url('configure-dark.svg'); } .settings-editor > .settings-body .settings-toc-container { @@ -434,12 +434,12 @@ } .vs .settings-editor > .settings-body > .settings-tree-container .setting-item-bool .setting-value-checkbox.checked { - background: url('check.svg') center center no-repeat; + background: url('check-light.svg') center center no-repeat; } .vs-dark .settings-editor > .settings-body > .settings-tree-container .setting-item-bool .setting-value-checkbox.checked, .hc-black .settings-editor > .settings-body > .settings-tree-container .setting-item-bool .setting-value-checkbox.checked { - background: url('check-inverse.svg') center center no-repeat; + background: url('check-dark.svg') center center no-repeat; } .settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-value { diff --git a/src/vs/workbench/contrib/preferences/browser/media/settingsWidgets.css b/src/vs/workbench/contrib/preferences/browser/media/settingsWidgets.css index 695926f9e33..fddde991821 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/settingsWidgets.css +++ b/src/vs/workbench/contrib/preferences/browser/media/settingsWidgets.css @@ -58,19 +58,19 @@ } .vs .settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-exclude .setting-exclude-row .monaco-action-bar .setting-excludeAction-edit { - background: url(edit.svg) center center no-repeat; + background: url("edit-light.svg") center center no-repeat; } .vs-dark .settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-exclude .setting-exclude-row .monaco-action-bar .setting-excludeAction-edit { - background: url(edit_inverse.svg) center center no-repeat; + background: url("edit-dark.svg") center center no-repeat; } .vs .settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-exclude .setting-exclude-row .monaco-action-bar .setting-excludeAction-remove { - background: url(action-remove.svg) center center no-repeat; + background: url("remove-light.svg") center center no-repeat; } .vs-dark .settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-exclude .setting-exclude-row .monaco-action-bar .setting-excludeAction-remove { - background: url(action-remove-dark.svg) center center no-repeat; + background: url("remove-dark.svg") center center no-repeat; } .settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-exclude .monaco-text-button { diff --git a/src/vs/workbench/contrib/preferences/browser/media/sort-precedence-dark.svg b/src/vs/workbench/contrib/preferences/browser/media/sort-precedence-dark.svg new file mode 100644 index 00000000000..6b533e0824d --- /dev/null +++ b/src/vs/workbench/contrib/preferences/browser/media/sort-precedence-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/sort-precedence-light.svg b/src/vs/workbench/contrib/preferences/browser/media/sort-precedence-light.svg new file mode 100644 index 00000000000..494e5e458c0 --- /dev/null +++ b/src/vs/workbench/contrib/preferences/browser/media/sort-precedence-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/sort_precedence.svg b/src/vs/workbench/contrib/preferences/browser/media/sort_precedence.svg deleted file mode 100644 index 07e6d6b84ba..00000000000 --- a/src/vs/workbench/contrib/preferences/browser/media/sort_precedence.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/preferences/browser/media/sort_precedence_inverse.svg b/src/vs/workbench/contrib/preferences/browser/media/sort_precedence_inverse.svg deleted file mode 100644 index 92c9a64dbc4..00000000000 --- a/src/vs/workbench/contrib/preferences/browser/media/sort_precedence_inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/preferences/browser/media/tree-collapsed-dark.svg b/src/vs/workbench/contrib/preferences/browser/media/tree-collapsed-dark.svg new file mode 100644 index 00000000000..17de497f336 --- /dev/null +++ b/src/vs/workbench/contrib/preferences/browser/media/tree-collapsed-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/tree-collapsed-light.svg b/src/vs/workbench/contrib/preferences/browser/media/tree-collapsed-light.svg new file mode 100644 index 00000000000..296499b8e5c --- /dev/null +++ b/src/vs/workbench/contrib/preferences/browser/media/tree-collapsed-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/tree-expanded-dark.svg b/src/vs/workbench/contrib/preferences/browser/media/tree-expanded-dark.svg new file mode 100644 index 00000000000..a1df6a8d44a --- /dev/null +++ b/src/vs/workbench/contrib/preferences/browser/media/tree-expanded-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/tree-expanded-light.svg b/src/vs/workbench/contrib/preferences/browser/media/tree-expanded-light.svg new file mode 100644 index 00000000000..e60e357f573 --- /dev/null +++ b/src/vs/workbench/contrib/preferences/browser/media/tree-expanded-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/search/browser/media/collapse-all-dark.svg b/src/vs/workbench/contrib/search/browser/media/collapse-all-dark.svg index 4a3ae7f6009..4862c55dbeb 100644 --- a/src/vs/workbench/contrib/search/browser/media/collapse-all-dark.svg +++ b/src/vs/workbench/contrib/search/browser/media/collapse-all-dark.svg @@ -1,4 +1,4 @@ - + diff --git a/src/vs/workbench/contrib/search/browser/media/collapse-all-hc.svg b/src/vs/workbench/contrib/search/browser/media/collapse-all-hc.svg index f2e0e5dd5f6..05f920b29b6 100644 --- a/src/vs/workbench/contrib/search/browser/media/collapse-all-hc.svg +++ b/src/vs/workbench/contrib/search/browser/media/collapse-all-hc.svg @@ -1,4 +1,4 @@ - + diff --git a/src/vs/workbench/contrib/search/browser/media/collapse-all-light.svg b/src/vs/workbench/contrib/search/browser/media/collapse-all-light.svg index cb5e5229717..6359b42e623 100644 --- a/src/vs/workbench/contrib/search/browser/media/collapse-all-light.svg +++ b/src/vs/workbench/contrib/search/browser/media/collapse-all-light.svg @@ -1,4 +1,4 @@ - + diff --git a/src/vs/workbench/contrib/search/browser/media/exclude-settings-dark.svg b/src/vs/workbench/contrib/search/browser/media/exclude-settings-dark.svg index 1bfca289bd7..22cc3c421a6 100644 --- a/src/vs/workbench/contrib/search/browser/media/exclude-settings-dark.svg +++ b/src/vs/workbench/contrib/search/browser/media/exclude-settings-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/search/browser/media/exclude-settings-hc.svg b/src/vs/workbench/contrib/search/browser/media/exclude-settings-hc.svg index ab06ba33068..46a365e3b2d 100644 --- a/src/vs/workbench/contrib/search/browser/media/exclude-settings-hc.svg +++ b/src/vs/workbench/contrib/search/browser/media/exclude-settings-hc.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/search/browser/media/exclude-settings-light.svg b/src/vs/workbench/contrib/search/browser/media/exclude-settings-light.svg index 8adf3e518fc..3248beed377 100644 --- a/src/vs/workbench/contrib/search/browser/media/exclude-settings-light.svg +++ b/src/vs/workbench/contrib/search/browser/media/exclude-settings-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/search/browser/media/remove-dark.svg b/src/vs/workbench/contrib/search/browser/media/remove-dark.svg index e0475f7b85a..6d16d212ae5 100644 --- a/src/vs/workbench/contrib/search/browser/media/remove-dark.svg +++ b/src/vs/workbench/contrib/search/browser/media/remove-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/search/browser/media/remove-hc.svg b/src/vs/workbench/contrib/search/browser/media/remove-hc.svg index 64618b61760..fa205f4ee12 100644 --- a/src/vs/workbench/contrib/search/browser/media/remove-hc.svg +++ b/src/vs/workbench/contrib/search/browser/media/remove-hc.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/search/browser/media/remove-light.svg b/src/vs/workbench/contrib/search/browser/media/remove-light.svg index 3bd44674699..742fcae4ae7 100644 --- a/src/vs/workbench/contrib/search/browser/media/remove-light.svg +++ b/src/vs/workbench/contrib/search/browser/media/remove-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/search/browser/media/replace-dark.svg b/src/vs/workbench/contrib/search/browser/media/replace-dark.svg index 195341a5a78..5882b22c589 100644 --- a/src/vs/workbench/contrib/search/browser/media/replace-dark.svg +++ b/src/vs/workbench/contrib/search/browser/media/replace-dark.svg @@ -1,6 +1,3 @@ - - - - + diff --git a/src/vs/workbench/contrib/search/browser/media/replace-hc.svg b/src/vs/workbench/contrib/search/browser/media/replace-hc.svg index 01cc453b092..1998016db59 100644 --- a/src/vs/workbench/contrib/search/browser/media/replace-hc.svg +++ b/src/vs/workbench/contrib/search/browser/media/replace-hc.svg @@ -1,6 +1,3 @@ - - - - + diff --git a/src/vs/workbench/contrib/search/browser/media/replace-light.svg b/src/vs/workbench/contrib/search/browser/media/replace-light.svg index 2e2cbd6fc6d..220f2aba40c 100644 --- a/src/vs/workbench/contrib/search/browser/media/replace-light.svg +++ b/src/vs/workbench/contrib/search/browser/media/replace-light.svg @@ -1,6 +1,3 @@ - - - - + diff --git a/src/vs/workbench/contrib/search/browser/media/stop-dark.svg b/src/vs/workbench/contrib/search/browser/media/stop-dark.svg index 14108226282..7e6319104da 100644 --- a/src/vs/workbench/contrib/search/browser/media/stop-dark.svg +++ b/src/vs/workbench/contrib/search/browser/media/stop-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/search/browser/media/stop-hc.svg b/src/vs/workbench/contrib/search/browser/media/stop-hc.svg index 52f3aa26ce2..a879a194c7a 100644 --- a/src/vs/workbench/contrib/search/browser/media/stop-hc.svg +++ b/src/vs/workbench/contrib/search/browser/media/stop-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/search/browser/media/stop-light.svg b/src/vs/workbench/contrib/search/browser/media/stop-light.svg index bb1c1a59200..10d05f5d8ab 100644 --- a/src/vs/workbench/contrib/search/browser/media/stop-light.svg +++ b/src/vs/workbench/contrib/search/browser/media/stop-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/search/browser/media/tree-collapsed-dark.svg b/src/vs/workbench/contrib/search/browser/media/tree-collapsed-dark.svg index 6cfda49f3b8..f518fc1632a 100644 --- a/src/vs/workbench/contrib/search/browser/media/tree-collapsed-dark.svg +++ b/src/vs/workbench/contrib/search/browser/media/tree-collapsed-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/search/browser/media/tree-collapsed-hc.svg b/src/vs/workbench/contrib/search/browser/media/tree-collapsed-hc.svg index 829e53760f2..40ba72b7086 100644 --- a/src/vs/workbench/contrib/search/browser/media/tree-collapsed-hc.svg +++ b/src/vs/workbench/contrib/search/browser/media/tree-collapsed-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/search/browser/media/tree-collapsed-light.svg b/src/vs/workbench/contrib/search/browser/media/tree-collapsed-light.svg index 2da1410a45e..0d746558a4f 100644 --- a/src/vs/workbench/contrib/search/browser/media/tree-collapsed-light.svg +++ b/src/vs/workbench/contrib/search/browser/media/tree-collapsed-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/search/browser/media/tree-expanded-dark.svg b/src/vs/workbench/contrib/search/browser/media/tree-expanded-dark.svg index 64e67427103..a1df6a8d44a 100644 --- a/src/vs/workbench/contrib/search/browser/media/tree-expanded-dark.svg +++ b/src/vs/workbench/contrib/search/browser/media/tree-expanded-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/search/browser/media/tree-expanded-hc.svg b/src/vs/workbench/contrib/search/browser/media/tree-expanded-hc.svg index a1085f2ad07..4f2ec146927 100644 --- a/src/vs/workbench/contrib/search/browser/media/tree-expanded-hc.svg +++ b/src/vs/workbench/contrib/search/browser/media/tree-expanded-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/search/browser/media/tree-expanded-light.svg b/src/vs/workbench/contrib/search/browser/media/tree-expanded-light.svg index 169ce8a356a..e60e357f573 100644 --- a/src/vs/workbench/contrib/search/browser/media/tree-expanded-light.svg +++ b/src/vs/workbench/contrib/search/browser/media/tree-expanded-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/tasks/common/media/configure-dark.svg b/src/vs/workbench/contrib/tasks/common/media/configure-dark.svg new file mode 100644 index 00000000000..4e4bc65c207 --- /dev/null +++ b/src/vs/workbench/contrib/tasks/common/media/configure-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/tasks/common/media/configure-inverse.svg b/src/vs/workbench/contrib/tasks/common/media/configure-inverse.svg deleted file mode 100644 index 61baaea2b8b..00000000000 --- a/src/vs/workbench/contrib/tasks/common/media/configure-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/tasks/common/media/configure-light.svg b/src/vs/workbench/contrib/tasks/common/media/configure-light.svg new file mode 100644 index 00000000000..fb7ffea770b --- /dev/null +++ b/src/vs/workbench/contrib/tasks/common/media/configure-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/tasks/common/media/configure.svg b/src/vs/workbench/contrib/tasks/common/media/configure.svg deleted file mode 100644 index 3dec2ba50fd..00000000000 --- a/src/vs/workbench/contrib/tasks/common/media/configure.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/tasks/common/media/task.contribution.css b/src/vs/workbench/contrib/tasks/common/media/task.contribution.css index e9d227427eb..74394a3c971 100644 --- a/src/vs/workbench/contrib/tasks/common/media/task.contribution.css +++ b/src/vs/workbench/contrib/tasks/common/media/task.contribution.css @@ -4,10 +4,10 @@ *--------------------------------------------------------------------------------------------*/ .monaco-workbench .quick-open-task-configure { - background-image: url('configure.svg'); + background-image: url('configure-light.svg'); } .vs-dark .monaco-workbench .quick-open-task-configure, .hc-black .monaco-workbench .quick-open-task-configure { - background-image: url('configure-inverse.svg'); + background-image: url('configure-dark.svg'); } diff --git a/src/vs/workbench/contrib/terminal/browser/media/configure-dark.svg b/src/vs/workbench/contrib/terminal/browser/media/configure-dark.svg index 4d1909627a7..a0ddc9b9fd1 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/configure-dark.svg +++ b/src/vs/workbench/contrib/terminal/browser/media/configure-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/terminal/browser/media/configure-hc.svg b/src/vs/workbench/contrib/terminal/browser/media/configure-hc.svg index cb206a1fb99..66e90b0f5f6 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/configure-hc.svg +++ b/src/vs/workbench/contrib/terminal/browser/media/configure-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/terminal/browser/media/configure-light.svg b/src/vs/workbench/contrib/terminal/browser/media/configure-light.svg index 727a34f26f3..fb7ffea770b 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/configure-light.svg +++ b/src/vs/workbench/contrib/terminal/browser/media/configure-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/terminal/browser/media/kill-dark.svg b/src/vs/workbench/contrib/terminal/browser/media/kill-dark.svg index 64a4999969e..9831c96a166 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/kill-dark.svg +++ b/src/vs/workbench/contrib/terminal/browser/media/kill-dark.svg @@ -1,8 +1,3 @@ - - - - - - + diff --git a/src/vs/workbench/contrib/terminal/browser/media/kill-hc.svg b/src/vs/workbench/contrib/terminal/browser/media/kill-hc.svg index bc448290732..656f3bd7a42 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/kill-hc.svg +++ b/src/vs/workbench/contrib/terminal/browser/media/kill-hc.svg @@ -1,8 +1,3 @@ - - - - - - + diff --git a/src/vs/workbench/contrib/terminal/browser/media/kill-light.svg b/src/vs/workbench/contrib/terminal/browser/media/kill-light.svg index 62204f0a110..d5ac851860b 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/kill-light.svg +++ b/src/vs/workbench/contrib/terminal/browser/media/kill-light.svg @@ -1,8 +1,3 @@ - - - - - - + diff --git a/src/vs/workbench/contrib/terminal/browser/media/split-editor-horizontal-dark.svg b/src/vs/workbench/contrib/terminal/browser/media/split-editor-horizontal-dark.svg index ac4121490eb..8c22a7c5bfe 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/split-editor-horizontal-dark.svg +++ b/src/vs/workbench/contrib/terminal/browser/media/split-editor-horizontal-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/terminal/browser/media/split-editor-horizontal-hc.svg b/src/vs/workbench/contrib/terminal/browser/media/split-editor-horizontal-hc.svg index c92025ddd92..82c19d0c8fc 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/split-editor-horizontal-hc.svg +++ b/src/vs/workbench/contrib/terminal/browser/media/split-editor-horizontal-hc.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/terminal/browser/media/split-editor-horizontal-light.svg b/src/vs/workbench/contrib/terminal/browser/media/split-editor-horizontal-light.svg index b7701615a9d..2d53ab6d3c2 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/split-editor-horizontal-light.svg +++ b/src/vs/workbench/contrib/terminal/browser/media/split-editor-horizontal-light.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/terminal/browser/media/split-editor-vertical-dark.svg b/src/vs/workbench/contrib/terminal/browser/media/split-editor-vertical-dark.svg index dfe68163a9e..419c21be4f6 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/split-editor-vertical-dark.svg +++ b/src/vs/workbench/contrib/terminal/browser/media/split-editor-vertical-dark.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/terminal/browser/media/split-editor-vertical-hc.svg b/src/vs/workbench/contrib/terminal/browser/media/split-editor-vertical-hc.svg index f407c08fa34..7565fd3c168 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/split-editor-vertical-hc.svg +++ b/src/vs/workbench/contrib/terminal/browser/media/split-editor-vertical-hc.svg @@ -1,4 +1,3 @@ - - + diff --git a/src/vs/workbench/contrib/terminal/browser/media/split-editor-vertical-light.svg b/src/vs/workbench/contrib/terminal/browser/media/split-editor-vertical-light.svg index e7eca812f95..7e95763b463 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/split-editor-vertical-light.svg +++ b/src/vs/workbench/contrib/terminal/browser/media/split-editor-vertical-light.svg @@ -1,4 +1,3 @@ - - + From ce414a8c45fe00a8d30878dbd607c0ac2b475e0d Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 26 Jun 2019 16:22:08 -0700 Subject: [PATCH 0693/1449] Implement terminal inheritEnv on remote Fixes microsoft/vscode-remote-release#823 --- .../api/node/extHostTerminalService.ts | 6 +- .../terminalInstanceService.ts | 76 +----------------- .../terminal/node/terminalEnvironment.ts | 79 +++++++++++++++++++ 3 files changed, 86 insertions(+), 75 deletions(-) create mode 100644 src/vs/workbench/contrib/terminal/node/terminalEnvironment.ts diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index fb3081ff495..781b3a35367 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -21,6 +21,7 @@ import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { ExtHostVariableResolverService } from 'vs/workbench/api/node/extHostDebugService'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; import { getSystemShell, detectAvailableShells } from 'vs/workbench/contrib/terminal/node/terminal'; +import { getMainProcessParentEnv } from 'vs/workbench/contrib/terminal/node/terminalEnvironment'; const RENDERER_NO_PROCESS_ID = -1; @@ -522,6 +523,7 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { const envFromConfig = this._apiInspectConfigToPlain(configProvider.getConfiguration('terminal.integrated').inspect(`env.${platformKey}`)); const workspaceFolders = await this._extHostWorkspace.getWorkspaceFolders2(); const variableResolver = workspaceFolders ? new ExtHostVariableResolverService(workspaceFolders, this._extHostDocumentsAndEditors, configProvider) : undefined; + const baseEnv = terminalConfig.get('inheritEnv', true) ? process.env as platform.IProcessEnvironment : await getMainProcessParentEnv(); const env = terminalEnvironment.createTerminalEnvironment( shellLaunchConfig, lastActiveWorkspace, @@ -530,9 +532,7 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { isWorkspaceShellAllowed, pkg.version, terminalConfig.get('setLocaleVariables', false), - // Always inherit the environment as we need to be running in a login shell, this may - // change when macOS servers are supported - process.env as platform.IProcessEnvironment + baseEnv ); // Fork the process and listen for messages diff --git a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts index d725545794d..94b5a713671 100644 --- a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts @@ -7,17 +7,16 @@ import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/ import { ITerminalInstance, IWindowsShellHelper, IShellLaunchConfig, ITerminalChildProcess, IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY } from 'vs/workbench/contrib/terminal/common/terminal'; import { WindowsShellHelper } from 'vs/workbench/contrib/terminal/node/windowsShellHelper'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IProcessEnvironment, isLinux, isMacintosh, isWindows, platform, Platform } from 'vs/base/common/platform'; +import { IProcessEnvironment, platform, Platform } from 'vs/base/common/platform'; import { TerminalProcess } from 'vs/workbench/contrib/terminal/node/terminalProcess'; import { getSystemShell } from 'vs/workbench/contrib/terminal/node/terminal'; import { Terminal as XTermTerminal } from 'xterm'; import { WebLinksAddon as XTermWebLinksAddon } from 'xterm-addon-web-links'; import { SearchAddon as XTermSearchAddon } from 'xterm-addon-search'; -import { readFile } from 'vs/base/node/pfs'; -import { basename } from 'vs/base/common/path'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { getDefaultShell, getDefaultShellArgs } from 'vs/workbench/contrib/terminal/common/terminalEnvironment'; import { StorageScope, IStorageService } from 'vs/platform/storage/common/storage'; +import { getMainProcessParentEnv } from 'vs/workbench/contrib/terminal/node/terminalEnvironment'; let Terminal: typeof XTermTerminal; let WebLinksAddon: typeof XTermWebLinksAddon; @@ -26,8 +25,6 @@ let SearchAddon: typeof XTermSearchAddon; export class TerminalInstanceService implements ITerminalInstanceService { public _serviceBrand: any; - private _mainProcessParentEnv: IProcessEnvironment | undefined; - constructor( @IInstantiationService private readonly _instantiationService: IInstantiationService, @IConfigurationService private readonly _configurationService: IConfigurationService, @@ -86,72 +83,7 @@ export class TerminalInstanceService implements ITerminalInstanceService { return Promise.resolve({ shell, args }); } - public async getMainProcessParentEnv(): Promise { - if (this._mainProcessParentEnv) { - return this._mainProcessParentEnv; - } - - // For Linux use /proc//status to get the parent of the main process and then fetch its - // env using /proc//environ. - if (isLinux) { - const mainProcessId = process.ppid; - const codeProcessName = basename(process.argv[0]); - let pid: number = 0; - let ppid: number = mainProcessId; - let name: string = codeProcessName; - do { - pid = ppid; - const status = await readFile(`/proc/${pid}/status`, 'utf8'); - const splitByLine = status.split('\n'); - splitByLine.forEach(line => { - if (line.indexOf('Name:') === 0) { - name = line.replace(/^Name:\s+/, ''); - } - if (line.indexOf('PPid:') === 0) { - ppid = parseInt(line.replace(/^PPid:\s+/, '')); - } - }); - } while (name === codeProcessName); - const rawEnv = await readFile(`/proc/${pid}/environ`, 'utf8'); - const env = {}; - rawEnv.split('\0').forEach(e => { - const i = e.indexOf('='); - env[e.substr(0, i)] = e.substr(i + 1); - }); - this._mainProcessParentEnv = env; - } - - // For macOS we want the "root" environment as shells by default run as login shells. It - // doesn't appear to be possible to get the "root" environment as `ps eww -o command` for - // PID 1 (the parent of the main process when launched from the dock/finder) returns no - // environment, because of this we will fill in the root environment using a whitelist of - // environment variables that we have. - if (isMacintosh) { - this._mainProcessParentEnv = {}; - // This list was generated by diffing launching a terminal with {} and the system - // terminal launched from finder. - const rootEnvVars = [ - 'SHELL', - 'SSH_AUTH_SOCK', - 'Apple_PubSub_Socket_Render', - 'XPC_FLAGS', - 'XPC_SERVICE_NAME', - 'HOME', - 'LOGNAME', - 'TMPDIR' - ]; - rootEnvVars.forEach(k => { - if (process.env[k]) { - this._mainProcessParentEnv![k] = process.env[k]!; - } - }); - } - - // TODO: Windows should return a fresh environment block, might need native code? - if (isWindows) { - this._mainProcessParentEnv = process.env as IProcessEnvironment; - } - - return this._mainProcessParentEnv!; + public getMainProcessParentEnv(): Promise { + return getMainProcessParentEnv(); } } \ No newline at end of file diff --git a/src/vs/workbench/contrib/terminal/node/terminalEnvironment.ts b/src/vs/workbench/contrib/terminal/node/terminalEnvironment.ts new file mode 100644 index 00000000000..1f8a127dbae --- /dev/null +++ b/src/vs/workbench/contrib/terminal/node/terminalEnvironment.ts @@ -0,0 +1,79 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IProcessEnvironment, isLinux, isMacintosh, isWindows } from 'vs/base/common/platform'; +import { readFile } from 'vs/base/node/pfs'; +import { basename } from 'vs/base/common/path'; + +let mainProcessParentEnv: IProcessEnvironment | undefined; + +export async function getMainProcessParentEnv(): Promise { + if (mainProcessParentEnv) { + return mainProcessParentEnv; + } + + // For Linux use /proc//status to get the parent of the main process and then fetch its + // env using /proc//environ. + if (isLinux) { + const mainProcessId = process.ppid; + const codeProcessName = basename(process.argv[0]); + let pid: number = 0; + let ppid: number = mainProcessId; + let name: string = codeProcessName; + do { + pid = ppid; + const status = await readFile(`/proc/${pid}/status`, 'utf8'); + const splitByLine = status.split('\n'); + splitByLine.forEach(line => { + if (line.indexOf('Name:') === 0) { + name = line.replace(/^Name:\s+/, ''); + } + if (line.indexOf('PPid:') === 0) { + ppid = parseInt(line.replace(/^PPid:\s+/, '')); + } + }); + } while (name === codeProcessName); + const rawEnv = await readFile(`/proc/${pid}/environ`, 'utf8'); + const env = {}; + rawEnv.split('\0').forEach(e => { + const i = e.indexOf('='); + env[e.substr(0, i)] = e.substr(i + 1); + }); + mainProcessParentEnv = env; + } + + // For macOS we want the "root" environment as shells by default run as login shells. It + // doesn't appear to be possible to get the "root" environment as `ps eww -o command` for + // PID 1 (the parent of the main process when launched from the dock/finder) returns no + // environment, because of this we will fill in the root environment using a whitelist of + // environment variables that we have. + if (isMacintosh) { + mainProcessParentEnv = {}; + // This list was generated by diffing launching a terminal with {} and the system + // terminal launched from finder. + const rootEnvVars = [ + 'SHELL', + 'SSH_AUTH_SOCK', + 'Apple_PubSub_Socket_Render', + 'XPC_FLAGS', + 'XPC_SERVICE_NAME', + 'HOME', + 'LOGNAME', + 'TMPDIR' + ]; + rootEnvVars.forEach(k => { + if (process.env[k]) { + mainProcessParentEnv![k] = process.env[k]!; + } + }); + } + + // TODO: Windows should return a fresh environment block, might need native code? + if (isWindows) { + mainProcessParentEnv = process.env as IProcessEnvironment; + } + + return mainProcessParentEnv!; +} \ No newline at end of file From 82db1016139aa3f64943eec884048d50a8f36d9d Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 26 Jun 2019 16:33:32 -0700 Subject: [PATCH 0694/1449] Fix CLI in remote when inheritEnv is false Fixes microsoft/vscode-remote-release#823 --- src/vs/workbench/api/node/extHostTerminalService.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 781b3a35367..38fa69dc551 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -488,6 +488,12 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { }; } + private async _getNonInheritedEnv(): Promise { + const env = await getMainProcessParentEnv(); + env.VSCODE_IPC_HOOK_CLI = process.env['VSCODE_IPC_HOOK_CLI']!; + return env; + } + public async $createProcess(id: number, shellLaunchConfigDto: ShellLaunchConfigDto, activeWorkspaceRootUriComponents: UriComponents, cols: number, rows: number, isWorkspaceShellAllowed: boolean): Promise { const shellLaunchConfig: IShellLaunchConfig = { name: shellLaunchConfigDto.name, @@ -523,7 +529,7 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { const envFromConfig = this._apiInspectConfigToPlain(configProvider.getConfiguration('terminal.integrated').inspect(`env.${platformKey}`)); const workspaceFolders = await this._extHostWorkspace.getWorkspaceFolders2(); const variableResolver = workspaceFolders ? new ExtHostVariableResolverService(workspaceFolders, this._extHostDocumentsAndEditors, configProvider) : undefined; - const baseEnv = terminalConfig.get('inheritEnv', true) ? process.env as platform.IProcessEnvironment : await getMainProcessParentEnv(); + const baseEnv = terminalConfig.get('inheritEnv', true) ? process.env as platform.IProcessEnvironment : await this._getNonInheritedEnv(); const env = terminalEnvironment.createTerminalEnvironment( shellLaunchConfig, lastActiveWorkspace, From 3e60627dcebe011d3a5a4f661b30cc4e50566218 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 26 Jun 2019 16:50:54 -0700 Subject: [PATCH 0695/1449] Use JSON with comments for .eslintrc(.json) Fixes #73483 --- extensions/json/package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/extensions/json/package.json b/extensions/json/package.json index 9c8b0f84a2a..1606f6a3d64 100644 --- a/extensions/json/package.json +++ b/extensions/json/package.json @@ -24,7 +24,6 @@ ".bowerrc", ".jshintrc", ".jscsrc", - ".eslintrc", ".swcrc", ".webmanifest", ".js.map", @@ -49,7 +48,9 @@ "extensions": [ ".hintrc", ".babelrc", - ".jsonc" + ".jsonc", + ".eslintrc", + ".eslintrc.json" ], "configuration": "./language-configuration.json" } From 2ea7497c3991b88d4a64d3bac882907a2375fde7 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 26 Jun 2019 17:04:19 -0700 Subject: [PATCH 0696/1449] Use readonly array for CodeActionContext Providers should never mutate this array --- src/vs/vscode.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index d99f3d12f56..175557c976c 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -2070,7 +2070,7 @@ declare module 'vscode' { /** * An array of diagnostics. */ - readonly diagnostics: Diagnostic[]; + readonly diagnostics: ReadonlyArray; /** * Requested kind of actions to return. From cc9286cb9087eac222649d46e9e8365491cfa9d6 Mon Sep 17 00:00:00 2001 From: SteVen Batten Date: Wed, 26 Jun 2019 17:19:20 -0700 Subject: [PATCH 0697/1449] tab menubar nav --- src/vs/base/browser/ui/menu/menu.ts | 2 +- src/vs/base/browser/ui/menu/menubar.ts | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/vs/base/browser/ui/menu/menu.ts b/src/vs/base/browser/ui/menu/menu.ts index 57268648e33..5589344958f 100644 --- a/src/vs/base/browser/ui/menu/menu.ts +++ b/src/vs/base/browser/ui/menu/menu.ts @@ -109,7 +109,7 @@ export class Menu extends ActionBar { // Stop tab navigation of menus if (event.equals(KeyCode.Tab)) { - EventHelper.stop(e, true); + e.preventDefault(); } }); diff --git a/src/vs/base/browser/ui/menu/menubar.ts b/src/vs/base/browser/ui/menu/menubar.ts index 0e69183da97..b9d8ff55262 100644 --- a/src/vs/base/browser/ui/menu/menubar.ts +++ b/src/vs/base/browser/ui/menu/menubar.ts @@ -14,11 +14,12 @@ import { cleanMnemonic, IMenuOptions, Menu, MENU_ESCAPED_MNEMONIC_REGEX, MENU_MN import { ActionRunner, IAction, IActionRunner } from 'vs/base/common/actions'; import { RunOnceScheduler } from 'vs/base/common/async'; import { Event, Emitter } from 'vs/base/common/event'; -import { KeyCode, ResolvedKeybinding } from 'vs/base/common/keyCodes'; +import { KeyCode, ResolvedKeybinding, KeyMod } from 'vs/base/common/keyCodes'; import { Disposable, dispose, IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { withNullAsUndefined } from 'vs/base/common/types'; import { asArray } from 'vs/base/common/arrays'; import { ScanCodeUtils, ScanCode } from 'vs/base/common/scanCode'; +import { isMacintosh } from 'vs/base/common/platform'; const $ = DOM.$; @@ -116,9 +117,9 @@ export class MenuBar extends Disposable { let eventHandled = true; const key = !!e.key ? e.key.toLocaleLowerCase() : ''; - if (event.equals(KeyCode.LeftArrow)) { + if (event.equals(KeyCode.LeftArrow) || (isMacintosh && event.equals(KeyCode.Tab | KeyMod.Shift))) { this.focusPrevious(); - } else if (event.equals(KeyCode.RightArrow)) { + } else if (event.equals(KeyCode.RightArrow) || event.equals(KeyCode.Tab)) { this.focusNext(); } else if (event.equals(KeyCode.Escape) && this.isFocused && !this.isOpen) { this.setUnfocusedState(); From 73f20ecd0aeb0ff407e1de65f42577bdae5af34d Mon Sep 17 00:00:00 2001 From: SteVen Batten Date: Wed, 26 Jun 2019 17:25:13 -0700 Subject: [PATCH 0698/1449] menubar tab fix --- src/vs/base/browser/ui/menu/menubar.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/vs/base/browser/ui/menu/menubar.ts b/src/vs/base/browser/ui/menu/menubar.ts index b9d8ff55262..1ffcb47b9a1 100644 --- a/src/vs/base/browser/ui/menu/menubar.ts +++ b/src/vs/base/browser/ui/menu/menubar.ts @@ -119,7 +119,7 @@ export class MenuBar extends Disposable { if (event.equals(KeyCode.LeftArrow) || (isMacintosh && event.equals(KeyCode.Tab | KeyMod.Shift))) { this.focusPrevious(); - } else if (event.equals(KeyCode.RightArrow) || event.equals(KeyCode.Tab)) { + } else if (event.equals(KeyCode.RightArrow) || (isMacintosh && event.equals(KeyCode.Tab))) { this.focusNext(); } else if (event.equals(KeyCode.Escape) && this.isFocused && !this.isOpen) { this.setUnfocusedState(); @@ -130,6 +130,11 @@ export class MenuBar extends Disposable { eventHandled = false; } + // Never allow default tab behavior + if (event.equals(KeyCode.Tab | KeyMod.Shift) || event.equals(KeyCode.Tab)) { + event.preventDefault(); + } + if (eventHandled) { event.preventDefault(); event.stopPropagation(); From 15393823820565f9fcdcf2f631fecbe72566ca83 Mon Sep 17 00:00:00 2001 From: SteVen Batten Date: Wed, 26 Jun 2019 17:33:08 -0700 Subject: [PATCH 0699/1449] allow space as trigger key --- src/vs/base/browser/ui/menu/menu.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/base/browser/ui/menu/menu.ts b/src/vs/base/browser/ui/menu/menu.ts index 5589344958f..7913bb42fd5 100644 --- a/src/vs/base/browser/ui/menu/menu.ts +++ b/src/vs/base/browser/ui/menu/menu.ts @@ -18,7 +18,7 @@ import { DomScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableEle import { ScrollbarVisibility, ScrollEvent } from 'vs/base/common/scrollable'; import { Event, Emitter } from 'vs/base/common/event'; import { AnchorAlignment } from 'vs/base/browser/ui/contextview/contextview'; -import { isLinux } from 'vs/base/common/platform'; +import { isLinux, isMacintosh } from 'vs/base/common/platform'; function createMenuMnemonicRegExp() { try { @@ -91,7 +91,7 @@ export class Menu extends ActionBar { context: options.context, actionRunner: options.actionRunner, ariaLabel: options.ariaLabel, - triggerKeys: { keys: [KeyCode.Enter], keyDown: true } + triggerKeys: { keys: [KeyCode.Enter, ...(isMacintosh ? [KeyCode.Space] : [])], keyDown: true } }); this.menuElement = menuElement; From b7265738444f1eee05762341b4361ee6452a4154 Mon Sep 17 00:00:00 2001 From: SteVen Batten Date: Wed, 26 Jun 2019 17:44:02 -0700 Subject: [PATCH 0700/1449] menubar alt key settings cleanup --- .../workbench/browser/parts/titlebar/menubarControl.ts | 10 ++++++---- src/vs/workbench/browser/workbench.contribution.ts | 8 ++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/browser/parts/titlebar/menubarControl.ts b/src/vs/workbench/browser/parts/titlebar/menubarControl.ts index 3c6b5806aaf..1e7c9049c09 100644 --- a/src/vs/workbench/browser/parts/titlebar/menubarControl.ts +++ b/src/vs/workbench/browser/parts/titlebar/menubarControl.ts @@ -42,7 +42,7 @@ export abstract class MenubarControl extends Disposable { protected keys = [ 'window.menuBarVisibility', 'window.enableMenuBarMnemonics', - 'window.disableCustomMenuBarAltFocus', + 'window.customMenuBarAltFocus', 'window.nativeTabs' ]; @@ -610,9 +610,11 @@ export class CustomMenubarControl extends MenubarControl { } private get currentDisableMenuBarAltFocus(): boolean { - let disableMenuBarAltBehavior = this.configurationService.getValue('window.disableCustomMenuBarAltFocus'); - if (typeof disableMenuBarAltBehavior !== 'boolean') { - disableMenuBarAltBehavior = false; + let settingValue = this.configurationService.getValue('window.customMenuBarAltFocus'); + + let disableMenuBarAltBehavior = false; + if (typeof settingValue === 'boolean') { + disableMenuBarAltBehavior = !settingValue; } return disableMenuBarAltBehavior; diff --git a/src/vs/workbench/browser/workbench.contribution.ts b/src/vs/workbench/browser/workbench.contribution.ts index e6851e575ba..e13b2539b22 100644 --- a/src/vs/workbench/browser/workbench.contribution.ts +++ b/src/vs/workbench/browser/workbench.contribution.ts @@ -291,14 +291,14 @@ import { isMacintosh, isWindows, isLinux, isWeb } from 'vs/base/common/platform' 'type': 'boolean', 'default': true, 'scope': ConfigurationScope.APPLICATION, - 'description': nls.localize('enableMenuBarMnemonics', "If enabled, the main menus can be opened via Alt-key shortcuts. Disabling mnemonics allows to bind these Alt-key shortcuts to editor commands instead."), + 'description': nls.localize('enableMenuBarMnemonics', "Controls whether the main menus can be opened via Alt-key shortcuts. Disabling mnemonics allows to bind these Alt-key shortcuts to editor commands instead."), 'included': isWindows || isLinux }, - 'window.disableCustomMenuBarAltFocus': { + 'window.customMenuBarAltFocus': { 'type': 'boolean', - 'default': false, + 'default': true, 'scope': ConfigurationScope.APPLICATION, - 'markdownDescription': nls.localize('disableCustomMenuBarAltFocus', "If enabled, disables the ability to focus the menu bar with the Alt-key when not set to toggle."), + 'markdownDescription': nls.localize('customMenuBarAltFocus', "Controls whether the menu bar will be focused by pressing the Alt-key. This setting has no effect on toggling the menu bar with the Alt-key."), 'included': isWindows || isLinux || isWeb }, 'window.openFoldersInNewWindow': { From 90d25d083557bbf2ce9c34e0def82a971cd58653 Mon Sep 17 00:00:00 2001 From: Raul Piraces Alastuey Date: Thu, 27 Jun 2019 10:26:55 +0200 Subject: [PATCH 0701/1449] Suppress MsgBox when Wizard is running in silent mode (#76215) * Suppress MsgBox when Wizard running in silent mode * Suppress MsgBox when Wizard running in silent mode --- build/win32/code.iss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/win32/code.iss b/build/win32/code.iss index ea31a50c9bf..831b31a3c71 100644 --- a/build/win32/code.iss +++ b/build/win32/code.iss @@ -1034,7 +1034,7 @@ begin AltArch := '32'; end; - if not Result then begin + if not Result and not WizardSilent() then begin MsgBox('Please uninstall the ' + AltArch + '-bit version of {#NameShort} before installing this ' + ThisArch + '-bit version.', mbInformation, MB_OK); end; end; From 687e5c147eda67ea6b5117fce5c9134b01114612 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 27 Jun 2019 11:04:19 +0200 Subject: [PATCH 0702/1449] fix #75880 --- .../services/textfile/common/textFileService.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/services/textfile/common/textFileService.ts b/src/vs/workbench/services/textfile/common/textFileService.ts index 83e8d940305..bb58fa2e153 100644 --- a/src/vs/workbench/services/textfile/common/textFileService.ts +++ b/src/vs/workbench/services/textfile/common/textFileService.ts @@ -856,14 +856,15 @@ export abstract class TextFileService extends Disposable implements ITextFileSer return false; } - // take over encoding, mode and model value from source model + // take over encoding, mode (only if more specific) and model value from source model targetModel.updatePreferredEncoding(sourceModel.getEncoding()); if (sourceModel.isResolved() && targetModel.isResolved()) { this.modelService.updateModel(targetModel.textEditorModel, createTextBufferFactoryFromSnapshot(sourceModel.createSnapshot())); - const mode = sourceModel.textEditorModel.getLanguageIdentifier(); - if (mode.language !== PLAINTEXT_MODE_ID) { - targetModel.textEditorModel.setMode(mode); // only use if more specific than plain/text + const sourceMode = sourceModel.textEditorModel.getLanguageIdentifier(); + const targetMode = targetModel.textEditorModel.getLanguageIdentifier(); + if (sourceMode.language !== PLAINTEXT_MODE_ID && targetMode.language === PLAINTEXT_MODE_ID) { + targetModel.textEditorModel.setMode(sourceMode); // only use if more specific than plain/text } } From 30379ab74b74f76b94c28872cac3a9b1a38ff82e Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Thu, 27 Jun 2019 11:19:34 +0200 Subject: [PATCH 0703/1449] Tasks should support string terminal args The termianl setting allows this, so tasks needs to handle it Fixes #75946 --- src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts index b9739fc6809..c6e1d3fbaa7 100644 --- a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts @@ -787,7 +787,7 @@ export class TerminalTaskSystem implements ITaskSystem { shellLaunchConfig.args = []; } } - let shellArgs = shellLaunchConfig.args!.slice(0); + let shellArgs = Array.isArray(shellLaunchConfig.args!) ? shellLaunchConfig.args!.slice(0) : [shellLaunchConfig.args!]; let toAdd: string[] = []; let commandLine = this.buildShellCommandLine(platform, shellLaunchConfig.executable!, shellOptions, command, originalCommand, args); let windowsShellArgs: boolean = false; From 84bfa215661bc7391171750b5f9c16b1fec7c9e8 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 27 Jun 2019 11:50:12 +0200 Subject: [PATCH 0704/1449] fix #75909 --- .../workbench/browser/parts/statusbar/statusbarPart.ts | 7 +++---- test/smoke/src/areas/statusbar/statusbar.ts | 10 +++++----- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts index ab4e44c096d..3f68e839a54 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts @@ -603,7 +603,6 @@ export class StatusbarPart extends Part implements IStatusbarService { private doCreateStatusItem(id: string, name: string, alignment: StatusbarAlignment, priority: number = 0, ...extraClasses: string[]): HTMLElement { const itemContainer = document.createElement('div'); - itemContainer.title = name; itemContainer.id = id; addClass(itemContainer, 'statusbar-item'); @@ -683,12 +682,12 @@ class StatusbarEntryItem extends Disposable { } } - // Update: Tooltip + // Update: Tooltip (on the container, because label can be disabled) if (!this.entry || entry.tooltip !== this.entry.tooltip) { if (entry.tooltip) { - this.labelContainer.title = entry.tooltip; + this.container.title = entry.tooltip; } else { - delete this.labelContainer.title; + delete this.container.title; } } diff --git a/test/smoke/src/areas/statusbar/statusbar.ts b/test/smoke/src/areas/statusbar/statusbar.ts index c9bfa19bc5c..a93976396c2 100644 --- a/test/smoke/src/areas/statusbar/statusbar.ts +++ b/test/smoke/src/areas/statusbar/statusbar.ts @@ -50,15 +50,15 @@ export class StatusBar { case StatusBarElement.PROBLEMS_STATUS: return `${this.mainSelector} ${this.leftSelector} .octicon.octicon-error`; case StatusBarElement.SELECTION_STATUS: - return `${this.mainSelector} ${this.rightSelector} a[title="Go to Line"]`; + return `${this.mainSelector} ${this.rightSelector}[title="Go to Line"]`; case StatusBarElement.INDENTATION_STATUS: - return `${this.mainSelector} ${this.rightSelector} a[title="Select Indentation"]`; + return `${this.mainSelector} ${this.rightSelector}[title="Select Indentation"]`; case StatusBarElement.ENCODING_STATUS: - return `${this.mainSelector} ${this.rightSelector} a[title="Select Encoding"]`; + return `${this.mainSelector} ${this.rightSelector}[title="Select Encoding"]`; case StatusBarElement.EOL_STATUS: - return `${this.mainSelector} ${this.rightSelector} a[title="Select End of Line Sequence"]`; + return `${this.mainSelector} ${this.rightSelector}[title="Select End of Line Sequence"]`; case StatusBarElement.LANGUAGE_STATUS: - return `${this.mainSelector} ${this.rightSelector} a[title="Select Language Mode"]`; + return `${this.mainSelector} ${this.rightSelector}[title="Select Language Mode"]`; case StatusBarElement.FEEDBACK_ICON: return `${this.mainSelector} ${this.rightSelector} .monaco-dropdown.send-feedback`; default: From 6ca986fb8ba57af11745af7edae7a32a6f78a2e2 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 27 Jun 2019 11:51:57 +0200 Subject: [PATCH 0705/1449] Fix microsoft/vscode-remote-release/issues/431 --- .../services/extensions/electron-browser/extensionService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts index 39eff375160..7c19b44f67a 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts @@ -340,7 +340,7 @@ export class ExtensionService extends AbstractExtensionService implements IExten let extensions: Promise; if (isInitialStart) { autoStart = false; - extensions = this._extensionScanner.scannedExtensions; + extensions = this._extensionScanner.scannedExtensions.then(extensions => extensions.filter(extension => this._isEnabled(extension))); // remove disabled extensions } else { // restart case autoStart = true; From b43174e1b275850f5b80d170e47c1c04eb780790 Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Thu, 27 Jun 2019 12:02:21 +0200 Subject: [PATCH 0706/1449] properly pass env vars to new VS Code instance; fixes #76212 --- src/vs/platform/windows/common/windows.ts | 2 +- .../windows/electron-browser/windowsService.ts | 5 +++-- .../platform/windows/electron-main/windowsService.ts | 7 ++++--- src/vs/platform/windows/node/windowsIpc.ts | 2 +- src/vs/workbench/browser/web.simpleservices.ts | 3 ++- .../contrib/debug/browser/rawDebugSession.ts | 11 ++++++++++- src/vs/workbench/test/workbenchTestServices.ts | 4 ++-- 7 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index 9075b9e7416..19abdf93184 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -153,7 +153,7 @@ export interface IWindowsService { // Global methods openWindow(windowId: number, uris: IURIToOpen[], options: IOpenSettings): Promise; openNewWindow(options?: INewWindowOptions): Promise; - openExtensionDevelopmentHostWindow(args: ParsedArgs): Promise; + openExtensionDevelopmentHostWindow(args: ParsedArgs, env: IProcessEnvironment): Promise; getWindows(): Promise<{ id: number; workspace?: IWorkspaceIdentifier; folderUri?: ISingleFolderWorkspaceIdentifier; title: string; filename?: string; }[]>; getWindowCount(): Promise; log(severity: string, ...messages: string[]): Promise; diff --git a/src/vs/platform/windows/electron-browser/windowsService.ts b/src/vs/platform/windows/electron-browser/windowsService.ts index 1eb8c60b8ee..34ec58fc49a 100644 --- a/src/vs/platform/windows/electron-browser/windowsService.ts +++ b/src/vs/platform/windows/electron-browser/windowsService.ts @@ -12,6 +12,7 @@ import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; import { URI } from 'vs/base/common/uri'; import { ParsedArgs } from 'vs/platform/environment/common/environment'; import { IMainProcessService } from 'vs/platform/ipc/electron-browser/mainProcessService'; +import { IProcessEnvironment } from 'vs/base/common/platform'; export class WindowsService implements IWindowsService { @@ -195,8 +196,8 @@ export class WindowsService implements IWindowsService { return this.channel.call('openNewWindow', options); } - openExtensionDevelopmentHostWindow(args: ParsedArgs): Promise { - return this.channel.call('openExtensionDevelopmentHostWindow', args); + openExtensionDevelopmentHostWindow(args: ParsedArgs, env: IProcessEnvironment): Promise { + return this.channel.call('openExtensionDevelopmentHostWindow', [args, env]); } async getWindows(): Promise<{ id: number; workspace?: IWorkspaceIdentifier; folderUri?: ISingleFolderWorkspaceIdentifier; title: string; filename?: string; }[]> { diff --git a/src/vs/platform/windows/electron-main/windowsService.ts b/src/vs/platform/windows/electron-main/windowsService.ts index 1c3c4734384..da1b56c7ee9 100644 --- a/src/vs/platform/windows/electron-main/windowsService.ts +++ b/src/vs/platform/windows/electron-main/windowsService.ts @@ -21,7 +21,7 @@ import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier } from 'vs/platf import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; import { Schemas } from 'vs/base/common/network'; import { mnemonicButtonLabel } from 'vs/base/common/labels'; -import { isMacintosh, isLinux } from 'vs/base/common/platform'; +import { isMacintosh, isLinux, IProcessEnvironment } from 'vs/base/common/platform'; import { ILogService } from 'vs/platform/log/common/log'; import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; @@ -306,13 +306,14 @@ export class WindowsService extends Disposable implements IWindowsService, IURLH this.windowsMainService.openNewWindow(OpenContext.API, options); } - async openExtensionDevelopmentHostWindow(args: ParsedArgs): Promise { + async openExtensionDevelopmentHostWindow(args: ParsedArgs, env: IProcessEnvironment): Promise { this.logService.trace('windowsService#openExtensionDevelopmentHostWindow ' + JSON.stringify(args)); if (args.extensionDevelopmentPath) { this.windowsMainService.openExtensionDevelopmentHostWindow(args.extensionDevelopmentPath, { context: OpenContext.API, - cli: args + cli: args, + userEnv: Object.keys(env).length > 0 ? env : undefined }); } } diff --git a/src/vs/platform/windows/node/windowsIpc.ts b/src/vs/platform/windows/node/windowsIpc.ts index 30876b55e10..6fbad27a549 100644 --- a/src/vs/platform/windows/node/windowsIpc.ts +++ b/src/vs/platform/windows/node/windowsIpc.ts @@ -102,7 +102,7 @@ export class WindowsChannel implements IServerChannel { return this.service.openWindow(arg[0], urisToOpen, options); } case 'openNewWindow': return this.service.openNewWindow(arg); - case 'openExtensionDevelopmentHostWindow': return this.service.openExtensionDevelopmentHostWindow(arg); + case 'openExtensionDevelopmentHostWindow': return this.service.openExtensionDevelopmentHostWindow(arg[0], arg[1]); case 'getWindows': return this.service.getWindows(); case 'getWindowCount': return this.service.getWindowCount(); case 'relaunch': return this.service.relaunch(arg[0]); diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index 6df0b784daf..b253e573ae5 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -52,6 +52,7 @@ import { IFileService } from 'vs/platform/files/common/files'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ParsedArgs } from 'vs/platform/environment/common/environment'; import { ClassifiedEvent, StrictPropertyCheck, GDPRClassification } from 'vs/platform/telemetry/common/gdprTypings'; +import { IProcessEnvironment } from 'vs/base/common/platform'; //#region Backup File @@ -1119,7 +1120,7 @@ export class SimpleWindowsService implements IWindowsService { return Promise.resolve(); } - openExtensionDevelopmentHostWindow(args: ParsedArgs): Promise { + openExtensionDevelopmentHostWindow(args: ParsedArgs, env: IProcessEnvironment): Promise { return Promise.resolve(); } diff --git a/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts b/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts index b4828af8340..1fdbad5a8f9 100644 --- a/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts +++ b/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts @@ -16,6 +16,7 @@ import { ISignService } from 'vs/platform/sign/common/sign'; import { ParsedArgs } from 'vs/platform/environment/common/environment'; import { IWindowsService } from 'vs/platform/windows/common/windows'; import { URI } from 'vs/base/common/uri'; +import { IProcessEnvironment } from 'vs/base/common/platform'; /** * This interface represents a single command line argument split into a "prefix" and a "path" half. @@ -606,7 +607,15 @@ export class RawDebugSession { } } - return this.windowsService.openExtensionDevelopmentHostWindow(args); + let env: IProcessEnvironment = {}; + if (vscodeArgs.env) { + // merge environment variables into a copy of the process.env + env = objects.mixin(objects.mixin(env, process.env), vscodeArgs.env); + // and delete some if necessary + Object.keys(env).filter(k => env[k] === null).forEach(key => delete env[key]); + } + + return this.windowsService.openExtensionDevelopmentHostWindow(args, env); } private send(command: string, args: any, timeout?: number): Promise { diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index 01b3c98401c..45bf09e967a 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -71,7 +71,7 @@ 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 } from 'vs/platform/storage/common/storage'; -import { isLinux, isMacintosh } from 'vs/base/common/platform'; +import { isLinux, isMacintosh, IProcessEnvironment } 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'; @@ -1447,7 +1447,7 @@ export class TestWindowsService implements IWindowsService { return Promise.resolve(); } - openExtensionDevelopmentHostWindow(args: ParsedArgs): Promise { + openExtensionDevelopmentHostWindow(args: ParsedArgs, env: IProcessEnvironment): Promise { return Promise.resolve(); } From 01e7c59b1dd038721189dff345212dd0348b9248 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Thu, 27 Jun 2019 12:30:25 +0200 Subject: [PATCH 0707/1449] Force drive letter to lowercase in tsc tasks Fixes #75084 --- extensions/typescript-language-features/src/features/task.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/extensions/typescript-language-features/src/features/task.ts b/extensions/typescript-language-features/src/features/task.ts index e366748f725..ae530bcdffe 100644 --- a/extensions/typescript-language-features/src/features/task.ts +++ b/extensions/typescript-language-features/src/features/task.ts @@ -234,8 +234,10 @@ class TscTaskProvider implements vscode.TaskProvider { private getLabelForTasks(project: TSConfig): string { if (project.workspaceFolder) { - return path.posix.relative(path.posix.normalize(project.workspaceFolder.uri.path), path.posix.normalize(project.posixPath)); + const workspaceNormalizedUri = vscode.Uri.file(path.normalize(project.workspaceFolder.uri.fsPath)); // Make sure the drive letter is lowercase + return path.posix.relative(workspaceNormalizedUri.path, project.posixPath); } + return project.posixPath; } From 74b97db2d687010767774cb4bc81f644e9d34b4d Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 27 Jun 2019 12:37:11 +0200 Subject: [PATCH 0708/1449] bump distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5913bb88e2c..40df6b9c7e3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "91a142dcfffea6350fc4b171ee60e14218fb20fd", + "distro": "9aec77cf75b06838d2b9cdc5c4ac981aa72e401b", "author": { "name": "Microsoft Corporation" }, From 425c7d08ddd9a8eb62bc6e0d068544fa64f9d7b7 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 27 Jun 2019 13:05:42 +0200 Subject: [PATCH 0709/1449] bump distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 40df6b9c7e3..addeb5e6aed 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "9aec77cf75b06838d2b9cdc5c4ac981aa72e401b", + "distro": "655dbee333798c5253b03bf8ef1bc8f4fbd3e48b", "author": { "name": "Microsoft Corporation" }, From 1bdbb8f95bce3fc553e5e0c010e531adcea8f340 Mon Sep 17 00:00:00 2001 From: Logan Ramos Date: Thu, 27 Jun 2019 05:40:05 -0700 Subject: [PATCH 0710/1449] Improvements to Telemetry Extractor Build (#76196) * Allow the error to be surfaced to the user to provide more information about what is happening * Testing gulp src * Move json to app root * Telemetry tooling commit update * Harcode telemetry commit * Update distro to match master * statSync try catch * build :lipstick: * fix build * make build fail * fix build * fix build * whitespace --- .../darwin/product-build-darwin.yml | 16 ++--- .../linux/product-build-linux.yml | 16 ++--- .../win32/product-build-win32.yml | 17 +++--- build/gulpfile.vscode.js | 5 +- src/vs/platform/environment/node/argv.ts | 61 ++++++++++--------- 5 files changed, 59 insertions(+), 56 deletions(-) diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index 5cb5d7243d2..bcd5bfa57ba 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -61,17 +61,17 @@ steps: - script: | set -e - cd .. + cd $BUILD_STAGINGDIRECTORY git clone https://github.com/microsoft/vscode-telemetry-extractor.git cd vscode-telemetry-extractor - npm install - ./node_modules/typescript/bin/tsc + git checkout 3b04aba5bfdfcca1a5426cd2c51a90d18740d0bc + npm i npm run setup-extension-repos - node ./out/cli-extract.js --sourceDir ../s --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents - node ./out/cli-extract-extensions.js --sourceDir ./src/telemetry-sources/ --outputDir . --applyEndpoints --includeIsMeasurement - mv declarations-resolved.json ../s/src/telemetry-core.json - mv declarations-extensions-resolved.json ../s/src/telemetry-extensions.json - echo 'Moved Files' + node ./out/cli-extract.js --sourceDir $BUILD_SOURCESDIRECTORY --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents + node ./out/cli-extract-extensions.js --sourceDir ./src/telemetry-sources --outputDir . --applyEndpoints --includeIsMeasurement + mkdir -p $BUILD_SOURCESDIRECTORY/.build/telemetry + mv declarations-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-core.json + mv declarations-extensions-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-extensions.json displayName: Extract Telemetry - script: | diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index a93dd8edd0d..bdd1064a8c9 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -62,17 +62,17 @@ steps: - script: | set -e - cd .. + cd $BUILD_STAGINGDIRECTORY git clone https://github.com/microsoft/vscode-telemetry-extractor.git cd vscode-telemetry-extractor - npm install - ./node_modules/typescript/bin/tsc + git checkout 3b04aba5bfdfcca1a5426cd2c51a90d18740d0bc + npm i npm run setup-extension-repos - node ./out/cli-extract.js --sourceDir ../s --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents - node ./out/cli-extract-extensions.js --sourceDir ./src/telemetry-sources/ --outputDir . --applyEndpoints --includeIsMeasurement - mv declarations-resolved.json ../s/src/telemetry-core.json - mv declarations-extensions-resolved.json ../s/src/telemetry-extensions.json - echo 'Moved Files' + node ./out/cli-extract.js --sourceDir $BUILD_SOURCESDIRECTORY --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents + node ./out/cli-extract-extensions.js --sourceDir ./src/telemetry-sources --outputDir . --applyEndpoints --includeIsMeasurement + mkdir -p $BUILD_SOURCESDIRECTORY/.build/telemetry + mv declarations-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-core.json + mv declarations-extensions-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-extensions.json displayName: Extract Telemetry - script: | diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 06c6342b81e..09a0f7af93b 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -68,18 +68,17 @@ steps: - powershell: | . build/azure-pipelines/win32/exec.ps1 $ErrorActionPreference = "Stop" - cd .. + cd $env:BUILD_STAGINGDIRECTORY git clone https://github.com/microsoft/vscode-telemetry-extractor.git cd vscode-telemetry-extractor - npm install - npm install -g typescript - tsc + git checkout 3b04aba5bfdfcca1a5426cd2c51a90d18740d0bc + npm i npm run setup-extension-repos - node ./out/cli-extract.js --sourceDir ../s --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents - node ./out/cli-extract-extensions.js --sourceDir ./src/telemetry-sources/ --outputDir . --applyEndpoints --includeIsMeasurement - mv declarations-resolved.json ../s/src/telemetry-core.json - mv declarations-extensions-resolved.json ../s/src/telemetry-extensions.json - echo 'Moved Files' + node .\out\cli-extract.js --sourceDir $env:BUILD_SOURCESDIRECTORY --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents + node .\out\cli-extract-extensions.js --sourceDir .\src\telemetry-sources --outputDir . --applyEndpoints --includeIsMeasurement + mkdir $env:BUILD_SOURCESDIRECTORY\.build\telemetry -ea 0 + mv declarations-resolved.json $env:BUILD_SOURCESDIRECTORY\.build\telemetry\telemetry-core.json + mv declarations-extensions-resolved.json $env:BUILD_SOURCESDIRECTORY\.build\telemetry\telemetry-extensions.json displayName: Extract Telemetry - powershell: | diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 4fc0a7ff414..0ae1a1c71f2 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -62,8 +62,6 @@ const vscodeResources = [ 'out-build/bootstrap-amd.js', 'out-build/bootstrap-window.js', 'out-build/paths.js', - 'out-build/telemetry-core.json', - 'out-build/telemetry-extensions.json', 'out-build/vs/**/*.{svg,png,cur,html}', '!out-build/vs/code/browser/**/*.html', 'out-build/vs/base/common/performance.js', @@ -317,6 +315,8 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op // TODO the API should be copied to `out` during compile, not here const api = gulp.src('src/vs/vscode.d.ts').pipe(rename('out/vs/vscode.d.ts')); + const telemetry = gulp.src('.build/telemetry/**', { base: '.build/telemetry', dot: true }); + const depsSrc = [ ..._.flatten(productionDependencies.map(d => path.relative(root, d.path)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`])), // @ts-ignore JSON checking: dependencies is optional @@ -333,6 +333,7 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op productJsonStream, license, api, + telemetry, sources, deps ); diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts index a8715ddccae..18cbe48940d 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts @@ -220,35 +220,38 @@ export function buildVersionMessage(version: string | undefined, commit: string } export function buildTelemetryMessage(appRoot: string, extensionsPath: string): string { - try { - // Gets all the directories inside the extension directory - const dirs = readdirSync(extensionsPath).filter(files => statSync(join(extensionsPath, files)).isDirectory()); - const telemetryJsonFolders: string[] = []; - dirs.forEach((dir) => { - const files = readdirSync(join(extensionsPath, dir)).filter(file => file === 'telemetry.json'); - // We know it contains a telemetry.json file so we add it to the list of folders which have one - if (files.length === 1) { - telemetryJsonFolders.push(dir); - } - }); - const mergedTelemetry = Object.create(null); - // Simple function to merge the telemetry into one json object - const mergeTelemetry = (contents: string, dirName: string) => { - const telemetryData = JSON.parse(contents); - mergedTelemetry[dirName] = telemetryData; - }; - telemetryJsonFolders.forEach((folder) => { - const contents = readFileSync(join(extensionsPath, folder, 'telemetry.json')).toString(); - mergeTelemetry(contents, folder); - }); - let contents = readFileSync(join(appRoot, 'out/', 'telemetry-core.json')).toString(); - mergeTelemetry(contents, 'vscode-core'); - contents = readFileSync(join(appRoot, 'out/', 'telemetry-extensions.json')).toString(); - mergeTelemetry(contents, 'vscode-extensions'); - return JSON.stringify(mergedTelemetry, null, 4); - } catch (err) { - return 'Unable to read VS Code telemetry events!'; - } + // Gets all the directories inside the extension directory + const dirs = readdirSync(extensionsPath).filter(files => { + // This handles case where broken symbolic links can cause statSync to throw and error + try { + return statSync(join(extensionsPath, files)).isDirectory(); + } catch { + return false; + } + }); + const telemetryJsonFolders: string[] = []; + dirs.forEach((dir) => { + const files = readdirSync(join(extensionsPath, dir)).filter(file => file === 'telemetry.json'); + // We know it contains a telemetry.json file so we add it to the list of folders which have one + if (files.length === 1) { + telemetryJsonFolders.push(dir); + } + }); + const mergedTelemetry = Object.create(null); + // Simple function to merge the telemetry into one json object + const mergeTelemetry = (contents: string, dirName: string) => { + const telemetryData = JSON.parse(contents); + mergedTelemetry[dirName] = telemetryData; + }; + telemetryJsonFolders.forEach((folder) => { + const contents = readFileSync(join(extensionsPath, folder, 'telemetry.json')).toString(); + mergeTelemetry(contents, folder); + }); + let contents = readFileSync(join(appRoot, 'telemetry-core.json')).toString(); + mergeTelemetry(contents, 'vscode-core'); + contents = readFileSync(join(appRoot, 'telemetry-extensions.json')).toString(); + mergeTelemetry(contents, 'vscode-extensions'); + return JSON.stringify(mergedTelemetry, null, 4); } /** From 8af4026e7d675e317ebe4acc8e820f84d4fa2f23 Mon Sep 17 00:00:00 2001 From: jeanp413 Date: Thu, 27 Jun 2019 07:45:51 -0500 Subject: [PATCH 0711/1449] Fix #76214 --- .../contrib/extensions/electron-browser/extensionEditor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts index 86949eb39a1..c30e01a7d91 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts @@ -1115,7 +1115,7 @@ class ShowExtensionEditorFindCommand extends Command { } const showCommand = new ShowExtensionEditorFindCommand({ id: 'editor.action.extensioneditor.showfind', - precondition: ContextKeyExpr.equals('activeEditor', ExtensionEditor.ID), + precondition: ContextKeyExpr.and(ContextKeyExpr.equals('activeEditor', ExtensionEditor.ID), ContextKeyExpr.not('editorFocus')), kbOpts: { primary: KeyMod.CtrlCmd | KeyCode.KEY_F, weight: KeybindingWeight.EditorContrib From 7c87705cc29ccaecee73ae454dc7795ab5dcb2c9 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 27 Jun 2019 15:07:45 +0200 Subject: [PATCH 0712/1449] update web api --- src/vs/workbench/workbench.web.api.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/workbench.web.api.ts b/src/vs/workbench/workbench.web.api.ts index 1fda1a6beca..af41878783d 100644 --- a/src/vs/workbench/workbench.web.api.ts +++ b/src/vs/workbench/workbench.web.api.ts @@ -7,7 +7,6 @@ import 'vs/workbench/workbench.web.main'; import { main } from 'vs/workbench/browser/web.main'; import { UriComponents } from 'vs/base/common/uri'; import { Event } from 'vs/base/common/event'; -import { VSBuffer } from 'vs/base/common/buffer'; export interface IWorkbenchConstructionOptions { @@ -40,12 +39,11 @@ export interface IWorkbenchConstructionOptions { userDataProvider?: { readonly onDidChangeFile: Event; - readFile(path: string): Promise; - readDirectory(path: string): Promise; + readFile(path: string): Promise; + writeFile(path: string, content: Uint8Array): Promise; + deleteFile(path: string): Promise; - writeFile(path: string, content: VSBuffer): Promise; - - delete(path: string): Promise; + listFiles(path: string): Promise; }; } From b1dd5ab40e08315fcc8f58310556479738a5e7b2 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 27 Jun 2019 15:31:33 +0200 Subject: [PATCH 0713/1449] fix #76242 --- src/vs/editor/contrib/documentSymbols/outlineTree.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/contrib/documentSymbols/outlineTree.ts b/src/vs/editor/contrib/documentSymbols/outlineTree.ts index 2ac8baff8b5..551ff4b4726 100644 --- a/src/vs/editor/contrib/documentSymbols/outlineTree.ts +++ b/src/vs/editor/contrib/documentSymbols/outlineTree.ts @@ -21,6 +21,7 @@ import { OutlineConfigKeys } from 'vs/editor/contrib/documentSymbols/outline'; import { MarkerSeverity } from 'vs/platform/markers/common/markers'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { listErrorForeground, listWarningForeground } from 'vs/platform/theme/common/colorRegistry'; +import { IdleValue } from 'vs/base/common/async'; export type OutlineItem = OutlineGroup | OutlineElement; @@ -208,6 +209,8 @@ export const enum OutlineSortOrder { export class OutlineItemComparator implements ITreeSorter { + private readonly _collator = new IdleValue(() => new Intl.Collator(undefined, { numeric: true })); + constructor( public type: OutlineSortOrder = OutlineSortOrder.ByPosition ) { } @@ -218,11 +221,11 @@ export class OutlineItemComparator implements ITreeSorter { } else if (a instanceof OutlineElement && b instanceof OutlineElement) { if (this.type === OutlineSortOrder.ByKind) { - return a.symbol.kind - b.symbol.kind || a.symbol.name.localeCompare(b.symbol.name, undefined, { numeric: true }); + return a.symbol.kind - b.symbol.kind || this._collator.getValue().compare(a.symbol.name, b.symbol.name); } else if (this.type === OutlineSortOrder.ByName) { - return a.symbol.name.localeCompare(b.symbol.name, undefined, { numeric: true }) || Range.compareRangesUsingStarts(a.symbol.range, b.symbol.range); + return this._collator.getValue().compare(a.symbol.name, b.symbol.name) || Range.compareRangesUsingStarts(a.symbol.range, b.symbol.range); } else if (this.type === OutlineSortOrder.ByPosition) { - return Range.compareRangesUsingStarts(a.symbol.range, b.symbol.range) || a.symbol.name.localeCompare(b.symbol.name, undefined, { numeric: true }); + return Range.compareRangesUsingStarts(a.symbol.range, b.symbol.range) || this._collator.getValue().compare(a.symbol.name, b.symbol.name); } } return 0; From 467c80566f3f8b36dbc04d2b8f3dfe7c2ec48180 Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 27 Jun 2019 16:19:38 +0200 Subject: [PATCH 0714/1449] fixes #76228 --- .../contrib/files/browser/fileActions.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/vs/workbench/contrib/files/browser/fileActions.ts b/src/vs/workbench/contrib/files/browser/fileActions.ts index 46a01a9e86e..f73012495b7 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.ts @@ -85,10 +85,15 @@ export class NewFileAction extends Action { static readonly LABEL = nls.localize('createNewFile', "New File"); constructor( + @IExplorerService explorerService: IExplorerService, @ICommandService private commandService: ICommandService ) { super('explorer.newFile', NEW_FILE_LABEL); this.class = 'explorer-action new-file'; + this._register(explorerService.onDidChangeEditable(e => { + const elementIsBeingEdited = explorerService.isEditable(e); + this.enabled = !elementIsBeingEdited; + })); } run(): Promise { @@ -102,10 +107,15 @@ export class NewFolderAction extends Action { static readonly LABEL = nls.localize('createNewFolder', "New Folder"); constructor( + @IExplorerService explorerService: IExplorerService, @ICommandService private commandService: ICommandService ) { super('explorer.newFolder', NEW_FOLDER_LABEL); this.class = 'explorer-action new-folder'; + this._register(explorerService.onDidChangeEditable(e => { + const elementIsBeingEdited = explorerService.isEditable(e); + this.enabled = !elementIsBeingEdited; + })); } run(): Promise { @@ -599,6 +609,10 @@ export class CollapseExplorerView extends Action { @IExplorerService readonly explorerService: IExplorerService ) { super(id, label, 'explorer-action collapse-explorer'); + this._register(explorerService.onDidChangeEditable(e => { + const elementIsBeingEdited = explorerService.isEditable(e); + this.enabled = !elementIsBeingEdited; + })); } run(): Promise { @@ -623,6 +637,10 @@ export class RefreshExplorerView extends Action { @IExplorerService private readonly explorerService: IExplorerService ) { super(id, label, 'explorer-action refresh-explorer'); + this._register(explorerService.onDidChangeEditable(e => { + const elementIsBeingEdited = explorerService.isEditable(e); + this.enabled = !elementIsBeingEdited; + })); } public run(): Promise { From e8016097b8d9cf7e34363eb5fee6ca0dd565f1ce Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 27 Jun 2019 16:37:33 +0200 Subject: [PATCH 0715/1449] fix build --- build/gulpfile.vscode.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 0ae1a1c71f2..0673fdb0306 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -383,7 +383,7 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op .pipe(util.skipDirectories()) .pipe(util.fixWin32DirectoryPermissions()) .pipe(electron(_.extend({}, config, { platform, arch, ffmpegChromium: true }))) - .pipe(filter(['**', '!LICENSE', '!LICENSES.chromium.html', '!version'])); + .pipe(filter(['**', '!LICENSE', '!LICENSES.chromium.html', '!version'], { dot: true })); // result = es.merge(result, gulp.src('resources/completions/**', { base: '.' })); From 795a97874c4ae5b10234cc731c34846d24e87f47 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 27 Jun 2019 08:33:25 -0700 Subject: [PATCH 0716/1449] Detect cygwin shell on Windows Fixes #75945 --- src/vs/workbench/contrib/terminal/node/terminal.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/workbench/contrib/terminal/node/terminal.ts b/src/vs/workbench/contrib/terminal/node/terminal.ts index 00cd0d8a33a..c99dbceb709 100644 --- a/src/vs/workbench/contrib/terminal/node/terminal.ts +++ b/src/vs/workbench/contrib/terminal/node/terminal.ts @@ -119,6 +119,10 @@ async function detectAvailableWindowsShells(): Promise { `${process.env['ProgramFiles']}\\Git\\bin\\bash.exe`, `${process.env['ProgramFiles']}\\Git\\usr\\bin\\bash.exe`, `${process.env['LocalAppData']}\\Programs\\Git\\bin\\bash.exe`, + ], + Cygwin: [ + `${process.env['HOMEDRIVE']}\\cygwin64\\bin\\bash.exe`, + `${process.env['HOMEDRIVE']}\\cygwin\\bin\\bash.exe` ] }; const promises: PromiseLike[] = []; From 8c2de5efc2062c27fdb010cfb4c940335162bb4c Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 1 Jul 2019 17:38:26 -0700 Subject: [PATCH 0717/1449] Fix monaco build errors --- src/vs/editor/contrib/colorPicker/colorDetector.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/editor/contrib/colorPicker/colorDetector.ts b/src/vs/editor/contrib/colorPicker/colorDetector.ts index 1f8da300725..359bec95638 100644 --- a/src/vs/editor/contrib/colorPicker/colorDetector.ts +++ b/src/vs/editor/contrib/colorPicker/colorDetector.ts @@ -210,11 +210,11 @@ export class ColorDetector extends Disposable implements IEditorContribution { }); } - for (const subType of this._decorationsTypes) { + this._decorationsTypes.forEach(subType => { if (!newDecorationsTypes[subType]) { this._codeEditorService.removeDecorationType(subType); } - } + }); this._colorDecoratorIds = this._editor.deltaDecorations(this._colorDecoratorIds, decorations); } @@ -223,9 +223,9 @@ export class ColorDetector extends Disposable implements IEditorContribution { this._decorationsIds = this._editor.deltaDecorations(this._decorationsIds, []); this._colorDecoratorIds = this._editor.deltaDecorations(this._colorDecoratorIds, []); - for (const subType of this._decorationsTypes) { + this._decorationsTypes.forEach(subType => { this._codeEditorService.removeDecorationType(subType); - } + }); } getColorData(position: Position): IColorData | null { From c18456174230ba8dfb0d5228c0202b43212da609 Mon Sep 17 00:00:00 2001 From: SteVen Batten Date: Mon, 1 Jul 2019 19:48:04 -0700 Subject: [PATCH 0718/1449] refs #76442 --- .../workbench/browser/parts/titlebar/menubarControl.ts | 9 ++++++--- src/vs/workbench/browser/parts/titlebar/titlebarPart.ts | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/browser/parts/titlebar/menubarControl.ts b/src/vs/workbench/browser/parts/titlebar/menubarControl.ts index 1e7c9049c09..7b7ca5972b1 100644 --- a/src/vs/workbench/browser/parts/titlebar/menubarControl.ts +++ b/src/vs/workbench/browser/parts/titlebar/menubarControl.ts @@ -59,7 +59,7 @@ export abstract class MenubarControl extends Disposable { [index: string]: IMenu | undefined; }; - protected topLevelTitles = { + protected topLevelTitles: { [menu: string]: string } = { 'File': nls.localize({ key: 'mFile', comment: ['&& denotes a mnemonic'] }, "&&File"), 'Edit': nls.localize({ key: 'mEdit', comment: ['&& denotes a mnemonic'] }, "&&Edit"), 'Selection': nls.localize({ key: 'mSelection', comment: ['&& denotes a mnemonic'] }, "&&Selection"), @@ -407,9 +407,12 @@ export class NativeMenubarControl extends MenubarControl { } private getAdditionalKeybindings(): { [id: string]: IMenubarKeybinding } { - const keybindings = {}; + const keybindings: { [id: string]: IMenubarKeybinding } = {}; if (isMacintosh) { - keybindings['workbench.action.quit'] = (this.getMenubarKeybinding('workbench.action.quit')); + const keybinding = this.getMenubarKeybinding('workbench.action.quit'); + if (keybinding) { + keybindings['workbench.action.quit'] = keybinding; + } } return keybindings; diff --git a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts index 0ac5cb6681c..83457d8a39f 100644 --- a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts +++ b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts @@ -494,9 +494,9 @@ export class TitlebarPart extends Part implements ITitleService { private onUpdateAppIconDragBehavior() { const setting = this.configurationService.getValue('window.doubleClickIconToClose'); if (setting) { - this.appIcon.style['-webkit-app-region'] = 'no-drag'; + (this.appIcon.style as any)['-webkit-app-region'] = 'no-drag'; } else { - this.appIcon.style['-webkit-app-region'] = 'drag'; + (this.appIcon.style as any)['-webkit-app-region'] = 'drag'; } } From 9df60d83bc6db96b30d3fe8bc23bafb9172c0bec Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 1 Jul 2019 19:53:43 -0700 Subject: [PATCH 0719/1449] Fix some implictIndex errors #76442 --- src/vs/base/common/lifecycle.ts | 4 +-- src/vs/code/electron-main/window.ts | 2 +- .../instantiation/common/instantiation.ts | 8 +++--- src/vs/platform/windows/common/windows.ts | 6 ++--- .../contrib/webview/common/mimeTypes.ts | 26 +++++++++---------- .../electron-browser/webviewElement.ts | 3 ++- .../textfile/common/textFileEditorModel.ts | 3 ++- 7 files changed, 27 insertions(+), 25 deletions(-) diff --git a/src/vs/base/common/lifecycle.ts b/src/vs/base/common/lifecycle.ts index 3a3f196619d..e82f147d322 100644 --- a/src/vs/base/common/lifecycle.ts +++ b/src/vs/base/common/lifecycle.ts @@ -23,7 +23,7 @@ function markTracked(x: T): void { if (x && x !== Disposable.None) { try { - x[__is_disposable_tracked__] = true; + (x as any)[__is_disposable_tracked__] = true; } catch { // noop } @@ -37,7 +37,7 @@ function trackDisposable(x: T): T { const stack = new Error().stack!; setTimeout(() => { - if (!x[__is_disposable_tracked__]) { + if (!(x as any)[__is_disposable_tracked__]) { console.log(stack); } }, 3000); diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index e791fc73a9d..37f1ee30537 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -316,7 +316,7 @@ export class CodeWindow extends Disposable implements ICodeWindow { const urls = ['https://marketplace.visualstudio.com/*', 'https://*.vsassets.io/*']; this._win.webContents.session.webRequest.onBeforeSendHeaders({ urls }, (details, cb) => { this.marketplaceHeadersPromise.then(headers => { - const requestHeaders = objects.assign(details.requestHeaders, headers); + const requestHeaders = objects.assign(details.requestHeaders, headers) as { [key: string]: string | undefined }; if (!this.configurationService.getValue('extensions.disableExperimentalAzureSearch')) { requestHeaders['Cookie'] = `${requestHeaders['Cookie'] ? requestHeaders['Cookie'] + ';' : ''}EnableExternalSearchForVSCode=true`; } diff --git a/src/vs/platform/instantiation/common/instantiation.ts b/src/vs/platform/instantiation/common/instantiation.ts index df147f419c3..918cd9bb808 100644 --- a/src/vs/platform/instantiation/common/instantiation.ts +++ b/src/vs/platform/instantiation/common/instantiation.ts @@ -114,11 +114,11 @@ export interface ServiceIdentifier { } function storeServiceDependency(id: Function, target: Function, index: number, optional: boolean): void { - if (target[_util.DI_TARGET] === target) { - target[_util.DI_DEPENDENCIES].push({ id, index, optional }); + if ((target as any)[_util.DI_TARGET] === target) { + (target as any)[_util.DI_DEPENDENCIES].push({ id, index, optional }); } else { - target[_util.DI_DEPENDENCIES] = [{ id, index, optional }]; - target[_util.DI_TARGET] = target; + (target as any)[_util.DI_DEPENDENCIES] = [{ id, index, optional }]; + (target as any)[_util.DI_TARGET] = target; } } diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index 75677e6beae..1f64adccc5b 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -206,15 +206,15 @@ export interface IFileToOpen { } export function isWorkspaceToOpen(uriToOpen: IURIToOpen): uriToOpen is IWorkspaceToOpen { - return !!uriToOpen['workspaceUri']; + return !!(uriToOpen as IWorkspaceToOpen)['workspaceUri']; } export function isFolderToOpen(uriToOpen: IURIToOpen): uriToOpen is IFolderToOpen { - return !!uriToOpen['folderUri']; + return !!(uriToOpen as IFolderToOpen)['folderUri']; } export function isFileToOpen(uriToOpen: IURIToOpen): uriToOpen is IFileToOpen { - return !!uriToOpen['fileUri']; + return !!(uriToOpen as IFileToOpen)['fileUri']; } diff --git a/src/vs/workbench/contrib/webview/common/mimeTypes.ts b/src/vs/workbench/contrib/webview/common/mimeTypes.ts index a34d61f10b3..0f1f583d451 100644 --- a/src/vs/workbench/contrib/webview/common/mimeTypes.ts +++ b/src/vs/workbench/contrib/webview/common/mimeTypes.ts @@ -7,20 +7,20 @@ import { getMediaMime, MIME_UNKNOWN } from 'vs/base/common/mime'; import { extname } from 'vs/base/common/path'; import { URI } from 'vs/base/common/uri'; -const webviewMimeTypes = { - '.svg': 'image/svg+xml', - '.txt': 'text/plain', - '.css': 'text/css', - '.js': 'application/javascript', - '.json': 'application/json', - '.html': 'text/html', - '.htm': 'text/html', - '.xhtml': 'application/xhtml+xml', - '.oft': 'font/otf', - '.xml': 'application/xml', -}; +const webviewMimeTypes = new Map([ + ['.svg', 'image/svg+xml'], + ['.txt', 'text/plain'], + ['.css', 'text/css'], + ['.js', 'application/javascript'], + ['.json', 'application/json'], + ['.html', 'text/html'], + ['.htm', 'text/html'], + ['.xhtml', 'application/xhtml+xml'], + ['.oft', 'font/otf'], + ['.xml', 'application/xml'], +]); export function getWebviewContentMimeType(normalizedPath: URI): string { const ext = extname(normalizedPath.fsPath).toLowerCase(); - return webviewMimeTypes[ext] || getMediaMime(normalizedPath.fsPath) || MIME_UNKNOWN; + return webviewMimeTypes.get(ext) || getMediaMime(normalizedPath.fsPath) || MIME_UNKNOWN; } diff --git a/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts index 67ca21ee160..32d4b8d25f0 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts @@ -181,7 +181,8 @@ class SvgBlocker extends Disposable { }); session.onHeadersReceived((details) => { - const contentType: string[] = details.responseHeaders['content-type'] || details.responseHeaders['Content-Type']; + const headers: any = details.responseHeaders; + const contentType: string[] = headers['content-type'] || headers['Content-Type']; if (contentType && Array.isArray(contentType) && contentType.some(x => x.toLowerCase().indexOf('image/svg') >= 0)) { const uri = URI.parse(details.url); if (uri && !this.isAllowedSvg(uri)) { diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts index 9a70fd94b6a..0640812db20 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts @@ -816,7 +816,8 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil mimeType: guessMimeTypes(this.resource).join(', '), ext, path: hash(path), - reason + reason, + whitelistedjson: undefined as string | undefined }; if (ext === '.json' && TextFileEditorModel.WHITELIST_JSON.indexOf(fileName) > -1) { From 85c1a4d1e3b4e088d489bdaedf6df95e8732f73e Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Thu, 27 Jun 2019 08:39:47 -0700 Subject: [PATCH 0720/1449] Fix #55692, remove unnecessary padding --- .../extensions/electron-browser/media/extensionsViewlet.css | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/extensionsViewlet.css b/src/vs/workbench/contrib/extensions/electron-browser/media/extensionsViewlet.css index 04a567032a9..cfc659bbbdf 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/extensionsViewlet.css +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/extensionsViewlet.css @@ -219,7 +219,6 @@ .extensions-viewlet > .extensions .extension > .details > .footer > .author { flex: 1; font-size: 90%; - padding-right: 6px; opacity: 0.9; font-weight: 600; } From e53df765cb9666172e6fba24f7231e6360a7200c Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Thu, 27 Jun 2019 08:50:50 -0700 Subject: [PATCH 0721/1449] Fix broken icon links --- .../workbench/browser/parts/editor/editor.contribution.ts | 8 ++++---- .../browser/parts/editor/media/editorgroupview.css | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/editor.contribution.ts b/src/vs/workbench/browser/parts/editor/editor.contribution.ts index 317c4a2736c..ebb0be6b68b 100644 --- a/src/vs/workbench/browser/parts/editor/editor.contribution.ts +++ b/src/vs/workbench/browser/parts/editor/editor.contribution.ts @@ -511,16 +511,16 @@ appendEditorToolItem( { id: SplitEditorAction.ID, title: nls.localize('splitEditorDown', "Split Editor Down"), - iconDark: 'split-editor-vertical-inverse.svg', - iconLight: 'split-editor-vertical.svg' + iconDark: 'split-editor-vertical-dark.svg', + iconLight: 'split-editor-vertical-light.svg' }, ContextKeyExpr.has('splitEditorsVertically'), 100000, // towards the end { id: editorCommands.SPLIT_EDITOR_RIGHT, title: nls.localize('splitEditorRight', "Split Editor Right"), - iconDark: 'split-editor-horizontal-inverse.svg', - iconLight: 'split-editor-horizontal.svg' + iconDark: 'split-editor-horizontal-dark.svg', + iconLight: 'split-editor-horizontal-light.svg' } ); diff --git a/src/vs/workbench/browser/parts/editor/media/editorgroupview.css b/src/vs/workbench/browser/parts/editor/media/editorgroupview.css index f372df090e5..2a35e386e9a 100644 --- a/src/vs/workbench/browser/parts/editor/media/editorgroupview.css +++ b/src/vs/workbench/browser/parts/editor/media/editorgroupview.css @@ -90,12 +90,12 @@ } .vs .monaco-workbench .part.editor > .content .editor-group-container > .editor-group-container-toolbar .close-editor-group { - background-image: url('close-big.svg'); + background-image: url('close-light.svg'); } .vs-dark .monaco-workbench .part.editor > .content .editor-group-container > .editor-group-container-toolbar .close-editor-group, .hc-black .monaco-workbench .part.editor > .content .editor-group-container > .editor-group-container-toolbar .close-editor-group { - background-image: url('close-big-inverse.svg'); + background-image: url('close-dark.svg'); } /* Editor */ From 51c93270444a6b18b006dd4fe5e88b461f2faa2d Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Thu, 27 Jun 2019 08:51:36 -0700 Subject: [PATCH 0722/1449] Update Git icon --- .../contrib/scm/browser/media/scm-activity-bar.svg | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/contrib/scm/browser/media/scm-activity-bar.svg b/src/vs/workbench/contrib/scm/browser/media/scm-activity-bar.svg index eef0b63dbdb..8251f475e50 100644 --- a/src/vs/workbench/contrib/scm/browser/media/scm-activity-bar.svg +++ b/src/vs/workbench/contrib/scm/browser/media/scm-activity-bar.svg @@ -4,15 +4,15 @@ - - - - - + + + + + - + From 64920b3fabf6f69f1b079849643cb423ec53ec2e Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 27 Jun 2019 18:40:32 +0200 Subject: [PATCH 0723/1449] Fix #76211 --- .../node/extensionManagementService.ts | 15 +++++++-- .../electron-browser/extensionsActions.ts | 17 +++++----- .../electron-browser/extensionsList.ts | 2 +- .../electron-browser/extensionsViews.ts | 4 +-- .../electron-browser/extensionService.ts | 31 ++++++++++--------- 5 files changed, 40 insertions(+), 29 deletions(-) diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 90b0c0f7bce..e09049c5b94 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -453,7 +453,7 @@ export class ExtensionManagementService extends Disposable implements IExtension } this.logService.info('Installation completed.', identifier.id); if (metadata) { - local.metadata = metadata; + this.setMetadata(local, metadata); return this.saveMetadataForLocalExtension(local); } return local; @@ -783,12 +783,21 @@ export class ExtensionManagementService extends Disposable implements IExtension const readmeUrl = readme ? URI.file(path.join(extensionPath, readme)) : null; const changelog = children.filter(child => /^changelog(\.txt|\.md|)$/i.test(child))[0]; const changelogUrl = changelog ? URI.file(path.join(extensionPath, changelog)) : null; - const identifier = { id: getGalleryExtensionId(manifest.publisher, manifest.name), uuid: metadata ? metadata.id : null }; - return { type, identifier, manifest, metadata, location: URI.file(extensionPath), readmeUrl, changelogUrl }; + const identifier = { id: getGalleryExtensionId(manifest.publisher, manifest.name) }; + const local = { type, identifier, manifest, metadata, location: URI.file(extensionPath), readmeUrl, changelogUrl }; + if (metadata) { + this.setMetadata(local, metadata); + } + return local; })) .then(undefined, () => null); } + private setMetadata(local: ILocalExtension, metadata: IGalleryMetadata): void { + local.metadata = metadata; + local.identifier.uuid = metadata.id; + } + async removeDeprecatedExtensions(): Promise { await this.removeUninstalledExtensions(); await this.removeOutdatedExtensions(); diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts index 26cd86eec90..fe4f91ede5c 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts @@ -68,7 +68,8 @@ function toExtensionDescription(local: ILocalExtension): IExtensionDescription { isBuiltin: local.type === ExtensionType.System, isUnderDevelopment: false, extensionLocation: local.location, - ...local.manifest + ...local.manifest, + uuid: local.identifier.uuid }; } @@ -948,7 +949,7 @@ export class DisableForWorkspaceAction extends ExtensionAction { update(): void { this.enabled = false; - if (this.extension && this.runningExtensions.some(e => areSameExtensions({ id: e.identifier.value }, this.extension.identifier) && this.workspaceContextService.getWorkbenchState() !== WorkbenchState.EMPTY)) { + if (this.extension && this.runningExtensions.some(e => areSameExtensions({ id: e.identifier.value, uuid: e.uuid }, this.extension.identifier) && this.workspaceContextService.getWorkbenchState() !== WorkbenchState.EMPTY)) { this.enabled = this.extension.state === ExtensionState.Installed && (this.extension.enablementState === EnablementState.Enabled || this.extension.enablementState === EnablementState.WorkspaceEnabled) && !!this.extension.local && this.extensionEnablementService.canChangeEnablement(this.extension.local); } } @@ -973,7 +974,7 @@ export class DisableGloballyAction extends ExtensionAction { update(): void { this.enabled = false; - if (this.extension && this.runningExtensions.some(e => areSameExtensions({ id: e.identifier.value }, this.extension.identifier))) { + if (this.extension && this.runningExtensions.some(e => areSameExtensions({ id: e.identifier.value, uuid: e.uuid }, this.extension.identifier))) { this.enabled = this.extension.state === ExtensionState.Installed && (this.extension.enablementState === EnablementState.Enabled || this.extension.enablementState === EnablementState.WorkspaceEnabled) && !!this.extension.local && this.extensionEnablementService.canChangeEnablement(this.extension.local); } } @@ -1241,7 +1242,7 @@ export class ReloadAction extends ExtensionAction { return; } const isUninstalled = this.extension.state === ExtensionState.Uninstalled; - const runningExtension = this._runningExtensions.filter(e => areSameExtensions({ id: e.identifier.value }, this.extension.identifier))[0]; + const runningExtension = this._runningExtensions.filter(e => areSameExtensions({ id: e.identifier.value, uuid: e.uuid }, this.extension.identifier))[0]; const isSameExtensionRunning = runningExtension && this.extension.server === this.extensionManagementServerService.getExtensionManagementServer(runningExtension.extensionLocation); if (isUninstalled) { @@ -2492,7 +2493,7 @@ export class StatusLabelAction extends Action implements IExtensionContainer { const runningExtensions = await this.extensionService.getExtensions(); const canAddExtension = () => { - const runningExtension = runningExtensions.filter(e => areSameExtensions({ id: e.identifier.value }, this.extension.identifier))[0]; + const runningExtension = runningExtensions.filter(e => areSameExtensions({ id: e.identifier.value, uuid: e.uuid }, this.extension.identifier))[0]; if (this.extension.local) { if (runningExtension && this.extension.version === runningExtension.version) { return true; @@ -2503,7 +2504,7 @@ export class StatusLabelAction extends Action implements IExtensionContainer { }; const canRemoveExtension = () => { if (this.extension.local) { - if (runningExtensions.every(e => !(areSameExtensions({ id: e.identifier.value }, this.extension.identifier) && this.extension.server === this.extensionManagementServerService.getExtensionManagementServer(e.extensionLocation)))) { + if (runningExtensions.every(e => !(areSameExtensions({ id: e.identifier.value, uuid: e.uuid }, this.extension.identifier) && this.extension.server === this.extensionManagementServerService.getExtensionManagementServer(e.extensionLocation)))) { return true; } return this.extensionService.canRemoveExtension(toExtensionDescription(this.extension.local)); @@ -2601,7 +2602,7 @@ export class DisabledLabelAction extends ExtensionAction { } if (this.extension && this.extension.local && this._runningExtensions) { const isEnabled = this.extensionEnablementService.isEnabled(this.extension.local); - const isExtensionRunning = this._runningExtensions.some(e => areSameExtensions({ id: e.identifier.value }, this.extension.identifier)); + const isExtensionRunning = this._runningExtensions.some(e => areSameExtensions({ id: e.identifier.value, uuid: e.uuid }, this.extension.identifier)); if (!isExtensionRunning && !isEnabled && this.extensionEnablementService.canChangeEnablement(this.extension.local)) { this.class = DisabledLabelAction.Class; this.label = localize('disabled by user', "This extension is disabled by the user."); @@ -2667,7 +2668,7 @@ export class SystemDisabledWarningAction extends ExtensionAction { } return; } - const runningExtension = this._runningExtensions.filter(e => areSameExtensions({ id: e.identifier.value }, this.extension.identifier))[0]; + const runningExtension = this._runningExtensions.filter(e => areSameExtensions({ id: e.identifier.value, uuid: e.uuid }, this.extension.identifier))[0]; const runningExtensionServer = runningExtension ? this.extensionManagementServerService.getExtensionManagementServer(runningExtension.extensionLocation) : null; const localExtension = this.extensionsWorkbenchService.local.filter(e => areSameExtensions(e.identifier, this.extension.identifier))[0]; const localExtensionServer = localExtension ? localExtension.server : null; diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionsList.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsList.ts index 585a81141ec..3f6427704d9 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionsList.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsList.ts @@ -154,7 +154,7 @@ export class Renderer implements IPagedRenderer { const updateEnablement = async () => { const runningExtensions = await this.extensionService.getExtensions(); if (extension.local && !isLanguagePackExtension(extension.local.manifest)) { - const runningExtension = runningExtensions.filter(e => areSameExtensions({ id: e.identifier.value }, extension.identifier))[0]; + const runningExtension = runningExtensions.filter(e => areSameExtensions({ id: e.identifier.value, uuid: e.uuid }, extension.identifier))[0]; const isSameExtensionRunning = runningExtension && extension.server === this.extensionManagementServerService.getExtensionManagementServer(runningExtension.extensionLocation); toggleClass(data.root, 'disabled', !isSameExtensionRunning); } else { diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionsViews.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsViews.ts index 4b3f428cede..6dad2fb5808 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionsViews.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsViews.ts @@ -392,7 +392,7 @@ export class ExtensionsListView extends ViewletPanel { const result = local .sort((e1, e2) => e1.displayName.localeCompare(e2.displayName)) - .filter(e => runningExtensions.every(r => !areSameExtensions({ id: r.identifier.value }, e.identifier)) + .filter(e => runningExtensions.every(r => !areSameExtensions({ id: r.identifier.value, uuid: r.uuid }, e.identifier)) && (e.name.toLowerCase().indexOf(value) > -1 || e.displayName.toLowerCase().indexOf(value) > -1) && (!categories.length || categories.some(category => (e.local && e.local.manifest.categories || []).some(c => c.toLowerCase() === category)))); @@ -407,7 +407,7 @@ export class ExtensionsListView extends ViewletPanel { const result = local .sort((e1, e2) => e1.displayName.localeCompare(e2.displayName)) - .filter(e => runningExtensions.some(r => areSameExtensions({ id: r.identifier.value }, e.identifier)) + .filter(e => runningExtensions.some(r => areSameExtensions({ id: r.identifier.value, uuid: r.uuid }, e.identifier)) && (e.name.toLowerCase().indexOf(value) > -1 || e.displayName.toLowerCase().indexOf(value) > -1) && (!categories.length || categories.some(category => (e.local && e.local.manifest.categories || []).some(c => c.toLowerCase() === category)))); diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts index 7c19b44f67a..98b5cf01ba1 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts @@ -26,7 +26,7 @@ import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/ import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IWindowService, IWindowsService } from 'vs/platform/windows/common/windows'; -import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; +import { IExtensionService, toExtension } from 'vs/workbench/services/extensions/common/extensions'; import { ExtensionHostProcessManager } from 'vs/workbench/services/extensions/common/extensionHostProcessManager'; import { ExtensionIdentifier, IExtension, ExtensionType, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { Schemas } from 'vs/base/common/network'; @@ -166,13 +166,7 @@ export class ExtensionService extends AbstractExtensionService implements IExten for (let i = 0, len = _toAdd.length; i < len; i++) { const extension = _toAdd[i]; - if (extension.location.scheme !== Schemas.file) { - continue; - } - - const existingExtensionDescription = this._registry.getExtensionDescription(extension.identifier.id); - if (existingExtensionDescription) { - // this extension is already running (most likely at a different version) + if (!this._canAddExtension(extension)) { continue; } @@ -235,21 +229,28 @@ export class ExtensionService extends AbstractExtensionService implements IExten this._doHandleExtensionPoints(extensionDescriptions); } - public canAddExtension(extension: IExtensionDescription): boolean { + public canAddExtension(extensionDescription: IExtensionDescription): boolean { + return this._canAddExtension(toExtension(extensionDescription)); + } + + public _canAddExtension(extension: IExtension): boolean { if (this._environmentService.configuration.remoteAuthority) { return false; } - if (extension.extensionLocation.scheme !== Schemas.file) { + if (extension.location.scheme !== Schemas.file) { return false; } - const extensionDescription = this._registry.getExtensionDescription(extension.identifier); + const extensionDescription = this._registry.getExtensionDescription(extension.identifier.id); if (extensionDescription) { - // ignore adding an extension which is already running and cannot be removed - if (!this._canRemoveExtension(extensionDescription)) { - return false; - } + // this extension is already running (most likely at a different version) + return false; + } + + // Check if extension is renamed + if (extension.identifier.uuid && this._registry.getAllExtensionDescriptions().some(e => e.uuid === extension.identifier.uuid)) { + return false; } return true; From 852b4cf44f815a4336f28b18f57728f8cf6a2886 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 27 Jun 2019 18:41:03 +0200 Subject: [PATCH 0724/1449] Fix #70558 --- .../contrib/extensions/node/extensionsWorkbenchService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts index a332c2733bb..c08a6e37c16 100644 --- a/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts @@ -340,7 +340,7 @@ class Extensions extends Disposable { async queryInstalled(): Promise { const installed = await this.server.extensionManagementService.getInstalled(); - const byId = index(this.installed, e => e.identifier.id); + const byId = index(this.installed, e => e.local ? e.local.identifier.id : e.identifier.id); this.installed = installed.map(local => { const extension = byId[local.identifier.id] || new Extension(this.galleryService, this.stateProvider, this.server, local, undefined, this.telemetryService, this.logService, this.fileService); extension.local = local; From 1af20e7421fcb0329c1628bc54bb1511a26ac7b2 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 27 Jun 2019 10:27:34 -0700 Subject: [PATCH 0725/1449] Fix error handling in shell selector Fixes #75922 --- .../contrib/terminal/node/terminal.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/node/terminal.ts b/src/vs/workbench/contrib/terminal/node/terminal.ts index 00cd0d8a33a..ec2aa3acb57 100644 --- a/src/vs/workbench/contrib/terminal/node/terminal.ts +++ b/src/vs/workbench/contrib/terminal/node/terminal.ts @@ -138,7 +138,7 @@ async function detectAvailableUnixShells(): Promise { }); } -function validateShellPaths(label: string, potentialPaths: string[]): Promise { +async function validateShellPaths(label: string, potentialPaths: string[]): Promise { if (potentialPaths.length === 0) { return Promise.resolve(undefined); } @@ -146,15 +146,16 @@ function validateShellPaths(label: string, potentialPaths: string[]): Promise { - if (!stat.isFile && !stat.isSymbolicLink) { - return validateShellPaths(label, potentialPaths); + try { + const result = await stat(normalize(current)); + if (result.isFile || result.isSymbolicLink) { + return { + label, + path: current + }; } - return { - label, - path: current - }; - }); + } catch { /* noop */ } + return validateShellPaths(label, potentialPaths); } async function getShellPathFromRegistry(shellName: string): Promise { From 862a1bc6c610ec52ee6acbb3ddfef6c42ac5e784 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Thu, 27 Jun 2019 10:24:45 -0700 Subject: [PATCH 0726/1449] Fix #76245. Initialize test helper inside suite. --- .../test/browserKeyboardMapper.test.ts | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts b/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts index 9ea8f70d1e3..8c06d950aed 100644 --- a/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts +++ b/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts @@ -10,8 +10,6 @@ import { BrowserKeyboardMapperFactoryBase } from '../browser/keymapService'; import { KeymapInfo, IKeymapInfo } from '../common/keymapInfo'; class TestKeyboardMapperFactory extends BrowserKeyboardMapperFactoryBase { - public static readonly INSTANCE = new TestKeyboardMapperFactory(); - constructor() { super(); @@ -25,14 +23,15 @@ class TestKeyboardMapperFactory extends BrowserKeyboardMapperFactoryBase { suite('keyboard layout loader', () => { + const instance: TestKeyboardMapperFactory = new TestKeyboardMapperFactory(); test('load default US keyboard layout', () => { - assert.notEqual(TestKeyboardMapperFactory.INSTANCE.activeKeyboardLayout, null); - assert.equal(TestKeyboardMapperFactory.INSTANCE.activeKeyboardLayout!.isUSStandard, true); + assert.notEqual(instance.activeKeyboardLayout, null); + assert.equal(instance.activeKeyboardLayout!.isUSStandard, true); }); test('isKeyMappingActive', () => { - assert.equal(TestKeyboardMapperFactory.INSTANCE.isKeyMappingActive({ + assert.equal(instance.isKeyMappingActive({ KeyA: { value: 'a', valueIsDeadKey: false, @@ -45,7 +44,7 @@ suite('keyboard layout loader', () => { } }), true); - assert.equal(TestKeyboardMapperFactory.INSTANCE.isKeyMappingActive({ + assert.equal(instance.isKeyMappingActive({ KeyA: { value: 'a', valueIsDeadKey: false, @@ -68,7 +67,7 @@ suite('keyboard layout loader', () => { } }), true); - assert.equal(TestKeyboardMapperFactory.INSTANCE.isKeyMappingActive({ + assert.equal(instance.isKeyMappingActive({ KeyZ: { value: 'y', valueIsDeadKey: false, @@ -84,7 +83,7 @@ suite('keyboard layout loader', () => { }); test('Switch keymapping', () => { - TestKeyboardMapperFactory.INSTANCE.setActiveKeyMapping({ + instance.setActiveKeyMapping({ KeyZ: { value: 'y', valueIsDeadKey: false, @@ -96,8 +95,8 @@ suite('keyboard layout loader', () => { withShiftAltGrIsDeadKey: false } }); - assert.equal(!!TestKeyboardMapperFactory.INSTANCE.activeKeyboardLayout!.isUSStandard, false); - assert.equal(TestKeyboardMapperFactory.INSTANCE.isKeyMappingActive({ + assert.equal(!!instance.activeKeyboardLayout!.isUSStandard, false); + assert.equal(instance.isKeyMappingActive({ KeyZ: { value: 'y', valueIsDeadKey: false, @@ -110,14 +109,14 @@ suite('keyboard layout loader', () => { }, }), true); - TestKeyboardMapperFactory.INSTANCE.setUSKeyboardLayout(); - assert.equal(TestKeyboardMapperFactory.INSTANCE.activeKeyboardLayout!.isUSStandard, true); + instance.setUSKeyboardLayout(); + assert.equal(instance.activeKeyboardLayout!.isUSStandard, true); }); test('Switch keyboard layout info', () => { - TestKeyboardMapperFactory.INSTANCE.setKeyboardLayout('com.apple.keylayout.German'); - assert.equal(!!TestKeyboardMapperFactory.INSTANCE.activeKeyboardLayout!.isUSStandard, false); - assert.equal(TestKeyboardMapperFactory.INSTANCE.isKeyMappingActive({ + instance.setKeyboardLayout('com.apple.keylayout.German'); + assert.equal(!!instance.activeKeyboardLayout!.isUSStandard, false); + assert.equal(instance.isKeyMappingActive({ KeyZ: { value: 'y', valueIsDeadKey: false, @@ -130,7 +129,7 @@ suite('keyboard layout loader', () => { }, }), true); - TestKeyboardMapperFactory.INSTANCE.setUSKeyboardLayout(); - assert.equal(TestKeyboardMapperFactory.INSTANCE.activeKeyboardLayout!.isUSStandard, true); + instance.setUSKeyboardLayout(); + assert.equal(instance.activeKeyboardLayout!.isUSStandard, true); }); }); \ No newline at end of file From 64897a809355e525d2918eb6b8a9d98a0a893426 Mon Sep 17 00:00:00 2001 From: SteVen Batten Date: Thu, 27 Jun 2019 13:38:40 -0700 Subject: [PATCH 0727/1449] Revert "fixes #75715" This reverts commit da1061a273387a00ec1765945ed2a519d757d15d. --- src/vs/workbench/browser/parts/titlebar/media/titlebarpart.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/titlebar/media/titlebarpart.css b/src/vs/workbench/browser/parts/titlebar/media/titlebarpart.css index 2abf9f4d81c..f00280e1f32 100644 --- a/src/vs/workbench/browser/parts/titlebar/media/titlebarpart.css +++ b/src/vs/workbench/browser/parts/titlebar/media/titlebarpart.css @@ -52,7 +52,7 @@ .monaco-workbench.windows .part.titlebar .menubar, .monaco-workbench.linux .part.titlebar .menubar { - z-index: 2000; + z-index: 1; } .monaco-workbench.web .part.titlebar > .window-title, From a6ab1bf5479ff75896a7f8f4babdb05bcef41957 Mon Sep 17 00:00:00 2001 From: SteVen Batten Date: Thu, 27 Jun 2019 13:39:01 -0700 Subject: [PATCH 0728/1449] Revert "fixes #75615" This reverts commit 36ca1f4ae9b36a815325cc2b1231d5f8645da7eb. --- .../workbench/browser/parts/titlebar/media/titlebarpart.css | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/vs/workbench/browser/parts/titlebar/media/titlebarpart.css b/src/vs/workbench/browser/parts/titlebar/media/titlebarpart.css index f00280e1f32..2b1d303976e 100644 --- a/src/vs/workbench/browser/parts/titlebar/media/titlebarpart.css +++ b/src/vs/workbench/browser/parts/titlebar/media/titlebarpart.css @@ -25,6 +25,7 @@ position: absolute; width: 100%; height: 100%; + z-index: -1; -webkit-app-region: drag; } @@ -50,11 +51,6 @@ overflow: visible; } -.monaco-workbench.windows .part.titlebar .menubar, -.monaco-workbench.linux .part.titlebar .menubar { - z-index: 1; -} - .monaco-workbench.web .part.titlebar > .window-title, .monaco-workbench.windows .part.titlebar > .window-title, .monaco-workbench.linux .part.titlebar > .window-title { From 68c0903d9532a53f1e2ccd42cf0980760f36eb20 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Thu, 27 Jun 2019 15:54:25 -0700 Subject: [PATCH 0729/1449] Stop propagation on minimap slider --- src/vs/editor/browser/viewParts/minimap/minimap.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/editor/browser/viewParts/minimap/minimap.ts b/src/vs/editor/browser/viewParts/minimap/minimap.ts index a8bc3b789e8..1641841c2f8 100644 --- a/src/vs/editor/browser/viewParts/minimap/minimap.ts +++ b/src/vs/editor/browser/viewParts/minimap/minimap.ts @@ -527,6 +527,7 @@ export class Minimap extends ViewPart { this._sliderMouseDownListener = dom.addStandardDisposableListener(this._slider.domNode, 'mousedown', (e) => { e.preventDefault(); + e.stopPropagation(); if (e.leftButton && this._lastRenderData) { const initialMousePosition = e.posy; From e73ef9a00c8bdbd84b21557737cc2c430aaeac51 Mon Sep 17 00:00:00 2001 From: Rachel Macfarlane Date: Thu, 27 Jun 2019 17:09:02 -0700 Subject: [PATCH 0730/1449] Rename workspace.metadata telemetry event to workspace.stats (#76269) --- src/vs/platform/diagnostics/node/diagnosticsService.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/diagnostics/node/diagnosticsService.ts b/src/vs/platform/diagnostics/node/diagnosticsService.ts index 9fd4e15fea7..b83d063a245 100644 --- a/src/vs/platform/diagnostics/node/diagnosticsService.ts +++ b/src/vs/platform/diagnostics/node/diagnosticsService.ts @@ -521,13 +521,13 @@ export class DiagnosticsService implements IDiagnosticsService { const folder = folderUri.fsPath; collectWorkspaceStats(folder, ['node_modules', '.git']).then(stats => { /* __GDPR__ - "workspace.metadata" : { + "workspace.stats" : { "fileTypes" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "configTypes" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "launchConfigs" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true } } */ - this.telemetryService.publicLog('workspace.metadata', { + this.telemetryService.publicLog('workspace.stats', { fileTypes: stats.fileTypes, configTypes: stats.configFiles, launchConfigs: stats.launchConfigFiles From ab9812e1afd7425d209463e6a9f090940d910668 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 28 Jun 2019 08:53:10 +0200 Subject: [PATCH 0731/1449] fix smoketest --- test/smoke/src/application.ts | 2 +- test/smoke/src/areas/git/git.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/smoke/src/application.ts b/test/smoke/src/application.ts index 5d764176846..472d081ec4b 100644 --- a/test/smoke/src/application.ts +++ b/test/smoke/src/application.ts @@ -140,7 +140,7 @@ export class Application { await this.code.waitForElement('.monaco-workbench'); if (this.remote) { - await this.code.waitForElement('.monaco-workbench .statusbar-item.statusbar-entry a[title="Editing on TestResolver"]'); + await this.code.waitForElement('.monaco-workbench .statusbar-item[title="Editing on TestResolver"]'); } // wait a bit, since focus might be stolen off widgets diff --git a/test/smoke/src/areas/git/git.test.ts b/test/smoke/src/areas/git/git.test.ts index d04677eafbc..11546f7d7fe 100644 --- a/test/smoke/src/areas/git/git.test.ts +++ b/test/smoke/src/areas/git/git.test.ts @@ -7,7 +7,7 @@ import * as cp from 'child_process'; import { Application } from '../../application'; const DIFF_EDITOR_LINE_INSERT = '.monaco-diff-editor .editor.modified .line-insert'; -const SYNC_STATUSBAR = 'div[id="workbench.parts.statusbar"] .statusbar-entry a[title$="Synchronize Changes"]'; +const SYNC_STATUSBAR = 'div[id="workbench.parts.statusbar"] .statusbar-item[title$="Synchronize Changes"]'; export function setup() { describe('Git', () => { From 332aaba6ded659529a7ae91e6ae0071ff1ef6ae8 Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 28 Jun 2019 10:16:34 +0200 Subject: [PATCH 0732/1449] fixes #76278 --- src/vs/workbench/browser/media/style.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vs/workbench/browser/media/style.css b/src/vs/workbench/browser/media/style.css index a467be6485b..af38fbd57ef 100644 --- a/src/vs/workbench/browser/media/style.css +++ b/src/vs/workbench/browser/media/style.css @@ -161,6 +161,7 @@ body.web { /* START Keyboard Focus Indication Styles */ .monaco-workbench [tabindex="0"]:focus, +.monaco-workbench [tabindex="-1"]:focus, .monaco-workbench .synthetic-focus, .monaco-workbench select:focus, .monaco-workbench input[type="button"]:focus, @@ -174,6 +175,7 @@ body.web { } .monaco-workbench [tabindex="0"]:active, +.monaco-workbench [tabindex="-1"]:active, .monaco-workbench select:active, .monaco-workbench input[type="button"]:active, .monaco-workbench input[type="checkbox"]:active, From fe0c3e785c22c3ed2d5caa7178488c92d62bdb08 Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 28 Jun 2019 10:51:29 +0200 Subject: [PATCH 0733/1449] fixes #76278 --- src/vs/workbench/browser/style.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vs/workbench/browser/style.ts b/src/vs/workbench/browser/style.ts index 8db78ac9953..dbb318045f5 100644 --- a/src/vs/workbench/browser/style.ts +++ b/src/vs/workbench/browser/style.ts @@ -95,6 +95,7 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { if (focusOutline) { collector.addRule(` .monaco-workbench [tabindex="0"]:focus, + .monaco-workbench [tabindex="-1"]:focus, .monaco-workbench .synthetic-focus, .monaco-workbench select:focus, .monaco-workbench .monaco-tree.focused.no-focused-item:focus:before, @@ -114,6 +115,7 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { if (theme.type === HIGH_CONTRAST) { collector.addRule(` .hc-black [tabindex="0"]:focus, + .hc-black [tabindex="-1"]:focus, .hc-black .synthetic-focus, .hc-black select:focus, .hc-black input[type="button"]:focus, From 710e2c035441225b5e0ebed3a01ddfd6b847c8eb Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 28 Jun 2019 11:12:19 +0200 Subject: [PATCH 0734/1449] read services registray, fixes https://github.com/microsoft/monaco-editor/issues/1464 --- .../editor/standalone/browser/standaloneServices.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vs/editor/standalone/browser/standaloneServices.ts b/src/vs/editor/standalone/browser/standaloneServices.ts index a9943538a82..79277379d5e 100644 --- a/src/vs/editor/standalone/browser/standaloneServices.ts +++ b/src/vs/editor/standalone/browser/standaloneServices.ts @@ -44,11 +44,10 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace import { MenuService } from 'vs/platform/actions/common/menuService'; import { IMarkerDecorationsService } from 'vs/editor/common/services/markersDecorationService'; import { MarkerDecorationsService } from 'vs/editor/common/services/markerDecorationsServiceImpl'; -import { ISuggestMemoryService, SuggestMemoryService } from 'vs/editor/contrib/suggest/suggestMemory'; import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility'; import { BrowserAccessibilityService } from 'vs/platform/accessibility/common/accessibilityService'; import { ILayoutService } from 'vs/platform/layout/browser/layoutService'; -import { ICodeLensCache, CodeLensCache } from 'vs/editor/contrib/codelens/codeLensCache'; +import { getServices } from 'vs/platform/instantiation/common/extensions'; export interface IEditorOverrideServices { [index: string]: any; @@ -100,6 +99,11 @@ export module StaticServices { // Create a fresh service collection let result = new ServiceCollection(); + // make sure to add all services that use `registerSingleton` + for (const { id, descriptor } of getServices()) { + result.set(id, descriptor); + } + // Initialize the service collection with the overrides for (let serviceId in overrides) { if (overrides.hasOwnProperty(serviceId)) { @@ -157,10 +161,6 @@ export module StaticServices { export const logService = define(ILogService, () => new NullLogService()); export const editorWorkerService = define(IEditorWorkerService, (o) => new EditorWorkerServiceImpl(modelService.get(o), resourceConfigurationService.get(o), logService.get(o))); - - export const suggestMemoryService = define(ISuggestMemoryService, (o) => new SuggestMemoryService(storageService.get(o), configurationService.get(o))); - - export const codeLensCacheService = define(ICodeLensCache, (o) => new CodeLensCache(storageService.get(o))); } export class DynamicStandaloneServices extends Disposable { From 948af0360c7bd4350ae44daa6829841c6cb7f8b9 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 28 Jun 2019 11:20:14 +0200 Subject: [PATCH 0735/1449] debt - use Intl.Collator as-is since all recent browser support it --- src/vs/base/common/comparers.ts | 81 ++++++++-------------- src/vs/base/test/browser/comparers.test.ts | 23 +----- src/vs/workbench/browser/workbench.ts | 12 +--- 3 files changed, 33 insertions(+), 83 deletions(-) diff --git a/src/vs/base/common/comparers.ts b/src/vs/base/common/comparers.ts index adf5859c794..d6dbb1784f1 100644 --- a/src/vs/base/common/comparers.ts +++ b/src/vs/base/common/comparers.ts @@ -7,28 +7,26 @@ import * as strings from 'vs/base/common/strings'; import { sep } from 'vs/base/common/path'; import { IdleValue } from 'vs/base/common/async'; -let intlFileNameCollator: IdleValue<{ collator: Intl.Collator, collatorIsNumeric: boolean }>; - -export function setFileNameComparer(collator: IdleValue<{ collator: Intl.Collator, collatorIsNumeric: boolean }>): void { - intlFileNameCollator = collator; -} +const intlFileNameCollator: IdleValue<{ collator: Intl.Collator, collatorIsNumeric: boolean }> = new IdleValue(() => { + const collator = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' }); + return { + collator: collator, + collatorIsNumeric: collator.resolvedOptions().numeric + }; +}); export function compareFileNames(one: string | null, other: string | null, caseSensitive = false): number { - if (intlFileNameCollator) { - const a = one || ''; - const b = other || ''; - const result = intlFileNameCollator.getValue().collator.compare(a, b); + const a = one || ''; + const b = other || ''; + const result = intlFileNameCollator.getValue().collator.compare(a, b); - // Using the numeric option in the collator will - // make compare(`foo1`, `foo01`) === 0. We must disambiguate. - if (intlFileNameCollator.getValue().collatorIsNumeric && result === 0 && a !== b) { - return a < b ? -1 : 1; - } - - return result; + // Using the numeric option in the collator will + // make compare(`foo1`, `foo01`) === 0. We must disambiguate. + if (intlFileNameCollator.getValue().collatorIsNumeric && result === 0 && a !== b) { + return a < b ? -1 : 1; } - return noIntlCompareFileNames(one, other, caseSensitive); + return result; } const FileNameMatch = /^(.*?)(\.([^.]*))?$/; @@ -54,46 +52,27 @@ export function noIntlCompareFileNames(one: string | null, other: string | null, } export function compareFileExtensions(one: string | null, other: string | null): number { - if (intlFileNameCollator) { - const [oneName, oneExtension] = extractNameAndExtension(one); - const [otherName, otherExtension] = extractNameAndExtension(other); + const [oneName, oneExtension] = extractNameAndExtension(one); + const [otherName, otherExtension] = extractNameAndExtension(other); - let result = intlFileNameCollator.getValue().collator.compare(oneExtension, otherExtension); + let result = intlFileNameCollator.getValue().collator.compare(oneExtension, otherExtension); - if (result === 0) { - // Using the numeric option in the collator will - // make compare(`foo1`, `foo01`) === 0. We must disambiguate. - if (intlFileNameCollator.getValue().collatorIsNumeric && oneExtension !== otherExtension) { - return oneExtension < otherExtension ? -1 : 1; - } - - // Extensions are equal, compare filenames - result = intlFileNameCollator.getValue().collator.compare(oneName, otherName); - - if (intlFileNameCollator.getValue().collatorIsNumeric && result === 0 && oneName !== otherName) { - return oneName < otherName ? -1 : 1; - } + if (result === 0) { + // Using the numeric option in the collator will + // make compare(`foo1`, `foo01`) === 0. We must disambiguate. + if (intlFileNameCollator.getValue().collatorIsNumeric && oneExtension !== otherExtension) { + return oneExtension < otherExtension ? -1 : 1; } - return result; + // Extensions are equal, compare filenames + result = intlFileNameCollator.getValue().collator.compare(oneName, otherName); + + if (intlFileNameCollator.getValue().collatorIsNumeric && result === 0 && oneName !== otherName) { + return oneName < otherName ? -1 : 1; + } } - return noIntlCompareFileExtensions(one, other); -} - -function noIntlCompareFileExtensions(one: string | null, other: string | null): number { - const [oneName, oneExtension] = extractNameAndExtension(one && one.toLowerCase()); - const [otherName, otherExtension] = extractNameAndExtension(other && other.toLowerCase()); - - if (oneExtension !== otherExtension) { - return oneExtension < otherExtension ? -1 : 1; - } - - if (oneName === otherName) { - return 0; - } - - return oneName < otherName ? -1 : 1; + return result; } function extractNameAndExtension(str?: string | null): [string, string] { diff --git a/src/vs/base/test/browser/comparers.test.ts b/src/vs/base/test/browser/comparers.test.ts index df74e2bbfa2..369f160803b 100644 --- a/src/vs/base/test/browser/comparers.test.ts +++ b/src/vs/base/test/browser/comparers.test.ts @@ -3,23 +3,13 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { compareFileNames, compareFileExtensions, setFileNameComparer } from 'vs/base/common/comparers'; +import { compareFileNames, compareFileExtensions } from 'vs/base/common/comparers'; import * as assert from 'assert'; -import { IdleValue } from 'vs/base/common/async'; suite('Comparers', () => { test('compareFileNames', () => { - // Setup Intl - setFileNameComparer(new IdleValue(() => { - const collator = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' }); - return { - collator: collator, - collatorIsNumeric: collator.resolvedOptions().numeric - }; - })); - assert(compareFileNames(null, null) === 0, 'null should be equal'); assert(compareFileNames(null, 'abc') < 0, 'null should be come before real values'); assert(compareFileNames('', '') === 0, 'empty should be equal'); @@ -35,15 +25,6 @@ suite('Comparers', () => { test('compareFileExtensions', () => { - // Setup Intl - setFileNameComparer(new IdleValue(() => { - const collator = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' }); - return { - collator: collator, - collatorIsNumeric: collator.resolvedOptions().numeric - }; - })); - assert(compareFileExtensions(null, null) === 0, 'null should be equal'); assert(compareFileExtensions(null, '.abc') < 0, 'null should come before real files'); assert(compareFileExtensions(null, 'abc') < 0, 'null should come before real files without extension'); @@ -66,4 +47,4 @@ suite('Comparers', () => { assert(compareFileExtensions('file2.ext2', 'file1.ext10') < 0, 'extensions with numbers should be in numerical order, not alphabetical order'); assert(compareFileExtensions('file.ext01', 'file.ext1') < 0, 'extensions with equal numbers should be in alphabetical order'); }); -}); \ No newline at end of file +}); diff --git a/src/vs/workbench/browser/workbench.ts b/src/vs/workbench/browser/workbench.ts index 54b078b2755..005c1bb0ec6 100644 --- a/src/vs/workbench/browser/workbench.ts +++ b/src/vs/workbench/browser/workbench.ts @@ -6,10 +6,9 @@ import 'vs/workbench/browser/style'; import { localize } from 'vs/nls'; -import { setFileNameComparer } from 'vs/base/common/comparers'; import { Event, Emitter, setGlobalLeakWarningThreshold } from 'vs/base/common/event'; import { addClasses, addClass, removeClasses } from 'vs/base/browser/dom'; -import { runWhenIdle, IdleValue } from 'vs/base/common/async'; +import { runWhenIdle } from 'vs/base/common/async'; import { getZoomLevel } from 'vs/base/browser/browser'; import { mark } from 'vs/base/common/performance'; import { onUnexpectedError, setUnexpectedErrorHandler } from 'vs/base/common/errors'; @@ -114,15 +113,6 @@ export class Workbench extends Layout { // Configure emitter leak warning threshold setGlobalLeakWarningThreshold(175); - // Setup Intl for comparers - setFileNameComparer(new IdleValue(() => { - const collator = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' }); - return { - collator: collator, - collatorIsNumeric: collator.resolvedOptions().numeric - }; - })); - // ARIA setARIAContainer(document.body); From 4b5764d62d06fcd2a4c0477105be4e13709becd9 Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 28 Jun 2019 11:25:11 +0200 Subject: [PATCH 0736/1449] linux remote: disable dnd to desktop fixes microsoft/vscode-remote-release#849 --- src/vs/workbench/browser/dnd.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/browser/dnd.ts b/src/vs/workbench/browser/dnd.ts index 2054ceece3c..cce2dfe5632 100644 --- a/src/vs/workbench/browser/dnd.ts +++ b/src/vs/workbench/browser/dnd.ts @@ -20,7 +20,7 @@ import { DataTransfers } from 'vs/base/browser/dnd'; import { DragMouseEvent } from 'vs/base/browser/mouseEvent'; import { normalizeDriveLetter } from 'vs/base/common/labels'; import { MIME_BINARY } from 'vs/base/common/mime'; -import { isWindows } from 'vs/base/common/platform'; +import { isWindows, isLinux } from 'vs/base/common/platform'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { isCodeEditor } from 'vs/editor/browser/editorBrowser'; import { IEditorIdentifier, GroupIdentifier } from 'vs/workbench/common/editor'; @@ -31,6 +31,7 @@ import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsSe import { IRecentFile } from 'vs/platform/history/common/history'; import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common/workspaceEditing'; import { withNullAsUndefined } from 'vs/base/common/types'; +import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; export interface IDraggedResource { resource: URI; @@ -327,8 +328,12 @@ export function fillResourceDataTransfers(accessor: ServicesAccessor, resources: const lineDelimiter = isWindows ? '\r\n' : '\n'; event.dataTransfer.setData(DataTransfers.TEXT, sources.map(source => source.resource.scheme === Schemas.file ? normalize(normalizeDriveLetter(source.resource.fsPath)) : source.resource.toString()).join(lineDelimiter)); - // Download URL: enables support to drag a tab as file to desktop (only single file supported) - event.dataTransfer.setData(DataTransfers.DOWNLOAD_URL, [MIME_BINARY, basename(firstSource.resource), firstSource.resource.toString()].join(':')); + const envService = accessor.get(IWorkbenchEnvironmentService); + if (!(isLinux && envService.configuration.remoteAuthority)) { + // Download URL: enables support to drag a tab as file to desktop (only single file supported) + // Not supported on linux remote due to chrome limitation https://github.com/microsoft/vscode-remote-release/issues/849 + event.dataTransfer.setData(DataTransfers.DOWNLOAD_URL, [MIME_BINARY, basename(firstSource.resource), firstSource.resource.toString()].join(':')); + } // Resource URLs: allows to drop multiple resources to a target in VS Code (not directories) const files = sources.filter(s => !s.isDirectory); From e22ef32f659b99e3fccbd703d864b5d754c485b4 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 28 Jun 2019 12:56:52 +0200 Subject: [PATCH 0737/1449] add editor.suggest._explain-setting which replaces suggest details with score, distance, index information --- .../editor/contrib/suggest/suggestWidget.ts | 37 ++++++++++++++----- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/src/vs/editor/contrib/suggest/suggestWidget.ts b/src/vs/editor/contrib/suggest/suggestWidget.ts index 7dabc8b16a5..3ea9a62625e 100644 --- a/src/vs/editor/contrib/suggest/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/suggestWidget.ts @@ -37,6 +37,8 @@ import { IModelService } from 'vs/editor/common/services/modelService'; import { URI } from 'vs/base/common/uri'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { FileKind } from 'vs/platform/files/common/files'; +import { MarkdownString } from 'vs/base/common/htmlContent'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; const expandSuggestionDocsByDefault = false; @@ -247,7 +249,8 @@ class SuggestionDetails { private readonly widget: SuggestWidget, private readonly editor: ICodeEditor, private readonly markdownRenderer: MarkdownRenderer, - private readonly triggerKeybindingLabel: string + private readonly triggerKeybindingLabel: string, + @IConfigurationService private readonly _configService: IConfigurationService, ) { this.disposables = []; @@ -289,7 +292,20 @@ class SuggestionDetails { renderItem(item: CompletionItem): void { this.renderDisposeable = dispose(this.renderDisposeable); - if (!item || !canExpandCompletionItem(item)) { + let { documentation, detail } = item.completion; + const shouldExplain = this._configService.getValue('editor.suggest._explain'); + // --- documentation + + if (shouldExplain) { + let md = ''; + md += `score: ${item.score[0]}${item.word ? `, compared '${item.completion.filterText && (item.completion.filterText + ' (filterText)') || item.completion.label}' with '${item.word}'` : ' (no prefix)'}\n`; + md += `distance: ${item.distance}, see localityBonus-setting\n`; + md += `index: ${item.idx}, ${item.completion.sortText && (`'${item.completion.sortText}' (sortText)`) || 'extension order'}\n`; + documentation = new MarkdownString().appendCodeblock('empty', md); + detail = undefined; + } + + if (!shouldExplain && !canExpandCompletionItem(item)) { this.type.textContent = ''; this.docs.textContent = ''; addClass(this.el, 'no-docs'); @@ -297,19 +313,20 @@ class SuggestionDetails { return; } removeClass(this.el, 'no-docs'); - if (typeof item.completion.documentation === 'string') { + if (typeof documentation === 'string') { removeClass(this.docs, 'markdown-docs'); - this.docs.textContent = item.completion.documentation; + this.docs.textContent = documentation; } else { addClass(this.docs, 'markdown-docs'); this.docs.innerHTML = ''; - const renderedContents = this.markdownRenderer.render(item.completion.documentation); + const renderedContents = this.markdownRenderer.render(documentation); this.renderDisposeable = renderedContents; this.docs.appendChild(renderedContents.element); } - if (item.completion.detail) { - this.type.innerText = item.completion.detail; + // --- details + if (detail) { + this.type.innerText = detail; show(this.type); } else { this.type.innerText = ''; @@ -333,8 +350,8 @@ class SuggestionDetails { this.ariaLabel = strings.format( '{0}{1}', - item.completion.detail || '', - item.completion.documentation ? (typeof item.completion.documentation === 'string' ? item.completion.documentation : item.completion.documentation.value) : ''); + detail || '', + documentation ? (typeof documentation === 'string' ? documentation : documentation.value) : ''); } getAriaLabel() { @@ -479,7 +496,7 @@ export class SuggestWidget implements IContentWidget, IListVirtualDelegate toggleClass(this.element, 'no-icons', !this.editor.getConfiguration().contribInfo.suggest.showIcons); applyIconStyle(); From 29dccfdce00e3bd50cc7d5a459206bcd38db8305 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 28 Jun 2019 15:16:28 +0200 Subject: [PATCH 0738/1449] build:single compile --- build/azure-pipelines/compile.yml | 78 ++++++++++ build/azure-pipelines/product-build.yml | 186 ++++++++++++------------ 2 files changed, 174 insertions(+), 90 deletions(-) create mode 100644 build/azure-pipelines/compile.yml diff --git a/build/azure-pipelines/compile.yml b/build/azure-pipelines/compile.yml new file mode 100644 index 00000000000..831a22ccaee --- /dev/null +++ b/build/azure-pipelines/compile.yml @@ -0,0 +1,78 @@ +steps: +- task: AzureKeyVault@1 + displayName: 'Azure Key Vault: Get Secrets' + inputs: + azureSubscription: 'vscode-builds-subscription' + KeyVaultName: vscode + +- task: NodeTool@0 + inputs: + versionSpec: "10.15.1" + +- script: | + set -e + cat << EOF > ~/.netrc + machine monacotools.visualstudio.com + password $(devops-pat) + machine github.com + login vscode + password $(github-distro-mixin-password) + EOF + git config user.email "vscode@microsoft.com" + git config user.name "VSCode" + displayName: Prepare tooling + +- script: | + set -e + git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git" + git fetch distro + git merge $(node -p "require('./package.json').distro") + displayName: Merge distro + +# - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 +# inputs: +# keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' +# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' +# vstsFeed: '$(ArtifactFeed)' + +- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 + inputs: + versionSpec: "1.10.1" + +- script: 'yarn --frozen-lockfile' + displayName: Install Dependencies + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) + +# - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 +# inputs: +# keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' +# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' +# vstsFeed: '$(ArtifactFeed)' +# condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) + +- script: 'yarn gulp mixin' + displayName: Mix in quality + +- script: 'yarn gulp hygiene' + displayName: Run hygiene checks + +- script: 'yarn monaco-compile-check' + displayName: Run Monaco compilation checks + +- script: | + set -e + cd $BUILD_STAGINGDIRECTORY + git clone https://github.com/microsoft/vscode-telemetry-extractor.git + cd vscode-telemetry-extractor + git checkout 3b04aba5bfdfcca1a5426cd2c51a90d18740d0bc + npm i + npm run setup-extension-repos + node ./out/cli-extract.js --sourceDir $BUILD_SOURCESDIRECTORY --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents + node ./out/cli-extract-extensions.js --sourceDir ./src/telemetry-sources --outputDir . --applyEndpoints --includeIsMeasurement + mkdir -p $BUILD_SOURCESDIRECTORY/.build/telemetry + mv declarations-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-core.json + mv declarations-extensions-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-extensions.json + displayName: Extract Telemetry + +- script: 'VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" ./build/azure-pipelines/linux/build.sh' + displayName: Build \ No newline at end of file diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 2e55abb4719..c308c6ffcc4 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -7,103 +7,109 @@ resources: image: snapcore/snapcraft:stable jobs: -- job: Windows - condition: eq(variables['VSCODE_BUILD_WIN32'], 'true') - timeoutInMinutes: 120 - pool: - vmImage: VS2017-Win2016 - variables: - VSCODE_ARCH: x64 - steps: - - template: win32/product-build-win32.yml - -- job: Windows32 - condition: eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true') - timeoutInMinutes: 120 - pool: - vmImage: VS2017-Win2016 - variables: - VSCODE_ARCH: ia32 - steps: - - template: win32/product-build-win32.yml - - job: Linux - condition: eq(variables['VSCODE_BUILD_LINUX'], 'true') - timeoutInMinutes: 120 pool: vmImage: 'Ubuntu-16.04' - variables: - VSCODE_ARCH: x64 - container: vscode-x64 steps: - - template: linux/product-build-linux.yml + - template: compile.yml -- job: LinuxSnap - condition: eq(variables['VSCODE_BUILD_LINUX'], 'true') - timeoutInMinutes: 120 - pool: - vmImage: 'Ubuntu-16.04' - variables: - VSCODE_ARCH: x64 - container: snapcraft - dependsOn: Linux - steps: - - template: linux/snap-build-linux.yml +# - job: Windows +# condition: eq(variables['VSCODE_BUILD_WIN32'], 'true') +# timeoutInMinutes: 120 +# pool: +# vmImage: VS2017-Win2016 +# variables: +# VSCODE_ARCH: x64 +# steps: +# - template: win32/product-build-win32.yml -- job: LinuxArmhf - condition: and(eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) - timeoutInMinutes: 120 - pool: - vmImage: 'Ubuntu-16.04' - variables: - VSCODE_ARCH: armhf - steps: - - template: linux/product-build-linux-arm.yml +# - job: Windows32 +# condition: eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true') +# timeoutInMinutes: 120 +# pool: +# vmImage: VS2017-Win2016 +# variables: +# VSCODE_ARCH: ia32 +# steps: +# - template: win32/product-build-win32.yml -- job: LinuxAlpine - condition: and(eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) - timeoutInMinutes: 120 - pool: - vmImage: 'Ubuntu-16.04' - variables: - VSCODE_ARCH: alpine - steps: - - template: linux/product-build-linux-alpine.yml +# - job: Linux +# condition: eq(variables['VSCODE_BUILD_LINUX'], 'true') +# timeoutInMinutes: 120 +# pool: +# vmImage: 'Ubuntu-16.04' +# variables: +# VSCODE_ARCH: x64 +# container: vscode-x64 +# steps: +# - template: linux/product-build-linux.yml -- job: macOS - condition: eq(variables['VSCODE_BUILD_MACOS'], 'true') - timeoutInMinutes: 120 - pool: - vmImage: macOS 10.13 - steps: - - template: darwin/product-build-darwin.yml +# - job: LinuxSnap +# condition: eq(variables['VSCODE_BUILD_LINUX'], 'true') +# timeoutInMinutes: 120 +# pool: +# vmImage: 'Ubuntu-16.04' +# variables: +# VSCODE_ARCH: x64 +# container: snapcraft +# dependsOn: Linux +# steps: +# - template: linux/snap-build-linux.yml -- job: Release - condition: and(succeeded(), or(eq(variables['VSCODE_RELEASE'], 'true'), and(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['Build.Reason'], 'Schedule')), and(eq(variables['VSCODE_QUALITY'], 'exploration'), eq(variables['Build.SourceBranch'], 'refs/heads/electron-4.0.x')))) - pool: - vmImage: 'Ubuntu-16.04' - dependsOn: - - Windows - - Windows32 - - Linux - - LinuxSnap - - LinuxArmhf - - LinuxAlpine - - macOS - steps: - - template: release.yml +# - job: LinuxArmhf +# condition: and(eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) +# timeoutInMinutes: 120 +# pool: +# vmImage: 'Ubuntu-16.04' +# variables: +# VSCODE_ARCH: armhf +# steps: +# - template: linux/product-build-linux-arm.yml -- job: Mooncake - pool: - vmImage: 'Ubuntu-16.04' - condition: true - dependsOn: - - Windows - - Windows32 - - Linux - - LinuxSnap - - LinuxArmhf - - LinuxAlpine - - macOS - steps: - - template: sync-mooncake.yml \ No newline at end of file +# - job: LinuxAlpine +# condition: and(eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) +# timeoutInMinutes: 120 +# pool: +# vmImage: 'Ubuntu-16.04' +# variables: +# VSCODE_ARCH: alpine +# steps: +# - template: linux/product-build-linux-alpine.yml + +# - job: macOS +# condition: eq(variables['VSCODE_BUILD_MACOS'], 'true') +# timeoutInMinutes: 120 +# pool: +# vmImage: macOS 10.13 +# steps: +# - template: darwin/product-build-darwin.yml + +# - job: Release +# condition: and(succeeded(), or(eq(variables['VSCODE_RELEASE'], 'true'), and(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['Build.Reason'], 'Schedule')), and(eq(variables['VSCODE_QUALITY'], 'exploration'), eq(variables['Build.SourceBranch'], 'refs/heads/electron-4.0.x')))) +# pool: +# vmImage: 'Ubuntu-16.04' +# dependsOn: +# - Windows +# - Windows32 +# - Linux +# - LinuxSnap +# - LinuxArmhf +# - LinuxAlpine +# - macOS +# steps: +# - template: release.yml + +# - job: Mooncake +# pool: +# vmImage: 'Ubuntu-16.04' +# condition: true +# dependsOn: +# - Windows +# - Windows32 +# - Linux +# - LinuxSnap +# - LinuxArmhf +# - LinuxAlpine +# - macOS +# steps: +# - template: sync-mooncake.yml \ No newline at end of file From 9da43bcfb359348cf0cb7d3f8db117a3af3c4d47 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 28 Jun 2019 15:35:36 +0200 Subject: [PATCH 0739/1449] smoke - fix waitForStatusbarText --- test/smoke/src/areas/statusbar/statusbar.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/smoke/src/areas/statusbar/statusbar.ts b/test/smoke/src/areas/statusbar/statusbar.ts index a93976396c2..66e1186fd4c 100644 --- a/test/smoke/src/areas/statusbar/statusbar.ts +++ b/test/smoke/src/areas/statusbar/statusbar.ts @@ -38,7 +38,7 @@ export class StatusBar { } async waitForStatusbarText(title: string, text: string): Promise { - await this.code.waitForTextContent(`${this.mainSelector} span[title="${title}"]`, text); + await this.code.waitForTextContent(`${this.mainSelector} .statusbar-item[title="${title}"]`, text); } private getSelector(element: StatusBarElement): string { From 17ab8c587ac92e4df62c5be485aa01d9d6e90cab Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 28 Jun 2019 16:03:01 +0200 Subject: [PATCH 0740/1449] 1.37.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index addeb5e6aed..29b85f8360d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "code-oss-dev", - "version": "1.36.0", + "version": "1.37.0", "distro": "655dbee333798c5253b03bf8ef1bc8f4fbd3e48b", "author": { "name": "Microsoft Corporation" From 74c354220466463642f06d930cce8f4d4400712d Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 28 Jun 2019 16:18:05 +0200 Subject: [PATCH 0741/1449] gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 57bc86f3664..68834eb43ad 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,9 @@ out-vscode-min/ out-vscode-reh/ out-vscode-reh-min/ out-vscode-reh-pkg/ +out-vscode-web/ +out-vscode-web-min/ +out-vscode-web-pkg/ src/vs/server resources/server build/node_modules From df90bd83bf94bda279c26faccdf23686bf86bc40 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 28 Jun 2019 16:31:23 +0200 Subject: [PATCH 0742/1449] build: remove build scripts --- build/azure-pipelines/darwin/build.sh | 5 ----- build/azure-pipelines/darwin/product-build-darwin.yml | 2 +- build/azure-pipelines/linux/build.sh | 7 ------- build/azure-pipelines/linux/product-build-linux.yml | 9 +++++++-- build/azure-pipelines/win32/build.ps1 | 5 ----- build/azure-pipelines/win32/product-build-win32.yml | 3 ++- 6 files changed, 10 insertions(+), 21 deletions(-) delete mode 100755 build/azure-pipelines/darwin/build.sh delete mode 100755 build/azure-pipelines/linux/build.sh delete mode 100644 build/azure-pipelines/win32/build.ps1 diff --git a/build/azure-pipelines/darwin/build.sh b/build/azure-pipelines/darwin/build.sh deleted file mode 100755 index a47546249fc..00000000000 --- a/build/azure-pipelines/darwin/build.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash -set -e -yarn gulp vscode-darwin-min -yarn gulp vscode-reh-darwin-min -yarn gulp upload-vscode-sourcemaps \ No newline at end of file diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index bcd5bfa57ba..b8d2d4e4a61 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -78,7 +78,7 @@ steps: set -e VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ AZURE_STORAGE_ACCESS_KEY="$(ticino-storage-key)" \ - ./build/azure-pipelines/darwin/build.sh + yarn gulp vscode-darwin-min vscode-reh-darwin-min vscode-web-darwin-min upload-vscode-sourcemaps displayName: Build - script: | diff --git a/build/azure-pipelines/linux/build.sh b/build/azure-pipelines/linux/build.sh deleted file mode 100755 index 1c79d764862..00000000000 --- a/build/azure-pipelines/linux/build.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash -set -e -yarn gulp "vscode-linux-$VSCODE_ARCH-min" - -if [[ "$VSCODE_ARCH" != "ia32" ]]; then - yarn gulp vscode-reh-linux-$VSCODE_ARCH-min -fi \ No newline at end of file diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index bdd1064a8c9..f4df0993390 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -77,8 +77,13 @@ steps: - script: | set -e - VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - ./build/azure-pipelines/linux/build.sh + if [[ "$VSCODE_ARCH" == "ia32" ]]; then + VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ + yarn gulp vscode-linux-$VSCODE_ARCH-min + else + VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ + yarn gulp vscode-linux-$VSCODE_ARCH-min vscode-reh-linux-$VSCODE_ARCH-min vscode-web-linux-$VSCODE_ARCH-min + fi displayName: Build - script: | diff --git a/build/azure-pipelines/win32/build.ps1 b/build/azure-pipelines/win32/build.ps1 deleted file mode 100644 index 8334a87e029..00000000000 --- a/build/azure-pipelines/win32/build.ps1 +++ /dev/null @@ -1,5 +0,0 @@ -. build/azure-pipelines/win32/exec.ps1 -$ErrorActionPreference = "Stop" -exec { yarn gulp "vscode-win32-$env:VSCODE_ARCH-min" } -exec { yarn gulp "vscode-reh-win32-$env:VSCODE_ARCH-min" } -exec { yarn gulp "vscode-win32-$env:VSCODE_ARCH-inno-updater" } \ No newline at end of file diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 09a0f7af93b..f2ab4b92f4d 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -85,7 +85,8 @@ steps: . build/azure-pipelines/win32/exec.ps1 $ErrorActionPreference = "Stop" $env:VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" - .\build\azure-pipelines\win32\build.ps1 + exec { yarn gulp "vscode-win32-$env:VSCODE_ARCH-min" "vscode-reh-win32-$env:VSCODE_ARCH-min" "vscode-web-win32-$env:VSCODE_ARCH-min" } + exec { yarn gulp "vscode-win32-$env:VSCODE_ARCH-inno-updater" } displayName: Build - powershell: | From 9e8b393513061d155e17f45d96fff5737c887291 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 28 Jun 2019 16:31:38 +0200 Subject: [PATCH 0743/1449] enable builds --- build/azure-pipelines/product-build.yml | 192 ++++++++++++------------ 1 file changed, 96 insertions(+), 96 deletions(-) diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index c308c6ffcc4..15c61e913a4 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -7,109 +7,109 @@ resources: image: snapcore/snapcraft:stable jobs: +# - job: Linux +# pool: +# vmImage: 'Ubuntu-16.04' +# steps: +# - template: compile.yml + +- job: Windows + condition: eq(variables['VSCODE_BUILD_WIN32'], 'true') + timeoutInMinutes: 120 + pool: + vmImage: VS2017-Win2016 + variables: + VSCODE_ARCH: x64 + steps: + - template: win32/product-build-win32.yml + +- job: Windows32 + condition: eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true') + timeoutInMinutes: 120 + pool: + vmImage: VS2017-Win2016 + variables: + VSCODE_ARCH: ia32 + steps: + - template: win32/product-build-win32.yml + - job: Linux + condition: eq(variables['VSCODE_BUILD_LINUX'], 'true') + timeoutInMinutes: 120 pool: vmImage: 'Ubuntu-16.04' + variables: + VSCODE_ARCH: x64 + container: vscode-x64 steps: - - template: compile.yml + - template: linux/product-build-linux.yml -# - job: Windows -# condition: eq(variables['VSCODE_BUILD_WIN32'], 'true') -# timeoutInMinutes: 120 -# pool: -# vmImage: VS2017-Win2016 -# variables: -# VSCODE_ARCH: x64 -# steps: -# - template: win32/product-build-win32.yml +- job: LinuxSnap + condition: eq(variables['VSCODE_BUILD_LINUX'], 'true') + timeoutInMinutes: 120 + pool: + vmImage: 'Ubuntu-16.04' + variables: + VSCODE_ARCH: x64 + container: snapcraft + dependsOn: Linux + steps: + - template: linux/snap-build-linux.yml -# - job: Windows32 -# condition: eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true') -# timeoutInMinutes: 120 -# pool: -# vmImage: VS2017-Win2016 -# variables: -# VSCODE_ARCH: ia32 -# steps: -# - template: win32/product-build-win32.yml +- job: LinuxArmhf + condition: and(eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) + timeoutInMinutes: 120 + pool: + vmImage: 'Ubuntu-16.04' + variables: + VSCODE_ARCH: armhf + steps: + - template: linux/product-build-linux-arm.yml -# - job: Linux -# condition: eq(variables['VSCODE_BUILD_LINUX'], 'true') -# timeoutInMinutes: 120 -# pool: -# vmImage: 'Ubuntu-16.04' -# variables: -# VSCODE_ARCH: x64 -# container: vscode-x64 -# steps: -# - template: linux/product-build-linux.yml +- job: LinuxAlpine + condition: and(eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) + timeoutInMinutes: 120 + pool: + vmImage: 'Ubuntu-16.04' + variables: + VSCODE_ARCH: alpine + steps: + - template: linux/product-build-linux-alpine.yml -# - job: LinuxSnap -# condition: eq(variables['VSCODE_BUILD_LINUX'], 'true') -# timeoutInMinutes: 120 -# pool: -# vmImage: 'Ubuntu-16.04' -# variables: -# VSCODE_ARCH: x64 -# container: snapcraft -# dependsOn: Linux -# steps: -# - template: linux/snap-build-linux.yml +- job: macOS + condition: eq(variables['VSCODE_BUILD_MACOS'], 'true') + timeoutInMinutes: 120 + pool: + vmImage: macOS 10.13 + steps: + - template: darwin/product-build-darwin.yml -# - job: LinuxArmhf -# condition: and(eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) -# timeoutInMinutes: 120 -# pool: -# vmImage: 'Ubuntu-16.04' -# variables: -# VSCODE_ARCH: armhf -# steps: -# - template: linux/product-build-linux-arm.yml +- job: Release + condition: and(succeeded(), or(eq(variables['VSCODE_RELEASE'], 'true'), and(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['Build.Reason'], 'Schedule')), and(eq(variables['VSCODE_QUALITY'], 'exploration'), eq(variables['Build.SourceBranch'], 'refs/heads/electron-4.0.x')))) + pool: + vmImage: 'Ubuntu-16.04' + dependsOn: + - Windows + - Windows32 + - Linux + - LinuxSnap + - LinuxArmhf + - LinuxAlpine + - macOS + steps: + - template: release.yml -# - job: LinuxAlpine -# condition: and(eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) -# timeoutInMinutes: 120 -# pool: -# vmImage: 'Ubuntu-16.04' -# variables: -# VSCODE_ARCH: alpine -# steps: -# - template: linux/product-build-linux-alpine.yml - -# - job: macOS -# condition: eq(variables['VSCODE_BUILD_MACOS'], 'true') -# timeoutInMinutes: 120 -# pool: -# vmImage: macOS 10.13 -# steps: -# - template: darwin/product-build-darwin.yml - -# - job: Release -# condition: and(succeeded(), or(eq(variables['VSCODE_RELEASE'], 'true'), and(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['Build.Reason'], 'Schedule')), and(eq(variables['VSCODE_QUALITY'], 'exploration'), eq(variables['Build.SourceBranch'], 'refs/heads/electron-4.0.x')))) -# pool: -# vmImage: 'Ubuntu-16.04' -# dependsOn: -# - Windows -# - Windows32 -# - Linux -# - LinuxSnap -# - LinuxArmhf -# - LinuxAlpine -# - macOS -# steps: -# - template: release.yml - -# - job: Mooncake -# pool: -# vmImage: 'Ubuntu-16.04' -# condition: true -# dependsOn: -# - Windows -# - Windows32 -# - Linux -# - LinuxSnap -# - LinuxArmhf -# - LinuxAlpine -# - macOS -# steps: -# - template: sync-mooncake.yml \ No newline at end of file +- job: Mooncake + pool: + vmImage: 'Ubuntu-16.04' + condition: true + dependsOn: + - Windows + - Windows32 + - Linux + - LinuxSnap + - LinuxArmhf + - LinuxAlpine + - macOS + steps: + - template: sync-mooncake.yml \ No newline at end of file From 037502772b7785bf938492c451da0a0e8d972dc9 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 28 Jun 2019 16:33:25 +0200 Subject: [PATCH 0744/1449] update distro --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index addeb5e6aed..de3b30a1978 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "655dbee333798c5253b03bf8ef1bc8f4fbd3e48b", + "distro": "e3d40aff2a3decbbbb268a0a505c5ddb8a7cc6e1", "author": { "name": "Microsoft Corporation" }, @@ -155,4 +155,4 @@ "windows-mutex": "0.2.1", "windows-process-tree": "0.2.3" } -} +} \ No newline at end of file From 1134ea920c76ee1d0253fc64d25f27417fc5721e Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 28 Jun 2019 16:38:08 +0200 Subject: [PATCH 0745/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index de3b30a1978..6408861f63d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.36.0", - "distro": "e3d40aff2a3decbbbb268a0a505c5ddb8a7cc6e1", + "distro": "52677f13c32f27243902aef937a93074b099ee3e", "author": { "name": "Microsoft Corporation" }, From d1e4a22736cafea6ccaf609d1cbfabafdaef0ee0 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 28 Jun 2019 16:40:05 +0200 Subject: [PATCH 0746/1449] perf - add marks for extension points --- .../services/extensions/common/abstractExtensionService.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/services/extensions/common/abstractExtensionService.ts b/src/vs/workbench/services/extensions/common/abstractExtensionService.ts index 80418f5fad8..246e032b2bc 100644 --- a/src/vs/workbench/services/extensions/common/abstractExtensionService.ts +++ b/src/vs/workbench/services/extensions/common/abstractExtensionService.ts @@ -373,8 +373,9 @@ export abstract class AbstractExtensionService extends Disposable implements IEx }; } } - + perf.mark(`willHandleExtensionPoint/${extensionPoint.name}`); extensionPoint.acceptUsers(users); + perf.mark(`didHandleExtensionPoint/${extensionPoint.name}`); } private _showMessageToUser(severity: Severity, msg: string): void { From 997ee7cf79b9bb3e7a46483efbe8597529327422 Mon Sep 17 00:00:00 2001 From: Prabhanjan S Koushik Date: Fri, 28 Jun 2019 20:12:41 +0530 Subject: [PATCH 0747/1449] Removed uppercase styling and explicity added in SCM (#76286) --- extensions/git/src/repository.ts | 6 +++--- src/vs/workbench/contrib/scm/browser/media/scmViewlet.css | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index bec7ce5ead7..a581f9f5fd4 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -673,9 +673,9 @@ export class Repository implements Disposable { this._sourceControl.inputBox.validateInput = this.validateInput.bind(this); this.disposables.push(this._sourceControl); - this._mergeGroup = this._sourceControl.createResourceGroup('merge', localize('merge changes', "Merge Changes")); - this._indexGroup = this._sourceControl.createResourceGroup('index', localize('staged changes', "Staged Changes")); - this._workingTreeGroup = this._sourceControl.createResourceGroup('workingTree', localize('changes', "Changes")); + this._mergeGroup = this._sourceControl.createResourceGroup('merge', localize('merge changes', "MERGE CHANGES")); + this._indexGroup = this._sourceControl.createResourceGroup('index', localize('staged changes', "STAGED CHANGES")); + this._workingTreeGroup = this._sourceControl.createResourceGroup('workingTree', localize('changes', "CHANGES")); const updateIndexGroupVisibility = () => { const config = workspace.getConfiguration('git', root); diff --git a/src/vs/workbench/contrib/scm/browser/media/scmViewlet.css b/src/vs/workbench/contrib/scm/browser/media/scmViewlet.css index 8bfc4155e42..4ec2bc908e3 100644 --- a/src/vs/workbench/contrib/scm/browser/media/scmViewlet.css +++ b/src/vs/workbench/contrib/scm/browser/media/scmViewlet.css @@ -73,7 +73,6 @@ flex: 1; font-size: 11px; font-weight: bold; - text-transform: uppercase; overflow: hidden; text-overflow: ellipsis; } From abac09b49d5a9fbb27bc2cd1f3911e405c119a88 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 28 Jun 2019 16:51:25 +0200 Subject: [PATCH 0748/1449] debt - remove statusbar registry --- src/vs/base/browser/ui/dropdown/dropdown.ts | 4 + .../parts/statusbar/media/statusbarpart.css | 17 ++-- .../browser/parts/statusbar/statusbar.ts | 59 ----------- .../browser/parts/statusbar/statusbarPart.ts | 18 +--- .../feedback/browser/feedback.contribution.ts | 16 +-- .../contrib/feedback/browser/feedback.ts | 13 +-- .../feedback/browser/feedbackStatusbarItem.ts | 99 +++++++------------ .../feedback/browser/media/feedback.css | 11 --- 8 files changed, 54 insertions(+), 183 deletions(-) delete mode 100644 src/vs/workbench/browser/parts/statusbar/statusbar.ts diff --git a/src/vs/base/browser/ui/dropdown/dropdown.ts b/src/vs/base/browser/ui/dropdown/dropdown.ts index ac1557375b5..1f9217cc9dd 100644 --- a/src/vs/base/browser/ui/dropdown/dropdown.ts +++ b/src/vs/base/browser/ui/dropdown/dropdown.ts @@ -108,6 +108,10 @@ export class BaseDropdown extends ActionRunner { this.visible = false; } + isVisible(): boolean { + return this.visible; + } + protected onEvent(e: Event, activeElement: HTMLElement): void { this.hide(); } diff --git a/src/vs/workbench/browser/parts/statusbar/media/statusbarpart.css b/src/vs/workbench/browser/parts/statusbar/media/statusbarpart.css index 940467dab9b..5c4e22b033c 100644 --- a/src/vs/workbench/browser/parts/statusbar/media/statusbarpart.css +++ b/src/vs/workbench/browser/parts/statusbar/media/statusbarpart.css @@ -75,26 +75,23 @@ padding-right: 10px; } -.monaco-workbench .part.statusbar > .items-container > .statusbar-item a { +.monaco-workbench .part.statusbar > .items-container > .statusbar-item > a { cursor: pointer; display: inline-block; height: 100%; -} - -.monaco-workbench .part.statusbar > .items-container > .statusbar-entry > a { padding: 0 5px 0 5px; white-space: pre; /* gives some degree of styling */ } -.monaco-workbench .part.statusbar > .items-container > .statusbar-entry > a.disabled { +.monaco-workbench .part.statusbar > .items-container > .statusbar-item > a:hover { + text-decoration: none; +} + +.monaco-workbench .part.statusbar > .items-container > .statusbar-item > a.disabled { pointer-events: none; } -.monaco-workbench .part.statusbar > .items-container > .statusbar-entry span.octicon { +.monaco-workbench .part.statusbar > .items-container > .statusbar-item span.octicon { text-align: center; font-size: 14px; } - -.monaco-workbench .part.statusbar > .items-container > .statusbar-item a:hover { - text-decoration: none; -} \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/statusbar/statusbar.ts b/src/vs/workbench/browser/parts/statusbar/statusbar.ts deleted file mode 100644 index 7f1c7b5cb37..00000000000 --- a/src/vs/workbench/browser/parts/statusbar/statusbar.ts +++ /dev/null @@ -1,59 +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 { Registry } from 'vs/platform/registry/common/platform'; -import { IDisposable } from 'vs/base/common/lifecycle'; -import { StatusbarAlignment } from 'vs/platform/statusbar/common/statusbar'; -import { SyncDescriptor0, createSyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; -import { IConstructorSignature0 } from 'vs/platform/instantiation/common/instantiation'; - -export interface IStatusbarItem { - render(element: HTMLElement): IDisposable; -} - -export class StatusbarItemDescriptor { - readonly syncDescriptor: SyncDescriptor0; - readonly id: string; - readonly name: string; - readonly alignment: StatusbarAlignment; - readonly priority: number; - - constructor( - ctor: IConstructorSignature0, - id: string, - name: string, - alignment?: StatusbarAlignment, - priority?: number - ) { - this.id = id; - this.name = name; - this.syncDescriptor = createSyncDescriptor(ctor); - this.alignment = alignment || StatusbarAlignment.LEFT; - this.priority = priority || 0; - } -} - -export interface IStatusbarRegistry { - - readonly items: StatusbarItemDescriptor[]; - - registerStatusbarItem(descriptor: StatusbarItemDescriptor): void; -} - -class StatusbarRegistry implements IStatusbarRegistry { - - private readonly _items: StatusbarItemDescriptor[] = []; - get items(): StatusbarItemDescriptor[] { return this._items; } - - registerStatusbarItem(descriptor: StatusbarItemDescriptor): void { - this._items.push(descriptor); - } -} - -export const Extensions = { - Statusbar: 'workbench.contributions.statusbar' -}; - -Registry.add(Extensions.Statusbar, new StatusbarRegistry()); diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts index 3f68e839a54..9eee470b9c8 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts @@ -8,11 +8,9 @@ import * as nls from 'vs/nls'; import { toErrorMessage } from 'vs/base/common/errorMessage'; import { dispose, IDisposable, Disposable, toDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { OcticonLabel } from 'vs/base/browser/ui/octiconLabel/octiconLabel'; -import { Registry } from 'vs/platform/registry/common/platform'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { Part } from 'vs/workbench/browser/part'; -import { IStatusbarRegistry, Extensions } from 'vs/workbench/browser/parts/statusbar/statusbar'; import { IInstantiationService, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { StatusbarAlignment, IStatusbarService, IStatusbarEntry, IStatusbarEntryAccessor } from 'vs/platform/statusbar/common/statusbar'; @@ -397,7 +395,7 @@ export class StatusbarPart extends Part implements IStatusbarService { private doAddEntry(entry: IStatusbarEntry, id: string, name: string, alignment: StatusbarAlignment, priority: number): IStatusbarEntryAccessor { // Create item - const itemContainer = this.doCreateStatusItem(id, name, alignment, priority, ...coalesce(['statusbar-entry', entry.showBeak ? 'has-beak' : undefined])); + const itemContainer = this.doCreateStatusItem(id, name, alignment, priority, ...coalesce([entry.showBeak ? 'has-beak' : undefined])); const item = this.instantiationService.createInstance(StatusbarEntryItem, itemContainer, entry); // Append to parent @@ -450,20 +448,6 @@ export class StatusbarPart extends Part implements IStatusbarService { } private createInitialStatusbarEntries(): void { - const registry = Registry.as(Extensions.Statusbar); - - // Create initial items that were contributed from the registry - for (const { id, name, alignment, priority, syncDescriptor } of registry.items) { - - // Create item - const item = this.instantiationService.createInstance(syncDescriptor); - const itemContainer = this.doCreateStatusItem(id, name, alignment, priority); - this._register(item.render(itemContainer)); - - // Add to view model - const viewModelEntry: IStatusbarViewModelEntry = { id, name, alignment, priority, container: itemContainer }; - this.viewModel.add(viewModelEntry); - } // Add items in order according to alignment this.appendAllStatusbarEntries(); diff --git a/src/vs/workbench/contrib/feedback/browser/feedback.contribution.ts b/src/vs/workbench/contrib/feedback/browser/feedback.contribution.ts index 10c044082fb..b6d1fa758f6 100644 --- a/src/vs/workbench/contrib/feedback/browser/feedback.contribution.ts +++ b/src/vs/workbench/contrib/feedback/browser/feedback.contribution.ts @@ -4,16 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { Registry } from 'vs/platform/registry/common/platform'; -import { IStatusbarRegistry, Extensions, StatusbarItemDescriptor } from 'vs/workbench/browser/parts/statusbar/statusbar'; -import { StatusbarAlignment } from 'vs/platform/statusbar/common/statusbar'; -import { FeedbackStatusbarItem } from 'vs/workbench/contrib/feedback/browser/feedbackStatusbarItem'; -import { localize } from 'vs/nls'; +import { FeedbackStatusbarConribution } from 'vs/workbench/contrib/feedback/browser/feedbackStatusbarItem'; +import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; +import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; -// Register Statusbar item -Registry.as(Extensions.Statusbar).registerStatusbarItem(new StatusbarItemDescriptor( - FeedbackStatusbarItem, - 'status.feedback', - localize('status.feedback', "Tweet Feedback"), - StatusbarAlignment.RIGHT, - -100 /* towards the end of the right hand side */ -)); +Registry.as(WorkbenchExtensions.Workbench).registerWorkbenchContribution(FeedbackStatusbarConribution, LifecyclePhase.Starting); \ No newline at end of file diff --git a/src/vs/workbench/contrib/feedback/browser/feedback.ts b/src/vs/workbench/contrib/feedback/browser/feedback.ts index be3390b1d38..033a7763448 100644 --- a/src/vs/workbench/contrib/feedback/browser/feedback.ts +++ b/src/vs/workbench/contrib/feedback/browser/feedback.ts @@ -5,7 +5,7 @@ import 'vs/css!./media/feedback'; import * as nls from 'vs/nls'; -import { IDisposable, Disposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { Dropdown } from 'vs/base/browser/ui/dropdown/dropdown'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import * as dom from 'vs/base/browser/dom'; @@ -17,7 +17,6 @@ import { editorWidgetBackground, widgetShadow, inputBorder, inputForeground, inp import { IAnchor } from 'vs/base/browser/ui/contextview/contextview'; import { Button } from 'vs/base/browser/ui/button/button'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { OcticonLabel } from 'vs/base/browser/ui/octiconLabel/octiconLabel'; import { IStatusbarService } from 'vs/platform/statusbar/common/statusbar'; import { IProductService } from 'vs/platform/product/common/product'; @@ -68,15 +67,7 @@ export class FeedbackDropdown extends Dropdown { @IStatusbarService private readonly statusbarService: IStatusbarService, @IProductService productService: IProductService ) { - super(container, { - contextViewProvider: options.contextViewProvider, - labelRenderer: (container: HTMLElement): IDisposable => { - const label = new OcticonLabel(container); - label.text = '$(smiley)'; - - return Disposable.None; - } - }); + super(container, options); this.feedbackDelegate = options.feedbackService; this.maxFeedbackCharacters = this.feedbackDelegate.getCharacterLimit(this.sentiment); diff --git a/src/vs/workbench/contrib/feedback/browser/feedbackStatusbarItem.ts b/src/vs/workbench/contrib/feedback/browser/feedbackStatusbarItem.ts index 873c58fdf58..43d18373cc3 100644 --- a/src/vs/workbench/contrib/feedback/browser/feedbackStatusbarItem.ts +++ b/src/vs/workbench/contrib/feedback/browser/feedbackStatusbarItem.ts @@ -3,16 +3,15 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; -import { IStatusbarItem } from 'vs/workbench/browser/parts/statusbar/statusbar'; +import { Disposable } from 'vs/base/common/lifecycle'; import { FeedbackDropdown, IFeedback, IFeedbackDelegate } from 'vs/workbench/contrib/feedback/browser/feedback'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { Themable, STATUS_BAR_ITEM_HOVER_BACKGROUND } from 'vs/workbench/common/theme'; -import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { clearNode, EventHelper, addClass, removeClass, addDisposableListener } from 'vs/base/browser/dom'; import { IProductService } from 'vs/platform/product/common/product'; +import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; +import { IStatusbarService, StatusbarAlignment, IStatusbarEntry, IStatusbarEntryAccessor } from 'vs/platform/statusbar/common/statusbar'; +import { localize } from 'vs/nls'; +import { CommandsRegistry } from 'vs/platform/commands/common/commands'; class TwitterFeedbackService implements IFeedbackDelegate { @@ -47,76 +46,50 @@ class TwitterFeedbackService implements IFeedbackDelegate { } } -export class FeedbackStatusbarItem extends Themable implements IStatusbarItem { - private dropdown: FeedbackDropdown | undefined; - private container: HTMLElement; +export class FeedbackStatusbarConribution extends Disposable implements IWorkbenchContribution { + private dropdown: FeedbackDropdown; + private entry: IStatusbarEntryAccessor; constructor( - @IInstantiationService private readonly instantiationService: IInstantiationService, - @IContextViewService private readonly contextViewService: IContextViewService, - @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, - @IThemeService themeService: IThemeService, - @IProductService private productService: IProductService + @IStatusbarService statusbarService: IStatusbarService, + @IProductService productService: IProductService, + @IInstantiationService private instantiationService: IInstantiationService, + @IContextViewService private contextViewService: IContextViewService ) { - super(themeService); + super(); - this.registerListeners(); + if (productService.sendASmile) { + this.entry = this._register(statusbarService.addEntry(this.getStatusEntry(), 'status.feedback', localize('status.feedback', "Tweet Feedback"), StatusbarAlignment.RIGHT, -100 /* towards the end of the right hand side */)); + + CommandsRegistry.registerCommand('_feedback.open', () => this.toggleFeedback()); + } } - private registerListeners(): void { - this._register(this.contextService.onDidChangeWorkbenchState(() => this.updateStyles())); - } - - render(element: HTMLElement): IDisposable { - this.container = element; - - // Prevent showing dropdown on anything but left click - this._register(addDisposableListener(this.container, 'mousedown', (e: MouseEvent) => { - if (e.button !== 0) { - EventHelper.stop(e, true); - } - }, true)); - - return this.update(); - } - - private update(): IDisposable { - - // Create - if (this.productService.sendASmile) { - if (!this.dropdown) { - this.dropdown = this._register(this.instantiationService.createInstance(FeedbackDropdown, this.container, { + private toggleFeedback(): void { + if (!this.dropdown) { + const statusContainr = document.getElementById('status.feedback'); + if (statusContainr) { + this.dropdown = this._register(this.instantiationService.createInstance(FeedbackDropdown, statusContainr.getElementsByClassName('octicon').item(0), { contextViewProvider: this.contextViewService, feedbackService: this.instantiationService.createInstance(TwitterFeedbackService), - onFeedbackVisibilityChange: (visible: boolean) => { - if (visible) { - addClass(this.container, 'has-beak'); - } else { - removeClass(this.container, 'has-beak'); - } - } + onFeedbackVisibilityChange: visible => this.entry.update(this.getStatusEntry(visible)) })); - - this.updateStyles(); - - return this.dropdown; } } - // Dispose - else { - dispose(this.dropdown); - this.dropdown = undefined; - clearNode(this.container); + if (!this.dropdown.isVisible()) { + this.dropdown.show(); + } else { + this.dropdown.hide(); } - - return Disposable.None; } -} -registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { - const statusBarItemHoverBackground = theme.getColor(STATUS_BAR_ITEM_HOVER_BACKGROUND); - if (statusBarItemHoverBackground) { - collector.addRule(`.monaco-workbench .part.statusbar > .items-container > .statusbar-item .monaco-dropdown.send-feedback:hover { background-color: ${statusBarItemHoverBackground}; }`); + private getStatusEntry(showBeak?: boolean): IStatusbarEntry { + return { + text: '$(smiley)', + command: '_feedback.open', + showBeak + }; } -}); + +} \ No newline at end of file diff --git a/src/vs/workbench/contrib/feedback/browser/media/feedback.css b/src/vs/workbench/contrib/feedback/browser/media/feedback.css index 8ab8d13c6ff..3520a24c06a 100644 --- a/src/vs/workbench/contrib/feedback/browser/media/feedback.css +++ b/src/vs/workbench/contrib/feedback/browser/media/feedback.css @@ -113,17 +113,6 @@ background-color: #eaeaea; } -/* Statusbar */ -.monaco-workbench .statusbar > .items-container > .statusbar-item > .monaco-dropdown.send-feedback { - display: inline-block; - padding: 0 5px 0 5px; -} - -.monaco-workbench .statusbar > .items-container > .statusbar-item > .monaco-dropdown.send-feedback span.octicon { - text-align: center; - font-size: 14px; -} - /* Theming */ .vs .monaco-workbench .feedback-form .feedback-alias, .vs .monaco-workbench .feedback-form .feedback-description { font-family: inherit; From 0b4d2dcd524f01aaef02937f69ac7f22aca663c8 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 28 Jun 2019 16:52:05 +0200 Subject: [PATCH 0749/1449] debt - reduce scope of local progress service --- .../contrib/codeAction/codeActionCommands.ts | 4 +- .../contrib/codeAction/codeActionModel.ts | 4 +- .../goToDefinition/goToDefinitionCommands.ts | 4 +- src/vs/editor/contrib/rename/rename.ts | 4 +- .../standalone/browser/simpleServices.ts | 6 +- .../standalone/browser/standaloneServices.ts | 6 +- src/vs/platform/progress/common/progress.ts | 24 +- .../workbench/browser/parts/compositePart.ts | 26 +- .../browser/parts/editor/editorControl.ts | 6 +- .../browser/parts/editor/editorGroupView.ts | 6 +- .../preferences/browser/preferencesEditor.ts | 6 +- .../services/panel/common/panelService.ts | 4 +- .../progress/browser/editorProgressService.ts | 13 + ...rogressService.ts => progressIndicator.ts} | 500 +++++++++--------- .../progress/browser/progressService.ts | 10 +- ...vice.test.ts => progressIndicator.test.ts} | 119 ++--- .../services/viewlet/browser/viewlet.ts | 4 +- 17 files changed, 350 insertions(+), 396 deletions(-) create mode 100644 src/vs/workbench/services/progress/browser/editorProgressService.ts rename src/vs/workbench/services/progress/browser/{localProgressService.ts => progressIndicator.ts} (74%) rename src/vs/workbench/services/progress/test/{localProgressService.test.ts => progressIndicator.test.ts} (66%) diff --git a/src/vs/editor/contrib/codeAction/codeActionCommands.ts b/src/vs/editor/contrib/codeAction/codeActionCommands.ts index fbf4917b135..dbe2c213647 100644 --- a/src/vs/editor/contrib/codeAction/codeActionCommands.ts +++ b/src/vs/editor/contrib/codeAction/codeActionCommands.ts @@ -19,7 +19,7 @@ import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/commo import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IMarkerService } from 'vs/platform/markers/common/markers'; -import { ILocalProgressService } from 'vs/platform/progress/common/progress'; +import { IEditorProgressService } from 'vs/platform/progress/common/progress'; import { CodeActionModel, SUPPORTED_CODE_ACTIONS, CodeActionsState } from './codeActionModel'; import { CodeActionAutoApply, CodeActionFilter, CodeActionKind, CodeActionTrigger } from './codeActionTrigger'; import { CodeActionWidget } from './codeActionWidget'; @@ -52,7 +52,7 @@ export class QuickFixController extends Disposable implements IEditorContributio editor: ICodeEditor, @IMarkerService markerService: IMarkerService, @IContextKeyService contextKeyService: IContextKeyService, - @ILocalProgressService progressService: ILocalProgressService, + @IEditorProgressService progressService: IEditorProgressService, @IContextMenuService contextMenuService: IContextMenuService, @ICommandService private readonly _commandService: ICommandService, @IKeybindingService private readonly _keybindingService: IKeybindingService, diff --git a/src/vs/editor/contrib/codeAction/codeActionModel.ts b/src/vs/editor/contrib/codeAction/codeActionModel.ts index 8b6cc5a4863..7e71c64133d 100644 --- a/src/vs/editor/contrib/codeAction/codeActionModel.ts +++ b/src/vs/editor/contrib/codeAction/codeActionModel.ts @@ -14,7 +14,7 @@ import { Selection } from 'vs/editor/common/core/selection'; import { CodeActionProviderRegistry } from 'vs/editor/common/modes'; import { IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IMarkerService } from 'vs/platform/markers/common/markers'; -import { ILocalProgressService } from 'vs/platform/progress/common/progress'; +import { IEditorProgressService } from 'vs/platform/progress/common/progress'; import { getCodeActions, CodeActionSet } from './codeAction'; import { CodeActionTrigger } from './codeActionTrigger'; @@ -167,7 +167,7 @@ export class CodeActionModel extends Disposable { private readonly _editor: ICodeEditor, private readonly _markerService: IMarkerService, contextKeyService: IContextKeyService, - private readonly _progressService?: ILocalProgressService + private readonly _progressService?: IEditorProgressService ) { super(); this._supportedCodeActions = SUPPORTED_CODE_ACTIONS.bindTo(contextKeyService); diff --git a/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.ts b/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.ts index bf6e607945c..baad3f0bb17 100644 --- a/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.ts +++ b/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.ts @@ -25,7 +25,7 @@ import { MenuId, MenuRegistry } from 'vs/platform/actions/common/actions'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { INotificationService } from 'vs/platform/notification/common/notification'; -import { ILocalProgressService } from 'vs/platform/progress/common/progress'; +import { IEditorProgressService } from 'vs/platform/progress/common/progress'; import { getDefinitionsAtPosition, getImplementationsAtPosition, getTypeDefinitionsAtPosition, getDeclarationsAtPosition } from './goToDefinition'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { EditorStateCancellationTokenSource, CodeEditorStateFlag } from 'vs/editor/browser/core/editorState'; @@ -58,7 +58,7 @@ export class DefinitionAction extends EditorAction { } const notificationService = accessor.get(INotificationService); const editorService = accessor.get(ICodeEditorService); - const progressService = accessor.get(ILocalProgressService); + const progressService = accessor.get(IEditorProgressService); const symbolNavService = accessor.get(ISymbolNavigationService); const model = editor.getModel(); diff --git a/src/vs/editor/contrib/rename/rename.ts b/src/vs/editor/contrib/rename/rename.ts index 28ec66cfaf7..ab06982895b 100644 --- a/src/vs/editor/contrib/rename/rename.ts +++ b/src/vs/editor/contrib/rename/rename.ts @@ -7,7 +7,7 @@ import * as nls from 'vs/nls'; import { illegalArgument, onUnexpectedError } from 'vs/base/common/errors'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { ILocalProgressService } from 'vs/platform/progress/common/progress'; +import { IEditorProgressService } from 'vs/platform/progress/common/progress'; import { registerEditorAction, registerEditorContribution, ServicesAccessor, EditorAction, EditorCommand, registerEditorCommand, registerDefaultLanguageCommand } from 'vs/editor/browser/editorExtensions'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { ITextModel } from 'vs/editor/common/model'; @@ -114,7 +114,7 @@ class RenameController extends Disposable implements IEditorContribution { private readonly editor: ICodeEditor, @INotificationService private readonly _notificationService: INotificationService, @IBulkEditService private readonly _bulkEditService: IBulkEditService, - @ILocalProgressService private readonly _progressService: ILocalProgressService, + @IEditorProgressService private readonly _progressService: IEditorProgressService, @IContextKeyService private readonly _contextKeyService: IContextKeyService, @IThemeService private readonly _themeService: IThemeService, ) { diff --git a/src/vs/editor/standalone/browser/simpleServices.ts b/src/vs/editor/standalone/browser/simpleServices.ts index 1f44f246486..56a0f094d6e 100644 --- a/src/vs/editor/standalone/browser/simpleServices.ts +++ b/src/vs/editor/standalone/browser/simpleServices.ts @@ -38,7 +38,7 @@ import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKe import { USLayoutResolvedKeybinding } from 'vs/platform/keybinding/common/usLayoutResolvedKeybinding'; import { ILabelService, ResourceLabelFormatter } from 'vs/platform/label/common/label'; import { INotification, INotificationHandle, INotificationService, IPromptChoice, IPromptOptions, NoOpNotification, IStatusMessageOptions } from 'vs/platform/notification/common/notification'; -import { IProgressRunner, ILocalProgressService } from 'vs/platform/progress/common/progress'; +import { IProgressRunner, IEditorProgressService } from 'vs/platform/progress/common/progress'; import { ITelemetryInfo, ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IWorkspace, IWorkspaceContextService, IWorkspaceFolder, IWorkspaceFoldersChangeEvent, WorkbenchState, WorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; @@ -137,7 +137,7 @@ export class SimpleEditorModelResolverService implements ITextModelService { } } -export class SimpleLocalProgressService implements ILocalProgressService { +export class SimpleEditorProgressService implements IEditorProgressService { _serviceBrand: any; private static NULL_PROGRESS_RUNNER: IProgressRunner = { @@ -149,7 +149,7 @@ export class SimpleLocalProgressService implements ILocalProgressService { show(infinite: true, delay?: number): IProgressRunner; show(total: number, delay?: number): IProgressRunner; show(): IProgressRunner { - return SimpleLocalProgressService.NULL_PROGRESS_RUNNER; + return SimpleEditorProgressService.NULL_PROGRESS_RUNNER; } showWhile(promise: Promise, delay?: number): Promise { diff --git a/src/vs/editor/standalone/browser/standaloneServices.ts b/src/vs/editor/standalone/browser/standaloneServices.ts index 79277379d5e..996798d3d6a 100644 --- a/src/vs/editor/standalone/browser/standaloneServices.ts +++ b/src/vs/editor/standalone/browser/standaloneServices.ts @@ -13,7 +13,7 @@ import { ModeServiceImpl } from 'vs/editor/common/services/modeServiceImpl'; import { IModelService } from 'vs/editor/common/services/modelService'; import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl'; import { ITextResourceConfigurationService, ITextResourcePropertiesService } from 'vs/editor/common/services/resourceConfiguration'; -import { SimpleBulkEditService, SimpleConfigurationService, SimpleDialogService, SimpleNotificationService, SimpleLocalProgressService, SimpleResourceConfigurationService, SimpleResourcePropertiesService, SimpleUriLabelService, SimpleWorkspaceContextService, StandaloneCommandService, StandaloneKeybindingService, StandaloneTelemetryService, SimpleLayoutService } from 'vs/editor/standalone/browser/simpleServices'; +import { SimpleBulkEditService, SimpleConfigurationService, SimpleDialogService, SimpleNotificationService, SimpleEditorProgressService, SimpleResourceConfigurationService, SimpleResourcePropertiesService, SimpleUriLabelService, SimpleWorkspaceContextService, StandaloneCommandService, StandaloneKeybindingService, StandaloneTelemetryService, SimpleLayoutService } from 'vs/editor/standalone/browser/simpleServices'; import { StandaloneCodeEditorServiceImpl } from 'vs/editor/standalone/browser/standaloneCodeServiceImpl'; import { StandaloneThemeServiceImpl } from 'vs/editor/standalone/browser/standaloneThemeServiceImpl'; import { IStandaloneThemeService } from 'vs/editor/standalone/common/standaloneThemeService'; @@ -36,7 +36,7 @@ import { ILogService, NullLogService } from 'vs/platform/log/common/log'; import { MarkerService } from 'vs/platform/markers/common/markerService'; import { IMarkerService } from 'vs/platform/markers/common/markers'; import { INotificationService } from 'vs/platform/notification/common/notification'; -import { ILocalProgressService } from 'vs/platform/progress/common/progress'; +import { IEditorProgressService } from 'vs/platform/progress/common/progress'; import { IStorageService, InMemoryStorageService } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IThemeService } from 'vs/platform/theme/common/themeService'; @@ -154,7 +154,7 @@ export module StaticServices { export const codeEditorService = define(ICodeEditorService, (o) => new StandaloneCodeEditorServiceImpl(standaloneThemeService.get(o))); - export const localProgressService = define(ILocalProgressService, () => new SimpleLocalProgressService()); + export const editorProgressService = define(IEditorProgressService, () => new SimpleEditorProgressService()); export const storageService = define(IStorageService, () => new InMemoryStorageService()); diff --git a/src/vs/platform/progress/common/progress.ts b/src/vs/platform/progress/common/progress.ts index 1e1162f640f..634b38b1929 100644 --- a/src/vs/platform/progress/common/progress.ts +++ b/src/vs/platform/progress/common/progress.ts @@ -20,15 +20,7 @@ export interface IProgressService { withProgress(options: IProgressOptions | IProgressNotificationOptions | IProgressCompositeOptions, task: (progress: IProgress) => Promise, onDidCancel?: () => void): Promise; } -export const ILocalProgressService = createDecorator('localProgressService'); - -/** - * A progress service that will report progress local to the UI piece triggered from. E.g. - * if used from an action of a viewlet, the progress will be reported in that viewlet. - */ -export interface ILocalProgressService { - - _serviceBrand: ServiceIdentifier; +export interface IProgressIndicator { /** * Show progress customized with the provided flags. @@ -132,7 +124,7 @@ export class LongRunningOperation extends Disposable { private currentProgressTimeout: any; constructor( - private localProgressService: ILocalProgressService + private progressIndicator: IProgressIndicator ) { super(); } @@ -147,7 +139,7 @@ export class LongRunningOperation extends Disposable { const newOperationToken = new CancellationTokenSource(); this.currentProgressTimeout = setTimeout(() => { if (newOperationId === this.currentOperationId) { - this.currentProgressRunner = this.localProgressService.show(true); + this.currentProgressRunner = this.progressIndicator.show(true); } }, progressDelay); @@ -173,3 +165,13 @@ export class LongRunningOperation extends Disposable { } } } + +export const IEditorProgressService = createDecorator('editorProgressService'); + +/** + * A progress service that will report progress local to the editor triggered from. + */ +export interface IEditorProgressService extends IProgressIndicator { + + _serviceBrand: ServiceIdentifier; +} diff --git a/src/vs/workbench/browser/parts/compositePart.ts b/src/vs/workbench/browser/parts/compositePart.ts index 8be3d84e29e..7b10d5f06c5 100644 --- a/src/vs/workbench/browser/parts/compositePart.ts +++ b/src/vs/workbench/browser/parts/compositePart.ts @@ -18,13 +18,12 @@ import { IAction } from 'vs/base/common/actions'; import { Part, IPartOptions } from 'vs/workbench/browser/part'; import { Composite, CompositeRegistry } from 'vs/workbench/browser/composite'; import { IComposite } from 'vs/workbench/common/composite'; -import { ScopedProgressService } from 'vs/workbench/services/progress/browser/localProgressService'; +import { CompositeProgressIndicator } from 'vs/workbench/services/progress/browser/progressIndicator'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; -import { ILocalProgressService } from 'vs/platform/progress/common/progress'; +import { IProgressIndicator } from 'vs/platform/progress/common/progress'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IThemeService } from 'vs/platform/theme/common/themeService'; @@ -50,7 +49,7 @@ export interface ICompositeTitleLabel { interface CompositeItem { composite: Composite; disposable: IDisposable; - localProgressService: ILocalProgressService; + progress: IProgressIndicator; } export abstract class CompositePart extends Part { @@ -169,17 +168,18 @@ export abstract class CompositePart extends Part { // Instantiate composite from registry otherwise const compositeDescriptor = this.registry.getComposite(id); if (compositeDescriptor) { - const localProgressService = this.instantiationService.createInstance(ScopedProgressService, this.progressBar, compositeDescriptor.id, isActive); - const compositeInstantiationService = this.instantiationService.createChild(new ServiceCollection([ILocalProgressService, localProgressService])); - - const composite = compositeDescriptor.instantiate(compositeInstantiationService); - const disposables = new DisposableStore(); + const composite = compositeDescriptor.instantiate(this.instantiationService); + const disposable = new DisposableStore(); // Remember as Instantiated - this.instantiatedCompositeItems.set(id, { composite, disposable: disposables, localProgressService }); + this.instantiatedCompositeItems.set(id, { + composite, + disposable, + progress: this._register(this.instantiationService.createInstance(CompositeProgressIndicator, this.progressBar, compositeDescriptor.id, isActive)) + }); // Register to title area update events from the composite - disposables.add(composite.onTitleAreaUpdate(() => this.onTitleAreaUpdate(composite.getId()), this)); + disposable.add(composite.onTitleAreaUpdate(() => this.onTitleAreaUpdate(composite.getId()), this)); return composite; } @@ -451,10 +451,10 @@ export abstract class CompositePart extends Part { return contentContainer; } - getProgressIndicator(id: string): ILocalProgressService | null { + getProgressIndicator(id: string): IProgressIndicator | null { const compositeItem = this.instantiatedCompositeItems.get(id); - return compositeItem ? compositeItem.localProgressService : null; + return compositeItem ? compositeItem.progress : null; } protected getActions(): ReadonlyArray { diff --git a/src/vs/workbench/browser/parts/editor/editorControl.ts b/src/vs/workbench/browser/parts/editor/editorControl.ts index a3c50f7011a..646ecb46f2c 100644 --- a/src/vs/workbench/browser/parts/editor/editorControl.ts +++ b/src/vs/workbench/browser/parts/editor/editorControl.ts @@ -11,7 +11,7 @@ import { IEditorRegistry, Extensions as EditorExtensions, IEditorDescriptor } fr import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ILocalProgressService, LongRunningOperation } from 'vs/platform/progress/common/progress'; +import { IEditorProgressService, LongRunningOperation } from 'vs/platform/progress/common/progress'; import { IEditorGroupView, DEFAULT_EDITOR_MIN_DIMENSIONS, DEFAULT_EDITOR_MAX_DIMENSIONS } from 'vs/workbench/browser/parts/editor/editor'; import { Event, Emitter } from 'vs/base/common/event'; import { IVisibleEditor } from 'vs/workbench/services/editor/common/editorService'; @@ -47,11 +47,11 @@ export class EditorControl extends Disposable { private groupView: IEditorGroupView, @IWorkbenchLayoutService private readonly layoutService: IWorkbenchLayoutService, @IInstantiationService private readonly instantiationService: IInstantiationService, - @ILocalProgressService localProgressService: ILocalProgressService + @IEditorProgressService editorProgressService: IEditorProgressService ) { super(); - this.editorOperation = this._register(new LongRunningOperation(localProgressService)); + this.editorOperation = this._register(new LongRunningOperation(editorProgressService)); } get activeControl(): IVisibleEditor | null { diff --git a/src/vs/workbench/browser/parts/editor/editorGroupView.ts b/src/vs/workbench/browser/parts/editor/editorGroupView.ts index 5aa9e32bb4b..323f41a55cb 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupView.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupView.ts @@ -20,8 +20,8 @@ import { Themable, EDITOR_GROUP_HEADER_TABS_BORDER, EDITOR_GROUP_HEADER_TABS_BAC import { IMoveEditorOptions, ICopyEditorOptions, ICloseEditorsFilter, IGroupChangeEvent, GroupChangeKind, EditorsOrder, GroupsOrder, ICloseEditorOptions } from 'vs/workbench/services/editor/common/editorGroupsService'; import { TabsTitleControl } from 'vs/workbench/browser/parts/editor/tabsTitleControl'; import { EditorControl } from 'vs/workbench/browser/parts/editor/editorControl'; -import { ILocalProgressService } from 'vs/platform/progress/common/progress'; -import { LocalProgressService } from 'vs/workbench/services/progress/browser/localProgressService'; +import { IEditorProgressService } from 'vs/platform/progress/common/progress'; +import { EditorProgressService } from 'vs/workbench/services/progress/browser/editorProgressService'; import { localize } from 'vs/nls'; import { isPromiseCanceledError } from 'vs/base/common/errors'; import { dispose, MutableDisposable } from 'vs/base/common/lifecycle'; @@ -178,7 +178,7 @@ export class EditorGroupView extends Themable implements IEditorGroupView { const scopedContextKeyService = this._register(this.contextKeyService.createScoped(this.element)); this.scopedInstantiationService = this.instantiationService.createChild(new ServiceCollection( [IContextKeyService, scopedContextKeyService], - [ILocalProgressService, new LocalProgressService(this.progressBar)] + [IEditorProgressService, new EditorProgressService(this.progressBar)] )); // Context keys diff --git a/src/vs/workbench/contrib/preferences/browser/preferencesEditor.ts b/src/vs/workbench/contrib/preferences/browser/preferencesEditor.ts index 2600517f9b1..6912a5f72a6 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferencesEditor.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferencesEditor.ts @@ -31,7 +31,7 @@ import { ConfigurationTarget } from 'vs/platform/configuration/common/configurat import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ILogService } from 'vs/platform/log/common/log'; -import { ILocalProgressService } from 'vs/platform/progress/common/progress'; +import { IEditorProgressService } from 'vs/platform/progress/common/progress'; import { Registry } from 'vs/platform/registry/common/platform'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -94,7 +94,7 @@ export class PreferencesEditor extends BaseEditor { @IContextKeyService private readonly contextKeyService: IContextKeyService, @IInstantiationService private readonly instantiationService: IInstantiationService, @IThemeService themeService: IThemeService, - @ILocalProgressService private readonly progressService: ILocalProgressService, + @IEditorProgressService private readonly editorProgressService: IEditorProgressService, @IStorageService storageService: IStorageService ) { super(PreferencesEditor.ID, telemetryService, themeService, storageService); @@ -237,7 +237,7 @@ export class PreferencesEditor extends BaseEditor { if (query) { return Promise.all([ this.localSearchDelayer.trigger(() => this.preferencesRenderers.localFilterPreferences(query).then(() => { })), - this.remoteSearchThrottle.trigger(() => Promise.resolve(this.progressService.showWhile(this.preferencesRenderers.remoteSearchPreferences(query), 500))) + this.remoteSearchThrottle.trigger(() => Promise.resolve(this.editorProgressService.showWhile(this.preferencesRenderers.remoteSearchPreferences(query), 500))) ]).then(() => { }); } else { // When clearing the input, update immediately to clear it diff --git a/src/vs/workbench/services/panel/common/panelService.ts b/src/vs/workbench/services/panel/common/panelService.ts index 501f6f8df8c..9e957d61747 100644 --- a/src/vs/workbench/services/panel/common/panelService.ts +++ b/src/vs/workbench/services/panel/common/panelService.ts @@ -8,7 +8,7 @@ import { IPanel } from 'vs/workbench/common/panel'; import { createDecorator, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; import { IBadge } from 'vs/workbench/services/activity/common/activity'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { ILocalProgressService } from 'vs/platform/progress/common/progress'; +import { IProgressIndicator } from 'vs/platform/progress/common/progress'; export const IPanelService = createDecorator('panelService'); @@ -53,7 +53,7 @@ export interface IPanelService { /** * Returns the progress indicator for the panel bar. */ - getProgressIndicator(id: string): ILocalProgressService | null; + getProgressIndicator(id: string): IProgressIndicator | null; /** * Show an activity in a panel. diff --git a/src/vs/workbench/services/progress/browser/editorProgressService.ts b/src/vs/workbench/services/progress/browser/editorProgressService.ts new file mode 100644 index 00000000000..7ea3daae18e --- /dev/null +++ b/src/vs/workbench/services/progress/browser/editorProgressService.ts @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IEditorProgressService } from 'vs/platform/progress/common/progress'; +import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; +import { ProgressBarIndicator } from 'vs/workbench/services/progress/browser/progressIndicator'; + +export class EditorProgressService extends ProgressBarIndicator { + + _serviceBrand: ServiceIdentifier; +} diff --git a/src/vs/workbench/services/progress/browser/localProgressService.ts b/src/vs/workbench/services/progress/browser/progressIndicator.ts similarity index 74% rename from src/vs/workbench/services/progress/browser/localProgressService.ts rename to src/vs/workbench/services/progress/browser/progressIndicator.ts index 2f2932873d7..1d11c084f7c 100644 --- a/src/vs/workbench/services/progress/browser/localProgressService.ts +++ b/src/vs/workbench/services/progress/browser/progressIndicator.ts @@ -4,263 +4,13 @@ *--------------------------------------------------------------------------------------------*/ import { Disposable } from 'vs/base/common/lifecycle'; -import * as types from 'vs/base/common/types'; +import { isUndefinedOrNull } from 'vs/base/common/types'; import { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; -import { ILocalProgressService, IProgressRunner } from 'vs/platform/progress/common/progress'; -import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; +import { IProgressRunner, IProgressIndicator } from 'vs/platform/progress/common/progress'; -namespace ProgressState { - - export const enum Type { - None, - Done, - Infinite, - While, - Work - } - - export const None = new class { readonly type = Type.None; }; - export const Done = new class { readonly type = Type.Done; }; - export const Infinite = new class { readonly type = Type.Infinite; }; - - export class While { - readonly type = Type.While; - - constructor( - readonly whilePromise: Promise, - readonly whileStart: number, - readonly whileDelay: number, - ) { } - } - - export class Work { - readonly type = Type.Work; - - constructor( - readonly total: number | undefined, - readonly worked: number | undefined - ) { } - } - - export type State = - typeof None - | typeof Done - | typeof Infinite - | While - | Work; -} - -export abstract class ScopedService extends Disposable { - - constructor( - private viewletService: IViewletService, - private panelService: IPanelService, - private scopeId: string - ) { - super(); - - this.registerListeners(); - } - - registerListeners(): void { - this._register(this.viewletService.onDidViewletOpen(viewlet => this.onScopeOpened(viewlet.getId()))); - this._register(this.panelService.onDidPanelOpen(({ panel }) => this.onScopeOpened(panel.getId()))); - - this._register(this.viewletService.onDidViewletClose(viewlet => this.onScopeClosed(viewlet.getId()))); - this._register(this.panelService.onDidPanelClose(panel => this.onScopeClosed(panel.getId()))); - } - - private onScopeClosed(scopeId: string) { - if (scopeId === this.scopeId) { - this.onScopeDeactivated(); - } - } - - private onScopeOpened(scopeId: string) { - if (scopeId === this.scopeId) { - this.onScopeActivated(); - } - } - - abstract onScopeActivated(): void; - - abstract onScopeDeactivated(): void; -} - -export class ScopedProgressService extends ScopedService implements ILocalProgressService { - - _serviceBrand: ServiceIdentifier; - - private isActive: boolean; - private progressbar: ProgressBar; - private progressState: ProgressState.State = ProgressState.None; - - constructor( - progressbar: ProgressBar, - scopeId: string, - isActive: boolean, - @IViewletService viewletService: IViewletService, - @IPanelService panelService: IPanelService - ) { - super(viewletService, panelService, scopeId); - - this.progressbar = progressbar; - this.isActive = isActive || types.isUndefinedOrNull(scopeId); // If service is unscoped, enable by default - } - - onScopeDeactivated(): void { - this.isActive = false; - } - - onScopeActivated(): void { - this.isActive = true; - - // Return early if progress state indicates that progress is done - if (this.progressState.type === ProgressState.Done.type) { - return; - } - - // Replay Infinite Progress from Promise - if (this.progressState.type === ProgressState.Type.While) { - let delay: number | undefined; - if (this.progressState.whileDelay > 0) { - const remainingDelay = this.progressState.whileDelay - (Date.now() - this.progressState.whileStart); - if (remainingDelay > 0) { - delay = remainingDelay; - } - } - - this.doShowWhile(delay); - } - - // Replay Infinite Progress - else if (this.progressState.type === ProgressState.Type.Infinite) { - this.progressbar.infinite().show(); - } - - // Replay Finite Progress (Total & Worked) - else if (this.progressState.type === ProgressState.Type.Work) { - if (this.progressState.total) { - this.progressbar.total(this.progressState.total).show(); - } - - if (this.progressState.worked) { - this.progressbar.worked(this.progressState.worked).show(); - } - } - } - - show(infinite: true, delay?: number): IProgressRunner; - show(total: number, delay?: number): IProgressRunner; - show(infiniteOrTotal: true | number, delay?: number): IProgressRunner { - - // Sort out Arguments - if (typeof infiniteOrTotal === 'boolean') { - this.progressState = ProgressState.Infinite; - } else { - this.progressState = new ProgressState.Work(infiniteOrTotal, undefined); - } - - // Active: Show Progress - if (this.isActive) { - - // Infinite: Start Progressbar and Show after Delay - if (this.progressState.type === ProgressState.Type.Infinite) { - this.progressbar.infinite().show(delay); - } - - // Finite: Start Progressbar and Show after Delay - else if (this.progressState.type === ProgressState.Type.Work && typeof this.progressState.total === 'number') { - this.progressbar.total(this.progressState.total).show(delay); - } - } - - return { - total: (total: number) => { - this.progressState = new ProgressState.Work( - total, - this.progressState.type === ProgressState.Type.Work ? this.progressState.worked : undefined); - - if (this.isActive) { - this.progressbar.total(total); - } - }, - - worked: (worked: number) => { - - // Verify first that we are either not active or the progressbar has a total set - if (!this.isActive || this.progressbar.hasTotal()) { - this.progressState = new ProgressState.Work( - this.progressState.type === ProgressState.Type.Work ? this.progressState.total : undefined, - this.progressState.type === ProgressState.Type.Work && typeof this.progressState.worked === 'number' ? this.progressState.worked + worked : worked); - - if (this.isActive) { - this.progressbar.worked(worked); - } - } - - // Otherwise the progress bar does not support worked(), we fallback to infinite() progress - else { - this.progressState = ProgressState.Infinite; - this.progressbar.infinite().show(); - } - }, - - done: () => { - this.progressState = ProgressState.Done; - - if (this.isActive) { - this.progressbar.stop().hide(); - } - } - }; - } - - async showWhile(promise: Promise, delay?: number): Promise { - - // Join with existing running promise to ensure progress is accurate - if (this.progressState.type === ProgressState.Type.While) { - promise = Promise.all([promise, this.progressState.whilePromise]); - } - - // Keep Promise in State - this.progressState = new ProgressState.While(promise, delay || 0, Date.now()); - - try { - this.doShowWhile(delay); - - await promise; - } catch (error) { - // ignore - } finally { - - // If this is not the last promise in the list of joined promises, skip this - if (this.progressState.type !== ProgressState.Type.While || this.progressState.whilePromise === promise) { - - // The while promise is either null or equal the promise we last hooked on - this.progressState = ProgressState.None; - - if (this.isActive) { - this.progressbar.stop().hide(); - } - } - } - } - - private doShowWhile(delay?: number): void { - - // Show Progress when active - if (this.isActive) { - this.progressbar.infinite().show(delay); - } - } -} - -export class LocalProgressService implements ILocalProgressService { - - _serviceBrand: ServiceIdentifier; +export class ProgressBarIndicator implements IProgressIndicator { constructor(private progressbar: ProgressBar) { } @@ -304,3 +54,247 @@ export class LocalProgressService implements ILocalProgressService { } } } + +namespace ProgressIndicatorState { + + export const enum Type { + None, + Done, + Infinite, + While, + Work + } + + export const None = new class { readonly type = Type.None; }; + export const Done = new class { readonly type = Type.Done; }; + export const Infinite = new class { readonly type = Type.Infinite; }; + + export class While { + readonly type = Type.While; + + constructor( + readonly whilePromise: Promise, + readonly whileStart: number, + readonly whileDelay: number, + ) { } + } + + export class Work { + readonly type = Type.Work; + + constructor( + readonly total: number | undefined, + readonly worked: number | undefined + ) { } + } + + export type State = + typeof None + | typeof Done + | typeof Infinite + | While + | Work; +} + +export abstract class CompositeScope extends Disposable { + + constructor( + private viewletService: IViewletService, + private panelService: IPanelService, + private scopeId: string + ) { + super(); + + this.registerListeners(); + } + + registerListeners(): void { + this._register(this.viewletService.onDidViewletOpen(viewlet => this.onScopeOpened(viewlet.getId()))); + this._register(this.panelService.onDidPanelOpen(({ panel }) => this.onScopeOpened(panel.getId()))); + + this._register(this.viewletService.onDidViewletClose(viewlet => this.onScopeClosed(viewlet.getId()))); + this._register(this.panelService.onDidPanelClose(panel => this.onScopeClosed(panel.getId()))); + } + + private onScopeClosed(scopeId: string) { + if (scopeId === this.scopeId) { + this.onScopeDeactivated(); + } + } + + private onScopeOpened(scopeId: string) { + if (scopeId === this.scopeId) { + this.onScopeActivated(); + } + } + + abstract onScopeActivated(): void; + + abstract onScopeDeactivated(): void; +} + +export class CompositeProgressIndicator extends CompositeScope implements IProgressIndicator { + private isActive: boolean; + private progressbar: ProgressBar; + private progressState: ProgressIndicatorState.State = ProgressIndicatorState.None; + + constructor( + progressbar: ProgressBar, + scopeId: string, + isActive: boolean, + @IViewletService viewletService: IViewletService, + @IPanelService panelService: IPanelService + ) { + super(viewletService, panelService, scopeId); + + this.progressbar = progressbar; + this.isActive = isActive || isUndefinedOrNull(scopeId); // If service is unscoped, enable by default + } + + onScopeDeactivated(): void { + this.isActive = false; + } + + onScopeActivated(): void { + this.isActive = true; + + // Return early if progress state indicates that progress is done + if (this.progressState.type === ProgressIndicatorState.Done.type) { + return; + } + + // Replay Infinite Progress from Promise + if (this.progressState.type === ProgressIndicatorState.Type.While) { + let delay: number | undefined; + if (this.progressState.whileDelay > 0) { + const remainingDelay = this.progressState.whileDelay - (Date.now() - this.progressState.whileStart); + if (remainingDelay > 0) { + delay = remainingDelay; + } + } + + this.doShowWhile(delay); + } + + // Replay Infinite Progress + else if (this.progressState.type === ProgressIndicatorState.Type.Infinite) { + this.progressbar.infinite().show(); + } + + // Replay Finite Progress (Total & Worked) + else if (this.progressState.type === ProgressIndicatorState.Type.Work) { + if (this.progressState.total) { + this.progressbar.total(this.progressState.total).show(); + } + + if (this.progressState.worked) { + this.progressbar.worked(this.progressState.worked).show(); + } + } + } + + show(infinite: true, delay?: number): IProgressRunner; + show(total: number, delay?: number): IProgressRunner; + show(infiniteOrTotal: true | number, delay?: number): IProgressRunner { + + // Sort out Arguments + if (typeof infiniteOrTotal === 'boolean') { + this.progressState = ProgressIndicatorState.Infinite; + } else { + this.progressState = new ProgressIndicatorState.Work(infiniteOrTotal, undefined); + } + + // Active: Show Progress + if (this.isActive) { + + // Infinite: Start Progressbar and Show after Delay + if (this.progressState.type === ProgressIndicatorState.Type.Infinite) { + this.progressbar.infinite().show(delay); + } + + // Finite: Start Progressbar and Show after Delay + else if (this.progressState.type === ProgressIndicatorState.Type.Work && typeof this.progressState.total === 'number') { + this.progressbar.total(this.progressState.total).show(delay); + } + } + + return { + total: (total: number) => { + this.progressState = new ProgressIndicatorState.Work( + total, + this.progressState.type === ProgressIndicatorState.Type.Work ? this.progressState.worked : undefined); + + if (this.isActive) { + this.progressbar.total(total); + } + }, + + worked: (worked: number) => { + + // Verify first that we are either not active or the progressbar has a total set + if (!this.isActive || this.progressbar.hasTotal()) { + this.progressState = new ProgressIndicatorState.Work( + this.progressState.type === ProgressIndicatorState.Type.Work ? this.progressState.total : undefined, + this.progressState.type === ProgressIndicatorState.Type.Work && typeof this.progressState.worked === 'number' ? this.progressState.worked + worked : worked); + + if (this.isActive) { + this.progressbar.worked(worked); + } + } + + // Otherwise the progress bar does not support worked(), we fallback to infinite() progress + else { + this.progressState = ProgressIndicatorState.Infinite; + this.progressbar.infinite().show(); + } + }, + + done: () => { + this.progressState = ProgressIndicatorState.Done; + + if (this.isActive) { + this.progressbar.stop().hide(); + } + } + }; + } + + async showWhile(promise: Promise, delay?: number): Promise { + + // Join with existing running promise to ensure progress is accurate + if (this.progressState.type === ProgressIndicatorState.Type.While) { + promise = Promise.all([promise, this.progressState.whilePromise]); + } + + // Keep Promise in State + this.progressState = new ProgressIndicatorState.While(promise, delay || 0, Date.now()); + + try { + this.doShowWhile(delay); + + await promise; + } catch (error) { + // ignore + } finally { + + // If this is not the last promise in the list of joined promises, skip this + if (this.progressState.type !== ProgressIndicatorState.Type.While || this.progressState.whilePromise === promise) { + + // The while promise is either null or equal the promise we last hooked on + this.progressState = ProgressIndicatorState.None; + + if (this.isActive) { + this.progressbar.stop().hide(); + } + } + } + } + + private doShowWhile(delay?: number): void { + + // Show Progress when active + if (this.isActive) { + this.progressbar.infinite().show(delay); + } + } +} diff --git a/src/vs/workbench/services/progress/browser/progressService.ts b/src/vs/workbench/services/progress/browser/progressService.ts index 852faf28a93..d7bb38745a1 100644 --- a/src/vs/workbench/services/progress/browser/progressService.ts +++ b/src/vs/workbench/services/progress/browser/progressService.ts @@ -7,7 +7,7 @@ import 'vs/css!./media/progressService'; import { localize } from 'vs/nls'; import { IDisposable, dispose, DisposableStore, MutableDisposable, Disposable } from 'vs/base/common/lifecycle'; -import { IProgressService, IProgressOptions, IProgressStep, ProgressLocation, IProgress, Progress, IProgressCompositeOptions, IProgressNotificationOptions, IProgressRunner, ILocalProgressService } from 'vs/platform/progress/common/progress'; +import { IProgressService, IProgressOptions, IProgressStep, ProgressLocation, IProgress, Progress, IProgressCompositeOptions, IProgressNotificationOptions, IProgressRunner, IProgressIndicator } from 'vs/platform/progress/common/progress'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { StatusbarAlignment, IStatusbarService } from 'vs/platform/statusbar/common/statusbar'; import { timeout } from 'vs/base/common/async'; @@ -286,7 +286,7 @@ export class ProgressService extends Disposable implements IProgressService { return this.withCompositeProgress(this.panelService.getProgressIndicator(panelid), task, options); } - private withCompositeProgress

, R = unknown>(compositeProgressService: ILocalProgressService | null, task: (progress: IProgress) => P, options: IProgressCompositeOptions): P { + private withCompositeProgress

, R = unknown>(progressIndicator: IProgressIndicator | null, task: (progress: IProgress) => P, options: IProgressCompositeOptions): P { let progressRunner: IProgressRunner | undefined = undefined; const promise = task({ @@ -305,12 +305,12 @@ export class ProgressService extends Disposable implements IProgressService { } }); - if (compositeProgressService) { + if (progressIndicator) { if (typeof options.total === 'number') { - progressRunner = compositeProgressService.show(options.total, options.delay); + progressRunner = progressIndicator.show(options.total, options.delay); promise.catch(() => undefined /* ignore */).finally(() => progressRunner ? progressRunner.done() : undefined); } else { - compositeProgressService.showWhile(promise, options.delay); + progressIndicator.showWhile(promise, options.delay); } } diff --git a/src/vs/workbench/services/progress/test/localProgressService.test.ts b/src/vs/workbench/services/progress/test/progressIndicator.test.ts similarity index 66% rename from src/vs/workbench/services/progress/test/localProgressService.test.ts rename to src/vs/workbench/services/progress/test/progressIndicator.test.ts index dad585ef4f0..a8d2b740d0b 100644 --- a/src/vs/workbench/services/progress/test/localProgressService.test.ts +++ b/src/vs/workbench/services/progress/test/progressIndicator.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { IAction, IActionViewItem } from 'vs/base/common/actions'; import { IEditorControl } from 'vs/workbench/common/editor'; -import { ScopedProgressService, ScopedService } from 'vs/workbench/services/progress/browser/localProgressService'; +import { CompositeScope, CompositeProgressIndicator } from 'vs/workbench/services/progress/browser/progressIndicator'; 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'; @@ -16,106 +16,55 @@ class TestViewlet implements IViewlet { constructor(private id: string) { } - getId(): string { - return this.id; - } - - /** - * Returns the name of this composite to show in the title area. - */ - getTitle(): string { - return this.id; - } - - /** - * Returns the primary actions of the composite. - */ - getActions(): IAction[] { - return []; - } - - /** - * Returns the secondary actions of the composite. - */ - getSecondaryActions(): IAction[] { - return []; - } - - /** - * Returns an array of actions to show in the context menu of the composite - */ - public getContextMenuActions(): IAction[] { - return []; - } - - /** - * Returns the action item for a specific action. - */ - getActionViewItem(action: IAction): IActionViewItem { - return null!; - } - - /** - * Returns the underlying control of this composite. - */ - getControl(): IEditorControl { - return null!; - } - - /** - * Asks the underlying control to focus. - */ - focus(): void { - } - - getOptimalWidth(): number { - return 10; - } + getId(): string { return this.id; } + getTitle(): string { return this.id; } + getActions(): IAction[] { return []; } + getSecondaryActions(): IAction[] { return []; } + getContextMenuActions(): IAction[] { return []; } + getActionViewItem(action: IAction): IActionViewItem { return null!; } + getControl(): IEditorControl { return null!; } + focus(): void { } + getOptimalWidth(): number { return 10; } } -class TestScopedService extends ScopedService { - public isActive: boolean; +class TestCompositeScope extends CompositeScope { + isActive: boolean; constructor(viewletService: IViewletService, panelService: IPanelService, scopeId: string) { super(viewletService, panelService, scopeId); } - public onScopeActivated() { - this.isActive = true; - } - public onScopeDeactivated() { - this.isActive = false; - } + onScopeActivated() { this.isActive = true; } + onScopeDeactivated() { this.isActive = false; } } class TestProgressBar { - public fTotal: number; - public fWorked: number; - public fInfinite: boolean; - public fDone: boolean; + fTotal: number; + fWorked: number; + fInfinite: boolean; + fDone: boolean; - constructor() { - } + constructor() { } - public infinite() { + infinite() { this.fDone = null!; this.fInfinite = true; return this; } - public total(total: number) { + total(total: number) { this.fDone = null!; this.fTotal = total; return this; } - public hasTotal() { + hasTotal() { return !!this.fTotal; } - public worked(worked: number) { + worked(worked: number) { this.fDone = null!; if (this.fWorked) { @@ -127,7 +76,7 @@ class TestProgressBar { return this; } - public done() { + done() { this.fDone = true; this.fInfinite = null!; @@ -137,25 +86,21 @@ class TestProgressBar { return this; } - public stop() { + stop() { return this.done(); } - public show(): void { + show(): void { } - } - - public hide(): void { - - } + hide(): void { } } -suite('Progress Service', () => { +suite('Progress Indicator', () => { - test('ScopedService', () => { + test('CompositeScope', () => { let viewletService = new TestViewletService(); let panelService = new TestPanelService(); - let service = new TestScopedService(viewletService, panelService, 'test.scopeId'); + let service = new TestCompositeScope(viewletService, panelService, 'test.scopeId'); const testViewlet = new TestViewlet('test.scopeId'); assert(!service.isActive); @@ -167,11 +112,11 @@ suite('Progress Service', () => { }); - test('WorkbenchProgressService', async () => { + test('CompositeProgressIndicator', async () => { let testProgressBar = new TestProgressBar(); let viewletService = new TestViewletService(); let panelService = new TestPanelService(); - let service = new ScopedProgressService((testProgressBar), 'test.scopeId', true, viewletService, panelService); + let service = new CompositeProgressIndicator((testProgressBar), 'test.scopeId', true, viewletService, panelService); // Active: Show (Infinite) let fn = service.show(true); diff --git a/src/vs/workbench/services/viewlet/browser/viewlet.ts b/src/vs/workbench/services/viewlet/browser/viewlet.ts index a20befa6940..92349b87a4b 100644 --- a/src/vs/workbench/services/viewlet/browser/viewlet.ts +++ b/src/vs/workbench/services/viewlet/browser/viewlet.ts @@ -7,7 +7,7 @@ import { IViewlet } from 'vs/workbench/common/viewlet'; import { createDecorator, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; import { Event } from 'vs/base/common/event'; import { ViewletDescriptor } from 'vs/workbench/browser/viewlet'; -import { ILocalProgressService } from 'vs/platform/progress/common/progress'; +import { IProgressIndicator } from 'vs/platform/progress/common/progress'; export const IViewletService = createDecorator('viewletService'); @@ -48,7 +48,7 @@ export interface IViewletService { /** * Returns the progress indicator for the side bar. */ - getProgressIndicator(id: string): ILocalProgressService | null; + getProgressIndicator(id: string): IProgressIndicator | null; /** * Hide the active viewlet. From 7e0daae1a6668ca8d56f34fcb7775f8ebca68013 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 28 Jun 2019 17:04:18 +0200 Subject: [PATCH 0750/1449] fix #75245 --- src/vs/workbench/contrib/snippets/browser/snippetsService.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/snippets/browser/snippetsService.ts b/src/vs/workbench/contrib/snippets/browser/snippetsService.ts index 5056192bf77..9f93d41b480 100644 --- a/src/vs/workbench/contrib/snippets/browser/snippetsService.ts +++ b/src/vs/workbench/contrib/snippets/browser/snippetsService.ts @@ -277,8 +277,8 @@ class SnippetsService implements ISnippetsService { this._initFolderSnippets(SnippetSource.Workspace, snippetFolder, bucket); } else { // watch - bucket.push(watch(this._fileService, snippetFolder, (type) => { - if (type === FileChangeType.ADDED) { + bucket.push(this._fileService.onFileChanges(e => { + if (e.contains(snippetFolder, FileChangeType.ADDED)) { this._initFolderSnippets(SnippetSource.Workspace, snippetFolder, bucket); } })); From f981a981b0c54d00b7037d96a8269cecd88f9846 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 28 Jun 2019 17:13:07 +0200 Subject: [PATCH 0751/1449] dispo debt --- .../snippets/browser/snippetsService.ts | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/vs/workbench/contrib/snippets/browser/snippetsService.ts b/src/vs/workbench/contrib/snippets/browser/snippetsService.ts index 9f93d41b480..32e0cbbe862 100644 --- a/src/vs/workbench/contrib/snippets/browser/snippetsService.ts +++ b/src/vs/workbench/contrib/snippets/browser/snippetsService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IJSONSchema } from 'vs/base/common/jsonSchema'; -import { combinedDisposable, dispose, IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { combinedDisposable, IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { values } from 'vs/base/common/map'; import * as resources from 'vs/base/common/resources'; import { endsWith, isFalsyOrWhitespace } from 'vs/base/common/strings'; @@ -129,7 +129,7 @@ class SnippetsService implements ISnippetsService { readonly _serviceBrand: any; - private readonly _disposables: IDisposable[] = []; + private readonly _disposables = new DisposableStore(); private readonly _pendingWork: Promise[] = []; private readonly _files = new Map(); @@ -151,7 +151,7 @@ class SnippetsService implements ISnippetsService { } dispose(): void { - dispose(this._disposables); + this._disposables.dispose(); } private _joinSnippets(): Promise { @@ -256,20 +256,18 @@ class SnippetsService implements ISnippetsService { private _initWorkspaceSnippets(): void { // workspace stuff - let disposables: IDisposable[] = []; + let disposables = new DisposableStore(); let updateWorkspaceSnippets = () => { - disposables = dispose(disposables); + disposables.clear(); this._pendingWork.push(this._initWorkspaceFolderSnippets(this._contextService.getWorkspace(), disposables)); }; - this._disposables.push({ - dispose() { dispose(disposables); } - }); - this._disposables.push(this._contextService.onDidChangeWorkspaceFolders(updateWorkspaceSnippets)); - this._disposables.push(this._contextService.onDidChangeWorkbenchState(updateWorkspaceSnippets)); + this._disposables.add(disposables); + this._disposables.add(this._contextService.onDidChangeWorkspaceFolders(updateWorkspaceSnippets)); + this._disposables.add(this._contextService.onDidChangeWorkbenchState(updateWorkspaceSnippets)); updateWorkspaceSnippets(); } - private _initWorkspaceFolderSnippets(workspace: IWorkspace, bucket: IDisposable[]): Promise { + private _initWorkspaceFolderSnippets(workspace: IWorkspace, bucket: DisposableStore): Promise { let promises = workspace.folders.map(folder => { const snippetFolder = folder.toResource('.vscode'); return this._fileService.exists(snippetFolder).then(value => { @@ -277,7 +275,7 @@ class SnippetsService implements ISnippetsService { this._initFolderSnippets(SnippetSource.Workspace, snippetFolder, bucket); } else { // watch - bucket.push(this._fileService.onFileChanges(e => { + bucket.add(this._fileService.onFileChanges(e => { if (e.contains(snippetFolder, FileChangeType.ADDED)) { this._initFolderSnippets(SnippetSource.Workspace, snippetFolder, bucket); } @@ -293,7 +291,7 @@ class SnippetsService implements ISnippetsService { return this._fileService.createFolder(userSnippetsFolder).then(() => this._initFolderSnippets(SnippetSource.User, userSnippetsFolder, this._disposables)); } - private _initFolderSnippets(source: SnippetSource, folder: URI, bucket: IDisposable[]): Promise { + private _initFolderSnippets(source: SnippetSource, folder: URI, bucket: DisposableStore): Promise { const disposables = new DisposableStore(); const addFolderSnippets = (type?: FileChangeType) => { disposables.clear(); @@ -310,8 +308,8 @@ class SnippetsService implements ISnippetsService { }); }; - bucket.push(watch(this._fileService, folder, addFolderSnippets)); - bucket.push(disposables); + bucket.add(watch(this._fileService, folder, addFolderSnippets)); + bucket.add(disposables); return addFolderSnippets(); } From ebacb1631feec0f6e0b409e978552e2a7a67265b Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 28 Jun 2019 17:36:05 +0200 Subject: [PATCH 0752/1449] separate gulp --- build/azure-pipelines/darwin/product-build-darwin.yml | 5 ++++- build/azure-pipelines/linux/product-build-linux.yml | 4 +++- build/azure-pipelines/win32/product-build-win32.yml | 4 +++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index b8d2d4e4a61..ac6858c264e 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -78,7 +78,10 @@ steps: set -e VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ AZURE_STORAGE_ACCESS_KEY="$(ticino-storage-key)" \ - yarn gulp vscode-darwin-min vscode-reh-darwin-min vscode-web-darwin-min upload-vscode-sourcemaps + yarn gulp vscode-darwin-min + yarn gulp vscode-reh-darwin-min + yarn gulp vscode-web-darwin-min + yarn gulp upload-vscode-sourcemaps displayName: Build - script: | diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index f4df0993390..205d582c9e7 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -82,7 +82,9 @@ steps: yarn gulp vscode-linux-$VSCODE_ARCH-min else VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-linux-$VSCODE_ARCH-min vscode-reh-linux-$VSCODE_ARCH-min vscode-web-linux-$VSCODE_ARCH-min + yarn gulp vscode-linux-$VSCODE_ARCH-min + yarn gulp vscode-reh-linux-$VSCODE_ARCH-min + yarn gulp vscode-web-linux-$VSCODE_ARCH-min fi displayName: Build diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index f2ab4b92f4d..adc5bd51e20 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -85,7 +85,9 @@ steps: . build/azure-pipelines/win32/exec.ps1 $ErrorActionPreference = "Stop" $env:VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" - exec { yarn gulp "vscode-win32-$env:VSCODE_ARCH-min" "vscode-reh-win32-$env:VSCODE_ARCH-min" "vscode-web-win32-$env:VSCODE_ARCH-min" } + exec { yarn gulp "vscode-win32-$env:VSCODE_ARCH-min" } + exec { yarn gulp "vscode-reh-win32-$env:VSCODE_ARCH-min" } + exec { yarn gulp "vscode-web-win32-$env:VSCODE_ARCH-min" } exec { yarn gulp "vscode-win32-$env:VSCODE_ARCH-inno-updater" } displayName: Build From ac15021273414dd5b194f5112c50644d6c457f1f Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 28 Jun 2019 17:44:18 +0200 Subject: [PATCH 0753/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 29b85f8360d..651ee844992 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "655dbee333798c5253b03bf8ef1bc8f4fbd3e48b", + "distro": "82309144ea32020a148c0854e745fcf20002f0e3", "author": { "name": "Microsoft Corporation" }, From f2b9f98393c03bb3210a6e6b7fbd315420c194e7 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 28 Jun 2019 17:46:51 +0200 Subject: [PATCH 0754/1449] #76103 Make ids unique in markers model --- .../contrib/markers/browser/markersModel.ts | 59 ++++++++----------- .../contrib/markers/browser/markersPanel.ts | 2 +- .../markers/browser/markersTreeViewer.ts | 10 ++-- .../electron-browser/markersModel.test.ts | 29 +++++++-- 4 files changed, 53 insertions(+), 47 deletions(-) diff --git a/src/vs/workbench/contrib/markers/browser/markersModel.ts b/src/vs/workbench/contrib/markers/browser/markersModel.ts index 923f13da0a3..857e74d0cad 100644 --- a/src/vs/workbench/contrib/markers/browser/markersModel.ts +++ b/src/vs/workbench/contrib/markers/browser/markersModel.ts @@ -50,14 +50,7 @@ export class ResourceMarkers { @memoize get name(): string { return basename(this.resource); } - @memoize - get hash(): string { - const hasher = new Hasher(); - hasher.hash(this.resource.toString()); - return `${hasher.value}`; - } - - constructor(readonly resource: URI, readonly markers: Marker[]) { } + constructor(readonly id: string, readonly resource: URI, readonly markers: Marker[]) { } } export class Marker { @@ -73,12 +66,8 @@ export class Marker { return this._lines; } - @memoize - get hash(): string { - return IMarkerData.makeKey(this.marker); - } - constructor( + readonly id: string, readonly marker: IMarker, readonly relatedInformation: RelatedInformation[] = [] ) { } @@ -94,24 +83,8 @@ export class Marker { export class RelatedInformation { - @memoize - get hash(): string { - const hasher = new Hasher(); - hasher.hash(this.resource.toString()); - hasher.hash(this.marker.startLineNumber); - hasher.hash(this.marker.startColumn); - hasher.hash(this.marker.endLineNumber); - hasher.hash(this.marker.endColumn); - hasher.hash(this.raw.resource.toString()); - hasher.hash(this.raw.startLineNumber); - hasher.hash(this.raw.startColumn); - hasher.hash(this.raw.endLineNumber); - hasher.hash(this.raw.endColumn); - return `${hasher.value}`; - } - constructor( - private resource: URI, + readonly id: string, readonly marker: IMarker, readonly raw: IRelatedInformation ) { } @@ -146,23 +119,39 @@ export class MarkersModel { if (isFalsyOrEmpty(rawMarkers)) { this.resourcesByUri.delete(resource.toString()); } else { - const markers = mergeSort(rawMarkers.map(rawMarker => { - let relatedInformation: RelatedInformation[] | undefined = undefined; + const resourceMarkersId = this.id(resource.toString()); + const markersCountByKey = new Map(); + const markers = mergeSort(rawMarkers.map((rawMarker) => { + const key = IMarkerData.makeKey(rawMarker); + const index = markersCountByKey.get(key) || 0; + markersCountByKey.set(key, index + 1); + + const markerId = this.id(resourceMarkersId, key, index); + + let relatedInformation: RelatedInformation[] | undefined = undefined; if (rawMarker.relatedInformation) { - relatedInformation = rawMarker.relatedInformation.map(r => new RelatedInformation(resource, rawMarker, r)); + relatedInformation = rawMarker.relatedInformation.map((r, index) => new RelatedInformation(this.id(markerId, r.resource.toString(), r.startLineNumber, r.startColumn, r.endLineNumber, r.endColumn, index), rawMarker, r)); } - return new Marker(rawMarker, relatedInformation); + return new Marker(markerId, rawMarker, relatedInformation); }), compareMarkers); - this.resourcesByUri.set(resource.toString(), new ResourceMarkers(resource, markers)); + this.resourcesByUri.set(resource.toString(), new ResourceMarkers(resourceMarkersId, resource, markers)); } this.cachedSortedResources = undefined; this._onDidChange.fire(resource); } + private id(...values: (string | number)[]): string { + const hasher = new Hasher(); + for (const value of values) { + hasher.hash(value); + } + return `${hasher.value}`; + } + dispose(): void { this._onDidChange.dispose(); this.resourcesByUri.clear(); diff --git a/src/vs/workbench/contrib/markers/browser/markersPanel.ts b/src/vs/workbench/contrib/markers/browser/markersPanel.ts index fde55f553cf..ad11ca74de9 100644 --- a/src/vs/workbench/contrib/markers/browser/markersPanel.ts +++ b/src/vs/workbench/contrib/markers/browser/markersPanel.ts @@ -305,7 +305,7 @@ export class MarkersPanel extends Panel implements IMarkerFilterController { const identityProvider = { getId(element: TreeElement) { - return element.hash; + return element.id; } }; diff --git a/src/vs/workbench/contrib/markers/browser/markersTreeViewer.ts b/src/vs/workbench/contrib/markers/browser/markersTreeViewer.ts index c7dafaacfd3..dac61a035c0 100644 --- a/src/vs/workbench/contrib/markers/browser/markersTreeViewer.ts +++ b/src/vs/workbench/contrib/markers/browser/markersTreeViewer.ts @@ -630,7 +630,7 @@ export class MarkersViewModel extends Disposable { } add(marker: Marker): void { - if (!this.markersViewStates.has(marker.hash)) { + if (!this.markersViewStates.has(marker.id)) { const viewModel = this.instantiationService.createInstance(MarkerViewModel, marker); const disposables: IDisposable[] = [viewModel]; viewModel.multiline = this.multiline; @@ -639,7 +639,7 @@ export class MarkersViewModel extends Disposable { this._onDidChange.fire(marker); } }, this, disposables); - this.markersViewStates.set(marker.hash, { viewModel, disposables }); + this.markersViewStates.set(marker.id, { viewModel, disposables }); const markers = this.markersPerResource.get(marker.resource.toString()) || []; markers.push(marker); @@ -650,11 +650,11 @@ export class MarkersViewModel extends Disposable { remove(resource: URI): void { const markers = this.markersPerResource.get(resource.toString()) || []; for (const marker of markers) { - const value = this.markersViewStates.get(marker.hash); + const value = this.markersViewStates.get(marker.id); if (value) { dispose(value.disposables); } - this.markersViewStates.delete(marker.hash); + this.markersViewStates.delete(marker.id); if (this.hoveredMarker === marker) { this.hoveredMarker = null; } @@ -663,7 +663,7 @@ export class MarkersViewModel extends Disposable { } getViewModel(marker: Marker): MarkerViewModel | null { - const value = this.markersViewStates.get(marker.hash); + const value = this.markersViewStates.get(marker.id); return value ? value.viewModel : null; } diff --git a/src/vs/workbench/contrib/markers/test/electron-browser/markersModel.test.ts b/src/vs/workbench/contrib/markers/test/electron-browser/markersModel.test.ts index 34741e9027c..322c336945c 100644 --- a/src/vs/workbench/contrib/markers/test/electron-browser/markersModel.test.ts +++ b/src/vs/workbench/contrib/markers/test/electron-browser/markersModel.test.ts @@ -27,6 +27,23 @@ class TestMarkersModel extends MarkersModel { suite('MarkersModel Test', () => { + test('marker ids are unique', function () { + const marker1 = anErrorWithRange(3); + const marker2 = anErrorWithRange(3); + const marker3 = aWarningWithRange(3); + const marker4 = aWarningWithRange(3); + + const testObject = new TestMarkersModel([marker1, marker2, marker3, marker4]); + const actuals = testObject.resourceMarkers[0].markers; + + assert.notEqual(actuals[0].id, actuals[1].id); + assert.notEqual(actuals[0].id, actuals[2].id); + assert.notEqual(actuals[0].id, actuals[3].id); + assert.notEqual(actuals[1].id, actuals[2].id); + assert.notEqual(actuals[1].id, actuals[3].id); + assert.notEqual(actuals[2].id, actuals[3].id); + }); + test('sort palces resources with no errors at the end', function () { const marker1 = aMarker('a/res1', MarkerSeverity.Warning); const marker2 = aMarker('a/res2'); @@ -105,22 +122,22 @@ suite('MarkersModel Test', () => { test('toString()', () => { let marker = aMarker('a/res1'); marker.code = '1234'; - assert.equal(JSON.stringify({ ...marker, resource: marker.resource.path }, null, '\t'), new Marker(marker).toString()); + assert.equal(JSON.stringify({ ...marker, resource: marker.resource.path }, null, '\t'), new Marker('1', marker).toString()); marker = aMarker('a/res2', MarkerSeverity.Warning); - assert.equal(JSON.stringify({ ...marker, resource: marker.resource.path }, null, '\t'), new Marker(marker).toString()); + assert.equal(JSON.stringify({ ...marker, resource: marker.resource.path }, null, '\t'), new Marker('2', marker).toString()); marker = aMarker('a/res2', MarkerSeverity.Info, 1, 2, 1, 8, 'Info', ''); - assert.equal(JSON.stringify({ ...marker, resource: marker.resource.path }, null, '\t'), new Marker(marker).toString()); + assert.equal(JSON.stringify({ ...marker, resource: marker.resource.path }, null, '\t'), new Marker('3', marker).toString()); marker = aMarker('a/res2', MarkerSeverity.Hint, 1, 2, 1, 8, 'Ignore message', 'Ignore'); - assert.equal(JSON.stringify({ ...marker, resource: marker.resource.path }, null, '\t'), new Marker(marker).toString()); + assert.equal(JSON.stringify({ ...marker, resource: marker.resource.path }, null, '\t'), new Marker('4', marker).toString()); marker = aMarker('a/res2', MarkerSeverity.Warning, 1, 2, 1, 8, 'Warning message', '', [{ startLineNumber: 2, startColumn: 5, endLineNumber: 2, endColumn: 10, message: 'some info', resource: URI.file('a/res3') }]); - const testObject = new Marker(marker, null!); + const testObject = new Marker('5', marker, null!); // hack - (testObject as any).relatedInformation = marker.relatedInformation!.map(r => new RelatedInformation(marker.resource, marker, r)); + (testObject as any).relatedInformation = marker.relatedInformation!.map(r => new RelatedInformation('6', marker, r)); assert.equal(JSON.stringify({ ...marker, resource: marker.resource.path, relatedInformation: marker.relatedInformation!.map(r => ({ ...r, resource: r.resource.path })) }, null, '\t'), testObject.toString()); }); From 2b9bc197285b28de73c8004c67f2777e08a699a1 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 28 Jun 2019 18:02:28 +0200 Subject: [PATCH 0755/1449] web - add shortcut icon --- src/vs/code/browser/workbench/workbench.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vs/code/browser/workbench/workbench.html b/src/vs/code/browser/workbench/workbench.html index ff62e0a65a9..daf45dab6e4 100644 --- a/src/vs/code/browser/workbench/workbench.html +++ b/src/vs/code/browser/workbench/workbench.html @@ -4,6 +4,8 @@ + + From f214293d8950e20b78d8608528805731d411cc13 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 28 Jun 2019 18:05:05 +0200 Subject: [PATCH 0756/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 651ee844992..cd6c1c14089 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "82309144ea32020a148c0854e745fcf20002f0e3", + "distro": "b15e399c8b5cec4491bfa111a86ad68c4c42e121", "author": { "name": "Microsoft Corporation" }, From 87ee59fade8ee98824718e74a067a2b3bf1b8b38 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 28 Jun 2019 18:11:30 +0200 Subject: [PATCH 0757/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cd6c1c14089..96d94efdecf 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "b15e399c8b5cec4491bfa111a86ad68c4c42e121", + "distro": "b49e556c274bfe2fc7f4fafd3804cb4ebd948c4f", "author": { "name": "Microsoft Corporation" }, From efaf262c842216686e868ee6feedbd9bd7940e73 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Fri, 28 Jun 2019 09:31:57 -0700 Subject: [PATCH 0758/1449] Update icons --- extensions/git/resources/icons/dark/refresh.svg | 3 ++- extensions/git/resources/icons/light/refresh.svg | 3 ++- .../contrib/documentSymbols/media/operator-dark.svg | 2 +- .../contrib/documentSymbols/media/property-dark.svg | 2 +- .../contrib/documentSymbols/media/property-light.svg | 2 +- src/vs/editor/contrib/suggest/media/operator-dark.svg | 2 +- src/vs/editor/contrib/suggest/media/property-dark.svg | 2 +- src/vs/editor/contrib/suggest/media/property-light.svg | 2 +- .../browser/parts/notifications/media/configure-light.svg | 2 +- .../contrib/debug/browser/media/breakpoint-disabled.svg | 2 +- .../contrib/debug/browser/media/configure-hc.svg | 2 +- .../contrib/debug/browser/media/configure-light.svg | 2 +- src/vs/workbench/contrib/debug/browser/media/drag.svg | 7 ++++++- .../workbench/contrib/debug/browser/media/pause-dark.svg | 2 +- .../workbench/contrib/debug/browser/media/pause-light.svg | 2 +- .../extensions/electron-browser/media/configure-hc.svg | 2 +- .../extensions/electron-browser/media/configure-light.svg | 2 +- .../contrib/files/browser/media/refresh-dark.svg | 3 ++- .../workbench/contrib/files/browser/media/refresh-hc.svg | 3 ++- .../contrib/files/browser/media/refresh-light.svg | 3 ++- .../contrib/preferences/browser/media/configure-dark.svg | 2 +- .../contrib/preferences/browser/media/configure-light.svg | 2 +- .../contrib/search/browser/media/refresh-dark.svg | 3 ++- .../workbench/contrib/search/browser/media/refresh-hc.svg | 3 ++- .../contrib/search/browser/media/refresh-light.svg | 3 ++- .../contrib/search/browser/media/replace-all-dark.svg | 8 +------- .../contrib/search/browser/media/replace-all-hc.svg | 8 +------- .../contrib/search/browser/media/replace-all-light.svg | 8 +------- .../workbench/contrib/search/browser/media/replace-hc.svg | 2 +- .../contrib/tasks/common/media/configure-dark.svg | 2 +- .../contrib/tasks/common/media/configure-light.svg | 2 +- .../contrib/terminal/browser/media/configure-hc.svg | 2 +- .../contrib/terminal/browser/media/configure-light.svg | 2 +- 33 files changed, 46 insertions(+), 51 deletions(-) diff --git a/extensions/git/resources/icons/dark/refresh.svg b/extensions/git/resources/icons/dark/refresh.svg index 31606ae7263..e1f05aadeeb 100644 --- a/extensions/git/resources/icons/dark/refresh.svg +++ b/extensions/git/resources/icons/dark/refresh.svg @@ -1,3 +1,4 @@ - + + diff --git a/extensions/git/resources/icons/light/refresh.svg b/extensions/git/resources/icons/light/refresh.svg index 78d9826af04..9b1d9108409 100644 --- a/extensions/git/resources/icons/light/refresh.svg +++ b/extensions/git/resources/icons/light/refresh.svg @@ -1,3 +1,4 @@ - + + diff --git a/src/vs/editor/contrib/documentSymbols/media/operator-dark.svg b/src/vs/editor/contrib/documentSymbols/media/operator-dark.svg index 06ff14030c2..957f5f44f17 100644 --- a/src/vs/editor/contrib/documentSymbols/media/operator-dark.svg +++ b/src/vs/editor/contrib/documentSymbols/media/operator-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/editor/contrib/documentSymbols/media/property-dark.svg b/src/vs/editor/contrib/documentSymbols/media/property-dark.svg index 7137a9d7bb5..23e07ffa19b 100644 --- a/src/vs/editor/contrib/documentSymbols/media/property-dark.svg +++ b/src/vs/editor/contrib/documentSymbols/media/property-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/editor/contrib/documentSymbols/media/property-light.svg b/src/vs/editor/contrib/documentSymbols/media/property-light.svg index 60f77501db7..be642dd152d 100644 --- a/src/vs/editor/contrib/documentSymbols/media/property-light.svg +++ b/src/vs/editor/contrib/documentSymbols/media/property-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/editor/contrib/suggest/media/operator-dark.svg b/src/vs/editor/contrib/suggest/media/operator-dark.svg index 06ff14030c2..957f5f44f17 100644 --- a/src/vs/editor/contrib/suggest/media/operator-dark.svg +++ b/src/vs/editor/contrib/suggest/media/operator-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/editor/contrib/suggest/media/property-dark.svg b/src/vs/editor/contrib/suggest/media/property-dark.svg index 7137a9d7bb5..23e07ffa19b 100644 --- a/src/vs/editor/contrib/suggest/media/property-dark.svg +++ b/src/vs/editor/contrib/suggest/media/property-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/editor/contrib/suggest/media/property-light.svg b/src/vs/editor/contrib/suggest/media/property-light.svg index 60f77501db7..be642dd152d 100644 --- a/src/vs/editor/contrib/suggest/media/property-light.svg +++ b/src/vs/editor/contrib/suggest/media/property-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/browser/parts/notifications/media/configure-light.svg b/src/vs/workbench/browser/parts/notifications/media/configure-light.svg index fb7ffea770b..b391a9663a2 100644 --- a/src/vs/workbench/browser/parts/notifications/media/configure-light.svg +++ b/src/vs/workbench/browser/parts/notifications/media/configure-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/breakpoint-disabled.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-disabled.svg index c1a450c90d4..84588f8eac5 100644 --- a/src/vs/workbench/contrib/debug/browser/media/breakpoint-disabled.svg +++ b/src/vs/workbench/contrib/debug/browser/media/breakpoint-disabled.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/configure-hc.svg b/src/vs/workbench/contrib/debug/browser/media/configure-hc.svg index 66e90b0f5f6..3151e77fa13 100644 --- a/src/vs/workbench/contrib/debug/browser/media/configure-hc.svg +++ b/src/vs/workbench/contrib/debug/browser/media/configure-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/configure-light.svg b/src/vs/workbench/contrib/debug/browser/media/configure-light.svg index fb7ffea770b..b391a9663a2 100644 --- a/src/vs/workbench/contrib/debug/browser/media/configure-light.svg +++ b/src/vs/workbench/contrib/debug/browser/media/configure-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/drag.svg b/src/vs/workbench/contrib/debug/browser/media/drag.svg index b2bc17dfa7e..b6b93f31fdf 100644 --- a/src/vs/workbench/contrib/debug/browser/media/drag.svg +++ b/src/vs/workbench/contrib/debug/browser/media/drag.svg @@ -1,3 +1,8 @@ - + + + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/pause-dark.svg b/src/vs/workbench/contrib/debug/browser/media/pause-dark.svg index 5fda61c7702..9cd9f466130 100644 --- a/src/vs/workbench/contrib/debug/browser/media/pause-dark.svg +++ b/src/vs/workbench/contrib/debug/browser/media/pause-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/pause-light.svg b/src/vs/workbench/contrib/debug/browser/media/pause-light.svg index 4e8c46550d0..01d3cbc290c 100644 --- a/src/vs/workbench/contrib/debug/browser/media/pause-light.svg +++ b/src/vs/workbench/contrib/debug/browser/media/pause-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/configure-hc.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-hc.svg index 66e90b0f5f6..3151e77fa13 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/configure-hc.svg +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/configure-light.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-light.svg index fb7ffea770b..b391a9663a2 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/configure-light.svg +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/files/browser/media/refresh-dark.svg b/src/vs/workbench/contrib/files/browser/media/refresh-dark.svg index 31606ae7263..57473d6d9ad 100644 --- a/src/vs/workbench/contrib/files/browser/media/refresh-dark.svg +++ b/src/vs/workbench/contrib/files/browser/media/refresh-dark.svg @@ -1,3 +1,4 @@ - + + diff --git a/src/vs/workbench/contrib/files/browser/media/refresh-hc.svg b/src/vs/workbench/contrib/files/browser/media/refresh-hc.svg index a940b8ef4a6..d2eb7f74671 100644 --- a/src/vs/workbench/contrib/files/browser/media/refresh-hc.svg +++ b/src/vs/workbench/contrib/files/browser/media/refresh-hc.svg @@ -1,3 +1,4 @@ - + + diff --git a/src/vs/workbench/contrib/files/browser/media/refresh-light.svg b/src/vs/workbench/contrib/files/browser/media/refresh-light.svg index 78d9826af04..e90c502c3df 100644 --- a/src/vs/workbench/contrib/files/browser/media/refresh-light.svg +++ b/src/vs/workbench/contrib/files/browser/media/refresh-light.svg @@ -1,3 +1,4 @@ - + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/configure-dark.svg b/src/vs/workbench/contrib/preferences/browser/media/configure-dark.svg index 4e4bc65c207..a0ddc9b9fd1 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/configure-dark.svg +++ b/src/vs/workbench/contrib/preferences/browser/media/configure-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/preferences/browser/media/configure-light.svg b/src/vs/workbench/contrib/preferences/browser/media/configure-light.svg index fb7ffea770b..b391a9663a2 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/configure-light.svg +++ b/src/vs/workbench/contrib/preferences/browser/media/configure-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/search/browser/media/refresh-dark.svg b/src/vs/workbench/contrib/search/browser/media/refresh-dark.svg index 31606ae7263..e1f05aadeeb 100644 --- a/src/vs/workbench/contrib/search/browser/media/refresh-dark.svg +++ b/src/vs/workbench/contrib/search/browser/media/refresh-dark.svg @@ -1,3 +1,4 @@ - + + diff --git a/src/vs/workbench/contrib/search/browser/media/refresh-hc.svg b/src/vs/workbench/contrib/search/browser/media/refresh-hc.svg index a940b8ef4a6..48fc30f2c48 100644 --- a/src/vs/workbench/contrib/search/browser/media/refresh-hc.svg +++ b/src/vs/workbench/contrib/search/browser/media/refresh-hc.svg @@ -1,3 +1,4 @@ - + + diff --git a/src/vs/workbench/contrib/search/browser/media/refresh-light.svg b/src/vs/workbench/contrib/search/browser/media/refresh-light.svg index 78d9826af04..9b1d9108409 100644 --- a/src/vs/workbench/contrib/search/browser/media/refresh-light.svg +++ b/src/vs/workbench/contrib/search/browser/media/refresh-light.svg @@ -1,3 +1,4 @@ - + + diff --git a/src/vs/workbench/contrib/search/browser/media/replace-all-dark.svg b/src/vs/workbench/contrib/search/browser/media/replace-all-dark.svg index 96dea6e6ff8..07bd41a789f 100644 --- a/src/vs/workbench/contrib/search/browser/media/replace-all-dark.svg +++ b/src/vs/workbench/contrib/search/browser/media/replace-all-dark.svg @@ -1,9 +1,3 @@ - - - - - - - + diff --git a/src/vs/workbench/contrib/search/browser/media/replace-all-hc.svg b/src/vs/workbench/contrib/search/browser/media/replace-all-hc.svg index 66ed165e46b..e375cf395e1 100644 --- a/src/vs/workbench/contrib/search/browser/media/replace-all-hc.svg +++ b/src/vs/workbench/contrib/search/browser/media/replace-all-hc.svg @@ -1,9 +1,3 @@ - - - - - - - + diff --git a/src/vs/workbench/contrib/search/browser/media/replace-all-light.svg b/src/vs/workbench/contrib/search/browser/media/replace-all-light.svg index a7c23ff6d92..cd3974fae7e 100644 --- a/src/vs/workbench/contrib/search/browser/media/replace-all-light.svg +++ b/src/vs/workbench/contrib/search/browser/media/replace-all-light.svg @@ -1,9 +1,3 @@ - - - - - - - + diff --git a/src/vs/workbench/contrib/search/browser/media/replace-hc.svg b/src/vs/workbench/contrib/search/browser/media/replace-hc.svg index 1998016db59..7b419b11308 100644 --- a/src/vs/workbench/contrib/search/browser/media/replace-hc.svg +++ b/src/vs/workbench/contrib/search/browser/media/replace-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/tasks/common/media/configure-dark.svg b/src/vs/workbench/contrib/tasks/common/media/configure-dark.svg index 4e4bc65c207..a0ddc9b9fd1 100644 --- a/src/vs/workbench/contrib/tasks/common/media/configure-dark.svg +++ b/src/vs/workbench/contrib/tasks/common/media/configure-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/tasks/common/media/configure-light.svg b/src/vs/workbench/contrib/tasks/common/media/configure-light.svg index fb7ffea770b..b391a9663a2 100644 --- a/src/vs/workbench/contrib/tasks/common/media/configure-light.svg +++ b/src/vs/workbench/contrib/tasks/common/media/configure-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/terminal/browser/media/configure-hc.svg b/src/vs/workbench/contrib/terminal/browser/media/configure-hc.svg index 66e90b0f5f6..3151e77fa13 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/configure-hc.svg +++ b/src/vs/workbench/contrib/terminal/browser/media/configure-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/terminal/browser/media/configure-light.svg b/src/vs/workbench/contrib/terminal/browser/media/configure-light.svg index fb7ffea770b..b391a9663a2 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/configure-light.svg +++ b/src/vs/workbench/contrib/terminal/browser/media/configure-light.svg @@ -1,3 +1,3 @@ - + From 5d8fec49bfa800dc58ec3abff15a96fbc76c8a17 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Fri, 28 Jun 2019 09:32:13 -0700 Subject: [PATCH 0759/1449] Update diff addition/deletion icons --- src/vs/editor/browser/widget/media/addition-dark.svg | 3 +++ src/vs/editor/browser/widget/media/addition-inverse.svg | 1 - src/vs/editor/browser/widget/media/addition-light.svg | 3 +++ src/vs/editor/browser/widget/media/addition.svg | 1 - src/vs/editor/browser/widget/media/deletion-dark.svg | 3 +++ src/vs/editor/browser/widget/media/deletion-inverse.svg | 1 - src/vs/editor/browser/widget/media/deletion-light.svg | 3 +++ src/vs/editor/browser/widget/media/deletion.svg | 1 - src/vs/editor/browser/widget/media/diffEditor.css | 8 ++++---- 9 files changed, 16 insertions(+), 8 deletions(-) create mode 100644 src/vs/editor/browser/widget/media/addition-dark.svg delete mode 100644 src/vs/editor/browser/widget/media/addition-inverse.svg create mode 100644 src/vs/editor/browser/widget/media/addition-light.svg delete mode 100644 src/vs/editor/browser/widget/media/addition.svg create mode 100644 src/vs/editor/browser/widget/media/deletion-dark.svg delete mode 100644 src/vs/editor/browser/widget/media/deletion-inverse.svg create mode 100644 src/vs/editor/browser/widget/media/deletion-light.svg delete mode 100644 src/vs/editor/browser/widget/media/deletion.svg diff --git a/src/vs/editor/browser/widget/media/addition-dark.svg b/src/vs/editor/browser/widget/media/addition-dark.svg new file mode 100644 index 00000000000..4d9389336b9 --- /dev/null +++ b/src/vs/editor/browser/widget/media/addition-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/browser/widget/media/addition-inverse.svg b/src/vs/editor/browser/widget/media/addition-inverse.svg deleted file mode 100644 index 3475c1e1963..00000000000 --- a/src/vs/editor/browser/widget/media/addition-inverse.svg +++ /dev/null @@ -1 +0,0 @@ -Layer 1 \ No newline at end of file diff --git a/src/vs/editor/browser/widget/media/addition-light.svg b/src/vs/editor/browser/widget/media/addition-light.svg new file mode 100644 index 00000000000..01a9de7d5ab --- /dev/null +++ b/src/vs/editor/browser/widget/media/addition-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/browser/widget/media/addition.svg b/src/vs/editor/browser/widget/media/addition.svg deleted file mode 100644 index bdecdb0e45b..00000000000 --- a/src/vs/editor/browser/widget/media/addition.svg +++ /dev/null @@ -1 +0,0 @@ -Layer 1 \ No newline at end of file diff --git a/src/vs/editor/browser/widget/media/deletion-dark.svg b/src/vs/editor/browser/widget/media/deletion-dark.svg new file mode 100644 index 00000000000..4c5a9c1e3a5 --- /dev/null +++ b/src/vs/editor/browser/widget/media/deletion-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/browser/widget/media/deletion-inverse.svg b/src/vs/editor/browser/widget/media/deletion-inverse.svg deleted file mode 100644 index 2de46fcf5b5..00000000000 --- a/src/vs/editor/browser/widget/media/deletion-inverse.svg +++ /dev/null @@ -1 +0,0 @@ -Layer 1 \ No newline at end of file diff --git a/src/vs/editor/browser/widget/media/deletion-light.svg b/src/vs/editor/browser/widget/media/deletion-light.svg new file mode 100644 index 00000000000..d12a8ee3135 --- /dev/null +++ b/src/vs/editor/browser/widget/media/deletion-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/editor/browser/widget/media/deletion.svg b/src/vs/editor/browser/widget/media/deletion.svg deleted file mode 100644 index f5d128b2df8..00000000000 --- a/src/vs/editor/browser/widget/media/deletion.svg +++ /dev/null @@ -1 +0,0 @@ -Layer 1 \ No newline at end of file diff --git a/src/vs/editor/browser/widget/media/diffEditor.css b/src/vs/editor/browser/widget/media/diffEditor.css index 5e71f38a9bd..d0d723d9dc6 100644 --- a/src/vs/editor/browser/widget/media/diffEditor.css +++ b/src/vs/editor/browser/widget/media/diffEditor.css @@ -52,24 +52,24 @@ } .monaco-editor .insert-sign, .monaco-diff-editor .insert-sign { - background-image: url('addition.svg'); + background-image: url('addition-light.svg'); } .monaco-editor .delete-sign, .monaco-diff-editor .delete-sign { - background-image: url('deletion.svg'); + background-image: url('deletion-light.svg'); } .monaco-editor.vs-dark .insert-sign, .monaco-diff-editor.vs-dark .insert-sign, .monaco-editor.hc-black .insert-sign, .monaco-diff-editor.hc-black .insert-sign { - background-image: url('addition-inverse.svg'); + background-image: url('addition-dark.svg'); } .monaco-editor.vs-dark .delete-sign, .monaco-diff-editor.vs-dark .delete-sign, .monaco-editor.hc-black .delete-sign, .monaco-diff-editor.hc-black .delete-sign { - background-image: url('deletion-inverse.svg'); + background-image: url('deletion-dark.svg'); } .monaco-editor .inline-deleted-margin-view-zone { From 378ff3f4ccdb0e0c6069b3c166b24eabbb8c48ea Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Fri, 28 Jun 2019 09:38:30 -0700 Subject: [PATCH 0760/1449] add standalone detection --- src/vs/base/browser/browser.ts | 1 + .../services/keybinding/browser/keybindingService.ts | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/src/vs/base/browser/browser.ts b/src/vs/base/browser/browser.ts index 6a0cc217897..b447e0b68ec 100644 --- a/src/vs/base/browser/browser.ts +++ b/src/vs/base/browser/browser.ts @@ -122,6 +122,7 @@ export const isSafari = (!isChrome && (userAgent.indexOf('Safari') >= 0)); export const isWebkitWebView = (!isChrome && !isSafari && isWebKit); export const isIPad = (userAgent.indexOf('iPad') >= 0); export const isEdgeWebView = isEdge && (userAgent.indexOf('WebView/') >= 0); +export const isStandalone = (window.matchMedia('(display-mode: standalone)').matches); export function hasClipboardSupport() { if (isIE) { diff --git a/src/vs/workbench/services/keybinding/browser/keybindingService.ts b/src/vs/workbench/services/keybinding/browser/keybindingService.ts index 1ba9d627f16..fcd949b0b05 100644 --- a/src/vs/workbench/services/keybinding/browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/browser/keybindingService.ts @@ -345,6 +345,10 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { return false; } + if (browser.isStandalone) { + return false; + } + if (browser.isFullscreen() && (navigator).keyboard) { return false; } From 77539a30b678ab7c50154bcc82bd3261e7cf5932 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Fri, 28 Jun 2019 10:36:35 -0700 Subject: [PATCH 0761/1449] Update pr review comment icons --- .../browser/widget/media/diffEditor.css | 3 +- .../contrib/comments/browser/commentNode.ts | 4 +- .../comments/browser/commentThreadWidget.ts | 2 +- .../comments/browser/media/close-dark.svg | 3 + .../comments/browser/media/close-hc.svg | 3 + .../comments/browser/media/close-light.svg | 3 + .../contrib/comments/browser/media/close.svg | 1 - .../comments/browser/media/comment.svg | 1 - .../comments/browser/media/delete-dark.svg | 3 + .../comments/browser/media/delete-hc.svg | 3 + .../comments/browser/media/delete-light.svg | 3 + .../comments/browser/media/edit-dark.svg | 3 + .../comments/browser/media/edit-hc.svg | 3 + .../comments/browser/media/edit-light.svg | 3 + .../comments/browser/media/reaction-dark.svg | 7 +- .../comments/browser/media/reaction-hc.svg | 5 +- .../comments/browser/media/reaction-light.svg | 3 + .../comments/browser/media/reaction.svg | 4 - .../contrib/comments/browser/media/review.css | 132 ++++++++++-------- 19 files changed, 113 insertions(+), 76 deletions(-) create mode 100644 src/vs/workbench/contrib/comments/browser/media/close-dark.svg create mode 100644 src/vs/workbench/contrib/comments/browser/media/close-hc.svg create mode 100644 src/vs/workbench/contrib/comments/browser/media/close-light.svg delete mode 100644 src/vs/workbench/contrib/comments/browser/media/close.svg delete mode 100644 src/vs/workbench/contrib/comments/browser/media/comment.svg create mode 100644 src/vs/workbench/contrib/comments/browser/media/delete-dark.svg create mode 100644 src/vs/workbench/contrib/comments/browser/media/delete-hc.svg create mode 100644 src/vs/workbench/contrib/comments/browser/media/delete-light.svg create mode 100644 src/vs/workbench/contrib/comments/browser/media/edit-dark.svg create mode 100644 src/vs/workbench/contrib/comments/browser/media/edit-hc.svg create mode 100644 src/vs/workbench/contrib/comments/browser/media/edit-light.svg create mode 100644 src/vs/workbench/contrib/comments/browser/media/reaction-light.svg delete mode 100644 src/vs/workbench/contrib/comments/browser/media/reaction.svg diff --git a/src/vs/editor/browser/widget/media/diffEditor.css b/src/vs/editor/browser/widget/media/diffEditor.css index d0d723d9dc6..d70b8b88043 100644 --- a/src/vs/editor/browser/widget/media/diffEditor.css +++ b/src/vs/editor/browser/widget/media/diffEditor.css @@ -40,8 +40,7 @@ background-size: 60%; opacity: 0.7; background-repeat: no-repeat; - background-position: 50% 50%; - background-position: center; + background-position: 75% center; background-size: 11px 11px; } .monaco-editor.hc-black .insert-sign, diff --git a/src/vs/workbench/contrib/comments/browser/commentNode.ts b/src/vs/workbench/contrib/comments/browser/commentNode.ts index f4ac3fe8dd5..a08e664e1c5 100644 --- a/src/vs/workbench/contrib/comments/browser/commentNode.ts +++ b/src/vs/workbench/contrib/comments/browser/commentNode.ts @@ -542,7 +542,7 @@ export class CommentNode extends Disposable { } private createDeleteAction(): Action { - return new Action('comment.delete', nls.localize('label.delete', "Delete"), 'octicon octicon-x', true, () => { + return new Action('comment.delete', nls.localize('label.delete', "Delete"), 'delete', true, () => { return this.dialogService.confirm({ message: nls.localize('confirmDelete', "Delete comment?"), type: 'question', @@ -612,7 +612,7 @@ export class CommentNode extends Disposable { } private createEditAction(commentDetailsContainer: HTMLElement): Action { - return new Action('comment.edit', nls.localize('label.edit', "Edit"), 'octicon octicon-pencil', true, () => { + return new Action('comment.edit', nls.localize('label.edit', "Edit"), 'edit', true, () => { return this.editCommentAction(commentDetailsContainer); }); } diff --git a/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts b/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts index c385bfb630b..92a0c5c183d 100644 --- a/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts +++ b/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts @@ -49,7 +49,7 @@ import { CommentContextKeys } from 'vs/workbench/contrib/comments/common/comment import { CommentFormActions } from 'vs/workbench/contrib/comments/browser/commentFormActions'; export const COMMENTEDITOR_DECORATION_KEY = 'commenteditordecoration'; -const COLLAPSE_ACTION_CLASS = 'expand-review-action octicon octicon-chevron-up'; +const COLLAPSE_ACTION_CLASS = 'expand-review-action'; const COMMENT_SCHEME = 'comment'; diff --git a/src/vs/workbench/contrib/comments/browser/media/close-dark.svg b/src/vs/workbench/contrib/comments/browser/media/close-dark.svg new file mode 100644 index 00000000000..bf323a41d2c --- /dev/null +++ b/src/vs/workbench/contrib/comments/browser/media/close-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/comments/browser/media/close-hc.svg b/src/vs/workbench/contrib/comments/browser/media/close-hc.svg new file mode 100644 index 00000000000..29fafa5300a --- /dev/null +++ b/src/vs/workbench/contrib/comments/browser/media/close-hc.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/comments/browser/media/close-light.svg b/src/vs/workbench/contrib/comments/browser/media/close-light.svg new file mode 100644 index 00000000000..f214cc22e3b --- /dev/null +++ b/src/vs/workbench/contrib/comments/browser/media/close-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/comments/browser/media/close.svg b/src/vs/workbench/contrib/comments/browser/media/close.svg deleted file mode 100644 index 751e89b3b02..00000000000 --- a/src/vs/workbench/contrib/comments/browser/media/close.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/comments/browser/media/comment.svg b/src/vs/workbench/contrib/comments/browser/media/comment.svg deleted file mode 100644 index d78c6651a65..00000000000 --- a/src/vs/workbench/contrib/comments/browser/media/comment.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/comments/browser/media/delete-dark.svg b/src/vs/workbench/contrib/comments/browser/media/delete-dark.svg new file mode 100644 index 00000000000..75644595d19 --- /dev/null +++ b/src/vs/workbench/contrib/comments/browser/media/delete-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/comments/browser/media/delete-hc.svg b/src/vs/workbench/contrib/comments/browser/media/delete-hc.svg new file mode 100644 index 00000000000..75644595d19 --- /dev/null +++ b/src/vs/workbench/contrib/comments/browser/media/delete-hc.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/comments/browser/media/delete-light.svg b/src/vs/workbench/contrib/comments/browser/media/delete-light.svg new file mode 100644 index 00000000000..cf5f28ca35c --- /dev/null +++ b/src/vs/workbench/contrib/comments/browser/media/delete-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/comments/browser/media/edit-dark.svg b/src/vs/workbench/contrib/comments/browser/media/edit-dark.svg new file mode 100644 index 00000000000..c455cadaddc --- /dev/null +++ b/src/vs/workbench/contrib/comments/browser/media/edit-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/comments/browser/media/edit-hc.svg b/src/vs/workbench/contrib/comments/browser/media/edit-hc.svg new file mode 100644 index 00000000000..7420888ff47 --- /dev/null +++ b/src/vs/workbench/contrib/comments/browser/media/edit-hc.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/comments/browser/media/edit-light.svg b/src/vs/workbench/contrib/comments/browser/media/edit-light.svg new file mode 100644 index 00000000000..4c6c9b14261 --- /dev/null +++ b/src/vs/workbench/contrib/comments/browser/media/edit-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/comments/browser/media/reaction-dark.svg b/src/vs/workbench/contrib/comments/browser/media/reaction-dark.svg index b51dfbbd9b8..f2772365adb 100644 --- a/src/vs/workbench/contrib/comments/browser/media/reaction-dark.svg +++ b/src/vs/workbench/contrib/comments/browser/media/reaction-dark.svg @@ -1,4 +1,3 @@ - - - - \ No newline at end of file + + + diff --git a/src/vs/workbench/contrib/comments/browser/media/reaction-hc.svg b/src/vs/workbench/contrib/comments/browser/media/reaction-hc.svg index 2c7fa126dd9..3fae8d2124b 100644 --- a/src/vs/workbench/contrib/comments/browser/media/reaction-hc.svg +++ b/src/vs/workbench/contrib/comments/browser/media/reaction-hc.svg @@ -1,4 +1,3 @@ - - - + + diff --git a/src/vs/workbench/contrib/comments/browser/media/reaction-light.svg b/src/vs/workbench/contrib/comments/browser/media/reaction-light.svg new file mode 100644 index 00000000000..7933a47cc5d --- /dev/null +++ b/src/vs/workbench/contrib/comments/browser/media/reaction-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/comments/browser/media/reaction.svg b/src/vs/workbench/contrib/comments/browser/media/reaction.svg deleted file mode 100644 index 8696b8f2bab..00000000000 --- a/src/vs/workbench/contrib/comments/browser/media/reaction.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/vs/workbench/contrib/comments/browser/media/review.css b/src/vs/workbench/contrib/comments/browser/media/review.css index 5d147efe7ac..82ad6c76234 100644 --- a/src/vs/workbench/contrib/comments/browser/media/review.css +++ b/src/vs/workbench/contrib/comments/browser/media/review.css @@ -3,28 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -.monaco-editor .margin-view-overlays .review { - background-image: url('comment.svg'); - cursor: pointer; - background-repeat: no-repeat; - background-position: center center; -} - -.monaco-editor .comment-hint { - height: 20px; - width: 20px; - padding-left: 2px; - background: url('comment.svg') center center no-repeat; -} - -.monaco-editor .comment-hint.commenting-disabled { - opacity: 0.5; -} - -.monaco-editor .comment-hint:hover { - cursor: pointer; -} - .monaco-editor .review-widget { width: 100%; position: absolute; @@ -93,7 +71,6 @@ border-style: none; } - .monaco-editor .review-widget .body .comment-reactions .monaco-text-button { margin: 0 7px 0 0; width: 30px; @@ -175,10 +152,49 @@ display: inline-block; } +.monaco-editor .review-widget .head .review-actions > .monaco-action-bar .icon.expand-review-action { + background-image: url("./close-light.svg"); + background-size: 16px; +} + +.monaco-editor.vs-dark .review-widget .head .review-actions > .monaco-action-bar .icon.expand-review-action { + background-image: url("./close-dark.svg"); +} + +.monaco-editor.hc-black .review-widget .head .review-actions > .monaco-action-bar .icon.expand-review-action { + background-image: url("./close-hc.svg"); +} + +.monaco-editor .review-widget .body .review-comment .comment-title .icon.edit { + background-image: url("./edit-light.svg"); + background-size: 16px; +} + +.monaco-editor.vs-dark .review-widget .body .review-comment .comment-title .icon.edit { + background-image: url("./edit-dark.svg"); +} + +.monaco-editor.hc-black .review-widget .body .review-comment .comment-title .icon.edit { + background-image: url("./edit-hc.svg"); +} + +.monaco-editor .review-widget .body .review-comment .comment-title .icon.delete { + background-image: url("./delete-light.svg"); + background-size: 16px; +} + +.monaco-editor.vs-dark .review-widget .body .review-comment .comment-title .icon.delete { + background-image: url("./delete-dark.svg"); +} + +.monaco-editor.hc-black .review-widget .body .review-comment .comment-title .icon.delete { + background-image: url("./delete-hc.svg"); +} + .monaco-editor .review-widget .body .review-comment .review-comment-contents .comment-reactions .action-item a.action-label.toolbar-toggle-pickReactions { display: none; - background-image: url(./reaction.svg); - background-size: 24px; + background-image: url("./reaction-light.svg"); + background-size: 16px; width: 26px; height: 16px; background-repeat: no-repeat; @@ -189,21 +205,21 @@ .monaco-editor .review-widget .body .review-comment .review-comment-contents .comment-reactions:hover .action-item a.action-label.toolbar-toggle-pickReactions { display: inline-block; - background-size: 24px; + background-size: 16px; } .monaco-editor.vs-dark .review-widget .body .review-comment .review-comment-contents .comment-reactions .action-item a.action-label.toolbar-toggle-pickReactions { - background-image: url(./reaction-dark.svg); + background-image: url("./reaction-dark.svg"); } .monaco-editor.hc-black .review-widget .body .review-comment .review-comment-contents .comment-reactions .action-item a.action-label.toolbar-toggle-pickReactions { - background-image: url(./reaction-hc.svg); + background-image: url("./reaction-hc.svg"); } .monaco-editor .review-widget .body .review-comment .comment-title .action-label { display: block; - height: 18px; - line-height: 18px; + height: 16px; + line-height: 16px; min-width: 28px; background-size: 16px; background-position: center center; @@ -211,23 +227,23 @@ } .monaco-editor .review-widget .body .review-comment .comment-title .action-label.toolbar-toggle-pickReactions { - background-image: url(./reaction.svg); - width: 18px; - height: 18px; - background-size: 24px; + background-image: url("./reaction-light.svg"); + width: 16px; + height: 16px; + background-size: 16px; background-position: center; background-repeat: no-repeat; } .monaco-editor.vs-dark .review-widget .body .review-comment .comment-title .action-label.toolbar-toggle-pickReactions { - background-image: url(./reaction-dark.svg); + background-image: url("./reaction-dark.svg"); } .monaco-editor.hc-black .review-widget .body .review-comment .comment-title .action-label.toolbar-toggle-pickReactions { - background-image: url(./reaction-hc.svg); + background-image: url("./reaction-hc.svg"); } -.monaco-editor .review-widget .body .review-comment .review-comment-contents .comment-reactions .action-item a.action-label{ +.monaco-editor .review-widget .body .review-comment .review-comment-contents .comment-reactions .action-item a.action-label { border: 1px solid transparent; } @@ -254,7 +270,7 @@ } .monaco-editor .review-widget .body .comment-body p:last-child, -.monaco-editor .review-widget .body.comment-body ul:last-child { +.monaco-editor .review-widget .body.comment-body ul:last-child { margin-bottom: 0; } @@ -262,11 +278,11 @@ padding-left: 20px; } -.monaco-editor .review-widget .body .comment-body li>p { +.monaco-editor .review-widget .body .comment-body li > p { margin-bottom: 0; } -.monaco-editor .review-widget .body .comment-body li>ul { +.monaco-editor .review-widget .body .comment-body li > ul { margin-top: 0; } @@ -292,11 +308,11 @@ overflow: hidden; text-align: left; width: 100%; - box-sizing: border-box; - -webkit-box-sizing: border-box; - -o-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; + box-sizing: border-box; + -webkit-box-sizing: border-box; + -o-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; padding: 0.4em; font-size: 12px; line-height: 17px; @@ -408,20 +424,20 @@ padding-right: 2px; } -.monaco-editor .review-widget .head .review-actions>.monaco-action-bar { +.monaco-editor .review-widget .head .review-actions > .monaco-action-bar { display: inline-block; } -.monaco-editor .review-widget .head .review-actions>.monaco-action-bar, -.monaco-editor .review-widget .head .review-actions>.monaco-action-bar>.actions-container { +.monaco-editor .review-widget .head .review-actions > .monaco-action-bar, +.monaco-editor .review-widget .head .review-actions > .monaco-action-bar > .actions-container { height: 100%; } -.monaco-editor .review-widget .head .review-actions>.monaco-action-bar .action-item { +.monaco-editor .review-widget .head .review-actions > .monaco-action-bar .action-item { margin-left: 4px; } -.monaco-editor .review-widget .head .review-actions>.monaco-action-bar .action-label { +.monaco-editor .review-widget .head .review-actions > .monaco-action-bar .action-label { width: 16px; height: 100%; margin: 0; @@ -430,15 +446,15 @@ background-position: center center; } -.monaco-editor .review-widget .head .review-actions>.monaco-action-bar .action-label.octicon { +.monaco-editor .review-widget .head .review-actions > .monaco-action-bar .action-label.octicon { margin: 0; } .monaco-editor .review-widget .head .review-actions .action-label.icon.close-review-action { - background: url('close.svg') center center no-repeat; + background: url("./close.svg") center center no-repeat; } -.monaco-editor .review-widget>.body { +.monaco-editor .review-widget > .body { border-top: 1px solid; position: relative; } @@ -452,14 +468,14 @@ .monaco-editor .comment-range-glyph:before { position: absolute; - content: ''; + content: ""; height: 100%; width: 0; left: -2px; transition: width 80ms linear, left 80ms linear; } -.monaco-editor .margin-view-overlays>div:hover>.comment-range-glyph.comment-diff-added:before, +.monaco-editor .margin-view-overlays > div:hover > .comment-range-glyph.comment-diff-added:before, .monaco-editor .comment-range-glyph.comment-thread:before { position: absolute; height: 100%; @@ -474,8 +490,8 @@ justify-content: center; } -.monaco-editor .margin-view-overlays>div:hover>.comment-range-glyph.comment-diff-added:before { - content: '+'; +.monaco-editor .margin-view-overlays > div:hover > .comment-range-glyph.comment-diff-added:before { + content: "+"; } .monaco-editor .comment-range-glyph.comment-thread { @@ -483,7 +499,7 @@ } .monaco-editor .comment-range-glyph.comment-thread:before { - content: '◆'; + content: "◆"; font-size: 10px; line-height: 100%; z-index: 20; From 3b0870083c38c673068402794e4573e6e1525448 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Fri, 28 Jun 2019 11:03:28 -0700 Subject: [PATCH 0762/1449] Update more icons --- .../parts/editor/media/close-dirty-dark.svg | 3 +++ .../parts/editor/media/close-dirty-light.svg | 3 +++ .../parts/editor/media/tabstitlecontrol.css | 8 ++++---- .../browser/parts/quickopen/media/dirty-dark.svg | 3 +++ .../parts/quickopen/media/dirty-inverse.svg | 1 - .../parts/quickopen/media/dirty-light.svg | 3 +++ .../browser/parts/quickopen/media/dirty.svg | 1 - .../browser/parts/quickopen/media/quickopen.css | 4 ++-- .../electron-browser/extensions.contribution.ts | 16 ++++++++-------- .../extensions/electron-browser/media/clear.svg | 1 - .../electron-browser/media/manage-inverse.svg | 1 - .../extensions/electron-browser/media/manage.svg | 1 - .../media/profile-start-dark.svg | 10 ++++++++++ .../media/profile-start-inverse.svg | 1 - .../media/profile-start-light.svg | 10 ++++++++++ .../electron-browser/media/profile-start.svg | 1 - .../electron-browser/media/profile-stop-dark.svg | 10 ++++++++++ .../media/profile-stop-inverse.svg | 1 - .../media/profile-stop-light.svg | 10 ++++++++++ .../electron-browser/media/profile-stop.svg | 1 - .../electron-browser/media/save-dark.svg | 3 +++ .../electron-browser/media/save-inverse.svg | 1 - .../electron-browser/media/save-light.svg | 3 +++ .../extensions/electron-browser/media/save.svg | 1 - .../electron-browser/media/start-dark.svg | 3 +++ .../electron-browser/media/start-inverse.svg | 1 - .../electron-browser/media/start-light.svg | 3 +++ .../extensions/electron-browser/media/start.svg | 1 - .../files/browser/fileActions.contribution.ts | 8 ++++---- .../files/browser/media/AddFolder_inverse.svg | 3 --- .../contrib/files/browser/media/check-dark.svg | 3 +++ .../files/browser/media/check-inverse.svg | 1 - .../contrib/files/browser/media/check-light.svg | 3 +++ .../contrib/files/browser/media/check.svg | 1 - .../contrib/files/browser/media/undo-dark.svg | 3 +++ .../contrib/files/browser/media/undo-inverse.svg | 1 - .../contrib/files/browser/media/undo-light.svg | 3 +++ .../contrib/files/browser/media/undo.svg | 1 - .../preferences/browser/media/collapseAll.svg | 1 - .../browser/media/collapseAll_inverse.svg | 1 - .../preferences/browser/media/preferences.css | 12 +----------- 41 files changed, 95 insertions(+), 51 deletions(-) create mode 100644 src/vs/workbench/browser/parts/editor/media/close-dirty-dark.svg create mode 100644 src/vs/workbench/browser/parts/editor/media/close-dirty-light.svg create mode 100644 src/vs/workbench/browser/parts/quickopen/media/dirty-dark.svg delete mode 100644 src/vs/workbench/browser/parts/quickopen/media/dirty-inverse.svg create mode 100644 src/vs/workbench/browser/parts/quickopen/media/dirty-light.svg delete mode 100644 src/vs/workbench/browser/parts/quickopen/media/dirty.svg delete mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/clear.svg delete mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/manage-inverse.svg delete mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/manage.svg create mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/profile-start-dark.svg delete mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/profile-start-inverse.svg create mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/profile-start-light.svg delete mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/profile-start.svg create mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/profile-stop-dark.svg delete mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/profile-stop-inverse.svg create mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/profile-stop-light.svg delete mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/profile-stop.svg create mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/save-dark.svg delete mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/save-inverse.svg create mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/save-light.svg delete mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/save.svg create mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/start-dark.svg delete mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/start-inverse.svg create mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/start-light.svg delete mode 100644 src/vs/workbench/contrib/extensions/electron-browser/media/start.svg delete mode 100644 src/vs/workbench/contrib/files/browser/media/AddFolder_inverse.svg create mode 100644 src/vs/workbench/contrib/files/browser/media/check-dark.svg delete mode 100644 src/vs/workbench/contrib/files/browser/media/check-inverse.svg create mode 100644 src/vs/workbench/contrib/files/browser/media/check-light.svg delete mode 100644 src/vs/workbench/contrib/files/browser/media/check.svg create mode 100644 src/vs/workbench/contrib/files/browser/media/undo-dark.svg delete mode 100644 src/vs/workbench/contrib/files/browser/media/undo-inverse.svg create mode 100644 src/vs/workbench/contrib/files/browser/media/undo-light.svg delete mode 100644 src/vs/workbench/contrib/files/browser/media/undo.svg delete mode 100644 src/vs/workbench/contrib/preferences/browser/media/collapseAll.svg delete mode 100644 src/vs/workbench/contrib/preferences/browser/media/collapseAll_inverse.svg diff --git a/src/vs/workbench/browser/parts/editor/media/close-dirty-dark.svg b/src/vs/workbench/browser/parts/editor/media/close-dirty-dark.svg new file mode 100644 index 00000000000..51946be5bb7 --- /dev/null +++ b/src/vs/workbench/browser/parts/editor/media/close-dirty-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/editor/media/close-dirty-light.svg b/src/vs/workbench/browser/parts/editor/media/close-dirty-light.svg new file mode 100644 index 00000000000..fb91225b968 --- /dev/null +++ b/src/vs/workbench/browser/parts/editor/media/close-dirty-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/editor/media/tabstitlecontrol.css b/src/vs/workbench/browser/parts/editor/media/tabstitlecontrol.css index e8e15cfb2e5..0dbc324ad17 100644 --- a/src/vs/workbench/browser/parts/editor/media/tabstitlecontrol.css +++ b/src/vs/workbench/browser/parts/editor/media/tabstitlecontrol.css @@ -217,12 +217,12 @@ } .vs .monaco-workbench .part.editor > .content .editor-group-container > .title .tabs-container > .tab.dirty .close-editor-action { - background: url('close-dirty.svg') center center no-repeat; + background: url('close-dirty-light.svg') center center no-repeat; } .vs-dark .monaco-workbench .part.editor > .content .editor-group-container > .title .tabs-container > .tab.dirty .close-editor-action, .hc-black .monaco-workbench .part.editor > .content .editor-group-container > .title .tabs-container > .tab.dirty .close-editor-action { - background: url('close-dirty-inverse.svg') center center no-repeat; + background: url('close-dirty-dark.svg') center center no-repeat; } .vs .monaco-workbench .part.editor > .content .editor-group-container > .title .tabs-container > .tab.dirty .close-editor-action:hover { @@ -255,12 +255,12 @@ } .vs .monaco-workbench .part.editor > .content .editor-group-container > .title .tabs-container > .tab.close-button-off.dirty:not(.dirty-border-top) { - background-image: url('close-dirty.svg'); + background-image: url('close-dirty-light.svg'); } .vs-dark .monaco-workbench .part.editor > .content .editor-group-container > .title .tabs-container > .tab.close-button-off.dirty:not(.dirty-border-top), .hc-black .monaco-workbench .part.editor > .content .editor-group-container > .title .tabs-container > .tab.close-button-off.dirty { - background-image: url('close-dirty-inverse.svg'); + background-image: url('close-dirty-dark.svg'); } /* Editor Actions */ diff --git a/src/vs/workbench/browser/parts/quickopen/media/dirty-dark.svg b/src/vs/workbench/browser/parts/quickopen/media/dirty-dark.svg new file mode 100644 index 00000000000..51946be5bb7 --- /dev/null +++ b/src/vs/workbench/browser/parts/quickopen/media/dirty-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/quickopen/media/dirty-inverse.svg b/src/vs/workbench/browser/parts/quickopen/media/dirty-inverse.svg deleted file mode 100644 index 02dafab76fc..00000000000 --- a/src/vs/workbench/browser/parts/quickopen/media/dirty-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/quickopen/media/dirty-light.svg b/src/vs/workbench/browser/parts/quickopen/media/dirty-light.svg new file mode 100644 index 00000000000..fb91225b968 --- /dev/null +++ b/src/vs/workbench/browser/parts/quickopen/media/dirty-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/quickopen/media/dirty.svg b/src/vs/workbench/browser/parts/quickopen/media/dirty.svg deleted file mode 100644 index 409e5fa539c..00000000000 --- a/src/vs/workbench/browser/parts/quickopen/media/dirty.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/quickopen/media/quickopen.css b/src/vs/workbench/browser/parts/quickopen/media/quickopen.css index 5907d081bf5..2143d469c09 100644 --- a/src/vs/workbench/browser/parts/quickopen/media/quickopen.css +++ b/src/vs/workbench/browser/parts/quickopen/media/quickopen.css @@ -15,10 +15,10 @@ } .vs .monaco-workbench .monaco-quick-open-widget .quick-open-tree .quick-open-entry .quick-open-entry-icon.dirty { - background-image: url('dirty.svg'); + background-image: url('dirty-dark.svg'); } .hc-black .monaco-workbench .monaco-quick-open-widget .quick-open-tree .quick-open-entry .quick-open-entry-icon.dirty, .vs-dark .monaco-workbench .monaco-quick-open-widget .quick-open-tree .quick-open-entry .quick-open-entry-icon.dirty { - background-image: url('dirty-inverse.svg'); + background-image: url('dirty-light.svg'); } \ No newline at end of file diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts index aa632ac96e9..77643b4b45f 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts @@ -337,8 +337,8 @@ MenuRegistry.appendMenuItem(MenuId.EditorTitle, { id: DebugExtensionHostAction.ID, title: DebugExtensionHostAction.LABEL, iconLocation: { - dark: URI.parse(require.toUrl(`vs/workbench/contrib/extensions/electron-browser/media/start-inverse.svg`)), - light: URI.parse(require.toUrl(`vs/workbench/contrib/extensions/electron-browser/media/start.svg`)), + dark: URI.parse(require.toUrl(`vs/workbench/contrib/extensions/electron-browser/media/start-dark.svg`)), + light: URI.parse(require.toUrl(`vs/workbench/contrib/extensions/electron-browser/media/start-light.svg`)), } }, group: 'navigation', @@ -350,8 +350,8 @@ MenuRegistry.appendMenuItem(MenuId.EditorTitle, { id: StartExtensionHostProfileAction.ID, title: StartExtensionHostProfileAction.LABEL, iconLocation: { - dark: URI.parse(require.toUrl(`vs/workbench/contrib/extensions/electron-browser/media/profile-start-inverse.svg`)), - light: URI.parse(require.toUrl(`vs/workbench/contrib/extensions/electron-browser/media/profile-start.svg`)), + dark: URI.parse(require.toUrl(`vs/workbench/contrib/extensions/electron-browser/media/profile-start-dark.svg`)), + light: URI.parse(require.toUrl(`vs/workbench/contrib/extensions/electron-browser/media/profile-start-light.svg`)), } }, group: 'navigation', @@ -363,8 +363,8 @@ MenuRegistry.appendMenuItem(MenuId.EditorTitle, { id: StopExtensionHostProfileAction.ID, title: StopExtensionHostProfileAction.LABEL, iconLocation: { - dark: URI.parse(require.toUrl(`vs/workbench/contrib/extensions/electron-browser/media/profile-stop-inverse.svg`)), - light: URI.parse(require.toUrl(`vs/workbench/contrib/extensions/electron-browser/media/profile-stop.svg`)), + dark: URI.parse(require.toUrl(`vs/workbench/contrib/extensions/electron-browser/media/profile-stop-dark.svg`)), + light: URI.parse(require.toUrl(`vs/workbench/contrib/extensions/electron-browser/media/profile-stop-light.svg`)), } }, group: 'navigation', @@ -376,8 +376,8 @@ MenuRegistry.appendMenuItem(MenuId.EditorTitle, { id: SaveExtensionHostProfileAction.ID, title: SaveExtensionHostProfileAction.LABEL, iconLocation: { - dark: URI.parse(require.toUrl(`vs/workbench/contrib/extensions/electron-browser/media/save-inverse.svg`)), - light: URI.parse(require.toUrl(`vs/workbench/contrib/extensions/electron-browser/media/save.svg`)), + dark: URI.parse(require.toUrl(`vs/workbench/contrib/extensions/electron-browser/media/save-dark.svg`)), + light: URI.parse(require.toUrl(`vs/workbench/contrib/extensions/electron-browser/media/save-light.svg`)), }, precondition: CONTEXT_EXTENSION_HOST_PROFILE_RECORDED }, diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/clear.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/clear.svg deleted file mode 100644 index ef02703e10b..00000000000 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/clear.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/manage-inverse.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/manage-inverse.svg deleted file mode 100644 index 61baaea2b8b..00000000000 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/manage-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/manage.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/manage.svg deleted file mode 100644 index 3dec2ba50fd..00000000000 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/manage.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/profile-start-dark.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/profile-start-dark.svg new file mode 100644 index 00000000000..c67e550c15f --- /dev/null +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/profile-start-dark.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/profile-start-inverse.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/profile-start-inverse.svg deleted file mode 100644 index 6fa378a7fa5..00000000000 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/profile-start-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/profile-start-light.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/profile-start-light.svg new file mode 100644 index 00000000000..c67e550c15f --- /dev/null +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/profile-start-light.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/profile-start.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/profile-start.svg deleted file mode 100644 index 184a953726c..00000000000 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/profile-start.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/profile-stop-dark.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/profile-stop-dark.svg new file mode 100644 index 00000000000..a0948780ee4 --- /dev/null +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/profile-stop-dark.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/profile-stop-inverse.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/profile-stop-inverse.svg deleted file mode 100644 index ed989422ee9..00000000000 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/profile-stop-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/profile-stop-light.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/profile-stop-light.svg new file mode 100644 index 00000000000..d9222c3c312 --- /dev/null +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/profile-stop-light.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/profile-stop.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/profile-stop.svg deleted file mode 100644 index 22656a29c7d..00000000000 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/profile-stop.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/save-dark.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/save-dark.svg new file mode 100644 index 00000000000..8acad37a99c --- /dev/null +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/save-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/save-inverse.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/save-inverse.svg deleted file mode 100644 index 01c42bce304..00000000000 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/save-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/save-light.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/save-light.svg new file mode 100644 index 00000000000..529e489a816 --- /dev/null +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/save-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/save.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/save.svg deleted file mode 100644 index 01e1ca99bdf..00000000000 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/save.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/start-dark.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/start-dark.svg new file mode 100644 index 00000000000..9debdf8c625 --- /dev/null +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/start-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/start-inverse.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/start-inverse.svg deleted file mode 100644 index 3be0c24f6ff..00000000000 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/start-inverse.svg +++ /dev/null @@ -1 +0,0 @@ -continue \ No newline at end of file diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/start-light.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/start-light.svg new file mode 100644 index 00000000000..dac8bdae31f --- /dev/null +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/start-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/start.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/start.svg deleted file mode 100644 index 9ef467f2c04..00000000000 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/start.svg +++ /dev/null @@ -1 +0,0 @@ -continue \ No newline at end of file diff --git a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts index 1f20e01c590..6a8354106cd 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts @@ -161,12 +161,12 @@ function appendEditorTitleContextMenuItem(id: string, title: string, when: Conte // Editor Title Menu for Conflict Resolution appendSaveConflictEditorTitleAction('workbench.files.action.acceptLocalChanges', nls.localize('acceptLocalChanges', "Use your changes and overwrite file contents"), { - light: URI.parse(require.toUrl(`vs/workbench/contrib/files/browser/media/check.svg`)), - dark: URI.parse(require.toUrl(`vs/workbench/contrib/files/browser/media/check-inverse.svg`)) + light: URI.parse(require.toUrl(`vs/workbench/contrib/files/browser/media/check-light.svg`)), + dark: URI.parse(require.toUrl(`vs/workbench/contrib/files/browser/media/check-dark.svg`)) }, -10, acceptLocalChangesCommand); appendSaveConflictEditorTitleAction('workbench.files.action.revertLocalChanges', nls.localize('revertLocalChanges', "Discard your changes and revert to file contents"), { - light: URI.parse(require.toUrl(`vs/workbench/contrib/files/browser/media/undo.svg`)), - dark: URI.parse(require.toUrl(`vs/workbench/contrib/files/browser/media/undo-inverse.svg`)) + light: URI.parse(require.toUrl(`vs/workbench/contrib/files/browser/media/undo-light.svg`)), + dark: URI.parse(require.toUrl(`vs/workbench/contrib/files/browser/media/undo-dark.svg`)) }, -9, revertLocalChangesCommand); function appendSaveConflictEditorTitleAction(id: string, title: string, iconLocation: { dark: URI; light?: URI; }, order: number, command: ICommandHandler): void { diff --git a/src/vs/workbench/contrib/files/browser/media/AddFolder_inverse.svg b/src/vs/workbench/contrib/files/browser/media/AddFolder_inverse.svg deleted file mode 100644 index d7e483bf25e..00000000000 --- a/src/vs/workbench/contrib/files/browser/media/AddFolder_inverse.svg +++ /dev/null @@ -1,3 +0,0 @@ - -]> \ No newline at end of file diff --git a/src/vs/workbench/contrib/files/browser/media/check-dark.svg b/src/vs/workbench/contrib/files/browser/media/check-dark.svg new file mode 100644 index 00000000000..865cc83c347 --- /dev/null +++ b/src/vs/workbench/contrib/files/browser/media/check-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/files/browser/media/check-inverse.svg b/src/vs/workbench/contrib/files/browser/media/check-inverse.svg deleted file mode 100644 index c225b2f597f..00000000000 --- a/src/vs/workbench/contrib/files/browser/media/check-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/files/browser/media/check-light.svg b/src/vs/workbench/contrib/files/browser/media/check-light.svg new file mode 100644 index 00000000000..e1a546660ed --- /dev/null +++ b/src/vs/workbench/contrib/files/browser/media/check-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/files/browser/media/check.svg b/src/vs/workbench/contrib/files/browser/media/check.svg deleted file mode 100644 index 3f365c4800e..00000000000 --- a/src/vs/workbench/contrib/files/browser/media/check.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/files/browser/media/undo-dark.svg b/src/vs/workbench/contrib/files/browser/media/undo-dark.svg new file mode 100644 index 00000000000..de85d6ba679 --- /dev/null +++ b/src/vs/workbench/contrib/files/browser/media/undo-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/files/browser/media/undo-inverse.svg b/src/vs/workbench/contrib/files/browser/media/undo-inverse.svg deleted file mode 100644 index c060a04160f..00000000000 --- a/src/vs/workbench/contrib/files/browser/media/undo-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/files/browser/media/undo-light.svg b/src/vs/workbench/contrib/files/browser/media/undo-light.svg new file mode 100644 index 00000000000..b70626957d0 --- /dev/null +++ b/src/vs/workbench/contrib/files/browser/media/undo-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/contrib/files/browser/media/undo.svg b/src/vs/workbench/contrib/files/browser/media/undo.svg deleted file mode 100644 index 4fe7069372e..00000000000 --- a/src/vs/workbench/contrib/files/browser/media/undo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/preferences/browser/media/collapseAll.svg b/src/vs/workbench/contrib/preferences/browser/media/collapseAll.svg deleted file mode 100644 index 7d11a30f6e0..00000000000 --- a/src/vs/workbench/contrib/preferences/browser/media/collapseAll.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/preferences/browser/media/collapseAll_inverse.svg b/src/vs/workbench/contrib/preferences/browser/media/collapseAll_inverse.svg deleted file mode 100644 index 46a65fff71a..00000000000 --- a/src/vs/workbench/contrib/preferences/browser/media/collapseAll_inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/contrib/preferences/browser/media/preferences.css b/src/vs/workbench/contrib/preferences/browser/media/preferences.css index 3d93ba5a766..18a8d426dac 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/preferences.css +++ b/src/vs/workbench/contrib/preferences/browser/media/preferences.css @@ -245,14 +245,4 @@ padding: 10px; border-radius: 5px; cursor: pointer; -} - -.title-actions .action-item .icon.collapseAll, -.editor-actions .action-item .icon.collapseAll { - background: url('collapseAll.svg') center center no-repeat; -} - -.vs-dark .title-actions .action-item .icon.collapseAll, -.vs-dark .editor-actions .action-item .icon.collapseAll { - background: url('collapseAll_inverse.svg') center center no-repeat; -} +} \ No newline at end of file From 0233b6362374d35755a9ea6a114415b570ae2bb5 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Fri, 28 Jun 2019 11:31:09 -0700 Subject: [PATCH 0763/1449] Update gears and edit icons --- .../browser/parts/notifications/media/configure-dark.svg | 3 ++- .../browser/parts/notifications/media/configure-light.svg | 3 ++- src/vs/workbench/contrib/comments/browser/media/edit-dark.svg | 3 ++- src/vs/workbench/contrib/comments/browser/media/edit-hc.svg | 3 ++- src/vs/workbench/contrib/comments/browser/media/edit-light.svg | 3 ++- .../workbench/contrib/debug/browser/media/configure-dark.svg | 3 ++- src/vs/workbench/contrib/debug/browser/media/configure-hc.svg | 3 ++- .../workbench/contrib/debug/browser/media/configure-light.svg | 3 ++- .../extensions/electron-browser/media/configure-dark.svg | 3 ++- .../contrib/extensions/electron-browser/media/configure-hc.svg | 3 ++- .../extensions/electron-browser/media/configure-light.svg | 3 ++- .../contrib/preferences/browser/media/configure-dark.svg | 3 ++- .../contrib/preferences/browser/media/configure-light.svg | 3 ++- .../workbench/contrib/preferences/browser/media/edit-dark.svg | 3 ++- .../workbench/contrib/preferences/browser/media/edit-light.svg | 3 ++- src/vs/workbench/contrib/tasks/common/media/configure-dark.svg | 3 ++- .../workbench/contrib/tasks/common/media/configure-light.svg | 3 ++- .../contrib/terminal/browser/media/configure-dark.svg | 3 ++- .../workbench/contrib/terminal/browser/media/configure-hc.svg | 3 ++- .../contrib/terminal/browser/media/configure-light.svg | 3 ++- 20 files changed, 40 insertions(+), 20 deletions(-) diff --git a/src/vs/workbench/browser/parts/notifications/media/configure-dark.svg b/src/vs/workbench/browser/parts/notifications/media/configure-dark.svg index a0ddc9b9fd1..b86450be44a 100644 --- a/src/vs/workbench/browser/parts/notifications/media/configure-dark.svg +++ b/src/vs/workbench/browser/parts/notifications/media/configure-dark.svg @@ -1,3 +1,4 @@ - + + diff --git a/src/vs/workbench/browser/parts/notifications/media/configure-light.svg b/src/vs/workbench/browser/parts/notifications/media/configure-light.svg index b391a9663a2..067e45d1c40 100644 --- a/src/vs/workbench/browser/parts/notifications/media/configure-light.svg +++ b/src/vs/workbench/browser/parts/notifications/media/configure-light.svg @@ -1,3 +1,4 @@ - + + diff --git a/src/vs/workbench/contrib/comments/browser/media/edit-dark.svg b/src/vs/workbench/contrib/comments/browser/media/edit-dark.svg index c455cadaddc..a72757482be 100644 --- a/src/vs/workbench/contrib/comments/browser/media/edit-dark.svg +++ b/src/vs/workbench/contrib/comments/browser/media/edit-dark.svg @@ -1,3 +1,4 @@ - + + diff --git a/src/vs/workbench/contrib/comments/browser/media/edit-hc.svg b/src/vs/workbench/contrib/comments/browser/media/edit-hc.svg index 7420888ff47..b507253e449 100644 --- a/src/vs/workbench/contrib/comments/browser/media/edit-hc.svg +++ b/src/vs/workbench/contrib/comments/browser/media/edit-hc.svg @@ -1,3 +1,4 @@ - + + diff --git a/src/vs/workbench/contrib/comments/browser/media/edit-light.svg b/src/vs/workbench/contrib/comments/browser/media/edit-light.svg index 4c6c9b14261..ae71150c0c8 100644 --- a/src/vs/workbench/contrib/comments/browser/media/edit-light.svg +++ b/src/vs/workbench/contrib/comments/browser/media/edit-light.svg @@ -1,3 +1,4 @@ - + + diff --git a/src/vs/workbench/contrib/debug/browser/media/configure-dark.svg b/src/vs/workbench/contrib/debug/browser/media/configure-dark.svg index a0ddc9b9fd1..b86450be44a 100644 --- a/src/vs/workbench/contrib/debug/browser/media/configure-dark.svg +++ b/src/vs/workbench/contrib/debug/browser/media/configure-dark.svg @@ -1,3 +1,4 @@ - + + diff --git a/src/vs/workbench/contrib/debug/browser/media/configure-hc.svg b/src/vs/workbench/contrib/debug/browser/media/configure-hc.svg index 3151e77fa13..50ad319fa69 100644 --- a/src/vs/workbench/contrib/debug/browser/media/configure-hc.svg +++ b/src/vs/workbench/contrib/debug/browser/media/configure-hc.svg @@ -1,3 +1,4 @@ - + + diff --git a/src/vs/workbench/contrib/debug/browser/media/configure-light.svg b/src/vs/workbench/contrib/debug/browser/media/configure-light.svg index b391a9663a2..067e45d1c40 100644 --- a/src/vs/workbench/contrib/debug/browser/media/configure-light.svg +++ b/src/vs/workbench/contrib/debug/browser/media/configure-light.svg @@ -1,3 +1,4 @@ - + + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/configure-dark.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-dark.svg index a0ddc9b9fd1..b86450be44a 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/configure-dark.svg +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-dark.svg @@ -1,3 +1,4 @@ - + + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/configure-hc.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-hc.svg index 3151e77fa13..50ad319fa69 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/configure-hc.svg +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-hc.svg @@ -1,3 +1,4 @@ - + + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/configure-light.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-light.svg index b391a9663a2..067e45d1c40 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/configure-light.svg +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-light.svg @@ -1,3 +1,4 @@ - + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/configure-dark.svg b/src/vs/workbench/contrib/preferences/browser/media/configure-dark.svg index a0ddc9b9fd1..b86450be44a 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/configure-dark.svg +++ b/src/vs/workbench/contrib/preferences/browser/media/configure-dark.svg @@ -1,3 +1,4 @@ - + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/configure-light.svg b/src/vs/workbench/contrib/preferences/browser/media/configure-light.svg index b391a9663a2..b86450be44a 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/configure-light.svg +++ b/src/vs/workbench/contrib/preferences/browser/media/configure-light.svg @@ -1,3 +1,4 @@ - + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/edit-dark.svg b/src/vs/workbench/contrib/preferences/browser/media/edit-dark.svg index c455cadaddc..a72757482be 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/edit-dark.svg +++ b/src/vs/workbench/contrib/preferences/browser/media/edit-dark.svg @@ -1,3 +1,4 @@ - + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/edit-light.svg b/src/vs/workbench/contrib/preferences/browser/media/edit-light.svg index 4c6c9b14261..ae71150c0c8 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/edit-light.svg +++ b/src/vs/workbench/contrib/preferences/browser/media/edit-light.svg @@ -1,3 +1,4 @@ - + + diff --git a/src/vs/workbench/contrib/tasks/common/media/configure-dark.svg b/src/vs/workbench/contrib/tasks/common/media/configure-dark.svg index a0ddc9b9fd1..b86450be44a 100644 --- a/src/vs/workbench/contrib/tasks/common/media/configure-dark.svg +++ b/src/vs/workbench/contrib/tasks/common/media/configure-dark.svg @@ -1,3 +1,4 @@ - + + diff --git a/src/vs/workbench/contrib/tasks/common/media/configure-light.svg b/src/vs/workbench/contrib/tasks/common/media/configure-light.svg index b391a9663a2..067e45d1c40 100644 --- a/src/vs/workbench/contrib/tasks/common/media/configure-light.svg +++ b/src/vs/workbench/contrib/tasks/common/media/configure-light.svg @@ -1,3 +1,4 @@ - + + diff --git a/src/vs/workbench/contrib/terminal/browser/media/configure-dark.svg b/src/vs/workbench/contrib/terminal/browser/media/configure-dark.svg index a0ddc9b9fd1..b86450be44a 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/configure-dark.svg +++ b/src/vs/workbench/contrib/terminal/browser/media/configure-dark.svg @@ -1,3 +1,4 @@ - + + diff --git a/src/vs/workbench/contrib/terminal/browser/media/configure-hc.svg b/src/vs/workbench/contrib/terminal/browser/media/configure-hc.svg index 3151e77fa13..50ad319fa69 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/configure-hc.svg +++ b/src/vs/workbench/contrib/terminal/browser/media/configure-hc.svg @@ -1,3 +1,4 @@ - + + diff --git a/src/vs/workbench/contrib/terminal/browser/media/configure-light.svg b/src/vs/workbench/contrib/terminal/browser/media/configure-light.svg index b391a9663a2..067e45d1c40 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/configure-light.svg +++ b/src/vs/workbench/contrib/terminal/browser/media/configure-light.svg @@ -1,3 +1,4 @@ - + + From 6a8190fe9c7b9672da7637d3b8df8d503733cf72 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Fri, 28 Jun 2019 11:41:46 -0700 Subject: [PATCH 0764/1449] Update dialog icons --- src/vs/base/browser/ui/dialog/close-dark.svg | 3 +++ .../base/browser/ui/dialog/close-inverse.svg | 1 - src/vs/base/browser/ui/dialog/close-light.svg | 3 +++ src/vs/base/browser/ui/dialog/close.svg | 1 - src/vs/base/browser/ui/dialog/dialog.css | 24 ++++++++--------- src/vs/base/browser/ui/dialog/error-dark.svg | 3 +++ .../base/browser/ui/dialog/error-inverse.svg | 26 ------------------- src/vs/base/browser/ui/dialog/error-light.svg | 3 +++ src/vs/base/browser/ui/dialog/error.svg | 25 ------------------ src/vs/base/browser/ui/dialog/info-dark.svg | 3 +++ .../base/browser/ui/dialog/info-inverse.svg | 17 ------------ src/vs/base/browser/ui/dialog/info-light.svg | 4 +++ src/vs/base/browser/ui/dialog/info.svg | 17 ------------ .../base/browser/ui/dialog/warning-dark.svg | 3 +++ .../browser/ui/dialog/warning-inverse.svg | 15 ----------- .../base/browser/ui/dialog/warning-light.svg | 4 +++ src/vs/base/browser/ui/dialog/warning.svg | 15 ----------- 17 files changed, 38 insertions(+), 129 deletions(-) create mode 100644 src/vs/base/browser/ui/dialog/close-dark.svg delete mode 100644 src/vs/base/browser/ui/dialog/close-inverse.svg create mode 100644 src/vs/base/browser/ui/dialog/close-light.svg delete mode 100644 src/vs/base/browser/ui/dialog/close.svg create mode 100644 src/vs/base/browser/ui/dialog/error-dark.svg delete mode 100644 src/vs/base/browser/ui/dialog/error-inverse.svg create mode 100644 src/vs/base/browser/ui/dialog/error-light.svg delete mode 100644 src/vs/base/browser/ui/dialog/error.svg create mode 100644 src/vs/base/browser/ui/dialog/info-dark.svg delete mode 100644 src/vs/base/browser/ui/dialog/info-inverse.svg create mode 100644 src/vs/base/browser/ui/dialog/info-light.svg delete mode 100644 src/vs/base/browser/ui/dialog/info.svg create mode 100644 src/vs/base/browser/ui/dialog/warning-dark.svg delete mode 100644 src/vs/base/browser/ui/dialog/warning-inverse.svg create mode 100644 src/vs/base/browser/ui/dialog/warning-light.svg delete mode 100644 src/vs/base/browser/ui/dialog/warning.svg diff --git a/src/vs/base/browser/ui/dialog/close-dark.svg b/src/vs/base/browser/ui/dialog/close-dark.svg new file mode 100644 index 00000000000..7305a8f099a --- /dev/null +++ b/src/vs/base/browser/ui/dialog/close-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/base/browser/ui/dialog/close-inverse.svg b/src/vs/base/browser/ui/dialog/close-inverse.svg deleted file mode 100644 index a174033d912..00000000000 --- a/src/vs/base/browser/ui/dialog/close-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/base/browser/ui/dialog/close-light.svg b/src/vs/base/browser/ui/dialog/close-light.svg new file mode 100644 index 00000000000..ecddcd665b5 --- /dev/null +++ b/src/vs/base/browser/ui/dialog/close-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/base/browser/ui/dialog/close.svg b/src/vs/base/browser/ui/dialog/close.svg deleted file mode 100644 index f4038b8bfa5..00000000000 --- a/src/vs/base/browser/ui/dialog/close.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/base/browser/ui/dialog/dialog.css b/src/vs/base/browser/ui/dialog/dialog.css index c909dada79e..e05ed90a949 100644 --- a/src/vs/base/browser/ui/dialog/dialog.css +++ b/src/vs/base/browser/ui/dialog/dialog.css @@ -47,12 +47,12 @@ .monaco-workbench .dialog-box .dialog-close-action { - background: url('close.svg') center center no-repeat; + background: url('close-light.svg') center center no-repeat; } .vs-dark .monaco-workbench .dialog-box .dialog-close-action, .hc-black .monaco-workbench .dialog-box .dialog-close-action { - background: url('close-inverse.svg') center center no-repeat; + background: url('close-dark.svg') center center no-repeat; } /** Dialog: Message Row */ @@ -64,12 +64,12 @@ } .monaco-workbench .dialog-box .dialog-message-row .dialog-icon { - flex: 0 0 30px; - height: 30px; - padding-right: 4px; - padding-left: 4px; + flex: 0 0 40px; + height: 40px; + align-self: baseline; background-position: center; background-repeat: no-repeat; + background-size: 40px; } .vs .monaco-workbench .dialog-box .dialog-message-row .dialog-icon.icon-pending { @@ -77,15 +77,15 @@ } .vs .monaco-workbench .dialog-box .dialog-message-row .dialog-icon.icon-info { - background-image: url('info.svg'); + background-image: url('info-light.svg'); } .vs .monaco-workbench .dialog-box .dialog-message-row .dialog-icon.icon-warning { - background-image: url('warning.svg'); + background-image: url('warning-light.svg'); } .vs .monaco-workbench .dialog-box .dialog-message-row .dialog-icon.icon-error { - background-image: url('error.svg'); + background-image: url('error-light.svg'); } .vs-dark .monaco-workbench .dialog-box .dialog-message-row .dialog-icon.icon-pending { @@ -94,17 +94,17 @@ .vs-dark .monaco-workbench .dialog-box .dialog-message-row .dialog-icon.icon-info, .hc-black .monaco-workbench .dialog-box .dialog-message-row .dialog-icon.icon-info { - background-image: url('info-inverse.svg'); + background-image: url('info-dark.svg'); } .vs-dark .monaco-workbench .dialog-box .dialog-message-row .dialog-icon.icon-warning, .hc-black .monaco-workbench .dialog-box .dialog-message-row .dialog-icon.icon-warning { - background-image: url('warning-inverse.svg'); + background-image: url('warning-dark.svg'); } .vs-dark .monaco-workbench .dialog-box .dialog-message-row .dialog-icon.icon-error, .hc-black .monaco-workbench .dialog-box .dialog-message-row .dialog-icon.icon-error { - background-image: url('error-inverse.svg'); + background-image: url('error-dark.svg'); } .hc-black .monaco-workbench .dialog-box .dialog-message-row .dialog-icon.icon-pending { diff --git a/src/vs/base/browser/ui/dialog/error-dark.svg b/src/vs/base/browser/ui/dialog/error-dark.svg new file mode 100644 index 00000000000..efdc5f2ae2d --- /dev/null +++ b/src/vs/base/browser/ui/dialog/error-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/base/browser/ui/dialog/error-inverse.svg b/src/vs/base/browser/ui/dialog/error-inverse.svg deleted file mode 100644 index 51e9dc81b99..00000000000 --- a/src/vs/base/browser/ui/dialog/error-inverse.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/src/vs/base/browser/ui/dialog/error-light.svg b/src/vs/base/browser/ui/dialog/error-light.svg new file mode 100644 index 00000000000..d646c72c740 --- /dev/null +++ b/src/vs/base/browser/ui/dialog/error-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/base/browser/ui/dialog/error.svg b/src/vs/base/browser/ui/dialog/error.svg deleted file mode 100644 index 04b66689011..00000000000 --- a/src/vs/base/browser/ui/dialog/error.svg +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/src/vs/base/browser/ui/dialog/info-dark.svg b/src/vs/base/browser/ui/dialog/info-dark.svg new file mode 100644 index 00000000000..bb851afdfe5 --- /dev/null +++ b/src/vs/base/browser/ui/dialog/info-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/base/browser/ui/dialog/info-inverse.svg b/src/vs/base/browser/ui/dialog/info-inverse.svg deleted file mode 100644 index 64b801a63be..00000000000 --- a/src/vs/base/browser/ui/dialog/info-inverse.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - diff --git a/src/vs/base/browser/ui/dialog/info-light.svg b/src/vs/base/browser/ui/dialog/info-light.svg new file mode 100644 index 00000000000..6faf670cccc --- /dev/null +++ b/src/vs/base/browser/ui/dialog/info-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/base/browser/ui/dialog/info.svg b/src/vs/base/browser/ui/dialog/info.svg deleted file mode 100644 index 3c603528a74..00000000000 --- a/src/vs/base/browser/ui/dialog/info.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - diff --git a/src/vs/base/browser/ui/dialog/warning-dark.svg b/src/vs/base/browser/ui/dialog/warning-dark.svg new file mode 100644 index 00000000000..a267963e585 --- /dev/null +++ b/src/vs/base/browser/ui/dialog/warning-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/base/browser/ui/dialog/warning-inverse.svg b/src/vs/base/browser/ui/dialog/warning-inverse.svg deleted file mode 100644 index a7f4afbcc9c..00000000000 --- a/src/vs/base/browser/ui/dialog/warning-inverse.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - -StatusWarning_16x - - - - - diff --git a/src/vs/base/browser/ui/dialog/warning-light.svg b/src/vs/base/browser/ui/dialog/warning-light.svg new file mode 100644 index 00000000000..f2e2aa741e5 --- /dev/null +++ b/src/vs/base/browser/ui/dialog/warning-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/vs/base/browser/ui/dialog/warning.svg b/src/vs/base/browser/ui/dialog/warning.svg deleted file mode 100644 index 6d8cffe913e..00000000000 --- a/src/vs/base/browser/ui/dialog/warning.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - -StatusWarning_16x - - - - - From 525a3c457514d8938a71cbb4bbbcd1fb5f0e2b62 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Fri, 28 Jun 2019 11:42:05 -0700 Subject: [PATCH 0765/1449] Update problem severity icons --- .../platform/severityIcon/common/severityIcon.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/vs/platform/severityIcon/common/severityIcon.ts b/src/vs/platform/severityIcon/common/severityIcon.ts index 00da253ce7e..52eae1a08cc 100644 --- a/src/vs/platform/severityIcon/common/severityIcon.ts +++ b/src/vs/platform/severityIcon/common/severityIcon.ts @@ -12,14 +12,14 @@ const errorEnd = encodeURIComponent(`"/>`); const errorDarkStart = encodeURIComponent(``); -const warningStart = encodeURIComponent(``); -const warningDarkStart = encodeURIComponent(``); -const infoStart = encodeURIComponent(``); -const infoDarkStart = encodeURIComponent(``); export namespace SeverityIcon { @@ -27,19 +27,19 @@ export namespace SeverityIcon { export function getSVGData(severity: Severity, theme: ITheme): string { switch (severity) { case Severity.Ignore: - const ignoreColor = theme.type === LIGHT ? Color.fromHex('#1BA1E2') : Color.fromHex('#1BA1E2'); + const ignoreColor = theme.type === LIGHT ? Color.fromHex('#75BEFF') : Color.fromHex('#007ACC'); return theme.type === LIGHT ? infoStart + encodeURIComponent(ignoreColor.toString()) + infoEnd : infoDarkStart + encodeURIComponent(ignoreColor.toString()) + infoDarkEnd; case Severity.Info: - const infoColor = theme.type === LIGHT ? Color.fromHex('#1BA1E2') : Color.fromHex('#1BA1E2'); + const infoColor = theme.type === LIGHT ? Color.fromHex('#007ACC') : Color.fromHex('#75BEFF'); return theme.type === LIGHT ? infoStart + encodeURIComponent(infoColor.toString()) + infoEnd : infoDarkStart + encodeURIComponent(infoColor.toString()) + infoDarkEnd; case Severity.Warning: - const warningColor = theme.type === LIGHT ? Color.fromHex('#fc0') : Color.fromHex('#fc0'); + const warningColor = theme.type === LIGHT ? Color.fromHex('#DDB100') : Color.fromHex('#fc0'); return theme.type === LIGHT ? warningStart + encodeURIComponent(warningColor.toString()) + warningEnd : warningDarkStart + encodeURIComponent(warningColor.toString()) + warningDarkEnd; case Severity.Error: - const errorColor = theme.type === LIGHT ? Color.fromHex('#E51400') : Color.fromHex('#F48771'); + const errorColor = theme.type === LIGHT ? Color.fromHex('#A1260D') : Color.fromHex('#F48771'); return theme.type === LIGHT ? errorStart + encodeURIComponent(errorColor.toString()) + errorEnd : errorDarkStart + encodeURIComponent(errorColor.toString()) + errorDarkEnd; } From 3801e1ac7b32c34a24d9c90a32e509a801175b69 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Fri, 28 Jun 2019 11:53:00 -0700 Subject: [PATCH 0766/1449] Show notification when missing keyboard layout --- .../keybinding/browser/keymapService.ts | 106 ++++++++++++------ .../test/browserKeyboardMapper.test.ts | 12 +- 2 files changed, 80 insertions(+), 38 deletions(-) diff --git a/src/vs/workbench/services/keybinding/browser/keymapService.ts b/src/vs/workbench/services/keybinding/browser/keymapService.ts index cff794267bf..590dab59664 100644 --- a/src/vs/workbench/services/keybinding/browser/keymapService.ts +++ b/src/vs/workbench/services/keybinding/browser/keymapService.ts @@ -27,6 +27,8 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as ConfigExtensions, IConfigurationRegistry, IConfigurationNode } from 'vs/platform/configuration/common/configurationRegistry'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { INavigatorWithKeyboard } from 'vs/workbench/services/keybinding/common/navigatorKeyboard'; +import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; +import { ICommandService } from 'vs/platform/commands/common/commands'; export class BrowserKeyboardMapperFactoryBase { // keyboard mapper @@ -68,7 +70,10 @@ export class BrowserKeyboardMapperFactoryBase { return this._keymapInfos.map(keymapInfo => keymapInfo.layout); } - protected constructor() { + protected constructor( + private _notificationService: INotificationService, + private _commandService: ICommandService + ) { this._keyboardMapper = null; this._initialized = false; this._keymapInfos = []; @@ -101,7 +106,7 @@ export class BrowserKeyboardMapperFactoryBase { this._keymapInfos.splice(index, 1); } - getMatchedKeymapInfo(keyMapping: IKeyboardMapping | null): KeymapInfo | null { + getMatchedKeymapInfo(keyMapping: IKeyboardMapping | null): { result: KeymapInfo, score: number } | null { if (!keyMapping) { return null; } @@ -111,7 +116,10 @@ export class BrowserKeyboardMapperFactoryBase { if (usStandard) { let maxScore = usStandard.getScore(keyMapping); if (maxScore === 0) { - return usStandard; + return { + result: usStandard, + score: 0 + }; } let result = usStandard; @@ -119,7 +127,10 @@ export class BrowserKeyboardMapperFactoryBase { let score = this._mru[i].getScore(keyMapping); if (score > maxScore) { if (score === 0) { - return this._mru[i]; + return { + result: this._mru[i], + score: 0 + }; } maxScore = score; @@ -127,12 +138,18 @@ export class BrowserKeyboardMapperFactoryBase { } } - return result; + return { + result, + score: maxScore + }; } for (let i = 0; i < this._mru.length; i++) { if (this._mru[i].fuzzyEqual(keyMapping)) { - return this._mru[i]; + return { + result: this._mru[i], + score: 0 + }; } } @@ -160,11 +177,27 @@ export class BrowserKeyboardMapperFactoryBase { setActiveKeyMapping(keymap: IKeyboardMapping | null) { let matchedKeyboardLayout = this.getMatchedKeymapInfo(keymap); if (matchedKeyboardLayout) { + let score = matchedKeyboardLayout.score; + + if (keymap && score < 0) { + // the keyboard layout doesn't actually match the key event or the keymap from chromium + this._notificationService.prompt( + Severity.Info, + nls.localize('missing.keyboardlayout', 'Fail to find matching keyboard layout'), + [{ + label: nls.localize('keyboardLayoutMissing.configure', "Configure"), + run: () => this._commandService.executeCommand('workbench.action.openKeyboardLayoutPicker') + }], + ); + + return; + } + if (!this._activeKeymapInfo) { - this._activeKeymapInfo = matchedKeyboardLayout; + this._activeKeymapInfo = matchedKeyboardLayout.result; } else if (keymap) { - if (matchedKeyboardLayout.getScore(keymap) > this._activeKeymapInfo.getScore(keymap)) { - this._activeKeymapInfo = matchedKeyboardLayout; + if (matchedKeyboardLayout.result.getScore(keymap) > this._activeKeymapInfo.getScore(keymap)) { + this._activeKeymapInfo = matchedKeyboardLayout.result; } } } @@ -341,13 +374,15 @@ export class BrowserKeyboardMapperFactoryBase { }; } - const matchedKeyboardLayout = this.getMatchedKeymapInfo(ret); + return ret; - if (matchedKeyboardLayout) { - return matchedKeyboardLayout.mapping; - } + // const matchedKeyboardLayout = this.getMatchedKeymapInfo(ret); - return null; + // if (matchedKeyboardLayout) { + // return matchedKeyboardLayout.result.mapping; + // } + + // return null; }); } catch { // getLayoutMap can throw if invoked from a nested browsing context @@ -378,11 +413,8 @@ export class BrowserKeyboardMapperFactoryBase { } export class BrowserKeyboardMapperFactory extends BrowserKeyboardMapperFactoryBase { - public static readonly INSTANCE = new BrowserKeyboardMapperFactory(); - // keyboard mapper - - private constructor() { - super(); + constructor(notificationService: INotificationService, commandService: ICommandService) { + super(notificationService, commandService); const platform = isWindows ? 'win' : isMacintosh ? 'darwin' : 'linux'; @@ -511,21 +543,25 @@ class BrowserKeymapService extends Disposable implements IKeymapService { private _userKeyboardLayout: UserKeyboardLayout; private readonly layoutChangeListener = this._register(new MutableDisposable()); + private readonly _factory: BrowserKeyboardMapperFactory; constructor( @IEnvironmentService environmentService: IEnvironmentService, @IFileService fileService: IFileService, + @INotificationService notificationService: INotificationService, + @ICommandService commandService: ICommandService, @IConfigurationService private configurationService: IConfigurationService, ) { super(); const keyboardConfig = configurationService.getValue<{ layout: string }>('keyboard'); const layout = keyboardConfig.layout; + this._factory = new BrowserKeyboardMapperFactory(notificationService, commandService); this.registerKeyboardListener(); if (layout && layout !== 'autodetect') { // set keyboard layout - BrowserKeyboardMapperFactory.INSTANCE.setKeyboardLayout(layout); + this._factory.setKeyboardLayout(layout); } this._register(configurationService.onDidChangeConfiguration(e => { @@ -535,9 +571,9 @@ class BrowserKeymapService extends Disposable implements IKeymapService { if (layout === 'autodetect') { this.registerKeyboardListener(); - BrowserKeyboardMapperFactory.INSTANCE.onKeyboardLayoutChanged(); + this._factory.onKeyboardLayoutChanged(); } else { - BrowserKeyboardMapperFactory.INSTANCE.setKeyboardLayout(layout); + this._factory.setKeyboardLayout(layout); this.layoutChangeListener.clear(); } } @@ -546,24 +582,24 @@ class BrowserKeymapService extends Disposable implements IKeymapService { this._userKeyboardLayout = new UserKeyboardLayout(environmentService.keyboardLayoutResource, fileService); this._userKeyboardLayout.initialize().then(() => { if (this._userKeyboardLayout.keyboardLayout) { - BrowserKeyboardMapperFactory.INSTANCE.registerKeyboardLayout(this._userKeyboardLayout.keyboardLayout); + this._factory.registerKeyboardLayout(this._userKeyboardLayout.keyboardLayout); this.setUserKeyboardLayoutIfMatched(); } }); this._register(this._userKeyboardLayout.onDidChange(() => { - let userKeyboardLayouts = BrowserKeyboardMapperFactory.INSTANCE.keymapInfos.filter(layout => layout.isUserKeyboardLayout); + let userKeyboardLayouts = this._factory.keymapInfos.filter(layout => layout.isUserKeyboardLayout); if (userKeyboardLayouts.length) { if (this._userKeyboardLayout.keyboardLayout) { userKeyboardLayouts[0].update(this._userKeyboardLayout.keyboardLayout); } else { - BrowserKeyboardMapperFactory.INSTANCE.removeKeyboardLayout(userKeyboardLayouts[0]); + this._factory.removeKeyboardLayout(userKeyboardLayouts[0]); } } else { if (this._userKeyboardLayout.keyboardLayout) { - BrowserKeyboardMapperFactory.INSTANCE.registerKeyboardLayout(this._userKeyboardLayout.keyboardLayout); + this._factory.registerKeyboardLayout(this._userKeyboardLayout.keyboardLayout); } } @@ -576,39 +612,39 @@ class BrowserKeymapService extends Disposable implements IKeymapService { const layout = keyboardConfig.layout; if (layout && this._userKeyboardLayout.keyboardLayout) { - if (getKeyboardLayoutId(this._userKeyboardLayout.keyboardLayout.layout) === layout && BrowserKeyboardMapperFactory.INSTANCE.activeKeymap) { + if (getKeyboardLayoutId(this._userKeyboardLayout.keyboardLayout.layout) === layout && this._factory.activeKeymap) { - if (!this._userKeyboardLayout.keyboardLayout.equal(BrowserKeyboardMapperFactory.INSTANCE.activeKeymap)) { - BrowserKeyboardMapperFactory.INSTANCE.setActiveKeymapInfo(this._userKeyboardLayout.keyboardLayout); + if (!this._userKeyboardLayout.keyboardLayout.equal(this._factory.activeKeymap)) { + this._factory.setActiveKeymapInfo(this._userKeyboardLayout.keyboardLayout); } } } } registerKeyboardListener() { - this.layoutChangeListener.value = BrowserKeyboardMapperFactory.INSTANCE.onDidChangeKeyboardMapper(() => { + this.layoutChangeListener.value = this._factory.onDidChangeKeyboardMapper(() => { this._onDidChangeKeyboardMapper.fire(); }); } getKeyboardMapper(dispatchConfig: DispatchConfig): IKeyboardMapper { - return BrowserKeyboardMapperFactory.INSTANCE.getKeyboardMapper(dispatchConfig); + return this._factory.getKeyboardMapper(dispatchConfig); } public getCurrentKeyboardLayout(): IKeyboardLayoutInfo | null { - return BrowserKeyboardMapperFactory.INSTANCE.activeKeyboardLayout; + return this._factory.activeKeyboardLayout; } public getAllKeyboardLayouts(): IKeyboardLayoutInfo[] { - return BrowserKeyboardMapperFactory.INSTANCE.keyboardLayouts; + return this._factory.keyboardLayouts; } public getRawKeyboardMapping(): IKeyboardMapping | null { - return BrowserKeyboardMapperFactory.INSTANCE.activeKeyMapping; + return this._factory.activeKeyMapping; } public validateCurrentKeyboardMapping(keyboardEvent: IKeyboardEvent): void { - BrowserKeyboardMapperFactory.INSTANCE.validateCurrentKeyboardMapping(keyboardEvent); + this._factory.validateCurrentKeyboardMapping(keyboardEvent); } } diff --git a/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts b/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts index 8c06d950aed..1099564ebf7 100644 --- a/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts +++ b/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts @@ -8,10 +8,13 @@ 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 { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; +import { INotificationService } from 'vs/platform/notification/common/notification'; +import { ICommandService } from 'vs/platform/commands/common/commands'; class TestKeyboardMapperFactory extends BrowserKeyboardMapperFactoryBase { - constructor() { - super(); + constructor(notificationService: INotificationService, commandService: ICommandService) { + super(notificationService, commandService); let keymapInfos: IKeymapInfo[] = KeyboardLayoutContribution.INSTANCE.layoutInfos; this._keymapInfos.push(...keymapInfos.map(info => (new KeymapInfo(info.layout, info.secondaryLayouts, info.mapping, info.isUserKeyboardLayout)))); @@ -23,7 +26,10 @@ class TestKeyboardMapperFactory extends BrowserKeyboardMapperFactoryBase { suite('keyboard layout loader', () => { - const instance: TestKeyboardMapperFactory = new TestKeyboardMapperFactory(); + let instantiationService: TestInstantiationService = new TestInstantiationService(); + let notitifcationService = instantiationService.stub(INotificationService, {}); + let commandService = instantiationService.stub(ICommandService, {}); + let instance = new TestKeyboardMapperFactory(notitifcationService, commandService); test('load default US keyboard layout', () => { assert.notEqual(instance.activeKeyboardLayout, null); From 2223b960c09524face83f5d22fb9d16b45d722ff Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 28 Jun 2019 11:58:21 -0700 Subject: [PATCH 0767/1449] Use DI for SplitPaneContainer service injection --- src/vs/workbench/contrib/terminal/browser/terminalTab.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalTab.ts b/src/vs/workbench/contrib/terminal/browser/terminalTab.ts index a15d3bade43..bc1f06cc7e8 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalTab.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalTab.ts @@ -10,6 +10,7 @@ import { Event, Emitter } from 'vs/base/common/event'; import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; import { SplitView, Orientation, IView, Sizing } from 'vs/base/browser/ui/splitview/splitview'; import { IWorkbenchLayoutService, Parts, Position } from 'vs/workbench/services/layout/browser/layoutService'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; const SPLIT_PANE_MIN_SIZE = 120; const TERMINAL_MIN_USEFUL_SIZE = 250; @@ -232,7 +233,8 @@ export class TerminalTab extends Disposable implements ITerminalTab { private _container: HTMLElement, shellLaunchConfigOrInstance: IShellLaunchConfig | ITerminalInstance, @ITerminalService private readonly _terminalService: ITerminalService, - @IWorkbenchLayoutService private readonly _layoutService: IWorkbenchLayoutService + @IWorkbenchLayoutService private readonly _layoutService: IWorkbenchLayoutService, + @IInstantiationService private readonly _instantiationService: IInstantiationService ) { super(); this._onDisposed = new Emitter(); @@ -353,7 +355,7 @@ export class TerminalTab extends Disposable implements ITerminalTab { if (!this._splitPaneContainer) { this._panelPosition = this._layoutService.getPanelPosition(); const orientation = this._panelPosition === Position.BOTTOM ? Orientation.HORIZONTAL : Orientation.VERTICAL; - const newLocal = new SplitPaneContainer(this._tabElement, orientation, this._layoutService); + const newLocal = this._instantiationService.createInstance(SplitPaneContainer, this._tabElement, orientation); this._splitPaneContainer = newLocal; this.terminalInstances.forEach(instance => this._splitPaneContainer!.split(instance)); } From 6b1349c1c52c6077e92dc75b925396c62168ea9b Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 28 Jun 2019 12:16:34 -0700 Subject: [PATCH 0768/1449] Exit terminal pane resize early to reduce indent --- .../contrib/terminal/browser/terminalTab.ts | 72 +++++++++---------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalTab.ts b/src/vs/workbench/contrib/terminal/browser/terminalTab.ts index bc1f06cc7e8..42b1a59d7c2 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalTab.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalTab.ts @@ -22,7 +22,6 @@ class SplitPaneContainer { private _splitViewDisposables: IDisposable[]; private _children: SplitPane[] = []; - private _onDidChange: Event = Event.None; public get onDidChange(): Event { return this._onDidChange; } @@ -58,45 +57,46 @@ class SplitPaneContainer { amount *= -1; } this._layoutService.resizePart(Parts.PANEL_PART, amount); - } else { - // Resize left/right in horizontal or up/down in vertical - // Only resize when there is more than one pane - if (this._children.length <= 1) { - return; - } + return; + } - // Get sizes - const sizes: number[] = []; - for (let i = 0; i < this._splitView.length; i++) { - sizes.push(this._splitView.getViewSize(i)); - } + // Resize left/right in horizontal or up/down in vertical + // Only resize when there is more than one pane + if (this._children.length <= 1) { + return; + } - // Remove size from right pane, unless index is the last pane in which case use left pane - const isSizingEndPane = index !== this._children.length - 1; - const indexToChange = isSizingEndPane ? index + 1 : index - 1; - if (isSizingEndPane && direction === Direction.Left) { - amount *= -1; - } else if (!isSizingEndPane && direction === Direction.Right) { - amount *= -1; - } else if (isSizingEndPane && direction === Direction.Up) { - amount *= -1; - } else if (!isSizingEndPane && direction === Direction.Down) { - amount *= -1; - } + // Get sizes + const sizes: number[] = []; + for (let i = 0; i < this._splitView.length; i++) { + sizes.push(this._splitView.getViewSize(i)); + } - // Ensure the size is not reduced beyond the minimum, otherwise weird things can happen - if (sizes[index] + amount < SPLIT_PANE_MIN_SIZE) { - amount = SPLIT_PANE_MIN_SIZE - sizes[index]; - } else if (sizes[indexToChange] - amount < SPLIT_PANE_MIN_SIZE) { - amount = sizes[indexToChange] - SPLIT_PANE_MIN_SIZE; - } + // Remove size from right pane, unless index is the last pane in which case use left pane + const isSizingEndPane = index !== this._children.length - 1; + const indexToChange = isSizingEndPane ? index + 1 : index - 1; + if (isSizingEndPane && direction === Direction.Left) { + amount *= -1; + } else if (!isSizingEndPane && direction === Direction.Right) { + amount *= -1; + } else if (isSizingEndPane && direction === Direction.Up) { + amount *= -1; + } else if (!isSizingEndPane && direction === Direction.Down) { + amount *= -1; + } - // Apply the size change - sizes[index] += amount; - sizes[indexToChange] -= amount; - for (let i = 0; i < this._splitView.length - 1; i++) { - this._splitView.resizeView(i, sizes[i]); - } + // Ensure the size is not reduced beyond the minimum, otherwise weird things can happen + if (sizes[index] + amount < SPLIT_PANE_MIN_SIZE) { + amount = SPLIT_PANE_MIN_SIZE - sizes[index]; + } else if (sizes[indexToChange] - amount < SPLIT_PANE_MIN_SIZE) { + amount = sizes[indexToChange] - SPLIT_PANE_MIN_SIZE; + } + + // Apply the size change + sizes[index] += amount; + sizes[indexToChange] -= amount; + for (let i = 0; i < this._splitView.length - 1; i++) { + this._splitView.resizeView(i, sizes[i]); } } From 963d1dd5cf783de73104fa366e7603529fef4e93 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 28 Jun 2019 12:37:38 -0700 Subject: [PATCH 0769/1449] Prefix private with _ --- src/vs/editor/contrib/find/simpleFindWidget.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/editor/contrib/find/simpleFindWidget.ts b/src/vs/editor/contrib/find/simpleFindWidget.ts index 919d3cfbfa4..31c75f9f7a6 100644 --- a/src/vs/editor/contrib/find/simpleFindWidget.ts +++ b/src/vs/editor/contrib/find/simpleFindWidget.ts @@ -58,7 +58,7 @@ export abstract class SimpleFindWidget extends Widget { return null; } catch (e) { this.foundMatch = false; - this.updateButtons(); + this._updateButtons(); return { content: e.message }; } } @@ -69,7 +69,7 @@ export abstract class SimpleFindWidget extends Widget { this.oninput(this._findInput.domNode, (e) => { this.foundMatch = this.onInputChanged(); - this.updateButtons(); + this._updateButtons(); this._delayedUpdateHistory(); }); @@ -219,7 +219,7 @@ export abstract class SimpleFindWidget extends Widget { } this._isVisible = true; - this.updateButtons(); + this._updateButtons(); setTimeout(() => { dom.addClass(this._innerDomNode, 'visible'); @@ -250,7 +250,7 @@ export abstract class SimpleFindWidget extends Widget { // Need to delay toggling visibility until after Transition, then visibility hidden - removes from tabIndex list setTimeout(() => { this._isVisible = false; - this.updateButtons(); + this._updateButtons(); dom.removeClass(this._innerDomNode, 'visible'); }, 200); } @@ -276,7 +276,7 @@ export abstract class SimpleFindWidget extends Widget { return this._findInput.getCaseSensitive(); } - private updateButtons() { + private _updateButtons() { let hasInput = this.inputValue.length > 0; this.prevBtn.setEnabled(this._isVisible && hasInput && this.foundMatch); this.nextBtn.setEnabled(this._isVisible && hasInput && this.foundMatch); From b33e16cb0654db5c9ae937e6fca9c312556056fd Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 28 Jun 2019 12:49:19 -0700 Subject: [PATCH 0770/1449] Update xterm.css with upstream Fixes #76271 See xtermjs/xterm.js#2276 --- src/vs/workbench/contrib/terminal/browser/media/xterm.css | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/media/xterm.css b/src/vs/workbench/contrib/terminal/browser/media/xterm.css index 5bfff739f8d..bde4034f5b8 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/xterm.css +++ b/src/vs/workbench/contrib/terminal/browser/media/xterm.css @@ -59,7 +59,7 @@ * The z-index of the helpers must be higher than the canvases in order for * IMEs to appear on top. */ - z-index: 10; + z-index: 5; } .xterm .xterm-helper-textarea { @@ -73,7 +73,7 @@ top: 0; width: 0; height: 0; - z-index: -10; + z-index: -5; /** Prevent wrapping so the IME appears against the textarea at the correct position */ white-space: nowrap; overflow: hidden; @@ -154,7 +154,7 @@ top: 0; bottom: 0; right: 0; - z-index: 100; + z-index: 10; color: transparent; } From bd31eb7053790a1c91ddd7d61a145e4ecd19ad93 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 28 Jun 2019 14:29:40 -0700 Subject: [PATCH 0771/1449] Use outerhtml for webview Makes sure we preserve any custom attributes on the html element --- src/vs/workbench/contrib/webview/browser/pre/main.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index a6be033e074..52d8d92b5af 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -474,11 +474,10 @@ hookupOnLoadHandlers(newFrame); } - // set DOCTYPE for newDocument explicitly as DOMParser.parseFromString strips it off - // and DOCTYPE is needed in the iframe to ensure that the user agent stylesheet is correctly overridden if (!FAKE_LOAD) { - newFrame.contentDocument.write(''); - newFrame.contentDocument.write(newDocument.documentElement.innerHTML); + // set DOCTYPE for newDocument explicitly as DOMParser.parseFromString strips it off + // and DOCTYPE is needed in the iframe to ensure that the user agent stylesheet is correctly overridden + newFrame.contentDocument.write('\n' + newDocument.documentElement.outerHTML); newFrame.contentDocument.close(); } From e652f73a9cfb8108629a76246732a3ffbca22e2f Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 28 Jun 2019 14:56:57 -0700 Subject: [PATCH 0772/1449] Only register copy/cut/paste for electron based webviews --- .../webview/browser/webview.contribution.ts | 30 +------------ .../webview/browser/webviewCommands.ts | 33 -------------- .../contrib/webview/browser/webviewEditor.ts | 14 +----- .../contrib/webview/common/webview.ts | 3 -- .../electron-browser/webview.contribution.ts | 44 +++++++++++++++++- .../electron-browser/webviewCommands.ts | 45 +++++++++++++++++++ 6 files changed, 90 insertions(+), 79 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/webview.contribution.ts b/src/vs/workbench/contrib/webview/browser/webview.contribution.ts index 32f91cd0ec9..6a60aba8625 100644 --- a/src/vs/workbench/contrib/webview/browser/webview.contribution.ts +++ b/src/vs/workbench/contrib/webview/browser/webview.contribution.ts @@ -18,7 +18,7 @@ import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/wor import { Extensions as EditorInputExtensions, IEditorInputFactoryRegistry } from 'vs/workbench/common/editor'; import { WebviewEditorInputFactory } from 'vs/workbench/contrib/webview/browser/webviewEditorInputFactory'; import { KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_VISIBLE, webviewDeveloperCategory } from 'vs/workbench/contrib/webview/common/webview'; -import { CopyWebviewEditorCommand, CutWebviewEditorCommand, HideWebViewEditorFindCommand, PasteWebviewEditorCommand, RedoWebviewEditorCommand, ReloadWebviewAction, SelectAllWebviewEditorCommand, ShowWebViewEditorFindWidgetCommand, UndoWebviewEditorCommand } from '../browser/webviewCommands'; +import { HideWebViewEditorFindCommand, RedoWebviewEditorCommand, ReloadWebviewAction, SelectAllWebviewEditorCommand, ShowWebViewEditorFindWidgetCommand, UndoWebviewEditorCommand } from '../browser/webviewCommands'; import { WebviewEditor } from '../browser/webviewEditor'; import { WebviewEditorInput } from '../browser/webviewEditorInput'; import { IWebviewEditorService, WebviewEditorService } from '../browser/webviewEditorService'; @@ -72,34 +72,6 @@ export function registerWebViewCommands(editorId: string): void { // These commands are only needed on MacOS where we have to disable the menu bar commands if (isMacintosh) { - (new CopyWebviewEditorCommand({ - id: CopyWebviewEditorCommand.ID, - precondition: ContextKeyExpr.and(contextKeyExpr, ContextKeyExpr.not(InputFocusedContextKey)), - kbOpts: { - primary: KeyMod.CtrlCmd | KeyCode.KEY_C, - weight: KeybindingWeight.EditorContrib - } - })).register(); - - (new PasteWebviewEditorCommand({ - id: PasteWebviewEditorCommand.ID, - precondition: ContextKeyExpr.and(contextKeyExpr, ContextKeyExpr.not(InputFocusedContextKey)), - kbOpts: { - primary: KeyMod.CtrlCmd | KeyCode.KEY_V, - weight: KeybindingWeight.EditorContrib - } - })).register(); - - - (new CutWebviewEditorCommand({ - id: CutWebviewEditorCommand.ID, - precondition: ContextKeyExpr.and(contextKeyExpr, ContextKeyExpr.not(InputFocusedContextKey)), - kbOpts: { - primary: KeyMod.CtrlCmd | KeyCode.KEY_X, - weight: KeybindingWeight.EditorContrib - } - })).register(); - (new UndoWebviewEditorCommand({ id: UndoWebviewEditorCommand.ID, precondition: ContextKeyExpr.and(contextKeyExpr, ContextKeyExpr.not(InputFocusedContextKey)), diff --git a/src/vs/workbench/contrib/webview/browser/webviewCommands.ts b/src/vs/workbench/contrib/webview/browser/webviewCommands.ts index dbf38d80b79..0273e0b7313 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewCommands.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewCommands.ts @@ -43,39 +43,6 @@ export class SelectAllWebviewEditorCommand extends Command { } } -export class CopyWebviewEditorCommand extends Command { - public static readonly ID = 'editor.action.webvieweditor.copy'; - - public runCommand(accessor: ServicesAccessor, args: any): void { - const webViewEditor = getActiveWebviewEditor(accessor); - if (webViewEditor) { - webViewEditor.copy(); - } - } -} - -export class PasteWebviewEditorCommand extends Command { - public static readonly ID = 'editor.action.webvieweditor.paste'; - - public runCommand(accessor: ServicesAccessor, args: any): void { - const webViewEditor = getActiveWebviewEditor(accessor); - if (webViewEditor) { - webViewEditor.paste(); - } - } -} - -export class CutWebviewEditorCommand extends Command { - public static readonly ID = 'editor.action.webvieweditor.cut'; - - public runCommand(accessor: ServicesAccessor, args: any): void { - const webViewEditor = getActiveWebviewEditor(accessor); - if (webViewEditor) { - webViewEditor.cut(); - } - } -} - export class UndoWebviewEditorCommand extends Command { public static readonly ID = 'editor.action.webvieweditor.undo'; diff --git a/src/vs/workbench/contrib/webview/browser/webviewEditor.ts b/src/vs/workbench/contrib/webview/browser/webviewEditor.ts index 7c5730e4457..037eec0e325 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewEditor.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewEditor.ts @@ -146,18 +146,6 @@ export class WebviewEditor extends BaseEditor { this.withWebview(webview => webview.selectAll()); } - public copy(): void { - this.withWebview(webview => webview.copy()); - } - - public paste(): void { - this.withWebview(webview => webview.paste()); - } - - public cut(): void { - this.withWebview(webview => webview.cut()); - } - public undo(): void { this.withWebview(webview => webview.undo()); } @@ -166,7 +154,7 @@ export class WebviewEditor extends BaseEditor { this.withWebview(webview => webview.redo()); } - private withWebview(f: (element: Webview) => void): void { + public withWebview(f: (element: Webview) => void): void { if (this._webview) { f(this._webview); } diff --git a/src/vs/workbench/contrib/webview/common/webview.ts b/src/vs/workbench/contrib/webview/common/webview.ts index ca427d11f57..0ef2fe6c70c 100644 --- a/src/vs/workbench/contrib/webview/common/webview.ts +++ b/src/vs/workbench/contrib/webview/common/webview.ts @@ -75,9 +75,6 @@ export interface Webview extends IDisposable { reload(): void; selectAll(): void; - copy(): void; - paste(): void; - cut(): void; undo(): void; redo(): void; diff --git a/src/vs/workbench/contrib/webview/electron-browser/webview.contribution.ts b/src/vs/workbench/contrib/webview/electron-browser/webview.contribution.ts index cd912708989..0a65e8a9267 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webview.contribution.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webview.contribution.ts @@ -3,13 +3,19 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; +import { isMacintosh } from 'vs/base/common/platform'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; +import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +import { InputFocusedContextKey } from 'vs/platform/contextkey/common/contextkeys'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; +import { WebviewEditor } from 'vs/workbench/contrib/webview/browser/webviewEditor'; import { IWebviewService, webviewDeveloperCategory } from 'vs/workbench/contrib/webview/common/webview'; +import { CopyWebviewEditorCommand, CutWebviewEditorCommand, OpenWebviewDeveloperToolsAction, PasteWebviewEditorCommand } from 'vs/workbench/contrib/webview/electron-browser/webviewCommands'; import { WebviewService } from 'vs/workbench/contrib/webview/electron-browser/webviewService'; -import { OpenWebviewDeveloperToolsAction } from 'vs/workbench/contrib/webview/electron-browser/webviewCommands'; registerSingleton(IWebviewService, WebviewService, true); @@ -19,3 +25,39 @@ actionRegistry.registerWorkbenchAction( new SyncActionDescriptor(OpenWebviewDeveloperToolsAction, OpenWebviewDeveloperToolsAction.ID, OpenWebviewDeveloperToolsAction.LABEL), OpenWebviewDeveloperToolsAction.ALIAS, webviewDeveloperCategory); + +function registerWebViewCommands(editorId: string): void { + const contextKeyExpr = ContextKeyExpr.and(ContextKeyExpr.equals('activeEditor', editorId), ContextKeyExpr.not('editorFocus') /* https://github.com/Microsoft/vscode/issues/58668 */); + + // These commands are only needed on MacOS where we have to disable the menu bar commands + if (isMacintosh) { + (new CopyWebviewEditorCommand({ + id: CopyWebviewEditorCommand.ID, + precondition: ContextKeyExpr.and(contextKeyExpr, ContextKeyExpr.not(InputFocusedContextKey)), + kbOpts: { + primary: KeyMod.CtrlCmd | KeyCode.KEY_C, + weight: KeybindingWeight.EditorContrib + } + })).register(); + + (new PasteWebviewEditorCommand({ + id: PasteWebviewEditorCommand.ID, + precondition: ContextKeyExpr.and(contextKeyExpr, ContextKeyExpr.not(InputFocusedContextKey)), + kbOpts: { + primary: KeyMod.CtrlCmd | KeyCode.KEY_V, + weight: KeybindingWeight.EditorContrib + } + })).register(); + + (new CutWebviewEditorCommand({ + id: CutWebviewEditorCommand.ID, + precondition: ContextKeyExpr.and(contextKeyExpr, ContextKeyExpr.not(InputFocusedContextKey)), + kbOpts: { + primary: KeyMod.CtrlCmd | KeyCode.KEY_X, + weight: KeybindingWeight.EditorContrib + } + })).register(); + } +} + +registerWebViewCommands(WebviewEditor.ID); \ No newline at end of file diff --git a/src/vs/workbench/contrib/webview/electron-browser/webviewCommands.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewCommands.ts index e239b767855..97fc3ac7501 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webviewCommands.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewCommands.ts @@ -5,6 +5,10 @@ import { Action } from 'vs/base/common/actions'; import * as nls from 'vs/nls'; +import { Command, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; +import { WebviewEditor } from 'vs/workbench/contrib/webview/browser/webviewEditor'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { WebviewElement } from 'vs/workbench/contrib/webview/electron-browser/webviewElement'; export class OpenWebviewDeveloperToolsAction extends Action { static readonly ID = 'workbench.action.webview.openDeveloperTools'; @@ -27,3 +31,44 @@ export class OpenWebviewDeveloperToolsAction extends Action { return Promise.resolve(true); } } + +export class CopyWebviewEditorCommand extends Command { + public static readonly ID = 'editor.action.webvieweditor.copy'; + + public runCommand(accessor: ServicesAccessor, _args: any): void { + return withActiveWebviewBasedWebview(accessor, webview => webview.copy()); + } +} + +export class PasteWebviewEditorCommand extends Command { + public static readonly ID = 'editor.action.webvieweditor.paste'; + + public runCommand(accessor: ServicesAccessor, _args: any): void { + return withActiveWebviewBasedWebview(accessor, webview => webview.paste()); + } +} + +export class CutWebviewEditorCommand extends Command { + public static readonly ID = 'editor.action.webvieweditor.cut'; + + public runCommand(accessor: ServicesAccessor, _args: any): void { + return withActiveWebviewBasedWebview(accessor, webview => webview.cut()); + } +} + +function getActiveWebviewEditor(accessor: ServicesAccessor): WebviewEditor | undefined { + const editorService = accessor.get(IEditorService); + const activeControl = editorService.activeControl as WebviewEditor; + return activeControl.isWebviewEditor ? activeControl : undefined; +} + +function withActiveWebviewBasedWebview(accessor: ServicesAccessor, f: (webview: WebviewElement) => void): void { + const webViewEditor = getActiveWebviewEditor(accessor); + if (webViewEditor) { + webViewEditor.withWebview(webview => { + if (webview instanceof WebviewElement) { + f(webview); + } + }); + } +} \ No newline at end of file From 5caddbe2626ffb8d2b876d67d8dbec3ece2fbded Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 28 Jun 2019 15:08:38 -0700 Subject: [PATCH 0773/1449] Move undo/redo and select all to be electron specific webview elements as well --- .../webview/browser/webview.contribution.ts | 38 +-------------- .../webview/browser/webviewCommands.ts | 33 ------------- .../contrib/webview/browser/webviewEditor.ts | 14 +----- .../contrib/webview/browser/webviewElement.ts | 19 +------- .../contrib/webview/common/webview.ts | 4 -- .../electron-browser/webview.contribution.ts | 47 +++++++++++++++---- .../electron-browser/webviewCommands.ts | 30 ++++++++++-- 7 files changed, 69 insertions(+), 116 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/webview.contribution.ts b/src/vs/workbench/contrib/webview/browser/webview.contribution.ts index 6a60aba8625..40dac14b615 100644 --- a/src/vs/workbench/contrib/webview/browser/webview.contribution.ts +++ b/src/vs/workbench/contrib/webview/browser/webview.contribution.ts @@ -4,11 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; -import { isMacintosh } from 'vs/base/common/platform'; import { localize } from 'vs/nls'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { InputFocusedContextKey } from 'vs/platform/contextkey/common/contextkeys'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; @@ -18,7 +16,7 @@ import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/wor import { Extensions as EditorInputExtensions, IEditorInputFactoryRegistry } from 'vs/workbench/common/editor'; import { WebviewEditorInputFactory } from 'vs/workbench/contrib/webview/browser/webviewEditorInputFactory'; import { KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_VISIBLE, webviewDeveloperCategory } from 'vs/workbench/contrib/webview/common/webview'; -import { HideWebViewEditorFindCommand, RedoWebviewEditorCommand, ReloadWebviewAction, SelectAllWebviewEditorCommand, ShowWebViewEditorFindWidgetCommand, UndoWebviewEditorCommand } from '../browser/webviewCommands'; +import { HideWebViewEditorFindCommand, ReloadWebviewAction, ShowWebViewEditorFindWidgetCommand } from '../browser/webviewCommands'; import { WebviewEditor } from '../browser/webviewEditor'; import { WebviewEditorInput } from '../browser/webviewEditorInput'; import { IWebviewEditorService, WebviewEditorService } from '../browser/webviewEditorService'; @@ -37,7 +35,7 @@ registerSingleton(IWebviewEditorService, WebviewEditorService, true); const actionRegistry = Registry.as(ActionExtensions.WorkbenchActions); -export function registerWebViewCommands(editorId: string): void { +function registerWebViewCommands(editorId: string): void { const contextKeyExpr = ContextKeyExpr.and(ContextKeyExpr.equals('activeEditor', editorId), ContextKeyExpr.not('editorFocus') /* https://github.com/Microsoft/vscode/issues/58668 */); const showNextFindWidgetCommand = new ShowWebViewEditorFindWidgetCommand({ @@ -60,38 +58,6 @@ export function registerWebViewCommands(editorId: string): void { weight: KeybindingWeight.EditorContrib } })).register(); - - (new SelectAllWebviewEditorCommand({ - id: SelectAllWebviewEditorCommand.ID, - precondition: ContextKeyExpr.and(contextKeyExpr, ContextKeyExpr.not(InputFocusedContextKey)), - kbOpts: { - primary: KeyMod.CtrlCmd | KeyCode.KEY_A, - weight: KeybindingWeight.EditorContrib - } - })).register(); - - // These commands are only needed on MacOS where we have to disable the menu bar commands - if (isMacintosh) { - (new UndoWebviewEditorCommand({ - id: UndoWebviewEditorCommand.ID, - precondition: ContextKeyExpr.and(contextKeyExpr, ContextKeyExpr.not(InputFocusedContextKey)), - kbOpts: { - primary: KeyMod.CtrlCmd | KeyCode.KEY_Z, - weight: KeybindingWeight.EditorContrib - } - })).register(); - - (new RedoWebviewEditorCommand({ - id: RedoWebviewEditorCommand.ID, - precondition: ContextKeyExpr.and(contextKeyExpr, ContextKeyExpr.not(InputFocusedContextKey)), - kbOpts: { - primary: KeyMod.CtrlCmd | KeyCode.KEY_Y, - secondary: [KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_Z], - mac: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_Z }, - weight: KeybindingWeight.EditorContrib - } - })).register(); - } } registerWebViewCommands(WebviewEditor.ID); diff --git a/src/vs/workbench/contrib/webview/browser/webviewCommands.ts b/src/vs/workbench/contrib/webview/browser/webviewCommands.ts index 0273e0b7313..a5888e3e668 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewCommands.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewCommands.ts @@ -32,39 +32,6 @@ export class HideWebViewEditorFindCommand extends Command { } } -export class SelectAllWebviewEditorCommand extends Command { - public static readonly ID = 'editor.action.webvieweditor.selectAll'; - - public runCommand(accessor: ServicesAccessor, args: any): void { - const webViewEditor = getActiveWebviewEditor(accessor); - if (webViewEditor) { - webViewEditor.selectAll(); - } - } -} - -export class UndoWebviewEditorCommand extends Command { - public static readonly ID = 'editor.action.webvieweditor.undo'; - - public runCommand(accessor: ServicesAccessor, args: any): void { - const webViewEditor = getActiveWebviewEditor(accessor); - if (webViewEditor) { - webViewEditor.undo(); - } - } -} - -export class RedoWebviewEditorCommand extends Command { - public static readonly ID = 'editor.action.webvieweditor.redo'; - - public runCommand(accessor: ServicesAccessor, args: any): void { - const webViewEditor = getActiveWebviewEditor(accessor); - if (webViewEditor) { - webViewEditor.redo(); - } - } -} - export class ReloadWebviewAction extends Action { static readonly ID = 'workbench.action.webview.reloadWebviewAction'; static readonly LABEL = nls.localize('refreshWebviewLabel', "Reload Webviews"); diff --git a/src/vs/workbench/contrib/webview/browser/webviewEditor.ts b/src/vs/workbench/contrib/webview/browser/webviewEditor.ts index 037eec0e325..9c4bb48b1df 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewEditor.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewEditor.ts @@ -17,7 +17,7 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { EditorOptions } from 'vs/workbench/common/editor'; import { WebviewEditorInput } from 'vs/workbench/contrib/webview/browser/webviewEditorInput'; -import { IWebviewService, Webview, KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_VISIBLE } from 'vs/workbench/contrib/webview/common/webview'; +import { IWebviewService, KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_VISIBLE, Webview } from 'vs/workbench/contrib/webview/common/webview'; import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; @@ -142,18 +142,6 @@ export class WebviewEditor extends BaseEditor { this.withWebview(webview => webview.focus()); } - public selectAll(): void { - this.withWebview(webview => webview.selectAll()); - } - - public undo(): void { - this.withWebview(webview => webview.undo()); - } - - public redo(): void { - this.withWebview(webview => webview.redo()); - } - public withWebview(f: (element: Webview) => void): void { if (this._webview) { f(this._webview); diff --git a/src/vs/workbench/contrib/webview/browser/webviewElement.ts b/src/vs/workbench/contrib/webview/browser/webviewElement.ts index 0c57649c8b6..ed7e22ab84d 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewElement.ts @@ -250,27 +250,10 @@ export class IFrameWebview extends Disposable implements Webview { this.doUpdateContent(); } - selectAll(): void { - throw new Error('Method not implemented.'); - } - copy(): void { - throw new Error('Method not implemented.'); - } - paste(): void { - throw new Error('Method not implemented.'); - } - cut(): void { - throw new Error('Method not implemented.'); - } - undo(): void { - throw new Error('Method not implemented.'); - } - redo(): void { - throw new Error('Method not implemented.'); - } showFind(): void { throw new Error('Method not implemented.'); } + hideFind(): void { throw new Error('Method not implemented.'); } diff --git a/src/vs/workbench/contrib/webview/common/webview.ts b/src/vs/workbench/contrib/webview/common/webview.ts index 0ef2fe6c70c..bf459a3c694 100644 --- a/src/vs/workbench/contrib/webview/common/webview.ts +++ b/src/vs/workbench/contrib/webview/common/webview.ts @@ -72,11 +72,7 @@ export interface Webview extends IDisposable { layout(): void; mountTo(parent: HTMLElement): void; focus(): void; - reload(): void; - selectAll(): void; - undo(): void; - redo(): void; showFind(): void; hideFind(): void; diff --git a/src/vs/workbench/contrib/webview/electron-browser/webview.contribution.ts b/src/vs/workbench/contrib/webview/electron-browser/webview.contribution.ts index 0a65e8a9267..13b7185842a 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webview.contribution.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webview.contribution.ts @@ -14,7 +14,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; import { WebviewEditor } from 'vs/workbench/contrib/webview/browser/webviewEditor'; import { IWebviewService, webviewDeveloperCategory } from 'vs/workbench/contrib/webview/common/webview'; -import { CopyWebviewEditorCommand, CutWebviewEditorCommand, OpenWebviewDeveloperToolsAction, PasteWebviewEditorCommand } from 'vs/workbench/contrib/webview/electron-browser/webviewCommands'; +import * as webviewCommands from 'vs/workbench/contrib/webview/electron-browser/webviewCommands'; import { WebviewService } from 'vs/workbench/contrib/webview/electron-browser/webviewService'; registerSingleton(IWebviewService, WebviewService, true); @@ -22,17 +22,26 @@ registerSingleton(IWebviewService, WebviewService, true); const actionRegistry = Registry.as(ActionExtensions.WorkbenchActions); actionRegistry.registerWorkbenchAction( - new SyncActionDescriptor(OpenWebviewDeveloperToolsAction, OpenWebviewDeveloperToolsAction.ID, OpenWebviewDeveloperToolsAction.LABEL), - OpenWebviewDeveloperToolsAction.ALIAS, + new SyncActionDescriptor(webviewCommands.OpenWebviewDeveloperToolsAction, webviewCommands.OpenWebviewDeveloperToolsAction.ID, webviewCommands.OpenWebviewDeveloperToolsAction.LABEL), + webviewCommands.OpenWebviewDeveloperToolsAction.ALIAS, webviewDeveloperCategory); function registerWebViewCommands(editorId: string): void { const contextKeyExpr = ContextKeyExpr.and(ContextKeyExpr.equals('activeEditor', editorId), ContextKeyExpr.not('editorFocus') /* https://github.com/Microsoft/vscode/issues/58668 */); + (new webviewCommands.SelectAllWebviewEditorCommand({ + id: webviewCommands.SelectAllWebviewEditorCommand.ID, + precondition: ContextKeyExpr.and(contextKeyExpr, ContextKeyExpr.not(InputFocusedContextKey)), + kbOpts: { + primary: KeyMod.CtrlCmd | KeyCode.KEY_A, + weight: KeybindingWeight.EditorContrib + } + })).register(); + // These commands are only needed on MacOS where we have to disable the menu bar commands if (isMacintosh) { - (new CopyWebviewEditorCommand({ - id: CopyWebviewEditorCommand.ID, + (new webviewCommands.CopyWebviewEditorCommand({ + id: webviewCommands.CopyWebviewEditorCommand.ID, precondition: ContextKeyExpr.and(contextKeyExpr, ContextKeyExpr.not(InputFocusedContextKey)), kbOpts: { primary: KeyMod.CtrlCmd | KeyCode.KEY_C, @@ -40,8 +49,8 @@ function registerWebViewCommands(editorId: string): void { } })).register(); - (new PasteWebviewEditorCommand({ - id: PasteWebviewEditorCommand.ID, + (new webviewCommands.PasteWebviewEditorCommand({ + id: webviewCommands.PasteWebviewEditorCommand.ID, precondition: ContextKeyExpr.and(contextKeyExpr, ContextKeyExpr.not(InputFocusedContextKey)), kbOpts: { primary: KeyMod.CtrlCmd | KeyCode.KEY_V, @@ -49,14 +58,34 @@ function registerWebViewCommands(editorId: string): void { } })).register(); - (new CutWebviewEditorCommand({ - id: CutWebviewEditorCommand.ID, + (new webviewCommands.CutWebviewEditorCommand({ + id: webviewCommands.CutWebviewEditorCommand.ID, precondition: ContextKeyExpr.and(contextKeyExpr, ContextKeyExpr.not(InputFocusedContextKey)), kbOpts: { primary: KeyMod.CtrlCmd | KeyCode.KEY_X, weight: KeybindingWeight.EditorContrib } })).register(); + + (new webviewCommands.UndoWebviewEditorCommand({ + id: webviewCommands.UndoWebviewEditorCommand.ID, + precondition: ContextKeyExpr.and(contextKeyExpr, ContextKeyExpr.not(InputFocusedContextKey)), + kbOpts: { + primary: KeyMod.CtrlCmd | KeyCode.KEY_Z, + weight: KeybindingWeight.EditorContrib + } + })).register(); + + (new webviewCommands.RedoWebviewEditorCommand({ + id: webviewCommands.RedoWebviewEditorCommand.ID, + precondition: ContextKeyExpr.and(contextKeyExpr, ContextKeyExpr.not(InputFocusedContextKey)), + kbOpts: { + primary: KeyMod.CtrlCmd | KeyCode.KEY_Y, + secondary: [KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_Z], + mac: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_Z }, + weight: KeybindingWeight.EditorContrib + } + })).register(); } } diff --git a/src/vs/workbench/contrib/webview/electron-browser/webviewCommands.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewCommands.ts index 97fc3ac7501..15f320ce9f1 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webviewCommands.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewCommands.ts @@ -32,11 +32,19 @@ export class OpenWebviewDeveloperToolsAction extends Action { } } +export class SelectAllWebviewEditorCommand extends Command { + public static readonly ID = 'editor.action.webvieweditor.selectAll'; + + public runCommand(accessor: ServicesAccessor, args: any): void { + withActiveWebviewBasedWebview(accessor, webview => webview.selectAll()); + } +} + export class CopyWebviewEditorCommand extends Command { public static readonly ID = 'editor.action.webvieweditor.copy'; public runCommand(accessor: ServicesAccessor, _args: any): void { - return withActiveWebviewBasedWebview(accessor, webview => webview.copy()); + withActiveWebviewBasedWebview(accessor, webview => webview.copy()); } } @@ -44,7 +52,7 @@ export class PasteWebviewEditorCommand extends Command { public static readonly ID = 'editor.action.webvieweditor.paste'; public runCommand(accessor: ServicesAccessor, _args: any): void { - return withActiveWebviewBasedWebview(accessor, webview => webview.paste()); + withActiveWebviewBasedWebview(accessor, webview => webview.paste()); } } @@ -52,7 +60,23 @@ export class CutWebviewEditorCommand extends Command { public static readonly ID = 'editor.action.webvieweditor.cut'; public runCommand(accessor: ServicesAccessor, _args: any): void { - return withActiveWebviewBasedWebview(accessor, webview => webview.cut()); + withActiveWebviewBasedWebview(accessor, webview => webview.cut()); + } +} + +export class UndoWebviewEditorCommand extends Command { + public static readonly ID = 'editor.action.webvieweditor.undo'; + + public runCommand(accessor: ServicesAccessor, args: any): void { + withActiveWebviewBasedWebview(accessor, webview => webview.undo()); + } +} + +export class RedoWebviewEditorCommand extends Command { + public static readonly ID = 'editor.action.webvieweditor.redo'; + + public runCommand(accessor: ServicesAccessor, args: any): void { + withActiveWebviewBasedWebview(accessor, webview => webview.redo()); } } From 579966f90d84df7186510e31b94fe464843cfbc9 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 28 Jun 2019 15:21:42 -0700 Subject: [PATCH 0774/1449] Enable stricter csp on main webview page --- src/vs/workbench/contrib/webview/browser/pre/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/index.html b/src/vs/workbench/contrib/webview/browser/pre/index.html index 03337a5f6af..af7c52ebdac 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/index.html +++ b/src/vs/workbench/contrib/webview/browser/pre/index.html @@ -4,7 +4,7 @@ + content="default-src 'none'; script-src 'self'; child-src https://localhost:* http://localhost:*; style-src 'unsafe-inline';" /> From 4fc2e0b5d82d119006ed67bdce66737e75352212 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 28 Jun 2019 15:39:20 -0700 Subject: [PATCH 0775/1449] Extract getVsCodeApiScript --- .../contrib/webview/browser/pre/main.js | 73 ++++++++++--------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index 52d8d92b5af..c63a9ccda15 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -94,6 +94,45 @@ background-color: var(--vscode-scrollbarSlider-activeBackground); }`; + /** + * @param {*} [state] + * @return {string} + */ + function getVsCodeApiScript(state) { + return ` + const acquireVsCodeApi = (function() { + const originalPostMessage = window.parent.postMessage.bind(window.parent); + const targetOrigin = '*'; + let acquired = false; + + let state = ${state ? `JSON.parse(${JSON.stringify(state)})` : undefined}; + + return () => { + if (acquired) { + throw new Error('An instance of the VS Code API has already been acquired'); + } + acquired = true; + return Object.freeze({ + postMessage: function(msg) { + return originalPostMessage({ command: 'onmessage', data: msg }, targetOrigin); + }, + setState: function(newState) { + state = newState; + originalPostMessage({ command: 'do-update-state', data: JSON.stringify(newState) }, targetOrigin); + return newState; + }, + getState: function() { + return state; + } + }); + }; + })(); + delete window.parent; + delete window.top; + delete window.frameElement; + `; + } + /** * @typedef {{ * postMessage: (channel: string, data?: any) => void, @@ -266,39 +305,7 @@ // apply default script if (options.allowScripts) { const defaultScript = newDocument.createElement('script'); - defaultScript.textContent = ` - const acquireVsCodeApi = (function() { - const originalPostMessage = window.parent.postMessage.bind(window.parent); - const targetOrigin = '*'; - let acquired = false; - - let state = ${data.state ? `JSON.parse(${JSON.stringify(data.state)})` : undefined}; - - return () => { - if (acquired) { - throw new Error('An instance of the VS Code API has already been acquired'); - } - acquired = true; - return Object.freeze({ - postMessage: function(msg) { - return originalPostMessage({ command: 'onmessage', data: msg }, targetOrigin); - }, - setState: function(newState) { - state = newState; - originalPostMessage({ command: 'do-update-state', data: JSON.stringify(newState) }, targetOrigin); - return newState; - }, - getState: function() { - return state; - } - }); - }; - })(); - delete window.parent; - delete window.top; - delete window.frameElement; - `; - + defaultScript.textContent = getVsCodeApiScript(data.state); newDocument.head.prepend(defaultScript); } From 83f1f231d0aa1f0c21906fcff9ed9fcdda77da1b Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 28 Jun 2019 15:39:52 -0700 Subject: [PATCH 0776/1449] Remove injectHtml since it not used --- src/vs/workbench/contrib/webview/browser/pre/main.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index c63a9ccda15..0f90b664994 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -137,7 +137,6 @@ * @typedef {{ * postMessage: (channel: string, data?: any) => void, * onMessage: (channel: string, handler: any) => void, - * injectHtml?: (document: HTMLDocument) => void, * focusIframeOnCreate?: boolean, * ready?: Promise * }} HostCommunications @@ -317,10 +316,6 @@ applyStyles(newDocument, newDocument.body); - if (host.injectHtml) { - host.injectHtml(newDocument); - } - const frame = getActiveFrame(); const wasFirstLoad = firstLoad; // keep current scrollY around and use later From c9c29f3ed3932fd53520ed33169ea3a7cae6318d Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 28 Jun 2019 15:46:02 -0700 Subject: [PATCH 0777/1449] Extract toContentHtml --- .../contrib/webview/browser/pre/main.js | 66 +++++++++++-------- 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index 0f90b664994..5017faee033 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -251,6 +251,40 @@ }); }; + /** + * @return {string} + */ + function toContentHtml(data) { + const options = data.options; + const text = data.contents; + const newDocument = new DOMParser().parseFromString(text, 'text/html'); + + newDocument.querySelectorAll('a').forEach(a => { + if (!a.title) { + a.title = a.getAttribute('href'); + } + }); + + // apply default script + if (options.allowScripts) { + const defaultScript = newDocument.createElement('script'); + defaultScript.textContent = getVsCodeApiScript(data.state); + newDocument.head.prepend(defaultScript); + } + + // apply default styles + const defaultStyles = newDocument.createElement('style'); + defaultStyles.id = '_defaultStyles'; + defaultStyles.innerHTML = defaultCssRules; + newDocument.head.prepend(defaultStyles); + + applyStyles(newDocument, newDocument.body); + + // set DOCTYPE for newDocument explicitly as DOMParser.parseFromString strips it off + // and DOCTYPE is needed in the iframe to ensure that the user agent stylesheet is correctly overridden + return '\n' + newDocument.documentElement.outerHTML; + } + document.addEventListener('DOMContentLoaded', () => { const idMatch = document.location.search.match(/\bid=([\w-]+)/); const ID = idMatch ? idMatch[1] : undefined; @@ -280,7 +314,6 @@ } }); - // update iframe-contents let updateId = 0; host.onMessage('content', async (_event, data) => { @@ -291,30 +324,7 @@ } const options = data.options; - - const text = data.contents; - const newDocument = new DOMParser().parseFromString(text, 'text/html'); - - newDocument.querySelectorAll('a').forEach(a => { - if (!a.title) { - a.title = a.getAttribute('href'); - } - }); - - // apply default script - if (options.allowScripts) { - const defaultScript = newDocument.createElement('script'); - defaultScript.textContent = getVsCodeApiScript(data.state); - newDocument.head.prepend(defaultScript); - } - - // apply default styles - const defaultStyles = newDocument.createElement('style'); - defaultStyles.id = '_defaultStyles'; - defaultStyles.innerHTML = defaultCssRules; - newDocument.head.prepend(defaultStyles); - - applyStyles(newDocument, newDocument.body); + const newDocument = toContentHtml(data); const frame = getActiveFrame(); const wasFirstLoad = firstLoad; @@ -372,7 +382,7 @@ newFrame.contentWindow.addEventListener('DOMContentLoaded', e => { if (FAKE_LOAD) { newFrame.contentDocument.open(); - newFrame.contentDocument.write('\n' + newDocument.documentElement.outerHTML); + newFrame.contentDocument.write(newDocument); newFrame.contentDocument.close(); hookupOnLoadHandlers(newFrame); } @@ -477,9 +487,7 @@ } if (!FAKE_LOAD) { - // set DOCTYPE for newDocument explicitly as DOMParser.parseFromString strips it off - // and DOCTYPE is needed in the iframe to ensure that the user agent stylesheet is correctly overridden - newFrame.contentDocument.write('\n' + newDocument.documentElement.outerHTML); + newFrame.contentDocument.write(newDocument); newFrame.contentDocument.close(); } From 89aa8bf13730d6d941b2e16c6d035fdba5f60efe Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 28 Jun 2019 16:04:45 -0700 Subject: [PATCH 0778/1449] Moving some electron specific webview js back into electron --- .../contrib/webview/browser/pre/main.js | 62 ++++--------------- .../electron-browser/pre/electron-index.js | 46 +++++++++++++- 2 files changed, 57 insertions(+), 51 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index 5017faee033..fc5964ba3f2 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -3,6 +3,17 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // @ts-check + +/** + * @typedef {{ + * postMessage: (channel: string, data?: any) => void, + * onMessage: (channel: string, handler: any) => void, + * focusIframeOnCreate?: boolean, + * ready?: Promise, + * onIframeLoaded: (iframe: HTMLIFrameElement) => void + * }} WebviewHost + */ + (function () { 'use strict'; @@ -134,23 +145,13 @@ } /** - * @typedef {{ - * postMessage: (channel: string, data?: any) => void, - * onMessage: (channel: string, handler: any) => void, - * focusIframeOnCreate?: boolean, - * ready?: Promise - * }} HostCommunications - */ - - /** - * @param {HostCommunications} host + * @param {WebviewHost} host */ function createWebviewManager(host) { // state let firstLoad = true; let loadTimeout; let pendingMessages = []; - let isInDevelopmentMode = false; const initData = { initialScrollProgress: undefined @@ -442,44 +443,10 @@ } }); - if (!FAKE_LOAD) { - newFrame.contentWindow.onbeforeunload = () => { - if (isInDevelopmentMode) { // Allow reloads while developing a webview - host.postMessage('do-reload'); - return false; - } - - // Block navigation when not in development mode - console.log('prevented webview navigation'); - return false; - }; - } - // Bubble out link clicks newFrame.contentWindow.addEventListener('click', handleInnerClick); - // Electron 4 eats mouseup events from inside webviews - // https://github.com/microsoft/vscode/issues/75090 - // Try to fix this by rebroadcasting mouse moves and mouseups so that we can - // emulate these on the main window - if (!FAKE_LOAD) { - let isMouseDown = false; - - newFrame.contentWindow.addEventListener('mousedown', () => { - isMouseDown = true; - }); - - const tryDispatchSyntheticMouseEvent = (e) => { - if (!isMouseDown) { - host.postMessage('synthetic-mouse-event', { type: e.type, screenX: e.screenX, screenY: e.screenY, clientX: e.clientX, clientY: e.clientY }); - } - }; - newFrame.contentWindow.addEventListener('mouseup', e => { - tryDispatchSyntheticMouseEvent(e); - isMouseDown = false; - }); - newFrame.contentWindow.addEventListener('mousemove', tryDispatchSyntheticMouseEvent); - } + host.onIframeLoaded(newFrame); } if (!FAKE_LOAD) { @@ -511,9 +478,6 @@ initData.initialScrollProgress = progress; }); - host.onMessage('devtools-opened', () => { - isInDevelopmentMode = true; - }); trackFocus({ onFocus: () => host.postMessage('did-focus'), diff --git a/src/vs/workbench/contrib/webview/electron-browser/pre/electron-index.js b/src/vs/workbench/contrib/webview/electron-browser/pre/electron-index.js index a5f4d3b1809..6992535ea97 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/pre/electron-index.js +++ b/src/vs/workbench/contrib/webview/electron-browser/pre/electron-index.js @@ -28,14 +28,54 @@ // @ts-ignore const ipcRenderer = require('electron').ipcRenderer; - require('../../browser/pre/main')({ + let isInDevelopmentMode = false; + + /** + * @type {import('../../browser/pre/main').WebviewHost} + */ + const host = { postMessage: (channel, data) => { ipcRenderer.sendToHost(channel, data); }, onMessage: (channel, handler) => { ipcRenderer.on(channel, handler); }, - focusIframeOnCreate: true + focusIframeOnCreate: true, + onIframeLoaded: (newFrame) => { + newFrame.contentWindow.onbeforeunload = () => { + if (isInDevelopmentMode) { // Allow reloads while developing a webview + host.postMessage('do-reload'); + return false; + } + // Block navigation when not in development mode + console.log('prevented webview navigation'); + return false; + }; + + // Electron 4 eats mouseup events from inside webviews + // https://github.com/microsoft/vscode/issues/75090 + // Try to fix this by rebroadcasting mouse moves and mouseups so that we can + // emulate these on the main window + let isMouseDown = false; + newFrame.contentWindow.addEventListener('mousedown', () => { + isMouseDown = true; + }); + + const tryDispatchSyntheticMouseEvent = (e) => { + if (!isMouseDown) { + host.postMessage('synthetic-mouse-event', { type: e.type, screenX: e.screenX, screenY: e.screenY, clientX: e.clientX, clientY: e.clientY }); + } + }; + newFrame.contentWindow.addEventListener('mouseup', e => { + tryDispatchSyntheticMouseEvent(e); + isMouseDown = false; + }); + newFrame.contentWindow.addEventListener('mousemove', tryDispatchSyntheticMouseEvent); + } + }; + + host.onMessage('devtools-opened', () => { + isInDevelopmentMode = true; }); document.addEventListener('DOMContentLoaded', () => { @@ -46,4 +86,6 @@ ipcRenderer.sendToHost(message.data.command, message.data.data); }; }); + + require('../../browser/pre/main')(host); }()); \ No newline at end of file From 08ad050c27f84c85f1be1ced5517e7a51a4fc183 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 28 Jun 2019 18:01:46 -0700 Subject: [PATCH 0779/1449] Skip failing tests --- .../workbench/contrib/debug/test/browser/debugModel.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/debug/test/browser/debugModel.test.ts b/src/vs/workbench/contrib/debug/test/browser/debugModel.test.ts index 47ea24bf5bf..afeb7c47a19 100644 --- a/src/vs/workbench/contrib/debug/test/browser/debugModel.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/debugModel.test.ts @@ -133,7 +133,7 @@ suite('Debug - Model', () => { assert.equal(model.getSessions(true).length, 1); }); - test('threads multiple wtih allThreadsStopped', () => { + test.skip('threads multiple wtih allThreadsStopped', () => { const threadId1 = 1; const threadName1 = 'firstThread'; const threadId2 = 2; @@ -221,7 +221,7 @@ suite('Debug - Model', () => { assert.equal(session.getAllThreads().length, 0); }); - test('threads mutltiple without allThreadsStopped', () => { + test.skip('threads mutltiple without allThreadsStopped', () => { const sessionStub = sinon.spy(rawSession, 'stackTrace'); const stoppedThreadId = 1; From 7152aa5db53ece656bb8f1f4b92ecb3b18a1665e Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 28 Jun 2019 20:55:46 -0700 Subject: [PATCH 0780/1449] Skip failing keyboards linux and windows tests --- .../services/keybinding/test/browserKeyboardMapper.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts b/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts index 1099564ebf7..452d2c166a7 100644 --- a/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts +++ b/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts @@ -31,12 +31,12 @@ suite('keyboard layout loader', () => { let commandService = instantiationService.stub(ICommandService, {}); let instance = new TestKeyboardMapperFactory(notitifcationService, commandService); - test('load default US keyboard layout', () => { + test.skip('load default US keyboard layout', () => { assert.notEqual(instance.activeKeyboardLayout, null); assert.equal(instance.activeKeyboardLayout!.isUSStandard, true); }); - test('isKeyMappingActive', () => { + test.skip('isKeyMappingActive', () => { assert.equal(instance.isKeyMappingActive({ KeyA: { value: 'a', From a5db82427f8f4b8478367c8a1d98dea08a7ce4df Mon Sep 17 00:00:00 2001 From: pkoushik Date: Sun, 30 Jun 2019 00:07:02 +0530 Subject: [PATCH 0781/1449] Fix 72650 Changes with sync functions --- .../contrib/terminal/node/terminalProcess.ts | 55 +++++++++++++++---- 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/node/terminalProcess.ts b/src/vs/workbench/contrib/terminal/node/terminalProcess.ts index 21228cb208f..983951aa01a 100644 --- a/src/vs/workbench/contrib/terminal/node/terminalProcess.ts +++ b/src/vs/workbench/contrib/terminal/node/terminalProcess.ts @@ -11,7 +11,7 @@ import * as fs from 'fs'; import { Event, Emitter } from 'vs/base/common/event'; import { getWindowsBuildNumber } from 'vs/workbench/contrib/terminal/node/terminal'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { IShellLaunchConfig, ITerminalChildProcess } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IShellLaunchConfig, ITerminalChildProcess, SHELL_PATH_INVALID_EXIT_CODE } from 'vs/workbench/contrib/terminal/common/terminal'; import { exec } from 'child_process'; import { ILogService } from 'vs/platform/log/common/log'; @@ -24,6 +24,7 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable { private _isDisposed: boolean = false; private _titleInterval: NodeJS.Timer | null = null; private _initialCwd: string; + private _foundExecutableInPath: boolean = false; private readonly _onProcessData = new Emitter(); public get onProcessData(): Event { return this._onProcessData.event; } @@ -65,16 +66,48 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable { conptyInheritCursor: true }; - // TODO: Need to verify whether executable is on $PATH, otherwise things like cmd.exe will break - // fs.stat(shellLaunchConfig.executable!, (err) => { - // if (err && err.code === 'ENOENT') { - // this._exitCode = SHELL_PATH_INVALID_EXIT_CODE; - // this._queueProcessExit(); - // this._processStartupComplete = Promise.resolve(undefined); - // return; - // } - this.setupPtyProcess(shellLaunchConfig, options); - // }); + fs.stat(shellLaunchConfig.executable!, (err) => { + if (err && err.code === 'ENOENT' && !this.checkIfExistsInPath(shellLaunchConfig.executable!)) { + this._exitCode = SHELL_PATH_INVALID_EXIT_CODE; + this._queueProcessExit(); + this._processStartupComplete = Promise.resolve(undefined); + return; + } + this.setupPtyProcess(shellLaunchConfig, options); + }); + } + + private checkInsideDirRecursively(execPath: string, executable: string): void { + try { + fs.readdirSync(execPath).forEach((file) => { + const pathToFile = path.join(execPath, file); + const isDirectory = fs.statSync(pathToFile).isDirectory(); + if (!isDirectory) { + if (executable === file) { + this._foundExecutableInPath = true; + } + } else { + this.checkInsideDirRecursively(execPath, executable); + } + }); + } + catch (err) { + if (err.code !== 'ENOENT') { + throw err; + } + } + } + + private checkIfExistsInPath(executable: string): boolean { + if (process.env.PATH) { + const envPath = process.env.PATH.split(path.delimiter); + envPath.forEach(eachPath => { + if (!path.isAbsolute(eachPath)) { + this.checkInsideDirRecursively(eachPath, executable); + } + }); + } + return this._foundExecutableInPath; } private setupPtyProcess(shellLaunchConfig: IShellLaunchConfig, options: pty.IPtyForkOptions): void { From ea5435a4ec7564e5361c37c60e4ad257f2eee976 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 29 Jun 2019 13:15:01 -0700 Subject: [PATCH 0782/1449] Use pfs stat, handle directory, improve error meessages --- .../contrib/terminal/browser/terminalInstance.ts | 6 ++++-- .../workbench/contrib/terminal/common/terminal.ts | 1 + .../contrib/terminal/node/terminalProcess.ts | 13 +++++++++++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index 0c0f6721e9e..05fdc623efa 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -25,7 +25,7 @@ import { activeContrastBorder, scrollbarSliderActiveBackground, scrollbarSliderB import { ICssStyleCollector, ITheme, IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { PANEL_BACKGROUND } from 'vs/workbench/common/theme'; import { TerminalWidgetManager } from 'vs/workbench/contrib/terminal/browser/terminalWidgetManager'; -import { IShellLaunchConfig, ITerminalDimensions, ITerminalInstance, ITerminalProcessManager, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, NEVER_MEASURE_RENDER_TIME_STORAGE_KEY, ProcessState, TERMINAL_PANEL_ID, IWindowsShellHelper, SHELL_PATH_INVALID_EXIT_CODE } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IShellLaunchConfig, ITerminalDimensions, ITerminalInstance, ITerminalProcessManager, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, NEVER_MEASURE_RENDER_TIME_STORAGE_KEY, ProcessState, TERMINAL_PANEL_ID, IWindowsShellHelper, SHELL_PATH_INVALID_EXIT_CODE, SHELL_PATH_DIRECTORY_EXIT_CODE } from 'vs/workbench/contrib/terminal/common/terminal'; import { ansiColorIdentifiers, TERMINAL_BACKGROUND_COLOR, TERMINAL_CURSOR_BACKGROUND_COLOR, TERMINAL_CURSOR_FOREGROUND_COLOR, TERMINAL_FOREGROUND_COLOR, TERMINAL_SELECTION_BACKGROUND_COLOR } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; import { TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminalCommands'; import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/browser/terminalConfigHelper'; @@ -1003,7 +1003,9 @@ export class TerminalInstance implements ITerminalInstance { // Create exit code message if (exitCode) { if (exitCode === SHELL_PATH_INVALID_EXIT_CODE) { - exitCodeMessage = nls.localize('terminal.integrated.exitedWithInvalidPath', 'The terminal shell path does not exist: {0}', this._shellLaunchConfig.executable); + exitCodeMessage = nls.localize('terminal.integrated.exitedWithInvalidPath', 'The terminal shell path "{0}" does not exist', this._shellLaunchConfig.executable); + } else if (exitCode === SHELL_PATH_DIRECTORY_EXIT_CODE) { + exitCodeMessage = nls.localize('terminal.integrated.exitedWithInvalidPathDirectory', 'The terminal shell path "{0}" is a directory', this._shellLaunchConfig.executable); } else if (this._processManager && this._processManager.processState === ProcessState.KILLED_DURING_LAUNCH) { let args = ''; if (typeof this._shellLaunchConfig.args === 'string') { diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index 7f9eb86c400..1880511c68b 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -63,6 +63,7 @@ export const DEFAULT_LETTER_SPACING = 0; export const MINIMUM_LETTER_SPACING = -5; export const DEFAULT_LINE_HEIGHT = 1; export const SHELL_PATH_INVALID_EXIT_CODE = -1; +export const SHELL_PATH_DIRECTORY_EXIT_CODE = -2; export type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900'; diff --git a/src/vs/workbench/contrib/terminal/node/terminalProcess.ts b/src/vs/workbench/contrib/terminal/node/terminalProcess.ts index 983951aa01a..afb56f8c764 100644 --- a/src/vs/workbench/contrib/terminal/node/terminalProcess.ts +++ b/src/vs/workbench/contrib/terminal/node/terminalProcess.ts @@ -11,9 +11,10 @@ import * as fs from 'fs'; import { Event, Emitter } from 'vs/base/common/event'; import { getWindowsBuildNumber } from 'vs/workbench/contrib/terminal/node/terminal'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { IShellLaunchConfig, ITerminalChildProcess, SHELL_PATH_INVALID_EXIT_CODE } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IShellLaunchConfig, ITerminalChildProcess, SHELL_PATH_INVALID_EXIT_CODE, SHELL_PATH_DIRECTORY_EXIT_CODE } from 'vs/workbench/contrib/terminal/common/terminal'; import { exec } from 'child_process'; import { ILogService } from 'vs/platform/log/common/log'; +import { stat } from 'vs/base/node/pfs'; export class TerminalProcess implements ITerminalChildProcess, IDisposable { private _exitCode: number; @@ -66,7 +67,15 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable { conptyInheritCursor: true }; - fs.stat(shellLaunchConfig.executable!, (err) => { + stat(shellLaunchConfig.executable!).then(stat => { + if (!stat.isFile() && !stat.isSymbolicLink()) { + this._exitCode = stat.isDirectory() ? SHELL_PATH_DIRECTORY_EXIT_CODE : SHELL_PATH_INVALID_EXIT_CODE; + this._queueProcessExit(); + this._processStartupComplete = Promise.resolve(undefined); + return; + } + this.setupPtyProcess(shellLaunchConfig, options); + }, (err) => { if (err && err.code === 'ENOENT' && !this.checkIfExistsInPath(shellLaunchConfig.executable!)) { this._exitCode = SHELL_PATH_INVALID_EXIT_CODE; this._queueProcessExit(); From f8bd0e3dc87a732b9bd91259f7b3c81906300b6d Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 29 Jun 2019 13:38:56 -0700 Subject: [PATCH 0783/1449] Use findExecutable based on tasks function --- .../terminal/node/terminalEnvironment.ts | 59 ++++++++++++++++++- .../contrib/terminal/node/terminalProcess.ts | 56 +++++------------- 2 files changed, 70 insertions(+), 45 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/node/terminalEnvironment.ts b/src/vs/workbench/contrib/terminal/node/terminalEnvironment.ts index 1f8a127dbae..2df9ffe52b5 100644 --- a/src/vs/workbench/contrib/terminal/node/terminalEnvironment.ts +++ b/src/vs/workbench/contrib/terminal/node/terminalEnvironment.ts @@ -4,8 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import { IProcessEnvironment, isLinux, isMacintosh, isWindows } from 'vs/base/common/platform'; -import { readFile } from 'vs/base/node/pfs'; -import { basename } from 'vs/base/common/path'; +import { readFile, exists } from 'vs/base/node/pfs'; +import * as path from 'vs/base/common/path'; +import { isString } from 'vs/base/common/types'; let mainProcessParentEnv: IProcessEnvironment | undefined; @@ -18,7 +19,7 @@ export async function getMainProcessParentEnv(): Promise { // env using /proc//environ. if (isLinux) { const mainProcessId = process.ppid; - const codeProcessName = basename(process.argv[0]); + const codeProcessName = path.basename(process.argv[0]); let pid: number = 0; let ppid: number = mainProcessId; let name: string = codeProcessName; @@ -76,4 +77,56 @@ export async function getMainProcessParentEnv(): Promise { } return mainProcessParentEnv!; +} + +export async function findExecutable(command: string, cwd?: string, paths?: string[]): Promise { + // If we have an absolute path then we take it. + if (path.isAbsolute(command)) { + return await exists(command) ? command : undefined; + } + if (cwd === undefined) { + cwd = process.cwd(); + } + const dir = path.dirname(command); + if (dir !== '.') { + // We have a directory and the directory is relative (see above). Make the path absolute + // to the current working directory. + const fullPath = path.join(cwd, command); + return await exists(fullPath) ? fullPath : undefined; + } + if (paths === undefined && isString(process.env.PATH)) { + paths = process.env.PATH.split(path.delimiter); + } + // No PATH environment. Make path absolute to the cwd. + if (paths === undefined || paths.length === 0) { + const fullPath = path.join(cwd, command); + return await exists(fullPath) ? fullPath : undefined; + } + // We have a simple file name. We get the path variable from the env + // and try to find the executable on the path. + for (let pathEntry of paths) { + // The path entry is absolute. + let fullPath: string; + if (path.isAbsolute(pathEntry)) { + fullPath = path.join(pathEntry, command); + } else { + fullPath = path.join(cwd, pathEntry, command); + } + + if (await exists(fullPath)) { + return fullPath; + } + if (isWindows) { + let withExtension = fullPath + '.com'; + if (await exists(withExtension)) { + return withExtension; + } + withExtension = fullPath + '.exe'; + if (await exists(withExtension)) { + return withExtension; + } + } + } + const fullPath = path.join(cwd, command); + return await exists(fullPath) ? fullPath : undefined; } \ No newline at end of file diff --git a/src/vs/workbench/contrib/terminal/node/terminalProcess.ts b/src/vs/workbench/contrib/terminal/node/terminalProcess.ts index afb56f8c764..e5e6470f5cb 100644 --- a/src/vs/workbench/contrib/terminal/node/terminalProcess.ts +++ b/src/vs/workbench/contrib/terminal/node/terminalProcess.ts @@ -15,6 +15,8 @@ import { IShellLaunchConfig, ITerminalChildProcess, SHELL_PATH_INVALID_EXIT_CODE import { exec } from 'child_process'; import { ILogService } from 'vs/platform/log/common/log'; import { stat } from 'vs/base/node/pfs'; +import { findExecutable } from 'vs/workbench/contrib/terminal/node/terminalEnvironment'; +import { URI } from 'vs/base/common/uri'; export class TerminalProcess implements ITerminalChildProcess, IDisposable { private _exitCode: number; @@ -25,7 +27,6 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable { private _isDisposed: boolean = false; private _titleInterval: NodeJS.Timer | null = null; private _initialCwd: string; - private _foundExecutableInPath: boolean = false; private readonly _onProcessData = new Emitter(); public get onProcessData(): Event { return this._onProcessData.event; } @@ -69,54 +70,25 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable { stat(shellLaunchConfig.executable!).then(stat => { if (!stat.isFile() && !stat.isSymbolicLink()) { - this._exitCode = stat.isDirectory() ? SHELL_PATH_DIRECTORY_EXIT_CODE : SHELL_PATH_INVALID_EXIT_CODE; - this._queueProcessExit(); - this._processStartupComplete = Promise.resolve(undefined); - return; + return this._launchFailed(stat.isDirectory() ? SHELL_PATH_DIRECTORY_EXIT_CODE : SHELL_PATH_INVALID_EXIT_CODE); } this.setupPtyProcess(shellLaunchConfig, options); - }, (err) => { - if (err && err.code === 'ENOENT' && !this.checkIfExistsInPath(shellLaunchConfig.executable!)) { - this._exitCode = SHELL_PATH_INVALID_EXIT_CODE; - this._queueProcessExit(); - this._processStartupComplete = Promise.resolve(undefined); - return; + }, async (err) => { + if (err && err.code === 'ENOENT') { + let cwd = shellLaunchConfig.cwd instanceof URI ? shellLaunchConfig.cwd.path : shellLaunchConfig.cwd!; + const executable = await findExecutable(shellLaunchConfig.executable!, cwd); + if (!executable) { + return this._launchFailed(SHELL_PATH_INVALID_EXIT_CODE); + } } this.setupPtyProcess(shellLaunchConfig, options); }); } - private checkInsideDirRecursively(execPath: string, executable: string): void { - try { - fs.readdirSync(execPath).forEach((file) => { - const pathToFile = path.join(execPath, file); - const isDirectory = fs.statSync(pathToFile).isDirectory(); - if (!isDirectory) { - if (executable === file) { - this._foundExecutableInPath = true; - } - } else { - this.checkInsideDirRecursively(execPath, executable); - } - }); - } - catch (err) { - if (err.code !== 'ENOENT') { - throw err; - } - } - } - - private checkIfExistsInPath(executable: string): boolean { - if (process.env.PATH) { - const envPath = process.env.PATH.split(path.delimiter); - envPath.forEach(eachPath => { - if (!path.isAbsolute(eachPath)) { - this.checkInsideDirRecursively(eachPath, executable); - } - }); - } - return this._foundExecutableInPath; + private _launchFailed(exitCode: number): void { + this._exitCode = exitCode; + this._queueProcessExit(); + this._processStartupComplete = Promise.resolve(undefined); } private setupPtyProcess(shellLaunchConfig: IShellLaunchConfig, options: pty.IPtyForkOptions): void { From 78954dd6b22922d1700223ec655df2e2d782a226 Mon Sep 17 00:00:00 2001 From: Tony Xia Date: Sun, 30 Jun 2019 14:10:07 +1000 Subject: [PATCH 0784/1449] Fixed a typo in vscode.executeCodeLensProvider args --- src/vs/workbench/api/common/extHostApiCommands.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/api/common/extHostApiCommands.ts b/src/vs/workbench/api/common/extHostApiCommands.ts index 4d78f9c67f3..f6aa2e727a4 100644 --- a/src/vs/workbench/api/common/extHostApiCommands.ts +++ b/src/vs/workbench/api/common/extHostApiCommands.ts @@ -144,7 +144,7 @@ export class ExtHostApiCommands { description: 'Execute CodeLens provider.', args: [ { name: 'uri', description: 'Uri of a text document', constraint: URI }, - { name: 'itemResolveCount', description: '(optional) Number of lenses that should be resolved and returned. Will only retrun resolved lenses, will impact performance)', constraint: (value: any) => value === undefined || typeof value === 'number' } + { name: 'itemResolveCount', description: '(optional) Number of lenses that should be resolved and returned. Will only return resolved lenses, will impact performance)', constraint: (value: any) => value === undefined || typeof value === 'number' } ], returns: 'A promise that resolves to an array of CodeLens-instances.' }); @@ -224,7 +224,7 @@ export class ExtHostApiCommands { description: 'Open a folder or workspace in the current window or new window depending on the newWindow argument. Note that opening in the same window will shutdown the current extension host process and start a new one on the given folder/workspace unless the newWindow parameter is set to true.', args: [ { name: 'uri', description: '(optional) Uri of the folder or workspace file to open. If not provided, a native dialog will ask the user for the folder', constraint: (value: any) => value === undefined || value instanceof URI }, - { name: 'options', description: '(optional) Options. Object with the following properties: `forceNewWindow `: Whether to open the folder/workspace in a new window or the same. Defaults to opening in the same window. `noRecentEntry`: Wheter the opened URI will appear in the \'Open Recent\' list. Defaults to true. Note, for backward compatibility, options can also be of type boolean, representing the `forceNewWindow` setting.', constraint: (value: any) => value === undefined || typeof value === 'object' || typeof value === 'boolean' } + { name: 'options', description: '(optional) Options. Object with the following properties: `forceNewWindow `: Whether to open the folder/workspace in a new window or the same. Defaults to opening in the same window. `noRecentEntry`: Whether the opened URI will appear in the \'Open Recent\' list. Defaults to true. Note, for backward compatibility, options can also be of type boolean, representing the `forceNewWindow` setting.', constraint: (value: any) => value === undefined || typeof value === 'object' || typeof value === 'boolean' } ] }); From f93a39c8863ed756da8ced7d3f44d9ec26e11cbb Mon Sep 17 00:00:00 2001 From: Tony Xia Date: Sun, 30 Jun 2019 14:18:47 +1000 Subject: [PATCH 0785/1449] onHighlghtRemoved -> onHighlightRemoved --- src/vs/workbench/browser/parts/editor/rangeDecorations.ts | 2 +- .../contrib/preferences/browser/preferencesRenderers.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/rangeDecorations.ts b/src/vs/workbench/browser/parts/editor/rangeDecorations.ts index 037adb131e0..b22a8290edd 100644 --- a/src/vs/workbench/browser/parts/editor/rangeDecorations.ts +++ b/src/vs/workbench/browser/parts/editor/rangeDecorations.ts @@ -26,7 +26,7 @@ export class RangeHighlightDecorations extends Disposable { private editorDisposables: IDisposable[] = []; private readonly _onHighlightRemoved: Emitter = this._register(new Emitter()); - get onHighlghtRemoved(): Event { return this._onHighlightRemoved.event; } + get onHighlightRemoved(): Event { return this._onHighlightRemoved.event; } constructor(@IEditorService private readonly editorService: IEditorService) { super(); diff --git a/src/vs/workbench/contrib/preferences/browser/preferencesRenderers.ts b/src/vs/workbench/contrib/preferences/browser/preferencesRenderers.ts index 6e820f58d02..ea9ca6a0d73 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferencesRenderers.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferencesRenderers.ts @@ -916,8 +916,8 @@ class SettingHighlighter extends Disposable { super(); this.fixedHighlighter = this._register(instantiationService.createInstance(RangeHighlightDecorations)); this.volatileHighlighter = this._register(instantiationService.createInstance(RangeHighlightDecorations)); - this.fixedHighlighter.onHighlghtRemoved(() => this.clearFocusEventEmitter.fire(this.highlightedSetting)); - this.volatileHighlighter.onHighlghtRemoved(() => this.clearFocusEventEmitter.fire(this.highlightedSetting)); + this.fixedHighlighter.onHighlightRemoved(() => this.clearFocusEventEmitter.fire(this.highlightedSetting)); + this.volatileHighlighter.onHighlightRemoved(() => this.clearFocusEventEmitter.fire(this.highlightedSetting)); } highlight(setting: ISetting, fix: boolean = false) { From be880e88afb21d244c236c0ba580cd8652f30fa9 Mon Sep 17 00:00:00 2001 From: Tony Xia Date: Sun, 30 Jun 2019 14:21:26 +1000 Subject: [PATCH 0786/1449] Fixed variables wording issues --- src/vs/workbench/browser/parts/editor/editorGroupView.ts | 6 +++--- .../contrib/preferences/browser/preferencesSearch.ts | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/editorGroupView.ts b/src/vs/workbench/browser/parts/editor/editorGroupView.ts index 323f41a55cb..a1c4176be56 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupView.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupView.ts @@ -212,9 +212,9 @@ export class EditorGroupView extends Themable implements IEditorGroupView { this.updateStyles(); } - private handleGroupContextKeys(contextKeyServcie: IContextKeyService): void { - const groupActiveEditorDirtyContextKey = EditorGroupActiveEditorDirtyContext.bindTo(contextKeyServcie); - const groupEditorsCountContext = EditorGroupEditorsCountContext.bindTo(contextKeyServcie); + private handleGroupContextKeys(contextKeyService: IContextKeyService): void { + const groupActiveEditorDirtyContextKey = EditorGroupActiveEditorDirtyContext.bindTo(contextKeyService); + const groupEditorsCountContext = EditorGroupEditorsCountContext.bindTo(contextKeyService); let activeEditorListener = new MutableDisposable(); diff --git a/src/vs/workbench/contrib/preferences/browser/preferencesSearch.ts b/src/vs/workbench/contrib/preferences/browser/preferencesSearch.ts index 98dc8065879..5c78ca620fa 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferencesSearch.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferencesSearch.ts @@ -114,8 +114,8 @@ export class SettingMatches { const descriptionRanges: IRange[] = this.getRangesForWords(words, this.descriptionMatchingWords, [subSettingMatches.descriptionMatchingWords, subSettingMatches.keyMatchingWords, subSettingMatches.valueMatchingWords]); const keyRanges: IRange[] = this.getRangesForWords(words, this.keyMatchingWords, [subSettingMatches.descriptionMatchingWords, subSettingMatches.keyMatchingWords, subSettingMatches.valueMatchingWords]); const subSettingKeyRanges: IRange[] = this.getRangesForWords(words, subSettingMatches.keyMatchingWords, [this.descriptionMatchingWords, this.keyMatchingWords, subSettingMatches.valueMatchingWords]); - const subSettinValueRanges: IRange[] = this.getRangesForWords(words, subSettingMatches.valueMatchingWords, [this.descriptionMatchingWords, this.keyMatchingWords, subSettingMatches.keyMatchingWords]); - result.push(...descriptionRanges, ...keyRanges, ...subSettingKeyRanges, ...subSettinValueRanges); + const subSettingValueRanges: IRange[] = this.getRangesForWords(words, subSettingMatches.valueMatchingWords, [this.descriptionMatchingWords, this.keyMatchingWords, subSettingMatches.keyMatchingWords]); + result.push(...descriptionRanges, ...keyRanges, ...subSettingKeyRanges, ...subSettingValueRanges); result.push(...subSettingMatches.matches); } } From 2f0700cee7eede583324fef2371a4ecd1a003d5d Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 30 Jun 2019 16:31:34 +0200 Subject: [PATCH 0787/1449] Fix #75775 --- src/vs/workbench/browser/parts/views/viewsViewlet.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/parts/views/viewsViewlet.ts b/src/vs/workbench/browser/parts/views/viewsViewlet.ts index e2b03b4c9ca..a9e156fdefc 100644 --- a/src/vs/workbench/browser/parts/views/viewsViewlet.ts +++ b/src/vs/workbench/browser/parts/views/viewsViewlet.ts @@ -42,7 +42,7 @@ export abstract class ViewContainerViewlet extends PanelViewlet implements IView private dimension: DOM.Dimension; private areExtensionsReady: boolean = false; - private readonly visibleViewsCountFromCache: number; + private readonly visibleViewsCountFromCache: number | undefined; private readonly visibleViewsStorageId: string; protected readonly viewsModel: PersistentContributableViewsModel; private viewDisposables: IDisposable[] = []; @@ -68,7 +68,7 @@ export abstract class ViewContainerViewlet extends PanelViewlet implements IView this.viewletState = this.getMemento(StorageScope.WORKSPACE); this.visibleViewsStorageId = `${id}.numberOfVisibleViews`; - this.visibleViewsCountFromCache = this.storageService.getNumber(this.visibleViewsStorageId, StorageScope.WORKSPACE, 1); + this.visibleViewsCountFromCache = this.storageService.getNumber(this.visibleViewsStorageId, StorageScope.WORKSPACE, undefined); this._register(toDisposable(() => this.viewDisposables = dispose(this.viewDisposables))); } @@ -172,6 +172,9 @@ export abstract class ViewContainerViewlet extends PanelViewlet implements IView return false; } if (!this.areExtensionsReady) { + if (this.visibleViewsCountFromCache === undefined) { + return false; + } // Check in cache so that view do not jump. See #29609 return this.visibleViewsCountFromCache === 1; } From 34d245ed44ca9b2780c658ceded53378abee0a03 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 30 Jun 2019 20:10:28 +0200 Subject: [PATCH 0788/1449] trigger workspace contains activation event on new folders --- .../api/browser/mainThreadWorkspace.ts | 5 ++- .../workbench/api/common/extHost.protocol.ts | 2 +- .../api/node/extHostExtensionService.ts | 35 +++++++++++-------- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadWorkspace.ts b/src/vs/workbench/api/browser/mainThreadWorkspace.ts index 6720db87bf9..b508baea7db 100644 --- a/src/vs/workbench/api/browser/mainThreadWorkspace.ts +++ b/src/vs/workbench/api/browser/mainThreadWorkspace.ts @@ -179,10 +179,9 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape { return search; } - $checkExists(includes: string[], token: CancellationToken): Promise { + $checkExists(folders: UriComponents[], includes: string[], token: CancellationToken): Promise { const queryBuilder = this._instantiationService.createInstance(QueryBuilder); - const folders = this._contextService.getWorkspace().folders.map(folder => folder.uri); - const query = queryBuilder.file(folders, { + const query = queryBuilder.file(folders.map(folder => URI.revive(folder)), { _reason: 'checkExists', includePattern: includes.join(', '), expandPatterns: true, diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 2f51c54ee7c..4b7ea728692 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -578,7 +578,7 @@ export interface ITextSearchComplete { export interface MainThreadWorkspaceShape extends IDisposable { $startFileSearch(includePattern: string | undefined, includeFolder: UriComponents | undefined, excludePatternOrDisregardExcludes: string | false | undefined, maxResults: number | undefined, token: CancellationToken): Promise; $startTextSearch(query: search.IPatternInfo, options: ITextQueryBuilderOptions, requestId: number, token: CancellationToken): Promise; - $checkExists(includes: string[], token: CancellationToken): Promise; + $checkExists(folders: UriComponents[], includes: string[], token: CancellationToken): Promise; $saveAll(includeUntitled?: boolean): Promise; $updateWorkspaceFolders(extensionName: string, index: number, deleteCount: number, workspaceFoldersToAdd: { uri: UriComponents, name?: string }[]): Promise; $resolveProxy(url: string): Promise; diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts index c5360322431..6f1b2c6cc74 100644 --- a/src/vs/workbench/api/node/extHostExtensionService.ts +++ b/src/vs/workbench/api/node/extHostExtensionService.ts @@ -7,7 +7,7 @@ import * as nls from 'vs/nls'; import * as path from 'vs/base/common/path'; import { originalFSPath } from 'vs/base/common/resources'; import { Barrier } from 'vs/base/common/async'; -import { dispose, toDisposable } from 'vs/base/common/lifecycle'; +import { dispose, toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { TernarySearchTree } from 'vs/base/common/map'; import { URI } from 'vs/base/common/uri'; import { ILogService } from 'vs/platform/log/common/log'; @@ -26,7 +26,6 @@ import { CancellationTokenSource } from 'vs/base/common/cancellation'; import * as errors from 'vs/base/common/errors'; import * as vscode from 'vscode'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; -import { IWorkspace } from 'vs/platform/workspace/common/workspace'; import { Schemas } from 'vs/base/common/network'; import { withNullAsUndefined } from 'vs/base/common/types'; import { VSBuffer } from 'vs/base/common/buffer'; @@ -81,6 +80,8 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { private _started: boolean; + private readonly _disposables: DisposableStore; + constructor( hostUtils: IHostUtils, initData: IInitData, @@ -98,6 +99,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { this._extHostConfiguration = extHostConfiguration; this._environment = environment; this._extHostLogService = extHostLogService; + this._disposables = new DisposableStore(); this._mainThreadWorkspaceProxy = this._extHostContext.getProxy(MainContext.MainThreadWorkspace); this._mainThreadTelemetryProxy = this._extHostContext.getProxy(MainContext.MainThreadTelemetry); @@ -414,27 +416,32 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { console.error(err); }); - return this._handleWorkspaceContainsEagerExtensions(this._extHostWorkspace.workspace); + this._extHostWorkspace.onDidChangeWorkspace(({ added }) => this._handleWorkspaceContainsEagerExtensions(added), this, this._disposables); + const folders = this._extHostWorkspace.workspace ? this._extHostWorkspace.workspace.folders : []; + return this._handleWorkspaceContainsEagerExtensions(folders); } - private _handleWorkspaceContainsEagerExtensions(workspace: IWorkspace | undefined): Promise { - if (!workspace || workspace.folders.length === 0) { + private _handleWorkspaceContainsEagerExtensions(folders: ReadonlyArray): Promise { + if (folders.length === 0) { return Promise.resolve(undefined); } - return Promise.all( this._registry.getAllExtensionDescriptions().map((desc) => { - return this._handleWorkspaceContainsEagerExtension(workspace, desc); + return this._handleWorkspaceContainsEagerExtension(folders, desc); }) ).then(() => { }); } - private _handleWorkspaceContainsEagerExtension(workspace: IWorkspace, desc: IExtensionDescription): Promise { + private _handleWorkspaceContainsEagerExtension(folders: ReadonlyArray, desc: IExtensionDescription): Promise { const activationEvents = desc.activationEvents; if (!activationEvents) { return Promise.resolve(undefined); } + if (this.isActivated(desc.identifier)) { + return Promise.resolve(undefined); + } + const fileNames: string[] = []; const globPatterns: string[] = []; @@ -453,16 +460,16 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { return Promise.resolve(undefined); } - const fileNamePromise = Promise.all(fileNames.map((fileName) => this._activateIfFileName(workspace, desc.identifier, fileName))).then(() => { }); - const globPatternPromise = this._activateIfGlobPatterns(desc.identifier, globPatterns); + const fileNamePromise = Promise.all(fileNames.map((fileName) => this._activateIfFileName(folders, desc.identifier, fileName))).then(() => { }); + const globPatternPromise = this._activateIfGlobPatterns(desc.identifier, folders, globPatterns); return Promise.all([fileNamePromise, globPatternPromise]).then(() => { }); } - private async _activateIfFileName(workspace: IWorkspace, extensionId: ExtensionIdentifier, fileName: string): Promise { + private async _activateIfFileName(folders: ReadonlyArray, extensionId: ExtensionIdentifier, fileName: string): Promise { // find exact path - for (const { uri } of workspace.folders) { + for (const { uri } of folders) { if (await this._hostUtils.exists(path.join(URI.revive(uri).fsPath, fileName))) { // the file was found return ( @@ -475,7 +482,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { return undefined; } - private async _activateIfGlobPatterns(extensionId: ExtensionIdentifier, globPatterns: string[]): Promise { + private async _activateIfGlobPatterns(extensionId: ExtensionIdentifier, folders: ReadonlyArray, globPatterns: string[]): Promise { this._extHostLogService.trace(`extensionHostMain#activateIfGlobPatterns: fileSearch, extension: ${extensionId.value}, entryPoint: workspaceContains`); if (globPatterns.length === 0) { @@ -483,7 +490,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { } const tokenSource = new CancellationTokenSource(); - const searchP = this._mainThreadWorkspaceProxy.$checkExists(globPatterns, tokenSource.token); + const searchP = this._mainThreadWorkspaceProxy.$checkExists(folders.map(folder => folder.uri), globPatterns, tokenSource.token); const timer = setTimeout(async () => { tokenSource.cancel(); From 4b77cd2a988048539bacf0403b1bf5ff9106caff Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 30 Jun 2019 20:59:29 +0200 Subject: [PATCH 0789/1449] Fix #73127 --- src/vs/platform/workspace/common/workspace.ts | 6 +++++- src/vs/platform/workspace/test/common/workspace.test.ts | 9 +++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/vs/platform/workspace/common/workspace.ts b/src/vs/platform/workspace/common/workspace.ts index 5f415bd590b..5353a0eb7e7 100644 --- a/src/vs/platform/workspace/common/workspace.ts +++ b/src/vs/platform/workspace/common/workspace.ts @@ -185,7 +185,11 @@ export class Workspace implements IWorkspace { return null; } - return this._foldersMap.findSubstr(resource.toString()) || null; + return this._foldersMap.findSubstr(resource.with({ + scheme: resource.scheme, + authority: resource.authority, + path: resource.path + }).toString()) || null; } private updateFoldersMap(): void { diff --git a/src/vs/platform/workspace/test/common/workspace.test.ts b/src/vs/platform/workspace/test/common/workspace.test.ts index 63dff7e2bf5..10e257276db 100644 --- a/src/vs/platform/workspace/test/common/workspace.test.ts +++ b/src/vs/platform/workspace/test/common/workspace.test.ts @@ -52,6 +52,15 @@ suite('Workspace', () => { assert.equal(actual, expected); }); + test('getFolder returns the folder even if the uri has query path', () => { + const expected = new WorkspaceFolder({ uri: testFolderUri, name: '', index: 2 }); + let testObject = new Workspace('', [new WorkspaceFolder({ uri: mainFolderUri, name: '', index: 0 }), new WorkspaceFolder({ uri: URI.file('/src/code'), name: '', index: 1 }), expected]); + + const actual = testObject.getFolder(URI.file(path.join(fileFolder, 'test/a')).with({ query: 'somequery' })); + + assert.equal(actual, expected); + }); + test('getFolder returns null if the uri is not sub', () => { let testObject = new Workspace('', [new WorkspaceFolder({ uri: testFolderUri, name: '', index: 0 }), new WorkspaceFolder({ uri: URI.file('/src/code'), name: '', index: 1 })]); From f468bd1b556359144e25881bf77739010dcadf6e Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 30 Jun 2019 21:11:17 +0200 Subject: [PATCH 0790/1449] adopt to api changes --- .../userData/common/fileUserDataProvider.ts | 14 +++++++------- .../userData/common/inMemoryUserDataProvider.ts | 14 +++++++------- .../workbench/services/userData/common/userData.ts | 13 +++++-------- .../userData/common/userDataFileSystemProvider.ts | 8 +++----- 4 files changed, 22 insertions(+), 27 deletions(-) diff --git a/src/vs/workbench/services/userData/common/fileUserDataProvider.ts b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts index 8aebbcdc065..3be33dbd042 100644 --- a/src/vs/workbench/services/userData/common/fileUserDataProvider.ts +++ b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts @@ -42,30 +42,30 @@ export class FileUserDataProvider extends Disposable implements IUserDataProvide } } - async readFile(path: string): Promise { + async readFile(path: string): Promise { const resource = this.toResource(path); try { const content = await this.fileService.readFile(resource); - return content.value; + return content.value.buffer; } catch (e) { const exists = await this.fileService.exists(resource); if (exists) { throw e; } } - return VSBuffer.fromString(''); + return VSBuffer.fromString('').buffer; } - writeFile(path: string, value: VSBuffer): Promise { - return this.fileService.writeFile(this.toResource(path), value).then(() => undefined); + writeFile(path: string, value: Uint8Array): Promise { + return this.fileService.writeFile(this.toResource(path), VSBuffer.wrap(value)).then(() => undefined); } - async readDirectory(path: string): Promise { + async listFiles(path: string): Promise { const result = await this.fileService.resolve(this.toResource(path)); return result.children ? result.children.map(c => this.toKey(c.resource)!) : []; } - delete(path: string): Promise { + deleteFile(path: string): Promise { return this.fileService.del(this.toResource(path)); } diff --git a/src/vs/workbench/services/userData/common/inMemoryUserDataProvider.ts b/src/vs/workbench/services/userData/common/inMemoryUserDataProvider.ts index 844430bbaf3..3e477e0a0f4 100644 --- a/src/vs/workbench/services/userData/common/inMemoryUserDataProvider.ts +++ b/src/vs/workbench/services/userData/common/inMemoryUserDataProvider.ts @@ -21,27 +21,27 @@ export class InMemoryUserDataProvider extends Disposable implements IUserDataPro this._register(toDisposable(() => this.store.clear())); } - async readDirectory(path: string): Promise { + async listFiles(path: string): Promise { return []; } - async readFile(path: string): Promise { - return VSBuffer.fromString(this.getValue(path)); + async readFile(path: string): Promise { + return VSBuffer.fromString(this.getValue(path)).buffer; } - async writeFile(path: string, value: VSBuffer): Promise { - const content = value.toString(); + async writeFile(path: string, value: Uint8Array): Promise { + const content = VSBuffer.wrap(value).toString(); if (content !== this.getValue(path)) { if (content) { this.store.set(path, content); this._onDidChangeFile.fire([path]); } else { - this.delete(path); + this.deleteFile(path); } } } - async delete(path: string): Promise { + async deleteFile(path: string): Promise { if (this.store.has(path)) { this.store.delete(path); this._onDidChangeFile.fire([path]); diff --git a/src/vs/workbench/services/userData/common/userData.ts b/src/vs/workbench/services/userData/common/userData.ts index f117d58b13d..de051b0ec5d 100644 --- a/src/vs/workbench/services/userData/common/userData.ts +++ b/src/vs/workbench/services/userData/common/userData.ts @@ -4,17 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import { Event } from 'vs/base/common/event'; -import { VSBuffer } from 'vs/base/common/buffer'; export interface IUserDataProvider { - onDidChangeFile: Event; + readonly onDidChangeFile: Event; - readFile(path: string): Promise; + readFile(path: string): Promise; + writeFile(path: string, content: Uint8Array): Promise; + deleteFile(path: string): Promise; - readDirectory(path: string): Promise; - - writeFile(path: string, content: VSBuffer): Promise; - - delete(path: string): Promise; + listFiles(path: string): Promise; } \ No newline at end of file diff --git a/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts b/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts index 88b54acb2cc..d6f10cbf477 100644 --- a/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts +++ b/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts @@ -7,7 +7,6 @@ import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; import { FileSystemProviderCapabilities, FileWriteOptions, IStat, FileType, FileDeleteOptions, IWatchOptions, FileOverwriteOptions, IFileSystemProviderWithFileReadWriteCapability, IFileChange, FileChangesEvent, FileChangeType } from 'vs/platform/files/common/files'; import { IUserDataProvider } from 'vs/workbench/services/userData/common/userData'; import { URI } from 'vs/base/common/uri'; -import { VSBuffer } from 'vs/base/common/buffer'; import { Event, Emitter } from 'vs/base/common/event'; import * as resources from 'vs/base/common/resources'; import { TernarySearchTree } from 'vs/base/common/map'; @@ -65,8 +64,7 @@ export class UserDataFileSystemProvider extends Disposable implements IFileSyste if (!path) { throw new Error(`Invalud user data resource ${resource}`); } - const content = await this.userDataProvider.readFile(path); - return content.buffer; + return this.userDataProvider.readFile(path); } async readdir(resource: URI): Promise<[string, FileType][]> { @@ -74,7 +72,7 @@ export class UserDataFileSystemProvider extends Disposable implements IFileSyste if (!path) { throw new Error(`Invalud user data resource ${resource}`); } - const children = await this.userDataProvider.readDirectory(path); + const children = await this.userDataProvider.listFiles(path); return children.map(c => [c, FileType.Unknown]); } @@ -83,7 +81,7 @@ export class UserDataFileSystemProvider extends Disposable implements IFileSyste if (!path) { throw new Error(`Invalud user data resource ${resource}`); } - return this.userDataProvider.writeFile(path, VSBuffer.wrap(content)); + return this.userDataProvider.writeFile(path, content); } private toPath(resource: URI): string | undefined { From 461a7dc1bf2f757d67481a34ab78c97514cd0628 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 30 Jun 2019 21:24:08 +0200 Subject: [PATCH 0791/1449] remove adoption of user data file system provider --- .../windows/electron-main/windowsService.ts | 3 -- .../files/browser/fileActions.contribution.ts | 1 + .../electron-browser/main.contribution.ts | 14 ------ .../configuration/browser/configuration.ts | 49 ++----------------- .../browser/configurationService.ts | 2 +- .../environment/browser/environmentService.ts | 4 +- .../environment/node/environmentService.ts | 10 ---- 7 files changed, 9 insertions(+), 74 deletions(-) diff --git a/src/vs/platform/windows/electron-main/windowsService.ts b/src/vs/platform/windows/electron-main/windowsService.ts index 8a14f019d40..da1b56c7ee9 100644 --- a/src/vs/platform/windows/electron-main/windowsService.ts +++ b/src/vs/platform/windows/electron-main/windowsService.ts @@ -343,9 +343,6 @@ export class WindowsService extends Disposable implements IWindowsService, IURLH if (path.scheme === Schemas.file) { shell.showItemInFolder(path.fsPath); } - if (path.scheme === Schemas.userData) { - shell.showItemInFolder(path.path); - } } async getActiveWindowId(): Promise { diff --git a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts index 0502f67ed52..6ebb9b3e3fe 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts @@ -199,6 +199,7 @@ const copyRelativePathCommand = { // Editor Title Context Menu appendEditorTitleContextMenuItem(COPY_PATH_COMMAND_ID, copyPathCommand.title, ResourceContextKey.IsFileSystemResource, '1_cutcopypaste'); appendEditorTitleContextMenuItem(COPY_RELATIVE_PATH_COMMAND_ID, copyRelativePathCommand.title, ResourceContextKey.IsFileSystemResource, '1_cutcopypaste'); +appendEditorTitleContextMenuItem(REVEAL_IN_OS_COMMAND_ID, REVEAL_IN_OS_LABEL, ResourceContextKey.Scheme.isEqualTo(Schemas.file)); appendEditorTitleContextMenuItem(REVEAL_IN_EXPLORER_COMMAND_ID, nls.localize('revealInSideBar', "Reveal in Side Bar"), ResourceContextKey.IsFileSystemResource); function appendEditorTitleContextMenuItem(id: string, title: string, when: ContextKeyExpr, group?: string): void { diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index d2866eadc0e..9d2b119c091 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -26,9 +26,6 @@ import { NoEditorsVisibleContext, SingleEditorGroupsContext } from 'vs/workbench import { IWindowService, IWindowsService } from 'vs/platform/windows/common/windows'; import { LogStorageAction } from 'vs/platform/storage/node/storageService'; import product from 'vs/platform/product/node/product'; -import { REVEAL_IN_OS_COMMAND_ID, REVEAL_IN_OS_LABEL } from '../contrib/files/browser/fileCommands'; -import { ResourceContextKey } from 'vs/workbench/common/resources'; -import { Schemas } from 'vs/base/common/network'; // Actions (function registerActions(): void { @@ -63,17 +60,6 @@ import { Schemas } from 'vs/base/common/network'; primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_R, mac: { primary: KeyMod.WinCtrl | KeyMod.Shift | KeyCode.KEY_R } }); - - MenuRegistry.appendMenuItem(MenuId.EditorTitleContext, { - command: { id: REVEAL_IN_OS_COMMAND_ID, title: REVEAL_IN_OS_LABEL }, - when: ResourceContextKey.Scheme.isEqualTo(Schemas.file), - group: '2_files' - }); - MenuRegistry.appendMenuItem(MenuId.EditorTitleContext, { - command: { id: REVEAL_IN_OS_COMMAND_ID, title: REVEAL_IN_OS_LABEL }, - when: ResourceContextKey.Scheme.isEqualTo(Schemas.userData), - group: '2_files' - }); })(); // Actions: View diff --git a/src/vs/workbench/services/configuration/browser/configuration.ts b/src/vs/workbench/services/configuration/browser/configuration.ts index 515c6df2fe3..6fd5e062785 100644 --- a/src/vs/workbench/services/configuration/browser/configuration.ts +++ b/src/vs/workbench/services/configuration/browser/configuration.ts @@ -9,7 +9,7 @@ import { Event, Emitter } from 'vs/base/common/event'; import * as errors from 'vs/base/common/errors'; import { Disposable, IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; import { RunOnceScheduler } from 'vs/base/common/async'; -import { FileChangeType, FileChangesEvent, IFileService } from 'vs/platform/files/common/files'; +import { FileChangeType, FileChangesEvent } from 'vs/platform/files/common/files'; import { ConfigurationModel, ConfigurationModelParser } from 'vs/platform/configuration/common/configurationModels'; import { WorkspaceConfigurationModelParser, StandaloneConfigurationModelParser } from 'vs/workbench/services/configuration/common/configurationModels'; import { FOLDER_SETTINGS_PATH, TASKS_CONFIGURATION_KEY, FOLDER_SETTINGS_NAME, LAUNCH_CONFIGURATION_KEY, IConfigurationCache, ConfigurationKey, REMOTE_MACHINE_SCOPES, FOLDER_SCOPES, WORKSPACE_SCOPES, ConfigurationFileService } from 'vs/workbench/services/configuration/common/configuration'; @@ -24,50 +24,11 @@ import { IConfigurationModel } from 'vs/platform/configuration/common/configurat import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { hash } from 'vs/base/common/hash'; -export class UserConfiguration extends Disposable { - - private readonly parser: ConfigurationModelParser; - private readonly reloadConfigurationScheduler: RunOnceScheduler; - protected readonly _onDidChangeConfiguration: Emitter = this._register(new Emitter()); - readonly onDidChangeConfiguration: Event = this._onDidChangeConfiguration.event; - - constructor( - private readonly userSettingsResource: URI, - private readonly scopes: ConfigurationScope[] | undefined, - private readonly fileService: IFileService - ) { - super(); - - this.parser = new ConfigurationModelParser(this.userSettingsResource.toString(), this.scopes); - this.reloadConfigurationScheduler = this._register(new RunOnceScheduler(() => this.reload().then(configurationModel => this._onDidChangeConfiguration.fire(configurationModel)), 50)); - this._register(Event.filter(this.fileService.onFileChanges, e => e.contains(this.userSettingsResource))(() => this.reloadConfigurationScheduler.schedule())); - } - - async initialize(): Promise { - return this.reload(); - } - - async reload(): Promise { - try { - const content = await this.fileService.readFile(this.userSettingsResource); - this.parser.parseContent(content.value.toString() || '{}'); - return this.parser.configurationModel; - } catch (e) { - return new ConfigurationModel(); - } - } - - reprocess(): ConfigurationModel { - this.parser.parse(); - return this.parser.configurationModel; - } -} - export class RemoteUserConfiguration extends Disposable { private readonly _cachedConfiguration: CachedRemoteUserConfiguration; private readonly _configurationFileService: ConfigurationFileService; - private _userConfiguration: FileServiceBasedRemoteUserConfiguration | CachedRemoteUserConfiguration; + private _userConfiguration: UserConfiguration | CachedRemoteUserConfiguration; private _userConfigurationInitializationPromise: Promise | null = null; private readonly _onDidChangeConfiguration: Emitter = this._register(new Emitter()); @@ -84,7 +45,7 @@ export class RemoteUserConfiguration extends Disposable { this._userConfiguration = this._cachedConfiguration = new CachedRemoteUserConfiguration(remoteAuthority, configurationCache); remoteAgentService.getEnvironment().then(async environment => { if (environment) { - const userConfiguration = this._register(new FileServiceBasedRemoteUserConfiguration(environment.settingsPath, REMOTE_MACHINE_SCOPES, this._configurationFileService)); + const userConfiguration = this._register(new UserConfiguration(environment.settingsPath, REMOTE_MACHINE_SCOPES, this._configurationFileService)); this._register(userConfiguration.onDidChangeConfiguration(configurationModel => this.onDidUserConfigurationChange(configurationModel))); this._userConfigurationInitializationPromise = userConfiguration.initialize(); const configurationModel = await this._userConfigurationInitializationPromise; @@ -96,7 +57,7 @@ export class RemoteUserConfiguration extends Disposable { } async initialize(): Promise { - if (this._userConfiguration instanceof FileServiceBasedRemoteUserConfiguration) { + if (this._userConfiguration instanceof UserConfiguration) { return this._userConfiguration.initialize(); } @@ -129,7 +90,7 @@ export class RemoteUserConfiguration extends Disposable { } } -class FileServiceBasedRemoteUserConfiguration extends Disposable { +export class UserConfiguration extends Disposable { private readonly parser: ConfigurationModelParser; private readonly reloadConfigurationScheduler: RunOnceScheduler; diff --git a/src/vs/workbench/services/configuration/browser/configurationService.ts b/src/vs/workbench/services/configuration/browser/configurationService.ts index b2b2f3469f9..769c02a678d 100644 --- a/src/vs/workbench/services/configuration/browser/configurationService.ts +++ b/src/vs/workbench/services/configuration/browser/configurationService.ts @@ -81,7 +81,7 @@ export class WorkspaceService extends Disposable implements IConfigurationServic this.configurationFileService = new ConfigurationFileService(fileService); this._configuration = new Configuration(this.defaultConfiguration, new ConfigurationModel(), new ConfigurationModel(), new ConfigurationModel(), new ResourceMap(), new ConfigurationModel(), new ResourceMap(), this.workspace); this.cachedFolderConfigs = new ResourceMap(); - this.localUserConfiguration = this._register(new UserConfiguration(environmentService.settingsResource, remoteAuthority ? LOCAL_MACHINE_SCOPES : undefined, fileService)); + this.localUserConfiguration = this._register(new UserConfiguration(environmentService.settingsResource, remoteAuthority ? LOCAL_MACHINE_SCOPES : undefined, this.configurationFileService)); this._register(this.localUserConfiguration.onDidChangeConfiguration(userConfiguration => this.onLocalUserConfigurationChanged(userConfiguration))); if (remoteAuthority) { this.remoteUserConfiguration = this._register(new RemoteUserConfiguration(remoteAuthority, configurationCache, this.configurationFileService, remoteAgentService)); diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts index 95f1bbf6a30..e2578dd1a1b 100644 --- a/src/vs/workbench/services/environment/browser/environmentService.ts +++ b/src/vs/workbench/services/environment/browser/environmentService.ts @@ -72,8 +72,8 @@ export class BrowserWorkbenchEnvironmentService implements IEnvironmentService { if (remoteUserDataUri) { this.appSettingsHome = remoteUserDataUri || URI.file('/User').with({ scheme: Schemas.userData }); - this.settingsResource = joinPath(this.appSettingsHome, 'settings.json').with({ scheme: Schemas.userData }); - this.keybindingsResource = joinPath(this.appSettingsHome, 'keybindings.json').with({ scheme: Schemas.userData }); + this.settingsResource = joinPath(this.appSettingsHome, 'settings.json'); + this.keybindingsResource = joinPath(this.appSettingsHome, 'keybindings.json'); } else { const appSettingsHome = URI.file('/User').with({ scheme: Schemas.userData }); this.settingsResource = joinPath(appSettingsHome, 'settings.json'); diff --git a/src/vs/workbench/services/environment/node/environmentService.ts b/src/vs/workbench/services/environment/node/environmentService.ts index bb72c8785b8..db2a229c03b 100644 --- a/src/vs/workbench/services/environment/node/environmentService.ts +++ b/src/vs/workbench/services/environment/node/environmentService.ts @@ -6,10 +6,6 @@ import { EnvironmentService } from 'vs/platform/environment/node/environmentService'; import { IWindowConfiguration } from 'vs/platform/windows/common/windows'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { memoize } from 'vs/base/common/decorators'; -import { URI } from 'vs/base/common/uri'; -import { joinPath } from 'vs/base/common/resources'; -import { Schemas } from 'vs/base/common/network'; export class WorkbenchEnvironmentService extends EnvironmentService implements IWorkbenchEnvironmentService { @@ -25,10 +21,4 @@ export class WorkbenchEnvironmentService extends EnvironmentService implements I get configuration(): IWindowConfiguration { return this._configuration; } - - @memoize - get settingsResource(): URI { return joinPath(this.appSettingsHome, 'settings.json').with({ scheme: Schemas.userData }); } - - @memoize - get keybindingsResource(): URI { return joinPath(this.appSettingsHome, 'keybindings.json').with({ scheme: Schemas.userData }); } } From b5003959f733a19894883b9c2160dc780205374b Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 30 Jun 2019 22:10:47 +0200 Subject: [PATCH 0792/1449] Adopt to user data filesystem provider --- .../windows/electron-main/windowsService.ts | 3 ++ .../files/browser/fileActions.contribution.ts | 1 - .../electron-browser/main.contribution.ts | 14 ++++++ .../configuration/browser/configuration.ts | 49 +++++++++++++++++-- .../browser/configurationService.ts | 2 +- .../environment/browser/environmentService.ts | 4 +- .../environment/node/environmentService.ts | 10 ++++ 7 files changed, 74 insertions(+), 9 deletions(-) diff --git a/src/vs/platform/windows/electron-main/windowsService.ts b/src/vs/platform/windows/electron-main/windowsService.ts index da1b56c7ee9..8a14f019d40 100644 --- a/src/vs/platform/windows/electron-main/windowsService.ts +++ b/src/vs/platform/windows/electron-main/windowsService.ts @@ -343,6 +343,9 @@ export class WindowsService extends Disposable implements IWindowsService, IURLH if (path.scheme === Schemas.file) { shell.showItemInFolder(path.fsPath); } + if (path.scheme === Schemas.userData) { + shell.showItemInFolder(path.path); + } } async getActiveWindowId(): Promise { diff --git a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts index 6ebb9b3e3fe..0502f67ed52 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts @@ -199,7 +199,6 @@ const copyRelativePathCommand = { // Editor Title Context Menu appendEditorTitleContextMenuItem(COPY_PATH_COMMAND_ID, copyPathCommand.title, ResourceContextKey.IsFileSystemResource, '1_cutcopypaste'); appendEditorTitleContextMenuItem(COPY_RELATIVE_PATH_COMMAND_ID, copyRelativePathCommand.title, ResourceContextKey.IsFileSystemResource, '1_cutcopypaste'); -appendEditorTitleContextMenuItem(REVEAL_IN_OS_COMMAND_ID, REVEAL_IN_OS_LABEL, ResourceContextKey.Scheme.isEqualTo(Schemas.file)); appendEditorTitleContextMenuItem(REVEAL_IN_EXPLORER_COMMAND_ID, nls.localize('revealInSideBar', "Reveal in Side Bar"), ResourceContextKey.IsFileSystemResource); function appendEditorTitleContextMenuItem(id: string, title: string, when: ContextKeyExpr, group?: string): void { diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index 9d2b119c091..d2866eadc0e 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -26,6 +26,9 @@ import { NoEditorsVisibleContext, SingleEditorGroupsContext } from 'vs/workbench import { IWindowService, IWindowsService } from 'vs/platform/windows/common/windows'; import { LogStorageAction } from 'vs/platform/storage/node/storageService'; import product from 'vs/platform/product/node/product'; +import { REVEAL_IN_OS_COMMAND_ID, REVEAL_IN_OS_LABEL } from '../contrib/files/browser/fileCommands'; +import { ResourceContextKey } from 'vs/workbench/common/resources'; +import { Schemas } from 'vs/base/common/network'; // Actions (function registerActions(): void { @@ -60,6 +63,17 @@ import product from 'vs/platform/product/node/product'; primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_R, mac: { primary: KeyMod.WinCtrl | KeyMod.Shift | KeyCode.KEY_R } }); + + MenuRegistry.appendMenuItem(MenuId.EditorTitleContext, { + command: { id: REVEAL_IN_OS_COMMAND_ID, title: REVEAL_IN_OS_LABEL }, + when: ResourceContextKey.Scheme.isEqualTo(Schemas.file), + group: '2_files' + }); + MenuRegistry.appendMenuItem(MenuId.EditorTitleContext, { + command: { id: REVEAL_IN_OS_COMMAND_ID, title: REVEAL_IN_OS_LABEL }, + when: ResourceContextKey.Scheme.isEqualTo(Schemas.userData), + group: '2_files' + }); })(); // Actions: View diff --git a/src/vs/workbench/services/configuration/browser/configuration.ts b/src/vs/workbench/services/configuration/browser/configuration.ts index 6fd5e062785..515c6df2fe3 100644 --- a/src/vs/workbench/services/configuration/browser/configuration.ts +++ b/src/vs/workbench/services/configuration/browser/configuration.ts @@ -9,7 +9,7 @@ import { Event, Emitter } from 'vs/base/common/event'; import * as errors from 'vs/base/common/errors'; import { Disposable, IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; import { RunOnceScheduler } from 'vs/base/common/async'; -import { FileChangeType, FileChangesEvent } from 'vs/platform/files/common/files'; +import { FileChangeType, FileChangesEvent, IFileService } from 'vs/platform/files/common/files'; import { ConfigurationModel, ConfigurationModelParser } from 'vs/platform/configuration/common/configurationModels'; import { WorkspaceConfigurationModelParser, StandaloneConfigurationModelParser } from 'vs/workbench/services/configuration/common/configurationModels'; import { FOLDER_SETTINGS_PATH, TASKS_CONFIGURATION_KEY, FOLDER_SETTINGS_NAME, LAUNCH_CONFIGURATION_KEY, IConfigurationCache, ConfigurationKey, REMOTE_MACHINE_SCOPES, FOLDER_SCOPES, WORKSPACE_SCOPES, ConfigurationFileService } from 'vs/workbench/services/configuration/common/configuration'; @@ -24,11 +24,50 @@ import { IConfigurationModel } from 'vs/platform/configuration/common/configurat import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { hash } from 'vs/base/common/hash'; +export class UserConfiguration extends Disposable { + + private readonly parser: ConfigurationModelParser; + private readonly reloadConfigurationScheduler: RunOnceScheduler; + protected readonly _onDidChangeConfiguration: Emitter = this._register(new Emitter()); + readonly onDidChangeConfiguration: Event = this._onDidChangeConfiguration.event; + + constructor( + private readonly userSettingsResource: URI, + private readonly scopes: ConfigurationScope[] | undefined, + private readonly fileService: IFileService + ) { + super(); + + this.parser = new ConfigurationModelParser(this.userSettingsResource.toString(), this.scopes); + this.reloadConfigurationScheduler = this._register(new RunOnceScheduler(() => this.reload().then(configurationModel => this._onDidChangeConfiguration.fire(configurationModel)), 50)); + this._register(Event.filter(this.fileService.onFileChanges, e => e.contains(this.userSettingsResource))(() => this.reloadConfigurationScheduler.schedule())); + } + + async initialize(): Promise { + return this.reload(); + } + + async reload(): Promise { + try { + const content = await this.fileService.readFile(this.userSettingsResource); + this.parser.parseContent(content.value.toString() || '{}'); + return this.parser.configurationModel; + } catch (e) { + return new ConfigurationModel(); + } + } + + reprocess(): ConfigurationModel { + this.parser.parse(); + return this.parser.configurationModel; + } +} + export class RemoteUserConfiguration extends Disposable { private readonly _cachedConfiguration: CachedRemoteUserConfiguration; private readonly _configurationFileService: ConfigurationFileService; - private _userConfiguration: UserConfiguration | CachedRemoteUserConfiguration; + private _userConfiguration: FileServiceBasedRemoteUserConfiguration | CachedRemoteUserConfiguration; private _userConfigurationInitializationPromise: Promise | null = null; private readonly _onDidChangeConfiguration: Emitter = this._register(new Emitter()); @@ -45,7 +84,7 @@ export class RemoteUserConfiguration extends Disposable { this._userConfiguration = this._cachedConfiguration = new CachedRemoteUserConfiguration(remoteAuthority, configurationCache); remoteAgentService.getEnvironment().then(async environment => { if (environment) { - const userConfiguration = this._register(new UserConfiguration(environment.settingsPath, REMOTE_MACHINE_SCOPES, this._configurationFileService)); + const userConfiguration = this._register(new FileServiceBasedRemoteUserConfiguration(environment.settingsPath, REMOTE_MACHINE_SCOPES, this._configurationFileService)); this._register(userConfiguration.onDidChangeConfiguration(configurationModel => this.onDidUserConfigurationChange(configurationModel))); this._userConfigurationInitializationPromise = userConfiguration.initialize(); const configurationModel = await this._userConfigurationInitializationPromise; @@ -57,7 +96,7 @@ export class RemoteUserConfiguration extends Disposable { } async initialize(): Promise { - if (this._userConfiguration instanceof UserConfiguration) { + if (this._userConfiguration instanceof FileServiceBasedRemoteUserConfiguration) { return this._userConfiguration.initialize(); } @@ -90,7 +129,7 @@ export class RemoteUserConfiguration extends Disposable { } } -export class UserConfiguration extends Disposable { +class FileServiceBasedRemoteUserConfiguration extends Disposable { private readonly parser: ConfigurationModelParser; private readonly reloadConfigurationScheduler: RunOnceScheduler; diff --git a/src/vs/workbench/services/configuration/browser/configurationService.ts b/src/vs/workbench/services/configuration/browser/configurationService.ts index 769c02a678d..b2b2f3469f9 100644 --- a/src/vs/workbench/services/configuration/browser/configurationService.ts +++ b/src/vs/workbench/services/configuration/browser/configurationService.ts @@ -81,7 +81,7 @@ export class WorkspaceService extends Disposable implements IConfigurationServic this.configurationFileService = new ConfigurationFileService(fileService); this._configuration = new Configuration(this.defaultConfiguration, new ConfigurationModel(), new ConfigurationModel(), new ConfigurationModel(), new ResourceMap(), new ConfigurationModel(), new ResourceMap(), this.workspace); this.cachedFolderConfigs = new ResourceMap(); - this.localUserConfiguration = this._register(new UserConfiguration(environmentService.settingsResource, remoteAuthority ? LOCAL_MACHINE_SCOPES : undefined, this.configurationFileService)); + this.localUserConfiguration = this._register(new UserConfiguration(environmentService.settingsResource, remoteAuthority ? LOCAL_MACHINE_SCOPES : undefined, fileService)); this._register(this.localUserConfiguration.onDidChangeConfiguration(userConfiguration => this.onLocalUserConfigurationChanged(userConfiguration))); if (remoteAuthority) { this.remoteUserConfiguration = this._register(new RemoteUserConfiguration(remoteAuthority, configurationCache, this.configurationFileService, remoteAgentService)); diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts index e2578dd1a1b..95f1bbf6a30 100644 --- a/src/vs/workbench/services/environment/browser/environmentService.ts +++ b/src/vs/workbench/services/environment/browser/environmentService.ts @@ -72,8 +72,8 @@ export class BrowserWorkbenchEnvironmentService implements IEnvironmentService { if (remoteUserDataUri) { this.appSettingsHome = remoteUserDataUri || URI.file('/User').with({ scheme: Schemas.userData }); - this.settingsResource = joinPath(this.appSettingsHome, 'settings.json'); - this.keybindingsResource = joinPath(this.appSettingsHome, 'keybindings.json'); + this.settingsResource = joinPath(this.appSettingsHome, 'settings.json').with({ scheme: Schemas.userData }); + this.keybindingsResource = joinPath(this.appSettingsHome, 'keybindings.json').with({ scheme: Schemas.userData }); } else { const appSettingsHome = URI.file('/User').with({ scheme: Schemas.userData }); this.settingsResource = joinPath(appSettingsHome, 'settings.json'); diff --git a/src/vs/workbench/services/environment/node/environmentService.ts b/src/vs/workbench/services/environment/node/environmentService.ts index db2a229c03b..bb72c8785b8 100644 --- a/src/vs/workbench/services/environment/node/environmentService.ts +++ b/src/vs/workbench/services/environment/node/environmentService.ts @@ -6,6 +6,10 @@ import { EnvironmentService } from 'vs/platform/environment/node/environmentService'; import { IWindowConfiguration } from 'vs/platform/windows/common/windows'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { memoize } from 'vs/base/common/decorators'; +import { URI } from 'vs/base/common/uri'; +import { joinPath } from 'vs/base/common/resources'; +import { Schemas } from 'vs/base/common/network'; export class WorkbenchEnvironmentService extends EnvironmentService implements IWorkbenchEnvironmentService { @@ -21,4 +25,10 @@ export class WorkbenchEnvironmentService extends EnvironmentService implements I get configuration(): IWindowConfiguration { return this._configuration; } + + @memoize + get settingsResource(): URI { return joinPath(this.appSettingsHome, 'settings.json').with({ scheme: Schemas.userData }); } + + @memoize + get keybindingsResource(): URI { return joinPath(this.appSettingsHome, 'keybindings.json').with({ scheme: Schemas.userData }); } } From f2b5df153e0384c1453743b391990ed2f6f61073 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 30 Jun 2019 22:22:43 +0200 Subject: [PATCH 0793/1449] adopt keybindings to user data filesystem provider --- .../keybinding/browser/keybindingService.ts | 74 ++----------------- 1 file changed, 7 insertions(+), 67 deletions(-) diff --git a/src/vs/workbench/services/keybinding/browser/keybindingService.ts b/src/vs/workbench/services/keybinding/browser/keybindingService.ts index fcd949b0b05..dca2de28a5d 100644 --- a/src/vs/workbench/services/keybinding/browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/browser/keybindingService.ts @@ -36,11 +36,10 @@ import { MenuRegistry } from 'vs/platform/actions/common/actions'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; // tslint:disable-next-line: import-patterns import { commandsExtensionPoint } from 'vs/workbench/api/common/menusExtensionPoint'; -import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable } from 'vs/base/common/lifecycle'; import { RunOnceScheduler } from 'vs/base/common/async'; import { URI } from 'vs/base/common/uri'; -import { IFileService, FileChangesEvent, FileChangeType } from 'vs/platform/files/common/files'; -import { dirname, isEqual } from 'vs/base/common/resources'; +import { IFileService } from 'vs/platform/files/common/files'; import { parse } from 'vs/base/common/json'; import * as objects from 'vs/base/common/objects'; import { IKeymapService } from 'vs/workbench/services/keybinding/common/keymapInfo'; @@ -560,12 +559,11 @@ class UserKeybindings extends Disposable { private _keybindings: IUserFriendlyKeybinding[] = []; get keybindings(): IUserFriendlyKeybinding[] { return this._keybindings; } - private readonly reloadConfigurationScheduler: RunOnceScheduler; - protected readonly _onDidChange: Emitter = this._register(new Emitter()); - readonly onDidChange: Event = this._onDidChange.event; - private fileWatcherDisposable: IDisposable = Disposable.None; - private directoryWatcherDisposable: IDisposable = Disposable.None; + private readonly reloadConfigurationScheduler: RunOnceScheduler; + + private readonly _onDidChange: Emitter = this._register(new Emitter()); + readonly onDidChange: Event = this._onDidChange.event; constructor( private readonly keybindingsResource: URI, @@ -573,40 +571,15 @@ class UserKeybindings extends Disposable { ) { super(); - this._register(fileService.onFileChanges(e => this.handleFileEvents(e))); this.reloadConfigurationScheduler = this._register(new RunOnceScheduler(() => this.reload().then(changed => { if (changed) { this._onDidChange.fire(); } }), 50)); - this._register(toDisposable(() => { - this.stopWatchingResource(); - this.stopWatchingDirectory(); - })); - } - - private watchResource(): void { - this.fileWatcherDisposable = this.fileService.watch(this.keybindingsResource); - } - - private stopWatchingResource(): void { - this.fileWatcherDisposable.dispose(); - this.fileWatcherDisposable = Disposable.None; - } - - private watchDirectory(): void { - const directory = dirname(this.keybindingsResource); - this.directoryWatcherDisposable = this.fileService.watch(directory); - } - - private stopWatchingDirectory(): void { - this.directoryWatcherDisposable.dispose(); - this.directoryWatcherDisposable = Disposable.None; + this._register(Event.filter(this.fileService.onFileChanges, e => e.contains(this.keybindingsResource))(() => this.reloadConfigurationScheduler.schedule())); } async initialize(): Promise { - const exists = await this.fileService.exists(this.keybindingsResource); - this.onResourceExists(exists); await this.reload(); } @@ -621,39 +594,6 @@ class UserKeybindings extends Disposable { } return existing ? !objects.equals(existing, this._keybindings) : true; } - - private async handleFileEvents(event: FileChangesEvent): Promise { - const events = event.changes; - - let affectedByChanges = false; - - // Find changes that affect the resource - for (const event of events) { - affectedByChanges = isEqual(this.keybindingsResource, event.resource); - if (affectedByChanges) { - if (event.type === FileChangeType.ADDED) { - this.onResourceExists(true); - } else if (event.type === FileChangeType.DELETED) { - this.onResourceExists(false); - } - break; - } - } - - if (affectedByChanges) { - this.reloadConfigurationScheduler.schedule(); - } - } - - private onResourceExists(exists: boolean): void { - if (exists) { - this.stopWatchingDirectory(); - this.watchResource(); - } else { - this.stopWatchingResource(); - this.watchDirectory(); - } - } } let schemaId = 'vscode://schemas/keybindings'; From 3395f8f08de1d4c8071c6a3f5f74af3d060f35e9 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 30 Jun 2019 23:28:16 +0200 Subject: [PATCH 0794/1449] fix tests --- .../configurationEditingService.test.ts | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) 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 d2cbcc44cdb..6f187eaaa36 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 @@ -127,7 +127,10 @@ suite('ConfigurationEditingService', () => { teardown(() => { clearServices(); - return clearWorkspace(); + if (workspaceDir) { + return rimraf(workspaceDir, RimRafMode.MOVE); + } + return undefined; }); function clearServices(): void { @@ -140,16 +143,6 @@ suite('ConfigurationEditingService', () => { } } - function clearWorkspace(): Promise { - return new Promise((c, e) => { - if (parentDir) { - rimraf(parentDir, RimRafMode.MOVE).then(c, c); - } else { - c(undefined); - } - }).then(() => parentDir = null!); - } - test('errors cases - invalid key', () => { return testObject.writeConfiguration(EditableConfigurationTarget.WORKSPACE, { key: 'unknown.key', value: 'value' }) .then(() => assert.fail('Should fail with ERROR_UNKNOWN_KEY'), From 3e2d5e5b944b198edc6ed20613e404883f3c098f Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 1 Jul 2019 02:21:21 +0200 Subject: [PATCH 0795/1449] watch the resource --- src/vs/workbench/services/configuration/browser/configuration.ts | 1 + .../workbench/services/keybinding/browser/keybindingService.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/vs/workbench/services/configuration/browser/configuration.ts b/src/vs/workbench/services/configuration/browser/configuration.ts index 515c6df2fe3..6c125ff67f6 100644 --- a/src/vs/workbench/services/configuration/browser/configuration.ts +++ b/src/vs/workbench/services/configuration/browser/configuration.ts @@ -40,6 +40,7 @@ export class UserConfiguration extends Disposable { this.parser = new ConfigurationModelParser(this.userSettingsResource.toString(), this.scopes); this.reloadConfigurationScheduler = this._register(new RunOnceScheduler(() => this.reload().then(configurationModel => this._onDidChangeConfiguration.fire(configurationModel)), 50)); + this._register(this.fileService.watch(this.userSettingsResource)); this._register(Event.filter(this.fileService.onFileChanges, e => e.contains(this.userSettingsResource))(() => this.reloadConfigurationScheduler.schedule())); } diff --git a/src/vs/workbench/services/keybinding/browser/keybindingService.ts b/src/vs/workbench/services/keybinding/browser/keybindingService.ts index dca2de28a5d..60509939c87 100644 --- a/src/vs/workbench/services/keybinding/browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/browser/keybindingService.ts @@ -576,6 +576,7 @@ class UserKeybindings extends Disposable { this._onDidChange.fire(); } }), 50)); + this._register(this.fileService.watch(this.keybindingsResource)); this._register(Event.filter(this.fileService.onFileChanges, e => e.contains(this.keybindingsResource))(() => this.reloadConfigurationScheduler.schedule())); } From 489837096d1e23b10fc1a6067fe8538c37bb1263 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Sun, 30 Jun 2019 20:37:32 -0700 Subject: [PATCH 0796/1449] Remove shadow from folder icons --- .../files/browser/media/add-folder-dark.svg | 18 ------------------ .../files/browser/media/add-folder-hc.svg | 18 ------------------ .../files/browser/media/add-folder-light.svg | 18 ------------------ 3 files changed, 54 deletions(-) diff --git a/src/vs/workbench/contrib/files/browser/media/add-folder-dark.svg b/src/vs/workbench/contrib/files/browser/media/add-folder-dark.svg index b1a959cf637..2a8d206bcfc 100644 --- a/src/vs/workbench/contrib/files/browser/media/add-folder-dark.svg +++ b/src/vs/workbench/contrib/files/browser/media/add-folder-dark.svg @@ -1,21 +1,3 @@ - - - - - - - - - - - - - - - - - - diff --git a/src/vs/workbench/contrib/files/browser/media/add-folder-hc.svg b/src/vs/workbench/contrib/files/browser/media/add-folder-hc.svg index 24036cfb09c..d247ff54002 100644 --- a/src/vs/workbench/contrib/files/browser/media/add-folder-hc.svg +++ b/src/vs/workbench/contrib/files/browser/media/add-folder-hc.svg @@ -1,21 +1,3 @@ - - - - - - - - - - - - - - - - - - diff --git a/src/vs/workbench/contrib/files/browser/media/add-folder-light.svg b/src/vs/workbench/contrib/files/browser/media/add-folder-light.svg index ed99ce33a7f..d5e85ce9d0f 100644 --- a/src/vs/workbench/contrib/files/browser/media/add-folder-light.svg +++ b/src/vs/workbench/contrib/files/browser/media/add-folder-light.svg @@ -1,21 +1,3 @@ - - - - - - - - - - - - - - - - - - From a08e8e02529d56a289fbcb289d3b6bb10a89141f Mon Sep 17 00:00:00 2001 From: pkoushik Date: Mon, 1 Jul 2019 11:15:11 +0530 Subject: [PATCH 0797/1449] Added border for image --- src/vs/workbench/browser/parts/editor/media/resourceviewer.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/browser/parts/editor/media/resourceviewer.css b/src/vs/workbench/browser/parts/editor/media/resourceviewer.css index b6f7b107db7..1878d4f8f9c 100644 --- a/src/vs/workbench/browser/parts/editor/media/resourceviewer.css +++ b/src/vs/workbench/browser/parts/editor/media/resourceviewer.css @@ -22,6 +22,7 @@ padding: 0; background-position: 0 0, 8px 8px; background-size: 16px 16px; + border: 1px solid; } .vs .monaco-resource-viewer.image img { From 021b5ab7532399272334e40d5783962e70bfa71a Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 1 Jul 2019 08:07:39 +0200 Subject: [PATCH 0798/1449] web api docs --- .../services/userData/common/userData.ts | 47 +++++++++++++++++++ src/vs/workbench/workbench.web.api.ts | 4 ++ 2 files changed, 51 insertions(+) diff --git a/src/vs/workbench/services/userData/common/userData.ts b/src/vs/workbench/services/userData/common/userData.ts index de051b0ec5d..dc448d2c9c5 100644 --- a/src/vs/workbench/services/userData/common/userData.ts +++ b/src/vs/workbench/services/userData/common/userData.ts @@ -5,13 +5,60 @@ import { Event } from 'vs/base/common/event'; +/** + * The userDataProvider is used to handle user specific application + * state like settings, keybindings, UI state (e.g. opened editors) and snippets. + * + * The API reflects a simple file system provider that comes with the notion of paths + * (UNIX slash separated) as well as files. Folders are not a top level concept (e.g. we + * do not require to create or delete them), however, files can be grouped beneath one path + * and also listed from that path. + * + * Example: + * ```ts + * await writeFile('snippets/global/markdown.json', ); + * await writeFile('snippets/global/html.json', ); + * await writeFile('snippets/global/javascript.json', ); + * + * const files = await listFiles('snippets/global'); + * console.log(files); // -> ['snippets/global/markdown.json', 'snippets/global/html.json', 'snippets/global/javascript.json'] + * ``` + */ export interface IUserDataProvider { + /** + * Emitted when one ore more files are added, changed or deleted. The event provides + * an array of paths of these files. + */ readonly onDidChangeFile: Event; + /** + * Read the file contents of the given path. + * + * Throw an error if the path does not exist. + */ readFile(path: string): Promise; + + /** + * Writes the provided content to the file path overwriting any existing content on that path. + * + * If the path does not exist, it will be created. + * + * Throw an error if the path is a parent to existing files. + */ writeFile(path: string, content: Uint8Array): Promise; + + /** + * Delete the file at the given path. + * + * Does NOT throw an error when the path does not exist. + */ deleteFile(path: string): Promise; + /** + * Returns an array of files at the given path. + * + * Throw an error if the path does not exist or points to a file. + */ listFiles(path: string): Promise; } \ No newline at end of file diff --git a/src/vs/workbench/workbench.web.api.ts b/src/vs/workbench/workbench.web.api.ts index 4c09e78e7c3..cfaa8103f76 100644 --- a/src/vs/workbench/workbench.web.api.ts +++ b/src/vs/workbench/workbench.web.api.ts @@ -32,6 +32,10 @@ export interface IWorkbenchConstructionOptions { */ workspaceUri?: UriComponents; + /** + * Experimental: The userDataProvider is used to handle user specific application + * state like settings, keybindings, UI state (e.g. opened editors) and snippets. + */ userDataProvider?: IUserDataProvider; } From 7b4cf38e93a5008400f638c4f2455f8c0dcc20bb Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 1 Jul 2019 08:10:18 +0200 Subject: [PATCH 0799/1449] electron 4 - unprefix grabbing cursor --- src/vs/base/browser/ui/list/list.css | 4 ++-- src/vs/editor/contrib/colorPicker/colorPicker.css | 6 +++--- .../workbench/browser/parts/editor/media/titlecontrol.css | 2 +- .../workbench/contrib/debug/browser/media/debugToolBar.css | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/vs/base/browser/ui/list/list.css b/src/vs/base/browser/ui/list/list.css index 73756ce7811..3aa2e653473 100644 --- a/src/vs/base/browser/ui/list/list.css +++ b/src/vs/base/browser/ui/list/list.css @@ -186,9 +186,9 @@ /* Electron */ .monaco-list-type-filter { - cursor: -webkit-grab; + cursor: grab; } .monaco-list-type-filter.dragging { - cursor: -webkit-grabbing; + cursor: grabbing; } \ No newline at end of file diff --git a/src/vs/editor/contrib/colorPicker/colorPicker.css b/src/vs/editor/contrib/colorPicker/colorPicker.css index b1978528c95..d1d83d46b2b 100644 --- a/src/vs/editor/contrib/colorPicker/colorPicker.css +++ b/src/vs/editor/contrib/colorPicker/colorPicker.css @@ -84,21 +84,21 @@ .colorpicker-body .hue-strip { position: relative; margin-left: 8px; - cursor: -webkit-grab; + cursor: grab; background: linear-gradient(to bottom, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); } .colorpicker-body .opacity-strip { position: relative; margin-left: 8px; - cursor: -webkit-grab; + cursor: grab; background: url('images/opacity-background.png'); background-size: 9px 9px; image-rendering: pixelated; } .colorpicker-body .strip.grabbing { - cursor: -webkit-grabbing; + cursor: grabbing; } .colorpicker-body .slider { diff --git a/src/vs/workbench/browser/parts/editor/media/titlecontrol.css b/src/vs/workbench/browser/parts/editor/media/titlecontrol.css index 42358c52102..2743a22de5b 100644 --- a/src/vs/workbench/browser/parts/editor/media/titlecontrol.css +++ b/src/vs/workbench/browser/parts/editor/media/titlecontrol.css @@ -51,7 +51,7 @@ /* Drag Cursor */ .monaco-workbench .part.editor > .content .editor-group-container > .title { - cursor: -webkit-grab; + cursor: grab; } /* Actions */ diff --git a/src/vs/workbench/contrib/debug/browser/media/debugToolBar.css b/src/vs/workbench/contrib/debug/browser/media/debugToolBar.css index 6753676e943..57ea84f3421 100644 --- a/src/vs/workbench/contrib/debug/browser/media/debugToolBar.css +++ b/src/vs/workbench/contrib/debug/browser/media/debugToolBar.css @@ -20,7 +20,7 @@ } .monaco-workbench .debug-toolbar .drag-area { - cursor: -webkit-grab; + cursor: grab; height: 32px; width: 16px; background: url('drag.svg') center center no-repeat; @@ -28,7 +28,7 @@ } .monaco-workbench .debug-toolbar .drag-area.dragged { - cursor: -webkit-grabbing; + cursor: grabbing; } .monaco-workbench .debug-toolbar .monaco-action-bar .action-item > .action-label { From 00acc08e0d7a3c1bed48a51b96eff010e84c049d Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 1 Jul 2019 08:11:15 +0200 Subject: [PATCH 0800/1449] electron 4 - add and use readdirWithFileTypes() --- src/vs/base/node/pfs.ts | 20 +++++++++++++++++--- src/vs/base/test/node/pfs/pfs.test.ts | 18 ++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/vs/base/node/pfs.ts b/src/vs/base/node/pfs.ts index 14dca3d5f49..7d4577e1168 100644 --- a/src/vs/base/node/pfs.ts +++ b/src/vs/base/node/pfs.ts @@ -138,6 +138,20 @@ export async function readdir(path: string): Promise { return handleDirectoryChildren(await promisify(fs.readdir)(path)); } +export async function readdirWithFileTypes(path: string): Promise { + const children = await promisify(fs.readdir)(path, { withFileTypes: true }); + + // Mac: uses NFD unicode form on disk, but we want NFC + // See also https://github.com/nodejs/node/issues/2165 + if (platform.isMacintosh) { + for (const child of children) { + child.name = normalizeNFC(child.name); + } + } + + return children; +} + export function readdirSync(path: string): string[] { return handleDirectoryChildren(fs.readdirSync(path)); } @@ -465,12 +479,12 @@ function ensureWriteOptions(options?: IWriteFileOptions): IEnsuredWriteFileOptio } export async function readDirsInDir(dirPath: string): Promise { - const children = await readdir(dirPath); + const children = await readdirWithFileTypes(dirPath); const directories: string[] = []; for (const child of children) { - if (await dirExists(join(dirPath, child))) { - directories.push(child); + if (child.isDirectory()) { + directories.push(child.name); } } diff --git a/src/vs/base/test/node/pfs/pfs.test.ts b/src/vs/base/test/node/pfs/pfs.test.ts index 4f09ad2b56d..33b10c5dc34 100644 --- a/src/vs/base/test/node/pfs/pfs.test.ts +++ b/src/vs/base/test/node/pfs/pfs.test.ts @@ -386,6 +386,24 @@ suite('PFS', () => { } }); + test('readdirWithFileTypes', async () => { + if (canNormalize && typeof process.versions['electron'] !== 'undefined' /* needs electron */) { + const id = uuid.generateUuid(); + const parentDir = path.join(os.tmpdir(), 'vsctests', id); + const newDir = path.join(parentDir, 'pfs', id, 'öäü'); + + await pfs.mkdirp(newDir, 493); + + assert.ok(fs.existsSync(newDir)); + + const children = await pfs.readdirWithFileTypes(path.join(parentDir, 'pfs', id)); + assert.equal(children.some(n => n.name === 'öäü'), true); // Mac always converts to NFD, so + assert.equal(children.some(n => n.isDirectory()), true); + + await pfs.rimraf(parentDir); + } + }); + test('writeFile (string)', async () => { const smallData = 'Hello World'; const bigData = (new Array(100 * 1024)).join('Large String\n'); From be083391803ae7f78242af45b63ee500a4396615 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 1 Jul 2019 08:11:58 +0200 Subject: [PATCH 0801/1449] electron 4 - do more remote filtering --- src/vs/code/electron-main/app.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index e9afa5d4ae6..535f64b8d7c 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -135,8 +135,16 @@ export class CodeApplication extends Disposable { }); // Security related measures (https://electronjs.org/docs/tutorial/security) - // DO NOT CHANGE without consulting the documentation - app.on('web-contents-created', (event: Electron.Event, contents) => { + // + // !!! DO NOT CHANGE without consulting the documentation !!! + // + app.on('remote-require', event => event.preventDefault()); + app.on('remote-get-global', event => event.preventDefault()); + app.on('remote-get-builtin', event => event.preventDefault()); + app.on('remote-get-current-window', event => event.preventDefault()); + app.on('remote-get-current-web-contents', event => event.preventDefault()); + // app.on('remote-get-guest-web-contents', event => event.preventDefault()); // TODO@Ben TODO@Matt revisit this need for + app.on('web-contents-created', (_event: Electron.Event, contents) => { contents.on('will-attach-webview', (event: Electron.Event, webPreferences, params) => { const isValidWebviewSource = (source: string): boolean => { From 32f9f9ce92545c20b1509ce9fdf606c1881c8bed Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 1 Jul 2019 08:12:31 +0200 Subject: [PATCH 0802/1449] debt - same about dialog on macOS in menu --- src/vs/platform/menubar/electron-main/menubar.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/vs/platform/menubar/electron-main/menubar.ts b/src/vs/platform/menubar/electron-main/menubar.ts index c08f351e452..494cfa000d5 100644 --- a/src/vs/platform/menubar/electron-main/menubar.ts +++ b/src/vs/platform/menubar/electron-main/menubar.ts @@ -106,6 +106,7 @@ export class Menubar { } private addFallbackHandlers(): void { + // File Menu Items this.fallbackMenuHandlers['workbench.action.files.newUntitledFile'] = () => this.windowsMainService.openNewWindow(OpenContext.MENU); this.fallbackMenuHandlers['workbench.action.newWindow'] = () => this.windowsMainService.openNewWindow(OpenContext.MENU); @@ -339,7 +340,7 @@ export class Menubar { } private setMacApplicationMenu(macApplicationMenu: Electron.Menu): void { - const about = new MenuItem({ label: nls.localize('mAbout', "About {0}", product.nameLong), role: 'about' }); + const about = this.createMenuItem(nls.localize('mAbout', "About {0}", product.nameLong), 'workbench.action.showAboutDialog'); const checkForUpdates = this.getUpdateMenuItems(); let preferences; @@ -634,8 +635,8 @@ export class Menubar { }; if (checked) { - options['type'] = 'checkbox'; - options['checked'] = checked; + options.type = 'checkbox'; + options.checked = checked; } let commandId: string | undefined; @@ -646,13 +647,14 @@ export class Menubar { } if (isMacintosh) { + // Add role for special case menu items if (commandId === 'editor.action.clipboardCutAction') { - options['role'] = 'cut'; + options.role = 'cut'; } else if (commandId === 'editor.action.clipboardCopyAction') { - options['role'] = 'copy'; + options.role = 'copy'; } else if (commandId === 'editor.action.clipboardPasteAction') { - options['role'] = 'paste'; + options.role = 'paste'; } // Add context aware click handlers for special case menu items From 0601c25ed415439eed5e895a1e8c8d9d2a17abbd Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 1 Jul 2019 08:13:23 +0200 Subject: [PATCH 0803/1449] electron 4 - persist normal bounds if window maximized (fix #422) --- src/vs/code/electron-main/window.ts | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index 885ecc6d4c3..e791fc73a9d 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -688,7 +688,12 @@ export class CodeWindow extends Disposable implements ICodeWindow { // only consider non-minimized window states if (mode === WindowMode.Normal || mode === WindowMode.Maximized) { - const bounds = this.getBounds(); + let bounds: Electron.Rectangle; + if (mode === WindowMode.Normal) { + bounds = this.getBounds(); + } else { + bounds = this._win.getNormalBounds(); // make sure to persist the normal bounds when maximized to be able to restore them + } state.x = bounds.x; state.y = bounds.y; @@ -731,7 +736,7 @@ export class CodeWindow extends Disposable implements ICodeWindow { // Single Monitor: be strict about x/y positioning if (displays.length === 1) { const displayWorkingArea = this.getWorkingArea(displays[0]); - if (state.mode !== WindowMode.Maximized && displayWorkingArea) { + if (displayWorkingArea) { if (state.x < displayWorkingArea.x) { state.x = displayWorkingArea.x; // prevent window from falling out of the screen to the left } @@ -757,10 +762,6 @@ export class CodeWindow extends Disposable implements ICodeWindow { } } - if (state.mode === WindowMode.Maximized) { - return defaultWindowState(WindowMode.Maximized); // when maximized, make sure we have good values when the user restores the window - } - return state; } @@ -788,14 +789,6 @@ export class CodeWindow extends Disposable implements ICodeWindow { bounds.x + bounds.width > displayWorkingArea.x && // prevent window from falling out of the screen to the left bounds.y + bounds.height > displayWorkingArea.y // prevent window from falling out of the scree nto the top ) { - if (state.mode === WindowMode.Maximized) { - const defaults = defaultWindowState(WindowMode.Maximized); // when maximized, make sure we have good values when the user restores the window - defaults.x = state.x; // carefull to keep x/y position so that the window ends up on the correct monitor - defaults.y = state.y; - - return defaults; - } - return state; } @@ -869,7 +862,7 @@ export class CodeWindow extends Disposable implements ICodeWindow { } private useNativeFullScreen(): boolean { - return true; + return true; // TODO@ben enable simple fullscreen again (https://github.com/microsoft/vscode/issues/75054) // const windowConfig = this.configurationService.getValue('window'); // if (!windowConfig || typeof windowConfig.nativeFullScreen !== 'boolean') { // return true; // default From 506fea08ec619e68dbb8b5916405271c79663744 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 1 Jul 2019 08:36:30 +0200 Subject: [PATCH 0804/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 96d94efdecf..b7265bf5958 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "b49e556c274bfe2fc7f4fafd3804cb4ebd948c4f", + "distro": "409a5566f22a67f075b188de068d6a5a24dbe18d", "author": { "name": "Microsoft Corporation" }, From e8792f4b7917148973938d826099211ff3ce2b47 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 1 Jul 2019 08:44:19 +0200 Subject: [PATCH 0805/1449] web - implement recently opened and preserve fullscreen on switch (fix #76034) --- .../historyStorage.ts | 0 .../electron-main/historyMainService.ts | 2 +- .../test/electron-main/historyStorage.test.ts | 2 +- src/vs/platform/windows/common/windows.ts | 2 + src/vs/workbench/api/common/apiCommands.ts | 10 +- .../browser/actions/media/actions.css | 9 + .../actions/media/remove-dark.svg | 0 .../actions/media/remove.svg | 0 .../browser/actions/windowActions.ts | 223 +++++++++++++++++- src/vs/workbench/browser/dnd.ts | 5 +- .../workbench/browser/web.simpleservices.ts | 92 +++++++- .../actions/media/actions.css | 13 - .../electron-browser/actions/windowActions.ts | 155 +----------- .../electron-browser/main.contribution.ts | 44 +--- .../services/history/browser/history.ts | 4 +- .../window/electron-browser/windowService.ts | 10 +- .../workspaceEditingService.ts | 2 +- .../workbench/test/workbenchTestServices.ts | 8 + src/vs/workbench/workbench.web.api.ts | 2 +- 19 files changed, 348 insertions(+), 235 deletions(-) rename src/vs/platform/history/{electron-main => common}/historyStorage.ts (100%) rename src/vs/workbench/{electron-browser => browser}/actions/media/remove-dark.svg (100%) rename src/vs/workbench/{electron-browser => browser}/actions/media/remove.svg (100%) delete mode 100644 src/vs/workbench/electron-browser/actions/media/actions.css diff --git a/src/vs/platform/history/electron-main/historyStorage.ts b/src/vs/platform/history/common/historyStorage.ts similarity index 100% rename from src/vs/platform/history/electron-main/historyStorage.ts rename to src/vs/platform/history/common/historyStorage.ts diff --git a/src/vs/platform/history/electron-main/historyMainService.ts b/src/vs/platform/history/electron-main/historyMainService.ts index 34c4d47857b..c55fcc6e8cc 100644 --- a/src/vs/platform/history/electron-main/historyMainService.ts +++ b/src/vs/platform/history/electron-main/historyMainService.ts @@ -20,7 +20,7 @@ import { URI } from 'vs/base/common/uri'; import { Schemas } from 'vs/base/common/network'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { getSimpleWorkspaceLabel } from 'vs/platform/label/common/label'; -import { toStoreData, restoreRecentlyOpened, RecentlyOpenedStorageData } from 'vs/platform/history/electron-main/historyStorage'; +import { toStoreData, restoreRecentlyOpened, RecentlyOpenedStorageData } from 'vs/platform/history/common/historyStorage'; import { exists } from 'vs/base/node/pfs'; import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; import { ILifecycleService, LifecycleMainPhase } from 'vs/platform/lifecycle/electron-main/lifecycleMain'; diff --git a/src/vs/platform/history/test/electron-main/historyStorage.test.ts b/src/vs/platform/history/test/electron-main/historyStorage.test.ts index aedc55b46c6..cb591285b1a 100644 --- a/src/vs/platform/history/test/electron-main/historyStorage.test.ts +++ b/src/vs/platform/history/test/electron-main/historyStorage.test.ts @@ -9,7 +9,7 @@ import * as path from 'vs/base/common/path'; import { IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { URI } from 'vs/base/common/uri'; import { IRecentlyOpened, isRecentFolder, IRecentFolder, IRecentWorkspace } from 'vs/platform/history/common/history'; -import { toStoreData, restoreRecentlyOpened } from 'vs/platform/history/electron-main/historyStorage'; +import { toStoreData, restoreRecentlyOpened } from 'vs/platform/history/common/historyStorage'; function toWorkspace(uri: URI): IWorkspaceIdentifier { return { diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index 19abdf93184..75677e6beae 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -242,6 +242,8 @@ export interface IWindowService { toggleFullScreen(target?: HTMLElement): Promise; setRepresentedFilename(fileName: string): Promise; getRecentlyOpened(): Promise; + addRecentlyOpened(recents: IRecent[]): Promise; + removeFromRecentlyOpened(paths: URI[]): Promise; focusWindow(): Promise; closeWindow(): Promise; openWindow(uris: IURIToOpen[], options?: IOpenSettings): Promise; diff --git a/src/vs/workbench/api/common/apiCommands.ts b/src/vs/workbench/api/common/apiCommands.ts index 09ef07b2de7..0c303c05c44 100644 --- a/src/vs/workbench/api/common/apiCommands.ts +++ b/src/vs/workbench/api/common/apiCommands.ts @@ -11,7 +11,7 @@ import { ITextEditorOptions } from 'vs/platform/editor/common/editor'; import { EditorViewColumn } from 'vs/workbench/api/common/shared/editor'; import { EditorGroupLayout } from 'vs/workbench/services/editor/common/editorGroupsService'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { IWindowsService, IOpenSettings, IURIToOpen } from 'vs/platform/windows/common/windows'; +import { IOpenSettings, IURIToOpen, IWindowService } from 'vs/platform/windows/common/windows'; import { IDownloadService } from 'vs/platform/download/common/download'; import { IWorkspacesService, hasWorkspaceFileExtension } from 'vs/platform/workspaces/common/workspaces'; import { IRecent } from 'vs/platform/history/common/history'; @@ -129,8 +129,8 @@ export class OpenAPICommand { CommandsRegistry.registerCommand(OpenAPICommand.ID, adjustHandler(OpenAPICommand.execute)); CommandsRegistry.registerCommand('_workbench.removeFromRecentlyOpened', function (accessor: ServicesAccessor, uri: URI) { - const windowsService = accessor.get(IWindowsService); - return windowsService.removeFromRecentlyOpened([uri]).then(() => undefined); + const windowService = accessor.get(IWindowService); + return windowService.removeFromRecentlyOpened([uri]); }); export class RemoveFromRecentlyOpenedAPICommand { @@ -160,7 +160,7 @@ interface RecentEntry { } CommandsRegistry.registerCommand('_workbench.addToRecentlyOpened', async function (accessor: ServicesAccessor, recentEntry: RecentEntry) { - const windowsService = accessor.get(IWindowsService); + const windowService = accessor.get(IWindowService); const workspacesService = accessor.get(IWorkspacesService); let recent: IRecent | undefined = undefined; const uri = recentEntry.uri; @@ -173,7 +173,7 @@ CommandsRegistry.registerCommand('_workbench.addToRecentlyOpened', async functio } else { recent = { fileUri: uri, label }; } - return windowsService.addRecentlyOpened([recent]); + return windowService.addRecentlyOpened([recent]); }); export class SetEditorLayoutAPICommand { diff --git a/src/vs/workbench/browser/actions/media/actions.css b/src/vs/workbench/browser/actions/media/actions.css index 8edf1d21a2f..09c9ff77991 100644 --- a/src/vs/workbench/browser/actions/media/actions.css +++ b/src/vs/workbench/browser/actions/media/actions.css @@ -11,3 +11,12 @@ .hc-black .monaco-workbench .flip-editor-layout { background-image: url('editor-layout-inverse.svg') !important; } + +.vs .action-remove-from-recently-opened { + background: url("remove.svg") center center no-repeat; +} + +.vs-dark .action-remove-from-recently-opened, +.hc-black .action-remove-from-recently-opened { + background: url("remove-dark.svg") center center no-repeat; +} diff --git a/src/vs/workbench/electron-browser/actions/media/remove-dark.svg b/src/vs/workbench/browser/actions/media/remove-dark.svg similarity index 100% rename from src/vs/workbench/electron-browser/actions/media/remove-dark.svg rename to src/vs/workbench/browser/actions/media/remove-dark.svg diff --git a/src/vs/workbench/electron-browser/actions/media/remove.svg b/src/vs/workbench/browser/actions/media/remove.svg similarity index 100% rename from src/vs/workbench/electron-browser/actions/media/remove.svg rename to src/vs/workbench/browser/actions/media/remove.svg diff --git a/src/vs/workbench/browser/actions/windowActions.ts b/src/vs/workbench/browser/actions/windowActions.ts index cc2ad1776af..838875097c8 100644 --- a/src/vs/workbench/browser/actions/windowActions.ts +++ b/src/vs/workbench/browser/actions/windowActions.ts @@ -3,9 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import 'vs/css!./media/actions'; + import * as nls from 'vs/nls'; import { Action } from 'vs/base/common/actions'; -import { IWindowService } from 'vs/platform/windows/common/windows'; +import { IWindowService, IURIToOpen } from 'vs/platform/windows/common/windows'; import { SyncActionDescriptor, MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; import { Registry } from 'vs/platform/registry/common/platform'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; @@ -13,6 +15,176 @@ import { IsFullscreenContext, IsDevelopmentContext } from 'vs/workbench/browser/ import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/actions'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { IQuickInputButton, IQuickInputService, IQuickPickSeparator } from 'vs/platform/quickinput/common/quickInput'; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { ILabelService } from 'vs/platform/label/common/label'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { IModelService } from 'vs/editor/common/services/modelService'; +import { IModeService } from 'vs/editor/common/services/modeService'; +import { IRecentWorkspace, IRecentFolder, IRecentFile, IRecent, isRecentFolder, isRecentWorkspace } from 'vs/platform/history/common/history'; +import { URI } from 'vs/base/common/uri'; +import { getIconClasses } from 'vs/editor/common/services/getIconClasses'; +import { FileKind } from 'vs/platform/files/common/files'; +import { splitName } from 'vs/base/common/labels'; +import { IKeyMods } from 'vs/base/parts/quickopen/common/quickOpen'; +import { isMacintosh } from 'vs/base/common/platform'; +import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +import { inQuickOpenContext, getQuickNavigateHandler } from 'vs/workbench/browser/parts/quickopen/quickopen'; + +export const inRecentFilesPickerContextKey = 'inRecentFilesPicker'; + +abstract class BaseOpenRecentAction extends Action { + + private removeFromRecentlyOpened: IQuickInputButton = { + iconClass: 'action-remove-from-recently-opened', + tooltip: nls.localize('remove', "Remove from Recently Opened") + }; + + constructor( + id: string, + label: string, + private windowService: IWindowService, + private quickInputService: IQuickInputService, + private contextService: IWorkspaceContextService, + private labelService: ILabelService, + private keybindingService: IKeybindingService, + private modelService: IModelService, + private modeService: IModeService, + ) { + super(id, label); + } + + protected abstract isQuickNavigate(): boolean; + + async run(): Promise { + const { workspaces, files } = await this.windowService.getRecentlyOpened(); + + this.openRecent(workspaces, files); + } + + private async openRecent(recentWorkspaces: Array, recentFiles: IRecentFile[]): Promise { + + const toPick = (recent: IRecent, labelService: ILabelService, buttons: IQuickInputButton[] | undefined) => { + let uriToOpen: IURIToOpen | undefined; + let iconClasses: string[]; + let fullLabel: string | undefined; + let resource: URI | undefined; + + // Folder + if (isRecentFolder(recent)) { + resource = recent.folderUri; + iconClasses = getIconClasses(this.modelService, this.modeService, resource, FileKind.FOLDER); + uriToOpen = { folderUri: resource }; + fullLabel = recent.label || labelService.getWorkspaceLabel(resource, { verbose: true }); + } + + // Workspace + else if (isRecentWorkspace(recent)) { + resource = recent.workspace.configPath; + iconClasses = getIconClasses(this.modelService, this.modeService, resource, FileKind.ROOT_FOLDER); + uriToOpen = { workspaceUri: resource }; + fullLabel = recent.label || labelService.getWorkspaceLabel(recent.workspace, { verbose: true }); + } + + // File + else { + resource = recent.fileUri; + iconClasses = getIconClasses(this.modelService, this.modeService, resource, FileKind.FILE); + uriToOpen = { fileUri: resource }; + fullLabel = recent.label || labelService.getUriLabel(resource); + } + + const { name, parentPath } = splitName(fullLabel); + + return { + iconClasses, + label: name, + description: parentPath, + buttons, + uriToOpen, + resource + }; + }; + + const workspacePicks = recentWorkspaces.map(workspace => toPick(workspace, this.labelService, !this.isQuickNavigate() ? [this.removeFromRecentlyOpened] : undefined)); + const filePicks = recentFiles.map(p => toPick(p, this.labelService, !this.isQuickNavigate() ? [this.removeFromRecentlyOpened] : undefined)); + + // focus second entry if the first recent workspace is the current workspace + const firstEntry = recentWorkspaces[0]; + let autoFocusSecondEntry: boolean = firstEntry && this.contextService.isCurrentWorkspace(isRecentWorkspace(firstEntry) ? firstEntry.workspace : firstEntry.folderUri); + + let keyMods: IKeyMods | undefined; + + const workspaceSeparator: IQuickPickSeparator = { type: 'separator', label: nls.localize('workspaces', "workspaces") }; + const fileSeparator: IQuickPickSeparator = { type: 'separator', label: nls.localize('files', "files") }; + const picks = [workspaceSeparator, ...workspacePicks, fileSeparator, ...filePicks]; + + const pick = await this.quickInputService.pick(picks, { + contextKey: inRecentFilesPickerContextKey, + activeItem: [...workspacePicks, ...filePicks][autoFocusSecondEntry ? 1 : 0], + placeHolder: isMacintosh ? nls.localize('openRecentPlaceHolderMac', "Select to open (hold Cmd-key to open in new window)") : nls.localize('openRecentPlaceHolder', "Select to open (hold Ctrl-key to open in new window)"), + matchOnDescription: true, + onKeyMods: mods => keyMods = mods, + quickNavigate: this.isQuickNavigate() ? { keybindings: this.keybindingService.lookupKeybindings(this.id) } : undefined, + onDidTriggerItemButton: async context => { + await this.windowService.removeFromRecentlyOpened([context.item.resource]); + context.removeItem(); + } + }); + + if (pick) { + return this.windowService.openWindow([pick.uriToOpen], { forceNewWindow: keyMods && keyMods.ctrlCmd }); + } + } +} + +export class OpenRecentAction extends BaseOpenRecentAction { + + static readonly ID = 'workbench.action.openRecent'; + static readonly LABEL = nls.localize('openRecent', "Open Recent..."); + + constructor( + id: string, + label: string, + @IWindowService windowService: IWindowService, + @IQuickInputService quickInputService: IQuickInputService, + @IWorkspaceContextService contextService: IWorkspaceContextService, + @IKeybindingService keybindingService: IKeybindingService, + @IModelService modelService: IModelService, + @IModeService modeService: IModeService, + @ILabelService labelService: ILabelService + ) { + super(id, label, windowService, quickInputService, contextService, labelService, keybindingService, modelService, modeService); + } + + protected isQuickNavigate(): boolean { + return false; + } +} + +export class QuickOpenRecentAction extends BaseOpenRecentAction { + + static readonly ID = 'workbench.action.quickOpenRecent'; + static readonly LABEL = nls.localize('quickOpenRecent', "Quick Open Recent..."); + + constructor( + id: string, + label: string, + @IWindowService windowService: IWindowService, + @IQuickInputService quickInputService: IQuickInputService, + @IWorkspaceContextService contextService: IWorkspaceContextService, + @IKeybindingService keybindingService: IKeybindingService, + @IModelService modelService: IModelService, + @IModeService modeService: IModeService, + @ILabelService labelService: ILabelService + ) { + super(id, label, windowService, quickInputService, contextService, labelService, keybindingService, modelService, modeService); + } + + protected isQuickNavigate(): boolean { + return true; + } +} export class ToggleFullScreenAction extends Action { @@ -56,12 +228,42 @@ export class ReloadWindowAction extends Action { const registry = Registry.as(Extensions.WorkbenchActions); +// --- Actions Registration + +const fileCategory = nls.localize('file', "File"); +registry.registerWorkbenchAction(new SyncActionDescriptor(QuickOpenRecentAction, QuickOpenRecentAction.ID, QuickOpenRecentAction.LABEL), 'File: Quick Open Recent...', fileCategory); +registry.registerWorkbenchAction(new SyncActionDescriptor(OpenRecentAction, OpenRecentAction.ID, OpenRecentAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.KEY_R, mac: { primary: KeyMod.WinCtrl | KeyCode.KEY_R } }), 'File: Open Recent...', fileCategory); + const viewCategory = nls.localize('view', "View"); registry.registerWorkbenchAction(new SyncActionDescriptor(ToggleFullScreenAction, ToggleFullScreenAction.ID, ToggleFullScreenAction.LABEL, { primary: KeyCode.F11, mac: { primary: KeyMod.CtrlCmd | KeyMod.WinCtrl | KeyCode.KEY_F } }), 'View: Toggle Full Screen', viewCategory); const developerCategory = nls.localize('developer', "Developer"); registry.registerWorkbenchAction(new SyncActionDescriptor(ReloadWindowAction, ReloadWindowAction.ID, ReloadWindowAction.LABEL), 'Developer: Reload Window', developerCategory); +// --- Commands/Keybindings Registration + +const recentFilesPickerContext = ContextKeyExpr.and(inQuickOpenContext, ContextKeyExpr.has(inRecentFilesPickerContextKey)); + +const quickOpenNavigateNextInRecentFilesPickerId = 'workbench.action.quickOpenNavigateNextInRecentFilesPicker'; +KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: quickOpenNavigateNextInRecentFilesPickerId, + weight: KeybindingWeight.WorkbenchContrib + 50, + handler: getQuickNavigateHandler(quickOpenNavigateNextInRecentFilesPickerId, true), + when: recentFilesPickerContext, + primary: KeyMod.CtrlCmd | KeyCode.KEY_R, + mac: { primary: KeyMod.WinCtrl | KeyCode.KEY_R } +}); + +const quickOpenNavigatePreviousInRecentFilesPicker = 'workbench.action.quickOpenNavigatePreviousInRecentFilesPicker'; +KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: quickOpenNavigatePreviousInRecentFilesPicker, + weight: KeybindingWeight.WorkbenchContrib + 50, + handler: getQuickNavigateHandler(quickOpenNavigatePreviousInRecentFilesPicker, false), + when: recentFilesPickerContext, + primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_R, + mac: { primary: KeyMod.WinCtrl | KeyMod.Shift | KeyCode.KEY_R } +}); + KeybindingsRegistry.registerKeybindingRule({ id: ReloadWindowAction.ID, weight: KeybindingWeight.WorkbenchContrib + 50, @@ -69,7 +271,24 @@ KeybindingsRegistry.registerKeybindingRule({ primary: KeyMod.CtrlCmd | KeyCode.KEY_R }); -// Appereance menu +// --- Menu Registration + +MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, { + title: nls.localize({ key: 'miOpenRecent', comment: ['&& denotes a mnemonic'] }, "Open &&Recent"), + submenu: MenuId.MenubarRecentMenu, + group: '2_open', + order: 4 +}); + +MenuRegistry.appendMenuItem(MenuId.MenubarRecentMenu, { + group: 'y_more', + command: { + id: OpenRecentAction.ID, + title: nls.localize({ key: 'miMore', comment: ['&& denotes a mnemonic'] }, "&&More...") + }, + order: 1 +}); + MenuRegistry.appendMenuItem(MenuId.MenubarAppearanceMenu, { group: '1_toggle_view', command: { diff --git a/src/vs/workbench/browser/dnd.ts b/src/vs/workbench/browser/dnd.ts index cce2dfe5632..cf1d6b5b60f 100644 --- a/src/vs/workbench/browser/dnd.ts +++ b/src/vs/workbench/browser/dnd.ts @@ -7,7 +7,7 @@ import { hasWorkspaceFileExtension, IWorkspaceFolderCreationData } from 'vs/plat import { normalize } from 'vs/base/common/path'; import { basename } from 'vs/base/common/resources'; import { IFileService } from 'vs/platform/files/common/files'; -import { IWindowsService, IWindowService, IURIToOpen } from 'vs/platform/windows/common/windows'; +import { IWindowService, IURIToOpen } from 'vs/platform/windows/common/windows'; import { URI } from 'vs/base/common/uri'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IBackupFileService } from 'vs/workbench/services/backup/common/backup'; @@ -160,7 +160,6 @@ export class ResourcesDropHandler { constructor( private options: IResourcesDropHandlerOptions, @IFileService private readonly fileService: IFileService, - @IWindowsService private readonly windowsService: IWindowsService, @IWindowService private readonly windowService: IWindowService, @ITextFileService private readonly textFileService: ITextFileService, @IBackupFileService private readonly backupFileService: IBackupFileService, @@ -190,7 +189,7 @@ export class ResourcesDropHandler { // Add external ones to recently open list unless dropped resource is a workspace const recents: IRecentFile[] = untitledOrFileResources.filter(d => d.isExternal && d.resource.scheme === Schemas.file).map(d => ({ fileUri: d.resource })); if (recents.length) { - this.windowsService.addRecentlyOpened(recents); + this.windowService.addRecentlyOpened(recents); } const editors: IResourceEditor[] = untitledOrFileResources.map(untitledOrFileResource => ({ diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index b253e573ae5..cecded0fb10 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -28,7 +28,7 @@ import { IStorageService, IWorkspaceStorageChangeEvent, StorageScope, IWillSaveS import { IUpdateService, State } from 'vs/platform/update/common/update'; import { IWindowService, INativeOpenDialogOptions, IEnterWorkspaceResult, IURIToOpen, IMessageBoxResult, IWindowsService, IOpenSettings, IWindowSettings } from 'vs/platform/windows/common/windows'; import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, IWorkspaceFolderCreationData, IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; -import { IRecentlyOpened, IRecent } from 'vs/platform/history/common/history'; +import { IRecentlyOpened, IRecent, isRecentFile, isRecentFolder } from 'vs/platform/history/common/history'; import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common/workspaceEditing'; import { ITunnelService } from 'vs/platform/remote/common/tunnel'; @@ -44,7 +44,7 @@ import { ICommentThreadChangedEvent } from 'vs/workbench/contrib/comments/common import { CommentingRanges } from 'vs/editor/common/modes'; import { Range } from 'vs/editor/common/core/range'; import { isUndefinedOrNull } from 'vs/base/common/types'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { addDisposableListener, EventType } from 'vs/base/browser/dom'; import { IEditorService, IResourceEditor } from 'vs/workbench/services/editor/common/editorService'; import { pathsToEditors } from 'vs/workbench/common/editor'; @@ -53,6 +53,8 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { ParsedArgs } from 'vs/platform/environment/common/environment'; import { ClassifiedEvent, StrictPropertyCheck, GDPRClassification } from 'vs/platform/telemetry/common/gdprTypings'; import { IProcessEnvironment } from 'vs/base/common/platform'; +import { toStoreData, restoreRecentlyOpened } from 'vs/platform/history/common/historyStorage'; +import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; //#region Backup File @@ -749,13 +751,42 @@ export class SimpleWindowService extends Disposable implements IWindowService { readonly windowId = 0; + static readonly RECENTLY_OPENED_KEY = 'recently.opened'; + constructor( @IEditorService private readonly editorService: IEditorService, @IFileService private readonly fileService: IFileService, - @IConfigurationService private readonly configurationService: IConfigurationService + @IConfigurationService private readonly configurationService: IConfigurationService, + @IStorageService private readonly storageService: IStorageService, + @IWorkspaceContextService private readonly workspaceService: IWorkspaceContextService, + @IWorkbenchLayoutService private readonly layoutService: IWorkbenchLayoutService ) { super(); + this.addWorkspaceToRecentlyOpened(); + this.restoreFullScreen(); + this.registerListeners(); + } + + private addWorkspaceToRecentlyOpened(): void { + const workspace = this.workspaceService.getWorkspace(); + switch (this.workspaceService.getWorkbenchState()) { + case WorkbenchState.FOLDER: + this.addRecentlyOpened([{ folderUri: workspace.folders[0].uri }]); + break; + case WorkbenchState.WORKSPACE: + this.addRecentlyOpened([{ workspace: { id: workspace.id, configPath: workspace.configuration! } }]); + break; + } + } + + private restoreFullScreen(): void { + if (document.location.href.indexOf('&fullscreen=true') > 0) { + setTimeout(() => this.toggleFullScreen(this.layoutService.getWorkbenchElement()), 0); + } + } + + private registerListeners(): void { this._register(addDisposableListener(document, EventType.FULLSCREEN_CHANGE, () => { if (document.fullscreenElement || (document).webkitFullscreenElement) { browser.setFullscreen(true); @@ -860,11 +891,54 @@ export class SimpleWindowService extends Disposable implements IWindowService { return Promise.resolve(); } - getRecentlyOpened(): Promise { - return Promise.resolve({ - workspaces: [], - files: [] + async getRecentlyOpened(): Promise { + const recentlyOpenedRaw = this.storageService.get(SimpleWindowService.RECENTLY_OPENED_KEY, StorageScope.GLOBAL); + if (recentlyOpenedRaw) { + return restoreRecentlyOpened(JSON.parse(recentlyOpenedRaw)); + } + + return { workspaces: [], files: [] }; + } + + async addRecentlyOpened(recents: IRecent[]): Promise { + const recentlyOpened = await this.getRecentlyOpened(); + + recents.forEach(recent => { + if (isRecentFile(recent)) { + this.doRemoveFromRecentlyOpened(recentlyOpened, [recent.fileUri]); + recentlyOpened.files.unshift(recent); + } else if (isRecentFolder(recent)) { + this.doRemoveFromRecentlyOpened(recentlyOpened, [recent.folderUri]); + recentlyOpened.workspaces.unshift(recent); + } else { + this.doRemoveFromRecentlyOpened(recentlyOpened, [recent.workspace.configPath]); + recentlyOpened.workspaces.unshift(recent); + } }); + + return this.saveRecentlyOpened(recentlyOpened); + } + + async removeFromRecentlyOpened(paths: URI[]): Promise { + const recentlyOpened = await this.getRecentlyOpened(); + + this.doRemoveFromRecentlyOpened(recentlyOpened, paths); + + return this.saveRecentlyOpened(recentlyOpened); + } + + private doRemoveFromRecentlyOpened(recentlyOpened: IRecentlyOpened, paths: URI[]): void { + recentlyOpened.files = recentlyOpened.files.filter(file => { + return !paths.some(path => path.toString() === file.fileUri.toString()); + }); + + recentlyOpened.workspaces = recentlyOpened.workspaces.filter(workspace => { + return !paths.some(path => path.toString() === (isRecentFolder(workspace) ? workspace.folderUri.toString() : workspace.workspace.configPath.toString())); + }); + } + + private async saveRecentlyOpened(data: IRecentlyOpened): Promise { + return this.storageService.store(SimpleWindowService.RECENTLY_OPENED_KEY, JSON.stringify(toStoreData(data)), StorageScope.GLOBAL); } focusWindow(): Promise { @@ -888,7 +962,7 @@ export class SimpleWindowService extends Disposable implements IWindowService { for (let i = 0; i < _uris.length; i++) { const uri = _uris[i]; if ('folderUri' in uri) { - const newAddress = `${document.location.origin}/?folder=${uri.folderUri.path}`; + const newAddress = `${document.location.origin}/?folder=${uri.folderUri.path}&fullscreen=${!!browser.isFullscreen()}`; if (openFolderInNewWindow) { window.open(newAddress); } else { @@ -896,7 +970,7 @@ export class SimpleWindowService extends Disposable implements IWindowService { } } if ('workspaceUri' in uri) { - const newAddress = `${document.location.origin}/?workspace=${uri.workspaceUri.path}`; + const newAddress = `${document.location.origin}/?workspace=${uri.workspaceUri.path}&fullscreen=${!!browser.isFullscreen()}`; if (openFolderInNewWindow) { window.open(newAddress); } else { diff --git a/src/vs/workbench/electron-browser/actions/media/actions.css b/src/vs/workbench/electron-browser/actions/media/actions.css deleted file mode 100644 index b8a660c3288..00000000000 --- a/src/vs/workbench/electron-browser/actions/media/actions.css +++ /dev/null @@ -1,13 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -.vs .action-remove-from-recently-opened { - background: url("remove.svg") center center no-repeat; -} - -.vs-dark .action-remove-from-recently-opened, -.hc-black .action-remove-from-recently-opened { - background: url("remove-dark.svg") center center no-repeat; -} \ No newline at end of file diff --git a/src/vs/workbench/electron-browser/actions/windowActions.ts b/src/vs/workbench/electron-browser/actions/windowActions.ts index 58b52edeb51..7bb652eb2f5 100644 --- a/src/vs/workbench/electron-browser/actions/windowActions.ts +++ b/src/vs/workbench/electron-browser/actions/windowActions.ts @@ -3,29 +3,22 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import 'vs/css!./media/actions'; - import { URI } from 'vs/base/common/uri'; import { Action } from 'vs/base/common/actions'; -import { IWindowService, IWindowsService, IURIToOpen } from 'vs/platform/windows/common/windows'; +import { IWindowService, IWindowsService } from 'vs/platform/windows/common/windows'; import * as nls from 'vs/nls'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { isMacintosh } from 'vs/base/common/platform'; import * as browser from 'vs/base/browser/browser'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { webFrame } from 'electron'; import { FileKind } from 'vs/platform/files/common/files'; -import { ILabelService } from 'vs/platform/label/common/label'; import { IModelService } from 'vs/editor/common/services/modelService'; import { IModeService } from 'vs/editor/common/services/modeService'; -import { IQuickInputService, IQuickInputButton, IQuickPickSeparator, IKeyMods } from 'vs/platform/quickinput/common/quickInput'; +import { IQuickInputService, IQuickInputButton } from 'vs/platform/quickinput/common/quickInput'; import { getIconClasses } from 'vs/editor/common/services/getIconClasses'; import product from 'vs/platform/product/node/product'; import { ICommandHandler } from 'vs/platform/commands/common/commands'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IRecentFolder, IRecentFile, IRecentWorkspace, IRecent, isRecentFolder, isRecentWorkspace } from 'vs/platform/history/common/history'; -import { splitName } from 'vs/base/common/labels'; export class CloseCurrentWindowAction extends Action { @@ -274,150 +267,6 @@ export class QuickSwitchWindow extends BaseSwitchWindow { } } -export const inRecentFilesPickerContextKey = 'inRecentFilesPicker'; - -export abstract class BaseOpenRecentAction extends Action { - - private removeFromRecentlyOpened: IQuickInputButton = { - iconClass: 'action-remove-from-recently-opened', - tooltip: nls.localize('remove', "Remove from Recently Opened") - }; - - constructor( - id: string, - label: string, - private windowService: IWindowService, - private windowsService: IWindowsService, - private quickInputService: IQuickInputService, - private contextService: IWorkspaceContextService, - private labelService: ILabelService, - private keybindingService: IKeybindingService, - private modelService: IModelService, - private modeService: IModeService, - ) { - super(id, label); - } - - protected abstract isQuickNavigate(): boolean; - - async run(): Promise { - const { workspaces, files } = await this.windowService.getRecentlyOpened(); - - this.openRecent(workspaces, files); - } - - private async openRecent(recentWorkspaces: Array, recentFiles: IRecentFile[]): Promise { - - const toPick = (recent: IRecent, labelService: ILabelService, buttons: IQuickInputButton[] | undefined) => { - let uriToOpen: IURIToOpen | undefined; - let iconClasses: string[]; - let fullLabel: string | undefined; - let resource: URI | undefined; - if (isRecentFolder(recent)) { - resource = recent.folderUri; - iconClasses = getIconClasses(this.modelService, this.modeService, resource, FileKind.FOLDER); - uriToOpen = { folderUri: resource }; - fullLabel = recent.label || labelService.getWorkspaceLabel(resource, { verbose: true }); - } else if (isRecentWorkspace(recent)) { - resource = recent.workspace.configPath; - iconClasses = getIconClasses(this.modelService, this.modeService, resource, FileKind.ROOT_FOLDER); - uriToOpen = { workspaceUri: resource }; - fullLabel = recent.label || labelService.getWorkspaceLabel(recent.workspace, { verbose: true }); - } else { - resource = recent.fileUri; - iconClasses = getIconClasses(this.modelService, this.modeService, resource, FileKind.FILE); - uriToOpen = { fileUri: resource }; - fullLabel = recent.label || labelService.getUriLabel(resource); - } - const { name, parentPath } = splitName(fullLabel); - return { - iconClasses, - label: name, - description: parentPath, - buttons, - uriToOpen, - resource - }; - }; - const workspacePicks = recentWorkspaces.map(workspace => toPick(workspace, this.labelService, !this.isQuickNavigate() ? [this.removeFromRecentlyOpened] : undefined)); - const filePicks = recentFiles.map(p => toPick(p, this.labelService, !this.isQuickNavigate() ? [this.removeFromRecentlyOpened] : undefined)); - - // focus second entry if the first recent workspace is the current workspace - const firstEntry = recentWorkspaces[0]; - let autoFocusSecondEntry: boolean = firstEntry && this.contextService.isCurrentWorkspace(isRecentWorkspace(firstEntry) ? firstEntry.workspace : firstEntry.folderUri); - - let keyMods: IKeyMods | undefined; - const workspaceSeparator: IQuickPickSeparator = { type: 'separator', label: nls.localize('workspaces', "workspaces") }; - const fileSeparator: IQuickPickSeparator = { type: 'separator', label: nls.localize('files', "files") }; - const picks = [workspaceSeparator, ...workspacePicks, fileSeparator, ...filePicks]; - const pick = await this.quickInputService.pick(picks, { - contextKey: inRecentFilesPickerContextKey, - activeItem: [...workspacePicks, ...filePicks][autoFocusSecondEntry ? 1 : 0], - placeHolder: isMacintosh ? nls.localize('openRecentPlaceHolderMac', "Select to open (hold Cmd-key to open in new window)") : nls.localize('openRecentPlaceHolder', "Select to open (hold Ctrl-key to open in new window)"), - matchOnDescription: true, - onKeyMods: mods => keyMods = mods, - quickNavigate: this.isQuickNavigate() ? { keybindings: this.keybindingService.lookupKeybindings(this.id) } : undefined, - onDidTriggerItemButton: async context => { - await this.windowsService.removeFromRecentlyOpened([context.item.resource]); - context.removeItem(); - } - }); - - if (pick) { - return this.windowService.openWindow([pick.uriToOpen], { forceNewWindow: keyMods && keyMods.ctrlCmd }); - } - } -} - -export class OpenRecentAction extends BaseOpenRecentAction { - - static readonly ID = 'workbench.action.openRecent'; - static readonly LABEL = nls.localize('openRecent', "Open Recent..."); - - constructor( - id: string, - label: string, - @IWindowService windowService: IWindowService, - @IWindowsService windowsService: IWindowsService, - @IQuickInputService quickInputService: IQuickInputService, - @IWorkspaceContextService contextService: IWorkspaceContextService, - @IKeybindingService keybindingService: IKeybindingService, - @IModelService modelService: IModelService, - @IModeService modeService: IModeService, - @ILabelService labelService: ILabelService - ) { - super(id, label, windowService, windowsService, quickInputService, contextService, labelService, keybindingService, modelService, modeService); - } - - protected isQuickNavigate(): boolean { - return false; - } -} - -export class QuickOpenRecentAction extends BaseOpenRecentAction { - - static readonly ID = 'workbench.action.quickOpenRecent'; - static readonly LABEL = nls.localize('quickOpenRecent', "Quick Open Recent..."); - - constructor( - id: string, - label: string, - @IWindowService windowService: IWindowService, - @IWindowsService windowsService: IWindowsService, - @IQuickInputService quickInputService: IQuickInputService, - @IWorkspaceContextService contextService: IWorkspaceContextService, - @IKeybindingService keybindingService: IKeybindingService, - @IModelService modelService: IModelService, - @IModeService modeService: IModeService, - @ILabelService labelService: ILabelService - ) { - super(id, label, windowService, windowsService, quickInputService, contextService, labelService, keybindingService, modelService, modeService); - } - - protected isQuickNavigate(): boolean { - return true; - } -} export class ShowAboutDialogAction extends Action { diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index 9d2b119c091..04680562078 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -13,10 +13,9 @@ import { KeyMod, KeyChord, KeyCode } from 'vs/base/common/keyCodes'; import { isWindows, isLinux, isMacintosh } from 'vs/base/common/platform'; import { KeybindingsReferenceAction, OpenDocumentationUrlAction, OpenIntroductoryVideosUrlAction, OpenTipsAndTricksUrlAction, OpenTwitterUrlAction, OpenRequestFeatureUrlAction, OpenPrivacyStatementUrlAction, OpenLicenseUrlAction, OpenNewsletterSignupUrlAction } from 'vs/workbench/electron-browser/actions/helpActions'; import { ToggleSharedProcessAction, ToggleDevToolsAction } from 'vs/workbench/electron-browser/actions/developerActions'; -import { ShowAboutDialogAction, ZoomResetAction, ZoomOutAction, ZoomInAction, CloseCurrentWindowAction, SwitchWindow, NewWindowAction, QuickSwitchWindow, QuickOpenRecentAction, inRecentFilesPickerContextKey, OpenRecentAction, ReloadWindowWithExtensionsDisabledAction, NewWindowTabHandler, ShowPreviousWindowTabHandler, ShowNextWindowTabHandler, MoveWindowTabToNewWindowHandler, MergeWindowTabsHandlerHandler, ToggleWindowTabsBarHandler } from 'vs/workbench/electron-browser/actions/windowActions'; +import { ShowAboutDialogAction, ZoomResetAction, ZoomOutAction, ZoomInAction, CloseCurrentWindowAction, SwitchWindow, NewWindowAction, QuickSwitchWindow, ReloadWindowWithExtensionsDisabledAction, NewWindowTabHandler, ShowPreviousWindowTabHandler, ShowNextWindowTabHandler, MoveWindowTabToNewWindowHandler, MergeWindowTabsHandlerHandler, ToggleWindowTabsBarHandler } from 'vs/workbench/electron-browser/actions/windowActions'; import { AddRootFolderAction, GlobalRemoveRootFolderAction, SaveWorkspaceAsAction, OpenWorkspaceConfigFileAction, DuplicateWorkspaceInNewWindowAction, CloseWorkspaceAction } from 'vs/workbench/browser/actions/workspaceActions'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { inQuickOpenContext, getQuickNavigateHandler } from 'vs/workbench/browser/parts/quickopen/quickopen'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; @@ -35,31 +34,7 @@ import product from 'vs/platform/product/node/product'; (function registerFileActions(): void { const fileCategory = nls.localize('file', "File"); - registry.registerWorkbenchAction(new SyncActionDescriptor(QuickOpenRecentAction, QuickOpenRecentAction.ID, QuickOpenRecentAction.LABEL), 'File: Quick Open Recent...', fileCategory); - registry.registerWorkbenchAction(new SyncActionDescriptor(OpenRecentAction, OpenRecentAction.ID, OpenRecentAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.KEY_R, mac: { primary: KeyMod.WinCtrl | KeyCode.KEY_R } }), 'File: Open Recent...', fileCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(CloseWorkspaceAction, CloseWorkspaceAction.ID, CloseWorkspaceAction.LABEL, { primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyCode.KEY_F) }), 'File: Close Workspace', fileCategory); - - const recentFilesPickerContext = ContextKeyExpr.and(inQuickOpenContext, ContextKeyExpr.has(inRecentFilesPickerContextKey)); - - const quickOpenNavigateNextInRecentFilesPickerId = 'workbench.action.quickOpenNavigateNextInRecentFilesPicker'; - KeybindingsRegistry.registerCommandAndKeybindingRule({ - id: quickOpenNavigateNextInRecentFilesPickerId, - weight: KeybindingWeight.WorkbenchContrib + 50, - handler: getQuickNavigateHandler(quickOpenNavigateNextInRecentFilesPickerId, true), - when: recentFilesPickerContext, - primary: KeyMod.CtrlCmd | KeyCode.KEY_R, - mac: { primary: KeyMod.WinCtrl | KeyCode.KEY_R } - }); - - const quickOpenNavigatePreviousInRecentFilesPicker = 'workbench.action.quickOpenNavigatePreviousInRecentFilesPicker'; - KeybindingsRegistry.registerCommandAndKeybindingRule({ - id: quickOpenNavigatePreviousInRecentFilesPicker, - weight: KeybindingWeight.WorkbenchContrib + 50, - handler: getQuickNavigateHandler(quickOpenNavigatePreviousInRecentFilesPicker, false), - when: recentFilesPickerContext, - primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_R, - mac: { primary: KeyMod.WinCtrl | KeyMod.Shift | KeyCode.KEY_R } - }); })(); // Actions: View @@ -205,23 +180,6 @@ import product from 'vs/platform/product/node/product'; order: 2 }); - MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, { - title: nls.localize({ key: 'miOpenRecent', comment: ['&& denotes a mnemonic'] }, "Open &&Recent"), - submenu: MenuId.MenubarRecentMenu, - group: '2_open', - order: 4 - }); - - // More - MenuRegistry.appendMenuItem(MenuId.MenubarRecentMenu, { - group: 'y_more', - command: { - id: OpenRecentAction.ID, - title: nls.localize({ key: 'miMore', comment: ['&& denotes a mnemonic'] }, "&&More...") - }, - order: 1 - }); - MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, { group: '3_workspace', command: { diff --git a/src/vs/workbench/services/history/browser/history.ts b/src/vs/workbench/services/history/browser/history.ts index 5296da44a56..c276acb6f6a 100644 --- a/src/vs/workbench/services/history/browser/history.ts +++ b/src/vs/workbench/services/history/browser/history.ts @@ -19,7 +19,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { Event } from 'vs/base/common/event'; import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; import { IEditorGroupsService, IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; -import { IWindowsService } from 'vs/platform/windows/common/windows'; +import { IWindowService } from 'vs/platform/windows/common/windows'; import { getCodeEditor, ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { getExcludes, ISearchConfiguration } from 'vs/workbench/services/search/common/search'; import { IExpression } from 'vs/base/common/glob'; @@ -137,7 +137,7 @@ export class HistoryService extends Disposable implements IHistoryService { @IStorageService private readonly storageService: IStorageService, @IConfigurationService private readonly configurationService: IConfigurationService, @IFileService private readonly fileService: IFileService, - @IWindowsService private readonly windowService: IWindowsService, + @IWindowService private readonly windowService: IWindowService, @IInstantiationService private readonly instantiationService: IInstantiationService, @IWorkbenchLayoutService private readonly layoutService: IWorkbenchLayoutService, @IContextKeyService private readonly contextKeyService: IContextKeyService diff --git a/src/vs/workbench/services/window/electron-browser/windowService.ts b/src/vs/workbench/services/window/electron-browser/windowService.ts index 52a00f05b26..031e015589c 100644 --- a/src/vs/workbench/services/window/electron-browser/windowService.ts +++ b/src/vs/workbench/services/window/electron-browser/windowService.ts @@ -5,7 +5,7 @@ import { Event } from 'vs/base/common/event'; import { IWindowService, IWindowsService, INativeOpenDialogOptions, IEnterWorkspaceResult, IMessageBoxResult, IDevToolsOptions, IOpenSettings, IURIToOpen, isFolderToOpen, isWorkspaceToOpen } from 'vs/platform/windows/common/windows'; -import { IRecentlyOpened } from 'vs/platform/history/common/history'; +import { IRecentlyOpened, IRecent } from 'vs/platform/history/common/history'; import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; import { ParsedArgs } from 'vs/platform/environment/common/environment'; import { URI } from 'vs/base/common/uri'; @@ -121,6 +121,14 @@ export class WindowService extends Disposable implements IWindowService { return this.windowsService.getRecentlyOpened(this.windowId); } + addRecentlyOpened(recents: IRecent[]): Promise { + return this.windowsService.addRecentlyOpened(recents); + } + + removeFromRecentlyOpened(paths: URI[]): Promise { + return this.windowsService.removeFromRecentlyOpened(paths); + } + focusWindow(): Promise { return this.windowsService.focusWindow(this.windowId); } diff --git a/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts b/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts index 905d2a8b292..4f2433419a1 100644 --- a/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts +++ b/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts @@ -134,7 +134,7 @@ export class WorkspaceEditingService implements IWorkspaceEditingService { const newWorkspaceIdentifier = await this.workspaceService.getWorkspaceIdentifier(newWorkspacePath); const label = this.labelService.getWorkspaceLabel(newWorkspaceIdentifier, { verbose: true }); - this.windowsService.addRecentlyOpened([{ label, workspace: newWorkspaceIdentifier }]); + this.windowService.addRecentlyOpened([{ label, workspace: newWorkspaceIdentifier }]); this.workspaceService.deleteUntitledWorkspace(workspaceIdentifier); } catch (error) { diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index 45bf09e967a..566e45c5680 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -1218,6 +1218,14 @@ export class TestWindowService implements IWindowService { }); } + addRecentlyOpened(_recents: IRecent[]): Promise { + return Promise.resolve(); + } + + removeFromRecentlyOpened(_paths: URI[]): Promise { + return Promise.resolve(); + } + focusWindow(): Promise { return Promise.resolve(); } diff --git a/src/vs/workbench/workbench.web.api.ts b/src/vs/workbench/workbench.web.api.ts index cfaa8103f76..a0615457e0a 100644 --- a/src/vs/workbench/workbench.web.api.ts +++ b/src/vs/workbench/workbench.web.api.ts @@ -6,7 +6,7 @@ import 'vs/workbench/workbench.web.main'; import { main } from 'vs/workbench/browser/web.main'; import { UriComponents } from 'vs/base/common/uri'; -import { IUserDataProvider } from './services/userData/common/userData'; +import { IUserDataProvider } from 'vs/workbench/services/userData/common/userData'; export interface IWorkbenchConstructionOptions { From 344740989ab009767902e713e7e6a8f53585ae06 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 1 Jul 2019 09:18:20 +0200 Subject: [PATCH 0806/1449] fix build --- src/vs/workbench/browser/web.main.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index 15542b6087e..f87f57f07dc 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -36,7 +36,7 @@ import { hash } from 'vs/base/common/hash'; import { IWorkbenchConstructionOptions } from 'vs/workbench/workbench.web.api'; import { ProductService } from 'vs/platform/product/browser/productService'; import { FileUserDataProvider } from 'vs/workbench/services/userData/common/fileUserDataProvider'; -import { UserDataFileSystemProvider } from 'vs/workbench//services/userData/common/userDataFileSystemProvider'; +import { UserDataFileSystemProvider } from 'vs/workbench/services/userData/common/userDataFileSystemProvider'; import { joinPath, dirname } from 'vs/base/common/resources'; import { InMemoryUserDataProvider } from 'vs/workbench/services/userData/common/inMemoryUserDataProvider'; import { IUserDataProvider } from 'vs/workbench/services/userData/common/userData'; From 5f406230c9d60bd0bf9ae5c67f506597013e18c1 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 1 Jul 2019 09:43:41 +0200 Subject: [PATCH 0807/1449] use keybinding instead of setting, show provider name (iff possible) --- src/vs/editor/common/modes.ts | 5 ++++ .../services/editorWorkerServiceImpl.ts | 2 ++ .../editor/contrib/suggest/suggestWidget.ts | 23 ++++++++++++++----- .../api/browser/mainThreadLanguageFeatures.ts | 3 ++- .../workbench/api/common/extHost.protocol.ts | 2 +- .../api/common/extHostLanguageFeatures.ts | 2 +- .../browser/snippetCompletionProvider.ts | 2 ++ 7 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/vs/editor/common/modes.ts b/src/vs/editor/common/modes.ts index da61c64e070..0616ed0e7a6 100644 --- a/src/vs/editor/common/modes.ts +++ b/src/vs/editor/common/modes.ts @@ -510,6 +510,11 @@ export interface CompletionContext { */ export interface CompletionItemProvider { + /** + * @internal + */ + _debugDisplayName?: string; + triggerCharacters?: string[]; /** * Provide completion items for the given position and document. diff --git a/src/vs/editor/common/services/editorWorkerServiceImpl.ts b/src/vs/editor/common/services/editorWorkerServiceImpl.ts index d42a7f7782e..6cefce59c2c 100644 --- a/src/vs/editor/common/services/editorWorkerServiceImpl.ts +++ b/src/vs/editor/common/services/editorWorkerServiceImpl.ts @@ -133,6 +133,8 @@ class WordBasedCompletionItemProvider implements modes.CompletionItemProvider { private readonly _configurationService: ITextResourceConfigurationService; private readonly _modelService: IModelService; + readonly _debugDisplayName = 'wordbasedCompletions'; + constructor( workerManager: WorkerManager, configurationService: ITextResourceConfigurationService, diff --git a/src/vs/editor/contrib/suggest/suggestWidget.ts b/src/vs/editor/contrib/suggest/suggestWidget.ts index 3ea9a62625e..17ffa84b03a 100644 --- a/src/vs/editor/contrib/suggest/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/suggestWidget.ts @@ -38,7 +38,8 @@ import { URI } from 'vs/base/common/uri'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { FileKind } from 'vs/platform/files/common/files'; import { MarkdownString } from 'vs/base/common/htmlContent'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; const expandSuggestionDocsByDefault = false; @@ -230,6 +231,18 @@ const enum State { Details } + +let _explainMode = false; +KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: 'suggest.toggleExplainMode', + handler() { + _explainMode = !_explainMode; + }, + when: SuggestContext.Visible, + weight: KeybindingWeight.EditorContrib, + primary: KeyMod.CtrlCmd | KeyCode.US_SLASH, +}); + class SuggestionDetails { private el: HTMLElement; @@ -250,7 +263,6 @@ class SuggestionDetails { private readonly editor: ICodeEditor, private readonly markdownRenderer: MarkdownRenderer, private readonly triggerKeybindingLabel: string, - @IConfigurationService private readonly _configService: IConfigurationService, ) { this.disposables = []; @@ -293,19 +305,18 @@ class SuggestionDetails { this.renderDisposeable = dispose(this.renderDisposeable); let { documentation, detail } = item.completion; - const shouldExplain = this._configService.getValue('editor.suggest._explain'); // --- documentation - if (shouldExplain) { + if (_explainMode) { let md = ''; md += `score: ${item.score[0]}${item.word ? `, compared '${item.completion.filterText && (item.completion.filterText + ' (filterText)') || item.completion.label}' with '${item.word}'` : ' (no prefix)'}\n`; md += `distance: ${item.distance}, see localityBonus-setting\n`; md += `index: ${item.idx}, ${item.completion.sortText && (`'${item.completion.sortText}' (sortText)`) || 'extension order'}\n`; documentation = new MarkdownString().appendCodeblock('empty', md); - detail = undefined; + detail = `Provider: ${item.provider._debugDisplayName}`; } - if (!shouldExplain && !canExpandCompletionItem(item)) { + if (!_explainMode && !canExpandCompletionItem(item)) { this.type.textContent = ''; this.docs.textContent = ''; addClass(this.el, 'no-docs'); diff --git a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts index 1b55da3d731..d54e01d9a9b 100644 --- a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts +++ b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts @@ -346,9 +346,10 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha }; } - $registerSuggestSupport(handle: number, selector: ISerializedDocumentFilter[], triggerCharacters: string[], supportsResolveDetails: boolean): void { + $registerSuggestSupport(handle: number, selector: ISerializedDocumentFilter[], triggerCharacters: string[], supportsResolveDetails: boolean, extensionId: ExtensionIdentifier): void { const provider: modes.CompletionItemProvider = { triggerCharacters, + _debugDisplayName: extensionId.value, provideCompletionItems: (model: ITextModel, position: EditorPosition, context: modes.CompletionContext, token: CancellationToken): Promise => { return this._proxy.$provideCompletionItems(handle, model.uri, position, context, token).then(result => { if (!result) { diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 2f51c54ee7c..f9f60f7dde7 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -348,7 +348,7 @@ export interface MainThreadLanguageFeaturesShape extends IDisposable { $registerOnTypeFormattingSupport(handle: number, selector: ISerializedDocumentFilter[], autoFormatTriggerCharacters: string[], extensionId: ExtensionIdentifier): void; $registerNavigateTypeSupport(handle: number): void; $registerRenameSupport(handle: number, selector: ISerializedDocumentFilter[], supportsResolveInitialValues: boolean): void; - $registerSuggestSupport(handle: number, selector: ISerializedDocumentFilter[], triggerCharacters: string[], supportsResolveDetails: boolean): void; + $registerSuggestSupport(handle: number, selector: ISerializedDocumentFilter[], triggerCharacters: string[], supportsResolveDetails: boolean, extensionId: ExtensionIdentifier): void; $registerSignatureHelpProvider(handle: number, selector: ISerializedDocumentFilter[], metadata: ISerializedSignatureHelpProviderMetadata): void; $registerDocumentLinkProvider(handle: number, selector: ISerializedDocumentFilter[], supportsResolve: boolean): void; $registerDocumentColorProvider(handle: number, selector: ISerializedDocumentFilter[]): void; diff --git a/src/vs/workbench/api/common/extHostLanguageFeatures.ts b/src/vs/workbench/api/common/extHostLanguageFeatures.ts index 4aefb1cc5d6..84e28939bb3 100644 --- a/src/vs/workbench/api/common/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/common/extHostLanguageFeatures.ts @@ -1380,7 +1380,7 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { registerCompletionItemProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.CompletionItemProvider, triggerCharacters: string[]): vscode.Disposable { const handle = this._addNewAdapter(new SuggestAdapter(this._documents, this._commands.converter, provider), extension); - this._proxy.$registerSuggestSupport(handle, this._transformDocumentSelector(selector), triggerCharacters, SuggestAdapter.supportsResolving(provider)); + this._proxy.$registerSuggestSupport(handle, this._transformDocumentSelector(selector), triggerCharacters, SuggestAdapter.supportsResolving(provider), extension.identifier); return this._createDisposable(handle); } diff --git a/src/vs/workbench/contrib/snippets/browser/snippetCompletionProvider.ts b/src/vs/workbench/contrib/snippets/browser/snippetCompletionProvider.ts index 106ca8be945..87ca39e297c 100644 --- a/src/vs/workbench/contrib/snippets/browser/snippetCompletionProvider.ts +++ b/src/vs/workbench/contrib/snippets/browser/snippetCompletionProvider.ts @@ -64,6 +64,8 @@ export class SnippetCompletionProvider implements CompletionItemProvider { private static readonly _maxPrefix = 10000; + readonly _debugDisplayName = 'snippetCompletions'; + constructor( @IModeService private readonly _modeService: IModeService, From be403842b23e83bc4eecb3fe2d1f3a458c97673a Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 1 Jul 2019 09:48:59 +0200 Subject: [PATCH 0808/1449] tests --- test/electron/renderer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/electron/renderer.js b/test/electron/renderer.js index bd8cba69214..4d5a7f0f1ee 100644 --- a/test/electron/renderer.js +++ b/test/electron/renderer.js @@ -274,7 +274,7 @@ function runTests(opts) { ipcRenderer.on('run', (e, opts) => { initLoader(opts); runTests(opts).catch(err => { - if (!(typeof err !== 'string')) { + if (typeof err !== 'string') { err = JSON.stringify(err); } From 162c502a36a4be66818db142dda48172a99f53fb Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 1 Jul 2019 09:52:35 +0200 Subject: [PATCH 0809/1449] better wording for sort text --- src/vs/editor/contrib/suggest/suggestWidget.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/suggest/suggestWidget.ts b/src/vs/editor/contrib/suggest/suggestWidget.ts index 17ffa84b03a..fd6c81d0fac 100644 --- a/src/vs/editor/contrib/suggest/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/suggestWidget.ts @@ -311,7 +311,7 @@ class SuggestionDetails { let md = ''; md += `score: ${item.score[0]}${item.word ? `, compared '${item.completion.filterText && (item.completion.filterText + ' (filterText)') || item.completion.label}' with '${item.word}'` : ' (no prefix)'}\n`; md += `distance: ${item.distance}, see localityBonus-setting\n`; - md += `index: ${item.idx}, ${item.completion.sortText && (`'${item.completion.sortText}' (sortText)`) || 'extension order'}\n`; + md += `index: ${item.idx}, based on ${item.completion.sortText && `sortText: "${item.completion.sortText}"` || 'label'}\n`; documentation = new MarkdownString().appendCodeblock('empty', md); detail = `Provider: ${item.provider._debugDisplayName}`; } From 39292af2b53ef8d5e9f277e933dec7f6119f1a13 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Mon, 1 Jul 2019 09:52:37 +0200 Subject: [PATCH 0810/1449] Fixes #76298: Smoke test failure: starts with 'DE' locale and verifies title and viewlets text is in German --- test/smoke/src/areas/workbench/localization.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/smoke/src/areas/workbench/localization.test.ts b/test/smoke/src/areas/workbench/localization.test.ts index c0844c2c6bf..e9e0b44a4f0 100644 --- a/test/smoke/src/areas/workbench/localization.test.ts +++ b/test/smoke/src/areas/workbench/localization.test.ts @@ -37,7 +37,7 @@ export function setup() { await app.workbench.scm.waitForTitle(title => /quellcodeverwaltung/i.test(title)); await app.workbench.debug.openDebugViewlet(); - await app.workbench.debug.waitForTitle(title => /debuggen/i.test(title)); + await app.workbench.debug.waitForTitle(title => /debug/i.test(title)); await app.workbench.extensions.openExtensionsViewlet(); await app.workbench.extensions.waitForTitle(title => /erweiterungen/i.test(title)); From 59963fc1c0d3974e7110c8a393b575ab450b3214 Mon Sep 17 00:00:00 2001 From: Julien Brianceau <5746498+jbrianceau@users.noreply.github.com> Date: Mon, 1 Jul 2019 09:55:06 +0200 Subject: [PATCH 0811/1449] Fix 'unkown' typos (#76297) Because of this typo, the same localization string was duplicated: * 'unkownProblemMatcher' referenced in processTaskSystem.ts * 'unknownProblemMatcher' referenced in terminalTaskSystem.ts --- src/vs/workbench/api/node/extHostCLIServer.ts | 2 +- src/vs/workbench/contrib/tasks/node/processRunnerDetector.ts | 2 +- src/vs/workbench/contrib/tasks/node/processTaskSystem.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/api/node/extHostCLIServer.ts b/src/vs/workbench/api/node/extHostCLIServer.ts index 4a5811a8600..2c549734a17 100644 --- a/src/vs/workbench/api/node/extHostCLIServer.ts +++ b/src/vs/workbench/api/node/extHostCLIServer.ts @@ -81,7 +81,7 @@ export class CLIServer { break; default: res.writeHead(404); - res.write(`Unkown message type: ${data.type}`, err => { + res.write(`Unknown message type: ${data.type}`, err => { if (err) { console.error(err); } diff --git a/src/vs/workbench/contrib/tasks/node/processRunnerDetector.ts b/src/vs/workbench/contrib/tasks/node/processRunnerDetector.ts index e128bfe9c08..85b3465b41b 100644 --- a/src/vs/workbench/contrib/tasks/node/processRunnerDetector.ts +++ b/src/vs/workbench/contrib/tasks/node/processRunnerDetector.ts @@ -187,7 +187,7 @@ export class ProcessRunnerDetector { } else if ('grunt' === detectSpecific) { detectorPromise = this.tryDetectGrunt(this._workspaceRoot, list); } else { - throw new Error('Unkown detector type'); + throw new Error('Unknown detector type'); } return detectorPromise.then((value) => { if (value) { diff --git a/src/vs/workbench/contrib/tasks/node/processTaskSystem.ts b/src/vs/workbench/contrib/tasks/node/processTaskSystem.ts index 6d27ba51b44..972b7ec3374 100644 --- a/src/vs/workbench/contrib/tasks/node/processTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/node/processTaskSystem.ts @@ -437,7 +437,7 @@ export class ProcessTaskSystem implements ITaskSystem { matcher = value; } if (!matcher) { - this.appendOutput(nls.localize('unkownProblemMatcher', 'Problem matcher {0} can\'t be resolved. The matcher will be ignored')); + this.appendOutput(nls.localize('unknownProblemMatcher', 'Problem matcher {0} can\'t be resolved. The matcher will be ignored')); return; } if (!matcher.filePrefix) { From 7beb71bd5c0eaa59f23283ecfe07df2390a6b2cd Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 1 Jul 2019 09:57:37 +0200 Subject: [PATCH 0812/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 41c900feeb2..9c44480cc48 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "b21cb2a950fdcc3ab100ee0d36d42f433de3a79a", + "distro": "832c287d6e6ccfd5e0ef975fd276a8c0ff38054f", "author": { "name": "Microsoft Corporation" }, From df8e3f0d0c1bad9b6e0fce84f33cb319b50eeb41 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 1 Jul 2019 10:45:19 +0200 Subject: [PATCH 0813/1449] fix build --- build/azure-pipelines/darwin/product-build-darwin.yml | 4 +++- build/azure-pipelines/linux/product-build-linux.yml | 10 ++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index ac6858c264e..74386b4ae30 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -77,10 +77,12 @@ steps: - script: | set -e VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - AZURE_STORAGE_ACCESS_KEY="$(ticino-storage-key)" \ yarn gulp vscode-darwin-min + VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ yarn gulp vscode-reh-darwin-min + VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ yarn gulp vscode-web-darwin-min + AZURE_STORAGE_ACCESS_KEY="$(ticino-storage-key)" \ yarn gulp upload-vscode-sourcemaps displayName: Build diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 205d582c9e7..bf3a0794561 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -79,12 +79,14 @@ steps: set -e if [[ "$VSCODE_ARCH" == "ia32" ]]; then VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-linux-$VSCODE_ARCH-min + yarn gulp vscode-linux-$VSCODE_ARCH-min else VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-linux-$VSCODE_ARCH-min - yarn gulp vscode-reh-linux-$VSCODE_ARCH-min - yarn gulp vscode-web-linux-$VSCODE_ARCH-min + yarn gulp vscode-linux-$VSCODE_ARCH-min + VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ + yarn gulp vscode-reh-linux-$VSCODE_ARCH-min + VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ + yarn gulp vscode-web-linux-$VSCODE_ARCH-min fi displayName: Build From 0678cb9ed31bb5ffa2979b762724f8b63e3c3de9 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 1 Jul 2019 11:54:36 +0200 Subject: [PATCH 0814/1449] build: remove old extensions build task, split extensions into gulp task --- build/gulpfile.compile.js | 6 +---- build/gulpfile.extensions.js | 26 +++++++++----------- build/gulpfile.vscode.js | 14 +++++------ build/lib/extensions.ts | 46 +++++++++++++----------------------- 4 files changed, 35 insertions(+), 57 deletions(-) diff --git a/build/gulpfile.compile.js b/build/gulpfile.compile.js index 0dd2e5abf19..a32936ef4b2 100644 --- a/build/gulpfile.compile.js +++ b/build/gulpfile.compile.js @@ -8,11 +8,7 @@ const util = require('./lib/util'); const task = require('./lib/task'); const compilation = require('./lib/compilation'); -const { compileExtensionsBuildTask } = require('./gulpfile.extensions'); // Full compile, including nls and inline sources in sourcemaps, for build -const compileClientBuildTask = task.define('compile-client-build', task.series(util.rimraf('out-build'), compilation.compileTask('src', 'out-build', true))); - -// All Build -const compileBuildTask = task.define('compile-build', task.parallel(compileClientBuildTask, compileExtensionsBuildTask)); +const compileBuildTask = task.define('compile-build', task.series(util.rimraf('out-build'), compilation.compileTask('src', 'out-build', true))); exports.compileBuildTask = compileBuildTask; \ No newline at end of file diff --git a/build/gulpfile.extensions.js b/build/gulpfile.extensions.js index c72b26cafed..ca39f435b2f 100644 --- a/build/gulpfile.extensions.js +++ b/build/gulpfile.extensions.js @@ -22,6 +22,7 @@ const root = path.dirname(__dirname); const commit = util.getVersion(root); const plumber = require('gulp-plumber'); const _ = require('underscore'); +const ext = require('./lib/extensions'); const extensionsPath = path.join(path.dirname(__dirname), 'extensions'); @@ -122,24 +123,11 @@ const tasks = compilations.map(function (tsconfigFile) { .pipe(gulp.dest(out)); })); - const compileBuildTask = task.define(`compile-build-extension-${name}`, task.series(cleanTask, () => { - const pipeline = createPipeline(true, true); - const input = gulp.src(src, srcOpts); - - return input - .pipe(pipeline()) - .pipe(gulp.dest(out)); - })); - // Tasks gulp.task(compileTask); gulp.task(watchTask); - return { - compileTask: compileTask, - watchTask: watchTask, - compileBuildTask: compileBuildTask - }; + return { compileTask, watchTask }; }); const compileExtensionsTask = task.define('compile-extensions', task.parallel(...tasks.map(t => t.compileTask))); @@ -150,5 +138,13 @@ const watchExtensionsTask = task.define('watch-extensions', task.parallel(...tas gulp.task(watchExtensionsTask); exports.watchExtensionsTask = watchExtensionsTask; -const compileExtensionsBuildTask = task.define('compile-extensions-build', task.parallel(...tasks.map(t => t.compileBuildTask))); +// Azure Pipelines + +const cleanExtensionsBuildTask = task.define('clean-extensions-build', util.rimraf('.build/extensions')); +const compileExtensionsBuildTask = task.define('compile-extensions-build', task.series(cleanExtensionsBuildTask, () => { + return ext.packageExtensionsStream() + .pipe(gulp.dest('.build')); +})); + +gulp.task(compileExtensionsBuildTask); exports.compileExtensionsBuildTask = compileExtensionsBuildTask; diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 0673fdb0306..9747074d95f 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -21,7 +21,6 @@ const json = require('gulp-json-editor'); const _ = require('underscore'); const util = require('./lib/util'); const task = require('./lib/task'); -const ext = require('./lib/extensions'); const buildfile = require('../src/buildfile'); const common = require('./lib/optimize'); const root = path.dirname(__dirname); @@ -35,6 +34,7 @@ const getElectronVersion = require('./lib/electron').getElectronVersion; const createAsar = require('./lib/asar').createAsar; const minimist = require('minimist'); const { compileBuildTask } = require('./gulpfile.compile'); +const { compileExtensionsBuildTask } = require('./gulpfile.extensions'); const productionDependencies = deps.getProductionDependencies(path.dirname(__dirname)); // @ts-ignore @@ -277,9 +277,8 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op const root = path.resolve(path.join(__dirname, '..')); - const sources = es.merge(src, ext.packageExtensionsStream({ - sourceMappingURLBase: sourceMappingURLBase - })); + const extensions = gulp.src('.build/extensions/**', { base: '.build', dot: true }); + const sources = es.merge(src, extensions); let version = packageJson.version; // @ts-ignore JSON checking: quality is optional @@ -448,10 +447,9 @@ BUILD_TARGETS.forEach(buildTarget => { const destinationFolderName = `VSCode${dashed(platform)}${dashed(arch)}`; const vscodeTask = task.define(`vscode${dashed(platform)}${dashed(arch)}${dashed(minified)}`, task.series( - task.parallel( - minified ? minifyVSCodeTask : optimizeVSCodeTask, - util.rimraf(path.join(buildRoot, destinationFolderName)) - ), + compileExtensionsBuildTask, + util.rimraf(path.join(buildRoot, destinationFolderName)), + minified ? minifyVSCodeTask : optimizeVSCodeTask, packageTask(platform, arch, sourceFolderName, destinationFolderName, opts) )); gulp.task(vscodeTask); diff --git a/build/lib/extensions.ts b/build/lib/extensions.ts index 188deaf1a1f..9454b8bcb45 100644 --- a/build/lib/extensions.ts +++ b/build/lib/extensions.ts @@ -23,19 +23,21 @@ const buffer = require('gulp-buffer'); import json = require('gulp-json-editor'); const webpack = require('webpack'); const webpackGulp = require('webpack-stream'); +const util = require('./lib/util'); +const root = path.dirname(path.dirname(__dirname)); +const commit = util.getVersion(root); +const sourceMappingURLBase = `https://ticino.blob.core.windows.net/sourcemaps/${commit}`; -const root = path.resolve(path.join(__dirname, '..', '..')); - -function fromLocal(extensionPath: string, sourceMappingURLBase?: string): Stream { +function fromLocal(extensionPath: string): Stream { const webpackFilename = path.join(extensionPath, 'extension.webpack.config.js'); if (fs.existsSync(webpackFilename)) { - return fromLocalWebpack(extensionPath, sourceMappingURLBase); + return fromLocalWebpack(extensionPath); } else { return fromLocalNormal(extensionPath); } } -function fromLocalWebpack(extensionPath: string, sourceMappingURLBase: string | undefined): Stream { +function fromLocalWebpack(extensionPath: string): Stream { const result = es.through(); const packagedDependencies: string[] = []; @@ -123,18 +125,16 @@ function fromLocalWebpack(extensionPath: string, sourceMappingURLBase: string | // source map handling: // * rewrite sourceMappingURL // * save to disk so that upload-task picks this up - if (sourceMappingURLBase) { - const contents = (data.contents).toString('utf8'); - data.contents = Buffer.from(contents.replace(/\n\/\/# sourceMappingURL=(.*)$/gm, function (_m, g1) { - return `\n//# sourceMappingURL=${sourceMappingURLBase}/extensions/${path.basename(extensionPath)}/${relativeOutputPath}/${g1}`; - }), 'utf8'); + const contents = (data.contents).toString('utf8'); + data.contents = Buffer.from(contents.replace(/\n\/\/# sourceMappingURL=(.*)$/gm, function (_m, g1) { + return `\n//# sourceMappingURL=${sourceMappingURLBase}/extensions/${path.basename(extensionPath)}/${relativeOutputPath}/${g1}`; + }), 'utf8'); - if (/\.js\.map$/.test(data.path)) { - if (!fs.existsSync(path.dirname(data.path))) { - fs.mkdirSync(path.dirname(data.path)); - } - fs.writeFileSync(data.path, data.contents); + if (/\.js\.map$/.test(data.path)) { + if (!fs.existsSync(path.dirname(data.path))) { + fs.mkdirSync(path.dirname(data.path)); } + fs.writeFileSync(data.path, data.contents); } this.emit('data', data); })); @@ -210,14 +210,6 @@ export function fromMarketplace(extensionName: string, version: string, metadata .pipe(packageJsonFilter.restore); } -interface IPackageExtensionsOptions { - /** - * Set to undefined to package all of them. - */ - desiredExtensions?: string[]; - sourceMappingURLBase?: string; -} - const excludedExtensions = [ 'vscode-api-tests', 'vscode-colorize-tests', @@ -259,9 +251,7 @@ function sequence(streamProviders: { (): Stream }[]): Stream { return result; } -export function packageExtensionsStream(optsIn?: IPackageExtensionsOptions): NodeJS.ReadWriteStream { - const opts = optsIn || {}; - +export function packageExtensionsStream(): NodeJS.ReadWriteStream { const localExtensionDescriptions = (glob.sync('extensions/*/package.json')) .map(manifestPath => { const extensionPath = path.dirname(path.join(root, manifestPath)); @@ -269,11 +259,10 @@ export function packageExtensionsStream(optsIn?: IPackageExtensionsOptions): Nod return { name: extensionName, path: extensionPath }; }) .filter(({ name }) => excludedExtensions.indexOf(name) === -1) - .filter(({ name }) => opts.desiredExtensions ? opts.desiredExtensions.indexOf(name) >= 0 : true) .filter(({ name }) => builtInExtensions.every(b => b.name !== name)); const localExtensions = () => sequence([...localExtensionDescriptions.map(extension => () => { - return fromLocal(extension.path, opts.sourceMappingURLBase) + return fromLocal(extension.path) .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`)); })]); @@ -281,7 +270,6 @@ export function packageExtensionsStream(optsIn?: IPackageExtensionsOptions): Nod const marketplaceExtensions = () => es.merge( ...builtInExtensions - .filter(({ name }) => opts.desiredExtensions ? opts.desiredExtensions.indexOf(name) >= 0 : true) .map(extension => { return fromMarketplace(extension.name, extension.version, extension.metadata) .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`)); From a78e60f67fb94aebbc5224937b84ceced3c4d2b3 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 1 Jul 2019 11:56:07 +0200 Subject: [PATCH 0815/1449] missing compilation --- build/lib/extensions.js | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/build/lib/extensions.js b/build/lib/extensions.js index 18c668d6432..abec3c3ec99 100644 --- a/build/lib/extensions.js +++ b/build/lib/extensions.js @@ -23,17 +23,20 @@ const buffer = require('gulp-buffer'); const json = require("gulp-json-editor"); const webpack = require('webpack'); const webpackGulp = require('webpack-stream'); -const root = path.resolve(path.join(__dirname, '..', '..')); -function fromLocal(extensionPath, sourceMappingURLBase) { +const util = require('./lib/util'); +const root = path.dirname(path.dirname(__dirname)); +const commit = util.getVersion(root); +const sourceMappingURLBase = `https://ticino.blob.core.windows.net/sourcemaps/${commit}`; +function fromLocal(extensionPath) { const webpackFilename = path.join(extensionPath, 'extension.webpack.config.js'); if (fs.existsSync(webpackFilename)) { - return fromLocalWebpack(extensionPath, sourceMappingURLBase); + return fromLocalWebpack(extensionPath); } else { return fromLocalNormal(extensionPath); } } -function fromLocalWebpack(extensionPath, sourceMappingURLBase) { +function fromLocalWebpack(extensionPath) { const result = es.through(); const packagedDependencies = []; const packageJsonConfig = require(path.join(extensionPath, 'package.json')); @@ -104,17 +107,15 @@ function fromLocalWebpack(extensionPath, sourceMappingURLBase) { // source map handling: // * rewrite sourceMappingURL // * save to disk so that upload-task picks this up - if (sourceMappingURLBase) { - const contents = data.contents.toString('utf8'); - data.contents = Buffer.from(contents.replace(/\n\/\/# sourceMappingURL=(.*)$/gm, function (_m, g1) { - return `\n//# sourceMappingURL=${sourceMappingURLBase}/extensions/${path.basename(extensionPath)}/${relativeOutputPath}/${g1}`; - }), 'utf8'); - if (/\.js\.map$/.test(data.path)) { - if (!fs.existsSync(path.dirname(data.path))) { - fs.mkdirSync(path.dirname(data.path)); - } - fs.writeFileSync(data.path, data.contents); + const contents = data.contents.toString('utf8'); + data.contents = Buffer.from(contents.replace(/\n\/\/# sourceMappingURL=(.*)$/gm, function (_m, g1) { + return `\n//# sourceMappingURL=${sourceMappingURLBase}/extensions/${path.basename(extensionPath)}/${relativeOutputPath}/${g1}`; + }), 'utf8'); + if (/\.js\.map$/.test(data.path)) { + if (!fs.existsSync(path.dirname(data.path))) { + fs.mkdirSync(path.dirname(data.path)); } + fs.writeFileSync(data.path, data.contents); } this.emit('data', data); })); @@ -207,8 +208,7 @@ function sequence(streamProviders) { pop(); return result; } -function packageExtensionsStream(optsIn) { - const opts = optsIn || {}; +function packageExtensionsStream() { const localExtensionDescriptions = glob.sync('extensions/*/package.json') .map(manifestPath => { const extensionPath = path.dirname(path.join(root, manifestPath)); @@ -216,15 +216,13 @@ function packageExtensionsStream(optsIn) { return { name: extensionName, path: extensionPath }; }) .filter(({ name }) => excludedExtensions.indexOf(name) === -1) - .filter(({ name }) => opts.desiredExtensions ? opts.desiredExtensions.indexOf(name) >= 0 : true) .filter(({ name }) => builtInExtensions.every(b => b.name !== name)); const localExtensions = () => sequence([...localExtensionDescriptions.map(extension => () => { - return fromLocal(extension.path, opts.sourceMappingURLBase) + return fromLocal(extension.path) .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`)); })]); const localExtensionDependencies = () => gulp.src('extensions/node_modules/**', { base: '.' }); const marketplaceExtensions = () => es.merge(...builtInExtensions - .filter(({ name }) => opts.desiredExtensions ? opts.desiredExtensions.indexOf(name) >= 0 : true) .map(extension => { return fromMarketplace(extension.name, extension.version, extension.metadata) .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`)); From e2289d05dab883d45fa5e02b00f941df7870bf6d Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 1 Jul 2019 12:01:47 +0200 Subject: [PATCH 0816/1449] fix relative path --- build/lib/extensions.js | 2 +- build/lib/extensions.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/lib/extensions.js b/build/lib/extensions.js index abec3c3ec99..3d062c0d273 100644 --- a/build/lib/extensions.js +++ b/build/lib/extensions.js @@ -23,7 +23,7 @@ const buffer = require('gulp-buffer'); const json = require("gulp-json-editor"); const webpack = require('webpack'); const webpackGulp = require('webpack-stream'); -const util = require('./lib/util'); +const util = require('./util'); const root = path.dirname(path.dirname(__dirname)); const commit = util.getVersion(root); const sourceMappingURLBase = `https://ticino.blob.core.windows.net/sourcemaps/${commit}`; diff --git a/build/lib/extensions.ts b/build/lib/extensions.ts index 9454b8bcb45..014946523df 100644 --- a/build/lib/extensions.ts +++ b/build/lib/extensions.ts @@ -23,7 +23,7 @@ const buffer = require('gulp-buffer'); import json = require('gulp-json-editor'); const webpack = require('webpack'); const webpackGulp = require('webpack-stream'); -const util = require('./lib/util'); +const util = require('./util'); const root = path.dirname(path.dirname(__dirname)); const commit = util.getVersion(root); const sourceMappingURLBase = `https://ticino.blob.core.windows.net/sourcemaps/${commit}`; From 399ff1a2fe96279add5162fae0208f24c0e181d8 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 1 Jul 2019 12:24:33 +0200 Subject: [PATCH 0817/1449] gulp ci build task --- build/gulpfile.extensions.js | 2 +- build/gulpfile.vscode.js | 9 +++++++-- build/lib/util.js | 2 +- build/lib/util.ts | 2 +- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/build/gulpfile.extensions.js b/build/gulpfile.extensions.js index ca39f435b2f..26f47841b87 100644 --- a/build/gulpfile.extensions.js +++ b/build/gulpfile.extensions.js @@ -147,4 +147,4 @@ const compileExtensionsBuildTask = task.define('compile-extensions-build', task. })); gulp.task(compileExtensionsBuildTask); -exports.compileExtensionsBuildTask = compileExtensionsBuildTask; +exports.compileExtensionsBuildTask = compileExtensionsBuildTask; \ No newline at end of file diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 9747074d95f..7f0384d69cf 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -446,12 +446,17 @@ BUILD_TARGETS.forEach(buildTarget => { const sourceFolderName = `out-vscode${dashed(minified)}`; const destinationFolderName = `VSCode${dashed(platform)}${dashed(arch)}`; - const vscodeTask = task.define(`vscode${dashed(platform)}${dashed(arch)}${dashed(minified)}`, task.series( - compileExtensionsBuildTask, + const vscodeCITaskWhat = task.define(`vscode${dashed(platform)}${dashed(arch)}${dashed(minified)}-ci`, task.series( util.rimraf(path.join(buildRoot, destinationFolderName)), minified ? minifyVSCodeTask : optimizeVSCodeTask, packageTask(platform, arch, sourceFolderName, destinationFolderName, opts) )); + gulp.task(vscodeCITaskWhat); + + const vscodeTask = task.define(`vscode${dashed(platform)}${dashed(arch)}${dashed(minified)}`, task.series( + compileExtensionsBuildTask, + vscodeCITaskWhat + )); gulp.task(vscodeTask); }); }); diff --git a/build/lib/util.js b/build/lib/util.js index 6a210d3decc..2583e815f36 100644 --- a/build/lib/util.js +++ b/build/lib/util.js @@ -177,7 +177,7 @@ function rimraf(dir) { return cb(err); }); }; - retry.taskName = `clean-${path.basename(dir)}`; + retry.taskName = `clean-${path.basename(dir).toLowerCase()}`; return retry; } exports.rimraf = rimraf; diff --git a/build/lib/util.ts b/build/lib/util.ts index e87c0650ec3..69f3d3608bb 100644 --- a/build/lib/util.ts +++ b/build/lib/util.ts @@ -234,7 +234,7 @@ export function rimraf(dir: string): (cb: any) => void { return cb(err); }); }; - retry.taskName = `clean-${path.basename(dir)}`; + retry.taskName = `clean-${path.basename(dir).toLowerCase()}`; return retry; } From f0a214e93874b70ade684ca96f3f8a9a68aa7471 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Mon, 1 Jul 2019 12:43:26 +0200 Subject: [PATCH 0818/1449] Fix: Highlight current selection in HC theme (fixes #69077) --- .../workbench/browser/parts/quickinput/quickInputList.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/quickinput/quickInputList.ts b/src/vs/workbench/browser/parts/quickinput/quickInputList.ts index 78c08462c11..7f779285752 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInputList.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInputList.ts @@ -22,7 +22,7 @@ import { HighlightedLabel } from 'vs/base/browser/ui/highlightedlabel/highlighte import { memoize } from 'vs/base/common/decorators'; import { range } from 'vs/base/common/arrays'; import * as platform from 'vs/base/common/platform'; -import { listFocusBackground, pickerGroupBorder, pickerGroupForeground } from 'vs/platform/theme/common/colorRegistry'; +import { listFocusBackground, pickerGroupBorder, pickerGroupForeground, activeContrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { Action } from 'vs/base/common/actions'; @@ -596,6 +596,13 @@ registerThemingParticipant((theme, collector) => { collector.addRule(`.quick-input-list .monaco-list .monaco-list-row.focused { background-color: ${listInactiveFocusBackground}; }`); collector.addRule(`.quick-input-list .monaco-list .monaco-list-row.focused:hover { background-color: ${listInactiveFocusBackground}; }`); } + const activeContrast = theme.getColor(activeContrastBorder); + if (activeContrast) { + collector.addRule(`.quick-input-list .monaco-list .monaco-list-row.focused { border: 1px dotted ${activeContrast}; }`); + collector.addRule(`.quick-input-list .monaco-list .monaco-list-row { border: 1px solid transparent; }`); + collector.addRule(`.quick-input-list .monaco-list .quick-input-list-entry { padding: 0 5px; height: 18px; align-items: center; }`); + collector.addRule(`.quick-input-list .monaco-list .quick-input-list-entry-action-bar { margin-top: 0; }`); + } const pickerGroupBorderColor = theme.getColor(pickerGroupBorder); if (pickerGroupBorderColor) { collector.addRule(`.quick-input-list .quick-input-list-entry { border-top-color: ${pickerGroupBorderColor}; }`); From 2f1373c0bb88eb80818bae15c0d02833ec955876 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 1 Jul 2019 12:52:09 +0200 Subject: [PATCH 0819/1449] introduce gulpfile.ci.js --- build/gulpfile.ci.js | 59 ++++++++++++++++++++++++++++++++++++++++++++ gulpfile.js | 2 ++ 2 files changed, 61 insertions(+) create mode 100644 build/gulpfile.ci.js diff --git a/build/gulpfile.ci.js b/build/gulpfile.ci.js new file mode 100644 index 00000000000..ca781a91378 --- /dev/null +++ b/build/gulpfile.ci.js @@ -0,0 +1,59 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +const gulp = require('gulp'); +const task = require('./lib/task'); + +gulp.task(task.define('win32-ia32', task.series( + gulp.task('compile-extensions-build'), + gulp.task('vscode-win32-ia32-ci') +))); + +gulp.task(task.define('win32-ia32-min', task.series( + gulp.task('compile-extensions-build'), + gulp.task('vscode-win32-ia32-min-ci') +))); + +gulp.task(task.define('win32-x64', task.series( + gulp.task('compile-extensions-build'), + gulp.task('vscode-win32-x64-ci') +))); + +gulp.task(task.define('win32-x64-min', task.series( + gulp.task('compile-extensions-build'), + gulp.task('vscode-win32-x64-min-ci') +))); + +gulp.task(task.define('linux-ia32', task.series( + gulp.task('compile-extensions-build'), + gulp.task('vscode-linux-ia32-ci') +))); + +gulp.task(task.define('linux-ia32-min', task.series( + gulp.task('compile-extensions-build'), + gulp.task('vscode-linux-ia32-min-ci') +))); + +gulp.task(task.define('linux-x64', task.series( + gulp.task('compile-extensions-build'), + gulp.task('vscode-linux-x64-ci') +))); + +gulp.task(task.define('linux-x64-min', task.series( + gulp.task('compile-extensions-build'), + gulp.task('vscode-linux-x64-min-ci') +))); + +gulp.task(task.define('darwin', task.series( + gulp.task('compile-extensions-build'), + gulp.task('vscode-darwin-ci') +))); + +gulp.task(task.define('darwin-min', task.series( + gulp.task('compile-extensions-build'), + gulp.task('vscode-darwin-min-ci') +))); diff --git a/gulpfile.js b/gulpfile.js index 1d13cff608c..e41bf4a498f 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -40,4 +40,6 @@ process.on('unhandledRejection', (reason, p) => { // Load all the gulpfiles only if running tasks other than the editor tasks const build = path.join(__dirname, 'build'); require('glob').sync('gulpfile.*.js', { cwd: build }) + .filter(f => !/gulpfile\.ci\.js/.test(f)) .forEach(f => require(`./build/${f}`)); +require('./build/gulpfile.ci.js'); \ No newline at end of file From 893bf4ea1f8c158125746c3fe959ef4e23883282 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 1 Jul 2019 12:56:56 +0200 Subject: [PATCH 0820/1449] Not possible to explicitly change the foreground text color for widgets. Fixes microsoft/vscode#76274 --- src/vs/editor/contrib/find/findWidget.ts | 7 ++++++- .../browser/accessibilityHelp/accessibilityHelp.ts | 7 ++++++- src/vs/platform/theme/common/colorRegistry.ts | 2 ++ src/vs/platform/theme/common/styler.ts | 4 ++-- src/vs/workbench/common/theme.ts | 8 ++++---- .../codeEditor/browser/accessibility/accessibility.ts | 7 ++++++- src/vs/workbench/contrib/feedback/browser/feedback.ts | 5 +++-- .../contrib/preferences/browser/keybindingWidgets.ts | 9 +++++++-- 8 files changed, 36 insertions(+), 13 deletions(-) diff --git a/src/vs/editor/contrib/find/findWidget.ts b/src/vs/editor/contrib/find/findWidget.ts index 2fba7cf35cf..5e7febe1ccf 100644 --- a/src/vs/editor/contrib/find/findWidget.ts +++ b/src/vs/editor/contrib/find/findWidget.ts @@ -27,7 +27,7 @@ import { CONTEXT_FIND_INPUT_FOCUSED, CONTEXT_REPLACE_INPUT_FOCUSED, FIND_IDS, MA import { FindReplaceState, FindReplaceStateChangedEvent } from 'vs/editor/contrib/find/findState'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { contrastBorder, editorFindMatch, editorFindMatchBorder, editorFindMatchHighlight, editorFindMatchHighlightBorder, editorFindRangeHighlight, editorFindRangeHighlightBorder, editorWidgetBackground, editorWidgetBorder, editorWidgetResizeBorder, errorForeground, inputActiveOptionBorder, inputBackground, inputBorder, inputForeground, inputValidationErrorBackground, inputValidationErrorBorder, inputValidationErrorForeground, inputValidationInfoBackground, inputValidationInfoBorder, inputValidationInfoForeground, inputValidationWarningBackground, inputValidationWarningBorder, inputValidationWarningForeground, widgetShadow } from 'vs/platform/theme/common/colorRegistry'; +import { contrastBorder, editorFindMatch, editorFindMatchBorder, editorFindMatchHighlight, editorFindMatchHighlightBorder, editorFindRangeHighlight, editorFindRangeHighlightBorder, editorWidgetBackground, editorWidgetBorder, editorWidgetResizeBorder, errorForeground, inputActiveOptionBorder, inputBackground, inputBorder, inputForeground, inputValidationErrorBackground, inputValidationErrorBorder, inputValidationErrorForeground, inputValidationInfoBackground, inputValidationInfoBorder, inputValidationInfoForeground, inputValidationWarningBackground, inputValidationWarningBorder, inputValidationWarningForeground, widgetShadow, editorWidgetForeground } from 'vs/platform/theme/common/colorRegistry'; import { ITheme, IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { ContextScopedFindInput, ContextScopedHistoryInputBox } from 'vs/platform/browser/contextScopedHistoryWidget'; import { AccessibilitySupport } from 'vs/platform/accessibility/common/accessibility'; @@ -1193,6 +1193,11 @@ registerThemingParticipant((theme, collector) => { collector.addRule(`.monaco-editor .find-widget { border: 2px solid ${hcBorder}; }`); } + const foreground = theme.getColor(editorWidgetForeground); + if (foreground) { + collector.addRule(`.monaco-editor .find-widget { color: ${foreground}; }`); + } + const error = theme.getColor(errorForeground); if (error) { collector.addRule(`.monaco-editor .find-widget.no-results .matchesCount { color: ${error}; }`); diff --git a/src/vs/editor/standalone/browser/accessibilityHelp/accessibilityHelp.ts b/src/vs/editor/standalone/browser/accessibilityHelp/accessibilityHelp.ts index 73dfa8d3ac3..22e860f8eb0 100644 --- a/src/vs/editor/standalone/browser/accessibilityHelp/accessibilityHelp.ts +++ b/src/vs/editor/standalone/browser/accessibilityHelp/accessibilityHelp.ts @@ -27,7 +27,7 @@ import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiati import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { contrastBorder, editorWidgetBackground, widgetShadow } from 'vs/platform/theme/common/colorRegistry'; +import { contrastBorder, editorWidgetBackground, widgetShadow, editorWidgetForeground } from 'vs/platform/theme/common/colorRegistry'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { AccessibilitySupport } from 'vs/platform/accessibility/common/accessibility'; import { AccessibilityHelpNLS } from 'vs/editor/common/standaloneStrings'; @@ -371,6 +371,11 @@ registerThemingParticipant((theme, collector) => { if (widgetBackground) { collector.addRule(`.monaco-editor .accessibilityHelpWidget { background-color: ${widgetBackground}; }`); } + const widgetForeground = theme.getColor(editorWidgetForeground); + if (widgetForeground) { + collector.addRule(`.monaco-editor .accessibilityHelpWidget { color: ${widgetForeground}; }`); + } + const widgetShadowColor = theme.getColor(widgetShadow); if (widgetShadowColor) { diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index 1e292909050..ef39b5aacca 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -293,6 +293,8 @@ export const editorForeground = registerColor('editor.foreground', { light: '#33 * Editor widgets */ export const editorWidgetBackground = registerColor('editorWidget.background', { dark: '#252526', light: '#F3F3F3', hc: '#0C141F' }, nls.localize('editorWidgetBackground', 'Background color of editor widgets, such as find/replace.')); +export const editorWidgetForeground = registerColor('editorWidget.foreground', { dark: foreground, light: foreground, hc: foreground }, nls.localize('editorWidgetForeground', 'Foreground color of editor widgets, such as find/replace.')); + export const editorWidgetBorder = registerColor('editorWidget.border', { dark: '#454545', light: '#C8C8C8', hc: contrastBorder }, nls.localize('editorWidgetBorder', 'Border color of editor widgets. The color is only used if the widget chooses to have a border and if the color is not overridden by a widget.')); export const editorWidgetResizeBorder = registerColor('editorWidget.resizeBorder', { light: null, dark: null, hc: null }, nls.localize('editorWidgetResizeBorder', "Border color of the resize bar of editor widgets. The color is only used if the widget chooses to have a resize border and if the color is not overridden by a widget.")); diff --git a/src/vs/platform/theme/common/styler.ts b/src/vs/platform/theme/common/styler.ts index 3cf776cf532..d04b8bd3c8f 100644 --- a/src/vs/platform/theme/common/styler.ts +++ b/src/vs/platform/theme/common/styler.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { ITheme, IThemeService } from 'vs/platform/theme/common/themeService'; -import { focusBorder, inputBackground, inputForeground, ColorIdentifier, selectForeground, selectBackground, selectListBackground, selectBorder, inputBorder, foreground, editorBackground, contrastBorder, inputActiveOptionBorder, listFocusBackground, listFocusForeground, listActiveSelectionBackground, listActiveSelectionForeground, listInactiveSelectionForeground, listInactiveSelectionBackground, listInactiveFocusBackground, listHoverBackground, listHoverForeground, listDropBackground, pickerGroupBorder, pickerGroupForeground, widgetShadow, inputValidationInfoBorder, inputValidationInfoBackground, inputValidationWarningBorder, inputValidationWarningBackground, inputValidationErrorBorder, inputValidationErrorBackground, activeContrastBorder, buttonForeground, buttonBackground, buttonHoverBackground, ColorFunction, badgeBackground, badgeForeground, progressBarBackground, breadcrumbsForeground, breadcrumbsFocusForeground, breadcrumbsActiveSelectionForeground, breadcrumbsBackground, editorWidgetBorder, inputValidationInfoForeground, inputValidationWarningForeground, inputValidationErrorForeground, menuForeground, menuBackground, menuSelectionForeground, menuSelectionBackground, menuSelectionBorder, menuBorder, menuSeparatorBackground, darken, listFilterWidgetOutline, listFilterWidgetNoMatchesOutline, listFilterWidgetBackground, editorWidgetBackground, treeIndentGuidesStroke } from 'vs/platform/theme/common/colorRegistry'; +import { focusBorder, inputBackground, inputForeground, ColorIdentifier, selectForeground, selectBackground, selectListBackground, selectBorder, inputBorder, foreground, editorBackground, contrastBorder, inputActiveOptionBorder, listFocusBackground, listFocusForeground, listActiveSelectionBackground, listActiveSelectionForeground, listInactiveSelectionForeground, listInactiveSelectionBackground, listInactiveFocusBackground, listHoverBackground, listHoverForeground, listDropBackground, pickerGroupBorder, pickerGroupForeground, widgetShadow, inputValidationInfoBorder, inputValidationInfoBackground, inputValidationWarningBorder, inputValidationWarningBackground, inputValidationErrorBorder, inputValidationErrorBackground, activeContrastBorder, buttonForeground, buttonBackground, buttonHoverBackground, ColorFunction, badgeBackground, badgeForeground, progressBarBackground, breadcrumbsForeground, breadcrumbsFocusForeground, breadcrumbsActiveSelectionForeground, breadcrumbsBackground, editorWidgetBorder, inputValidationInfoForeground, inputValidationWarningForeground, inputValidationErrorForeground, menuForeground, menuBackground, menuSelectionForeground, menuSelectionBackground, menuSelectionBorder, menuBorder, menuSeparatorBackground, darken, listFilterWidgetOutline, listFilterWidgetNoMatchesOutline, listFilterWidgetBackground, editorWidgetBackground, treeIndentGuidesStroke, editorWidgetForeground } from 'vs/platform/theme/common/colorRegistry'; import { IDisposable } from 'vs/base/common/lifecycle'; import { Color } from 'vs/base/common/color'; import { mixin } from 'vs/base/common/objects'; @@ -341,7 +341,7 @@ export interface IDialogStyleOverrides extends IButtonStyleOverrides { export const defaultDialogStyles = { dialogBackground: editorWidgetBackground, - dialogForeground: foreground, + dialogForeground: editorWidgetForeground, dialogShadow: widgetShadow, dialogBorder: contrastBorder, buttonForeground: buttonForeground, diff --git a/src/vs/workbench/common/theme.ts b/src/vs/workbench/common/theme.ts index 2d453924e8a..bc1a15ee2e7 100644 --- a/src/vs/workbench/common/theme.ts +++ b/src/vs/workbench/common/theme.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as nls from 'vs/nls'; -import { registerColor, editorBackground, contrastBorder, transparent, editorWidgetBackground, textLinkForeground, lighten, darken, focusBorder, activeContrastBorder } from 'vs/platform/theme/common/colorRegistry'; +import { registerColor, editorBackground, contrastBorder, transparent, editorWidgetBackground, textLinkForeground, lighten, darken, focusBorder, activeContrastBorder, editorWidgetForeground } from 'vs/platform/theme/common/colorRegistry'; import { Disposable } from 'vs/base/common/lifecycle'; import { IThemeService, ITheme } from 'vs/platform/theme/common/themeService'; import { Color } from 'vs/base/common/color'; @@ -518,9 +518,9 @@ export const NOTIFICATIONS_TOAST_BORDER = registerColor('notificationToast.borde }, nls.localize('notificationToastBorder', "Notification toast border color. Notifications slide in from the bottom right of the window.")); export const NOTIFICATIONS_FOREGROUND = registerColor('notifications.foreground', { - dark: null, - light: null, - hc: null + dark: editorWidgetForeground, + light: editorWidgetForeground, + hc: editorWidgetForeground }, nls.localize('notificationsForeground', "Notifications foreground color. Notifications slide in from the bottom right of the window.")); export const NOTIFICATIONS_BACKGROUND = registerColor('notifications.background', { diff --git a/src/vs/workbench/contrib/codeEditor/browser/accessibility/accessibility.ts b/src/vs/workbench/contrib/codeEditor/browser/accessibility/accessibility.ts index 32d2eeaaa2d..9d6b5c95ba2 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/accessibility/accessibility.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/accessibility/accessibility.ts @@ -27,7 +27,7 @@ import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiati import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { contrastBorder, editorWidgetBackground, widgetShadow } from 'vs/platform/theme/common/colorRegistry'; +import { contrastBorder, editorWidgetBackground, widgetShadow, editorWidgetForeground } from 'vs/platform/theme/common/colorRegistry'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { AccessibilitySupport } from 'vs/platform/accessibility/common/accessibility'; @@ -321,6 +321,11 @@ registerThemingParticipant((theme, collector) => { collector.addRule(`.monaco-editor .accessibilityHelpWidget { background-color: ${widgetBackground}; }`); } + const widgetForeground = theme.getColor(editorWidgetForeground); + if (widgetBackground) { + collector.addRule(`.monaco-editor .accessibilityHelpWidget { color: ${widgetForeground}; }`); + } + const widgetShadowColor = theme.getColor(widgetShadow); if (widgetShadowColor) { collector.addRule(`.monaco-editor .accessibilityHelpWidget { box-shadow: 0 2px 8px ${widgetShadowColor}; }`); diff --git a/src/vs/workbench/contrib/feedback/browser/feedback.ts b/src/vs/workbench/contrib/feedback/browser/feedback.ts index 033a7763448..ec7abc32a8d 100644 --- a/src/vs/workbench/contrib/feedback/browser/feedback.ts +++ b/src/vs/workbench/contrib/feedback/browser/feedback.ts @@ -13,7 +13,7 @@ import { ICommandService } from 'vs/platform/commands/common/commands'; import { IIntegrityService } from 'vs/workbench/services/integrity/common/integrity'; import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; import { attachButtonStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; -import { editorWidgetBackground, widgetShadow, inputBorder, inputForeground, inputBackground, inputActiveOptionBorder, editorBackground, buttonBackground, contrastBorder, darken } from 'vs/platform/theme/common/colorRegistry'; +import { editorWidgetBackground, editorWidgetForeground, widgetShadow, inputBorder, inputForeground, inputBackground, inputActiveOptionBorder, editorBackground, buttonBackground, contrastBorder, darken } from 'vs/platform/theme/common/colorRegistry'; import { IAnchor } from 'vs/base/browser/ui/contextview/contextview'; import { Button } from 'vs/base/browser/ui/button/button'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -278,9 +278,10 @@ export class FeedbackDropdown extends Dropdown { this.sendButton.onDidClick(() => this.onSubmit()); - disposables.add(attachStylerCallback(this.themeService, { widgetShadow, editorWidgetBackground, inputBackground, inputForeground, inputBorder, editorBackground, contrastBorder }, colors => { + disposables.add(attachStylerCallback(this.themeService, { widgetShadow, editorWidgetBackground, editorWidgetForeground, inputBackground, inputForeground, inputBorder, editorBackground, contrastBorder }, colors => { if (this.feedbackForm) { this.feedbackForm.style.backgroundColor = colors.editorWidgetBackground ? colors.editorWidgetBackground.toString() : null; + this.feedbackForm.style.color = colors.editorWidgetForeground ? colors.editorWidgetForeground.toString() : null; this.feedbackForm.style.boxShadow = colors.widgetShadow ? `0 0 8px ${colors.widgetShadow}` : null; } if (this.feedbackDescriptionInput) { diff --git a/src/vs/workbench/contrib/preferences/browser/keybindingWidgets.ts b/src/vs/workbench/contrib/preferences/browser/keybindingWidgets.ts index e546c1fa0d3..0740e3a3ceb 100644 --- a/src/vs/workbench/contrib/preferences/browser/keybindingWidgets.ts +++ b/src/vs/workbench/contrib/preferences/browser/keybindingWidgets.ts @@ -20,7 +20,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition } from 'vs/editor/browser/editorBrowser'; import { attachInputBoxStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { editorWidgetBackground, widgetShadow } from 'vs/platform/theme/common/colorRegistry'; +import { editorWidgetBackground, editorWidgetForeground, widgetShadow } from 'vs/platform/theme/common/colorRegistry'; import { ScrollType } from 'vs/editor/common/editorCommon'; import { SearchWidget, SearchOptions } from 'vs/workbench/contrib/preferences/browser/preferencesWidgets'; import { withNullAsUndefined } from 'vs/base/common/types'; @@ -227,12 +227,17 @@ export class DefineKeybindingWidget extends Widget { const message = nls.localize('defineKeybinding.initial', "Press desired key combination and then press ENTER."); dom.append(this._domNode.domNode, dom.$('.message', undefined, message)); - this._register(attachStylerCallback(this.themeService, { editorWidgetBackground, widgetShadow }, colors => { + this._register(attachStylerCallback(this.themeService, { editorWidgetBackground, editorWidgetForeground, widgetShadow }, colors => { if (colors.editorWidgetBackground) { this._domNode.domNode.style.backgroundColor = colors.editorWidgetBackground.toString(); } else { this._domNode.domNode.style.backgroundColor = null; } + if (colors.editorWidgetForeground) { + this._domNode.domNode.style.color = colors.editorWidgetForeground.toString(); + } else { + this._domNode.domNode.style.color = null; + } if (colors.widgetShadow) { this._domNode.domNode.style.boxShadow = `0 2px 8px ${colors.widgetShadow}`; From e038d65d11588cca573d00a82b1dfcfd7b24cc57 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 1 Jul 2019 13:04:41 +0200 Subject: [PATCH 0821/1449] code review --- .../windows/electron-main/windowsService.ts | 11 +++++------ .../files/browser/fileActions.contribution.ts | 2 ++ .../electron-browser/main.contribution.ts | 14 -------------- .../environment/browser/environmentService.ts | 2 +- 4 files changed, 8 insertions(+), 21 deletions(-) diff --git a/src/vs/platform/windows/electron-main/windowsService.ts b/src/vs/platform/windows/electron-main/windowsService.ts index 8a14f019d40..8e93c0d144f 100644 --- a/src/vs/platform/windows/electron-main/windowsService.ts +++ b/src/vs/platform/windows/electron-main/windowsService.ts @@ -337,14 +337,13 @@ export class WindowsService extends Disposable implements IWindowsService, IURLH console[severity].apply(console, ...messages); } - async showItemInFolder(path: URI): Promise { + async showItemInFolder(resource: URI): Promise { this.logService.trace('windowsService#showItemInFolder'); - if (path.scheme === Schemas.file) { - shell.showItemInFolder(path.fsPath); - } - if (path.scheme === Schemas.userData) { - shell.showItemInFolder(path.path); + if (resource.scheme === Schemas.file) { + shell.showItemInFolder(resource.fsPath); + } else if (resource.scheme === Schemas.userData) { + shell.showItemInFolder(resource.path); } } diff --git a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts index 0502f67ed52..d0d74216710 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts @@ -199,6 +199,8 @@ const copyRelativePathCommand = { // Editor Title Context Menu appendEditorTitleContextMenuItem(COPY_PATH_COMMAND_ID, copyPathCommand.title, ResourceContextKey.IsFileSystemResource, '1_cutcopypaste'); appendEditorTitleContextMenuItem(COPY_RELATIVE_PATH_COMMAND_ID, copyRelativePathCommand.title, ResourceContextKey.IsFileSystemResource, '1_cutcopypaste'); +appendEditorTitleContextMenuItem(REVEAL_IN_OS_COMMAND_ID, REVEAL_IN_OS_LABEL, ResourceContextKey.Scheme.isEqualTo(Schemas.file)); +appendEditorTitleContextMenuItem(REVEAL_IN_OS_COMMAND_ID, REVEAL_IN_OS_LABEL, ContextKeyExpr.and(IsWebContext.toNegated(), ResourceContextKey.Scheme.isEqualTo(Schemas.userData))); appendEditorTitleContextMenuItem(REVEAL_IN_EXPLORER_COMMAND_ID, nls.localize('revealInSideBar', "Reveal in Side Bar"), ResourceContextKey.IsFileSystemResource); function appendEditorTitleContextMenuItem(id: string, title: string, when: ContextKeyExpr, group?: string): void { diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index db7da1c13f4..04680562078 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -25,9 +25,6 @@ import { NoEditorsVisibleContext, SingleEditorGroupsContext } from 'vs/workbench import { IWindowService, IWindowsService } from 'vs/platform/windows/common/windows'; import { LogStorageAction } from 'vs/platform/storage/node/storageService'; import product from 'vs/platform/product/node/product'; -import { REVEAL_IN_OS_COMMAND_ID, REVEAL_IN_OS_LABEL } from '../contrib/files/browser/fileCommands'; -import { ResourceContextKey } from 'vs/workbench/common/resources'; -import { Schemas } from 'vs/base/common/network'; // Actions (function registerActions(): void { @@ -38,17 +35,6 @@ import { Schemas } from 'vs/base/common/network'; const fileCategory = nls.localize('file', "File"); registry.registerWorkbenchAction(new SyncActionDescriptor(CloseWorkspaceAction, CloseWorkspaceAction.ID, CloseWorkspaceAction.LABEL, { primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyCode.KEY_F) }), 'File: Close Workspace', fileCategory); - - MenuRegistry.appendMenuItem(MenuId.EditorTitleContext, { - command: { id: REVEAL_IN_OS_COMMAND_ID, title: REVEAL_IN_OS_LABEL }, - when: ResourceContextKey.Scheme.isEqualTo(Schemas.file), - group: '2_files' - }); - MenuRegistry.appendMenuItem(MenuId.EditorTitleContext, { - command: { id: REVEAL_IN_OS_COMMAND_ID, title: REVEAL_IN_OS_LABEL }, - when: ResourceContextKey.Scheme.isEqualTo(Schemas.userData), - group: '2_files' - }); })(); // Actions: View diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts index 95f1bbf6a30..97213c6b7dc 100644 --- a/src/vs/workbench/services/environment/browser/environmentService.ts +++ b/src/vs/workbench/services/environment/browser/environmentService.ts @@ -71,7 +71,7 @@ export class BrowserWorkbenchEnvironmentService implements IEnvironmentService { this.configuration.remoteAuthority = configuration.remoteAuthority; if (remoteUserDataUri) { - this.appSettingsHome = remoteUserDataUri || URI.file('/User').with({ scheme: Schemas.userData }); + this.appSettingsHome = remoteUserDataUri; this.settingsResource = joinPath(this.appSettingsHome, 'settings.json').with({ scheme: Schemas.userData }); this.keybindingsResource = joinPath(this.appSettingsHome, 'keybindings.json').with({ scheme: Schemas.userData }); } else { From 75795624af122fb00252a2e9e5f0644ff8f27e76 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 1 Jul 2019 14:21:05 +0200 Subject: [PATCH 0822/1449] AsyncDataTree.onDidChangeCollapseState --- src/vs/base/browser/ui/tree/asyncDataTree.ts | 2 ++ src/vs/base/browser/ui/tree/objectTree.ts | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/vs/base/browser/ui/tree/asyncDataTree.ts b/src/vs/base/browser/ui/tree/asyncDataTree.ts index 6208e4e8cce..367815c4c7f 100644 --- a/src/vs/base/browser/ui/tree/asyncDataTree.ts +++ b/src/vs/base/browser/ui/tree/asyncDataTree.ts @@ -312,6 +312,8 @@ export class AsyncDataTree implements IDisposable get onDidFocus(): Event { return this.tree.onDidFocus; } get onDidBlur(): Event { return this.tree.onDidBlur; } + get onDidChangeCollapseState(): Event, TFilterData>> { return this.tree.onDidChangeCollapseState; } + get onDidUpdateOptions(): Event { return this.tree.onDidUpdateOptions; } get filterOnType(): boolean { return this.tree.filterOnType; } diff --git a/src/vs/base/browser/ui/tree/objectTree.ts b/src/vs/base/browser/ui/tree/objectTree.ts index 1236b065722..38bca41901c 100644 --- a/src/vs/base/browser/ui/tree/objectTree.ts +++ b/src/vs/base/browser/ui/tree/objectTree.ts @@ -6,9 +6,10 @@ import { Iterator, ISequence } from 'vs/base/common/iterator'; import { AbstractTree, IAbstractTreeOptions } from 'vs/base/browser/ui/tree/abstractTree'; import { ISpliceable } from 'vs/base/common/sequence'; -import { ITreeNode, ITreeModel, ITreeElement, ITreeRenderer, ITreeSorter } from 'vs/base/browser/ui/tree/tree'; +import { ITreeNode, ITreeModel, ITreeElement, ITreeRenderer, ITreeSorter, ICollapseStateChangeEvent } from 'vs/base/browser/ui/tree/tree'; import { ObjectTreeModel } from 'vs/base/browser/ui/tree/objectTreeModel'; import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; +import { Event } from 'vs/base/common/event'; export interface IObjectTreeOptions extends IAbstractTreeOptions { sorter?: ITreeSorter; @@ -18,6 +19,8 @@ export class ObjectTree, TFilterData = void> extends protected model: ObjectTreeModel; + get onDidChangeCollapseState(): Event> { return this.model.onDidChangeCollapseState; } + constructor( container: HTMLElement, delegate: IListVirtualDelegate, From 82d951bb6d6f249348e02c9ef46e4016cc8b02d5 Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 1 Jul 2019 14:29:46 +0200 Subject: [PATCH 0823/1449] Fix failing Debug tests fixes #76325 --- .../debug/test/browser/debugModel.test.ts | 26 ++++++------------- 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/src/vs/workbench/contrib/debug/test/browser/debugModel.test.ts b/src/vs/workbench/contrib/debug/test/browser/debugModel.test.ts index afeb7c47a19..7aafdc899f3 100644 --- a/src/vs/workbench/contrib/debug/test/browser/debugModel.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/debugModel.test.ts @@ -133,7 +133,7 @@ suite('Debug - Model', () => { assert.equal(model.getSessions(true).length, 1); }); - test.skip('threads multiple wtih allThreadsStopped', () => { + test('threads multiple wtih allThreadsStopped', () => { const threadId1 = 1; const threadName1 = 'firstThread'; const threadId2 = 2; @@ -154,20 +154,15 @@ suite('Debug - Model', () => { }] }); - model.rawUpdate({ - sessionId: session.getId(), - threads: [{ - id: threadId2, - name: threadName2 - }] - }); - // Stopped event with all threads stopped model.rawUpdate({ sessionId: session.getId(), threads: [{ id: threadId1, name: threadName1 + }, { + id: threadId2, + name: threadName2 }], stoppedDetails: { reason: stoppedReason, @@ -221,7 +216,7 @@ suite('Debug - Model', () => { assert.equal(session.getAllThreads().length, 0); }); - test.skip('threads mutltiple without allThreadsStopped', () => { + test('threads mutltiple without allThreadsStopped', () => { const sessionStub = sinon.spy(rawSession, 'stackTrace'); const stoppedThreadId = 1; @@ -243,20 +238,15 @@ suite('Debug - Model', () => { }] }); - model.rawUpdate({ - sessionId: session.getId(), - threads: [{ - id: runningThreadId, - name: runningThreadName - }] - }); - // Stopped event with only one thread stopped model.rawUpdate({ sessionId: session.getId(), threads: [{ id: 1, name: stoppedThreadName + }, { + id: runningThreadId, + name: runningThreadName }], stoppedDetails: { reason: stoppedReason, From 9d75c4e5283731f6afc3f9cd0db4386380c00edc Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 1 Jul 2019 15:20:38 +0200 Subject: [PATCH 0824/1449] cleanup node tasks --- build/download/download.js | 91 ---------------------------- build/download/download.ts | 111 ---------------------------------- build/gulpfile.reh.js | 120 +++++++++++++++---------------------- build/lib/util.js | 40 +------------ build/lib/util.ts | 41 +------------ 5 files changed, 55 insertions(+), 348 deletions(-) delete mode 100644 build/download/download.js delete mode 100644 build/download/download.ts diff --git a/build/download/download.js b/build/download/download.js deleted file mode 100644 index c70bae336a6..00000000000 --- a/build/download/download.js +++ /dev/null @@ -1,91 +0,0 @@ -"use strict"; -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -Object.defineProperty(exports, "__esModule", { value: true }); -const https = require("https"); -const fs = require("fs"); -const path = require("path"); -const cp = require("child_process"); -function ensureDir(filepath) { - if (!fs.existsSync(filepath)) { - ensureDir(path.dirname(filepath)); - fs.mkdirSync(filepath); - } -} -function download(options, destination) { - ensureDir(path.dirname(destination)); - return new Promise((c, e) => { - const fd = fs.openSync(destination, 'w'); - const req = https.get(options, (res) => { - res.on('data', (chunk) => { - fs.writeSync(fd, chunk); - }); - res.on('end', () => { - fs.closeSync(fd); - c(); - }); - }); - req.on('error', (reqErr) => { - console.error(`request to ${options.host}${options.path} failed.`); - console.error(reqErr); - e(reqErr); - }); - }); -} -const MARKER_ARGUMENT = `_download_fork_`; -function base64encode(str) { - return Buffer.from(str, 'utf8').toString('base64'); -} -function base64decode(str) { - return Buffer.from(str, 'base64').toString('utf8'); -} -function downloadInExternalProcess(options) { - const url = `https://${options.requestOptions.host}${options.requestOptions.path}`; - console.log(`Downloading ${url}...`); - return new Promise((c, e) => { - const child = cp.fork(__filename, [MARKER_ARGUMENT, base64encode(JSON.stringify(options))], { - stdio: ['pipe', 'pipe', 'pipe', 'ipc'] - }); - let stderr = []; - child.stderr.on('data', (chunk) => { - stderr.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk); - }); - child.on('exit', (code) => { - if (code === 0) { - // normal termination - console.log(`Finished downloading ${url}.`); - c(); - } - else { - // abnormal termination - console.error(Buffer.concat(stderr).toString()); - e(new Error(`Download of ${url} failed.`)); - } - }); - }); -} -exports.downloadInExternalProcess = downloadInExternalProcess; -function _downloadInExternalProcess() { - let options; - try { - options = JSON.parse(base64decode(process.argv[3])); - } - catch (err) { - console.error(`Cannot read arguments`); - console.error(err); - process.exit(-1); - return; - } - download(options.requestOptions, options.destinationPath).then(() => { - process.exit(0); - }, (err) => { - console.error(err); - process.exit(-2); - }); -} -if (process.argv.length >= 4 && process.argv[2] === MARKER_ARGUMENT) { - // running as forked download script - _downloadInExternalProcess(); -} diff --git a/build/download/download.ts b/build/download/download.ts deleted file mode 100644 index 01ac8864d0b..00000000000 --- a/build/download/download.ts +++ /dev/null @@ -1,111 +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 https from 'https'; -import * as fs from 'fs'; -import * as path from 'path'; -import * as cp from 'child_process'; - -function ensureDir(filepath: string) { - if (!fs.existsSync(filepath)) { - ensureDir(path.dirname(filepath)); - fs.mkdirSync(filepath); - } -} - -function download(options: https.RequestOptions, destination: string): Promise { - ensureDir(path.dirname(destination)); - - return new Promise((c, e) => { - const fd = fs.openSync(destination, 'w'); - const req = https.get(options, (res) => { - res.on('data', (chunk) => { - fs.writeSync(fd, chunk); - }); - res.on('end', () => { - fs.closeSync(fd); - c(); - }); - }); - req.on('error', (reqErr) => { - console.error(`request to ${options.host}${options.path} failed.`); - console.error(reqErr); - e(reqErr); - }); - }); -} - -const MARKER_ARGUMENT = `_download_fork_`; - -function base64encode(str: string): string { - return Buffer.from(str, 'utf8').toString('base64'); -} - -function base64decode(str: string): string { - return Buffer.from(str, 'base64').toString('utf8'); -} - -export interface IDownloadRequestOptions { - host: string; - path: string; -} - -export interface IDownloadOptions { - requestOptions: IDownloadRequestOptions; - destinationPath: string; -} - -export function downloadInExternalProcess(options: IDownloadOptions): Promise { - const url = `https://${options.requestOptions.host}${options.requestOptions.path}`; - console.log(`Downloading ${url}...`); - return new Promise((c, e) => { - const child = cp.fork( - __filename, - [MARKER_ARGUMENT, base64encode(JSON.stringify(options))], - { - stdio: ['pipe', 'pipe', 'pipe', 'ipc'] - } - ); - let stderr: Buffer[] = []; - child.stderr.on('data', (chunk) => { - stderr.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk); - }); - child.on('exit', (code) => { - if (code === 0) { - // normal termination - console.log(`Finished downloading ${url}.`); - c(); - } else { - // abnormal termination - console.error(Buffer.concat(stderr).toString()); - e(new Error(`Download of ${url} failed.`)); - } - }); - }); -} - -function _downloadInExternalProcess() { - let options: IDownloadOptions; - try { - options = JSON.parse(base64decode(process.argv[3])); - } catch (err) { - console.error(`Cannot read arguments`); - console.error(err); - process.exit(-1); - return; - } - - download(options.requestOptions, options.destinationPath).then(() => { - process.exit(0); - }, (err) => { - console.error(err); - process.exit(-2); - }); -} - -if (process.argv.length >= 4 && process.argv[2] === MARKER_ARGUMENT) { - // running as forked download script - _downloadInExternalProcess(); -} diff --git a/build/gulpfile.reh.js b/build/gulpfile.reh.js index 2773a8cb430..42b143dfd35 100644 --- a/build/gulpfile.reh.js +++ b/build/gulpfile.reh.js @@ -11,18 +11,29 @@ const path = require('path'); const es = require('event-stream'); const util = require('./lib/util'); const task = require('./lib/task'); - const vfs = require('vinyl-fs'); const flatmap = require('gulp-flatmap'); const gunzip = require('gulp-gunzip'); const untar = require('gulp-untar'); const File = require('vinyl'); const fs = require('fs'); - +const remote = require('gulp-remote-src'); +const rename = require('gulp-rename'); +const filter = require('gulp-filter'); const cp = require('child_process'); const REPO_ROOT = path.dirname(__dirname); +const BUILD_TARGETS = [ + { platform: 'win32', arch: 'ia32', pkgTarget: 'node8-win-x86' }, + { platform: 'win32', arch: 'x64', pkgTarget: 'node8-win-x64' }, + { platform: 'darwin', arch: null, pkgTarget: 'node8-macos-x64' }, + { platform: 'linux', arch: 'ia32', pkgTarget: 'node8-linux-x86' }, + { platform: 'linux', arch: 'x64', pkgTarget: 'node8-linux-x64' }, + { platform: 'linux', arch: 'armhf', pkgTarget: 'node8-linux-armv7' }, + { platform: 'linux', arch: 'alpine', pkgTarget: 'node8-linux-alpine' }, +]; + const noop = () => { return Promise.resolve(); }; gulp.task('vscode-reh-win32-ia32-min', noop); @@ -39,64 +50,48 @@ function getNodeVersion() { return target; } -function ensureDirs(dirPath) { - if (!fs.existsSync(dirPath)) { - ensureDirs(path.dirname(dirPath)); - fs.mkdirSync(dirPath); - } +const nodeVersion = getNodeVersion(); + +BUILD_TARGETS.forEach(({ platform, arch }) => { + const target = arch ? `${platform}-${arch}` : platform; + + gulp.task(task.define(`node-${target}`, () => { + if (platform === 'darwin') { + arch = 'x64'; + } + + const nodePath = path.join('.build', 'node', `v${nodeVersion}`, `${platform}-${arch}`); + + if (!fs.existsSync(nodePath)) { + util.rimraf(nodePath); + + return nodejs(platform, arch) + .pipe(vfs.dest(nodePath)); + } + + return Promise.resolve(null); + })); +}); + +const defaultNodeTask = gulp.task(`node-${process.platform}-${process.arch}`); + +if (defaultNodeTask) { + gulp.task(task.define('node', defaultNodeTask)); } -/* Downloads the node executable used for the remote server to ./build/node-remote */ -gulp.task(task.define('node-remote', () => { - const VERSION = getNodeVersion(); - const nodePath = path.join('.build', 'node-remote'); - const nodeVersionPath = path.join(nodePath, 'version'); - if (!fs.existsSync(nodeVersionPath) || fs.readFileSync(nodeVersionPath).toString() !== VERSION) { - ensureDirs(nodePath); - util.rimraf(nodePath); - fs.writeFileSync(nodeVersionPath, VERSION); - return nodejs(process.platform, process.arch).pipe(vfs.dest(nodePath)); - } - return vfs.src(nodePath); -})); - function nodejs(platform, arch) { - const VERSION = getNodeVersion(); - if (arch === 'ia32') { arch = 'x86'; } if (platform === 'win32') { - const downloadPath = `/dist/v${VERSION}/win-${arch}/node.exe`; - - return ( - util.download({ host: 'nodejs.org', path: downloadPath }) - .pipe(es.through(function (data) { - // base comes in looking like `https:\nodejs.org\dist\v10.2.1\win-x64\node.exe` - this.emit('data', new File({ - path: data.path, - base: data.base.replace(/\\node\.exe$/, ''), - contents: data.contents, - stat: { - isFile: true, - mode: /* 100755 */ 33261 - } - })); - })) - ); + return remote(`/dist/v${nodeVersion}/win-${arch}/node.exe`, { base: 'https://nodejs.org' }) + .pipe(rename('node.exe')); } if (arch === 'alpine') { - return es.readArray([ - new File({ - path: 'node', - contents: cp.execSync(`docker run --rm node:${VERSION}-alpine /bin/sh -c 'cat \`which node\`'`, { maxBuffer: 100 * 1024 * 1024, encoding: 'buffer' }), - stat: { - mode: parseInt('755', 8) - } - }) - ]); + const contents = cp.execSync(`docker run --rm node:${nodeVersion}-alpine /bin/sh -c 'cat \`which node\`'`, { maxBuffer: 100 * 1024 * 1024, encoding: 'buffer' }); + return es.readArray([new File({ path: 'node', contents, stat: { mode: parseInt('755', 8) } })]); } if (platform === 'darwin') { @@ -107,28 +102,11 @@ function nodejs(platform, arch) { arch = 'armv7l'; } - const downloadPath = `/dist/v${VERSION}/node-v${VERSION}-${platform}-${arch}.tar.gz`; - - return ( - util.download({ host: 'nodejs.org', path: downloadPath }) - .pipe(flatmap(stream => stream.pipe(gunzip()).pipe(untar()))) - .pipe(es.through(function (data) { - // base comes in looking like `https:/nodejs.org/dist/v8.9.3/node-v8.9.3-darwin-x64.tar.gz` - // => we must remove the `.tar.gz` - // Also, keep only bin/node - if (/\/bin\/node$/.test(data.path)) { - this.emit('data', new File({ - path: data.path.replace(/bin\/node$/, 'node'), - base: data.base.replace(/\.tar\.gz$/, ''), - contents: data.contents, - stat: { - isFile: true, - mode: /* 100755 */ 33261 - } - })); - } - })) - ); + return remote(`/dist/v${nodeVersion}/node-v${nodeVersion}-${platform}-${arch}.tar.gz`, { base: 'https://nodejs.org' }) + .pipe(flatmap(stream => stream.pipe(gunzip()).pipe(untar()))) + .pipe(filter('**/node')) + .pipe(util.setExecutableBit('**')) + .pipe(rename('node')); } function mixinServer(watch) { diff --git a/build/lib/util.js b/build/lib/util.js index 2583e815f36..be2670261d7 100644 --- a/build/lib/util.js +++ b/build/lib/util.js @@ -13,8 +13,6 @@ const fs = require("fs"); const _rimraf = require("rimraf"); const git = require("./git"); const VinylFile = require("vinyl"); -const download_1 = require("../download/download"); -const REPO_ROOT = path.join(__dirname, '../../'); const NoCancellationToken = { isCancellationRequested: () => false }; function incremental(streamProvider, initial, supportsCancellation) { const input = es.through(); @@ -68,6 +66,9 @@ function fixWin32DirectoryPermissions() { exports.fixWin32DirectoryPermissions = fixWin32DirectoryPermissions; function setExecutableBit(pattern) { const setBit = es.mapSync(f => { + if (!f.stat) { + f.stat = { isFile() { return true; } }; + } f.stat.mode = /* 100755 */ 33261; return f; }); @@ -218,38 +219,3 @@ function versionStringToNumber(versionStr) { return parseInt(match[1], 10) * 1e4 + parseInt(match[2], 10) * 1e2 + parseInt(match[3], 10); } exports.versionStringToNumber = versionStringToNumber; -function download(requestOptions) { - const result = es.through(); - const filename = path.join(REPO_ROOT, `.build/tmp-${Date.now()}-${path.posix.basename(requestOptions.path)}`); - const opts = { - requestOptions: requestOptions, - destinationPath: filename - }; - download_1.downloadInExternalProcess(opts).then(() => { - fs.stat(filename, (err, stat) => { - if (err) { - result.emit('error', err); - return; - } - fs.readFile(filename, (err, data) => { - if (err) { - result.emit('error', err); - return; - } - fs.unlink(filename, () => { - result.emit('data', new VinylFile({ - path: path.normalize(requestOptions.path), - stat: stat, - base: path.normalize(requestOptions.path), - contents: data - })); - result.emit('end'); - }); - }); - }); - }, (err) => { - result.emit('error', err); - }); - return result; -} -exports.download = download; diff --git a/build/lib/util.ts b/build/lib/util.ts index 69f3d3608bb..578271e6648 100644 --- a/build/lib/util.ts +++ b/build/lib/util.ts @@ -17,9 +17,6 @@ import * as git from './git'; import * as VinylFile from 'vinyl'; import { ThroughStream } from 'through'; import * as sm from 'source-map'; -import { IDownloadOptions, downloadInExternalProcess, IDownloadRequestOptions } from '../download/download'; - -const REPO_ROOT = path.join(__dirname, '../../'); export interface ICancellationToken { isCancellationRequested(): boolean; @@ -96,6 +93,9 @@ export function fixWin32DirectoryPermissions(): NodeJS.ReadWriteStream { export function setExecutableBit(pattern?: string | string[]): NodeJS.ReadWriteStream { const setBit = es.mapSync(f => { + if (!f.stat) { + f.stat = { isFile() { return true; } } as any; + } f.stat.mode = /* 100755 */ 33261; return f; }); @@ -281,38 +281,3 @@ export function versionStringToNumber(versionStr: string) { return parseInt(match[1], 10) * 1e4 + parseInt(match[2], 10) * 1e2 + parseInt(match[3], 10); } - -export function download(requestOptions: IDownloadRequestOptions): NodeJS.ReadWriteStream { - const result = es.through(); - const filename = path.join(REPO_ROOT, `.build/tmp-${Date.now()}-${path.posix.basename(requestOptions.path)}`); - const opts: IDownloadOptions = { - requestOptions: requestOptions, - destinationPath: filename - }; - downloadInExternalProcess(opts).then(() => { - fs.stat(filename, (err, stat) => { - if (err) { - result.emit('error', err); - return; - } - fs.readFile(filename, (err, data) => { - if (err) { - result.emit('error', err); - return; - } - fs.unlink(filename, () => { - result.emit('data', new VinylFile({ - path: path.normalize(requestOptions.path), - stat: stat, - base: path.normalize(requestOptions.path), - contents: data - })); - result.emit('end'); - }); - }); - }); - }, (err) => { - result.emit('error', err); - }); - return result; -} From eaa2d3bb23ce6dc79eadb497ea697e4c192ece6a Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 1 Jul 2019 15:20:56 +0200 Subject: [PATCH 0825/1449] introduce extHostLabelService and mainThreadLabelService fixes #75881 --- .../api/browser/extensionHost.contribution.ts | 1 + .../api/browser/mainThreadFileSystem.ts | 15 -------- .../api/browser/mainThreadLabelService.ts | 36 +++++++++++++++++++ .../workbench/api/common/extHost.protocol.ts | 13 +++++-- .../workbench/api/common/extHostFileSystem.ts | 10 ------ .../api/common/extHostLabelService.ts | 27 ++++++++++++++ src/vs/workbench/api/node/extHost.api.impl.ts | 4 ++- 7 files changed, 78 insertions(+), 28 deletions(-) create mode 100644 src/vs/workbench/api/browser/mainThreadLabelService.ts create mode 100644 src/vs/workbench/api/common/extHostLabelService.ts diff --git a/src/vs/workbench/api/browser/extensionHost.contribution.ts b/src/vs/workbench/api/browser/extensionHost.contribution.ts index 2f07210ca5b..dca4efc3835 100644 --- a/src/vs/workbench/api/browser/extensionHost.contribution.ts +++ b/src/vs/workbench/api/browser/extensionHost.contribution.ts @@ -54,6 +54,7 @@ import './mainThreadWebview'; import './mainThreadWorkspace'; import './mainThreadComments'; import './mainThreadTask'; +import './mainThreadLabelService'; import 'vs/workbench/api/common/apiCommands'; export class ExtensionPoints implements IWorkbenchContribution { diff --git a/src/vs/workbench/api/browser/mainThreadFileSystem.ts b/src/vs/workbench/api/browser/mainThreadFileSystem.ts index cb84e3c1323..331ba328297 100644 --- a/src/vs/workbench/api/browser/mainThreadFileSystem.ts +++ b/src/vs/workbench/api/browser/mainThreadFileSystem.ts @@ -9,7 +9,6 @@ import { URI, UriComponents } from 'vs/base/common/uri'; import { FileWriteOptions, FileSystemProviderCapabilities, IFileChange, IFileService, IFileSystemProvider, IStat, IWatchOptions, FileType, FileOverwriteOptions, FileDeleteOptions, FileOpenOptions, IFileStat } from 'vs/platform/files/common/files'; import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { ExtHostContext, ExtHostFileSystemShape, IExtHostContext, IFileChangeDto, MainContext, MainThreadFileSystemShape } from '../common/extHost.protocol'; -import { ResourceLabelFormatter, ILabelService } from 'vs/platform/label/common/label'; import { VSBuffer } from 'vs/base/common/buffer'; @extHostNamedCustomer(MainContext.MainThreadFileSystem) @@ -17,12 +16,10 @@ export class MainThreadFileSystem implements MainThreadFileSystemShape { private readonly _proxy: ExtHostFileSystemShape; private readonly _fileProvider = new Map(); - private readonly _resourceLabelFormatters = new Map(); constructor( extHostContext: IExtHostContext, @IFileService private readonly _fileService: IFileService, - @ILabelService private readonly _labelService: ILabelService ) { this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostFileSystem); } @@ -41,18 +38,6 @@ export class MainThreadFileSystem implements MainThreadFileSystemShape { this._fileProvider.delete(handle); } - $registerResourceLabelFormatter(handle: number, formatter: ResourceLabelFormatter): void { - // Dynamicily registered formatters should have priority over those contributed via package.json - formatter.priority = true; - const disposable = this._labelService.registerFormatter(formatter); - this._resourceLabelFormatters.set(handle, disposable); - } - - $unregisterResourceLabelFormatter(handle: number): void { - dispose(this._resourceLabelFormatters.get(handle)); - this._resourceLabelFormatters.delete(handle); - } - $onFileSystemChange(handle: number, changes: IFileChangeDto[]): void { const fileProvider = this._fileProvider.get(handle); if (!fileProvider) { diff --git a/src/vs/workbench/api/browser/mainThreadLabelService.ts b/src/vs/workbench/api/browser/mainThreadLabelService.ts new file mode 100644 index 00000000000..a0b85358bda --- /dev/null +++ b/src/vs/workbench/api/browser/mainThreadLabelService.ts @@ -0,0 +1,36 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { MainContext, MainThreadLabelServiceShape, IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { ResourceLabelFormatter, ILabelService } from 'vs/platform/label/common/label'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; + +@extHostNamedCustomer(MainContext.MainThreadLabelService) +export class MainThreadLabelService implements MainThreadLabelServiceShape { + + private readonly _resourceLabelFormatters = new Map(); + + constructor( + _: IExtHostContext, + @ILabelService private readonly _labelService: ILabelService + ) { } + + $registerResourceLabelFormatter(handle: number, formatter: ResourceLabelFormatter): void { + // Dynamicily registered formatters should have priority over those contributed via package.json + formatter.priority = true; + const disposable = this._labelService.registerFormatter(formatter); + this._resourceLabelFormatters.set(handle, disposable); + } + + $unregisterResourceLabelFormatter(handle: number): void { + dispose(this._resourceLabelFormatters.get(handle)); + this._resourceLabelFormatters.delete(handle); + } + + dispose(): void { + // noop + } +} \ No newline at end of file diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index f9f60f7dde7..6b747ffac41 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -592,8 +592,6 @@ export interface IFileChangeDto { export interface MainThreadFileSystemShape extends IDisposable { $registerFileSystemProvider(handle: number, scheme: string, capabilities: files.FileSystemProviderCapabilities): void; $unregisterProvider(handle: number): void; - $registerResourceLabelFormatter(handle: number, formatter: ResourceLabelFormatter): void; - $unregisterResourceLabelFormatter(handle: number): void; $onFileSystemChange(handle: number, resource: IFileChangeDto[]): void; $stat(uri: UriComponents): Promise; @@ -606,6 +604,11 @@ export interface MainThreadFileSystemShape extends IDisposable { $delete(resource: UriComponents, opts: files.FileDeleteOptions): Promise; } +export interface MainThreadLabelServiceShape extends IDisposable { + $registerResourceLabelFormatter(handle: number, formatter: ResourceLabelFormatter): void; + $unregisterResourceLabelFormatter(handle: number): void; +} + export interface MainThreadSearchShape extends IDisposable { $registerFileSearchProvider(handle: number, scheme: string): void; $registerTextSearchProvider(handle: number, scheme: string): void; @@ -832,6 +835,10 @@ export interface ExtHostFileSystemShape { $write(handle: number, fd: number, pos: number, data: VSBuffer): Promise; } +export interface ExtHostLabelServiceShape { + $registerResourceLabelFormatter(formatter: ResourceLabelFormatter): IDisposable; +} + export interface ExtHostSearchShape { $provideFileSearchResults(handle: number, session: number, query: search.IRawQuery, token: CancellationToken): Promise; $provideTextSearchResults(handle: number, session: number, query: search.IRawTextQuery, token: CancellationToken): Promise; @@ -1331,6 +1338,7 @@ export const MainContext = { MainThreadSearch: createMainId('MainThreadSearch'), MainThreadTask: createMainId('MainThreadTask'), MainThreadWindow: createMainId('MainThreadWindow'), + MainThreadLabelService: createMainId('MainThreadLabelService') }; export const ExtHostContext = { @@ -1364,4 +1372,5 @@ export const ExtHostContext = { ExtHostStorage: createMainId('ExtHostStorage'), ExtHostUrls: createExtId('ExtHostUrls'), ExtHostOutputService: createMainId('ExtHostOutputService'), + ExtHosLabelService: createMainId('ExtHostLabelService') }; diff --git a/src/vs/workbench/api/common/extHostFileSystem.ts b/src/vs/workbench/api/common/extHostFileSystem.ts index 778a5cb67ad..fe97cae97ee 100644 --- a/src/vs/workbench/api/common/extHostFileSystem.ts +++ b/src/vs/workbench/api/common/extHostFileSystem.ts @@ -12,7 +12,6 @@ import { FileChangeType } from 'vs/workbench/api/common/extHostTypes'; import * as typeConverter from 'vs/workbench/api/common/extHostTypeConverters'; import { ExtHostLanguageFeatures } from 'vs/workbench/api/common/extHostLanguageFeatures'; import { Schemas } from 'vs/base/common/network'; -import { ResourceLabelFormatter } from 'vs/platform/label/common/label'; import { State, StateMachine, LinkComputer, Edge } from 'vs/editor/common/modes/linkComputer'; import { commonPrefixLength } from 'vs/base/common/strings'; import { CharCode } from 'vs/base/common/charCode'; @@ -241,15 +240,6 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { }); } - registerResourceLabelFormatter(formatter: ResourceLabelFormatter): IDisposable { - const handle = this._handlePool++; - this._proxy.$registerResourceLabelFormatter(handle, formatter); - - return toDisposable(() => { - this._proxy.$unregisterResourceLabelFormatter(handle); - }); - } - private static _asIStat(stat: vscode.FileStat): files.IStat { const { type, ctime, mtime, size } = stat; return { type, ctime, mtime, size }; diff --git a/src/vs/workbench/api/common/extHostLabelService.ts b/src/vs/workbench/api/common/extHostLabelService.ts new file mode 100644 index 00000000000..3a7eec9b5a1 --- /dev/null +++ b/src/vs/workbench/api/common/extHostLabelService.ts @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { ResourceLabelFormatter } from 'vs/platform/label/common/label'; +import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { MainThreadLabelServiceShape, ExtHostLabelServiceShape, MainContext, IMainContext } from 'vs/workbench/api/common/extHost.protocol'; + +export class ExtHostLabelService implements ExtHostLabelServiceShape { + + private readonly _proxy: MainThreadLabelServiceShape; + private _handlePool: number = 0; + + constructor(mainContext: IMainContext) { + this._proxy = mainContext.getProxy(MainContext.MainThreadLabelService); + } + + $registerResourceLabelFormatter(formatter: ResourceLabelFormatter): IDisposable { + const handle = this._handlePool++; + this._proxy.$registerResourceLabelFormatter(handle, formatter); + + return toDisposable(() => { + this._proxy.$unregisterResourceLabelFormatter(handle); + }); + } +} \ No newline at end of file diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 3ad15b30f7d..4c3395f98a6 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -67,6 +67,7 @@ import { values } from 'vs/base/common/collections'; import { Schemas } from 'vs/base/common/network'; import { IURITransformer } from 'vs/base/common/uriIpc'; import { ExtHostEditorInsets } from 'vs/workbench/api/common/extHostCodeInsets'; +import { ExtHostLabelService } from 'vs/workbench/api/common/extHostLabelService'; export interface IExtensionApiFactory { (extension: IExtensionDescription, registry: ExtensionDescriptionRegistry, configProvider: ExtHostConfigProvider): typeof vscode; @@ -125,6 +126,7 @@ export function createApiFactory( const extHostProgress = rpcProtocol.set(ExtHostContext.ExtHostProgress, new ExtHostProgress(rpcProtocol.getProxy(MainContext.MainThreadProgress))); const extHostOutputService = rpcProtocol.set(ExtHostContext.ExtHostOutputService, new ExtHostOutputService(LogOutputChannelFactory, initData.logsLocation, rpcProtocol)); rpcProtocol.set(ExtHostContext.ExtHostStorage, extHostStorage); + const extHostLabelService = rpcProtocol.set(ExtHostContext.ExtHosLabelService, new ExtHostLabelService(rpcProtocol)); if (initData.remote.isRemote && initData.remote.authority) { extHostTask.registerTaskSystem(Schemas.vscodeRemote, { @@ -694,7 +696,7 @@ export function createApiFactory( return extensionService.registerRemoteAuthorityResolver(authorityPrefix, resolver); }), registerResourceLabelFormatter: proposedApiFunction(extension, (formatter: vscode.ResourceLabelFormatter) => { - return extHostFileSystem.registerResourceLabelFormatter(formatter); + return extHostLabelService.$registerResourceLabelFormatter(formatter); }), onDidRenameFile: proposedApiFunction(extension, (listener: (e: vscode.FileRenameEvent) => any, thisArg?: any, disposables?: vscode.Disposable[]) => { return extHostFileSystemEvent.onDidRenameFile(listener, thisArg, disposables); From 8af2dbb3b973bec267a0c547965a57da3354b347 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 1 Jul 2019 15:49:20 +0200 Subject: [PATCH 0826/1449] separate compile-build from product builds --- build/gulpfile.ci.js | 10 ++++++++++ build/gulpfile.vscode.js | 29 ++++++++++------------------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/build/gulpfile.ci.js b/build/gulpfile.ci.js index ca781a91378..ab3746af2a6 100644 --- a/build/gulpfile.ci.js +++ b/build/gulpfile.ci.js @@ -9,51 +9,61 @@ const gulp = require('gulp'); const task = require('./lib/task'); gulp.task(task.define('win32-ia32', task.series( + gulp.task('compile-build'), gulp.task('compile-extensions-build'), gulp.task('vscode-win32-ia32-ci') ))); gulp.task(task.define('win32-ia32-min', task.series( + gulp.task('compile-build'), gulp.task('compile-extensions-build'), gulp.task('vscode-win32-ia32-min-ci') ))); gulp.task(task.define('win32-x64', task.series( + gulp.task('compile-build'), gulp.task('compile-extensions-build'), gulp.task('vscode-win32-x64-ci') ))); gulp.task(task.define('win32-x64-min', task.series( + gulp.task('compile-build'), gulp.task('compile-extensions-build'), gulp.task('vscode-win32-x64-min-ci') ))); gulp.task(task.define('linux-ia32', task.series( + gulp.task('compile-build'), gulp.task('compile-extensions-build'), gulp.task('vscode-linux-ia32-ci') ))); gulp.task(task.define('linux-ia32-min', task.series( + gulp.task('compile-build'), gulp.task('compile-extensions-build'), gulp.task('vscode-linux-ia32-min-ci') ))); gulp.task(task.define('linux-x64', task.series( + gulp.task('compile-build'), gulp.task('compile-extensions-build'), gulp.task('vscode-linux-x64-ci') ))); gulp.task(task.define('linux-x64-min', task.series( + gulp.task('compile-build'), gulp.task('compile-extensions-build'), gulp.task('vscode-linux-x64-min-ci') ))); gulp.task(task.define('darwin', task.series( + gulp.task('compile-build'), gulp.task('compile-extensions-build'), gulp.task('vscode-darwin-ci') ))); gulp.task(task.define('darwin-min', task.series( + gulp.task('compile-build'), gulp.task('compile-extensions-build'), gulp.task('vscode-darwin-min-ci') ))); diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 7f0384d69cf..90082925121 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -92,10 +92,7 @@ const BUNDLED_FILE_HEADER = [ ].join('\n'); const optimizeVSCodeTask = task.define('optimize-vscode', task.series( - task.parallel( - util.rimraf('out-vscode'), - compileBuildTask - ), + util.rimraf('out-vscode'), common.optimizeTask({ src: 'out-build', entryPoints: vscodeEntryPoints, @@ -107,23 +104,16 @@ const optimizeVSCodeTask = task.define('optimize-vscode', task.series( }) )); - -const optimizeIndexJSTask = task.define('optimize-index-js', task.series( +const sourceMappingURLBase = `https://ticino.blob.core.windows.net/sourcemaps/${commit}`; +const minifyVSCodeTask = task.define('minify-vscode', task.series( optimizeVSCodeTask, + util.rimraf('out-vscode-min'), () => { const fullpath = path.join(process.cwd(), 'out-vscode/bootstrap-window.js'); const contents = fs.readFileSync(fullpath).toString(); const newContents = contents.replace('[/*BUILD->INSERT_NODE_MODULES*/]', JSON.stringify(nodeModules)); fs.writeFileSync(fullpath, newContents); - } -)); - -const sourceMappingURLBase = `https://ticino.blob.core.windows.net/sourcemaps/${commit}`; -const minifyVSCodeTask = task.define('minify-vscode', task.series( - task.parallel( - util.rimraf('out-vscode-min'), - optimizeIndexJSTask - ), + }, common.minifyTask('out-vscode', `${sourceMappingURLBase}/core`) )); @@ -446,16 +436,17 @@ BUILD_TARGETS.forEach(buildTarget => { const sourceFolderName = `out-vscode${dashed(minified)}`; const destinationFolderName = `VSCode${dashed(platform)}${dashed(arch)}`; - const vscodeCITaskWhat = task.define(`vscode${dashed(platform)}${dashed(arch)}${dashed(minified)}-ci`, task.series( - util.rimraf(path.join(buildRoot, destinationFolderName)), + const vscodeTaskCI = task.define(`vscode${dashed(platform)}${dashed(arch)}${dashed(minified)}-ci`, task.series( minified ? minifyVSCodeTask : optimizeVSCodeTask, + util.rimraf(path.join(buildRoot, destinationFolderName)), packageTask(platform, arch, sourceFolderName, destinationFolderName, opts) )); - gulp.task(vscodeCITaskWhat); + gulp.task(vscodeTaskCI); const vscodeTask = task.define(`vscode${dashed(platform)}${dashed(arch)}${dashed(minified)}`, task.series( + compileBuildTask, compileExtensionsBuildTask, - vscodeCITaskWhat + vscodeTaskCI )); gulp.task(vscodeTask); }); From bfcdaae74021025505bd79afe8662aba4104faf5 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Mon, 1 Jul 2019 15:52:44 +0200 Subject: [PATCH 0827/1449] Show task errors on config changes fixes #76138 --- src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts index ed18efcb64a..d6efef22ba6 100644 --- a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts +++ b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts @@ -426,7 +426,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer } protected showOutput(runSource: TaskRunSource = TaskRunSource.User): void { - if (runSource === TaskRunSource.User) { + if ((runSource === TaskRunSource.User) || (runSource === TaskRunSource.ConfigurationChange)) { this.notificationService.prompt(Severity.Warning, nls.localize('taskServiceOutputPrompt', 'There are task errors. See the output for details.'), [{ label: nls.localize('showOutput', "Show output"), From d722d9a1a2c4d82b761ecc63dc50c128a18f2be4 Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 1 Jul 2019 15:57:20 +0200 Subject: [PATCH 0828/1449] fixes #76264 --- .../contrib/files/browser/fileActions.ts | 38 ++++++++++++------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/contrib/files/browser/fileActions.ts b/src/vs/workbench/contrib/files/browser/fileActions.ts index f73012495b7..1fd4fba81b1 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.ts @@ -997,7 +997,7 @@ CommandsRegistry.registerCommand({ handler: downloadFileHandler }); -export const pasteFileHandler = (accessor: ServicesAccessor) => { +export const pasteFileHandler = async (accessor: ServicesAccessor) => { const listService = accessor.get(IListService); const clipboardService = accessor.get(IClipboardService); const explorerService = accessor.get(IExplorerService); @@ -1012,13 +1012,14 @@ export const pasteFileHandler = (accessor: ServicesAccessor) => { const element = explorerContext.stat || explorerService.roots[0]; // Check if target is ancestor of pasted folder - Promise.all(toPaste.map(fileToPaste => { + const stats = await Promise.all(toPaste.map(async fileToPaste => { if (element.resource.toString() !== fileToPaste.toString() && resources.isEqualOrParent(element.resource, fileToPaste, !isLinux /* ignorecase */)) { throw new Error(nls.localize('fileIsAncestor', "File to paste is an ancestor of the destination folder")); } - return fileService.resolve(fileToPaste).then(fileToPasteStat => { + try { + const fileToPasteStat = await fileService.resolve(fileToPaste); // Find target let target: ExplorerItem; @@ -1031,18 +1032,29 @@ export const pasteFileHandler = (accessor: ServicesAccessor) => { const targetFile = findValidPasteFileTarget(target, { resource: fileToPaste, isDirectory: fileToPasteStat.isDirectory, allowOverwirte: pasteShouldMove }); // Move/Copy File - return pasteShouldMove ? textFileService.move(fileToPaste, targetFile) : fileService.copy(fileToPaste, targetFile); - }, error => { + if (pasteShouldMove) { + return await textFileService.move(fileToPaste, targetFile); + } else { + return await fileService.copy(fileToPaste, targetFile); + } + } catch (e) { onError(notificationService, new Error(nls.localize('fileDeleted', "File to paste was deleted or moved meanwhile"))); - }); - })).then((stat) => { - if (pasteShouldMove) { - // Cut is done. Make sure to clear cut state. - explorerService.setToCopy([], false); + return undefined; } - if (stat.length === 1 && !stat[0].isDirectory) { - editorService.openEditor({ resource: stat[0].resource, options: { pinned: true, preserveFocus: true } }).then(undefined, onUnexpectedError); + })); + + if (pasteShouldMove) { + // Cut is done. Make sure to clear cut state. + explorerService.setToCopy([], false); + } + if (stats.length === 1) { + const stat = stats[0]; + if (stat) { + if (!stat.isDirectory) { + await editorService.openEditor({ resource: stat.resource, options: { pinned: true, preserveFocus: true } }); + } + await explorerService.select(stat.resource); } - }); + } } }; From 039a49a5eab688800b0226cf2c4addc797c94a86 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Mon, 1 Jul 2019 16:15:37 +0200 Subject: [PATCH 0829/1449] Fix: Accept All Current/Incoming for multiple files (fixes #63621) --- .../merge-conflict/src/commandHandler.ts | 40 +++++++++++++++++-- .../src/documentMergeConflict.ts | 16 ++++---- extensions/merge-conflict/src/interfaces.ts | 2 +- 3 files changed, 45 insertions(+), 13 deletions(-) diff --git a/extensions/merge-conflict/src/commandHandler.ts b/extensions/merge-conflict/src/commandHandler.ts index c4a59721065..f79c6650af0 100644 --- a/extensions/merge-conflict/src/commandHandler.ts +++ b/extensions/merge-conflict/src/commandHandler.ts @@ -34,8 +34,8 @@ export default class CommandHandler implements vscode.Disposable { this.registerTextEditorCommand('merge-conflict.accept.incoming', this.acceptIncoming), this.registerTextEditorCommand('merge-conflict.accept.selection', this.acceptSelection), this.registerTextEditorCommand('merge-conflict.accept.both', this.acceptBoth), - this.registerTextEditorCommand('merge-conflict.accept.all-current', this.acceptAllCurrent), - this.registerTextEditorCommand('merge-conflict.accept.all-incoming', this.acceptAllIncoming), + this.registerTextEditorCommand('merge-conflict.accept.all-current', this.acceptAllCurrent, this.acceptAllCurrentResources), + this.registerTextEditorCommand('merge-conflict.accept.all-incoming', this.acceptAllIncoming, this.acceptAllIncomingResources), this.registerTextEditorCommand('merge-conflict.accept.all-both', this.acceptAllBoth), this.registerTextEditorCommand('merge-conflict.next', this.navigateNext), this.registerTextEditorCommand('merge-conflict.previous', this.navigatePrevious), @@ -43,8 +43,11 @@ export default class CommandHandler implements vscode.Disposable { ); } - private registerTextEditorCommand(command: string, cb: (editor: vscode.TextEditor, ...args: any[]) => Promise) { + private registerTextEditorCommand(command: string, cb: (editor: vscode.TextEditor, ...args: any[]) => Promise, resourceCB?: (uris: vscode.Uri[]) => Promise) { return vscode.commands.registerCommand(command, (...args) => { + if (resourceCB && args.length && args.every(arg => arg && arg.resourceUri)) { + return resourceCB.call(this, args.map(arg => arg.resourceUri)); + } const editor = vscode.window.activeTextEditor; return editor && cb.call(this, editor, ...args); }); @@ -70,6 +73,14 @@ export default class CommandHandler implements vscode.Disposable { return this.acceptAll(interfaces.CommitType.Incoming, editor); } + acceptAllCurrentResources(resources: vscode.Uri[]): Promise { + return this.acceptAllResources(interfaces.CommitType.Current, resources); + } + + acceptAllIncomingResources(resources: vscode.Uri[]): Promise { + return this.acceptAllResources(interfaces.CommitType.Incoming, resources); + } + acceptAllBoth(editor: vscode.TextEditor): Promise { return this.acceptAll(interfaces.CommitType.Both, editor); } @@ -259,10 +270,31 @@ export default class CommandHandler implements vscode.Disposable { // Apply all changes as one edit await editor.edit((edit) => conflicts.forEach(conflict => { - conflict.applyEdit(type, editor, edit); + conflict.applyEdit(type, editor.document, edit); })); } + private async acceptAllResources(type: interfaces.CommitType, resources: vscode.Uri[]): Promise { + const documents = await Promise.all(resources.map(resource => vscode.workspace.openTextDocument(resource))); + const edit = new vscode.WorkspaceEdit(); + for (const document of documents) { + const conflicts = await this.tracker.getConflicts(document); + + if (!conflicts || conflicts.length === 0) { + continue; + } + + // For get the current state of the document, as we know we are doing to do a large edit + this.tracker.forget(document); + + // Apply all changes as one edit + conflicts.forEach(conflict => { + conflict.applyEdit(type, document, { replace: (range, newText) => edit.replace(document.uri, range, newText) }); + }); + } + vscode.workspace.applyEdit(edit); + } + private async findConflictContainingSelection(editor: vscode.TextEditor, conflicts?: interfaces.IDocumentMergeConflict[]): Promise { if (!conflicts) { diff --git a/extensions/merge-conflict/src/documentMergeConflict.ts b/extensions/merge-conflict/src/documentMergeConflict.ts index 3bf94a16ea7..560c7ed8c72 100644 --- a/extensions/merge-conflict/src/documentMergeConflict.ts +++ b/extensions/merge-conflict/src/documentMergeConflict.ts @@ -25,14 +25,14 @@ export class DocumentMergeConflict implements interfaces.IDocumentMergeConflict if (edit) { - this.applyEdit(type, editor, edit); + this.applyEdit(type, editor.document, edit); return Promise.resolve(true); } - return editor.edit((edit) => this.applyEdit(type, editor, edit)); + return editor.edit((edit) => this.applyEdit(type, editor.document, edit)); } - public applyEdit(type: interfaces.CommitType, editor: vscode.TextEditor, edit: vscode.TextEditorEdit): void { + public applyEdit(type: interfaces.CommitType, document: vscode.TextDocument, edit: { replace(range: vscode.Range, newText: string): void; }): void { // Each conflict is a set of ranges as follows, note placements or newlines // which may not in in spans @@ -45,24 +45,24 @@ export class DocumentMergeConflict implements interfaces.IDocumentMergeConflict // ] if (type === interfaces.CommitType.Current) { // Replace [ Conflict Range ] with [ Current Content ] - let content = editor.document.getText(this.current.content); + let content = document.getText(this.current.content); this.replaceRangeWithContent(content, edit); } else if (type === interfaces.CommitType.Incoming) { - let content = editor.document.getText(this.incoming.content); + let content = document.getText(this.incoming.content); this.replaceRangeWithContent(content, edit); } else if (type === interfaces.CommitType.Both) { // Replace [ Conflict Range ] with [ Current Content ] + \n + [ Incoming Content ] - const currentContent = editor.document.getText(this.current.content); - const incomingContent = editor.document.getText(this.incoming.content); + const currentContent = document.getText(this.current.content); + const incomingContent = document.getText(this.incoming.content); edit.replace(this.range, currentContent.concat(incomingContent)); } } - private replaceRangeWithContent(content: string, edit: vscode.TextEditorEdit) { + private replaceRangeWithContent(content: string, edit: { replace(range: vscode.Range, newText: string): void; }) { if (this.isNewlineOnly(content)) { edit.replace(this.range, ''); return; diff --git a/extensions/merge-conflict/src/interfaces.ts b/extensions/merge-conflict/src/interfaces.ts index bab96d13318..836bb5baa5a 100644 --- a/extensions/merge-conflict/src/interfaces.ts +++ b/extensions/merge-conflict/src/interfaces.ts @@ -25,7 +25,7 @@ export interface IExtensionConfiguration { export interface IDocumentMergeConflict extends IDocumentMergeConflictDescriptor { commitEdit(type: CommitType, editor: vscode.TextEditor, edit?: vscode.TextEditorEdit): Thenable; - applyEdit(type: CommitType, editor: vscode.TextEditor, edit: vscode.TextEditorEdit): void; + applyEdit(type: CommitType, document: vscode.TextDocument, edit: { replace(range: vscode.Range, newText: string): void; }): void; } export interface IDocumentMergeConflictDescriptor { From a570522203fef3ff5d9cb204125e899f7ed78bbb Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Mon, 1 Jul 2019 16:39:15 +0200 Subject: [PATCH 0830/1449] Update grammars Also added a test for an existing c++ syntax highlighting issue. --- extensions/cpp/cgmanifest.json | 4 +- extensions/cpp/syntaxes/c.tmLanguage.json | 3691 +++--- extensions/cpp/syntaxes/cpp.tmLanguage.json | 9943 ++++++++++++----- .../cpp/test/colorize-fixtures/test.cpp | 1 + .../cpp/test/colorize-results/test_cc.json | 82 +- .../cpp/test/colorize-results/test_cpp.json | 147 +- extensions/git/cgmanifest.json | 2 +- .../git/syntaxes/git-rebase.tmLanguage.json | 11 +- extensions/java/cgmanifest.json | 4 +- extensions/java/syntaxes/java.tmLanguage.json | 18 +- extensions/objective-c/cgmanifest.json | 4 +- .../syntaxes/objective-c++.tmLanguage.json | 2 +- .../syntaxes/objective-c.tmLanguage.json | 2 +- extensions/perl/cgmanifest.json | 2 +- extensions/sql/cgmanifest.json | 4 +- extensions/sql/syntaxes/sql.tmLanguage.json | 4 +- 16 files changed, 9366 insertions(+), 4555 deletions(-) diff --git a/extensions/cpp/cgmanifest.json b/extensions/cpp/cgmanifest.json index 90e88ff8230..71093e3ac0c 100644 --- a/extensions/cpp/cgmanifest.json +++ b/extensions/cpp/cgmanifest.json @@ -6,11 +6,11 @@ "git": { "name": "jeff-hykin/cpp-textmate-grammar", "repositoryUrl": "https://github.com/jeff-hykin/cpp-textmate-grammar", - "commitHash": "ccdbfcae7454d7f00e9a6ebe0c3df3ab4e19e33b" + "commitHash": "9c4f4b3291538d9f5144f02d3b6af877b84f2cb2" } }, "license": "MIT", - "version": "1.11.7", + "version": "1.0.0", "description": "The files syntaxes/c.json and syntaxes/c++.json were derived from https://github.com/atom/language-c which was originally converted from the C TextMate bundle https://github.com/textmate/c.tmbundle." }, { diff --git a/extensions/cpp/syntaxes/c.tmLanguage.json b/extensions/cpp/syntaxes/c.tmLanguage.json index 1f7b3648b20..679f53c04c0 100644 --- a/extensions/cpp/syntaxes/c.tmLanguage.json +++ b/extensions/cpp/syntaxes/c.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/jeff-hykin/cpp-textmate-grammar/commit/5a701cf1028d9c517fa2ee5210628935e0d7b19a", + "version": "https://github.com/jeff-hykin/cpp-textmate-grammar/commit/9c4f4b3291538d9f5144f02d3b6af877b84f2cb2", "name": "C", "scopeName": "source.c", "patterns": [ @@ -372,1800 +372,6 @@ } ], "repository": { - "probably_a_parameter": { - "match": "(?<=(?:[a-zA-Z_0-9] |[&*>\\]\\)]))\\s*([a-zA-Z_]\\w*)\\s*(?=(?:\\[\\]\\s*)?(?:,|\\)))", - "captures": { - "1": { - "name": "variable.parameter.probably.c" - } - } - }, - "access-method": { - "name": "meta.function-call.member.c", - "begin": "([a-zA-Z_][a-zA-Z_0-9]*|(?<=[\\]\\)]))\\s*(?:(\\.)|(->))((?:(?:[a-zA-Z_][a-zA-Z_0-9]*)\\s*(?:(?:\\.)|(?:->)))*)\\s*([a-zA-Z_][a-zA-Z_0-9]*)(\\()", - "beginCaptures": { - "1": { - "name": "variable.object.c" - }, - "2": { - "name": "punctuation.separator.dot-access.c" - }, - "3": { - "name": "punctuation.separator.pointer-access.c" - }, - "4": { - "patterns": [ - { - "match": "\\.", - "name": "punctuation.separator.dot-access.c" - }, - { - "match": "->", - "name": "punctuation.separator.pointer-access.c" - }, - { - "match": "[a-zA-Z_][a-zA-Z_0-9]*", - "name": "variable.object.c" - }, - { - "name": "everything.else.c", - "match": ".+" - } - ] - }, - "5": { - "name": "entity.name.function.member.c" - }, - "6": { - "name": "punctuation.section.arguments.begin.bracket.round.function.member.c" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "punctuation.section.arguments.end.bracket.round.function.member.c" - } - }, - "patterns": [ - { - "include": "#function-call-innards" - } - ] - }, - "block": { - "patterns": [ - { - "begin": "{", - "beginCaptures": { - "0": { - "name": "punctuation.section.block.begin.bracket.curly.c" - } - }, - "end": "}|(?=\\s*#\\s*(?:elif|else|endif)\\b)", - "endCaptures": { - "0": { - "name": "punctuation.section.block.end.bracket.curly.c" - } - }, - "name": "meta.block.c", - "patterns": [ - { - "include": "#block_innards" - } - ] - } - ] - }, - "block_innards": { - "patterns": [ - { - "include": "#preprocessor-rule-enabled-block" - }, - { - "include": "#preprocessor-rule-disabled-block" - }, - { - "include": "#preprocessor-rule-conditional-block" - }, - { - "include": "#method_access" - }, - { - "include": "#member_access" - }, - { - "include": "#c_function_call" - }, - { - "name": "meta.initialization.c", - "begin": "(?x)\n(?:\n (?:\n\t(?=\\s)(?=+!]+ | \\(\\) | \\[\\]))\n)\n\\s*(\\() # opening bracket", - "beginCaptures": { - "1": { - "name": "variable.other.c" - }, - "2": { - "name": "punctuation.section.parens.begin.bracket.round.initialization.c" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "punctuation.section.parens.end.bracket.round.initialization.c" - } - }, - "patterns": [ - { - "include": "#function-call-innards" - } - ] - }, - { - "begin": "{", - "beginCaptures": { - "0": { - "name": "punctuation.section.block.begin.bracket.curly.c" - } - }, - "end": "}|(?=\\s*#\\s*(?:elif|else|endif)\\b)", - "endCaptures": { - "0": { - "name": "punctuation.section.block.end.bracket.curly.c" - } - }, - "patterns": [ - { - "include": "#block_innards" - } - ] - }, - { - "include": "#parens-block" - }, - { - "include": "$base" - } - ] - }, - "c_function_call": { - "begin": "(?x)\n(?!(?:while|for|do|if|else|switch|catch|enumerate|return|typeid|alignof|alignas|sizeof|[cr]?iterate|and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq|alignof|alignas)\\s*\\()\n(?=\n(?:[A-Za-z_][A-Za-z0-9_]*+|::)++\\s*\\( # actual name\n|\n(?:(?<=operator)(?:[-*&<>=+!]+|\\(\\)|\\[\\]))\\s*\\(\n)", - "end": "(?<=\\))(?!\\w)", - "name": "meta.function-call.c", - "patterns": [ - { - "include": "#function-call-innards" - } - ] - }, - "comments": { - "patterns": [ - { - "captures": { - "1": { - "name": "meta.toc-list.banner.block.c" - } - }, - "match": "^/\\* =(\\s*.*?)\\s*= \\*/$\\n?", - "name": "comment.block.c" - }, - { - "begin": "/\\*", - "beginCaptures": { - "0": { - "name": "punctuation.definition.comment.begin.c" - } - }, - "end": "\\*/", - "endCaptures": { - "0": { - "name": "punctuation.definition.comment.end.c" - } - }, - "name": "comment.block.c" - }, - { - "captures": { - "1": { - "name": "meta.toc-list.banner.line.c" - } - }, - "match": "^// =(\\s*.*?)\\s*=\\s*$\\n?", - "name": "comment.line.banner.c" - }, - { - "begin": "(^[ \\t]+)?(?=//)", - "beginCaptures": { - "1": { - "name": "punctuation.whitespace.comment.leading.c" - } - }, - "end": "(?!\\G)", - "patterns": [ - { - "begin": "//", - "beginCaptures": { - "0": { - "name": "punctuation.definition.comment.c" - } - }, - "end": "(?=\\n)", - "name": "comment.line.double-slash.c", - "patterns": [ - { - "include": "#line_continuation_character" - } - ] - } - ] - } - ] - }, - "disabled": { - "begin": "^\\s*#\\s*if(n?def)?\\b.*$", - "end": "^\\s*#\\s*endif\\b", - "patterns": [ - { - "include": "#disabled" - }, - { - "include": "#pragma-mark" - } - ] - }, - "line_continuation_character": { - "patterns": [ - { - "match": "(\\\\)\\n", - "captures": { - "1": { - "name": "constant.character.escape.line-continuation.c" - } - } - } - ] - }, - "parens": { - "name": "meta.parens.c", - "begin": "\\(", - "beginCaptures": { - "0": { - "name": "punctuation.section.parens.begin.bracket.round.c" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "punctuation.section.parens.end.bracket.round.c" - } - }, - "patterns": [ - { - "include": "$base" - } - ] - }, - "parens-block": { - "name": "meta.parens.block.c", - "begin": "\\(", - "beginCaptures": { - "0": { - "name": "punctuation.section.parens.begin.bracket.round.c" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "punctuation.section.parens.end.bracket.round.c" - } - }, - "patterns": [ - { - "include": "#block_innards" - }, - { - "match": "(?-mix:(?>=|\\|=", - "name": "keyword.operator.assignment.compound.bitwise.c" - }, - { - "match": "<<|>>", - "name": "keyword.operator.bitwise.shift.c" - }, - { - "match": "!=|<=|>=|==|<|>", - "name": "keyword.operator.comparison.c" - }, - { - "match": "&&|!|\\|\\|", - "name": "keyword.operator.logical.c" - }, - { - "match": "&|\\||\\^|~", - "name": "keyword.operator.c" - }, - { - "match": "=", - "name": "keyword.operator.assignment.c" - }, - { - "match": "%|\\*|/|-|\\+", - "name": "keyword.operator.c" - }, - { - "begin": "(\\?)", - "beginCaptures": { - "1": { - "name": "keyword.operator.ternary.c" - } - }, - "end": "(:)", - "endCaptures": { - "1": { - "name": "keyword.operator.ternary.c" - } - }, - "patterns": [ - { - "include": "#function-call-innards" - }, - { - "include": "$base" - } - ] - } - ] - }, - "strings": { - "patterns": [ - { - "begin": "\"", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.c" - } - }, - "end": "\"", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.c" - } - }, - "name": "string.quoted.double.c", - "patterns": [ - { - "include": "#string_escaped_char" - }, - { - "include": "#string_placeholder" - }, - { - "include": "#line_continuation_character" - } - ] - }, - { - "begin": "'", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.c" - } - }, - "end": "'", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.c" - } - }, - "name": "string.quoted.single.c", - "patterns": [ - { - "include": "#string_escaped_char" - }, - { - "include": "#line_continuation_character" - } - ] - } - ] - }, - "string_escaped_char": { - "patterns": [ - { - "match": "(?x)\\\\ (\n\\\\\t\t\t |\n[abefnprtv'\"?] |\n[0-3]\\d{,2}\t |\n[4-7]\\d?\t\t|\nx[a-fA-F0-9]{,2} |\nu[a-fA-F0-9]{,4} |\nU[a-fA-F0-9]{,8} )", - "name": "constant.character.escape.c" - }, - { - "match": "\\\\.", - "name": "invalid.illegal.unknown-escape.c" - } - ] - }, - "string_placeholder": { - "patterns": [ - { - "match": "(?x) %\n(\\d+\\$)?\t\t\t\t\t\t # field (argument #)\n[#0\\- +']*\t\t\t\t\t\t # flags\n[,;:_]?\t\t\t\t\t\t\t # separator character (AltiVec)\n((-?\\d+)|\\*(-?\\d+\\$)?)?\t\t # minimum field width\n(\\.((-?\\d+)|\\*(-?\\d+\\$)?)?)?\t# precision\n(hh|h|ll|l|j|t|z|q|L|vh|vl|v|hv|hl)? # length modifier\n[diouxXDOUeEfFgGaACcSspn%]\t\t # conversion type", - "name": "constant.other.placeholder.c" - }, - { - "match": "(%)(?!\"\\s*(PRI|SCN))", - "captures": { - "1": { - "name": "invalid.illegal.placeholder.c" - } - } - } - ] - }, - "storage_types": { - "patterns": [ - { - "match": "(?-mix:(?=+!]+|\\(\\)|\\[\\]))\\s*\\(\n)", - "end": "(?<=\\))(?!\\w)|(?=+!]+|\\(\\)|\\[\\]))\n)\n\\s*(\\()", - "beginCaptures": { - "1": { - "name": "entity.name.function.c" - }, - "2": { - "name": "punctuation.section.arguments.begin.bracket.round.c" - } - }, - "end": "(\\))|(?=+!]+|\\(\\)|\\[\\]))\n)\n\\s*(\\()", - "beginCaptures": { - "1": { - "name": "entity.name.function.c" - }, - "2": { - "name": "punctuation.section.parameters.begin.bracket.round.c" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "punctuation.section.parameters.end.bracket.round.c" - } - }, - "patterns": [ - { - "include": "#probably_a_parameter" - }, - { - "include": "#function-innards" - } - ] - }, - { - "begin": "\\(", - "beginCaptures": { - "0": { - "name": "punctuation.section.parens.begin.bracket.round.c" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "punctuation.section.parens.end.bracket.round.c" - } - }, - "patterns": [ - { - "include": "#function-innards" - } - ] - }, - { - "include": "$base" - } - ] - }, - "function-call-innards": { - "patterns": [ - { - "include": "#comments" - }, - { - "include": "#storage_types" - }, - { - "include": "#method_access" - }, - { - "include": "#member_access" - }, - { - "include": "#operators" - }, - { - "begin": "(?x)\n(?!(?:while|for|do|if|else|switch|catch|enumerate|return|typeid|alignof|alignas|sizeof|[cr]?iterate|and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq|alignof|alignas)\\s*\\()\n(\n(?:[A-Za-z_][A-Za-z0-9_]*+|::)++ # actual name\n|\n(?:(?<=operator)(?:[-*&<>=+!]+|\\(\\)|\\[\\]))\n)\n\\s*(\\()", - "beginCaptures": { - "1": { - "name": "entity.name.function.c" - }, - "2": { - "name": "punctuation.section.arguments.begin.bracket.round.c" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "punctuation.section.arguments.end.bracket.round.c" - } - }, - "patterns": [ - { - "include": "#function-call-innards" - } - ] - }, - { - "begin": "\\(", - "beginCaptures": { - "0": { - "name": "punctuation.section.parens.begin.bracket.round.c" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "punctuation.section.parens.end.bracket.round.c" - } - }, - "patterns": [ - { - "include": "#function-call-innards" - } - ] - }, - { - "include": "#block_innards" - } - ] - }, "default_statement": { "name": "meta.conditional.case.c", "begin": "((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\()", "beginCaptures": { "1": { - "name": "keyword.other.static_assert.c" + "patterns": [ + { + "include": "#inline_comment" + } + ] }, "2": { - "name": "punctuation.section.arguments.begin.bracket.round.c" + "name": "comment.block.c punctuation.definition.comment.begin.c" + }, + "3": { + "name": "comment.block.c" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.c punctuation.definition.comment.end.c" + }, + { + "match": "\\*", + "name": "comment.block.c" + } + ] + }, + "5": { + "name": "keyword.other.static_assert.c" + }, + "6": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "7": { + "name": "comment.block.c punctuation.definition.comment.begin.c" + }, + "8": { + "name": "comment.block.c" + }, + "9": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.c punctuation.definition.comment.end.c" + }, + { + "match": "\\*", + "name": "comment.block.c" + } + ] + }, + "10": { + "name": "punctuation.section.arguments.begin.bracket.round.static_assert.c" } }, "end": "(\\))", "endCaptures": { "1": { - "name": "punctuation.section.arguments.end.bracket.round.c" + "name": "punctuation.section.arguments.end.bracket.round.static_assert.c" } }, "patterns": [ @@ -2329,7 +594,7 @@ ] }, { - "include": "#function_call_context" + "include": "#evaluation_context" } ] }, @@ -2337,7 +602,7 @@ "match": "(?x)\\\\ (\n\\\\\t\t\t |\n[abefnprtv'\"?] |\n[0-3]\\d{,2}\t |\n[4-7]\\d?\t\t|\nx[a-fA-F0-9]{,2} |\nu[a-fA-F0-9]{,4} |\nU[a-fA-F0-9]{,8} )", "name": "constant.character.escape.c" }, - "conditional_context": { + "c_conditional_context": { "patterns": [ { "include": "$base" @@ -2358,7 +623,7 @@ ] }, "member_access": { - "match": "((?:[a-zA-Z_]\\w*|(?<=\\]|\\)))\\s*)(?:((?:\\.\\*|\\.))|((?:->\\*|->)))((?:[a-zA-Z_]\\w*\\s*(?:(?:(?:\\.\\*|\\.))|(?:(?:->\\*|->)))\\s*)*)\\s*(\\b(?!(?:void|char|short|int|signed|unsigned|long|float|double|bool|_Bool|_Complex|_Imaginary|u_char|u_short|u_int|u_long|ushort|uint|u_quad_t|quad_t|qaddr_t|caddr_t|daddr_t|div_t|dev_t|fixpt_t|blkcnt_t|blksize_t|gid_t|in_addr_t|in_port_t|ino_t|key_t|mode_t|nlink_t|id_t|pid_t|off_t|segsz_t|swblk_t|uid_t|id_t|clock_t|size_t|ssize_t|time_t|useconds_t|suseconds_t|pthread_attr_t|pthread_cond_t|pthread_condattr_t|pthread_mutex_t|pthread_mutexattr_t|pthread_once_t|pthread_rwlock_t|pthread_rwlockattr_t|pthread_t|pthread_key_t|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|int_least8_t|int_least16_t|int_least32_t|int_least64_t|uint_least8_t|uint_least16_t|uint_least32_t|uint_least64_t|int_fast8_t|int_fast16_t|int_fast32_t|int_fast64_t|uint_fast8_t|uint_fast16_t|uint_fast32_t|uint_fast64_t|intptr_t|uintptr_t|intmax_t|intmax_t|uintmax_t|uintmax_t|memory_order|atomic_bool|atomic_char|atomic_schar|atomic_uchar|atomic_short|atomic_ushort|atomic_int|atomic_uint|atomic_long|atomic_ulong|atomic_llong|atomic_ullong|atomic_char16_t|atomic_char32_t|atomic_wchar_t|atomic_int_least8_t|atomic_uint_least8_t|atomic_int_least16_t|atomic_uint_least16_t|atomic_int_least32_t|atomic_uint_least32_t|atomic_int_least64_t|atomic_uint_least64_t|atomic_int_fast8_t|atomic_uint_fast8_t|atomic_int_fast16_t|atomic_uint_fast16_t|atomic_int_fast32_t|atomic_uint_fast32_t|atomic_int_fast64_t|atomic_uint_fast64_t|atomic_intptr_t|atomic_uintptr_t|atomic_size_t|atomic_ptrdiff_t|atomic_intmax_t|atomic_uintmax_t))[a-zA-Z_]\\w*\\b(?!\\())", + "match": "((?:[a-zA-Z_]\\w*|(?<=\\]|\\)))\\s*)(?:((?:\\.\\*|\\.))|((?:->\\*|->)))((?:[a-zA-Z_]\\w*\\s*(?:(?:(?:\\.\\*|\\.))|(?:(?:->\\*|->)))\\s*)*)\\s*(\\b(?!(?:void|char|short|int|signed|unsigned|long|float|double|bool|_Bool|_Complex|_Imaginary|u_char|u_short|u_int|u_long|ushort|uint|u_quad_t|quad_t|qaddr_t|caddr_t|daddr_t|div_t|dev_t|fixpt_t|blkcnt_t|blksize_t|gid_t|in_addr_t|in_port_t|ino_t|key_t|mode_t|nlink_t|id_t|pid_t|off_t|segsz_t|swblk_t|uid_t|id_t|clock_t|size_t|ssize_t|time_t|useconds_t|suseconds_t|pthread_attr_t|pthread_cond_t|pthread_condattr_t|pthread_mutex_t|pthread_mutexattr_t|pthread_once_t|pthread_rwlock_t|pthread_rwlockattr_t|pthread_t|pthread_key_t|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|int_least8_t|int_least16_t|int_least32_t|int_least64_t|uint_least8_t|uint_least16_t|uint_least32_t|uint_least64_t|int_fast8_t|int_fast16_t|int_fast32_t|int_fast64_t|uint_fast8_t|uint_fast16_t|uint_fast32_t|uint_fast64_t|intptr_t|uintptr_t|intmax_t|intmax_t|uintmax_t|uintmax_t|memory_order|atomic_bool|atomic_char|atomic_schar|atomic_uchar|atomic_short|atomic_ushort|atomic_int|atomic_uint|atomic_long|atomic_ulong|atomic_llong|atomic_ullong|atomic_char16_t|atomic_char32_t|atomic_wchar_t|atomic_int_least8_t|atomic_uint_least8_t|atomic_int_least16_t|atomic_uint_least16_t|atomic_int_least32_t|atomic_uint_least32_t|atomic_int_least64_t|atomic_uint_least64_t|atomic_int_fast8_t|atomic_uint_fast8_t|atomic_int_fast16_t|atomic_uint_fast16_t|atomic_int_fast32_t|atomic_uint_fast32_t|atomic_int_fast64_t|atomic_uint_fast64_t|atomic_intptr_t|atomic_uintptr_t|atomic_size_t|atomic_ptrdiff_t|atomic_intmax_t|atomic_uintmax_t)\\b)[a-zA-Z_]\\w*\\b(?!\\())", "captures": { "1": { "name": "variable.other.object.access.c" @@ -3476,10 +1741,10 @@ }, "numbers": { "begin": "(?\\]\\)]))\\s*([a-zA-Z_]\\w*)\\s*(?=(?:\\[\\]\\s*)?(?:,|\\)))", + "captures": { + "1": { + "name": "variable.parameter.probably.c" + } + } + }, + "access-method": { + "name": "meta.function-call.member.c", + "begin": "([a-zA-Z_][a-zA-Z_0-9]*|(?<=[\\]\\)]))\\s*(?:(\\.)|(->))((?:(?:[a-zA-Z_][a-zA-Z_0-9]*)\\s*(?:(?:\\.)|(?:->)))*)\\s*([a-zA-Z_][a-zA-Z_0-9]*)(\\()", + "beginCaptures": { + "1": { + "name": "variable.object.c" + }, + "2": { + "name": "punctuation.separator.dot-access.c" + }, + "3": { + "name": "punctuation.separator.pointer-access.c" + }, + "4": { + "patterns": [ + { + "match": "\\.", + "name": "punctuation.separator.dot-access.c" + }, + { + "match": "->", + "name": "punctuation.separator.pointer-access.c" + }, + { + "match": "[a-zA-Z_][a-zA-Z_0-9]*", + "name": "variable.object.c" + }, + { + "name": "everything.else.c", + "match": ".+" + } + ] + }, + "5": { + "name": "entity.name.function.member.c" + }, + "6": { + "name": "punctuation.section.arguments.begin.bracket.round.function.member.c" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.section.arguments.end.bracket.round.function.member.c" + } + }, + "patterns": [ + { + "include": "#function-call-innards" + } + ] + }, + "block": { + "patterns": [ + { + "begin": "{", + "beginCaptures": { + "0": { + "name": "punctuation.section.block.begin.bracket.curly.c" + } + }, + "end": "}|(?=\\s*#\\s*(?:elif|else|endif)\\b)", + "endCaptures": { + "0": { + "name": "punctuation.section.block.end.bracket.curly.c" + } + }, + "name": "meta.block.c", + "patterns": [ + { + "include": "#block_innards" + } + ] + } + ] + }, + "block_innards": { + "patterns": [ + { + "include": "#preprocessor-rule-enabled-block" + }, + { + "include": "#preprocessor-rule-disabled-block" + }, + { + "include": "#preprocessor-rule-conditional-block" + }, + { + "include": "#method_access" + }, + { + "include": "#member_access" + }, + { + "include": "#c_function_call" + }, + { + "name": "meta.initialization.c", + "begin": "(?x)\n(?:\n (?:\n\t(?=\\s)(?=+!]+ | \\(\\) | \\[\\]))\n)\n\\s*(\\() # opening bracket", + "beginCaptures": { + "1": { + "name": "variable.other.c" + }, + "2": { + "name": "punctuation.section.parens.begin.bracket.round.initialization.c" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.section.parens.end.bracket.round.initialization.c" + } + }, + "patterns": [ + { + "include": "#function-call-innards" + } + ] + }, + { + "begin": "{", + "beginCaptures": { + "0": { + "name": "punctuation.section.block.begin.bracket.curly.c" + } + }, + "end": "}|(?=\\s*#\\s*(?:elif|else|endif)\\b)", + "endCaptures": { + "0": { + "name": "punctuation.section.block.end.bracket.curly.c" + } + }, + "patterns": [ + { + "include": "#block_innards" + } + ] + }, + { + "include": "#parens-block" + }, + { + "include": "$base" + } + ] + }, + "c_function_call": { + "begin": "(?x)\n(?!(?:while|for|do|if|else|switch|catch|enumerate|return|typeid|alignof|alignas|sizeof|[cr]?iterate|and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq|alignof|alignas)\\s*\\()\n(?=\n(?:[A-Za-z_][A-Za-z0-9_]*+|::)++\\s*\\( # actual name\n|\n(?:(?<=operator)(?:[-*&<>=+!]+|\\(\\)|\\[\\]))\\s*\\(\n)", + "end": "(?<=\\))(?!\\w)", + "name": "meta.function-call.c", + "patterns": [ + { + "include": "#function-call-innards" + } + ] + }, + "comments": { + "patterns": [ + { + "captures": { + "1": { + "name": "meta.toc-list.banner.block.c" + } + }, + "match": "^/\\* =(\\s*.*?)\\s*= \\*/$\\n?", + "name": "comment.block.c" + }, + { + "begin": "/\\*", + "beginCaptures": { + "0": { + "name": "punctuation.definition.comment.begin.c" + } + }, + "end": "\\*/", + "endCaptures": { + "0": { + "name": "punctuation.definition.comment.end.c" + } + }, + "name": "comment.block.c" + }, + { + "captures": { + "1": { + "name": "meta.toc-list.banner.line.c" + } + }, + "match": "^// =(\\s*.*?)\\s*=\\s*$\\n?", + "name": "comment.line.banner.c" + }, + { + "begin": "(^[ \\t]+)?(?=//)", + "beginCaptures": { + "1": { + "name": "punctuation.whitespace.comment.leading.c" + } + }, + "end": "(?!\\G)", + "patterns": [ + { + "begin": "//", + "beginCaptures": { + "0": { + "name": "punctuation.definition.comment.c" + } + }, + "end": "(?=\\n)", + "name": "comment.line.double-slash.c", + "patterns": [ + { + "include": "#line_continuation_character" + } + ] + } + ] + } + ] + }, + "disabled": { + "begin": "^\\s*#\\s*if(n?def)?\\b.*$", + "end": "^\\s*#\\s*endif\\b", + "patterns": [ + { + "include": "#disabled" + }, + { + "include": "#pragma-mark" + } + ] + }, + "line_continuation_character": { + "patterns": [ + { + "match": "(\\\\)\\n", + "captures": { + "1": { + "name": "constant.character.escape.line-continuation.c" + } + } + } + ] + }, + "parens": { + "name": "meta.parens.c", + "begin": "\\(", + "beginCaptures": { + "0": { + "name": "punctuation.section.parens.begin.bracket.round.c" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.section.parens.end.bracket.round.c" + } + }, + "patterns": [ + { + "include": "$base" + } + ] + }, + "parens-block": { + "name": "meta.parens.block.c", + "begin": "\\(", + "beginCaptures": { + "0": { + "name": "punctuation.section.parens.begin.bracket.round.c" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.section.parens.end.bracket.round.c" + } + }, + "patterns": [ + { + "include": "#block_innards" + }, + { + "match": "(?-mix:(?>=|\\|=", + "name": "keyword.operator.assignment.compound.bitwise.c" + }, + { + "match": "<<|>>", + "name": "keyword.operator.bitwise.shift.c" + }, + { + "match": "!=|<=|>=|==|<|>", + "name": "keyword.operator.comparison.c" + }, + { + "match": "&&|!|\\|\\|", + "name": "keyword.operator.logical.c" + }, + { + "match": "&|\\||\\^|~", + "name": "keyword.operator.c" + }, + { + "match": "=", + "name": "keyword.operator.assignment.c" + }, + { + "match": "%|\\*|/|-|\\+", + "name": "keyword.operator.c" + }, + { + "begin": "(\\?)", + "beginCaptures": { + "1": { + "name": "keyword.operator.ternary.c" + } + }, + "end": "(:)", + "endCaptures": { + "1": { + "name": "keyword.operator.ternary.c" + } + }, + "patterns": [ + { + "include": "#function-call-innards" + }, + { + "include": "$base" + } + ] + } + ] + }, + "strings": { + "patterns": [ + { + "begin": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.c" + } + }, + "end": "\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.c" + } + }, + "name": "string.quoted.double.c", + "patterns": [ + { + "include": "#string_escaped_char" + }, + { + "include": "#string_placeholder" + }, + { + "include": "#line_continuation_character" + } + ] + }, + { + "begin": "'", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.c" + } + }, + "end": "'", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.c" + } + }, + "name": "string.quoted.single.c", + "patterns": [ + { + "include": "#string_escaped_char" + }, + { + "include": "#line_continuation_character" + } + ] + } + ] + }, + "string_escaped_char": { + "patterns": [ + { + "match": "(?x)\\\\ (\n\\\\\t\t\t |\n[abefnprtv'\"?] |\n[0-3]\\d{,2}\t |\n[4-7]\\d?\t\t|\nx[a-fA-F0-9]{,2} |\nu[a-fA-F0-9]{,4} |\nU[a-fA-F0-9]{,8} )", + "name": "constant.character.escape.c" + }, + { + "match": "\\\\.", + "name": "invalid.illegal.unknown-escape.c" + } + ] + }, + "string_placeholder": { + "patterns": [ + { + "match": "(?x) %\n(\\d+\\$)?\t\t\t\t\t\t # field (argument #)\n[#0\\- +']*\t\t\t\t\t\t # flags\n[,;:_]?\t\t\t\t\t\t\t # separator character (AltiVec)\n((-?\\d+)|\\*(-?\\d+\\$)?)?\t\t # minimum field width\n(\\.((-?\\d+)|\\*(-?\\d+\\$)?)?)?\t# precision\n(hh|h|ll|l|j|t|z|q|L|vh|vl|v|hv|hl)? # length modifier\n[diouxXDOUeEfFgGaACcSspn%]\t\t # conversion type", + "name": "constant.other.placeholder.c" + }, + { + "match": "(%)(?!\"\\s*(PRI|SCN))", + "captures": { + "1": { + "name": "invalid.illegal.placeholder.c" + } + } + } + ] + }, + "storage_types": { + "patterns": [ + { + "match": "(?-mix:(?=+!]+|\\(\\)|\\[\\]))\\s*\\(\n)", + "end": "(?<=\\))(?!\\w)|(?=+!]+|\\(\\)|\\[\\]))\n)\n\\s*(\\()", + "beginCaptures": { + "1": { + "name": "entity.name.function.c" + }, + "2": { + "name": "punctuation.section.arguments.begin.bracket.round.c" + } + }, + "end": "(\\))|(?=+!]+|\\(\\)|\\[\\]))\n)\n\\s*(\\()", + "beginCaptures": { + "1": { + "name": "entity.name.function.c" + }, + "2": { + "name": "punctuation.section.parameters.begin.bracket.round.c" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.section.parameters.end.bracket.round.c" + } + }, + "patterns": [ + { + "include": "#probably_a_parameter" + }, + { + "include": "#function-innards" + } + ] + }, + { + "begin": "\\(", + "beginCaptures": { + "0": { + "name": "punctuation.section.parens.begin.bracket.round.c" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.section.parens.end.bracket.round.c" + } + }, + "patterns": [ + { + "include": "#function-innards" + } + ] + }, + { + "include": "$base" + } + ] + }, + "function-call-innards": { + "patterns": [ + { + "include": "#comments" + }, + { + "include": "#storage_types" + }, + { + "include": "#method_access" + }, + { + "include": "#member_access" + }, + { + "include": "#operators" + }, + { + "begin": "(?x)\n(?!(?:while|for|do|if|else|switch|catch|enumerate|return|typeid|alignof|alignas|sizeof|[cr]?iterate|and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq|alignof|alignas)\\s*\\()\n(\n(?:[A-Za-z_][A-Za-z0-9_]*+|::)++ # actual name\n|\n(?:(?<=operator)(?:[-*&<>=+!]+|\\(\\)|\\[\\]))\n)\n\\s*(\\()", + "beginCaptures": { + "1": { + "name": "entity.name.function.c" + }, + "2": { + "name": "punctuation.section.arguments.begin.bracket.round.c" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.section.arguments.end.bracket.round.c" + } + }, + "patterns": [ + { + "include": "#function-call-innards" + } + ] + }, + { + "begin": "\\(", + "beginCaptures": { + "0": { + "name": "punctuation.section.parens.begin.bracket.round.c" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.section.parens.end.bracket.round.c" + } + }, + "patterns": [ + { + "include": "#function-call-innards" + } + ] + }, + { + "include": "#block_innards" + } + ] } } } \ No newline at end of file diff --git a/extensions/cpp/syntaxes/cpp.tmLanguage.json b/extensions/cpp/syntaxes/cpp.tmLanguage.json index 039f91926fe..f65768b6ad3 100644 --- a/extensions/cpp/syntaxes/cpp.tmLanguage.json +++ b/extensions/cpp/syntaxes/cpp.tmLanguage.json @@ -4,212 +4,24 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/jeff-hykin/cpp-textmate-grammar/commit/ccdbfcae7454d7f00e9a6ebe0c3df3ab4e19e33b", + "version": "https://github.com/jeff-hykin/cpp-textmate-grammar/commit/9c4f4b3291538d9f5144f02d3b6af877b84f2cb2", "name": "C++", "scopeName": "source.cpp", "patterns": [ { - "include": "#source_wrapper" + "name": "source.cpp", + "begin": "(?=^|\\A|\\G)", + "end": "not(?<=possible)", + "patterns": [ + { + "include": "#initial_context" + } + ] } ], "repository": { - "decltype_specifier": { - "contentName": "meta.arguments.decltype.cpp", - "begin": "((?\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\()", - "beginCaptures": { - "1": { - "name": "keyword.operator.functionlike.cpp keyword.other.decltype.cpp storage.type.decltype.cpp" - }, - "2": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "3": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "4": { - "name": "comment.block.cpp" - }, - "5": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "6": { - "name": "punctuation.section.arguments.begin.bracket.round.decltype.cpp" - } - }, - "end": "(\\))", - "endCaptures": { - "1": { - "name": "punctuation.section.arguments.end.bracket.round.decltype.cpp" - } - }, - "patterns": [ - { - "include": "#evaluation_context" - } - ] - }, - "sizeof_operator": { - "contentName": "meta.arguments.operator.sizeof.cpp", - "begin": "((?\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\()", - "beginCaptures": { - "1": { - "name": "keyword.operator.functionlike.cpp keyword.operator.sizeof.cpp" - }, - "2": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "3": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "4": { - "name": "comment.block.cpp" - }, - "5": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "6": { - "name": "punctuation.section.arguments.begin.bracket.round.operator.sizeof.cpp" - } - }, - "end": "(\\))", - "endCaptures": { - "1": { - "name": "punctuation.section.arguments.end.bracket.round.operator.sizeof.cpp" - } - }, - "patterns": [ - { - "include": "#evaluation_context" - } - ] - }, - "alignof_operator": { - "contentName": "meta.arguments.operator.alignof.cpp", - "begin": "((?\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\()", - "beginCaptures": { - "1": { - "name": "keyword.operator.functionlike.cpp keyword.operator.alignof.cpp" - }, - "2": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "3": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "4": { - "name": "comment.block.cpp" - }, - "5": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "6": { - "name": "punctuation.section.arguments.begin.bracket.round.operator.alignof.cpp" - } - }, - "end": "(\\))", - "endCaptures": { - "1": { - "name": "punctuation.section.arguments.end.bracket.round.operator.alignof.cpp" - } - }, - "patterns": [ - { - "include": "#evaluation_context" - } - ] - }, - "alignas_operator": { - "contentName": "meta.arguments.operator.alignas.cpp", - "begin": "((?\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\()", - "beginCaptures": { - "1": { - "name": "keyword.operator.functionlike.cpp keyword.operator.alignas.cpp" - }, - "2": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "3": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "4": { - "name": "comment.block.cpp" - }, - "5": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "6": { - "name": "punctuation.section.arguments.begin.bracket.round.operator.alignas.cpp" - } - }, - "end": "(\\))", - "endCaptures": { - "1": { - "name": "punctuation.section.arguments.end.bracket.round.operator.alignas.cpp" - } - }, - "patterns": [ - { - "include": "#evaluation_context" - } - ] - }, - "typeid_operator": { - "contentName": "meta.arguments.operator.typeid.cpp", - "begin": "((?\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\()", - "beginCaptures": { - "1": { - "name": "keyword.operator.functionlike.cpp keyword.operator.typeid.cpp" - }, - "2": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "3": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "4": { - "name": "comment.block.cpp" - }, - "5": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "6": { - "name": "punctuation.section.arguments.begin.bracket.round.operator.typeid.cpp" - } - }, - "end": "(\\))", - "endCaptures": { - "1": { - "name": "punctuation.section.arguments.end.bracket.round.operator.typeid.cpp" - } - }, - "patterns": [ - { - "include": "#evaluation_context" - } - ] - }, "inline_comment": { - "match": "(\\/\\*)(.+?)(\\*\\/)", + "match": "(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/))", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -218,7 +30,16 @@ "name": "comment.block.cpp" }, "3": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] } } }, @@ -234,331 +55,7 @@ "match": "\\=", "name": "keyword.operator.assignment.cpp" }, - "root_context": { - "patterns": [ - { - "include": "#preprocessor_context" - }, - { - "include": "#comments_context" - }, - { - "include": "#function_definition" - }, - { - "include": "#struct_declare" - }, - { - "include": "#special_block_context" - }, - { - "include": "#string_context" - }, - { - "include": "#functional_specifiers_pre_parameters" - }, - { - "include": "#qualifiers_and_specifiers_post_parameters" - }, - { - "include": "#storage_specifiers" - }, - { - "include": "#access_control_keywords" - }, - { - "include": "#exception_keywords" - }, - { - "include": "#static_assert" - }, - { - "include": "#other_keywords" - }, - { - "include": "#memory_operators" - }, - { - "include": "#using_name" - }, - { - "include": "#the_this_keyword" - }, - { - "include": "#language_constants" - }, - { - "include": "#template_isolated_definition" - }, - { - "include": "#template_definition" - }, - { - "include": "#misc_storage_modifiers_1" - }, - { - "include": "#destructor" - }, - { - "include": "#lambdas" - }, - { - "include": "#switch_statement" - }, - { - "include": "#control_flow_keywords" - }, - { - "include": "#assembly" - }, - { - "include": "#misc_storage_modifiers_2" - }, - { - "include": "#operator_overload" - }, - { - "include": "#number_literal" - }, - { - "include": "#string_context_c" - }, - { - "include": "#predefined_macros" - }, - { - "include": "#operators" - }, - { - "include": "#attributes_context" - }, - { - "include": "#block" - }, - { - "include": "#parentheses" - }, - { - "include": "#type_casting_operators" - }, - { - "include": "#function_call" - }, - { - "include": "#scope_resolution_inner_generated" - }, - { - "include": "#storage_types" - }, - { - "include": "#line_continuation_character" - }, - { - "include": "#square_brackets" - }, - { - "include": "#empty_square_brackets" - }, - { - "include": "#semicolon" - }, - { - "include": "#comma" - } - ] - }, - "special_block_context": { - "patterns": [ - { - "include": "#using_namespace" - }, - { - "include": "#type_alias" - }, - { - "include": "#namespace_alias" - }, - { - "include": "#namespace_block" - }, - { - "include": "#typedef_class" - }, - { - "include": "#typedef_struct" - }, - { - "include": "#typedef_union" - }, - { - "include": "#class_block" - }, - { - "include": "#struct_block" - }, - { - "include": "#union_block" - }, - { - "include": "#enum_block" - }, - { - "include": "#extern_block" - } - ] - }, - "function_body_context": { - "patterns": [ - { - "include": "#type_casting_operators" - }, - { - "include": "#function_call" - }, - { - "include": "#struct_declare" - }, - { - "include": "#special_block_context" - }, - { - "include": "#macro_argument" - }, - { - "include": "#string_context" - }, - { - "include": "#functional_specifiers_pre_parameters" - }, - { - "include": "#qualifiers_and_specifiers_post_parameters" - }, - { - "include": "#storage_specifiers" - }, - { - "include": "#access_control_keywords" - }, - { - "include": "#exception_keywords" - }, - { - "include": "#static_assert" - }, - { - "include": "#other_keywords" - }, - { - "include": "#memory_operators" - }, - { - "include": "#using_name" - }, - { - "include": "#the_this_keyword" - }, - { - "include": "#language_constants" - }, - { - "include": "#template_isolated_definition" - }, - { - "include": "#template_definition" - }, - { - "include": "#misc_storage_modifiers_1" - }, - { - "include": "#destructor" - }, - { - "include": "#lambdas" - }, - { - "include": "#preprocessor_context" - }, - { - "include": "#comments_context" - }, - { - "include": "#switch_statement" - }, - { - "include": "#control_flow_keywords" - }, - { - "include": "#assembly" - }, - { - "include": "#misc_storage_modifiers_2" - }, - { - "include": "#operator_overload" - }, - { - "include": "#number_literal" - }, - { - "include": "#string_context_c" - }, - { - "include": "#meta_preprocessor_macro" - }, - { - "include": "#meta_preprocessor_diagnostic" - }, - { - "include": "#meta_preprocessor_include" - }, - { - "include": "#pragma_mark" - }, - { - "include": "#meta_preprocessor_line" - }, - { - "include": "#meta_preprocessor_undef" - }, - { - "include": "#meta_preprocessor_pragma" - }, - { - "include": "#operators" - }, - { - "include": "#block" - }, - { - "include": "#parentheses" - }, - { - "include": "#type_casting_operators" - }, - { - "include": "#scope_resolution_inner_generated" - }, - { - "include": "#storage_types" - }, - { - "include": "#line_continuation_character" - }, - { - "include": "#square_brackets" - }, - { - "include": "#empty_square_brackets" - }, - { - "include": "#semicolon" - }, - { - "include": "#comma" - } - ] - }, - "preprocessor_context": { + "ever_present_context": { "patterns": [ { "include": "#preprocessor_rule_enabled" @@ -595,82 +92,186 @@ }, { "include": "#hacky_fix_for_stray_directive" + }, + { + "include": "#comments" + }, + { + "include": "#line_continuation_character" } ] }, - "storage_types": { + "function_body_context": { "patterns": [ { - "include": "#storage_specifiers" + "include": "#ever_present_context" }, { - "include": "#primitive_types" + "include": "#using_namespace" }, { - "include": "#non_primitive_types" + "include": "#type_alias" }, { - "include": "#pthread_types" + "include": "#using_name" }, { - "include": "#posix_reserved_types" + "include": "#namespace_alias" }, { - "include": "#decltype" - } - ] - }, - "function_parameter_context": { - "patterns": [ - { - "include": "#parameter_struct" + "include": "#typedef_class" }, { - "include": "#probably_a_parameter" + "include": "#typedef_struct" }, { - "include": "#attributes_context" + "include": "#typedef_union" }, { - "include": "#comments_context" + "include": "#typedef_keyword" }, { - "include": "#function_pointer_parameter" + "include": "#standard_declares" }, { - "include": "#storage_types" + "include": "#class_block" }, { - "include": "#vararg_ellipses" + "include": "#struct_block" }, { - "include": "#comma" + "include": "#union_block" }, { - "include": "#language_constants" + "include": "#enum_block" }, { - "include": "#number_literal" + "include": "#access_control_keywords" }, { - "include": "#string_context" + "include": "#block" }, { - "include": "#operators" + "include": "#static_assert" + }, + { + "include": "#assembly" + }, + { + "include": "#function_pointer" + }, + { + "include": "#switch_statement" + }, + { + "include": "#goto_statement" + }, + { + "include": "#evaluation_context" + }, + { + "include": "#label" } ] }, "evaluation_context": { "patterns": [ { - "include": "#root_context" + "include": "#ever_present_context" + }, + { + "include": "#string_context" + }, + { + "include": "#number_literal" + }, + { + "include": "#string_context_c" + }, + { + "include": "#method_access" + }, + { + "include": "#member_access" + }, + { + "include": "#predefined_macros" + }, + { + "include": "#operators" + }, + { + "include": "#memory_operators" + }, + { + "include": "#wordlike_operators" + }, + { + "include": "#type_casting_operators" + }, + { + "include": "#control_flow_keywords" + }, + { + "include": "#exception_keywords" + }, + { + "include": "#the_this_keyword" + }, + { + "include": "#language_constants" + }, + { + "include": "#qualifiers_and_specifiers_post_parameters" + }, + { + "include": "#functional_specifiers_pre_parameters" + }, + { + "include": "#storage_types" + }, + { + "include": "#misc_storage_modifiers" + }, + { + "include": "#lambdas" + }, + { + "include": "#attributes_context" + }, + { + "include": "#parentheses" + }, + { + "include": "#function_call" + }, + { + "include": "#scope_resolution_inner_generated" + }, + { + "include": "#square_brackets" + }, + { + "include": "#empty_square_brackets" + }, + { + "include": "#semicolon" + }, + { + "include": "#comma" } ] }, - "conditional_context": { + "function_parameter_context": { "patterns": [ { - "include": "#root_context" + "include": "#ever_present_context" + }, + { + "include": "#parameter" + }, + { + "include": "#comma" } ] }, @@ -695,6 +296,9 @@ }, "template_call_context": { "patterns": [ + { + "include": "#template_call_range" + }, { "include": "#storage_types" }, @@ -718,6 +322,9 @@ }, { "include": "#comma_in_template_argument" + }, + { + "include": "#qualified_type" } ] }, @@ -737,26 +344,109 @@ } ] }, - "source_wrapper": { + "storage_types": { "patterns": [ { - "name": "source.cpp", - "begin": "(?=^)", - "end": "not(?<=possible)", - "patterns": [ - { - "include": "#root_context" - } - ] + "include": "#storage_specifiers" + }, + { + "include": "#primitive_types" + }, + { + "include": "#non_primitive_types" + }, + { + "include": "#pthread_types" + }, + { + "include": "#posix_reserved_types" + }, + { + "include": "#decltype" + }, + { + "include": "#typename" + } + ] + }, + "block_comment": { + "name": "comment.block.cpp", + "begin": "\\s*+(\\/\\*)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.comment.begin.cpp" + } + }, + "end": "(\\*\\/)", + "endCaptures": { + "1": { + "name": "punctuation.definition.comment.end.cpp" + } + } + }, + "line_comment": { + "name": "comment.line.double-slash.cpp", + "begin": "\\s*+(\\/\\/)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.comment.cpp" + } + }, + "end": "(?<=\\n)(?[#;\\/=*C~]+)(?![#;\\/=*C~]))\\s*.+\\s*\\8\\s*(?:\\n|$)))|(^\\s*((\\/\\*)\\s*?((?>[#;\\/=*C~]+)(?![#;\\/=*C~]))\\s*.+\\s*\\8\\s*\\*\\/)))", + "captures": { + "1": { + "name": "meta.toc-list.banner.double-slash.cpp" + }, + "2": { + "name": "comment.line.double-slash.cpp" + }, + "3": { + "name": "punctuation.definition.comment.cpp" + }, + "4": { + "name": "meta.banner.character.cpp" + }, + "5": { + "name": "meta.toc-list.banner.block.cpp" + }, + "6": { + "name": "comment.line.block.cpp" + }, + "7": { + "name": "punctuation.definition.comment.cpp" + }, + "8": { + "name": "meta.banner.character.cpp" + } + } + }, + "comments": { + "patterns": [ + { + "include": "#emacs_file_banner" + }, + { + "include": "#block_comment" + }, + { + "include": "#line_comment" } ] }, "number_literal": { "begin": "(?\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\()", + "begin": "((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\()", "beginCaptures": { "1": { "name": "keyword.operator.functionlike.cpp keyword.other.decltype.cpp storage.type.decltype.cpp" @@ -1046,7 +736,16 @@ "name": "comment.block.cpp" }, "5": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] }, "6": { "name": "punctuation.section.arguments.begin.bracket.round.decltype.cpp" @@ -1064,6 +763,62 @@ } ] }, + "decltype": { + "contentName": "meta.arguments.decltype.cpp", + "begin": "((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\()", + "beginCaptures": { + "1": { + "name": "keyword.operator.functionlike.cpp keyword.other.decltype.cpp storage.type.decltype.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "name": "punctuation.section.arguments.begin.bracket.round.decltype.cpp" + } + }, + "end": "(\\))", + "endCaptures": { + "1": { + "name": "punctuation.section.arguments.end.bracket.round.decltype.cpp" + } + }, + "patterns": [ + { + "include": "#evaluation_context" + } + ] + }, + "pthread_types": { + "match": "(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)", + "captures": { + "1": { + "name": "keyword.control.goto.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "name": "entity.name.label.call.cpp" + } + } + }, + "label": { + "match": "((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(:)", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "5": { + "name": "entity.name.label.cpp" + }, + "6": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "7": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "8": { + "name": "comment.block.cpp" + }, + "9": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "10": { + "name": "punctuation.separator.label.cpp" + } + } + }, "default_statement": { "name": "meta.conditional.case.cpp", "begin": "((?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+", + "captures": { + "0": { + "patterns": [ + { + "include": "#scope_resolution_parameter_inner_generated" + } + ] + } + } + }, + "scope_resolution_parameter_inner_generated": { + "match": "((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::)", + "captures": { + "1": { + "patterns": [ + { + "include": "#scope_resolution_parameter_inner_generated" + } + ] + }, + "2": { + "name": "entity.name.scope-resolution.parameter.cpp" + }, + "3": { + "name": "meta.template.call.cpp", + "patterns": [ + { + "include": "#template_call_range" + } + ] + }, + "4": { + "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.parameter.cpp" + } + } + }, "scope_resolution_function_definition_operator_overload": { "match": "(?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+", "captures": { @@ -1999,7 +1898,7 @@ } }, "qualified_type": { - "match": "((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.])", + "match": "\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.])", "captures": { "0": { "name": "meta.qualified_type.cpp", @@ -2039,22 +1938,6 @@ ] }, "1": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "2": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "3": { - "name": "comment.block.cpp" - }, - "4": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "5": { "patterns": [ { "include": "#attributes_context" @@ -2064,6 +1947,31 @@ } ] }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, "6": { "patterns": [ { @@ -2078,35 +1986,28 @@ "name": "comment.block.cpp" }, "9": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "10": { "patterns": [ { - "include": "#inline_comment" + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" } ] }, "11": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "12": { - "name": "comment.block.cpp" - }, - "13": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "15": { "patterns": [ { "include": "#scope_resolution_inner_generated" } ] }, - "16": { + "12": { "name": "entity.name.scope-resolution.cpp" }, - "17": { + "13": { "name": "meta.template.call.cpp", "patterns": [ { @@ -2114,32 +2015,41 @@ } ] }, - "18": { + "14": { "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.cpp" }, - "19": { + "15": { "patterns": [ { "include": "#inline_comment" } ] }, - "20": { + "16": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "21": { + "17": { "name": "comment.block.cpp" }, - "22": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + "18": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] }, - "23": { + "19": { "name": "entity.name.type.cpp" } } }, "type_alias": { - "match": "(using)\\s*(?!namespace)(((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))\\s*(\\=)\\s*((?:typename)?)\\s*((?:(?:(?\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))|(.+(?\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*)((?:&((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){0,2})((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)(?:(\\[)(\\w*)(\\])\\s*)?\\s*(?:(;)|\\n)", + "match": "(using)\\s*(?!namespace)(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))\\s*(\\=)\\s*((?:typename)?)\\s*((?:(?:(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))|(.*(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)(?:(\\[)(\\w*)(\\])\\s*)?\\s*(?:(;)|\\n)", "captures": { "1": { "name": "keyword.other.using.directive.cpp" @@ -2182,22 +2092,6 @@ ] }, "3": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "4": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "5": { - "name": "comment.block.cpp" - }, - "6": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "7": { "patterns": [ { "include": "#attributes_context" @@ -2207,6 +2101,31 @@ } ] }, + "4": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "5": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "6": { + "name": "comment.block.cpp" + }, + "7": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, "8": { "patterns": [ { @@ -2221,35 +2140,28 @@ "name": "comment.block.cpp" }, "11": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "12": { "patterns": [ { - "include": "#inline_comment" + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" } ] }, "13": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "14": { - "name": "comment.block.cpp" - }, - "15": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "17": { "patterns": [ { "include": "#scope_resolution_inner_generated" } ] }, - "18": { + "14": { "name": "entity.name.scope-resolution.cpp" }, - "19": { + "15": { "name": "meta.template.call.cpp", "patterns": [ { @@ -2257,42 +2169,51 @@ } ] }, - "20": { + "16": { "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.cpp" }, - "21": { + "17": { "patterns": [ { "include": "#inline_comment" } ] }, - "22": { + "18": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "23": { + "19": { "name": "comment.block.cpp" }, - "24": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + "20": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] }, - "25": { + "21": { "name": "entity.name.type.cpp" }, - "26": { + "22": { "name": "keyword.operator.assignment.cpp" }, - "27": { + "23": { "name": "keyword.other.typename.cpp" }, - "28": { + "24": { "patterns": [ { "include": "#storage_specifiers" } ] }, - "29": { + "25": { "name": "meta.qualified_type.cpp", "patterns": [ { @@ -2329,23 +2250,7 @@ } ] }, - "30": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "31": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "32": { - "name": "comment.block.cpp" - }, - "33": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "34": { + "26": { "patterns": [ { "include": "#attributes_context" @@ -2355,49 +2260,67 @@ } ] }, - "35": { + "27": { "patterns": [ { "include": "#inline_comment" } ] }, + "28": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "29": { + "name": "comment.block.cpp" + }, + "30": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "31": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "32": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "33": { + "name": "comment.block.cpp" + }, + "34": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, "36": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "37": { - "name": "comment.block.cpp" - }, - "38": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "39": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "40": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "41": { - "name": "comment.block.cpp" - }, - "42": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "44": { "patterns": [ { "include": "#scope_resolution_inner_generated" } ] }, - "45": { + "37": { "name": "entity.name.scope-resolution.cpp" }, - "46": { + "38": { "name": "meta.template.call.cpp", "patterns": [ { @@ -2405,29 +2328,38 @@ } ] }, - "47": { + "39": { "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.cpp" }, - "48": { + "40": { "patterns": [ { "include": "#inline_comment" } ] }, - "49": { + "41": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "50": { + "42": { "name": "comment.block.cpp" }, - "51": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + "43": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] }, - "52": { + "44": { "name": "entity.name.type.cpp" }, - "53": { + "45": { "name": "meta.declaration.type.alias.value.unknown.cpp", "patterns": [ { @@ -2435,271 +2367,163 @@ } ] }, - "55": { + "47": { "patterns": [ { "include": "#inline_comment" } ] }, + "48": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "49": { + "name": "comment.block.cpp" + }, + "50": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "51": { + "name": "storage.modifier.pointer.cpp" + }, + "52": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "53": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "54": { + "name": "comment.block.cpp" + }, + "55": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, "56": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + "name": "storage.modifier.reference.cpp" }, "57": { - "name": "comment.block.cpp" + "patterns": [ + { + "include": "#inline_comment" + } + ] }, "58": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "59": { - "name": "storage.modifier.pointer.cpp" + "name": "comment.block.cpp" }, "60": { "patterns": [ { - "include": "#inline_comment" + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" } ] }, "61": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + "patterns": [ + { + "include": "#inline_comment" + } + ] }, "62": { - "name": "comment.block.cpp" + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "63": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + "name": "comment.block.cpp" }, "64": { - "name": "storage.modifier.reference.cpp" + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] }, "65": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "66": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "67": { - "name": "comment.block.cpp" - }, - "68": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "69": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "70": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "71": { - "name": "comment.block.cpp" - }, - "72": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "73": { "name": "punctuation.definition.begin.bracket.square.cpp" }, - "74": { + "66": { "patterns": [ { "include": "#evaluation_context" } ] }, - "75": { + "67": { "name": "punctuation.definition.end.bracket.square.cpp" }, - "76": { + "68": { "name": "punctuation.terminator.statement.cpp" } }, "name": "meta.declaration.type.alias.cpp" }, - "struct_declare": { - "match": "(struct)\\s+((?\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*)((?:&((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){0,2})((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)|\\s+)((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))", "captures": { "1": { - "name": "storage.type.struct.declare.cpp" + "name": "storage.modifier.cpp" }, "2": { - "name": "entity.name.type.struct.cpp" + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "4": { - "patterns": [ - { - "include": "#inline_comment" - } - ] + "name": "comment.block.cpp" }, "5": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] }, "6": { - "name": "comment.block.cpp" - }, - "7": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "8": { - "name": "storage.modifier.pointer.cpp" - }, - "9": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "10": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "11": { - "name": "comment.block.cpp" - }, - "12": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "13": { - "name": "storage.modifier.reference.cpp" - }, - "14": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "15": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "16": { - "name": "comment.block.cpp" - }, - "17": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "18": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "19": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "20": { - "name": "comment.block.cpp" - }, - "21": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "22": { - "name": "variable.other.object.declare.cpp" - } - } - }, - "parameter_struct": { - "match": "(struct)\\s+((?\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*)((?:&((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){0,2})((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)|\\s+)((?:(?\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))((?:((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*)((?:&((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){0,2})((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\())", - "beginCaptures": { - "1": { - "name": "meta.head.function.definition.cpp" - }, - "2": { "name": "meta.qualified_type.cpp", "patterns": [ { @@ -2736,22 +2560,6 @@ } ] }, - "3": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "4": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "5": { - "name": "comment.block.cpp" - }, - "6": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, "7": { "patterns": [ { @@ -2776,7 +2584,16 @@ "name": "comment.block.cpp" }, "11": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] }, "12": { "patterns": [ @@ -2792,7 +2609,16 @@ "name": "comment.block.cpp" }, "15": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] }, "17": { "patterns": [ @@ -2829,1274 +2655,22 @@ "name": "comment.block.cpp" }, "24": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] }, "25": { "name": "entity.name.type.cpp" - }, - "27": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "28": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "29": { - "name": "comment.block.cpp" - }, - "30": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "31": { - "name": "storage.modifier.pointer.cpp" - }, - "32": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "33": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "34": { - "name": "comment.block.cpp" - }, - "35": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "36": { - "name": "storage.modifier.reference.cpp" - }, - "37": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "38": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "39": { - "name": "comment.block.cpp" - }, - "40": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "41": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "42": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "43": { - "name": "comment.block.cpp" - }, - "44": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "45": { - "patterns": [ - { - "include": "#scope_resolution_function_definition_inner_generated" - } - ] - }, - "46": { - "name": "entity.name.function.definition.cpp" - }, - "47": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "48": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "49": { - "name": "comment.block.cpp" - }, - "50": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - } - }, - "end": "(?:(?<=\\}|%>|\\?\\?>)|(?=[;>\\[\\]=]))", - "patterns": [ - { - "name": "meta.head.function.definition.cpp", - "begin": "\\G ?", - "end": "((?:\\{|<%|\\?\\?<|(?=;)))", - "endCaptures": { - "1": { - "name": "punctuation.section.block.begin.bracket.curly.function.definition.cpp" - } - }, - "patterns": [ - { - "contentName": "meta.function.definition.parameters.cpp", - "begin": "(\\()", - "beginCaptures": { - "1": { - "name": "punctuation.section.parameters.begin.bracket.round.cpp" - } - }, - "end": "(\\))", - "endCaptures": { - "1": { - "name": "punctuation.section.parameters.end.bracket.round.cpp" - } - }, - "patterns": [ - { - "include": "#function_parameter_context" - }, - { - "include": "#function_call_context" - } - ] - }, - { - "include": "#comments_context" - }, - { - "include": "#root_context" - } - ] - }, - { - "name": "meta.body.function.definition.cpp", - "begin": "(?<=\\{|<%|\\?\\?<)", - "end": "(\\}|%>|\\?\\?>)", - "endCaptures": { - "1": { - "name": "punctuation.section.block.end.bracket.curly.function.definition.cpp" - } - }, - "patterns": [ - { - "include": "#function_body_context" - } - ] - }, - { - "name": "meta.tail.function.definition.cpp", - "begin": "(?<=\\}|%>|\\?\\?>)[\\s\\n]*", - "end": "[\\s\\n]*(?=;)", - "patterns": [ - { - "include": "#root_context" - } - ] - } - ] - }, - "static_assert": { - "begin": "(static_assert|_Static_assert)\\s*(\\()", - "beginCaptures": { - "1": { - "name": "keyword.other.static_assert.cpp" - }, - "2": { - "name": "punctuation.section.arguments.begin.bracket.round.cpp" - } - }, - "end": "(\\))", - "endCaptures": { - "1": { - "name": "punctuation.section.arguments.end.bracket.round.cpp" - } - }, - "patterns": [ - { - "name": "meta.static_assert.message.cpp", - "begin": "(,)\\s*(?=(?:L|u8|u|U\\s*\\\")?)", - "beginCaptures": { - "1": { - "name": "comma.cpp punctuation.separator.delimiter.cpp" - } - }, - "end": "(?=\\))", - "patterns": [ - { - "include": "#string_context" - }, - { - "include": "#string_context_c" - } - ] - }, - { - "include": "#function_call_context" - } - ] - }, - "function_call": { - "begin": "((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?]*|[^>]*+<[^>]*+>)++>\\s*)?(\\()", - "beginCaptures": { - "1": { - "patterns": [ - { - "include": "#scope_resolution_function_call_inner_generated" - } - ] - }, - "2": { - "name": "entity.name.function.call.cpp" - }, - "3": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "4": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "5": { - "name": "comment.block.cpp" - }, - "6": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "7": { - "name": "meta.template.call.cpp", - "patterns": [ - { - "include": "#template_call_range" - } - ] - }, - "8": { - "name": "punctuation.section.arguments.begin.bracket.round.function.call.cpp" - } - }, - "end": "(\\))", - "endCaptures": { - "1": { - "name": "punctuation.section.arguments.end.bracket.round.function.call.cpp" - } - }, - "patterns": [ - { - "include": "#function_call_context" - } - ] - }, - "operators": { - "patterns": [ - { - "include": "#sizeof_operator" - }, - { - "include": "#alignof_operator" - }, - { - "include": "#alignas_operator" - }, - { - "include": "#typeid_operator" - }, - { - "include": "#method_access" - }, - { - "include": "#member_access" - }, - { - "match": "(?>=|\\|=", - "name": "keyword.operator.assignment.compound.bitwise.cpp" - }, - { - "match": "<<|>>", - "name": "keyword.operator.bitwise.shift.cpp" - }, - { - "match": "!=|<=|>=|==|<|>", - "name": "keyword.operator.comparison.cpp" - }, - { - "match": "&&|!|\\|\\|", - "name": "keyword.operator.logical.cpp" - }, - { - "match": "&|\\||\\^|~", - "name": "keyword.operator.cpp" - }, - { - "include": "#assignment_operator" - }, - { - "match": "%|\\*|/|-|\\+", - "name": "keyword.operator.cpp" - }, - { - "begin": "\\?", - "beginCaptures": { - "0": { - "name": "keyword.operator.ternary.cpp" - } - }, - "end": ":", - "applyEndPatternLast": true, - "endCaptures": { - "0": { - "name": "keyword.operator.ternary.cpp" - } - }, - "patterns": [ - { - "include": "#method_access" - }, - { - "include": "#member_access" - }, - { - "include": "#function_call_c" - }, - { - "include": "#root_context" - } - ] - } - ] - }, - "function_pointer": { - "begin": "(((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))\\s*((?:((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*)((?:&((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){0,2})((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)(\\()(\\*)\\s*((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)?)\\s*(?:(\\[)(\\w*)(\\])\\s*)*(\\))\\s*(\\()", - "beginCaptures": { - "1": { - "name": "meta.qualified_type.cpp", - "patterns": [ - { - "match": "(?:class|struct|union|enum)", - "name": "storage.type.$0.cpp" - }, - { - "include": "#attributes_context" - }, - { - "include": "#function_type" - }, - { - "include": "#storage_types" - }, - { - "include": "#number_literal" - }, - { - "include": "#string_context_c" - }, - { - "include": "#comma" - }, - { - "include": "#scope_resolution_inner_generated" - }, - { - "include": "#template_call_range" - }, - { - "match": "(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*", - "name": "entity.name.type.cpp" - } - ] - }, - "2": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "3": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "4": { - "name": "comment.block.cpp" - }, - "5": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "6": { - "patterns": [ - { - "include": "#attributes_context" - }, - { - "include": "#number_literal" - } - ] - }, - "7": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "8": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "9": { - "name": "comment.block.cpp" - }, - "10": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "11": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "12": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "13": { - "name": "comment.block.cpp" - }, - "14": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "16": { - "patterns": [ - { - "include": "#scope_resolution_inner_generated" - } - ] - }, - "17": { - "name": "entity.name.scope-resolution.cpp" - }, - "18": { - "name": "meta.template.call.cpp", - "patterns": [ - { - "include": "#template_call_range" - } - ] - }, - "19": { - "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.cpp" - }, - "20": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "21": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "22": { - "name": "comment.block.cpp" - }, - "23": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "24": { - "name": "entity.name.type.cpp" - }, - "26": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "27": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "28": { - "name": "comment.block.cpp" - }, - "29": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "30": { - "name": "storage.modifier.pointer.cpp" - }, - "31": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "32": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "33": { - "name": "comment.block.cpp" - }, - "34": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "35": { - "name": "storage.modifier.reference.cpp" - }, - "36": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "37": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "38": { - "name": "comment.block.cpp" - }, - "39": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "40": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "41": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "42": { - "name": "comment.block.cpp" - }, - "43": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "44": { - "name": "punctuation.section.parens.begin.bracket.round.function.pointer.cpp" - }, - "45": { - "name": "punctuation.definition.function.pointer.dereference.cpp" - }, - "46": { - "name": "variable.other.definition.pointer.function.cpp" - }, - "47": { - "name": "punctuation.definition.begin.bracket.square.cpp" - }, - "48": { - "patterns": [ - { - "include": "#evaluation_context" - } - ] - }, - "49": { - "name": "punctuation.definition.end.bracket.square.cpp" - }, - "50": { - "name": "punctuation.section.parens.end.bracket.round.function.pointer.cpp" - }, - "51": { - "name": "punctuation.section.parameters.begin.bracket.round.function.pointer.cpp" - } - }, - "end": "(\\))\\s*(?=[{=,);]|\\n)(?!\\()", - "endCaptures": { - "1": { - "name": "punctuation.section.parameters.end.bracket.round.function.pointer.cpp" - } - }, - "patterns": [ - { - "include": "#function_parameter_context" - } - ] - }, - "function_pointer_parameter": { - "begin": "(((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))\\s*((?:((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*)((?:&((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){0,2})((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)(\\()(\\*)\\s*((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)?)\\s*(?:(\\[)(\\w*)(\\])\\s*)*(\\))\\s*(\\()", - "beginCaptures": { - "1": { - "name": "meta.qualified_type.cpp", - "patterns": [ - { - "match": "(?:class|struct|union|enum)", - "name": "storage.type.$0.cpp" - }, - { - "include": "#attributes_context" - }, - { - "include": "#function_type" - }, - { - "include": "#storage_types" - }, - { - "include": "#number_literal" - }, - { - "include": "#string_context_c" - }, - { - "include": "#comma" - }, - { - "include": "#scope_resolution_inner_generated" - }, - { - "include": "#template_call_range" - }, - { - "match": "(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*", - "name": "entity.name.type.cpp" - } - ] - }, - "2": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "3": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "4": { - "name": "comment.block.cpp" - }, - "5": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "6": { - "patterns": [ - { - "include": "#attributes_context" - }, - { - "include": "#number_literal" - } - ] - }, - "7": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "8": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "9": { - "name": "comment.block.cpp" - }, - "10": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "11": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "12": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "13": { - "name": "comment.block.cpp" - }, - "14": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "16": { - "patterns": [ - { - "include": "#scope_resolution_inner_generated" - } - ] - }, - "17": { - "name": "entity.name.scope-resolution.cpp" - }, - "18": { - "name": "meta.template.call.cpp", - "patterns": [ - { - "include": "#template_call_range" - } - ] - }, - "19": { - "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.cpp" - }, - "20": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "21": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "22": { - "name": "comment.block.cpp" - }, - "23": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "24": { - "name": "entity.name.type.cpp" - }, - "26": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "27": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "28": { - "name": "comment.block.cpp" - }, - "29": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "30": { - "name": "storage.modifier.pointer.cpp" - }, - "31": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "32": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "33": { - "name": "comment.block.cpp" - }, - "34": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "35": { - "name": "storage.modifier.reference.cpp" - }, - "36": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "37": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "38": { - "name": "comment.block.cpp" - }, - "39": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "40": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "41": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "42": { - "name": "comment.block.cpp" - }, - "43": { - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - "44": { - "name": "punctuation.section.parens.begin.bracket.round.function.pointer.cpp" - }, - "45": { - "name": "punctuation.definition.function.pointer.dereference.cpp" - }, - "46": { - "name": "variable.parameter.pointer.function.cpp" - }, - "47": { - "name": "punctuation.definition.begin.bracket.square.cpp" - }, - "48": { - "patterns": [ - { - "include": "#evaluation_context" - } - ] - }, - "49": { - "name": "punctuation.definition.end.bracket.square.cpp" - }, - "50": { - "name": "punctuation.section.parens.end.bracket.round.function.pointer.cpp" - }, - "51": { - "name": "punctuation.section.parameters.begin.bracket.round.function.pointer.cpp" - } - }, - "end": "(\\))\\s*(?=[{=,);]|\\n)(?!\\()", - "endCaptures": { - "1": { - "name": "punctuation.section.parameters.end.bracket.round.function.pointer.cpp" - } - }, - "patterns": [ - { - "include": "#function_parameter_context" - } - ] - }, - "probably_a_parameter": { - "match": "(?:((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*(?==))|((?<=\\w |\\*\\/|[&*>\\]\\)]|\\.\\.\\.)\\s*(?!(?:auto|void|char|short|int|signed|unsigned|long|float|double|bool|wchar_t|u_char|u_short|u_int|u_long|ushort|uint|u_quad_t|quad_t|qaddr_t|caddr_t|daddr_t|div_t|dev_t|fixpt_t|blkcnt_t|blksize_t|gid_t|in_addr_t|in_port_t|ino_t|key_t|mode_t|nlink_t|id_t|pid_t|off_t|segsz_t|swblk_t|uid_t|id_t|clock_t|size_t|ssize_t|time_t|useconds_t|suseconds_t|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|int_least8_t|int_least16_t|int_least32_t|int_least64_t|uint_least8_t|uint_least16_t|uint_least32_t|uint_least64_t|int_fast8_t|int_fast16_t|int_fast32_t|int_fast64_t|uint_fast8_t|uint_fast16_t|uint_fast32_t|uint_fast64_t|intptr_t|uintptr_t|intmax_t|intmax_t|uintmax_t|uintmax_t))(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*(?=(?:\\[\\]\\s*)?(?:,|\\)))))", - "captures": { - "1": { - "name": "variable.parameter.defaulted.cpp" - }, - "2": { - "name": "variable.parameter.cpp" } } }, - "operator_overload": { - "name": "meta.function.definition.parameters.operator-overload.cpp", - "begin": "(operator)((?:\\s*(?:\\+\\+|\\-\\-|\\(\\)|\\[\\]|\\->|\\+\\+|\\-\\-|\\+|\\-|!|~|\\*|&|\\->\\*|\\*|\\/|%|\\+|\\-|<<|>>|<=>|<|<=|>|>=|==|!=|&|\\^|\\||&&|\\|\\||=|\\+=|\\-=|\\*=|\\/=|%=|<<=|>>=|&=|\\^=|\\|=|,)|\\s+(?:(?:new|new\\[\\]|delete|delete\\[\\])|(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*&?)))\\s*(\\()", - "beginCaptures": { - "1": { - "name": "keyword.other.operator.overload.cpp" - }, - "2": { - "name": "entity.name.operator.overloadee.cpp", - "patterns": [ - { - "include": "#scope_resolution_function_definition_operator_overload_inner_generated" - } - ] - }, - "3": { - "name": "punctuation.section.parameters.begin.bracket.round.operator-overload.cpp" - } - }, - "end": "(\\))", - "endCaptures": { - "1": { - "name": "punctuation.section.parameters.end.bracket.round.operator-overload.cpp" - } - }, - "patterns": [ - { - "include": "#function_parameter_context" - } - ] - }, - "member_access": { - "match": "(?:((?\\*|->)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*(?:(?:(?:\\.\\*|\\.))|(?:(?:->\\*|->)))\\s*)*)\\s*(\\b(?!auto[^(?-mix:\\w)]|void[^(?-mix:\\w)]|char[^(?-mix:\\w)]|short[^(?-mix:\\w)]|int[^(?-mix:\\w)]|signed[^(?-mix:\\w)]|unsigned[^(?-mix:\\w)]|long[^(?-mix:\\w)]|float[^(?-mix:\\w)]|double[^(?-mix:\\w)]|bool[^(?-mix:\\w)]|wchar_t[^(?-mix:\\w)]|u_char[^(?-mix:\\w)]|u_short[^(?-mix:\\w)]|u_int[^(?-mix:\\w)]|u_long[^(?-mix:\\w)]|ushort[^(?-mix:\\w)]|uint[^(?-mix:\\w)]|u_quad_t[^(?-mix:\\w)]|quad_t[^(?-mix:\\w)]|qaddr_t[^(?-mix:\\w)]|caddr_t[^(?-mix:\\w)]|daddr_t[^(?-mix:\\w)]|div_t[^(?-mix:\\w)]|dev_t[^(?-mix:\\w)]|fixpt_t[^(?-mix:\\w)]|blkcnt_t[^(?-mix:\\w)]|blksize_t[^(?-mix:\\w)]|gid_t[^(?-mix:\\w)]|in_addr_t[^(?-mix:\\w)]|in_port_t[^(?-mix:\\w)]|ino_t[^(?-mix:\\w)]|key_t[^(?-mix:\\w)]|mode_t[^(?-mix:\\w)]|nlink_t[^(?-mix:\\w)]|id_t[^(?-mix:\\w)]|pid_t[^(?-mix:\\w)]|off_t[^(?-mix:\\w)]|segsz_t[^(?-mix:\\w)]|swblk_t[^(?-mix:\\w)]|uid_t[^(?-mix:\\w)]|id_t[^(?-mix:\\w)]|clock_t[^(?-mix:\\w)]|size_t[^(?-mix:\\w)]|ssize_t[^(?-mix:\\w)]|time_t[^(?-mix:\\w)]|useconds_t[^(?-mix:\\w)]|suseconds_t[^(?-mix:\\w)]|int8_t[^(?-mix:\\w)]|int16_t[^(?-mix:\\w)]|int32_t[^(?-mix:\\w)]|int64_t[^(?-mix:\\w)]|uint8_t[^(?-mix:\\w)]|uint16_t[^(?-mix:\\w)]|uint32_t[^(?-mix:\\w)]|uint64_t[^(?-mix:\\w)]|int_least8_t[^(?-mix:\\w)]|int_least16_t[^(?-mix:\\w)]|int_least32_t[^(?-mix:\\w)]|int_least64_t[^(?-mix:\\w)]|uint_least8_t[^(?-mix:\\w)]|uint_least16_t[^(?-mix:\\w)]|uint_least32_t[^(?-mix:\\w)]|uint_least64_t[^(?-mix:\\w)]|int_fast8_t[^(?-mix:\\w)]|int_fast16_t[^(?-mix:\\w)]|int_fast32_t[^(?-mix:\\w)]|int_fast64_t[^(?-mix:\\w)]|uint_fast8_t[^(?-mix:\\w)]|uint_fast16_t[^(?-mix:\\w)]|uint_fast32_t[^(?-mix:\\w)]|uint_fast64_t[^(?-mix:\\w)]|intptr_t[^(?-mix:\\w)]|uintptr_t[^(?-mix:\\w)]|intmax_t[^(?-mix:\\w)]|intmax_t[^(?-mix:\\w)]|uintmax_t[^(?-mix:\\w)]|uintmax_t[^(?-mix:\\w)])(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b(?!\\())", - "captures": { - "1": { - "name": "variable.language.this.cpp" - }, - "2": { - "name": "variable.other.object.access.cpp" - }, - "3": { - "name": "punctuation.separator.dot-access.cpp" - }, - "4": { - "name": "punctuation.separator.pointer-access.cpp" - }, - "5": { - "patterns": [ - { - "match": "(?<=(?:\\.\\*|\\.|->|->\\*))\\s*(?:((?\\*|->)))", - "captures": { - "1": { - "name": "variable.language.this.cpp" - }, - "2": { - "name": "variable.other.object.property.cpp" - }, - "3": { - "name": "punctuation.separator.dot-access.cpp" - }, - "4": { - "name": "punctuation.separator.pointer-access.cpp" - } - } - }, - { - "match": "(?:((?\\*|->)))", - "captures": { - "1": { - "name": "variable.language.this.cpp" - }, - "2": { - "name": "variable.other.object.access.cpp" - }, - "3": { - "name": "punctuation.separator.dot-access.cpp" - }, - "4": { - "name": "punctuation.separator.pointer-access.cpp" - } - } - }, - { - "include": "#member_access" - }, - { - "include": "#method_access" - } - ] - }, - "6": { - "name": "variable.other.property.cpp" - } - } - }, - "method_access": { - "begin": "(?:((?\\*|->)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*(?:(?:(?:\\.\\*|\\.))|(?:(?:->\\*|->)))\\s*)*)\\s*((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*(\\()", - "beginCaptures": { - "1": { - "name": "variable.language.this.cpp" - }, - "2": { - "name": "variable.other.object.access.cpp" - }, - "3": { - "name": "punctuation.separator.dot-access.cpp" - }, - "4": { - "name": "punctuation.separator.pointer-access.cpp" - }, - "5": { - "patterns": [ - { - "match": "(?<=(?:\\.\\*|\\.|->|->\\*))\\s*(?:((?\\*|->)))", - "captures": { - "1": { - "name": "variable.language.this.cpp" - }, - "2": { - "name": "variable.other.object.property.cpp" - }, - "3": { - "name": "punctuation.separator.dot-access.cpp" - }, - "4": { - "name": "punctuation.separator.pointer-access.cpp" - } - } - }, - { - "match": "(?:((?\\*|->)))", - "captures": { - "1": { - "name": "variable.language.this.cpp" - }, - "2": { - "name": "variable.other.object.access.cpp" - }, - "3": { - "name": "punctuation.separator.dot-access.cpp" - }, - "4": { - "name": "punctuation.separator.pointer-access.cpp" - } - } - }, - { - "include": "#member_access" - }, - { - "include": "#method_access" - } - ] - }, - "6": { - "name": "entity.name.function.member.cpp" - }, - "7": { - "name": "punctuation.section.arguments.begin.bracket.round.function.member.cpp" - } - }, - "end": "(\\))", - "endCaptures": { - "1": { - "name": "punctuation.section.arguments.end.bracket.round.function.member.cpp" - } - }, - "patterns": [ - { - "include": "#function_call_context" - } - ] - }, - "using_namespace": { - "name": "meta.using-namespace.cpp", - "begin": "(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)?((?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)\\s*((?|\\?\\?>)|(?=[;>\\[\\]=]))", - "patterns": [ - { - "name": "meta.head.namespace.cpp", - "begin": "\\G ?", - "end": "((?:\\{|<%|\\?\\?<|(?=;)))", - "endCaptures": { - "1": { - "name": "punctuation.section.block.begin.bracket.curly.namespace.cpp" - } - }, - "patterns": [ - { - "include": "#attributes_context" - }, - { - "match": "((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)\\s*((?|\\?\\?>)", - "endCaptures": { - "1": { - "name": "punctuation.section.block.end.bracket.curly.namespace.cpp" - } - }, - "patterns": [ - { - "include": "#root_context" - } - ] - }, - { - "name": "meta.tail.namespace.cpp", - "begin": "(?<=\\}|%>|\\?\\?>)[\\s\\n]*", - "end": "[\\s\\n]*(?=;)", - "patterns": [ - { - "include": "#root_context" - } - ] - } - ] - }, - "macro_argument": { - "match": "##(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*(?!\\w)", - "name": "variable.other.macro.argument.cpp" - }, - "lambdas": { - "begin": "((?:(?<=[^\\s]|^)(?])|(?<=\\Wreturn|^return))\\s*(\\[(?!\\[))((?:.*\\[.*?\\].*?)*.*?)(\\]))", - "beginCaptures": { - "2": { - "name": "punctuation.definition.capture.begin.lambda.cpp" - }, - "3": { - "name": "meta.lambda.capture.cpp", - "patterns": [ - { - "include": "#function_parameter_context" - } - ] - }, - "4": { - "name": "punctuation.definition.capture.end.lambda.cpp" - } - }, - "end": "(?<=})", - "patterns": [ - { - "name": "meta.function.definition.parameters.lambda.cpp", - "begin": "(\\()", - "beginCaptures": { - "1": { - "name": "punctuation.definition.parameters.begin.lambda.cpp" - } - }, - "end": "(\\))", - "endCaptures": { - "1": { - "name": "punctuation.definition.parameters.end.lambda.cpp" - } - }, - "patterns": [ - { - "include": "#function_parameter_context" - } - ] - }, - { - "match": "(?)((?:.+?(?=\\{|$))?)", - "captures": { - "1": { - "name": "punctuation.definition.lambda.return-type.cpp" - }, - "2": { - "name": "storage.type.return-type.lambda.cpp" - } - } - }, - { - "name": "meta.function.definition.body.lambda.cpp", - "begin": "(\\{)", - "beginCaptures": { - "1": { - "name": "punctuation.section.block.begin.bracket.curly.lambda.cpp" - } - }, - "end": "(\\})", - "endCaptures": { - "1": { - "name": "punctuation.section.block.end.bracket.curly.lambda.cpp" - } - }, - "patterns": [ - { - "include": "#root_context" - } - ] - } - ] - }, - "pthread_types": { - "match": "(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))((?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)\\s*+((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\())", + "beginCaptures": { + "1": { + "name": "meta.head.function.definition.cpp" + }, + "2": { + "name": "meta.qualified_type.cpp", + "patterns": [ + { + "match": "(?:class|struct|union|enum)", + "name": "storage.type.$0.cpp" + }, + { + "include": "#attributes_context" + }, + { + "include": "#function_type" + }, + { + "include": "#storage_types" + }, + { + "include": "#number_literal" + }, + { + "include": "#string_context_c" + }, + { + "include": "#comma" + }, + { + "include": "#scope_resolution_inner_generated" + }, + { + "include": "#template_call_range" + }, + { + "match": "(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*", + "name": "entity.name.type.cpp" + } + ] + }, + "3": { + "patterns": [ + { + "include": "#attributes_context" + }, + { + "include": "#number_literal" + } + ] + }, + "4": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "5": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "6": { + "name": "comment.block.cpp" + }, + "7": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "8": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "9": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "10": { + "name": "comment.block.cpp" + }, + "11": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "13": { + "patterns": [ + { + "include": "#scope_resolution_inner_generated" + } + ] + }, + "14": { + "name": "entity.name.scope-resolution.cpp" + }, + "15": { + "name": "meta.template.call.cpp", + "patterns": [ + { + "include": "#template_call_range" + } + ] + }, + "16": { + "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.cpp" + }, + "17": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "18": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "19": { + "name": "comment.block.cpp" + }, + "20": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "21": { + "name": "entity.name.type.cpp" + }, + "23": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "24": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "25": { + "name": "comment.block.cpp" + }, + "26": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "27": { + "name": "storage.modifier.pointer.cpp" + }, + "28": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "29": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "30": { + "name": "comment.block.cpp" + }, + "31": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "32": { + "name": "storage.modifier.reference.cpp" + }, + "33": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "34": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "35": { + "name": "comment.block.cpp" + }, + "36": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "37": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "38": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "39": { + "name": "comment.block.cpp" + }, + "40": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "41": { + "name": "storage.type.modifier.calling-convention.cpp" + }, + "42": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "43": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "44": { + "name": "comment.block.cpp" + }, + "45": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "46": { + "patterns": [ + { + "include": "#scope_resolution_function_definition_inner_generated" + } + ] + }, + "47": { + "name": "entity.name.function.definition.cpp" + }, + "48": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "49": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "50": { + "name": "comment.block.cpp" + }, + "51": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "end": "(?:(?<=\\}|%>|\\?\\?>)|(?=[;>\\[\\]=]))", + "patterns": [ + { + "name": "meta.head.function.definition.cpp", + "begin": "\\G ?", + "end": "((?:\\{|<%|\\?\\?<|(?=;)))", + "endCaptures": { + "1": { + "name": "punctuation.section.block.begin.bracket.curly.function.definition.cpp" + } + }, + "patterns": [ + { + "include": "#ever_present_context" + }, + { + "contentName": "meta.function.definition.parameters.cpp", + "begin": "(\\()", + "beginCaptures": { + "1": { + "name": "punctuation.section.parameters.begin.bracket.round.cpp" + } + }, + "end": "(\\))", + "endCaptures": { + "1": { + "name": "punctuation.section.parameters.end.bracket.round.cpp" + } + }, + "patterns": [ + { + "include": "#function_parameter_context" + }, + { + "include": "#evaluation_context" + } + ] + }, + { + "include": "#initial_context" + } + ] + }, + { + "name": "meta.body.function.definition.cpp", + "begin": "(?<=\\{|<%|\\?\\?<)", + "end": "(\\}|%>|\\?\\?>)", + "endCaptures": { + "1": { + "name": "punctuation.section.block.end.bracket.curly.function.definition.cpp" + } + }, + "patterns": [ + { + "include": "#function_body_context" + } + ] + }, + { + "name": "meta.tail.function.definition.cpp", + "begin": "(?<=\\}|%>|\\?\\?>)[\\s\\n]*", + "end": "[\\s\\n]*(?=;)", + "patterns": [ + { + "include": "#initial_context" + } + ] + } + ] + }, + "operator_overload": { + "name": "meta.function.definition.special.operator-overload.cpp", + "begin": "((?:(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))((?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?))?\\s*+((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*)(operator)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*)(?:(?:((?:\\+\\+|\\-\\-|\\(\\)|\\[\\]|\\->|\\+\\+|\\-\\-|\\+|\\-|!|~|\\*|&|new|new\\[\\]|delete|delete\\[\\]|\\->\\*|\\*|\\/|%|\\+|\\-|<<|>>|<=>|<|<=|>|>=|==|!=|&|\\^|\\||&&|\\|\\||=|\\+=|\\-=|\\*=|\\/=|%=|<<=|>>=|&=|\\^=|\\|=|,))|((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\[\\])?)))|(\"\")((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\<|\\())", + "beginCaptures": { + "1": { + "name": "meta.head.function.definition.special.operator-overload.cpp" + }, + "2": { + "name": "meta.qualified_type.cpp", + "patterns": [ + { + "match": "(?:class|struct|union|enum)", + "name": "storage.type.$0.cpp" + }, + { + "include": "#attributes_context" + }, + { + "include": "#function_type" + }, + { + "include": "#storage_types" + }, + { + "include": "#number_literal" + }, + { + "include": "#string_context_c" + }, + { + "include": "#comma" + }, + { + "include": "#scope_resolution_inner_generated" + }, + { + "include": "#template_call_range" + }, + { + "match": "(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*", + "name": "entity.name.type.cpp" + } + ] + }, + "3": { + "patterns": [ + { + "include": "#attributes_context" + }, + { + "include": "#number_literal" + } + ] + }, + "4": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "5": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "6": { + "name": "comment.block.cpp" + }, + "7": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "8": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "9": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "10": { + "name": "comment.block.cpp" + }, + "11": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "13": { + "patterns": [ + { + "include": "#scope_resolution_inner_generated" + } + ] + }, + "14": { + "name": "entity.name.scope-resolution.cpp" + }, + "15": { + "name": "meta.template.call.cpp", + "patterns": [ + { + "include": "#template_call_range" + } + ] + }, + "16": { + "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.cpp" + }, + "17": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "18": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "19": { + "name": "comment.block.cpp" + }, + "20": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "21": { + "name": "entity.name.type.cpp" + }, + "23": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "24": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "25": { + "name": "comment.block.cpp" + }, + "26": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "27": { + "name": "storage.modifier.pointer.cpp" + }, + "28": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "29": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "30": { + "name": "comment.block.cpp" + }, + "31": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "32": { + "name": "storage.modifier.reference.cpp" + }, + "33": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "34": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "35": { + "name": "comment.block.cpp" + }, + "36": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "37": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "38": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "39": { + "name": "comment.block.cpp" + }, + "40": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "41": { + "name": "storage.type.modifier.calling-convention.cpp" + }, + "42": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "43": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "44": { + "name": "comment.block.cpp" + }, + "45": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "46": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "47": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "48": { + "name": "comment.block.cpp" + }, + "49": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "50": { + "patterns": [ + { + "match": "::", + "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.operator.cpp" + }, + { + "match": "(?|\\?\\?>)|(?=[;>\\[\\]=]))", + "patterns": [ + { + "name": "meta.head.function.definition.special.operator-overload.cpp", + "begin": "\\G ?", + "end": "((?:\\{|<%|\\?\\?<|(?=;)))", + "endCaptures": { + "1": { + "name": "punctuation.section.block.begin.bracket.curly.function.definition.special.operator-overload.cpp" + } + }, + "patterns": [ + { + "include": "#ever_present_context" + }, + { + "include": "#template_call_range" + }, + { + "contentName": "meta.function.definition.parameters.special.operator-overload.cpp", + "begin": "(\\()", + "beginCaptures": { + "1": { + "name": "punctuation.section.parameters.begin.bracket.round.special.operator-overload.cpp" + } + }, + "end": "(\\))", + "endCaptures": { + "1": { + "name": "punctuation.section.parameters.end.bracket.round.special.operator-overload.cpp" + } + }, + "patterns": [ + { + "include": "#function_parameter_context" + }, + { + "include": "#evaluation_context" + } + ] + }, + { + "include": "#initial_context" + } + ] + }, + { + "name": "meta.body.function.definition.special.operator-overload.cpp", + "begin": "(?<=\\{|<%|\\?\\?<)", + "end": "(\\}|%>|\\?\\?>)", + "endCaptures": { + "1": { + "name": "punctuation.section.block.end.bracket.curly.function.definition.special.operator-overload.cpp" + } + }, + "patterns": [ + { + "include": "#function_body_context" + } + ] + }, + { + "name": "meta.tail.function.definition.special.operator-overload.cpp", + "begin": "(?<=\\}|%>|\\?\\?>)[\\s\\n]*", + "end": "[\\s\\n]*(?=;)", + "patterns": [ + { + "include": "#initial_context" + } + ] + } + ] + }, + "static_assert": { + "begin": "((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\()", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "5": { + "name": "keyword.other.static_assert.cpp" + }, + "6": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "7": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "8": { + "name": "comment.block.cpp" + }, + "9": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "10": { + "name": "punctuation.section.arguments.begin.bracket.round.static_assert.cpp" + } + }, + "end": "(\\))", + "endCaptures": { + "1": { + "name": "punctuation.section.arguments.end.bracket.round.static_assert.cpp" + } + }, + "patterns": [ + { + "name": "meta.static_assert.message.cpp", + "begin": "(,)\\s*(?=(?:L|u8|u|U\\s*\\\")?)", + "beginCaptures": { + "1": { + "name": "comma.cpp punctuation.separator.delimiter.cpp" + } + }, + "end": "(?=\\))", + "patterns": [ + { + "include": "#string_context" + }, + { + "include": "#string_context_c" + } + ] + }, + { + "include": "#evaluation_context" + } + ] + }, + "function_call": { + "begin": "((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?]*|[^>]*+<[^>]*+>)++>\\s*)?(\\()", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#scope_resolution_function_call_inner_generated" + } + ] + }, + "2": { + "name": "entity.name.function.call.cpp" + }, + "3": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "4": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "5": { + "name": "comment.block.cpp" + }, + "6": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "7": { + "name": "meta.template.call.cpp", + "patterns": [ + { + "include": "#template_call_range" + } + ] + }, + "8": { + "name": "punctuation.section.arguments.begin.bracket.round.function.call.cpp" + } + }, + "end": "(\\))", + "endCaptures": { + "1": { + "name": "punctuation.section.arguments.end.bracket.round.function.call.cpp" + } + }, + "patterns": [ + { + "include": "#evaluation_context" + } + ] + }, + "constructor_inline": { + "name": "meta.function.definition.special.constructor.cpp", + "begin": "(^((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:((?:inline|constexpr|mutable|friend|explicit|virtual))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*\\s*+((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?|\\?\\?>)|(?=[;>\\[\\]=]))", + "patterns": [ + { + "name": "meta.head.function.definition.special.constructor.cpp", + "begin": "\\G ?", + "end": "((?:\\{|<%|\\?\\?<|(?=;)))", + "endCaptures": { + "1": { + "name": "punctuation.section.block.begin.bracket.curly.function.definition.special.constructor.cpp" + } + }, + "patterns": [ + { + "include": "#ever_present_context" + }, + { + "patterns": [ + { + "match": "(\\=)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(default)|(delete))", + "captures": { + "1": { + "name": "keyword.operator.assignment.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "name": "keyword.other.default.constructor.cpp" + }, + "7": { + "name": "keyword.other.delete.constructor.cpp" + } + } + } + ] + }, + { + "begin": "(:)", + "beginCaptures": { + "1": { + "name": "punctuation.separator.initializers.cpp" + } + }, + "end": "(?=\\{)", + "patterns": [ + { + "contentName": "meta.parameter.initialization.cpp", + "begin": "((?|\\?\\?>)", + "endCaptures": { + "1": { + "name": "punctuation.section.block.end.bracket.curly.function.definition.special.constructor.cpp" + } + }, + "patterns": [ + { + "include": "#function_body_context" + } + ] + }, + { + "name": "meta.tail.function.definition.special.constructor.cpp", + "begin": "(?<=\\}|%>|\\?\\?>)[\\s\\n]*", + "end": "[\\s\\n]*(?=;)", + "patterns": [ + { + "include": "#initial_context" + } + ] + } + ] + }, + "constructor_root": { + "name": "meta.function.definition.special.constructor.cpp", + "begin": "(\\s*+\\s*+((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*)(((?>(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))::((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\9((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\()))", + "beginCaptures": { + "1": { + "name": "meta.head.function.definition.special.constructor.cpp" + }, + "2": { + "name": "storage.type.modifier.calling-convention.cpp" + }, + "3": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "4": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "5": { + "name": "comment.block.cpp" + }, + "6": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "7": { + "patterns": [ + { + "match": "::", + "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.constructor.cpp" + }, + { + "match": "(?|\\?\\?>)|(?=[;>\\[\\]=]))", + "patterns": [ + { + "name": "meta.head.function.definition.special.constructor.cpp", + "begin": "\\G ?", + "end": "((?:\\{|<%|\\?\\?<|(?=;)))", + "endCaptures": { + "1": { + "name": "punctuation.section.block.begin.bracket.curly.function.definition.special.constructor.cpp" + } + }, + "patterns": [ + { + "include": "#ever_present_context" + }, + { + "patterns": [ + { + "match": "(\\=)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(default)|(delete))", + "captures": { + "1": { + "name": "keyword.operator.assignment.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "name": "keyword.other.default.constructor.cpp" + }, + "7": { + "name": "keyword.other.delete.constructor.cpp" + } + } + } + ] + }, + { + "begin": "(:)", + "beginCaptures": { + "1": { + "name": "punctuation.separator.initializers.cpp" + } + }, + "end": "(?=\\{)", + "patterns": [ + { + "contentName": "meta.parameter.initialization.cpp", + "begin": "((?|\\?\\?>)", + "endCaptures": { + "1": { + "name": "punctuation.section.block.end.bracket.curly.function.definition.special.constructor.cpp" + } + }, + "patterns": [ + { + "include": "#function_body_context" + } + ] + }, + { + "name": "meta.tail.function.definition.special.constructor.cpp", + "begin": "(?<=\\}|%>|\\?\\?>)[\\s\\n]*", + "end": "[\\s\\n]*(?=;)", + "patterns": [ + { + "include": "#initial_context" + } + ] + } + ] + }, + "destructor_inline": { + "name": "meta.function.definition.special.member.destructor.cpp", + "begin": "(^((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\s*+((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:((?:inline|constexpr|mutable|friend|explicit|virtual))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(~(?|\\?\\?>)|(?=[;>\\[\\]=]))", + "patterns": [ + { + "name": "meta.head.function.definition.special.member.destructor.cpp", + "begin": "\\G ?", + "end": "((?:\\{|<%|\\?\\?<|(?=;)))", + "endCaptures": { + "1": { + "name": "punctuation.section.block.begin.bracket.curly.function.definition.special.member.destructor.cpp" + } + }, + "patterns": [ + { + "include": "#ever_present_context" + }, + { + "patterns": [ + { + "match": "(\\=)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(default)|(delete))", + "captures": { + "1": { + "name": "keyword.operator.assignment.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "name": "keyword.other.default.constructor.cpp" + }, + "7": { + "name": "keyword.other.delete.constructor.cpp" + } + } + } + ] + }, + { + "contentName": "meta.function.definition.parameters.special.member.destructor.cpp", + "begin": "(\\()", + "beginCaptures": { + "1": { + "name": "punctuation.section.parameters.begin.bracket.round.special.member.destructor.cpp" + } + }, + "end": "(\\))", + "endCaptures": { + "1": { + "name": "punctuation.section.parameters.end.bracket.round.special.member.destructor.cpp" + } + } + }, + { + "include": "#initial_context" + } + ] + }, + { + "name": "meta.body.function.definition.special.member.destructor.cpp", + "begin": "(?<=\\{|<%|\\?\\?<)", + "end": "(\\}|%>|\\?\\?>)", + "endCaptures": { + "1": { + "name": "punctuation.section.block.end.bracket.curly.function.definition.special.member.destructor.cpp" + } + }, + "patterns": [ + { + "include": "#function_body_context" + } + ] + }, + { + "name": "meta.tail.function.definition.special.member.destructor.cpp", + "begin": "(?<=\\}|%>|\\?\\?>)[\\s\\n]*", + "end": "[\\s\\n]*(?=;)", + "patterns": [ + { + "include": "#initial_context" + } + ] + } + ] + }, + "destructor_root": { + "name": "meta.function.definition.special.member.destructor.cpp", + "begin": "(\\s*+((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*)(((?>(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))::((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))~\\9((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\()))", + "beginCaptures": { + "1": { + "name": "meta.head.function.definition.special.member.destructor.cpp" + }, + "2": { + "name": "storage.type.modifier.calling-convention.cpp" + }, + "3": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "4": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "5": { + "name": "comment.block.cpp" + }, + "6": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "7": { + "patterns": [ + { + "match": "::", + "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.destructor.cpp" + }, + { + "match": "(?|\\?\\?>)|(?=[;>\\[\\]=]))", + "patterns": [ + { + "name": "meta.head.function.definition.special.member.destructor.cpp", + "begin": "\\G ?", + "end": "((?:\\{|<%|\\?\\?<|(?=;)))", + "endCaptures": { + "1": { + "name": "punctuation.section.block.begin.bracket.curly.function.definition.special.member.destructor.cpp" + } + }, + "patterns": [ + { + "include": "#ever_present_context" + }, + { + "patterns": [ + { + "match": "(\\=)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(default)|(delete))", + "captures": { + "1": { + "name": "keyword.operator.assignment.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "name": "keyword.other.default.constructor.cpp" + }, + "7": { + "name": "keyword.other.delete.constructor.cpp" + } + } + } + ] + }, + { + "contentName": "meta.function.definition.parameters.special.member.destructor.cpp", + "begin": "(\\()", + "beginCaptures": { + "1": { + "name": "punctuation.section.parameters.begin.bracket.round.special.member.destructor.cpp" + } + }, + "end": "(\\))", + "endCaptures": { + "1": { + "name": "punctuation.section.parameters.end.bracket.round.special.member.destructor.cpp" + } + } + }, + { + "include": "#initial_context" + } + ] + }, + { + "name": "meta.body.function.definition.special.member.destructor.cpp", + "begin": "(?<=\\{|<%|\\?\\?<)", + "end": "(\\}|%>|\\?\\?>)", + "endCaptures": { + "1": { + "name": "punctuation.section.block.end.bracket.curly.function.definition.special.member.destructor.cpp" + } + }, + "patterns": [ + { + "include": "#function_body_context" + } + ] + }, + { + "name": "meta.tail.function.definition.special.member.destructor.cpp", + "begin": "(?<=\\}|%>|\\?\\?>)[\\s\\n]*", + "end": "[\\s\\n]*(?=;)", + "patterns": [ + { + "include": "#initial_context" + } + ] + } + ] + }, + "operators": { + "patterns": [ + { + "include": "#sizeof_operator" + }, + { + "include": "#alignof_operator" + }, + { + "include": "#alignas_operator" + }, + { + "include": "#typeid_operator" + }, + { + "include": "#noexcept_operator" + }, + { + "match": "--", + "name": "keyword.operator.decrement.cpp" + }, + { + "match": "\\+\\+", + "name": "keyword.operator.increment.cpp" + }, + { + "match": "%=|\\+=|-=|\\*=|(?>=|\\|=", + "name": "keyword.operator.assignment.compound.bitwise.cpp" + }, + { + "match": "<<|>>", + "name": "keyword.operator.bitwise.shift.cpp" + }, + { + "match": "!=|<=|>=|==|<|>", + "name": "keyword.operator.comparison.cpp" + }, + { + "match": "&&|!|\\|\\|", + "name": "keyword.operator.logical.cpp" + }, + { + "match": "&|\\||\\^|~", + "name": "keyword.operator.cpp" + }, + { + "include": "#assignment_operator" + }, + { + "match": "%|\\*|/|-|\\+", + "name": "keyword.operator.cpp" + }, + { + "include": "#ternary_operator" + } + ] + }, + "wordlike_operators": { + "match": "(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\()", + "beginCaptures": { + "1": { + "name": "keyword.operator.functionlike.cpp keyword.operator.sizeof.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "name": "punctuation.section.arguments.begin.bracket.round.operator.sizeof.cpp" + } + }, + "end": "(\\))", + "endCaptures": { + "1": { + "name": "punctuation.section.arguments.end.bracket.round.operator.sizeof.cpp" + } + }, + "patterns": [ + { + "include": "#evaluation_context" + } + ] + }, + "alignof_operator": { + "contentName": "meta.arguments.operator.alignof.cpp", + "begin": "((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\()", + "beginCaptures": { + "1": { + "name": "keyword.operator.functionlike.cpp keyword.operator.alignof.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "name": "punctuation.section.arguments.begin.bracket.round.operator.alignof.cpp" + } + }, + "end": "(\\))", + "endCaptures": { + "1": { + "name": "punctuation.section.arguments.end.bracket.round.operator.alignof.cpp" + } + }, + "patterns": [ + { + "include": "#evaluation_context" + } + ] + }, + "alignas_operator": { + "contentName": "meta.arguments.operator.alignas.cpp", + "begin": "((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\()", + "beginCaptures": { + "1": { + "name": "keyword.operator.functionlike.cpp keyword.operator.alignas.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "name": "punctuation.section.arguments.begin.bracket.round.operator.alignas.cpp" + } + }, + "end": "(\\))", + "endCaptures": { + "1": { + "name": "punctuation.section.arguments.end.bracket.round.operator.alignas.cpp" + } + }, + "patterns": [ + { + "include": "#evaluation_context" + } + ] + }, + "typeid_operator": { + "contentName": "meta.arguments.operator.typeid.cpp", + "begin": "((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\()", + "beginCaptures": { + "1": { + "name": "keyword.operator.functionlike.cpp keyword.operator.typeid.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "name": "punctuation.section.arguments.begin.bracket.round.operator.typeid.cpp" + } + }, + "end": "(\\))", + "endCaptures": { + "1": { + "name": "punctuation.section.arguments.end.bracket.round.operator.typeid.cpp" + } + }, + "patterns": [ + { + "include": "#evaluation_context" + } + ] + }, + "noexcept_operator": { + "contentName": "meta.arguments.operator.noexcept.cpp", + "begin": "((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\()", + "beginCaptures": { + "1": { + "name": "keyword.operator.functionlike.cpp keyword.operator.noexcept.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "name": "punctuation.section.arguments.begin.bracket.round.operator.noexcept.cpp" + } + }, + "end": "(\\))", + "endCaptures": { + "1": { + "name": "punctuation.section.arguments.end.bracket.round.operator.noexcept.cpp" + } + }, + "patterns": [ + { + "include": "#evaluation_context" + } + ] + }, + "ternary_operator": { + "applyEndPatternLast": true, + "begin": "(\\?)", + "beginCaptures": { + "1": { + "name": "keyword.operator.ternary.cpp" + } + }, + "end": "(:)", + "endCaptures": { + "1": { + "name": "keyword.operator.ternary.cpp" + } + }, + "patterns": [ + { + "include": "#ever_present_context" + }, + { + "include": "#string_context" + }, + { + "include": "#number_literal" + }, + { + "include": "#string_context_c" + }, + { + "include": "#method_access" + }, + { + "include": "#member_access" + }, + { + "include": "#predefined_macros" + }, + { + "include": "#operators" + }, + { + "include": "#memory_operators" + }, + { + "include": "#wordlike_operators" + }, + { + "include": "#type_casting_operators" + }, + { + "include": "#control_flow_keywords" + }, + { + "include": "#exception_keywords" + }, + { + "include": "#the_this_keyword" + }, + { + "include": "#language_constants" + }, + { + "include": "#qualifiers_and_specifiers_post_parameters" + }, + { + "include": "#functional_specifiers_pre_parameters" + }, + { + "include": "#storage_types" + }, + { + "include": "#misc_storage_modifiers" + }, + { + "include": "#lambdas" + }, + { + "include": "#attributes_context" + }, + { + "include": "#parentheses" + }, + { + "include": "#function_call" + }, + { + "include": "#scope_resolution_inner_generated" + }, + { + "include": "#square_brackets" + }, + { + "include": "#empty_square_brackets" + }, + { + "include": "#semicolon" + }, + { + "include": "#comma" + } + ] + }, + "function_pointer": { + "begin": "(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))((?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)(\\()(\\*)\\s*((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)?)\\s*(?:(\\[)(\\w*)(\\])\\s*)*(\\))\\s*(\\()", + "beginCaptures": { + "1": { + "name": "meta.qualified_type.cpp", + "patterns": [ + { + "match": "(?:class|struct|union|enum)", + "name": "storage.type.$0.cpp" + }, + { + "include": "#attributes_context" + }, + { + "include": "#function_type" + }, + { + "include": "#storage_types" + }, + { + "include": "#number_literal" + }, + { + "include": "#string_context_c" + }, + { + "include": "#comma" + }, + { + "include": "#scope_resolution_inner_generated" + }, + { + "include": "#template_call_range" + }, + { + "match": "(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*", + "name": "entity.name.type.cpp" + } + ] + }, + "2": { + "patterns": [ + { + "include": "#attributes_context" + }, + { + "include": "#number_literal" + } + ] + }, + "3": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "4": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "5": { + "name": "comment.block.cpp" + }, + "6": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "7": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "8": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "9": { + "name": "comment.block.cpp" + }, + "10": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "12": { + "patterns": [ + { + "include": "#scope_resolution_inner_generated" + } + ] + }, + "13": { + "name": "entity.name.scope-resolution.cpp" + }, + "14": { + "name": "meta.template.call.cpp", + "patterns": [ + { + "include": "#template_call_range" + } + ] + }, + "15": { + "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.cpp" + }, + "16": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "17": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "18": { + "name": "comment.block.cpp" + }, + "19": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "20": { + "name": "entity.name.type.cpp" + }, + "22": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "23": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "24": { + "name": "comment.block.cpp" + }, + "25": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "26": { + "name": "storage.modifier.pointer.cpp" + }, + "27": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "28": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "29": { + "name": "comment.block.cpp" + }, + "30": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "31": { + "name": "storage.modifier.reference.cpp" + }, + "32": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "33": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "34": { + "name": "comment.block.cpp" + }, + "35": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "36": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "37": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "38": { + "name": "comment.block.cpp" + }, + "39": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "40": { + "name": "punctuation.section.parens.begin.bracket.round.function.pointer.cpp" + }, + "41": { + "name": "punctuation.definition.function.pointer.dereference.cpp" + }, + "42": { + "name": "variable.other.definition.pointer.function.cpp" + }, + "43": { + "name": "punctuation.definition.begin.bracket.square.cpp" + }, + "44": { + "patterns": [ + { + "include": "#evaluation_context" + } + ] + }, + "45": { + "name": "punctuation.definition.end.bracket.square.cpp" + }, + "46": { + "name": "punctuation.section.parens.end.bracket.round.function.pointer.cpp" + }, + "47": { + "name": "punctuation.section.parameters.begin.bracket.round.function.pointer.cpp" + } + }, + "end": "(\\))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=[{=,);]|\\n)(?!\\()", + "endCaptures": { + "1": { + "name": "punctuation.section.parameters.end.bracket.round.function.pointer.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "patterns": [ + { + "include": "#function_parameter_context" + } + ] + }, + "function_pointer_parameter": { + "begin": "(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))((?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)(\\()(\\*)\\s*((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)?)\\s*(?:(\\[)(\\w*)(\\])\\s*)*(\\))\\s*(\\()", + "beginCaptures": { + "1": { + "name": "meta.qualified_type.cpp", + "patterns": [ + { + "match": "(?:class|struct|union|enum)", + "name": "storage.type.$0.cpp" + }, + { + "include": "#attributes_context" + }, + { + "include": "#function_type" + }, + { + "include": "#storage_types" + }, + { + "include": "#number_literal" + }, + { + "include": "#string_context_c" + }, + { + "include": "#comma" + }, + { + "include": "#scope_resolution_inner_generated" + }, + { + "include": "#template_call_range" + }, + { + "match": "(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*", + "name": "entity.name.type.cpp" + } + ] + }, + "2": { + "patterns": [ + { + "include": "#attributes_context" + }, + { + "include": "#number_literal" + } + ] + }, + "3": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "4": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "5": { + "name": "comment.block.cpp" + }, + "6": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "7": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "8": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "9": { + "name": "comment.block.cpp" + }, + "10": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "12": { + "patterns": [ + { + "include": "#scope_resolution_inner_generated" + } + ] + }, + "13": { + "name": "entity.name.scope-resolution.cpp" + }, + "14": { + "name": "meta.template.call.cpp", + "patterns": [ + { + "include": "#template_call_range" + } + ] + }, + "15": { + "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.cpp" + }, + "16": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "17": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "18": { + "name": "comment.block.cpp" + }, + "19": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "20": { + "name": "entity.name.type.cpp" + }, + "22": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "23": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "24": { + "name": "comment.block.cpp" + }, + "25": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "26": { + "name": "storage.modifier.pointer.cpp" + }, + "27": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "28": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "29": { + "name": "comment.block.cpp" + }, + "30": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "31": { + "name": "storage.modifier.reference.cpp" + }, + "32": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "33": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "34": { + "name": "comment.block.cpp" + }, + "35": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "36": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "37": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "38": { + "name": "comment.block.cpp" + }, + "39": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "40": { + "name": "punctuation.section.parens.begin.bracket.round.function.pointer.cpp" + }, + "41": { + "name": "punctuation.definition.function.pointer.dereference.cpp" + }, + "42": { + "name": "variable.parameter.pointer.function.cpp" + }, + "43": { + "name": "punctuation.definition.begin.bracket.square.cpp" + }, + "44": { + "patterns": [ + { + "include": "#evaluation_context" + } + ] + }, + "45": { + "name": "punctuation.definition.end.bracket.square.cpp" + }, + "46": { + "name": "punctuation.section.parens.end.bracket.round.function.pointer.cpp" + }, + "47": { + "name": "punctuation.section.parameters.begin.bracket.round.function.pointer.cpp" + } + }, + "end": "(\\))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=[{=,);]|\\n)(?!\\()", + "endCaptures": { + "1": { + "name": "punctuation.section.parameters.end.bracket.round.function.pointer.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "patterns": [ + { + "include": "#function_parameter_context" + } + ] + }, + "parameter": { + "name": "meta.parameter.cpp", + "begin": "((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\w)", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "end": "(?:(?=\\))|(,))", + "endCaptures": { + "1": { + "name": "comma.cpp punctuation.separator.delimiter.cpp" + } + }, + "patterns": [ + { + "include": "#function_pointer_parameter" + }, + { + "include": "#decltype" + }, + { + "include": "#vararg_ellipses" + }, + { + "match": "((?:((?:const|static|volatile|register|restrict|extern))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))|((?:short|signed|unsigned|long))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\w))+)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=,|\\)|=)", + "captures": { + "1": { + "patterns": [ + { + "include": "#storage_types" + } + ] + }, + "2": { + "name": "storage.modifier.specifier.parameter.cpp" + }, + "3": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "4": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "5": { + "name": "comment.block.cpp" + }, + "6": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "7": { + "name": "storage.modifier.specifier.parameter.cpp" + }, + "8": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "9": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "10": { + "name": "comment.block.cpp" + }, + "11": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "12": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "13": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "14": { + "name": "comment.block.cpp" + }, + "15": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "16": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "17": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "18": { + "name": "comment.block.cpp" + }, + "19": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "20": { + "name": "storage.type.primitive.cpp storage.type.built-in.primitive.cpp" + }, + "21": { + "name": "storage.type.cpp storage.type.built-in.cpp" + }, + "22": { + "name": "support.type.posix-reserved.pthread.cpp support.type.built-in.posix-reserved.pthread.cpp" + }, + "23": { + "name": "support.type.posix-reserved.cpp support.type.built-in.posix-reserved.cpp" + }, + "24": { + "name": "entity.name.type.parameter.cpp" + }, + "25": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "26": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "27": { + "name": "comment.block.cpp" + }, + "28": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + } + }, + { + "include": "#storage_types" + }, + { + "include": "#scope_resolution_parameter_inner_generated" + }, + { + "match": "(?:class|struct|union|enum)", + "name": "storage.type.$0.cpp" + }, + { + "begin": "(?<==)", + "end": "(?:(?=\\))|(,))", + "endCaptures": { + "1": { + "name": "comma.cpp punctuation.separator.delimiter.cpp" + } + }, + "patterns": [ + { + "include": "#evaluation_context" + } + ] + }, + { + "include": "#assignment_operator" + }, + { + "match": "(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\)|,|\\[|=)", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "5": { + "name": "variable.parameter.cpp" + }, + "6": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "7": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "8": { + "name": "comment.block.cpp" + }, + "9": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + } + }, + { + "include": "#attributes_context" + }, + { + "name": "meta.bracket.square.array.cpp", + "begin": "(\\[)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.begin.bracket.square.array.type.cpp" + } + }, + "end": "(\\])", + "endCaptures": { + "1": { + "name": "punctuation.definition.end.bracket.square.array.type.cpp" + } + }, + "patterns": [ + { + "include": "#evaluation_context" + } + ] + }, + { + "match": "(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "5": { + "name": "storage.modifier.pointer.cpp" + }, + "6": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "7": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "8": { + "name": "comment.block.cpp" + }, + "9": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "10": { + "name": "storage.modifier.reference.cpp" + }, + "11": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "12": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "13": { + "name": "comment.block.cpp" + }, + "14": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + } + } + ] + }, + "member_access": { + "match": "(?:((?\\*|->)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*(?:(?:(?:\\.\\*|\\.))|(?:(?:->\\*|->)))\\s*)*)\\s*(\\b(?!auto[^(?-mix:\\w)]|void[^(?-mix:\\w)]|char[^(?-mix:\\w)]|short[^(?-mix:\\w)]|int[^(?-mix:\\w)]|signed[^(?-mix:\\w)]|unsigned[^(?-mix:\\w)]|long[^(?-mix:\\w)]|float[^(?-mix:\\w)]|double[^(?-mix:\\w)]|bool[^(?-mix:\\w)]|wchar_t[^(?-mix:\\w)]|u_char[^(?-mix:\\w)]|u_short[^(?-mix:\\w)]|u_int[^(?-mix:\\w)]|u_long[^(?-mix:\\w)]|ushort[^(?-mix:\\w)]|uint[^(?-mix:\\w)]|u_quad_t[^(?-mix:\\w)]|quad_t[^(?-mix:\\w)]|qaddr_t[^(?-mix:\\w)]|caddr_t[^(?-mix:\\w)]|daddr_t[^(?-mix:\\w)]|div_t[^(?-mix:\\w)]|dev_t[^(?-mix:\\w)]|fixpt_t[^(?-mix:\\w)]|blkcnt_t[^(?-mix:\\w)]|blksize_t[^(?-mix:\\w)]|gid_t[^(?-mix:\\w)]|in_addr_t[^(?-mix:\\w)]|in_port_t[^(?-mix:\\w)]|ino_t[^(?-mix:\\w)]|key_t[^(?-mix:\\w)]|mode_t[^(?-mix:\\w)]|nlink_t[^(?-mix:\\w)]|id_t[^(?-mix:\\w)]|pid_t[^(?-mix:\\w)]|off_t[^(?-mix:\\w)]|segsz_t[^(?-mix:\\w)]|swblk_t[^(?-mix:\\w)]|uid_t[^(?-mix:\\w)]|id_t[^(?-mix:\\w)]|clock_t[^(?-mix:\\w)]|size_t[^(?-mix:\\w)]|ssize_t[^(?-mix:\\w)]|time_t[^(?-mix:\\w)]|useconds_t[^(?-mix:\\w)]|suseconds_t[^(?-mix:\\w)]|int8_t[^(?-mix:\\w)]|int16_t[^(?-mix:\\w)]|int32_t[^(?-mix:\\w)]|int64_t[^(?-mix:\\w)]|uint8_t[^(?-mix:\\w)]|uint16_t[^(?-mix:\\w)]|uint32_t[^(?-mix:\\w)]|uint64_t[^(?-mix:\\w)]|int_least8_t[^(?-mix:\\w)]|int_least16_t[^(?-mix:\\w)]|int_least32_t[^(?-mix:\\w)]|int_least64_t[^(?-mix:\\w)]|uint_least8_t[^(?-mix:\\w)]|uint_least16_t[^(?-mix:\\w)]|uint_least32_t[^(?-mix:\\w)]|uint_least64_t[^(?-mix:\\w)]|int_fast8_t[^(?-mix:\\w)]|int_fast16_t[^(?-mix:\\w)]|int_fast32_t[^(?-mix:\\w)]|int_fast64_t[^(?-mix:\\w)]|uint_fast8_t[^(?-mix:\\w)]|uint_fast16_t[^(?-mix:\\w)]|uint_fast32_t[^(?-mix:\\w)]|uint_fast64_t[^(?-mix:\\w)]|intptr_t[^(?-mix:\\w)]|uintptr_t[^(?-mix:\\w)]|intmax_t[^(?-mix:\\w)]|intmax_t[^(?-mix:\\w)]|uintmax_t[^(?-mix:\\w)]|uintmax_t[^(?-mix:\\w)])(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b(?!\\())", + "captures": { + "1": { + "name": "variable.language.this.cpp" + }, + "2": { + "name": "variable.other.object.access.cpp" + }, + "3": { + "name": "punctuation.separator.dot-access.cpp" + }, + "4": { + "name": "punctuation.separator.pointer-access.cpp" + }, + "5": { + "patterns": [ + { + "match": "(?<=(?:\\.\\*|\\.|->|->\\*))\\s*(?:((?\\*|->)))", + "captures": { + "1": { + "name": "variable.language.this.cpp" + }, + "2": { + "name": "variable.other.object.property.cpp" + }, + "3": { + "name": "punctuation.separator.dot-access.cpp" + }, + "4": { + "name": "punctuation.separator.pointer-access.cpp" + } + } + }, + { + "match": "(?:((?\\*|->)))", + "captures": { + "1": { + "name": "variable.language.this.cpp" + }, + "2": { + "name": "variable.other.object.access.cpp" + }, + "3": { + "name": "punctuation.separator.dot-access.cpp" + }, + "4": { + "name": "punctuation.separator.pointer-access.cpp" + } + } + }, + { + "include": "#member_access" + }, + { + "include": "#method_access" + } + ] + }, + "6": { + "name": "variable.other.property.cpp" + } + } + }, + "method_access": { + "begin": "(?:((?\\*|->)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*(?:(?:(?:\\.\\*|\\.))|(?:(?:->\\*|->)))\\s*)*)\\s*(~?(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*(\\()", + "beginCaptures": { + "1": { + "name": "variable.language.this.cpp" + }, + "2": { + "name": "variable.other.object.access.cpp" + }, + "3": { + "name": "punctuation.separator.dot-access.cpp" + }, + "4": { + "name": "punctuation.separator.pointer-access.cpp" + }, + "5": { + "patterns": [ + { + "match": "(?<=(?:\\.\\*|\\.|->|->\\*))\\s*(?:((?\\*|->)))", + "captures": { + "1": { + "name": "variable.language.this.cpp" + }, + "2": { + "name": "variable.other.object.property.cpp" + }, + "3": { + "name": "punctuation.separator.dot-access.cpp" + }, + "4": { + "name": "punctuation.separator.pointer-access.cpp" + } + } + }, + { + "match": "(?:((?\\*|->)))", + "captures": { + "1": { + "name": "variable.language.this.cpp" + }, + "2": { + "name": "variable.other.object.access.cpp" + }, + "3": { + "name": "punctuation.separator.dot-access.cpp" + }, + "4": { + "name": "punctuation.separator.pointer-access.cpp" + } + } + }, + { + "include": "#member_access" + }, + { + "include": "#method_access" + } + ] + }, + "6": { + "name": "entity.name.function.member.cpp" + }, + "7": { + "name": "punctuation.section.arguments.begin.bracket.round.function.member.cpp" + } + }, + "end": "(\\))", + "endCaptures": { + "1": { + "name": "punctuation.section.arguments.end.bracket.round.function.member.cpp" + } + }, + "patterns": [ + { + "include": "#evaluation_context" + } + ] + }, + "using_namespace": { + "name": "meta.using-namespace.cpp", + "begin": "(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)?((?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)\\s*((?|\\?\\?>)|(?=[;>\\[\\]=]))", + "patterns": [ + { + "name": "meta.head.namespace.cpp", + "begin": "\\G ?", + "end": "((?:\\{|<%|\\?\\?<|(?=;)))", + "endCaptures": { + "1": { + "name": "punctuation.section.block.begin.bracket.curly.namespace.cpp" + } + }, + "patterns": [ + { + "include": "#ever_present_context" + }, + { + "include": "#attributes_context" + }, + { + "match": "((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)\\s*((?|\\?\\?>)", + "endCaptures": { + "1": { + "name": "punctuation.section.block.end.bracket.curly.namespace.cpp" + } + }, + "patterns": [ + { + "include": "#initial_context" + } + ] + }, + { + "name": "meta.tail.namespace.cpp", + "begin": "(?<=\\}|%>|\\?\\?>)[\\s\\n]*", + "end": "[\\s\\n]*(?=;)", + "patterns": [ + { + "include": "#initial_context" + } + ] + } + ] + }, + "macro_argument": { + "match": "##(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*(?!\\w)", + "name": "variable.other.macro.argument.cpp" + }, + "lambdas": { + "begin": "((?:(?<=[^\\s]|^)(?])|(?<=\\Wreturn|^return))\\s*(\\[(?!\\[))((?:.*\\[.*?\\].*?)*.*?)(\\]))", + "beginCaptures": { + "2": { + "name": "punctuation.definition.capture.begin.lambda.cpp" + }, + "3": { + "name": "meta.lambda.capture.cpp", + "patterns": [ + { + "include": "#the_this_keyword" + }, + { + "match": "((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?=\\]|\\z|$)|(,))|(\\=))", + "captures": { + "1": { + "name": "variable.parameter.capture.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "name": "comma.cpp punctuation.separator.delimiter.cpp" + }, + "7": { + "name": "keyword.operator.assignment.cpp" + } + } + }, + { + "include": "#evaluation_context" + } + ] + }, + "4": { + "name": "punctuation.definition.capture.end.lambda.cpp" + } + }, + "end": "(?<=})", + "patterns": [ + { + "name": "meta.function.definition.parameters.lambda.cpp", + "begin": "(\\()", + "beginCaptures": { + "1": { + "name": "punctuation.definition.parameters.begin.lambda.cpp" + } + }, + "end": "(\\))", + "endCaptures": { + "1": { + "name": "punctuation.definition.parameters.end.lambda.cpp" + } + }, + "patterns": [ + { + "include": "#function_parameter_context" + } + ] + }, + { + "match": "(?)((?:.+?(?=\\{|$))?)", + "captures": { + "1": { + "name": "punctuation.definition.lambda.return-type.cpp" + }, + "2": { + "name": "storage.type.return-type.lambda.cpp" + } + } + }, + { + "name": "meta.function.definition.body.lambda.cpp", + "begin": "(\\{)", + "beginCaptures": { + "1": { + "name": "punctuation.section.block.begin.bracket.curly.lambda.cpp" + } + }, + "end": "(\\})", + "endCaptures": { + "1": { + "name": "punctuation.section.block.end.bracket.curly.lambda.cpp" + } + }, + "patterns": [ + { + "include": "#initial_context" + } + ] + } + ] + }, "enumerator_list": { "match": "((?\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:(?:(?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?:::))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.])))", + "match": "(?<=virtual|private|protected|public|,|:)\\s*(?!(?:(?:private|protected|public)|virtual))((?:\\s*+(?:(?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:(?:(?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?:::))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.])))", "captures": { "1": { "name": "entity.name.type.inherited.cpp" @@ -5297,7 +7938,7 @@ }, "class_block": { "name": "meta.block.class.cpp", - "begin": "((((?\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:(?:(?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?:::))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.])))+)*))?))", + "begin": "((((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(DLLEXPORT)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?\\s*((?:(?\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:(?:(?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?:::))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.])))+)*))?))", "beginCaptures": { "1": { "name": "meta.head.class.cpp" @@ -5316,6 +7957,59 @@ ] }, "5": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "6": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "7": { + "name": "comment.block.cpp" + }, + "8": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "9": { + "name": "entity.name.other.preprocessor.macro.predefined.DLLEXPORT.cpp" + }, + "10": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "11": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "12": { + "name": "comment.block.cpp" + }, + "13": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "14": { "patterns": [ { "include": "#attributes_context" @@ -5325,16 +8019,16 @@ } ] }, - "6": { + "15": { "name": "entity.name.type.$3.cpp" }, - "7": { + "16": { "name": "storage.type.modifier.final.cpp" }, - "8": { + "17": { "name": "colon.cpp punctuation.separator.inheritance.cpp" }, - "9": { + "18": { "patterns": [ { "include": "#inheritance_context" @@ -5363,16 +8057,13 @@ }, "patterns": [ { - "include": "#preprocessor_context" + "include": "#ever_present_context" }, { "include": "#inheritance_context" }, { "include": "#template_call_range" - }, - { - "include": "#comments_context" } ] }, @@ -5390,10 +8081,16 @@ "include": "#function_pointer" }, { - "include": "#constructor_context" + "include": "#static_assert" }, { - "include": "#root_context" + "include": "#constructor_inline" + }, + { + "include": "#destructor_inline" + }, + { + "include": "#initial_context" } ] }, @@ -5403,7 +8100,7 @@ "end": "[\\s\\n]*(?=;)", "patterns": [ { - "include": "#root_context" + "include": "#initial_context" } ] } @@ -5411,7 +8108,7 @@ }, "struct_block": { "name": "meta.block.struct.cpp", - "begin": "((((?\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:(?:(?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?:::))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.])))+)*))?))", + "begin": "((((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(DLLEXPORT)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?\\s*((?:(?\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:(?:(?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?:::))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.])))+)*))?))", "beginCaptures": { "1": { "name": "meta.head.struct.cpp" @@ -5430,6 +8127,59 @@ ] }, "5": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "6": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "7": { + "name": "comment.block.cpp" + }, + "8": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "9": { + "name": "entity.name.other.preprocessor.macro.predefined.DLLEXPORT.cpp" + }, + "10": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "11": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "12": { + "name": "comment.block.cpp" + }, + "13": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "14": { "patterns": [ { "include": "#attributes_context" @@ -5439,16 +8189,16 @@ } ] }, - "6": { + "15": { "name": "entity.name.type.$3.cpp" }, - "7": { + "16": { "name": "storage.type.modifier.final.cpp" }, - "8": { + "17": { "name": "colon.cpp punctuation.separator.inheritance.cpp" }, - "9": { + "18": { "patterns": [ { "include": "#inheritance_context" @@ -5477,16 +8227,13 @@ }, "patterns": [ { - "include": "#preprocessor_context" + "include": "#ever_present_context" }, { "include": "#inheritance_context" }, { "include": "#template_call_range" - }, - { - "include": "#comments_context" } ] }, @@ -5504,10 +8251,16 @@ "include": "#function_pointer" }, { - "include": "#constructor_context" + "include": "#static_assert" }, { - "include": "#root_context" + "include": "#constructor_inline" + }, + { + "include": "#destructor_inline" + }, + { + "include": "#initial_context" } ] }, @@ -5517,7 +8270,7 @@ "end": "[\\s\\n]*(?=;)", "patterns": [ { - "include": "#root_context" + "include": "#initial_context" } ] } @@ -5525,7 +8278,7 @@ }, "union_block": { "name": "meta.block.union.cpp", - "begin": "((((?\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:(?:(?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?:::))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.])))+)*))?))", + "begin": "((((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(DLLEXPORT)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?\\s*((?:(?\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:(?:(?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?:::))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.])))+)*))?))", "beginCaptures": { "1": { "name": "meta.head.union.cpp" @@ -5544,6 +8297,59 @@ ] }, "5": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "6": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "7": { + "name": "comment.block.cpp" + }, + "8": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "9": { + "name": "entity.name.other.preprocessor.macro.predefined.DLLEXPORT.cpp" + }, + "10": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "11": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "12": { + "name": "comment.block.cpp" + }, + "13": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "14": { "patterns": [ { "include": "#attributes_context" @@ -5553,16 +8359,16 @@ } ] }, - "6": { + "15": { "name": "entity.name.type.$3.cpp" }, - "7": { + "16": { "name": "storage.type.modifier.final.cpp" }, - "8": { + "17": { "name": "colon.cpp punctuation.separator.inheritance.cpp" }, - "9": { + "18": { "patterns": [ { "include": "#inheritance_context" @@ -5591,16 +8397,13 @@ }, "patterns": [ { - "include": "#preprocessor_context" + "include": "#ever_present_context" }, { "include": "#inheritance_context" }, { "include": "#template_call_range" - }, - { - "include": "#comments_context" } ] }, @@ -5618,10 +8421,16 @@ "include": "#function_pointer" }, { - "include": "#constructor_context" + "include": "#static_assert" }, { - "include": "#root_context" + "include": "#constructor_inline" + }, + { + "include": "#destructor_inline" + }, + { + "include": "#initial_context" } ] }, @@ -5631,7 +8440,7 @@ "end": "[\\s\\n]*(?=;)", "patterns": [ { - "include": "#root_context" + "include": "#initial_context" } ] } @@ -5669,7 +8478,7 @@ }, "patterns": [ { - "include": "#root_context" + "include": "#initial_context" } ] }, @@ -5684,7 +8493,7 @@ }, "patterns": [ { - "include": "#root_context" + "include": "#initial_context" } ] }, @@ -5694,12 +8503,12 @@ "end": "[\\s\\n]*(?=;)", "patterns": [ { - "include": "#root_context" + "include": "#initial_context" } ] }, { - "include": "#root_context" + "include": "#initial_context" } ] }, @@ -5714,7 +8523,7 @@ "patterns": [ { "name": "meta.block.class.cpp", - "begin": "((((?\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:(?:(?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?:::))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.])))+)*))?))", + "begin": "((((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(DLLEXPORT)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?\\s*((?:(?\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:(?:(?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?:::))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.])))+)*))?))", "beginCaptures": { "1": { "name": "meta.head.class.cpp" @@ -5733,6 +8542,59 @@ ] }, "5": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "6": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "7": { + "name": "comment.block.cpp" + }, + "8": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "9": { + "name": "entity.name.other.preprocessor.macro.predefined.DLLEXPORT.cpp" + }, + "10": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "11": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "12": { + "name": "comment.block.cpp" + }, + "13": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "14": { "patterns": [ { "include": "#attributes_context" @@ -5742,16 +8604,16 @@ } ] }, - "6": { + "15": { "name": "entity.name.type.$3.cpp" }, - "7": { + "16": { "name": "storage.type.modifier.final.cpp" }, - "8": { + "17": { "name": "colon.cpp punctuation.separator.inheritance.cpp" }, - "9": { + "18": { "patterns": [ { "include": "#inheritance_context" @@ -5780,16 +8642,13 @@ }, "patterns": [ { - "include": "#preprocessor_context" + "include": "#ever_present_context" }, { "include": "#inheritance_context" }, { "include": "#template_call_range" - }, - { - "include": "#comments_context" } ] }, @@ -5807,10 +8666,16 @@ "include": "#function_pointer" }, { - "include": "#constructor_context" + "include": "#static_assert" }, { - "include": "#root_context" + "include": "#constructor_inline" + }, + { + "include": "#destructor_inline" + }, + { + "include": "#initial_context" } ] }, @@ -5820,7 +8685,7 @@ "end": "[\\s\\n]*(?=;)", "patterns": [ { - "match": "((?:((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*)((?:&((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){0,2})((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:(?:(?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?:::))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.])))+)*))?))", + "begin": "((((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(DLLEXPORT)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?\\s*((?:(?\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:(?:(?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?:::))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.])))+)*))?))", "beginCaptures": { "1": { "name": "meta.head.struct.cpp" @@ -5936,6 +8837,59 @@ ] }, "5": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "6": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "7": { + "name": "comment.block.cpp" + }, + "8": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "9": { + "name": "entity.name.other.preprocessor.macro.predefined.DLLEXPORT.cpp" + }, + "10": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "11": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "12": { + "name": "comment.block.cpp" + }, + "13": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "14": { "patterns": [ { "include": "#attributes_context" @@ -5945,16 +8899,16 @@ } ] }, - "6": { + "15": { "name": "entity.name.type.$3.cpp" }, - "7": { + "16": { "name": "storage.type.modifier.final.cpp" }, - "8": { + "17": { "name": "colon.cpp punctuation.separator.inheritance.cpp" }, - "9": { + "18": { "patterns": [ { "include": "#inheritance_context" @@ -5983,16 +8937,13 @@ }, "patterns": [ { - "include": "#preprocessor_context" + "include": "#ever_present_context" }, { "include": "#inheritance_context" }, { "include": "#template_call_range" - }, - { - "include": "#comments_context" } ] }, @@ -6010,10 +8961,16 @@ "include": "#function_pointer" }, { - "include": "#constructor_context" + "include": "#static_assert" }, { - "include": "#root_context" + "include": "#constructor_inline" + }, + { + "include": "#destructor_inline" + }, + { + "include": "#initial_context" } ] }, @@ -6023,7 +8980,7 @@ "end": "[\\s\\n]*(?=;)", "patterns": [ { - "match": "((?:((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*)((?:&((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){0,2})((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:(?:(?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?:::))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:.+?)(?:\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.])))+)*))?))", + "begin": "((((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(DLLEXPORT)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?\\s*((?:(?\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:(?:(?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?:::))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.])))+)*))?))", "beginCaptures": { "1": { "name": "meta.head.union.cpp" @@ -6139,6 +9132,59 @@ ] }, "5": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "6": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "7": { + "name": "comment.block.cpp" + }, + "8": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "9": { + "name": "entity.name.other.preprocessor.macro.predefined.DLLEXPORT.cpp" + }, + "10": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "11": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "12": { + "name": "comment.block.cpp" + }, + "13": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "14": { "patterns": [ { "include": "#attributes_context" @@ -6148,16 +9194,16 @@ } ] }, - "6": { + "15": { "name": "entity.name.type.$3.cpp" }, - "7": { + "16": { "name": "storage.type.modifier.final.cpp" }, - "8": { + "17": { "name": "colon.cpp punctuation.separator.inheritance.cpp" }, - "9": { + "18": { "patterns": [ { "include": "#inheritance_context" @@ -6186,16 +9232,13 @@ }, "patterns": [ { - "include": "#preprocessor_context" + "include": "#ever_present_context" }, { "include": "#inheritance_context" }, { "include": "#template_call_range" - }, - { - "include": "#comments_context" } ] }, @@ -6213,10 +9256,16 @@ "include": "#function_pointer" }, { - "include": "#constructor_context" + "include": "#static_assert" }, { - "include": "#root_context" + "include": "#constructor_inline" + }, + { + "include": "#destructor_inline" + }, + { + "include": "#initial_context" } ] }, @@ -6226,7 +9275,7 @@ "end": "[\\s\\n]*(?=;)", "patterns": [ { - "match": "((?:((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*)((?:&((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){0,2})((?:(?:(?>\\s+)|(\\/\\*)(.+?)(\\*\\/))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\b(?!final\\W|final\\$|override\\W|override\\$)((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\S)(?!:)", + "captures": { + "1": { + "name": "storage.type.struct.declare.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "name": "entity.name.type.struct.cpp" + }, + "8": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "9": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "10": { + "name": "comment.block.cpp" + }, + "11": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "12": { + "name": "storage.modifier.pointer.cpp" + }, + "13": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "14": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "15": { + "name": "comment.block.cpp" + }, + "16": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "17": { + "name": "storage.modifier.reference.cpp" + }, + "18": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "19": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "20": { + "name": "comment.block.cpp" + }, + "21": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "22": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "23": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "24": { + "name": "comment.block.cpp" + }, + "25": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "26": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "27": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "28": { + "name": "comment.block.cpp" + }, + "29": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "30": { + "name": "variable.other.object.declare.cpp" + }, + "31": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "32": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "33": { + "name": "comment.block.cpp" + }, + "34": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + } + }, + "union_declare": { + "match": "(union)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\b(?!final\\W|final\\$|override\\W|override\\$)((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\S)(?!:)", + "captures": { + "1": { + "name": "storage.type.union.declare.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "name": "entity.name.type.union.cpp" + }, + "8": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "9": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "10": { + "name": "comment.block.cpp" + }, + "11": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "12": { + "name": "storage.modifier.pointer.cpp" + }, + "13": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "14": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "15": { + "name": "comment.block.cpp" + }, + "16": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "17": { + "name": "storage.modifier.reference.cpp" + }, + "18": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "19": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "20": { + "name": "comment.block.cpp" + }, + "21": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "22": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "23": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "24": { + "name": "comment.block.cpp" + }, + "25": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "26": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "27": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "28": { + "name": "comment.block.cpp" + }, + "29": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "30": { + "name": "variable.other.object.declare.cpp" + }, + "31": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "32": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "33": { + "name": "comment.block.cpp" + }, + "34": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + } + }, + "enum_declare": { + "match": "(enum)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\b(?!final\\W|final\\$|override\\W|override\\$)((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\S)(?!:)", + "captures": { + "1": { + "name": "storage.type.enum.declare.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "name": "entity.name.type.enum.cpp" + }, + "8": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "9": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "10": { + "name": "comment.block.cpp" + }, + "11": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "12": { + "name": "storage.modifier.pointer.cpp" + }, + "13": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "14": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "15": { + "name": "comment.block.cpp" + }, + "16": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "17": { + "name": "storage.modifier.reference.cpp" + }, + "18": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "19": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "20": { + "name": "comment.block.cpp" + }, + "21": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "22": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "23": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "24": { + "name": "comment.block.cpp" + }, + "25": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "26": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "27": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "28": { + "name": "comment.block.cpp" + }, + "29": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "30": { + "name": "variable.other.object.declare.cpp" + }, + "31": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "32": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "33": { + "name": "comment.block.cpp" + }, + "34": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + } + }, + "class_declare": { + "match": "(class)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\b(?!final\\W|final\\$|override\\W|override\\$)((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\S)(?!:)", + "captures": { + "1": { + "name": "storage.type.class.declare.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "name": "entity.name.type.class.cpp" + }, + "8": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "9": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "10": { + "name": "comment.block.cpp" + }, + "11": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "12": { + "name": "storage.modifier.pointer.cpp" + }, + "13": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "14": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "15": { + "name": "comment.block.cpp" + }, + "16": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "17": { + "name": "storage.modifier.reference.cpp" + }, + "18": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "19": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "20": { + "name": "comment.block.cpp" + }, + "21": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "22": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "23": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "24": { + "name": "comment.block.cpp" + }, + "25": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "26": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "27": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "28": { + "name": "comment.block.cpp" + }, + "29": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "30": { + "name": "variable.other.object.declare.cpp" + }, + "31": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "32": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "33": { + "name": "comment.block.cpp" + }, + "34": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + } + }, + "standard_declares": { + "patterns": [ + { + "include": "#struct_declare" + }, + { + "include": "#union_declare" + }, + { + "include": "#enum_declare" + }, + { + "include": "#class_declare" + } + ] + }, + "parameter_struct": { + "match": "(struct)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?:(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:\\[((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\]((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?(?=,|\\)|\\n)", + "captures": { + "1": { + "name": "storage.type.struct.parameter.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "name": "entity.name.type.struct.parameter.cpp" + }, + "7": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "8": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "9": { + "name": "comment.block.cpp" + }, + "10": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "12": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "13": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "14": { + "name": "comment.block.cpp" + }, + "15": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "16": { + "name": "storage.modifier.pointer.cpp" + }, + "17": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "18": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "19": { + "name": "comment.block.cpp" + }, + "20": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "21": { + "name": "storage.modifier.reference.cpp" + }, + "22": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "23": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "24": { + "name": "comment.block.cpp" + }, + "25": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "26": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "27": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "28": { + "name": "comment.block.cpp" + }, + "29": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "30": { + "name": "variable.other.object.declare.cpp" + }, + "31": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "32": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "33": { + "name": "comment.block.cpp" + }, + "34": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "35": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "36": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "37": { + "name": "comment.block.cpp" + }, + "38": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "39": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "40": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "41": { + "name": "comment.block.cpp" + }, + "42": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + } + }, + "parameter_enum": { + "match": "(enum)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?:(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:\\[((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\]((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?(?=,|\\)|\\n)", + "captures": { + "1": { + "name": "storage.type.enum.parameter.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "name": "entity.name.type.enum.parameter.cpp" + }, + "7": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "8": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "9": { + "name": "comment.block.cpp" + }, + "10": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "12": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "13": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "14": { + "name": "comment.block.cpp" + }, + "15": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "16": { + "name": "storage.modifier.pointer.cpp" + }, + "17": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "18": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "19": { + "name": "comment.block.cpp" + }, + "20": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "21": { + "name": "storage.modifier.reference.cpp" + }, + "22": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "23": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "24": { + "name": "comment.block.cpp" + }, + "25": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "26": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "27": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "28": { + "name": "comment.block.cpp" + }, + "29": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "30": { + "name": "variable.other.object.declare.cpp" + }, + "31": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "32": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "33": { + "name": "comment.block.cpp" + }, + "34": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "35": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "36": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "37": { + "name": "comment.block.cpp" + }, + "38": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "39": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "40": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "41": { + "name": "comment.block.cpp" + }, + "42": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + } + }, + "parameter_union": { + "match": "(union)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?:(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:\\[((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\]((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?(?=,|\\)|\\n)", + "captures": { + "1": { + "name": "storage.type.union.parameter.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "name": "entity.name.type.union.parameter.cpp" + }, + "7": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "8": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "9": { + "name": "comment.block.cpp" + }, + "10": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "12": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "13": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "14": { + "name": "comment.block.cpp" + }, + "15": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "16": { + "name": "storage.modifier.pointer.cpp" + }, + "17": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "18": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "19": { + "name": "comment.block.cpp" + }, + "20": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "21": { + "name": "storage.modifier.reference.cpp" + }, + "22": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "23": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "24": { + "name": "comment.block.cpp" + }, + "25": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "26": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "27": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "28": { + "name": "comment.block.cpp" + }, + "29": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "30": { + "name": "variable.other.object.declare.cpp" + }, + "31": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "32": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "33": { + "name": "comment.block.cpp" + }, + "34": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "35": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "36": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "37": { + "name": "comment.block.cpp" + }, + "38": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "39": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "40": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "41": { + "name": "comment.block.cpp" + }, + "42": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + } + }, + "parameter_class": { + "match": "(class)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?:(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:\\[((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\]((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?(?=,|\\)|\\n)", + "captures": { + "1": { + "name": "storage.type.class.parameter.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "name": "entity.name.type.class.parameter.cpp" + }, + "7": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "8": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "9": { + "name": "comment.block.cpp" + }, + "10": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "12": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "13": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "14": { + "name": "comment.block.cpp" + }, + "15": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "16": { + "name": "storage.modifier.pointer.cpp" + }, + "17": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "18": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "19": { + "name": "comment.block.cpp" + }, + "20": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "21": { + "name": "storage.modifier.reference.cpp" + }, + "22": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "23": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "24": { + "name": "comment.block.cpp" + }, + "25": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "26": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "27": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "28": { + "name": "comment.block.cpp" + }, + "29": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "30": { + "name": "variable.other.object.declare.cpp" + }, + "31": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "32": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "33": { + "name": "comment.block.cpp" + }, + "34": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "35": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "36": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "37": { + "name": "comment.block.cpp" + }, + "38": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "39": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "40": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "41": { + "name": "comment.block.cpp" + }, + "42": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + } + }, + "over_qualified_types": { + "patterns": [ + { + "include": "#parameter_struct" + }, + { + "include": "#parameter_enum" + }, + { + "include": "#parameter_union" + }, + { + "include": "#parameter_class" + } + ] + }, "hacky_fix_for_stray_directive": { "match": "(?(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*))\\s*::\\s*~\\2|~(?>(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)))\\s*(\\()\\s*(\\))", - "captures": { - "1": { - "name": "entity.name.function.destructor.cpp entity.name.function.special.destructor.cpp" - }, - "3": { - "name": "punctuation.definition.parameters.begin.destructor.cpp" - }, - "4": { - "name": "punctuation.definition.parameters.end.destructor.cpp" - } - }, - "name": "meta.function.destructor.cpp" - }, "meta_preprocessor_macro": { "name": "meta.preprocessor.macro.cpp", "begin": "(?x)\n^\\s* ((\\#)\\s*define) \\s+\t# define\n((?(?-mix:[a-zA-Z_$][\\w$]*)))\t # macro name\n(?:\n (\\()\n\t(\n\t \\s* \\g \\s*\t\t # first argument\n\t ((,) \\s* \\g \\s*)* # additional arguments\n\t (?:\\.\\.\\.)?\t\t\t# varargs ellipsis?\n\t)\n (\\))\n)?", @@ -6559,7 +11417,7 @@ "include": "#line_continuation_character" }, { - "include": "#comments_context" + "include": "#comments" } ] } @@ -6687,48 +11545,6 @@ } ] }, - "constructor_context": { - "patterns": [ - { - "begin": "(?x)\n(?:^\\s*) # beginning of line\n((?!while|for|do|if|else|switch|catch)[A-Za-z_][A-Za-z0-9_:]*) # actual name\n\\s*(\\() # opening bracket", - "beginCaptures": { - "1": { - "name": "entity.name.function.constructor.cpp" - }, - "2": { - "name": "punctuation.definition.parameters.begin.constructor.cpp" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "punctuation.definition.parameters.end.constructor.cpp" - } - }, - "name": "meta.function.constructor.cpp", - "patterns": [ - { - "include": "#function_parameter_context" - } - ] - }, - { - "begin": "(?x)\n(:)\n(\n (?=\n \\s*[A-Za-z_][A-Za-z0-9_:]* # actual name\n \\s* (\\() # opening bracket\n )\n)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.initializer-list.parameters.cpp" - } - }, - "end": "(?=\\{)", - "name": "meta.function.constructor.initializer-list.cpp", - "patterns": [ - { - "include": "#root_context" - } - ] - } - ] - }, "string_context": { "patterns": [ { @@ -6823,158 +11639,22 @@ ] }, "block": { - "begin": "{", + "name": "meta.block.cpp", + "begin": "({)", "beginCaptures": { - "0": { + "1": { "name": "punctuation.section.block.begin.bracket.curly.cpp" } }, - "end": "}|(?=\\s*#\\s*(?:elif|else|endif)\\b)", + "end": "(}|(?=\\s*#\\s*(?:elif|else|endif)\\b))", "endCaptures": { - "0": { + "1": { "name": "punctuation.section.block.end.bracket.curly.cpp" } }, - "name": "meta.block.cpp", "patterns": [ { - "include": "#block_context" - } - ] - }, - "block_context": { - "patterns": [ - { - "include": "#preprocessor_rule_enabled_block" - }, - { - "include": "#preprocessor_rule_disabled_block" - }, - { - "include": "#preprocessor_rule_conditional_block" - }, - { - "include": "#method_access" - }, - { - "include": "#member_access" - }, - { - "include": "#type_casting_operators" - }, - { - "include": "#function_call" - }, - { - "name": "meta.initialization.cpp", - "begin": "(?x)\n(?:\n (?:\n\t(?=\\s)(?=+!]+ | \\(\\) | \\[\\]))\n)\n\\s*(\\() # opening bracket", - "beginCaptures": { - "1": { - "name": "variable.other.cpp" - }, - "2": { - "name": "punctuation.section.parens.begin.bracket.round.initialization.cpp" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "punctuation.section.parens.end.bracket.round.initialization.cpp" - } - }, - "patterns": [ - { - "include": "#function_call_context" - } - ] - }, - { - "begin": "{", - "beginCaptures": { - "0": { - "name": "punctuation.section.block.begin.bracket.curly.cpp" - } - }, - "end": "}|(?=\\s*#\\s*(?:elif|else|endif)\\b)", - "endCaptures": { - "0": { - "name": "punctuation.section.block.end.bracket.curly.cpp" - } - }, - "patterns": [ - { - "include": "#block_context" - } - ] - }, - { - "include": "#parentheses_block" - }, - { - "include": "#root_context" - } - ] - }, - "comments_context": { - "patterns": [ - { - "captures": { - "1": { - "name": "meta.toc-list.banner.block.cpp" - } - }, - "match": "^/\\* =(\\s*.*?)\\s*= \\*/$\\n?", - "name": "comment.block.cpp" - }, - { - "begin": "/\\*", - "beginCaptures": { - "0": { - "name": "punctuation.definition.comment.begin.cpp" - } - }, - "end": "\\*/", - "endCaptures": { - "0": { - "name": "punctuation.definition.comment.end.cpp" - } - }, - "name": "comment.block.cpp" - }, - { - "captures": { - "1": { - "name": "meta.toc-list.banner.line.cpp" - } - }, - "match": "^// =(\\s*.*?)\\s*=\\s*$\\n?", - "name": "comment.line.banner.cpp" - }, - { - "begin": "(^[ \\t]+)?(?=//)", - "beginCaptures": { - "1": { - "name": "punctuation.whitespace.comment.leading.cpp" - } - }, - "end": "(?!\\G)", - "patterns": [ - { - "begin": "//", - "beginCaptures": { - "0": { - "name": "punctuation.definition.comment.cpp" - } - }, - "end": "(?=\\n)", - "name": "comment.line.double-slash.cpp", - "patterns": [ - { - "include": "#line_continuation_character" - } - ] - } - ] + "include": "#function_body_context" } ] }, @@ -7014,34 +11694,14 @@ }, "patterns": [ { - "include": "#parameter_struct" - }, - { - "include": "#root_context" - } - ] - }, - "parentheses_block": { - "name": "meta.parens.block.cpp", - "begin": "\\(", - "beginCaptures": { - "0": { - "name": "punctuation.section.parens.begin.bracket.round.cpp" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "punctuation.section.parens.end.bracket.round.cpp" - } - }, - "patterns": [ - { - "include": "#block_context" + "include": "#over_qualified_types" }, { "match": "(?-mix:(?::links_to; return 0; } \ No newline at end of file diff --git a/extensions/cpp/test/colorize-results/test_cc.json b/extensions/cpp/test/colorize-results/test_cc.json index 81cecfffcd2..6bd7dcf50a4 100644 --- a/extensions/cpp/test/colorize-results/test_cc.json +++ b/extensions/cpp/test/colorize-results/test_cc.json @@ -672,7 +672,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.qualified_type.cpp", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -726,8 +726,19 @@ } }, { - "c": "O ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp", + "c": "O", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp entity.name.type.parameter.cpp", + "r": { + "dark_plus": "entity.name.type: #4EC9B0", + "light_plus": "entity.name.type: #267F99", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "entity.name.type: #4EC9B0" + } + }, + { + "c": " ", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -738,7 +749,7 @@ }, { "c": "obj", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp variable.parameter.cpp", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp variable.parameter.cpp", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", @@ -1123,13 +1134,13 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.whitespace.comment.leading.cpp", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp comment.line.double-slash.cpp", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "dark_plus": "comment: #6A9955", + "light_plus": "comment: #008000", + "dark_vs": "comment: #6A9955", + "light_vs": "comment: #008000", + "hc_black": "comment: #7CA668" } }, { @@ -1288,7 +1299,7 @@ }, { "c": "new", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp keyword.operator.wordlike.cpp memory.cpp keyword.operator.new.cpp", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp keyword.operator.wordlike.cpp keyword.operator.new.cpp", "r": { "dark_plus": "source.cpp keyword.operator.new: #C586C0", "light_plus": "source.cpp keyword.operator.new: #AF00DB", @@ -1332,13 +1343,13 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.whitespace.comment.leading.cpp", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp comment.line.double-slash.cpp", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "dark_plus": "comment: #6A9955", + "light_plus": "comment: #008000", + "dark_vs": "comment: #6A9955", + "light_vs": "comment: #008000", + "hc_black": "comment: #7CA668" } }, { @@ -1507,7 +1518,7 @@ } }, { - "c": " ", + "c": " ...", "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", @@ -1517,17 +1528,6 @@ "hc_black": "default: #FFFFFF" } }, - { - "c": "...", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.vararg-ellipses.cpp", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" - } - }, { "c": ")", "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.arguments.end.bracket.round.function.call.cpp", @@ -1728,13 +1728,13 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.whitespace.comment.leading.cpp", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp comment.line.double-slash.cpp", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "dark_plus": "comment: #6A9955", + "light_plus": "comment: #008000", + "dark_vs": "comment: #6A9955", + "light_vs": "comment: #008000", + "hc_black": "comment: #7CA668" } }, { @@ -1937,13 +1937,13 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.whitespace.comment.leading.cpp", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp comment.line.double-slash.cpp", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "dark_plus": "comment: #6A9955", + "light_plus": "comment: #008000", + "dark_vs": "comment: #6A9955", + "light_vs": "comment: #008000", + "hc_black": "comment: #7CA668" } }, { diff --git a/extensions/cpp/test/colorize-results/test_cpp.json b/extensions/cpp/test/colorize-results/test_cpp.json index 6254e50c6a6..89be32fb7c1 100644 --- a/extensions/cpp/test/colorize-results/test_cpp.json +++ b/extensions/cpp/test/colorize-results/test_cpp.json @@ -309,7 +309,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.qualified_type.cpp", + "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -375,7 +375,7 @@ }, { "c": "int", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", + "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", "r": { "dark_plus": "storage.type: #569CD6", "light_plus": "storage.type: #0000FF", @@ -386,7 +386,7 @@ }, { "c": ",", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp comma.cpp punctuation.separator.delimiter.cpp", + "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp comma.cpp punctuation.separator.delimiter.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -397,7 +397,7 @@ }, { "c": "int", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", + "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", "r": { "dark_plus": "storage.type: #569CD6", "light_plus": "storage.type: #0000FF", @@ -430,7 +430,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.qualified_type.cpp", + "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -683,7 +683,7 @@ }, { "c": "int", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", "r": { "dark_plus": "storage.type: #569CD6", "light_plus": "storage.type: #0000FF", @@ -694,7 +694,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -705,7 +705,7 @@ }, { "c": "x", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp variable.parameter.cpp", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp variable.parameter.cpp", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", @@ -716,7 +716,7 @@ }, { "c": ",", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp comma.cpp punctuation.separator.delimiter.cpp", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp comma.cpp punctuation.separator.delimiter.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -727,7 +727,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -738,7 +738,7 @@ }, { "c": "int", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", "r": { "dark_plus": "storage.type: #569CD6", "light_plus": "storage.type: #0000FF", @@ -749,7 +749,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -760,7 +760,7 @@ }, { "c": "y", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp variable.parameter.cpp", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp variable.parameter.cpp", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", @@ -1308,6 +1308,127 @@ "hc_black": "default: #FFFFFF" } }, + { + "c": "Task", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp entity.name.scope-resolution.cpp", + "r": { + "dark_plus": "entity.name.scope-resolution: #4EC9B0", + "light_plus": "entity.name.scope-resolution: #267F99", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "entity.name.scope-resolution: #4EC9B0" + } + }, + { + "c": "<", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.template.call.cpp meta.template.call.cpp punctuation.section.angle-brackets.begin.template.call.cpp", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "ANY_OUTPUT_TYPE", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.template.call.cpp meta.template.call.cpp storage.type.user-defined.cpp", + "r": { + "dark_plus": "storage.type: #569CD6", + "light_plus": "storage.type: #0000FF", + "dark_vs": "storage.type: #569CD6", + "light_vs": "storage.type: #0000FF", + "hc_black": "storage.type: #569CD6" + } + }, + { + "c": ",", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.template.call.cpp meta.template.call.cpp comma.cpp punctuation.separator.template.argument.cpp", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.template.call.cpp meta.template.call.cpp meta.qualified_type.cpp", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "ANY_INPUT_TYPE", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.template.call.cpp meta.template.call.cpp meta.qualified_type.cpp entity.name.type.cpp", + "r": { + "dark_plus": "entity.name.type: #4EC9B0", + "light_plus": "entity.name.type: #267F99", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "entity.name.type: #4EC9B0" + } + }, + { + "c": ">", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.template.call.cpp meta.template.call.cpp punctuation.section.angle-brackets.end.template.call.cpp", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "::", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.cpp", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "links_to", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ";", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, { "c": "return", "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp keyword.control.return.cpp", diff --git a/extensions/git/cgmanifest.json b/extensions/git/cgmanifest.json index d0bdb9ac443..e8081d6472e 100644 --- a/extensions/git/cgmanifest.json +++ b/extensions/git/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "textmate/git.tmbundle", "repositoryUrl": "https://github.com/textmate/git.tmbundle", - "commitHash": "3f6ad2138200db14b57a090ecb2d2e733275ca3e" + "commitHash": "5870cf3f8abad3a6637bdf69250b5d2ded427dc4" } }, "licenseDetail": [ diff --git a/extensions/git/syntaxes/git-rebase.tmLanguage.json b/extensions/git/syntaxes/git-rebase.tmLanguage.json index a2c116bd09b..0238d8a6f29 100644 --- a/extensions/git/syntaxes/git-rebase.tmLanguage.json +++ b/extensions/git/syntaxes/git-rebase.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/textmate/git.tmbundle/commit/3f6ad2138200db14b57a090ecb2d2e733275ca3e", + "version": "https://github.com/textmate/git.tmbundle/commit/5870cf3f8abad3a6637bdf69250b5d2ded427dc4", "name": "Git Rebase Message", "scopeName": "text.git-rebase", "patterns": [ @@ -47,6 +47,15 @@ }, "match": "^\\s*(exec|x)\\s+(.*)$", "name": "meta.commit-command.git-rebase" + }, + { + "captures": { + "1": { + "name": "support.function.git-rebase" + } + }, + "match": "^\\s*(break|b)\\s*$", + "name": "meta.commit-command.git-rebase" } ] } \ No newline at end of file diff --git a/extensions/java/cgmanifest.json b/extensions/java/cgmanifest.json index 8616c4fcc53..9a5b5fab2b5 100644 --- a/extensions/java/cgmanifest.json +++ b/extensions/java/cgmanifest.json @@ -6,11 +6,11 @@ "git": { "name": "atom/language-java", "repositoryUrl": "https://github.com/atom/language-java", - "commitHash": "9fc8f699e55284c0a8ddf03d929504064eb4f757" + "commitHash": "759a0ac02dc091018a112b25a5a6d894918a0aa8" } }, "license": "MIT", - "version": "0.31.2" + "version": "0.31.3" } ], "version": 1 diff --git a/extensions/java/syntaxes/java.tmLanguage.json b/extensions/java/syntaxes/java.tmLanguage.json index 736861a6043..6b4233c8eb3 100644 --- a/extensions/java/syntaxes/java.tmLanguage.json +++ b/extensions/java/syntaxes/java.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/atom/language-java/commit/9fc8f699e55284c0a8ddf03d929504064eb4f757", + "version": "https://github.com/atom/language-java/commit/759a0ac02dc091018a112b25a5a6d894918a0aa8", "name": "Java", "scopeName": "source.java", "patterns": [ @@ -209,7 +209,7 @@ "name": "keyword.control.new.java" } }, - "end": "(?=;|\\)|,|:|}|\\+)", + "end": "(?=;|\\)|,|:|}|\\+|\\-|\\*|\\/|%|!|&|\\||=)", "patterns": [ { "include": "#comments" @@ -1096,12 +1096,12 @@ "include": "#generics" }, { - "begin": "\\b((?:[A-Za-z]\\w*\\s*\\.\\s*)*)([A-Z]\\w*)\\s*(?=\\[)", + "begin": "\\b((?:[A-Za-z_]\\w*\\s*\\.\\s*)*)([A-Z_]\\w*)\\s*(?=\\[)", "beginCaptures": { "1": { "patterns": [ { - "match": "[A-Za-z]\\w*", + "match": "[A-Za-z_]\\w*", "name": "storage.type.java" }, { @@ -1125,12 +1125,12 @@ ] }, { - "match": "\\b((?:[A-Za-z]\\w*\\s*\\.\\s*)*[A-Z]\\w*)\\s*(?=<)", + "match": "\\b((?:[A-Za-z_]\\w*\\s*\\.\\s*)*[A-Z_]\\w*)\\s*(?=<)", "captures": { "1": { "patterns": [ { - "match": "[A-Za-z]\\w*", + "match": "[A-Za-z_]\\w*", "name": "storage.type.java" }, { @@ -1142,12 +1142,12 @@ } }, { - "match": "\\b((?:[A-Za-z]\\w*\\s*\\.\\s*)*[A-Z]\\w*)\\b((?=\\s*[A-Za-z$_\\n])|(?=\\s*\\.\\.\\.))", + "match": "\\b((?:[A-Za-z_]\\w*\\s*\\.\\s*)*[A-Z_]\\w*)\\b((?=\\s*[A-Za-z$_\\n])|(?=\\s*\\.\\.\\.))", "captures": { "1": { "patterns": [ { - "match": "[A-Za-z]\\w*", + "match": "[A-Za-z_]\\w*", "name": "storage.type.java" }, { @@ -1576,7 +1576,7 @@ ] }, "variables": { - "begin": "(?x)\n(?=\n (\n \\b(void|boolean|byte|char|short|int|float|long|double)\\b\n |\n (?>(\\w+\\.)*[A-Z]+\\w*) # e.g. `javax.ws.rs.Response`, or `String`\n )\n \\s*\n (\n <[\\w<>,\\.?\\s\\[\\]]*> # e.g. `HashMap`, or `List`\n )?\n \\s*\n (\n (\\[\\])* # int[][]\n )?\n \\s+\n [A-Za-z_$][\\w$]* # At least one identifier after space\n ([\\w\\[\\],$][\\w\\[\\],\\s]*)? # possibly primitive array or additional identifiers\n \\s*(=|:|;)\n)", + "begin": "(?x)\n(?=\n (\n \\b(void|boolean|byte|char|short|int|float|long|double)\\b\n |\n (?>(\\w+\\.)*[A-Z_]+\\w*) # e.g. `javax.ws.rs.Response`, or `String`\n )\n \\s*\n (\n <[\\w<>,\\.?\\s\\[\\]]*> # e.g. `HashMap`, or `List`\n )?\n \\s*\n (\n (\\[\\])* # int[][]\n )?\n \\s+\n [A-Za-z_$][\\w$]* # At least one identifier after space\n ([\\w\\[\\],$][\\w\\[\\],\\s]*)? # possibly primitive array or additional identifiers\n \\s*(=|:|;)\n)", "end": "(?=\\=|:|;)", "name": "meta.definition.variable.java", "patterns": [ diff --git a/extensions/objective-c/cgmanifest.json b/extensions/objective-c/cgmanifest.json index fc610c254ee..f7f15ff638a 100644 --- a/extensions/objective-c/cgmanifest.json +++ b/extensions/objective-c/cgmanifest.json @@ -6,11 +6,11 @@ "git": { "name": "jeff-hykin/cpp-textmate-grammar", "repositoryUrl": "https://github.com/jeff-hykin/cpp-textmate-grammar", - "commitHash": "efa8ce61762d0481a1b710fdbc12e284867cdc8f" + "commitHash": "9c4f4b3291538d9f5144f02d3b6af877b84f2cb2" } }, "license": "MIT", - "version": "1.11.0", + "version": "1.0.0", "description": "The files syntaxes/objective-c.tmLanguage.json and syntaxes/objective-c++.tmLanguage.json were derived from the language package https://github.com/jeff-hykin/cpp-textmate-grammar." } ], diff --git a/extensions/objective-c/syntaxes/objective-c++.tmLanguage.json b/extensions/objective-c/syntaxes/objective-c++.tmLanguage.json index 5f5f57ccc7a..d9d1cfa5584 100644 --- a/extensions/objective-c/syntaxes/objective-c++.tmLanguage.json +++ b/extensions/objective-c/syntaxes/objective-c++.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/jeff-hykin/cpp-textmate-grammar/commit/8d3cf8028835c68e75e42d0bd3192c837847a419", + "version": "https://github.com/jeff-hykin/cpp-textmate-grammar/commit/9c4f4b3291538d9f5144f02d3b6af877b84f2cb2", "name": "Objective-C++", "scopeName": "source.objcpp", "patterns": [ diff --git a/extensions/objective-c/syntaxes/objective-c.tmLanguage.json b/extensions/objective-c/syntaxes/objective-c.tmLanguage.json index 95a57cee9cc..e08731bb134 100644 --- a/extensions/objective-c/syntaxes/objective-c.tmLanguage.json +++ b/extensions/objective-c/syntaxes/objective-c.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/jeff-hykin/cpp-textmate-grammar/commit/efa8ce61762d0481a1b710fdbc12e284867cdc8f", + "version": "https://github.com/jeff-hykin/cpp-textmate-grammar/commit/9c4f4b3291538d9f5144f02d3b6af877b84f2cb2", "name": "Objective-C", "scopeName": "source.objc", "patterns": [ diff --git a/extensions/perl/cgmanifest.json b/extensions/perl/cgmanifest.json index 83d91107671..b7c850dd1aa 100644 --- a/extensions/perl/cgmanifest.json +++ b/extensions/perl/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "textmate/perl.tmbundle", "repositoryUrl": "https://github.com/textmate/perl.tmbundle", - "commitHash": "80826abe75250286c2a1a07958e50e8551d3f50c" + "commitHash": "d9841a0878239fa43f88c640f8d458590f97e8f5" } }, "licenseDetail": [ diff --git a/extensions/sql/cgmanifest.json b/extensions/sql/cgmanifest.json index 4cdccf12d95..7abcea36e5d 100644 --- a/extensions/sql/cgmanifest.json +++ b/extensions/sql/cgmanifest.json @@ -6,11 +6,11 @@ "git": { "name": "Microsoft/vscode-mssql", "repositoryUrl": "https://github.com/Microsoft/vscode-mssql", - "commitHash": "cd754662e5607c62ecdc51d2a2dc844546a0bbb6" + "commitHash": "a79741f76fd33bd137a8c28172c9750b978309b6" } }, "license": "MIT", - "version": "1.4.0" + "version": "1.6.0" } ], "version": 1 diff --git a/extensions/sql/syntaxes/sql.tmLanguage.json b/extensions/sql/syntaxes/sql.tmLanguage.json index d7bc056c6eb..1dd6903783f 100644 --- a/extensions/sql/syntaxes/sql.tmLanguage.json +++ b/extensions/sql/syntaxes/sql.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/Microsoft/vscode-mssql/commit/cd754662e5607c62ecdc51d2a2dc844546a0bbb6", + "version": "https://github.com/Microsoft/vscode-mssql/commit/a79741f76fd33bd137a8c28172c9750b978309b6", "name": "SQL", "scopeName": "source.sql", "patterns": [ @@ -17,7 +17,7 @@ "name": "text.bracketed" }, { - "match": "\\b(?i)(abort|abort_after_wait|absent|absolute|accent_sensitivity|acceptable_cursopt|acp|action|activation|address|admin|aes_128|aes_192|aes_256|affinity|after|aggregate|algorithm|all_constraints|all_errormsgs|all_indexes|all_levels|all_results|allow_connections|allow_dup_row|allow_encrypted_value_modifications|allow_page_locks|allow_row_locks|allow_snapshot_isolation|altercolumn|always|anonymous|ansi_defaults|ansi_null_default|ansi_null_dflt_off|ansi_null_dflt_on|ansi_nulls|ansi_padding|ansi_warnings|appdomain|append|application|apply|arithabort|arithignore|assembly|asymmetric|asynchronous_commit|at|atan2|atomic|attach|attach_force_rebuild_log|attach_rebuild_log|audit|auth_realm|authentication|auto|auto_cleanup|auto_close|auto_create_statistics|auto_shrink|auto_update_statistics|auto_update_statistics_async|automated_backup_preference |automatic|autopilot|availability|availability_mode|backup_priority|base64|basic|batches|batchsize|before|between|bigint|binary|binding|bit|block|blocksize|bmk|break|broker|broker_instance|bucket_count|buffer|buffercount|bulk_logged|by|call|caller|card|case|cast|catalog|catch|cert|certificate|change_retention|change_tracking|change_tracking_context|changes|char|character|character_set|check_expiration|check_policy|checkconstraints|checkindex|checkpoint|cleanup_policy|clear|clear_port|close|codepage|collection|column_encryption_key|column_master_key|columnstore|columnstore_archive|colv_80_to_100|colv_100_to_80|commit_differential_base|committed|compatibility_level|compress_all_row_groups|compression|compression_delay|concat_null_yields_null|concatenate|configuration|connect|continue|continue_after_error|contract|contract_name|control|conversation|conversation_group_id|conversation_handle|copy|copy_only|count_rows|counter|create(\\s+or\\s+alter)?|credential|cross|cryptographic|cryptographic_provider|cube|cursor_close_on_commit|cursor_default|data|data_compression|data_flush_interval_seconds|data_mirroring|data_purity|data_source|database|database_name|database_snapshot|datafiletype|date_correlation_optimization|date|datefirst|dateformat|date_format|datetime|datetime2|datetimeoffset|days|db_chaining|dbid|dbidexec|dbo_only|deadlock_priority|deallocate|dec|decimal|declare(\\s+cursor)?|decrypt|decrypt_a|decryption|default_database|default_language|default_logon_domain|default_schema|definition|delay|delayed_durability|delimitedtext|density_vector|dependent|des|description|desired_state|desx|differential|digest|disable|disable_broker|disable_def_cnst_chk|disabled|disk|distinct|distributed|distribution|drop|drop_existing|dts_buffers|dump|durability|dynamic|edition|elements|else|emergency|empty|enable|enable_broker|enabled|encoding|encrypted|encrypted_value|encryption|encryption_type|end|endpoint|endpoint_url|enhancedintegrity|entry|error_broker_conversations|errorfile|estimateonly|event|exec|executable|execute|exists|expand|expiredate|expiry_date|explicit|external_access|failover|failover_mode|failure_condition_level|fast|fast_forward|fastfirstrow|federated_service_account|fetch|field_terminator|fieldterminator|file|filelistonly|filegroup|filename|filestream|filestream_log|filestream_on|filetable|file_format|filter|fips_flagger|fire_triggers|first|firstrow|float|flush_interval_seconds|fmtonly|following|force|force_failover_allow_data_loss|force_service_allow_data_loss|forced|forceplan|formatfile|format_options|format_type|formsof|forward_only|free_cursors|free_exec_context|fullscan|fulltext|fulltextall|fulltextkey|function|generated|get|geography|geometry|global|go|goto|governor|guid|hadoop|hardening|hash|hashed|header_limit|headeronly|health_check_timeout|hidden|hierarchyid|histogram|histogram_steps|hits_cursors|hits_exec_context|hours|http|identity|identity_value|if|ifnull|ignore_constraints|ignore_dup_key|ignore_dup_row|ignore_triggers|image|immediate|implicit_transactions|include|include_null_values|inflectional|init|initiator|insensitive|insert|instead|int|integer|integrated|intermediate|interval_length_minutes|into|inuse_cursors|inuse_exec_context|io|is|isabout|iso_week|isolation|job_tracker_location|json|keep|keep_nulls|keep_replication|keepdefaults|keepfixed|keepidentity|keepnulls|kerberos|key|key_path|key_source|key_store_provider_name|keyset|kill|kilobytes_per_batch|labelonly|langid|language|last|lastrow|legacy_cardinality_estimation|length|level|lifetime|lineage_80_to_100|lineage_100_to_80|listener_ip|listener_port|load|loadhistory|lob_compaction|local|local_service_name|locate|location|lock_escalation|lock_timeout|lockres|login|login_type|loop|manual|mark_in_use_for_removal|masked|master|max_queue_readers|max_duration|max_outstanding_io_per_volume|maxdop|maxerrors|maxlength|maxtransfersize|max_plans_per_query|max_storage_size_mb|mediadescription|medianame|mediapassword|memogroup|memory_optimized|merge|message|message_forward_size|message_forwarding|microsecond|millisecond|minutes|mirror_address|misses_cursors|misses_exec_context|mixed|modify|money|move|multi_user|must_change|name|namespace|nanosecond|native|native_compilation|nchar|ncharacter|never|new_account|new_broker|newname|next|no|no_browsetable|no_checksum|no_compression|no_infomsgs|no_triggers|no_truncate|nocount|noexec|noexpand|noformat|noinit|nolock|nonatomic|nondurable|none|norecompute|norecovery|noreset|norewind|noskip|not|notification|nounload|now|nowait|ntext|ntlm|numeric|numeric_roundabort|nvarchar|object|objid|oem|offline|old_account|online|operation_mode|open|openjson|optimistic|option|orc|out|outer|output|over|override|owner|ownership|pad_index|page|page_checksum|page_verify|pagecount|paglock|param|parameter_sniffing|parameter_type_expansion|parameterization|parquet|parseonly|partial|partition|partner|password|path|pause|percentage|permission_set|persisted|period|physical_only|plan_forcing_mode|policy|pool|population|ports|preceding|precision|predicate|presume_abort|primary|primary_role|print|prior|priority |priority_level|private|proc(edure)?|procedure_name|profile|provider|query_capture_mode|query_governor_cost_limit|query_optimizer_hotfixes|query_store|queue|quoted_identifier|raiserror|range|raw|rcfile|rc2|rc4|rc4_128|rdbms|read_committed_snapshot|read|read_only|read_write|readcommitted|readcommittedlock|readonly|readpast|readuncommitted|readwrite|real|rebuild|receive|recmodel_70backcomp|recompile|reconfigure|recovery|recursive|recursive_triggers|redo_queue|reject_sample_value|reject_type|reject_value|relative|remote|remote_data_archive|remote_proc_transactions|remote_service_name|remove|removed_cursors|removed_exec_context|reorganize|repeat|repeatable|repeatableread|replica|replicated|replnick_100_to_80|replnickarray_80_to_100|replnickarray_100_to_80|required|required_cursopt|resample|reset|resource|resource_manager_location|restart|restore|restricted_user|resume|retaindays|retention|return|revert|rewind|rewindonly|returns|robust|role|rollup|root|round_robin|route|row|rowdump|rowguidcol|rowlock|row_terminator|rows|rows_per_batch|rowsets_only|rowterminator|rowversion|rsa_1024|rsa_2048|rsa_3072|rsa_4096|rsa_512|safe|safety|sample|save|schemabinding|scoped|scroll|scroll_locks|sddl|secexpr|secondary|secondary_only|secondary_role|secret|security|securityaudit|selective|self|send|sent|sequence|serde_method|serializable|server|service|service_broker|service_name|service_objective|session_timeout|session|sessions|seterror|setopts|sets|shard_map_manager|shard_map_name|sharded|shared_memory|show_statistics|showplan_all|showplan_text|showplan_xml|showplan_xml_with_recompile|shrinkdb|shutdown|sid|signature|simple|single_blob|single_clob|single_nclob|single_user|singleton|site|size_based_cleanup_mode|skip|smalldatetime|smallint|smallmoney|snapshot|snapshot_import|snapshotrestorephase|soap|softnuma|sort_in_tempdb|sorted_data|sorted_data_reorg|spatial|sql|sql_bigint|sql_binary|sql_bit|sql_char|sql_date|sql_decimal|sql_double|sql_float|sql_guid|sql_handle|sql_longvarbinary|sql_longvarchar|sql_numeric|sql_real|sql_smallint|sql_time|sql_timestamp|sql_tinyint|sql_tsi_day|sql_tsi_frac_second|sql_tsi_hour|sql_tsi_minute|sql_tsi_month|sql_tsi_quarter|sql_tsi_second|sql_tsi_week|sql_tsi_year|sql_type_date|sql_type_time|sql_type_timestamp|sql_varbinary|sql_varchar|sql_variant|sql_wchar|sql_wlongvarchar|ssl|ssl_port|standard|standby|start|start_date|started|stat_header|state|statement|static|statistics|statistics_incremental|statistics_norecompute|statistics_only|statman|stats_stream|status|stop|stop_on_error|stopat|stopatmark|stopbeforemark|stoplist|stopped|string_delimiter|subject|supplemental_logging|supported|suspend|symmetric|synchronous_commit|synonym|sysname|system|system_time|system_versioning|table|tableresults|tablock|tablockx|take|tape|target|target_index|target_partition|tcp|temporal_history_retention|text|textimage_on|then|thesaurus|throw|time|timeout|timestamp|tinyint|to|top|torn_page_detection|track_columns_updated|tran|transaction|transfer|triple_des|triple_des_3key|truncate|trustworthy|try|tsql|type|type_desc|type_warning|tzoffset|uid|unbounded|uncommitted|uniqueidentifier|unlimited|unload|unlock|unsafe|updlock|url|use|useplan|useroptions|use_type_default|using|utcdatetime|valid_xml|validation|value|values|varbinary|varchar|verbose|verifyonly|version|view_metadata|virtual_device|visiblity|waitfor|webmethod|weekday|weight|well_formed_xml|when|while|widechar|widechar_ansi|widenative|windows|with|within|witness|without|without_array_wrapper|workload|wsdl|xact_abort|xlock|xml|xmlschema|xquery|xsinil|zone)\\b", + "match": "\\b(?i)(abort|abort_after_wait|absent|absolute|accent_sensitivity|acceptable_cursopt|acp|action|activation|address|admin|aes_128|aes_192|aes_256|affinity|after|aggregate|algorithm|all_constraints|all_errormsgs|all_indexes|all_levels|all_results|allow_connections|allow_dup_row|allow_encrypted_value_modifications|allow_page_locks|allow_row_locks|allow_snapshot_isolation|alter|altercolumn|always|anonymous|ansi_defaults|ansi_null_default|ansi_null_dflt_off|ansi_null_dflt_on|ansi_nulls|ansi_padding|ansi_warnings|appdomain|append|application|apply|arithabort|arithignore|assembly|asymmetric|asynchronous_commit|at|atan2|atomic|attach|attach_force_rebuild_log|attach_rebuild_log|audit|auth_realm|authentication|auto|auto_cleanup|auto_close|auto_create_statistics|auto_shrink|auto_update_statistics|auto_update_statistics_async|automated_backup_preference|automatic|autopilot|availability|availability_mode|backup_priority|base64|basic|batches|batchsize|before|between|bigint|binary|binding|bit|block|blocksize|bmk|break|broker|broker_instance|bucket_count|buffer|buffercount|bulk_logged|by|call|caller|card|case|cast|catalog|catch|cert|certificate|change_retention|change_tracking|change_tracking_context|changes|char|character|character_set|check_expiration|check_policy|checkconstraints|checkindex|checkpoint|cleanup_policy|clear|clear_port|close|codepage|collection|column_encryption_key|column_master_key|columnstore|columnstore_archive|colv_80_to_100|colv_100_to_80|commit_differential_base|committed|compatibility_level|compress_all_row_groups|compression|compression_delay|concat_null_yields_null|concatenate|configuration|connect|continue|continue_after_error|contract|contract_name|control|conversation|conversation_group_id|conversation_handle|copy|copy_only|count_rows|counter|create(\\s+or\\s+alter)?|credential|cross|cryptographic|cryptographic_provider|cube|cursor_close_on_commit|cursor_default|data|data_compression|data_flush_interval_seconds|data_mirroring|data_purity|data_source|database|database_name|database_snapshot|datafiletype|date_correlation_optimization|date|datefirst|dateformat|date_format|datetime|datetime2|datetimeoffset|days|db_chaining|dbid|dbidexec|dbo_only|deadlock_priority|deallocate|dec|decimal|declare(\\s+cursor)?|decrypt|decrypt_a|decryption|default_database|default_language|default_logon_domain|default_schema|definition|delay|delayed_durability|delimitedtext|density_vector|dependent|des|description|desired_state|desx|differential|digest|disable|disable_broker|disable_def_cnst_chk|disabled|disk|distinct|distributed|distribution|drop|drop_existing|dts_buffers|dump|durability|dynamic|edition|elements|else|emergency|empty|enable|enable_broker|enabled|encoding|encrypted|encrypted_value|encryption|encryption_type|end|endpoint|endpoint_url|enhancedintegrity|entry|error_broker_conversations|errorfile|estimateonly|event|except|exec|executable|execute|exists|expand|expiredate|expiry_date|explicit|external|external_access|failover|failover_mode|failure_condition_level|fast|fast_forward|fastfirstrow|federated_service_account|fetch|field_terminator|fieldterminator|file|filelistonly|filegroup|filename|filestream|filestream_log|filestream_on|filetable|file_format|filter|first_row|fips_flagger|fire_triggers|first|firstrow|float|flush_interval_seconds|fmtonly|following|force|force_failover_allow_data_loss|force_service_allow_data_loss|forced|forceplan|formatfile|format_options|format_type|formsof|forward_only|free_cursors|free_exec_context|fullscan|fulltext|fulltextall|fulltextkey|function|generated|get|geography|geometry|global|go|goto|governor|guid|hadoop|hardening|hash|hashed|header_limit|headeronly|health_check_timeout|hidden|hierarchyid|histogram|histogram_steps|hits_cursors|hits_exec_context|hours|http|identity|identity_value|if|ifnull|ignore_constraints|ignore_dup_key|ignore_dup_row|ignore_triggers|image|immediate|implicit_transactions|include|include_null_values|inflectional|init|initiator|insensitive|insert|instead|int|integer|integrated|intersect|intermediate|interval_length_minutes|into|inuse_cursors|inuse_exec_context|io|is|isabout|iso_week|isolation|job_tracker_location|json|keep|keep_nulls|keep_replication|keepdefaults|keepfixed|keepidentity|keepnulls|kerberos|key|key_path|key_source|key_store_provider_name|keyset|kill|kilobytes_per_batch|labelonly|langid|language|last|lastrow|legacy_cardinality_estimation|length|level|lifetime|lineage_80_to_100|lineage_100_to_80|listener_ip|listener_port|load|loadhistory|lob_compaction|local|local_service_name|locate|location|lock_escalation|lock_timeout|lockres|login|login_type|loop|manual|mark_in_use_for_removal|masked|master|max_queue_readers|max_duration|max_outstanding_io_per_volume|maxdop|maxerrors|maxlength|maxtransfersize|max_plans_per_query|max_storage_size_mb|mediadescription|medianame|mediapassword|memogroup|memory_optimized|merge|message|message_forward_size|message_forwarding|microsecond|millisecond|minutes|mirror_address|misses_cursors|misses_exec_context|mixed|modify|money|move|multi_user|must_change|name|namespace|nanosecond|native|native_compilation|nchar|ncharacter|never|new_account|new_broker|newname|next|no|no_browsetable|no_checksum|no_compression|no_infomsgs|no_triggers|no_truncate|nocount|noexec|noexpand|noformat|noinit|nolock|nonatomic|nondurable|none|norecompute|norecovery|noreset|norewind|noskip|not|notification|nounload|now|nowait|ntext|ntlm|numeric|numeric_roundabort|nvarchar|object|objid|oem|offline|old_account|online|operation_mode|open|openjson|optimistic|option|orc|out|outer|output|over|override|owner|ownership|pad_index|page|page_checksum|page_verify|pagecount|paglock|param|parameter_sniffing|parameter_type_expansion|parameterization|parquet|parseonly|partial|partition|partner|password|path|pause|percentage|permission_set|persisted|period|physical_only|plan_forcing_mode|policy|pool|population|ports|preceding|precision|predicate|presume_abort|primary|primary_role|print|prior|priority |priority_level|private|proc(edure)?|procedure_name|profile|provider|query_capture_mode|query_governor_cost_limit|query_optimizer_hotfixes|query_store|queue|quoted_identifier|raiserror|range|raw|rcfile|rc2|rc4|rc4_128|rdbms|read_committed_snapshot|read|read_only|read_write|readcommitted|readcommittedlock|readonly|readpast|readuncommitted|readwrite|real|rebuild|receive|recmodel_70backcomp|recompile|reconfigure|recovery|recursive|recursive_triggers|redo_queue|reject_sample_value|reject_type|reject_value|relative|remote|remote_data_archive|remote_proc_transactions|remote_service_name|remove|removed_cursors|removed_exec_context|reorganize|repeat|repeatable|repeatableread|replica|replicated|replnick_100_to_80|replnickarray_80_to_100|replnickarray_100_to_80|required|required_cursopt|resample|reset|resource|resource_manager_location|restart|restore|restricted_user|resume|retaindays|retention|return|revert|rewind|rewindonly|returns|robust|role|rollup|root|round_robin|route|row|rowdump|rowguidcol|rowlock|row_terminator|rows|rows_per_batch|rowsets_only|rowterminator|rowversion|rsa_1024|rsa_2048|rsa_3072|rsa_4096|rsa_512|safe|safety|sample|save|schema|schemabinding|scoped|scroll|scroll_locks|sddl|secexpr|secondary|secondary_only|secondary_role|secret|security|securityaudit|selective|self|send|sent|sequence|serde_method|serializable|server|service|service_broker|service_name|service_objective|session_timeout|session|sessions|seterror|setopts|sets|shard_map_manager|shard_map_name|sharded|shared_memory|show_statistics|showplan_all|showplan_text|showplan_xml|showplan_xml_with_recompile|shrinkdb|shutdown|sid|signature|simple|single_blob|single_clob|single_nclob|single_user|singleton|site|size_based_cleanup_mode|skip|smalldatetime|smallint|smallmoney|snapshot|snapshot_import|snapshotrestorephase|soap|softnuma|sort_in_tempdb|sorted_data|sorted_data_reorg|spatial|sql|sql_bigint|sql_binary|sql_bit|sql_char|sql_date|sql_decimal|sql_double|sql_float|sql_guid|sql_handle|sql_longvarbinary|sql_longvarchar|sql_numeric|sql_real|sql_smallint|sql_time|sql_timestamp|sql_tinyint|sql_tsi_day|sql_tsi_frac_second|sql_tsi_hour|sql_tsi_minute|sql_tsi_month|sql_tsi_quarter|sql_tsi_second|sql_tsi_week|sql_tsi_year|sql_type_date|sql_type_time|sql_type_timestamp|sql_varbinary|sql_varchar|sql_variant|sql_wchar|sql_wlongvarchar|ssl|ssl_port|standard|standby|start|start_date|started|stat_header|state|statement|static|statistics|statistics_incremental|statistics_norecompute|statistics_only|statman|stats_stream|status|stop|stop_on_error|stopat|stopatmark|stopbeforemark|stoplist|stopped|string_delimiter|subject|supplemental_logging|supported|suspend|symmetric|synchronous_commit|synonym|sysname|system|system_time|system_versioning|table|tableresults|tablock|tablockx|take|tape|target|target_index|target_partition|tcp|temporal_history_retention|text|textimage_on|then|thesaurus|throw|time|timeout|timestamp|tinyint|to|top|torn_page_detection|track_columns_updated|tran|transaction|transfer|triple_des|triple_des_3key|truncate|trustworthy|try|tsql|type|type_desc|type_warning|tzoffset|uid|unbounded|uncommitted|uniqueidentifier|unlimited|unload|unlock|unsafe|updlock|url|use|useplan|useroptions|use_type_default|using|utcdatetime|valid_xml|validation|value|values|varbinary|varchar|verbose|verifyonly|version|view_metadata|virtual_device|visiblity|waitfor|webmethod|weekday|weight|well_formed_xml|when|while|widechar|widechar_ansi|widenative|windows|with|within|witness|without|without_array_wrapper|workload|wsdl|xact_abort|xlock|xml|xmlschema|xquery|xsinil|zone)\\b", "name": "keyword.other.sql" }, { From 219a2f226226759b669c9ed8ec24006beeb2ca7b Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 1 Jul 2019 16:54:51 +0200 Subject: [PATCH 0831/1449] pipelines: adopt shared compilation --- .../azure-pipelines/darwin/product-build-darwin.yml | 8 ++------ build/azure-pipelines/linux/product-build-linux.yml | 13 ++----------- build/azure-pipelines/win32/product-build-win32.yml | 4 +--- 3 files changed, 5 insertions(+), 20 deletions(-) diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index 74386b4ae30..cde0a7a3c2b 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -77,13 +77,9 @@ steps: - script: | set -e VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-darwin-min - VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-reh-darwin-min - VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-web-darwin-min + yarn gulp darwin-min AZURE_STORAGE_ACCESS_KEY="$(ticino-storage-key)" \ - yarn gulp upload-vscode-sourcemaps + yarn gulp upload-vscode-sourcemaps displayName: Build - script: | diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index bf3a0794561..f03c41a0709 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -77,17 +77,8 @@ steps: - script: | set -e - if [[ "$VSCODE_ARCH" == "ia32" ]]; then - VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-linux-$VSCODE_ARCH-min - else - VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-linux-$VSCODE_ARCH-min - VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-reh-linux-$VSCODE_ARCH-min - VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-web-linux-$VSCODE_ARCH-min - fi + VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ + yarn gulp linux-$VSCODE_ARCH-min displayName: Build - script: | diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index adc5bd51e20..411d2f784e7 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -85,9 +85,7 @@ steps: . build/azure-pipelines/win32/exec.ps1 $ErrorActionPreference = "Stop" $env:VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" - exec { yarn gulp "vscode-win32-$env:VSCODE_ARCH-min" } - exec { yarn gulp "vscode-reh-win32-$env:VSCODE_ARCH-min" } - exec { yarn gulp "vscode-web-win32-$env:VSCODE_ARCH-min" } + exec { yarn gulp "win32-$env:VSCODE_ARCH-min" } exec { yarn gulp "vscode-win32-$env:VSCODE_ARCH-inno-updater" } displayName: Build From 94f9151dc0498dedfde9b0a8d8930a73f7ad74e5 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 1 Jul 2019 16:55:47 +0200 Subject: [PATCH 0832/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9c44480cc48..947cc1a862b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "832c287d6e6ccfd5e0ef975fd276a8c0ff38054f", + "distro": "69064e5e1c2b09608d5b718d491fe5a16dc7ba51", "author": { "name": "Microsoft Corporation" }, From 3566db59565e11bd864a27912a6016f56e964fff Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Mon, 1 Jul 2019 07:57:09 -0700 Subject: [PATCH 0833/1449] Update remove icon --- src/vs/workbench/browser/actions/media/actions.css | 2 +- src/vs/workbench/browser/actions/media/remove-dark.svg | 4 +++- src/vs/workbench/browser/actions/media/remove-light.svg | 3 +++ src/vs/workbench/browser/actions/media/remove.svg | 1 - 4 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 src/vs/workbench/browser/actions/media/remove-light.svg delete mode 100644 src/vs/workbench/browser/actions/media/remove.svg diff --git a/src/vs/workbench/browser/actions/media/actions.css b/src/vs/workbench/browser/actions/media/actions.css index 31dd938759f..8a05cca476d 100644 --- a/src/vs/workbench/browser/actions/media/actions.css +++ b/src/vs/workbench/browser/actions/media/actions.css @@ -12,7 +12,7 @@ } .vs .action-remove-from-recently-opened { - background: url("remove.svg") center center no-repeat; + background: url("remove-light.svg") center center no-repeat; } .vs-dark .action-remove-from-recently-opened, diff --git a/src/vs/workbench/browser/actions/media/remove-dark.svg b/src/vs/workbench/browser/actions/media/remove-dark.svg index 751e89b3b02..f8af265cc44 100644 --- a/src/vs/workbench/browser/actions/media/remove-dark.svg +++ b/src/vs/workbench/browser/actions/media/remove-dark.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/src/vs/workbench/browser/actions/media/remove-light.svg b/src/vs/workbench/browser/actions/media/remove-light.svg new file mode 100644 index 00000000000..7acc4103388 --- /dev/null +++ b/src/vs/workbench/browser/actions/media/remove-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/actions/media/remove.svg b/src/vs/workbench/browser/actions/media/remove.svg deleted file mode 100644 index fde34404d4e..00000000000 --- a/src/vs/workbench/browser/actions/media/remove.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file From b590199b75d7e058e2ac8bd1dc4e9ce62919ae18 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 1 Jul 2019 17:58:38 +0200 Subject: [PATCH 0834/1449] up the memory --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 947cc1a862b..1f575eb244f 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "watch-client": "gulp watch-client --max_old_space_size=4095", "monaco-editor-test": "mocha --only-monaco-editor", "precommit": "node build/gulpfile.hygiene.js", - "gulp": "gulp --max_old_space_size=4095", + "gulp": "gulp --max_old_space_size=8192", "7z": "7z", "update-grammars": "node build/npm/update-all-grammars.js", "update-localization-extension": "node build/npm/update-localization-extension.js", From a45efad540331f2e45980d511cf98a4b77b9ab02 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 1 Jul 2019 18:02:15 +0200 Subject: [PATCH 0835/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1f575eb244f..183da8019eb 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "69064e5e1c2b09608d5b718d491fe5a16dc7ba51", + "distro": "283437b4d514089d746fb98338d4ec831e588e06", "author": { "name": "Microsoft Corporation" }, From 151092d88173d06c72297263fb99f63ac31a703f Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Mon, 1 Jul 2019 09:08:53 -0700 Subject: [PATCH 0836/1449] Add high contrast icon for editor layout --- src/vs/workbench/browser/actions/media/actions.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/workbench/browser/actions/media/actions.css b/src/vs/workbench/browser/actions/media/actions.css index 8a05cca476d..65e70133370 100644 --- a/src/vs/workbench/browser/actions/media/actions.css +++ b/src/vs/workbench/browser/actions/media/actions.css @@ -11,6 +11,10 @@ background-image: url('layout-dark.svg'); } +.hc-black .monaco-workbench .flip-editor-layout { + background-image: url('layout-hc.svg'); +} + .vs .action-remove-from-recently-opened { background: url("remove-light.svg") center center no-repeat; } From 6f9bf94619a6cb5a570e3d79705f8abdc8068b84 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 1 Jul 2019 18:29:49 +0200 Subject: [PATCH 0837/1449] build - automatically release electron 6 exploration --- build/azure-pipelines/product-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 15c61e913a4..6ef418e21e9 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -85,7 +85,7 @@ jobs: - template: darwin/product-build-darwin.yml - job: Release - condition: and(succeeded(), or(eq(variables['VSCODE_RELEASE'], 'true'), and(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['Build.Reason'], 'Schedule')), and(eq(variables['VSCODE_QUALITY'], 'exploration'), eq(variables['Build.SourceBranch'], 'refs/heads/electron-4.0.x')))) + condition: and(succeeded(), or(eq(variables['VSCODE_RELEASE'], 'true'), and(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['Build.Reason'], 'Schedule')), and(eq(variables['VSCODE_QUALITY'], 'exploration'), eq(variables['Build.SourceBranch'], 'refs/heads/electron-6.0.x')))) pool: vmImage: 'Ubuntu-16.04' dependsOn: From 7cbf591b90c0c2669d11ea12738e8b8618e60e7a Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 1 Jul 2019 18:39:57 +0200 Subject: [PATCH 0838/1449] wip --- resourceServiceWorkerMain.js | 40 ++++++++++++++++ src/vs/workbench/browser/web.resources.ts | 8 ++++ .../browser/resourceServiceWorker.ts | 11 +++++ .../browser/resourceServiceWorkerClient.ts | 29 +++++++++++ .../browser/resourceServiceWorkerMain.ts | 48 +++++++++++++++++++ src/vs/workbench/workbench.web.main.ts | 5 ++ 6 files changed, 141 insertions(+) create mode 100644 resourceServiceWorkerMain.js create mode 100644 src/vs/workbench/contrib/resources/browser/resourceServiceWorker.ts create mode 100644 src/vs/workbench/contrib/resources/browser/resourceServiceWorkerClient.ts create mode 100644 src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts diff --git a/resourceServiceWorkerMain.js b/resourceServiceWorkerMain.js new file mode 100644 index 00000000000..38278c36043 --- /dev/null +++ b/resourceServiceWorkerMain.js @@ -0,0 +1,40 @@ +"use strict"; +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +(function () { + let handler; + self.addEventListener('fetch', event => { + console.log('FETCH', event); + if (handler) { + handler.handleFetchEvent(event); + } + else { + //@ts-ignore + event.respondWith(fetch(event.request)); + } + }); + self.addEventListener('install', event => { + let loadPromise = new Promise((resolve, reject) => { + // load loader + const monacoBaseUrl = './out/'; + importScripts(monacoBaseUrl + 'vs/loader.js'); + require.config({ + baseUrl: monacoBaseUrl, + catchError: true + }); + require(['vs/workbench/contrib/resources/browser/resourceServiceWorker'], module => { + handler = module; + resolve(); + }, reject); + }); + //@ts-ignore + event.waitUntil(Promise.all([loadPromise, self.skipWaiting()])); + }); + self.addEventListener('activate', event => { + //@ts-ignore + event.waitUntil(self.clients.claim()); // Become available to all pages + }); +})(); +//# sourceMappingURL=resourceServiceWorkerMain.js.map diff --git a/src/vs/workbench/browser/web.resources.ts b/src/vs/workbench/browser/web.resources.ts index ca6c82ef787..2b9adf61c5e 100644 --- a/src/vs/workbench/browser/web.resources.ts +++ b/src/vs/workbench/browser/web.resources.ts @@ -79,6 +79,14 @@ export class WebResources { private async _rewriteUrls(textContent: string): Promise { + return textContent.replace(/url\(('|")?(vscode-remote:\/\/(.*?))\1\)/ig, function (_m, quote, url) { + return `url("http://localhost:9888/out/vs/workbench/contrib/resources/browser/foo?${encodeURIComponent(url)}")`; + // return `url(${quote}${location.href}out/vs/workbench/contrib/resources/browser/?${encodeURIComponent(url)}${quote})`; + }); + } + + private async _rewriteUrls2(textContent: string): Promise { + const positions: number[] = []; const promises: Promise[] = []; diff --git a/src/vs/workbench/contrib/resources/browser/resourceServiceWorker.ts b/src/vs/workbench/contrib/resources/browser/resourceServiceWorker.ts new file mode 100644 index 00000000000..d311f8d8676 --- /dev/null +++ b/src/vs/workbench/contrib/resources/browser/resourceServiceWorker.ts @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + + +export function handleFetchEvent(event) { + + console.log('FETCH', event); +} + diff --git a/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerClient.ts b/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerClient.ts new file mode 100644 index 00000000000..b4222bf304d --- /dev/null +++ b/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerClient.ts @@ -0,0 +1,29 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IFileService } from 'vs/platform/files/common/files'; + +export class ResourceServiceWorkerService { + + constructor( + @IFileService private readonly _fileService: IFileService, + ) { + console.log(this._fileService); + } +} + +// const url = require.toUrl('./resourceServiceWorkerMain.js'); +const url = './resourceServiceWorkerMain.js'; + +navigator.serviceWorker.register( + url, + // { scope: './out/vs/workbench/contrib/resources/browser/' } +).then(value => { + console.log(value); + console.log(navigator.serviceWorker.controller); +}).catch(err => { + console.error(err); +}); + diff --git a/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts b/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts new file mode 100644 index 00000000000..997a74fbfc5 --- /dev/null +++ b/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts @@ -0,0 +1,48 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +(function () { + + type Handler = { + handleFetchEvent(event: Event): void; + }; + let handler: Handler | undefined; + + self.addEventListener('fetch', event => { + console.log('FETCH', event); + if (handler) { + handler.handleFetchEvent(event); + } else { + //@ts-ignore + event.respondWith(fetch(event.request)); + } + }); + self.addEventListener('install', event => { + + let loadPromise = new Promise((resolve, reject) => { + + // load loader + const monacoBaseUrl = '../../../../../'; + importScripts(monacoBaseUrl + 'vs/loader.js'); + require.config({ + baseUrl: monacoBaseUrl, + catchError: true + }); + + require(['vs/workbench/contrib/resources/browser/resourceServiceWorker'], module => { + handler = module; + resolve(); + }, reject); + }); + + //@ts-ignore + event.waitUntil(Promise.all([loadPromise, self.skipWaiting()])); + }); + + self.addEventListener('activate', event => { + //@ts-ignore + event.waitUntil(self.clients.claim()); // Become available to all pages + }); +})(); diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index c28adc0ad98..bb96b82c27c 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -28,6 +28,11 @@ import 'vs/workbench/browser/parts/quickinput/quickInputActions'; //#endregion +//#region --- Remote Resource loading + +import 'vs/workbench/contrib/resources/browser/resourceServiceWorkerClient'; + +//#endregion //#region --- API Extension Points From c104b5484304e45b83548138cd2263c37c1ce15d Mon Sep 17 00:00:00 2001 From: chrisdias Date: Mon, 1 Jul 2019 18:40:56 +0200 Subject: [PATCH 0839/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9c44480cc48..1eeaf09d94f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "832c287d6e6ccfd5e0ef975fd276a8c0ff38054f", + "distro": "2b36463d246567c8e51d136b5868513a8c866886", "author": { "name": "Microsoft Corporation" }, From c61bf317af8deb86942bb26d13d8e45e42c33031 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Mon, 1 Jul 2019 10:40:28 -0700 Subject: [PATCH 0840/1449] Space in command palette should match - Fix #74523 --- src/vs/base/common/filters.ts | 13 ++++++++----- src/vs/base/test/common/filters.test.ts | 21 +++++++++++++-------- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/vs/base/common/filters.ts b/src/vs/base/common/filters.ts index abafd683093..34d8bfdbb39 100644 --- a/src/vs/base/common/filters.ts +++ b/src/vs/base/common/filters.ts @@ -125,7 +125,11 @@ const wordSeparators = new Set(); .forEach(s => wordSeparators.add(s.charCodeAt(0))); function isWordSeparator(code: number): boolean { - return wordSeparators.has(code); + return isWhitespace(code) || wordSeparators.has(code); +} + +function charactersMatch(codeA: number, codeB: number): boolean { + return (codeA === codeB) || (isWordSeparator(codeA) && isWordSeparator(codeB)); } function isAlphanumeric(code: number): boolean { @@ -298,7 +302,7 @@ function _matchesWords(word: string, target: string, i: number, j: number, conti return []; } else if (j === target.length) { return null; - } else if (word[i] !== target[j]) { + } else if (!charactersMatch(word.charCodeAt(i), target.charCodeAt(j))) { return null; } else { let result: IMatch[] | null = null; @@ -316,9 +320,8 @@ function _matchesWords(word: string, target: string, i: number, j: number, conti function nextWord(word: string, start: number): number { for (let i = start; i < word.length; i++) { - const c = word.charCodeAt(i); - if (isWhitespace(c) || (i > 0 && isWhitespace(word.charCodeAt(i - 1))) || - isWordSeparator(c) || (i > 0 && isWordSeparator(word.charCodeAt(i - 1)))) { + if (isWordSeparator(word.charCodeAt(i)) || + (i > 0 && isWordSeparator(word.charCodeAt(i - 1)))) { return i; } } diff --git a/src/vs/base/test/common/filters.test.ts b/src/vs/base/test/common/filters.test.ts index c4d582eeda0..b93e58cfc0a 100644 --- a/src/vs/base/test/common/filters.test.ts +++ b/src/vs/base/test/common/filters.test.ts @@ -13,8 +13,8 @@ function filterOk(filter: IFilter, word: string, wordToMatchAgainst: string, hig } } -function filterNotOk(filter: IFilter, word: string, suggestion: string) { - assert(!filter(word, suggestion)); +function filterNotOk(filter: IFilter, word: string, wordToMatchAgainst: string) { + assert(!filter(word, wordToMatchAgainst), `${word} matched ${wordToMatchAgainst}`); } suite('Filters', () => { @@ -185,23 +185,23 @@ suite('Filters', () => { assert(matchesWords('Debug Console', 'Open: Debug Console')); filterOk(matchesWords, 'gp', 'Git: Pull', [{ start: 0, end: 1 }, { start: 5, end: 6 }]); - filterOk(matchesWords, 'g p', 'Git: Pull', [{ start: 0, end: 1 }, { start: 4, end: 6 }]); + filterOk(matchesWords, 'g p', 'Git: Pull', [{ start: 0, end: 1 }, { start: 3, end: 4 }, { start: 5, end: 6 }]); filterOk(matchesWords, 'gipu', 'Git: Pull', [{ start: 0, end: 2 }, { start: 5, end: 7 }]); filterOk(matchesWords, 'gp', 'Category: Git: Pull', [{ start: 10, end: 11 }, { start: 15, end: 16 }]); - filterOk(matchesWords, 'g p', 'Category: Git: Pull', [{ start: 10, end: 11 }, { start: 14, end: 16 }]); + filterOk(matchesWords, 'g p', 'Category: Git: Pull', [{ start: 10, end: 11 }, { start: 13, end: 14 }, { start: 15, end: 16 }]); filterOk(matchesWords, 'gipu', 'Category: Git: Pull', [{ start: 10, end: 12 }, { start: 15, end: 17 }]); filterNotOk(matchesWords, 'it', 'Git: Pull'); filterNotOk(matchesWords, 'll', 'Git: Pull'); filterOk(matchesWords, 'git: プル', 'git: プル', [{ start: 0, end: 7 }]); - filterOk(matchesWords, 'git プル', 'git: プル', [{ start: 0, end: 3 }, { start: 4, end: 7 }]); + filterOk(matchesWords, 'git プル', 'git: プル', [{ start: 0, end: 4 }, { start: 5, end: 7 }]); filterOk(matchesWords, 'öäk', 'Öhm: Älles Klar', [{ start: 0, end: 1 }, { start: 5, end: 6 }, { start: 11, end: 12 }]); - assert.ok(matchesWords('gipu', 'Category: Git: Pull', true) === null); - assert.deepEqual(matchesWords('pu', 'Category: Git: Pull', true), [{ start: 15, end: 17 }]); + // assert.ok(matchesWords('gipu', 'Category: Git: Pull', true) === null); + // assert.deepEqual(matchesWords('pu', 'Category: Git: Pull', true), [{ start: 15, end: 17 }]); filterOk(matchesWords, 'bar', 'foo-bar'); filterOk(matchesWords, 'bar test', 'foo-bar test'); @@ -212,7 +212,12 @@ suite('Filters', () => { filterNotOk(matchesWords, 'bar est', 'foo-bar test'); filterNotOk(matchesWords, 'fo ar', 'foo-bar test'); filterNotOk(matchesWords, 'for', 'foo-bar test'); - filterNotOk(matchesWords, 'foo bar', 'foo-bar'); + + filterOk(matchesWords, 'foo bar', 'foo-bar'); + filterOk(matchesWords, 'foo bar', '123 foo-bar 456'); + filterOk(matchesWords, 'foo+bar', 'foo-bar'); + filterOk(matchesWords, 'foo-bar', 'foo bar'); + filterOk(matchesWords, 'foo:bar', 'foo:bar'); }); function assertMatches(pattern: string, word: string, decoratedWord: string | undefined, filter: FuzzyScorer, opts: { patternPos?: number, wordPos?: number, firstMatchCanBeWeak?: boolean } = {}) { From 67a734137f464a3169916cd7f543b74bd1f3cc5e Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 1 Jul 2019 20:36:03 +0200 Subject: [PATCH 0841/1449] compute path using substring as they are always absolute --- .../userData/common/fileUserDataProvider.ts | 25 +++++++++++-------- .../common/userDataFileSystemProvider.ts | 10 +++++--- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/vs/workbench/services/userData/common/fileUserDataProvider.ts b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts index 3be33dbd042..b842b0f7165 100644 --- a/src/vs/workbench/services/userData/common/fileUserDataProvider.ts +++ b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts @@ -10,6 +10,7 @@ import { IFileService, FileChangesEvent } from 'vs/platform/files/common/files'; import { URI } from 'vs/base/common/uri'; import * as resources from 'vs/base/common/resources'; import { VSBuffer } from 'vs/base/common/buffer'; +import { startsWith } from 'vs/base/common/strings'; export class FileUserDataProvider extends Disposable implements IUserDataProvider { @@ -28,17 +29,17 @@ export class FileUserDataProvider extends Disposable implements IUserDataProvide } private handleFileChanges(event: FileChangesEvent): void { - const changedKeys: string[] = []; + const changedPaths: string[] = []; for (const change of event.changes) { if (change.resource.scheme === this.userDataHome.scheme) { - const key = this.toKey(change.resource); - if (key) { - changedKeys.push(key); + const path = this.toPath(change.resource); + if (path) { + changedPaths.push(path); } } } - if (changedKeys.length) { - this._onDidChangeFile.fire(changedKeys); + if (changedPaths.length) { + this._onDidChangeFile.fire(changedPaths); } } @@ -62,18 +63,20 @@ export class FileUserDataProvider extends Disposable implements IUserDataProvide async listFiles(path: string): Promise { const result = await this.fileService.resolve(this.toResource(path)); - return result.children ? result.children.map(c => this.toKey(c.resource)!) : []; + return result.children ? result.children.map(c => this.toPath(c.resource)!) : []; } deleteFile(path: string): Promise { return this.fileService.del(this.toResource(path)); } - private toResource(key: string): URI { - return resources.joinPath(this.userDataHome, ...key.split('/')); + private toResource(path: string): URI { + return resources.joinPath(this.userDataHome, path); } - private toKey(resource: URI): string | undefined { - return resources.relativePath(this.userDataHome, resource); + private toPath(resource: URI): string | undefined { + const resourcePath = resource.toString(); + const userDataHomePath = this.userDataHome.toString(); + return startsWith(resourcePath, userDataHomePath) ? resourcePath.substr(userDataHomePath.length + 1) : undefined; } } \ No newline at end of file diff --git a/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts b/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts index d6f10cbf477..ad1be9760c8 100644 --- a/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts +++ b/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts @@ -8,8 +8,8 @@ import { FileSystemProviderCapabilities, FileWriteOptions, IStat, FileType, File import { IUserDataProvider } from 'vs/workbench/services/userData/common/userData'; import { URI } from 'vs/base/common/uri'; import { Event, Emitter } from 'vs/base/common/event'; -import * as resources from 'vs/base/common/resources'; import { TernarySearchTree } from 'vs/base/common/map'; +import { startsWith } from 'vs/base/common/strings'; export class UserDataFileSystemProvider extends Disposable implements IFileSystemProviderWithFileReadWriteCapability { @@ -85,7 +85,9 @@ export class UserDataFileSystemProvider extends Disposable implements IFileSyste } private toPath(resource: URI): string | undefined { - return resources.relativePath(this.userDataHome, resource); + const resourcePath = resource.toString(); + const userDataHomePath = this.userDataHome.toString(); + return startsWith(resourcePath, userDataHomePath) ? resourcePath.substr(userDataHomePath.length + 1) : undefined; } } @@ -105,8 +107,8 @@ class UserDataChangesEvent { return this._pathsTree; } - contains(keyOrSegment: string): boolean { - return this.pathsTree.findSubstr(keyOrSegment) !== undefined; + contains(pathOrSegment: string): boolean { + return this.pathsTree.findSubstr(pathOrSegment) !== undefined; } } \ No newline at end of file From 2205cb69edc0e599f669a5b58ac1ba9fcd06f659 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 1 Jul 2019 12:27:15 -0700 Subject: [PATCH 0842/1449] Start of terminal virtual processes --- src/vs/vscode.proposed.d.ts | 40 +++++++++++++++ .../api/browser/mainThreadTerminalService.ts | 2 +- .../workbench/api/common/extHost.protocol.ts | 2 +- .../api/node/extHostTerminalService.ts | 15 ++++-- .../browser/terminalProcessManager.ts | 51 ++++++++++--------- .../contrib/terminal/common/terminal.ts | 3 ++ 6 files changed, 85 insertions(+), 28 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 9fec616de5a..696b8648bff 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1256,6 +1256,46 @@ declare module 'vscode' { //#endregion + //#region Terminal virtual process + + // export function createTerminal(options: TerminalOptions | TerminalVirtualProcessOptions): Terminal; + + export interface TerminalVirtualProcessOptions { + // For a name property for TerminalVirtualProcessOptions. + // Note that this is mandatory here as there's no process/shell to grab the title from + name: string; + + virtualProcess: TerminalVirtualProcess; + + // Allows Windows or non-Windows local link handler to be used based on Live Share host OS + // os?: OperatingSystem; + + // Allows ~ to be resolved in Live Share + // userHome?: string; + } + + interface TerminalVirtualProcess { + // The ext should fire this when they want to write to the terminal + write: Event; + + // Lets the extension override the dimensions of the terminal + overrideDimensions?: Event; + + // Lets the extension exit the process with an exit code, this was not in the TerminalRenderer + // API but it makes sense to include this as it's the main thing missing for a virtual process + // to truly act like a process + exit?: Event; + + // This will be called when the user types + onDidAcceptInput?(text: string): void; + + // This is called fire when window.onDidChangeTerminalDimensions fires as CustomExecution need + // access to the "maximum" dimensions and don't want access to Terminal + onDidChangeDimensions?(dimensions: TerminalDimensions): void; + } + + //#endregion + //#region Joh -> exclusive document filters export interface DocumentFilter { diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index b975524b5f6..5659af48a05 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -76,7 +76,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape // when the extension host process goes down ? } - public $createTerminal(name?: string, shellPath?: string, shellArgs?: string[] | string, cwd?: string | UriComponents, env?: { [key: string]: string }, waitOnExit?: boolean, strictEnv?: boolean, hideFromUser?: boolean): Promise<{ id: number, name: string }> { + public $createTerminal(name?: string, shellPath?: string, shellArgs?: string[] | string, cwd?: string | UriComponents, env?: { [key: string]: string }, waitOnExit?: boolean, strictEnv?: boolean, hideFromUser?: boolean, isVirtualProcess?: boolean): Promise<{ id: number, name: string }> { const shellLaunchConfig: IShellLaunchConfig = { name, executable: shellPath, diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 6b747ffac41..9d872402909 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -390,7 +390,7 @@ export interface MainThreadProgressShape extends IDisposable { } export interface MainThreadTerminalServiceShape extends IDisposable { - $createTerminal(name?: string, shellPath?: string, shellArgs?: string[] | string, cwd?: string | UriComponents, env?: { [key: string]: string | null }, waitOnExit?: boolean, strictEnv?: boolean, hideFromUser?: boolean): Promise<{ id: number, name: string }>; + $createTerminal(name?: string, shellPath?: string, shellArgs?: string[] | string, cwd?: string | UriComponents, env?: { [key: string]: string | null }, waitOnExit?: boolean, strictEnv?: boolean, hideFromUser?: boolean, isVirtualProcess?: boolean): Promise<{ id: number, name: string }>; $createTerminalRenderer(name: string): Promise; $dispose(terminalId: number): void; $hide(terminalId: number): void; diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 38fa69dc551..3ca4f816f99 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -116,14 +116,19 @@ export class ExtHostTerminal extends BaseExtHostTerminal implements vscode.Termi env?: { [key: string]: string | null }, waitOnExit?: boolean, strictEnv?: boolean, - hideFromUser?: boolean + hideFromUser?: boolean, + isVirtualProcess?: boolean ): void { - this._proxy.$createTerminal(this._name, shellPath, shellArgs, cwd, env, waitOnExit, strictEnv, hideFromUser).then(terminal => { + this._proxy.$createTerminal(this._name, shellPath, shellArgs, cwd, env, waitOnExit, strictEnv, hideFromUser, isVirtualProcess).then(terminal => { this._name = terminal.name; this._runQueuedRequests(terminal.id); }); } + public createVirtualProcess(): void { + this.create(undefined, undefined, undefined, undefined, undefined, undefined, undefined, true); + } + public get name(): string { return this._name || ''; } @@ -313,7 +318,11 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { public createTerminalFromOptions(options: vscode.TerminalOptions): vscode.Terminal { const terminal = new ExtHostTerminal(this._proxy, options.name); - terminal.create(options.shellPath, options.shellArgs, options.cwd, options.env, /*options.waitOnExit*/ undefined, options.strictEnv, options.hideFromUser); + if ((options).isVirtualProcess) { + terminal.createVirtualProcess(); + } else { + terminal.create(options.shellPath, options.shellArgs, options.cwd, options.env, /*options.waitOnExit*/ undefined, options.strictEnv, options.hideFromUser); + } this._terminals.push(terminal); return terminal; } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts index 2f3f3600781..1c00b861138 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts @@ -103,32 +103,37 @@ export class TerminalProcessManager implements ITerminalProcessManager { rows: number, isScreenReaderModeEnabled: boolean ): Promise { - const forceExtHostProcess = (this._configHelper.config as any).extHostProcess; - if (shellLaunchConfig.cwd && typeof shellLaunchConfig.cwd === 'object') { - this.remoteAuthority = getRemoteAuthority(shellLaunchConfig.cwd); + if (shellLaunchConfig.isVirtualProcess) { + // TODO: Hook up proxy + this._process = this._instantiationService.createInstance(TerminalProcessExtHostProxy, this._terminalId, shellLaunchConfig, undefined, cols, rows, this._configHelper); } else { - this.remoteAuthority = this._environmentService.configuration.remoteAuthority; - } - const hasRemoteAuthority = !!this.remoteAuthority; - let launchRemotely = hasRemoteAuthority || forceExtHostProcess; - - this.userHome = this._environmentService.userHome; - this.os = platform.OS; - if (launchRemotely) { - if (hasRemoteAuthority) { - this._remoteAgentService.getEnvironment().then(env => { - if (!env) { - return; - } - this.userHome = env.userHome.path; - this.os = env.os; - }); + const forceExtHostProcess = (this._configHelper.config as any).extHostProcess; + if (shellLaunchConfig.cwd && typeof shellLaunchConfig.cwd === 'object') { + this.remoteAuthority = getRemoteAuthority(shellLaunchConfig.cwd); + } else { + this.remoteAuthority = this._environmentService.configuration.remoteAuthority; } + const hasRemoteAuthority = !!this.remoteAuthority; + let launchRemotely = hasRemoteAuthority || forceExtHostProcess; - const activeWorkspaceRootUri = this._historyService.getLastActiveWorkspaceRoot(); - this._process = this._instantiationService.createInstance(TerminalProcessExtHostProxy, this._terminalId, shellLaunchConfig, activeWorkspaceRootUri, cols, rows, this._configHelper); - } else { - this._process = await this._launchProcess(shellLaunchConfig, cols, rows, isScreenReaderModeEnabled); + this.userHome = this._environmentService.userHome; + this.os = platform.OS; + if (launchRemotely) { + if (hasRemoteAuthority) { + this._remoteAgentService.getEnvironment().then(env => { + if (!env) { + return; + } + this.userHome = env.userHome.path; + this.os = env.os; + }); + } + + const activeWorkspaceRootUri = this._historyService.getLastActiveWorkspaceRoot(); + this._process = this._instantiationService.createInstance(TerminalProcessExtHostProxy, this._terminalId, shellLaunchConfig, activeWorkspaceRootUri, cols, rows, this._configHelper); + } else { + this._process = await this._launchProcess(shellLaunchConfig, cols, rows, isScreenReaderModeEnabled); + } } this.processState = ProcessState.LAUNCHING; diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index 1880511c68b..91fd6e142eb 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -186,9 +186,12 @@ export interface IShellLaunchConfig { /** * When true the terminal will be created with no process. This is primarily used to give * extensions full control over the terminal. + * @deprecated use `isVirtualProcess` */ isRendererOnly?: boolean; + isVirtualProcess?: boolean; + /** * Whether the terminal process environment should be exactly as provided in * `TerminalOptions.env`. When this is false (default), the environment will be based on the From d7c8e71538aff60fb8e12a9f247da9ff97171e49 Mon Sep 17 00:00:00 2001 From: Haneef Mohammed Date: Mon, 1 Jul 2019 13:04:22 -0700 Subject: [PATCH 0843/1449] Don't lose state of tree when going from a stopped->running->stopped state. --- .../contrib/debug/browser/variablesView.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/debug/browser/variablesView.ts b/src/vs/workbench/contrib/debug/browser/variablesView.ts index c40b288dec9..ee244fab36d 100644 --- a/src/vs/workbench/contrib/debug/browser/variablesView.ts +++ b/src/vs/workbench/contrib/debug/browser/variablesView.ts @@ -39,6 +39,7 @@ export class VariablesView extends ViewletPanel { private onFocusStackFrameScheduler: RunOnceScheduler; private needsRefresh: boolean; private tree: WorkbenchAsyncDataTree; + private treeContainer: HTMLElement; constructor( options: IViewletViewOptions, @@ -53,6 +54,15 @@ export class VariablesView extends ViewletPanel { // Use scheduler to prevent unnecessary flashing this.onFocusStackFrameScheduler = new RunOnceScheduler(() => { + if (!this.debugService.getViewModel().focusedStackFrame) { + // This is called even when there is no stackFrame (transition from stopped to running) + // We don't want to clear/udate the tree just yet. We will be called again when we have an actual + // stacktrace available. So, simply hide the tree. Thill help preserve the tree state better and + // will even remember state across a restart. + this.treeContainer.hidden = true; + return; + } + this.treeContainer.hidden = false; this.needsRefresh = false; this.tree.updateChildren().then(() => { const stackFrame = this.debugService.getViewModel().focusedStackFrame; @@ -70,9 +80,9 @@ export class VariablesView extends ViewletPanel { renderBody(container: HTMLElement): void { dom.addClass(container, 'debug-variables'); - const treeContainer = renderViewTree(container); + this.treeContainer = renderViewTree(container); - this.tree = this.instantiationService.createInstance(WorkbenchAsyncDataTree, treeContainer, new VariablesDelegate(), + this.tree = this.instantiationService.createInstance(WorkbenchAsyncDataTree, this.treeContainer, new VariablesDelegate(), [this.instantiationService.createInstance(VariablesRenderer), new ScopesRenderer()], new VariablesDataSource(), { ariaLabel: nls.localize('variablesAriaTreeLabel', "Debug Variables"), From 22d217ce6e18bdb9e999b92b6726ebb6fd409184 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 1 Jul 2019 22:07:26 +0200 Subject: [PATCH 0844/1449] build --- build/gulpfile.reh.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/build/gulpfile.reh.js b/build/gulpfile.reh.js index 42b143dfd35..02f680af01c 100644 --- a/build/gulpfile.reh.js +++ b/build/gulpfile.reh.js @@ -53,13 +53,11 @@ function getNodeVersion() { const nodeVersion = getNodeVersion(); BUILD_TARGETS.forEach(({ platform, arch }) => { - const target = arch ? `${platform}-${arch}` : platform; - - gulp.task(task.define(`node-${target}`, () => { - if (platform === 'darwin') { - arch = 'x64'; - } + if (platform === 'darwin') { + arch = 'x64'; + } + gulp.task(task.define(`node-${platform}-${arch}`, () => { const nodePath = path.join('.build', 'node', `v${nodeVersion}`, `${platform}-${arch}`); if (!fs.existsSync(nodePath)) { From 26d0bbd5d98c1fcbbdfce67e2e59d90308e8ef04 Mon Sep 17 00:00:00 2001 From: Logan Ramos Date: Mon, 1 Jul 2019 14:37:43 -0700 Subject: [PATCH 0845/1449] Initial Strict Typing Support for Telemetry Events (#75785) * Added command line information to display details about collected telemetry * Telemetry tooling exploration * Changing telemetry calls to be strongly typed * Fixed an event definition * Removed telemetry command * More removing of telemetry command * Fixed compilation errors * Forgotten property * Updated typings so diff was aligned --- src/vs/base/common/actions.ts | 10 +++ .../issue/issueReporterMain.ts | 49 +++++++------- src/vs/code/electron-main/windows.ts | 15 ++--- .../contextview/browser/contextMenuHandler.ts | 10 +-- .../node/extensionGalleryService.ts | 44 ++++++------- .../common/abstractKeybindingService.ts | 9 +-- .../platform/menubar/electron-main/menubar.ts | 9 +-- .../telemetry/common/errorTelemetry.ts | 33 ++++------ .../platform/telemetry/common/gdprTypings.ts | 2 +- .../telemetry/common/telemetryService.ts | 13 ++-- .../telemetry/common/telemetryUtils.ts | 45 +++++++------ .../api/common/extHostExtensionActivator.ts | 15 ++--- .../api/node/extHostExtensionService.ts | 65 ++++++++++++------- .../workbench/browser/parts/compositePart.ts | 10 +-- .../browser/parts/editor/titleControl.ts | 10 +-- .../notifications/notificationsActions.ts | 11 +--- .../browser/parts/statusbar/statusbarPart.ts | 10 +-- .../contrib/debug/browser/debugToolBar.ts | 10 +-- .../contrib/feedback/browser/feedback.ts | 10 +-- .../files/browser/views/explorerView.ts | 10 +-- .../files/browser/views/openEditorsView.ts | 10 +-- .../quickopen/browser/commandsHandler.ts | 10 +-- .../welcome/page/browser/welcomePage.ts | 10 +-- .../electron-browser/contextmenuService.ts | 10 +-- .../themes/browser/workbenchThemeService.ts | 25 ++++--- 25 files changed, 199 insertions(+), 256 deletions(-) diff --git a/src/vs/base/common/actions.ts b/src/vs/base/common/actions.ts index 66e93280309..48a444d7f70 100644 --- a/src/vs/base/common/actions.ts +++ b/src/vs/base/common/actions.ts @@ -12,6 +12,16 @@ export interface ITelemetryData { [key: string]: any; } +export type WBActionExecutedClassification = { + id: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + from: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; +}; + +export type WBActionExecutedEvent = { + id: string; + from: string; +}; + export interface IAction extends IDisposable { id: string; label: string; diff --git a/src/vs/code/electron-browser/issue/issueReporterMain.ts b/src/vs/code/electron-browser/issue/issueReporterMain.ts index fb2369cb5c1..2f9b372c20e 100644 --- a/src/vs/code/electron-browser/issue/issueReporterMain.ts +++ b/src/vs/code/electron-browser/issue/issueReporterMain.ts @@ -676,12 +676,14 @@ export class IssueReporter extends Disposable { private logSearchError(error: Error) { this.logService.warn('issueReporter#search ', error.message); - /* __GDPR__ - "issueReporterSearchError" : { - "message" : { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth" } - } - */ - this.telemetryService.publicLog('issueReporterSearchError', { message: error.message }); + type IssueReporterSearchErrorClassification = { + message: { classification: 'CallstackOrException', purpose: 'PerformanceAndHealth' } + }; + + type IssueReporterSearchError = { + message: string; + }; + this.telemetryService.publicLog2('issueReporterSearchError', { message: error.message }); } private setUpTypes(): void { @@ -873,13 +875,15 @@ export class IssueReporter extends Disposable { return false; } - /* __GDPR__ - "issueReporterSubmit" : { - "issueType" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "numSimilarIssuesDisplayed" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true } - } - */ - this.telemetryService.publicLog('issueReporterSubmit', { issueType: this.issueReporterModel.getData().issueType, numSimilarIssuesDisplayed: this.numberOfSearchResultsDisplayed }); + type IssueReporterSubmitClassification = { + issueType: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; + numSimilarIssuesDisplayed: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; + }; + type IssueReporterSubmitEvent = { + issueType: any; + numSimilarIssuesDisplayed: number; + }; + this.telemetryService.publicLog2('issueReporterSubmit', { issueType: this.issueReporterModel.getData().issueType, numSimilarIssuesDisplayed: this.numberOfSearchResultsDisplayed }); this.hasBeenSubmitted = true; const baseUrl = this.getIssueUrlWithTitle((this.getElementById('issue-title')).value); @@ -1106,11 +1110,7 @@ export class IssueReporter extends Disposable { // Exclude right click if (event.which < 3) { shell.openExternal((event.target).href); - - /* __GDPR__ - "issueReporterViewSimilarIssue" : { } - */ - this.telemetryService.publicLog('issueReporterViewSimilarIssue'); + this.telemetryService.publicLog2('issueReporterViewSimilarIssue'); } } @@ -1121,12 +1121,13 @@ export class IssueReporter extends Disposable { } else { const error = new Error(`${elementId} not found.`); this.logService.error(error); - /* __GDPR__ - "issueReporterGetElementError" : { - "message" : { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth" } - } - */ - this.telemetryService.publicLog('issueReporterGetElementError', { message: error.message }); + type IssueReporterGetElementErrorClassification = { + message: { classification: 'CallstackOrException', purpose: 'PerformanceAndHealth' }; + }; + type IssueReporterGetElementErrorEvent = { + message: string; + }; + this.telemetryService.publicLog2('issueReporterGetElementError', { message: error.message }); return undefined; } diff --git a/src/vs/code/electron-main/windows.ts b/src/vs/code/electron-main/windows.ts index 1087d110e84..377ca33281c 100644 --- a/src/vs/code/electron-main/windows.ts +++ b/src/vs/code/electron-main/windows.ts @@ -1709,14 +1709,13 @@ export class WindowsManager extends Disposable implements IWindowsMainService { private onWindowError(window: ICodeWindow, error: WindowError): void { this.logService.error(error === WindowError.CRASHED ? '[VS Code]: render process crashed!' : '[VS Code]: detected unresponsive'); - - /* __GDPR__ - "windowerror" : { - "type" : { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "isMeasurement": true } - } - */ - this.telemetryService.publicLog('windowerror', { type: error }); - + type WindowErrorClassification = { + type: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; + }; + type WindowErrorEvent = { + type: WindowError; + }; + this.telemetryService.publicLog2('windowerror', { type: error }); // Unresponsive if (error === WindowError.UNRESPONSIVE) { if (window.isExtensionDevelopmentHost || window.isExtensionTestHost || (window.win && window.win.webContents && window.win.webContents.isDevToolsOpened())) { diff --git a/src/vs/platform/contextview/browser/contextMenuHandler.ts b/src/vs/platform/contextview/browser/contextMenuHandler.ts index 6b67d1cb58b..e5e32109271 100644 --- a/src/vs/platform/contextview/browser/contextMenuHandler.ts +++ b/src/vs/platform/contextview/browser/contextMenuHandler.ts @@ -6,7 +6,7 @@ import 'vs/css!./contextMenuHandler'; import { IDisposable, combinedDisposable } from 'vs/base/common/lifecycle'; -import { ActionRunner, IRunEvent } from 'vs/base/common/actions'; +import { ActionRunner, IRunEvent, WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; import { Menu } from 'vs/base/browser/ui/menu/menu'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -132,13 +132,7 @@ export class ContextMenuHandler { private onActionRun(e: IRunEvent): void { if (this.telemetryService) { - /* __GDPR__ - "workbenchActionExecuted" : { - "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('workbenchActionExecuted', { id: e.action.id, from: 'contextMenu' }); + this.telemetryService.publicLog2('workbenchActionExecuted', { id: e.action.id, from: 'contextMenu' }); } this.contextViewService.hideContextView(false); diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts index c51ec5cdf63..ad13418d430 100644 --- a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts @@ -647,21 +647,26 @@ export class ExtensionGalleryService implements IExtensionGalleryService { } const message = getErrorMessage(err); - /* __GDPR__ - "galleryService:requestError" : { - "url" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "cdn": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "message": { "classification": "CallstackOrException", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('galleryService:requestError', { url, cdn: true, message }); - /* __GDPR__ - "galleryService:cdnFallback" : { - "url" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "message": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('galleryService:cdnFallback', { url, message }); + type GalleryServiceREClassification = { + url: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + cdn: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; + message: { classification: 'CallstackOrException', purpose: 'FeatureInsight' }; + }; + type GalleryServiceREServiceEvent = { + url: string; + cdn: boolean; + message: string; + }; + this.telemetryService.publicLog2('galleryService:requestError', { url, cdn: true, message }); + type GalleryServiceCDNFBClassification = { + url: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + message: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + }; + type GalleryServiceCDNFBEvent = { + url: string; + message: string; + }; + this.telemetryService.publicLog2('galleryService:cdnFallback', { url, message }); const fallbackOptions = assign({}, options, { url: fallbackUrl }); return this.requestService.request(fallbackOptions, token).then(undefined, err => { @@ -670,14 +675,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { } const message = getErrorMessage(err); - /* __GDPR__ - "galleryService:requestError" : { - "url" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "cdn": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "message": { "classification": "CallstackOrException", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('galleryService:requestError', { url: fallbackUrl, cdn: false, message }); + this.telemetryService.publicLog2('galleryService:requestError', { url: fallbackUrl, cdn: false, message }); return Promise.reject(err); }); }); diff --git a/src/vs/platform/keybinding/common/abstractKeybindingService.ts b/src/vs/platform/keybinding/common/abstractKeybindingService.ts index 2273af1f010..ddbc309ec5a 100644 --- a/src/vs/platform/keybinding/common/abstractKeybindingService.ts +++ b/src/vs/platform/keybinding/common/abstractKeybindingService.ts @@ -16,6 +16,7 @@ import { IResolveResult, KeybindingResolver } from 'vs/platform/keybinding/commo import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKeybindingItem'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; interface CurrentChord { keypress: string; @@ -195,13 +196,7 @@ export abstract class AbstractKeybindingService extends Disposable implements IK } else { this._commandService.executeCommand(resolveResult.commandId, resolveResult.commandArgs).then(undefined, err => this._notificationService.warn(err)); } - /* __GDPR__ - "workbenchActionExecuted" : { - "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this._telemetryService.publicLog('workbenchActionExecuted', { id: resolveResult.commandId, from: 'keybinding' }); + this._telemetryService.publicLog2('workbenchActionExecuted', { id: resolveResult.commandId, from: 'keybinding' }); } return shouldPreventDefault; diff --git a/src/vs/platform/menubar/electron-main/menubar.ts b/src/vs/platform/menubar/electron-main/menubar.ts index 494cfa000d5..db54a6e81de 100644 --- a/src/vs/platform/menubar/electron-main/menubar.ts +++ b/src/vs/platform/menubar/electron-main/menubar.ts @@ -21,6 +21,7 @@ import { IMenubarData, IMenubarKeybinding, MenubarMenuItem, isMenubarMenuItemSep import { URI } from 'vs/base/common/uri'; import { IStateService } from 'vs/platform/state/common/state'; import { ILifecycleService } from 'vs/platform/lifecycle/electron-main/lifecycleMain'; +import { WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; const telemetryFrom = 'menu'; @@ -783,13 +784,7 @@ export class Menubar { } private reportMenuActionTelemetry(id: string): void { - /* __GDPR__ - "workbenchActionExecuted" : { - "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('workbenchActionExecuted', { id, from: telemetryFrom }); + this.telemetryService.publicLog2('workbenchActionExecuted', { id, from: telemetryFrom }); } private mnemonicLabel(label: string): string { diff --git a/src/vs/platform/telemetry/common/errorTelemetry.ts b/src/vs/platform/telemetry/common/errorTelemetry.ts index 37be63bfc31..4145ed158c9 100644 --- a/src/vs/platform/telemetry/common/errorTelemetry.ts +++ b/src/vs/platform/telemetry/common/errorTelemetry.ts @@ -9,21 +9,16 @@ import { dispose, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { safeStringify } from 'vs/base/common/objects'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -/* __GDPR__FRAGMENT__ - "ErrorEvent" : { - "stack": { "classification": "CustomerContent", "purpose": "PerformanceAndHealth" }, - "message" : { "classification": "CustomerContent", "purpose": "PerformanceAndHealth" }, - "filename" : { "classification": "CustomerContent", "purpose": "PerformanceAndHealth" }, - "callstack": { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth" }, - "msg" : { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth" }, - "file" : { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth" }, - "line": { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth", "isMeasurement": true }, - "column": { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth", "isMeasurement": true }, - "uncaught_error_name": { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth" }, - "uncaught_error_msg": { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth" }, - "count": { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth", "isMeasurement": true } - } - */ +type ErrorEventFragment = { + callstack: { classification: 'CallstackOrException', purpose: 'PerformanceAndHealth' }; + msg?: { classification: 'CallstackOrException', purpose: 'PerformanceAndHealth' }; + file?: { classification: 'CallstackOrException', purpose: 'PerformanceAndHealth' }; + line?: { classification: 'CallstackOrException', purpose: 'PerformanceAndHealth', isMeasurement: true }; + column?: { classification: 'CallstackOrException', purpose: 'PerformanceAndHealth', isMeasurement: true }; + uncaught_error_name?: { classification: 'CallstackOrException', purpose: 'PerformanceAndHealth' }; + uncaught_error_msg?: { classification: 'CallstackOrException', purpose: 'PerformanceAndHealth' }; + count?: { classification: 'CallstackOrException', purpose: 'PerformanceAndHealth', isMeasurement: true }; +}; export interface ErrorEvent { callstack: string; msg?: string; @@ -124,12 +119,8 @@ export default abstract class BaseErrorTelemetry { private _flushBuffer(): void { for (let error of this._buffer) { - /* __GDPR__ - "UnhandledError" : { - "${include}": [ "${ErrorEvent}" ] - } - */ - this._telemetryService.publicLog('UnhandledError', error, true); + type UnhandledErrorClassification = {} & ErrorEventFragment; + this._telemetryService.publicLog2('UnhandledError', error, true); } this._buffer.length = 0; } diff --git a/src/vs/platform/telemetry/common/gdprTypings.ts b/src/vs/platform/telemetry/common/gdprTypings.ts index 4fa946fb59f..a4e2dcf8baf 100644 --- a/src/vs/platform/telemetry/common/gdprTypings.ts +++ b/src/vs/platform/telemetry/common/gdprTypings.ts @@ -23,4 +23,4 @@ export type StrictPropertyCheckError = 'Type of classified event does not match export type StrictPropertyCheck = StrictPropertyChecker, StrictPropertyCheckError>; -export type GDPRClassification = { [_ in keyof T]: IPropertyData | IGDPRProperty | undefined }; \ No newline at end of file +export type GDPRClassification = { [_ in keyof T]: IPropertyData | IGDPRProperty | undefined }; diff --git a/src/vs/platform/telemetry/common/telemetryService.ts b/src/vs/platform/telemetry/common/telemetryService.ts index cab7686a859..8790401d7c7 100644 --- a/src/vs/platform/telemetry/common/telemetryService.ts +++ b/src/vs/platform/telemetry/common/telemetryService.ts @@ -57,12 +57,13 @@ export class TelemetryService implements ITelemetryService { if (this._configurationService) { this._updateUserOptIn(); this._configurationService.onDidChangeConfiguration(this._updateUserOptIn, this, this._disposables); - /* __GDPR__ - "optInStatus" : { - "optIn" : { "classification": "SystemMetaData", "purpose": "BusinessInsight", "isMeasurement": true } - } - */ - this.publicLog('optInStatus', { optIn: this._userOptIn }); + type OptInClass = { + optIn: { classification: 'SystemMetaData', purpose: 'BusinessInsight', isMeasurement: true }; + }; + type OptInEvent = { + optIn: boolean; + }; + this.publicLog2('optInStatus', { optIn: this._userOptIn }); this._commonProperties.then(values => { const isHashedId = /^[a-f0-9]+$/i.test(values['common.machineId']); diff --git a/src/vs/platform/telemetry/common/telemetryUtils.ts b/src/vs/platform/telemetry/common/telemetryUtils.ts index e2284474798..e05a710372b 100644 --- a/src/vs/platform/telemetry/common/telemetryUtils.ts +++ b/src/vs/platform/telemetry/common/telemetryUtils.ts @@ -195,23 +195,27 @@ const configurationValueWhitelist = [ export function configurationTelemetry(telemetryService: ITelemetryService, configurationService: IConfigurationService): IDisposable { return configurationService.onDidChangeConfiguration(event => { if (event.source !== ConfigurationTarget.DEFAULT) { - /* __GDPR__ - "updateConfiguration" : { - "configurationSource" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "configurationKeys": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - telemetryService.publicLog('updateConfiguration', { + type UpdateConfigClassification = { + configurationSource: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + configurationKeys: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + }; + type UpdateConfigEvent = { + configurationSource: string; + configurationKeys: string[]; + }; + telemetryService.publicLog2('updateConfiguration', { configurationSource: ConfigurationTargetToString(event.source), configurationKeys: flattenKeys(event.sourceConfig) }); - /* __GDPR__ - "updateConfigurationValues" : { - "configurationSource" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "configurationValues": { "classification": "CustomerContent", "purpose": "FeatureInsight" } - } - */ - telemetryService.publicLog('updateConfigurationValues', { + type UpdateConfigValClassification = { + configurationSource: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + configurationValues: { classification: 'CustomerContent', purpose: 'FeatureInsight' }; + }; + type UpdateConfigValEvent = { + configurationSource: string; + configurationValues: { [key: string]: any }[]; + }; + telemetryService.publicLog2('updateConfigurationValues', { configurationSource: ConfigurationTargetToString(event.source), configurationValues: flattenValues(event.sourceConfig, configurationValueWhitelist) }); @@ -222,12 +226,13 @@ export function configurationTelemetry(telemetryService: ITelemetryService, conf export function keybindingsTelemetry(telemetryService: ITelemetryService, keybindingService: IKeybindingService): IDisposable { return keybindingService.onDidUpdateKeybindings(event => { if (event.source === KeybindingSource.User && event.keybindings) { - /* __GDPR__ - "updateKeybindings" : { - "bindings": { "classification": "CustomerContent", "purpose": "FeatureInsight" } - } - */ - telemetryService.publicLog('updateKeybindings', { + type UpdateKBClassification = { + bindings: { classification: 'CustomerContent', purpose: 'FeatureInsight' }; + }; + type UpdateKBEvents = { + bindings: { key: string, command: string, when: string | undefined, args: boolean | undefined }[]; + }; + telemetryService.publicLog2('updateKeybindings', { bindings: event.keybindings.map(binding => ({ key: binding.key, command: binding.command, diff --git a/src/vs/workbench/api/common/extHostExtensionActivator.ts b/src/vs/workbench/api/common/extHostExtensionActivator.ts index 8ba9dbd8162..5a9f96f9230 100644 --- a/src/vs/workbench/api/common/extHostExtensionActivator.ts +++ b/src/vs/workbench/api/common/extHostExtensionActivator.ts @@ -44,14 +44,13 @@ export interface IExtensionAPI { // _extensionAPIBrand: any; } -/* __GDPR__FRAGMENT__ - "ExtensionActivationTimes" : { - "startup": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "isMeasurement": true }, - "codeLoadingTime" : { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "isMeasurement": true }, - "activateCallTime" : { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "isMeasurement": true }, - "activateResolvedTime" : { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "isMeasurement": true } - } -*/ +export type ExtensionActivationTimesFragment = { + startup?: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; + codeLoadingTime?: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; + activateCallTime?: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; + activateResolvedTime?: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; +}; + export class ExtensionActivationTimes { public static readonly NONE = new ExtensionActivationTimes(false, -1, -1, -1); diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts index c5360322431..f6bf6877dfd 100644 --- a/src/vs/workbench/api/node/extHostExtensionService.ts +++ b/src/vs/workbench/api/node/extHostExtensionService.ts @@ -15,7 +15,7 @@ import { createApiFactory, IExtensionApiFactory } from 'vs/workbench/api/node/ex import { NodeModuleRequireInterceptor, VSCodeNodeModuleFactory, KeytarNodeModuleFactory, OpenNodeModuleFactory } from 'vs/workbench/api/node/extHostRequireInterceptor'; import { ExtHostExtensionServiceShape, IEnvironment, IInitData, IMainContext, MainContext, MainThreadExtensionServiceShape, MainThreadTelemetryShape, MainThreadWorkspaceShape, IResolveAuthorityResult } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostConfiguration } from 'vs/workbench/api/common/extHostConfiguration'; -import { ActivatedExtension, EmptyExtension, ExtensionActivatedByAPI, ExtensionActivatedByEvent, ExtensionActivationReason, ExtensionActivationTimes, ExtensionActivationTimesBuilder, ExtensionsActivator, IExtensionAPI, IExtensionContext, IExtensionModule, HostExtension } from 'vs/workbench/api/common/extHostExtensionActivator'; +import { ActivatedExtension, EmptyExtension, ExtensionActivatedByAPI, ExtensionActivatedByEvent, ExtensionActivationReason, ExtensionActivationTimes, ExtensionActivationTimesBuilder, ExtensionsActivator, IExtensionAPI, IExtensionContext, IExtensionModule, HostExtension, ExtensionActivationTimesFragment } from 'vs/workbench/api/common/extHostExtensionActivator'; import { ExtHostLogService } from 'vs/workbench/api/common/extHostLogService'; import { ExtHostStorage } from 'vs/workbench/api/common/extHostStorage'; import { ExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; @@ -51,6 +51,16 @@ export interface IHostUtils { realpath(path: string): Promise; } +type TelemetryActivationEventFragment = { + id: { classification: 'PublicNonPersonalData', purpose: 'FeatureInsight' }; + name: { classification: 'PublicNonPersonalData', purpose: 'FeatureInsight' }; + extensionVersion: { classification: 'PublicNonPersonalData', purpose: 'FeatureInsight' }; + publisherDisplayName: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + activationEvents: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + isBuiltin: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; + reason: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; +}; + export class ExtHostExtensionService implements ExtHostExtensionServiceShape { private static readonly WORKSPACE_CONTAINS_TIMEOUT = 7000; @@ -313,23 +323,32 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { "outcome" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } } */ - this._mainThreadTelemetryProxy.$publicLog('extensionActivationTimes', { + type ExtensionActivationTimesClassification = { + outcome: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + } & TelemetryActivationEventFragment & ExtensionActivationTimesFragment; + + type ExtensionActivationTimesEvent = { + outcome: string + } & ActivationTimesEvent & TelemetryActivationEvent; + + type ActivationTimesEvent = { + startup?: boolean; + codeLoadingTime?: number; + activateCallTime?: number; + activateResolvedTime?: number; + }; + + this._mainThreadTelemetryProxy.$publicLog2('extensionActivationTimes', { ...event, ...(activationTimes || {}), - outcome, + outcome }); } private _doActivateExtension(extensionDescription: IExtensionDescription, reason: ExtensionActivationReason): Promise { const event = getTelemetryActivationEvent(extensionDescription, reason); - /* __GDPR__ - "activatePlugin" : { - "${include}": [ - "${TelemetryActivationEvent}" - ] - } - */ - this._mainThreadTelemetryProxy.$publicLog('activatePlugin', event); + type ActivatePluginClassification = {} & TelemetryActivationEventFragment; + this._mainThreadTelemetryProxy.$publicLog2('activatePlugin', event); if (!extensionDescription.main) { // Treat the extension as being empty => NOT AN ERROR CASE return Promise.resolve(new EmptyExtension(ExtensionActivationTimes.NONE)); @@ -736,22 +755,20 @@ function loadCommonJSModule(logService: ILogService, modulePath: string, acti return Promise.resolve(r); } -function getTelemetryActivationEvent(extensionDescription: IExtensionDescription, reason: ExtensionActivationReason): any { +type TelemetryActivationEvent = { + id: string; + name: string; + extensionVersion: string; + publisherDisplayName: string; + activationEvents: string | null; + isBuiltin: boolean; + reason: string; +}; + +function getTelemetryActivationEvent(extensionDescription: IExtensionDescription, reason: ExtensionActivationReason): TelemetryActivationEvent { const reasonStr = reason instanceof ExtensionActivatedByEvent ? reason.activationEvent : reason instanceof ExtensionActivatedByAPI ? 'api' : ''; - - /* __GDPR__FRAGMENT__ - "TelemetryActivationEvent" : { - "id": { "classification": "PublicNonPersonalData", "purpose": "FeatureInsight" }, - "name": { "classification": "PublicNonPersonalData", "purpose": "FeatureInsight" }, - "extensionVersion": { "classification": "PublicNonPersonalData", "purpose": "FeatureInsight" }, - "publisherDisplayName": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "activationEvents": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "isBuiltin": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "reason": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ const event = { id: extensionDescription.identifier.value, name: extensionDescription.name, diff --git a/src/vs/workbench/browser/parts/compositePart.ts b/src/vs/workbench/browser/parts/compositePart.ts index 7b10d5f06c5..d30b9923308 100644 --- a/src/vs/workbench/browser/parts/compositePart.ts +++ b/src/vs/workbench/browser/parts/compositePart.ts @@ -14,7 +14,7 @@ import { ToolBar } from 'vs/base/browser/ui/toolbar/toolbar'; import { IActionViewItem, ActionsOrientation } from 'vs/base/browser/ui/actionbar/actionbar'; import { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar'; import { prepareActions } from 'vs/workbench/browser/actions'; -import { IAction } from 'vs/base/common/actions'; +import { IAction, WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; import { Part, IPartOptions } from 'vs/workbench/browser/part'; import { Composite, CompositeRegistry } from 'vs/workbench/browser/composite'; import { IComposite } from 'vs/workbench/common/composite'; @@ -259,13 +259,7 @@ export abstract class CompositePart extends Part { // Log in telemetry if (this.telemetryService) { - /* __GDPR__ - "workbenchActionExecuted" : { - "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('workbenchActionExecuted', { id: e.action.id, from: this.nameForTelemetry }); + this.telemetryService.publicLog2('workbenchActionExecuted', { id: e.action.id, from: this.nameForTelemetry }); } }); diff --git a/src/vs/workbench/browser/parts/editor/titleControl.ts b/src/vs/workbench/browser/parts/editor/titleControl.ts index 6bd8f1f83d7..3ae79e95d7d 100644 --- a/src/vs/workbench/browser/parts/editor/titleControl.ts +++ b/src/vs/workbench/browser/parts/editor/titleControl.ts @@ -8,7 +8,7 @@ import { addDisposableListener, Dimension, EventType } from 'vs/base/browser/dom import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import { ActionsOrientation, IActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { ToolBar } from 'vs/base/browser/ui/toolbar/toolbar'; -import { IAction, IRunEvent } from 'vs/base/common/actions'; +import { IAction, IRunEvent, WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; import * as arrays from 'vs/base/common/arrays'; import { ResolvedKeybinding } from 'vs/base/common/keyCodes'; import { dispose, DisposableStore } from 'vs/base/common/lifecycle'; @@ -152,13 +152,7 @@ export abstract class TitleControl extends Themable { // Log in telemetry if (this.telemetryService) { - /* __GDPR__ - "workbenchActionExecuted" : { - "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('workbenchActionExecuted', { id: e.action.id, from: 'editorPart' }); + this.telemetryService.publicLog2('workbenchActionExecuted', { id: e.action.id, from: 'editorPart' }); } })); } diff --git a/src/vs/workbench/browser/parts/notifications/notificationsActions.ts b/src/vs/workbench/browser/parts/notifications/notificationsActions.ts index 70a2d4e45bf..eca2e75e76c 100644 --- a/src/vs/workbench/browser/parts/notifications/notificationsActions.ts +++ b/src/vs/workbench/browser/parts/notifications/notificationsActions.ts @@ -6,7 +6,7 @@ import 'vs/css!./media/notificationsActions'; import { INotificationViewItem } from 'vs/workbench/common/notifications'; import { localize } from 'vs/nls'; -import { Action, IAction, ActionRunner } from 'vs/base/common/actions'; +import { Action, IAction, ActionRunner, WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { CLEAR_NOTIFICATION, EXPAND_NOTIFICATION, COLLAPSE_NOTIFICATION, CLEAR_ALL_NOTIFICATIONS, HIDE_NOTIFICATIONS_CENTER } from 'vs/workbench/browser/parts/notifications/notificationsCommands'; @@ -161,14 +161,7 @@ export class NotificationActionRunner extends ActionRunner { } protected async runAction(action: IAction, context: INotificationViewItem): Promise { - - /* __GDPR__ - "workbenchActionExecuted" : { - "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('workbenchActionExecuted', { id: action.id, from: 'message' }); + this.telemetryService.publicLog2('workbenchActionExecuted', { id: action.id, from: 'message' }); // Run and make sure to notify on any error again try { diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts index 9eee470b9c8..82caead6b6d 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts @@ -15,7 +15,7 @@ import { IInstantiationService, ServiceIdentifier } from 'vs/platform/instantiat import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { StatusbarAlignment, IStatusbarService, IStatusbarEntry, IStatusbarEntryAccessor } from 'vs/platform/statusbar/common/statusbar'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { Action, IAction } from 'vs/base/common/actions'; +import { Action, IAction, WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector, ThemeColor } from 'vs/platform/theme/common/themeService'; import { STATUS_BAR_BACKGROUND, STATUS_BAR_FOREGROUND, STATUS_BAR_NO_FOLDER_BACKGROUND, STATUS_BAR_ITEM_HOVER_BACKGROUND, STATUS_BAR_ITEM_ACTIVE_BACKGROUND, STATUS_BAR_PROMINENT_ITEM_FOREGROUND, STATUS_BAR_PROMINENT_ITEM_BACKGROUND, STATUS_BAR_PROMINENT_ITEM_HOVER_BACKGROUND, STATUS_BAR_BORDER, STATUS_BAR_NO_FOLDER_FOREGROUND, STATUS_BAR_NO_FOLDER_BORDER } from 'vs/workbench/common/theme'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; @@ -725,13 +725,7 @@ class StatusbarEntryItem extends Disposable { activeTextEditorWidget.focus(); } - /* __GDPR__ - "workbenchActionExecuted" : { - "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('workbenchActionExecuted', { id, from: 'status bar' }); + this.telemetryService.publicLog2('workbenchActionExecuted', { id, from: 'status bar' }); try { await this.commandService.executeCommand(id, ...args); } catch (error) { diff --git a/src/vs/workbench/contrib/debug/browser/debugToolBar.ts b/src/vs/workbench/contrib/debug/browser/debugToolBar.ts index 90bff5a0b30..678ff1bad19 100644 --- a/src/vs/workbench/contrib/debug/browser/debugToolBar.ts +++ b/src/vs/workbench/contrib/debug/browser/debugToolBar.ts @@ -9,7 +9,7 @@ import * as browser from 'vs/base/browser/browser'; import * as dom from 'vs/base/browser/dom'; import * as arrays from 'vs/base/common/arrays'; import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; -import { IAction, IRunEvent } from 'vs/base/common/actions'; +import { IAction, IRunEvent, WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; import { ActionBar, ActionsOrientation, Separator } from 'vs/base/browser/ui/actionbar/actionbar'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; @@ -134,13 +134,7 @@ export class DebugToolBar extends Themable implements IWorkbenchContribution { // log in telemetry if (this.telemetryService) { - /* __GDPR__ - "workbenchActionExecuted" : { - "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('workbenchActionExecuted', { id: e.action.id, from: 'debugActionsWidget' }); + this.telemetryService.publicLog2('workbenchActionExecuted', { id: e.action.id, from: 'debugActionsWidget' }); } })); this._register(dom.addDisposableListener(window, dom.EventType.RESIZE, () => this.setCoordinates())); diff --git a/src/vs/workbench/contrib/feedback/browser/feedback.ts b/src/vs/workbench/contrib/feedback/browser/feedback.ts index ec7abc32a8d..9655b55c958 100644 --- a/src/vs/workbench/contrib/feedback/browser/feedback.ts +++ b/src/vs/workbench/contrib/feedback/browser/feedback.ts @@ -17,6 +17,7 @@ import { editorWidgetBackground, editorWidgetForeground, widgetShadow, inputBord import { IAnchor } from 'vs/base/browser/ui/contextview/contextview'; import { Button } from 'vs/base/browser/ui/button/button'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; import { IStatusbarService } from 'vs/platform/statusbar/common/statusbar'; import { IProductService } from 'vs/platform/product/common/product'; @@ -212,14 +213,7 @@ export class FeedbackDropdown extends Dropdown { const actionId = 'workbench.action.openIssueReporter'; this.commandService.executeCommand(actionId); this.hide(); - - /* __GDPR__ - "workbenchActionExecuted" : { - "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('workbenchActionExecuted', { id: actionId, from: 'feedback' }); + this.telemetryService.publicLog2('workbenchActionExecuted', { id: actionId, from: 'feedback' }); })); // Contact: Request a Feature diff --git a/src/vs/workbench/contrib/files/browser/views/explorerView.ts b/src/vs/workbench/contrib/files/browser/views/explorerView.ts index 4fb9af476f5..fbc052ece11 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerView.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerView.ts @@ -6,7 +6,7 @@ import * as nls from 'vs/nls'; import { URI } from 'vs/base/common/uri'; import * as perf from 'vs/base/common/performance'; -import { Action, IAction } from 'vs/base/common/actions'; +import { Action, IAction, WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; import { memoize } from 'vs/base/common/decorators'; import { IFilesConfiguration, ExplorerFolderContext, FilesExplorerFocusedContext, ExplorerFocusedContext, ExplorerRootContext, ExplorerResourceReadonlyContext, IExplorerService, ExplorerResourceCut, ExplorerResourceMoveableToTrash } from 'vs/workbench/contrib/files/common/files'; import { NewFolderAction, NewFileAction, FileCopiedContext, RefreshExplorerView, CollapseExplorerView } from 'vs/workbench/contrib/files/browser/fileActions'; @@ -326,13 +326,7 @@ export class ExplorerView extends ViewletPanel { // Do not react if clicking on directories return; } - - /* __GDPR__ - "workbenchActionExecuted" : { - "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - }*/ - this.telemetryService.publicLog('workbenchActionExecuted', { id: 'workbench.files.openFile', from: 'explorer' }); + this.telemetryService.publicLog2('workbenchActionExecuted', { id: 'workbench.files.openFile', from: 'explorer' }); this.editorService.openEditor({ resource: selection[0].resource, options: { preserveFocus: e.editorOptions.preserveFocus, pinned: e.editorOptions.pinned } }, e.sideBySide ? SIDE_GROUP : ACTIVE_GROUP) .then(undefined, onUnexpectedError); } diff --git a/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts b/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts index 46b7957388c..a7ee659d338 100644 --- a/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts +++ b/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts @@ -5,7 +5,7 @@ import * as nls from 'vs/nls'; import { RunOnceScheduler } from 'vs/base/common/async'; -import { IAction, ActionRunner } from 'vs/base/common/actions'; +import { IAction, ActionRunner, WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; import * as dom from 'vs/base/browser/dom'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -345,13 +345,7 @@ export class OpenEditorsView extends ViewletPanel { private openEditor(element: OpenEditor, options: { preserveFocus: boolean; pinned: boolean; sideBySide: boolean; }): void { if (element) { - /* __GDPR__ - "workbenchActionExecuted" : { - "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('workbenchActionExecuted', { id: 'workbench.files.openFile', from: 'openEditors' }); + this.telemetryService.publicLog2('workbenchActionExecuted', { id: 'workbench.files.openFile', from: 'openEditors' }); const preserveActivateGroup = options.sideBySide && options.preserveFocus; // needed for https://github.com/Microsoft/vscode/issues/42399 if (!preserveActivateGroup) { diff --git a/src/vs/workbench/contrib/quickopen/browser/commandsHandler.ts b/src/vs/workbench/contrib/quickopen/browser/commandsHandler.ts index 0904b286f7c..d1a3d725563 100644 --- a/src/vs/workbench/contrib/quickopen/browser/commandsHandler.ts +++ b/src/vs/workbench/contrib/quickopen/browser/commandsHandler.ts @@ -7,7 +7,7 @@ import * as nls from 'vs/nls'; import * as arrays from 'vs/base/common/arrays'; import * as types from 'vs/base/common/types'; import { Language } from 'vs/base/common/platform'; -import { Action } from 'vs/base/common/actions'; +import { Action, WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; import { Mode, IEntryRunContext, IAutoFocus, IModel, IQuickNavigateConfiguration } from 'vs/base/parts/quickopen/common/quickOpen'; import { QuickOpenEntryGroup, IHighlight, QuickOpenModel, QuickOpenEntry } from 'vs/base/parts/quickopen/browser/quickOpenModel'; import { IMenuService, MenuId, MenuItemAction } from 'vs/platform/actions/common/actions'; @@ -297,13 +297,7 @@ abstract class BaseCommandEntry extends QuickOpenEntryGroup { setTimeout(async () => { if (action && (!(action instanceof Action) || action.enabled)) { try { - /* __GDPR__ - "workbenchActionExecuted" : { - "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('workbenchActionExecuted', { id: action.id, from: 'quick open' }); + this.telemetryService.publicLog2('workbenchActionExecuted', { id: action.id, from: 'quick open' }); const promise = action.run(); if (promise) { diff --git a/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts b/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts index 071c367c648..37218b7f241 100644 --- a/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts +++ b/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts @@ -17,7 +17,7 @@ import { IWindowService, IURIToOpen } from 'vs/platform/windows/common/windows'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; import { localize } from 'vs/nls'; -import { Action } from 'vs/base/common/actions'; +import { Action, WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { Schemas } from 'vs/base/common/network'; import { IBackupFileService } from 'vs/workbench/services/backup/common/backup'; @@ -360,13 +360,7 @@ class WelcomePage extends Disposable { a.setAttribute('aria-label', localize('welcomePage.openFolderWithPath', "Open folder {0} with path {1}", name, parentPath)); a.href = 'javascript:void(0)'; a.addEventListener('click', e => { - /* __GDPR__ - "workbenchActionExecuted" : { - "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('workbenchActionExecuted', { + this.telemetryService.publicLog2('workbenchActionExecuted', { id: 'openRecentFolder', from: telemetryFrom }); diff --git a/src/vs/workbench/services/contextmenu/electron-browser/contextmenuService.ts b/src/vs/workbench/services/contextmenu/electron-browser/contextmenuService.ts index 8a389cc3c44..d06480d2b43 100644 --- a/src/vs/workbench/services/contextmenu/electron-browser/contextmenuService.ts +++ b/src/vs/workbench/services/contextmenu/electron-browser/contextmenuService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IAction, IActionRunner, ActionRunner } from 'vs/base/common/actions'; +import { IAction, IActionRunner, ActionRunner, WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; import * as dom from 'vs/base/browser/dom'; import { IContextMenuService, IContextViewService } from 'vs/platform/contextview/browser/contextView'; @@ -173,13 +173,7 @@ class NativeContextMenuService extends Disposable implements IContextMenuService } private async runAction(actionRunner: IActionRunner, actionToRun: IAction, delegate: IContextMenuDelegate, event: IContextMenuEvent): Promise { - /* __GDPR__ - "workbenchActionExecuted" : { - "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('workbenchActionExecuted', { id: actionToRun.id, from: 'contextMenu' }); + this.telemetryService.publicLog2('workbenchActionExecuted', { id: actionToRun.id, from: 'contextMenu' }); const context = delegate.getActionsContext ? delegate.getActionsContext(event) : event; diff --git a/src/vs/workbench/services/themes/browser/workbenchThemeService.ts b/src/vs/workbench/services/themes/browser/workbenchThemeService.ts index 3ff44d30384..a70a2d7c92e 100644 --- a/src/vs/workbench/services/themes/browser/workbenchThemeService.ts +++ b/src/vs/workbench/services/themes/browser/workbenchThemeService.ts @@ -438,16 +438,21 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { if (themeData) { let key = themeType + themeData.extensionId; if (!this.themeExtensionsActivated.get(key)) { - /* __GDPR__ - "activatePlugin" : { - "id" : { "classification": "PublicNonPersonalData", "purpose": "FeatureInsight" }, - "name": { "classification": "PublicNonPersonalData", "purpose": "FeatureInsight" }, - "isBuiltin": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "publisherDisplayName": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "themeId": { "classification": "PublicNonPersonalData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('activatePlugin', { + type ActivatePluginClassification = { + id: { classification: 'PublicNonPersonalData', purpose: 'FeatureInsight' }; + name: { classification: 'PublicNonPersonalData', purpose: 'FeatureInsight' }; + isBuiltin: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; + publisherDisplayName: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + themeId: { classification: 'PublicNonPersonalData', purpose: 'FeatureInsight' }; + }; + type ActivatePluginEvent = { + id: string; + name: string; + isBuiltin: boolean; + publisherDisplayName: string; + themeId: string; + }; + this.telemetryService.publicLog2('activatePlugin', { id: themeData.extensionId, name: themeData.extensionName, isBuiltin: themeData.extensionIsBuiltin, From cbdef77baa81d6c46a525126b62120e290e614f4 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 1 Jul 2019 11:11:34 -0700 Subject: [PATCH 0846/1449] Handle cases where accessing `navigator.serviceWorker` throws an error --- src/vs/workbench/contrib/webview/browser/pre/host.js | 6 +++++- src/vs/workbench/contrib/webview/browser/pre/main.js | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/host.js b/src/vs/workbench/contrib/webview/browser/pre/host.js index 3ffd33bdb72..0395c7a9ede 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/host.js +++ b/src/vs/workbench/contrib/webview/browser/pre/host.js @@ -36,7 +36,11 @@ }(); const workerReady = new Promise(async (resolveWorkerReady) => { - if (!navigator.serviceWorker) { + try { + if (!navigator.serviceWorker) { + return resolveWorkerReady(); + } + } catch (e) { return resolveWorkerReady(); } diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index fc5964ba3f2..e9224d4aec1 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -158,7 +158,12 @@ }; // Service worker for resource loading - const FAKE_LOAD = !!navigator.serviceWorker; + let FAKE_LOAD = false; + try { + FAKE_LOAD = !!navigator.serviceWorker; + } catch (e) { + // noop + } /** * @param {HTMLDocument?} document From ca72178132feff8857a1e7ef633bacd71dfa4616 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 1 Jul 2019 11:24:40 -0700 Subject: [PATCH 0847/1449] Use ReadonlyArray in a few places Make it clearer which arrays are being mutated --- src/vs/platform/actions/browser/menuEntryActionViewItem.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/actions/browser/menuEntryActionViewItem.ts b/src/vs/platform/actions/browser/menuEntryActionViewItem.ts index 2dae1433858..4d73996185d 100644 --- a/src/vs/platform/actions/browser/menuEntryActionViewItem.ts +++ b/src/vs/platform/actions/browser/menuEntryActionViewItem.ts @@ -90,7 +90,7 @@ export function createAndFillInActionBarActions(menu: IMenu, options: IMenuActio return asDisposable(groups); } -function asDisposable(groups: [string, Array][]): IDisposable { +function asDisposable(groups: ReadonlyArray<[string, ReadonlyArray]>): IDisposable { const disposables = new DisposableStore(); for (const [, actions] of groups) { for (const action of actions) { @@ -100,7 +100,7 @@ function asDisposable(groups: [string, Array return disposables; } -function fillInActions(groups: [string, Array][], target: IAction[] | { primary: IAction[]; secondary: IAction[]; }, useAlternativeActions: boolean, isPrimaryGroup: (group: string) => boolean = group => group === 'navigation'): void { +function fillInActions(groups: ReadonlyArray<[string, ReadonlyArray]>, target: IAction[] | { primary: IAction[]; secondary: IAction[]; }, useAlternativeActions: boolean, isPrimaryGroup: (group: string) => boolean = group => group === 'navigation'): void { for (let tuple of groups) { let [group, actions] = tuple; if (useAlternativeActions) { From ab17d625c8cf920ab1ae64e570bf5198b5116bab Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 1 Jul 2019 11:39:35 -0700 Subject: [PATCH 0848/1449] Marking more action fields and interface properties as readonly --- src/vs/base/common/actions.ts | 36 +++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/vs/base/common/actions.ts b/src/vs/base/common/actions.ts index 48a444d7f70..14925ea276a 100644 --- a/src/vs/base/common/actions.ts +++ b/src/vs/base/common/actions.ts @@ -7,8 +7,8 @@ import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; import { Event, Emitter } from 'vs/base/common/event'; export interface ITelemetryData { - from?: string; - target?: string; + readonly from?: string; + readonly target?: string; [key: string]: any; } @@ -23,7 +23,7 @@ export type WBActionExecutedEvent = { }; export interface IAction extends IDisposable { - id: string; + readonly id: string; label: string; tooltip: string; class: string | undefined; @@ -35,12 +35,12 @@ export interface IAction extends IDisposable { export interface IActionRunner extends IDisposable { run(action: IAction, context?: any): Promise; - onDidRun: Event; - onDidBeforeRun: Event; + readonly onDidRun: Event; + readonly onDidBeforeRun: Event; } export interface IActionViewItem extends IDisposable { - actionRunner: IActionRunner; + readonly actionRunner: IActionRunner; setActionContext(context: any): void; render(element: any /* HTMLElement */): void; isEnabled(): boolean; @@ -49,12 +49,12 @@ export interface IActionViewItem extends IDisposable { } export interface IActionChangeEvent { - label?: string; - tooltip?: string; - class?: string; - enabled?: boolean; - checked?: boolean; - radio?: boolean; + readonly label?: string; + readonly tooltip?: string; + readonly class?: string; + readonly enabled?: boolean; + readonly checked?: boolean; + readonly radio?: boolean; } export class Action extends Disposable implements IAction { @@ -62,14 +62,14 @@ export class Action extends Disposable implements IAction { protected _onDidChange = this._register(new Emitter()); readonly onDidChange: Event = this._onDidChange.event; - protected _id: string; + protected readonly _id: string; protected _label: string; protected _tooltip: string; protected _cssClass: string | undefined; protected _enabled: boolean; protected _checked: boolean; protected _radio: boolean; - protected _actionCallback?: (event?: any) => Promise; + protected readonly _actionCallback?: (event?: any) => Promise; constructor(id: string, label: string = '', cssClass: string = '', enabled: boolean = true, actionCallback?: (event?: any) => Promise) { super(); @@ -92,7 +92,7 @@ export class Action extends Disposable implements IAction { this._setLabel(value); } - protected _setLabel(value: string): void { + private _setLabel(value: string): void { if (this._label !== value) { this._label = value; this._onDidChange.fire({ label: value }); @@ -184,9 +184,9 @@ export class Action extends Disposable implements IAction { } export interface IRunEvent { - action: IAction; - result?: any; - error?: any; + readonly action: IAction; + readonly result?: any; + readonly error?: any; } export class ActionRunner extends Disposable implements IActionRunner { From 35f77aab43115416dd40d4b053088d223c083906 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 1 Jul 2019 11:47:21 -0700 Subject: [PATCH 0849/1449] Enable useSeparateSyntaxServer by default and remove the experimental section from setting name Fixes #76420 --- .vscode/settings.json | 3 +-- extensions/typescript-language-features/package.json | 8 ++++---- extensions/typescript-language-features/package.nls.json | 2 +- .../src/utils/configuration.ts | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index bde5d632541..3fa04b1ee95 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -59,6 +59,5 @@ "git.ignoreLimitWarning": true, "remote.extensionKind": { "msjsdiag.debugger-for-chrome": "workspace" - }, - "typescript.experimental.useSeparateSyntaxServer": true + } } diff --git a/extensions/typescript-language-features/package.json b/extensions/typescript-language-features/package.json index 00c0445e730..fc003585c9b 100644 --- a/extensions/typescript-language-features/package.json +++ b/extensions/typescript-language-features/package.json @@ -592,10 +592,10 @@ "description": "%configuration.surveys.enabled%", "scope": "window" }, - "typescript.experimental.useSeparateSyntaxServer": { + "typescript.tsserver.useSeparateSyntaxServer": { "type": "boolean", - "default": false, - "description": "%configuration.experimental.useSeparateSyntaxServer%", + "default": true, + "description": "%configuration.tsserver.useSeparateSyntaxServer%", "scope": "window" } } @@ -758,4 +758,4 @@ } ] } -} +} \ No newline at end of file diff --git a/extensions/typescript-language-features/package.nls.json b/extensions/typescript-language-features/package.nls.json index 10fdddec382..a83acf9c6f2 100644 --- a/extensions/typescript-language-features/package.nls.json +++ b/extensions/typescript-language-features/package.nls.json @@ -49,7 +49,7 @@ "typescript.problemMatchers.tsc.label": "TypeScript problems", "typescript.problemMatchers.tscWatch.label": "TypeScript problems (watch mode)", "configuration.suggest.paths": "Enable/disable suggestions for paths in import statements and require calls.", - "configuration.experimental.useSeparateSyntaxServer": "Enable/disable spawning a separate TypeScript server that can more quickly respond to syntax related operations, such as calculating folding or computing document symbols. Requires using TypeScript 3.4.0 or newer in the workspace.", + "configuration.tsserver.useSeparateSyntaxServer": "Enable/disable spawning a separate TypeScript server that can more quickly respond to syntax related operations, such as calculating folding or computing document symbols. Requires using TypeScript 3.4.0 or newer in the workspace.", "typescript.locale": "Sets the locale used to report JavaScript and TypeScript errors. Requires using TypeScript 2.6.0 or newer in the workspace. Default of `null` uses VS Code's locale.", "javascript.implicitProjectConfig.experimentalDecorators": "Enable/disable `experimentalDecorators` for JavaScript files that are not part of a project. Existing jsconfig.json or tsconfig.json files override this setting. Requires using TypeScript 2.3.1 or newer in the workspace.", "configuration.suggest.autoImports": "Enable/disable auto import suggestions. Requires using TypeScript 2.6.1 or newer in the workspace.", diff --git a/extensions/typescript-language-features/src/utils/configuration.ts b/extensions/typescript-language-features/src/utils/configuration.ts index 97619282256..f0e602e810a 100644 --- a/extensions/typescript-language-features/src/utils/configuration.ts +++ b/extensions/typescript-language-features/src/utils/configuration.ts @@ -144,6 +144,6 @@ export class TypeScriptServiceConfiguration { } private static readUseSeparateSyntaxServer(configuration: vscode.WorkspaceConfiguration): boolean { - return configuration.get('typescript.experimental.useSeparateSyntaxServer', false); + return configuration.get('typescript.tsserver.useSeparateSyntaxServer', true); } } From be5be44689b596d19d351837ac027371f6000daf Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 1 Jul 2019 15:01:03 -0700 Subject: [PATCH 0850/1449] Cleaning up check if service workers are supported or not --- .../contrib/webview/browser/pre/host.js | 16 +++++++++---- .../contrib/webview/browser/pre/main.js | 24 ++++++++----------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/host.js b/src/vs/workbench/contrib/webview/browser/pre/host.js index 0395c7a9ede..d56b9d66e44 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/host.js +++ b/src/vs/workbench/contrib/webview/browser/pre/host.js @@ -36,11 +36,8 @@ }(); const workerReady = new Promise(async (resolveWorkerReady) => { - try { - if (!navigator.serviceWorker) { - return resolveWorkerReady(); - } - } catch (e) { + if (!areServiceWorkersEnabled()) { + console.log('Service Workers are not enabled. Webviews will not work properly'); return resolveWorkerReady(); } @@ -85,9 +82,18 @@ }); }); + function areServiceWorkersEnabled() { + try { + return !!navigator.serviceWorker; + } catch (e) { + return false; + } + } + window.createWebviewManager({ postMessage: hostMessaging.postMessage.bind(hostMessaging), onMessage: hostMessaging.onMessage.bind(hostMessaging), ready: workerReady, + fakeLoad: true }); }()); \ No newline at end of file diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index e9224d4aec1..1dc234fe681 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -10,7 +10,8 @@ * onMessage: (channel: string, handler: any) => void, * focusIframeOnCreate?: boolean, * ready?: Promise, - * onIframeLoaded: (iframe: HTMLIFrameElement) => void + * onIframeLoaded?: (iframe: HTMLIFrameElement) => void, + * fakeLoad: boolean * }} WebviewHost */ @@ -157,13 +158,6 @@ initialScrollProgress: undefined }; - // Service worker for resource loading - let FAKE_LOAD = false; - try { - FAKE_LOAD = !!navigator.serviceWorker; - } catch (e) { - // noop - } /** * @param {HTMLDocument?} document @@ -368,7 +362,7 @@ newFrame.setAttribute('id', 'pending-frame'); newFrame.setAttribute('frameborder', '0'); newFrame.setAttribute('sandbox', options.allowScripts ? 'allow-scripts allow-forms allow-same-origin' : 'allow-same-origin'); - if (FAKE_LOAD) { + if (host.fakeLoad) { // We should just be able to use srcdoc, but I wasn't // seeing the service worker applying properly. // Fake load an empty on the correct origin and then write real html @@ -378,7 +372,7 @@ newFrame.style.cssText = 'display: block; margin: 0; overflow: hidden; position: absolute; width: 100%; height: 100%; visibility: hidden'; document.body.appendChild(newFrame); - if (!FAKE_LOAD) { + if (!host.fakeLoad) { // write new content onto iframe newFrame.contentDocument.open(); } @@ -386,7 +380,7 @@ newFrame.contentWindow.addEventListener('keydown', handleInnerKeydown); newFrame.contentWindow.addEventListener('DOMContentLoaded', e => { - if (FAKE_LOAD) { + if (host.fakeLoad) { newFrame.contentDocument.open(); newFrame.contentDocument.write(newDocument); newFrame.contentDocument.close(); @@ -451,14 +445,16 @@ // Bubble out link clicks newFrame.contentWindow.addEventListener('click', handleInnerClick); - host.onIframeLoaded(newFrame); + if (host.onIframeLoaded) { + host.onIframeLoaded(newFrame); + } } - if (!FAKE_LOAD) { + if (!host.fakeLoad) { hookupOnLoadHandlers(newFrame); } - if (!FAKE_LOAD) { + if (!host.fakeLoad) { newFrame.contentDocument.write(newDocument); newFrame.contentDocument.close(); } From 05ceb5e8aca84f96e2326fcc886a5a1ee8f77712 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Tue, 2 Jul 2019 10:18:50 +1200 Subject: [PATCH 0851/1449] snapcaft.yaml: Set the AppStream ID in the Snap metadata This allows software store to recognise this snap matches Visual Studio Code in other formats (.deb, .rpm, Flatpak etc). It also means reviews on ODRS are grouped together. --- resources/linux/snap/snapcraft.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/linux/snap/snapcraft.yaml b/resources/linux/snap/snapcraft.yaml index 0a78d41e8fd..28b3e59ad7e 100644 --- a/resources/linux/snap/snapcraft.yaml +++ b/resources/linux/snap/snapcraft.yaml @@ -51,6 +51,7 @@ apps: @@NAME@@: command: electron-launch $SNAP/usr/share/@@NAME@@/bin/@@NAME@@ desktop: usr/share/applications/@@NAME@@.desktop + common-id: @@NAME@@.desktop environment: DISABLE_WAYLAND: 1 GSETTINGS_SCHEMA_DIR: $SNAP/usr/share/glib-2.0/schemas From 375a62c19b1c49839e1c43833eb0991c26759901 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 1 Jul 2019 15:34:49 -0700 Subject: [PATCH 0852/1449] Mark all properties in `ExtensionContext` readonly These values should not be modified --- src/vs/vscode.d.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index a15dfd195cb..a3743d7eeb4 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -4754,24 +4754,24 @@ declare module 'vscode' { * An array to which disposables can be added. When this * extension is deactivated the disposables will be disposed. */ - subscriptions: { dispose(): any }[]; + readonly subscriptions: { dispose(): any }[]; /** * A memento object that stores state in the context * of the currently opened [workspace](#workspace.workspaceFolders). */ - workspaceState: Memento; + readonly workspaceState: Memento; /** * A memento object that stores state independent * of the current opened [workspace](#workspace.workspaceFolders). */ - globalState: Memento; + readonly globalState: Memento; /** * The absolute file path of the directory containing the extension. */ - extensionPath: string; + readonly extensionPath: string; /** * Get the absolute path of a resource contained in the extension. @@ -4789,7 +4789,7 @@ declare module 'vscode' { * Use [`workspaceState`](#ExtensionContext.workspaceState) or * [`globalState`](#ExtensionContext.globalState) to store key value data. */ - storagePath: string | undefined; + readonly storagePath: string | undefined; /** * An absolute file path in which the extension can store global state. @@ -4798,14 +4798,14 @@ declare module 'vscode' { * * Use [`globalState`](#ExtensionContext.globalState) to store key value data. */ - globalStoragePath: string; + readonly globalStoragePath: string; /** * An absolute file path of a directory in which the extension can create log files. * The directory might not exist on disk and creation is up to the extension. However, * the parent directory is guaranteed to be existent. */ - logPath: string; + readonly logPath: string; } /** From 9e7bb2c8813edd782d95bdc4fb6ad4ada613c4eb Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 1 Jul 2019 15:57:35 -0700 Subject: [PATCH 0853/1449] Support image/* data uris in markdown preview Fixes #76080 --- extensions/markdown-language-features/src/markdownEngine.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/extensions/markdown-language-features/src/markdownEngine.ts b/extensions/markdown-language-features/src/markdownEngine.ts index 0c10f5540fa..0cc75bfe823 100644 --- a/extensions/markdown-language-features/src/markdownEngine.ts +++ b/extensions/markdown-language-features/src/markdownEngine.ts @@ -225,7 +225,6 @@ export class MarkdownEngine { return normalizeLink(externalSchemeUri.toString(true)); } - // Assume it must be an relative or absolute file path // Use a fake scheme to avoid parse warnings let uri = vscode.Uri.parse(`vscode-resource:${link}`); @@ -262,7 +261,7 @@ export class MarkdownEngine { const validateLink = md.validateLink; md.validateLink = (link: string) => { // support file:// links - return validateLink(link) || link.indexOf('file:') === 0; + return validateLink(link) || link.startsWith('file:') || /^data:image\/.*?;/.test(link); }; } From 6f1d0fc7ec7f03af89354cf0de39e868b69b7587 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 1 Jul 2019 15:58:29 -0700 Subject: [PATCH 0854/1449] Get virtual processes mostly working --- src/vs/vscode.proposed.d.ts | 5 + .../api/browser/mainThreadTerminalService.ts | 16 ++- src/vs/workbench/api/node/extHost.api.impl.ts | 10 +- .../api/node/extHostTerminalService.ts | 99 ++++++++++++++++--- .../browser/terminalProcessManager.ts | 2 +- .../contrib/terminal/common/terminal.ts | 2 + .../common/terminalProcessExtHostProxy.ts | 21 ++-- .../terminal/common/terminalService.ts | 7 ++ 8 files changed, 135 insertions(+), 27 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 696b8648bff..df2dc250d13 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1292,6 +1292,11 @@ declare module 'vscode' { // This is called fire when window.onDidChangeTerminalDimensions fires as CustomExecution need // access to the "maximum" dimensions and don't want access to Terminal onDidChangeDimensions?(dimensions: TerminalDimensions): void; + + /** + * F + */ + onDidShutdownTerminal(): void; } //#endregion diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index 5659af48a05..558df53ba74 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -46,6 +46,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape this._toDispose.push(_terminalService.onInstanceDimensionsChanged(instance => this._onInstanceDimensionsChanged(instance))); this._toDispose.push(_terminalService.onInstanceMaximumDimensionsChanged(instance => this._onInstanceMaximumDimensionsChanged(instance))); this._toDispose.push(_terminalService.onInstanceRequestExtHostProcess(request => this._onTerminalRequestExtHostProcess(request))); + this._toDispose.push(_terminalService.onInstanceRequestVirtualProcess(proxy => this._onTerminalRequestVirtualProcess(proxy))); this._toDispose.push(_terminalService.onActiveInstanceChanged(instance => this._onActiveTerminalChanged(instance ? instance.id : null))); this._toDispose.push(_terminalService.onInstanceTitleChanged(instance => this._onTitleChanged(instance.id, instance.title))); this._toDispose.push(_terminalService.configHelper.onWorkspacePermissionsChanged(isAllowed => this._onWorkspacePermissionsChanged(isAllowed))); @@ -77,6 +78,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape } public $createTerminal(name?: string, shellPath?: string, shellArgs?: string[] | string, cwd?: string | UriComponents, env?: { [key: string]: string }, waitOnExit?: boolean, strictEnv?: boolean, hideFromUser?: boolean, isVirtualProcess?: boolean): Promise<{ id: number, name: string }> { + console.log('$createTerminal', arguments); const shellLaunchConfig: IShellLaunchConfig = { name, executable: shellPath, @@ -86,7 +88,8 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape ignoreConfigurationCwd: true, env, strictEnv, - hideFromUser + hideFromUser, + isVirtualProcess }; const terminal = this._terminalService.createTerminal(shellLaunchConfig); return Promise.resolve({ @@ -256,6 +259,17 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape request.proxy.onRequestLatency(() => this._onRequestLatency(request.proxy.terminalId)); } + private _onTerminalRequestVirtualProcess(proxy: ITerminalProcessExtHostProxy): void { + console.log('_onTerminalRequestVirtualProcess', proxy); + this._terminalProcesses[proxy.terminalId] = proxy; + proxy.onInput(data => this._proxy.$acceptProcessInput(proxy.terminalId, data)); + proxy.onResize(dimensions => this._proxy.$acceptProcessResize(proxy.terminalId, dimensions.cols, dimensions.rows)); + proxy.onShutdown(immediate => this._proxy.$acceptProcessShutdown(proxy.terminalId, immediate)); + proxy.onRequestCwd(() => this._proxy.$acceptProcessRequestCwd(proxy.terminalId)); + proxy.onRequestInitialCwd(() => this._proxy.$acceptProcessRequestInitialCwd(proxy.terminalId)); + proxy.onRequestLatency(() => this._onRequestLatency(proxy.terminalId)); + } + public $sendProcessTitle(terminalId: number, title: string): void { this._terminalProcesses[terminalId].emitTitle(title); } diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 4c3395f98a6..090aae11322 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -524,10 +524,14 @@ export function createApiFactory( checkProposedApiEnabled(extension); return extHostEditorInsets.createWebviewEditorInset(editor, line, height, options, extension); }, - createTerminal(nameOrOptions?: vscode.TerminalOptions | string, shellPath?: string, shellArgs?: string[] | string): vscode.Terminal { + createTerminal(nameOrOptions?: vscode.TerminalOptions | vscode.TerminalVirtualProcessOptions | string, shellPath?: string, shellArgs?: string[] | string): vscode.Terminal { if (typeof nameOrOptions === 'object') { - nameOrOptions.hideFromUser = nameOrOptions.hideFromUser || (nameOrOptions.runInBackground && extension.enableProposedApi); - return extHostTerminalService.createTerminalFromOptions(nameOrOptions); + if ('virtualProcess' in nameOrOptions) { + return extHostTerminalService.createVirtualProcessTerminal(nameOrOptions); + } else { + nameOrOptions.hideFromUser = nameOrOptions.hideFromUser || (nameOrOptions.runInBackground && extension.enableProposedApi); + return extHostTerminalService.createTerminalFromOptions(nameOrOptions); + } } return extHostTerminalService.createTerminal(nameOrOptions, shellPath, shellArgs); }, diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 3ca4f816f99..8ebbbf4f339 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -13,7 +13,7 @@ import { Event, Emitter } from 'vs/base/common/event'; import { ExtHostTerminalServiceShape, MainContext, MainThreadTerminalServiceShape, IMainContext, ShellLaunchConfigDto, IShellDefinitionDto, IShellAndArgsDto } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostConfiguration, ExtHostConfigProvider } from 'vs/workbench/api/common/extHostConfiguration'; import { ILogService } from 'vs/platform/log/common/log'; -import { EXT_HOST_CREATION_DELAY, IShellLaunchConfig, ITerminalEnvironment } from 'vs/workbench/contrib/terminal/common/terminal'; +import { EXT_HOST_CREATION_DELAY, IShellLaunchConfig, ITerminalEnvironment, ITerminalChildProcess } from 'vs/workbench/contrib/terminal/common/terminal'; import { TerminalProcess } from 'vs/workbench/contrib/terminal/node/terminalProcess'; import { timeout } from 'vs/base/common/async'; import { ExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; @@ -116,17 +116,20 @@ export class ExtHostTerminal extends BaseExtHostTerminal implements vscode.Termi env?: { [key: string]: string | null }, waitOnExit?: boolean, strictEnv?: boolean, - hideFromUser?: boolean, - isVirtualProcess?: boolean + hideFromUser?: boolean ): void { - this._proxy.$createTerminal(this._name, shellPath, shellArgs, cwd, env, waitOnExit, strictEnv, hideFromUser, isVirtualProcess).then(terminal => { + this._proxy.$createTerminal(this._name, shellPath, shellArgs, cwd, env, waitOnExit, strictEnv, hideFromUser).then(terminal => { this._name = terminal.name; this._runQueuedRequests(terminal.id); }); } - public createVirtualProcess(): void { - this.create(undefined, undefined, undefined, undefined, undefined, undefined, undefined, true); + public createVirtualProcess(): Promise { + // TODO: Change $createTerminal to accept an object + return this._proxy.$createTerminal(this._name, undefined, undefined, undefined, undefined, undefined, undefined, undefined, true).then(terminal => { + this._name = terminal.name; + this._runQueuedRequests(terminal.id); + }); } public get name(): string { @@ -280,7 +283,7 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { private _proxy: MainThreadTerminalServiceShape; private _activeTerminal: ExtHostTerminal | undefined; private _terminals: ExtHostTerminal[] = []; - private _terminalProcesses: { [id: number]: TerminalProcess } = {}; + private _terminalProcesses: { [id: number]: ITerminalChildProcess } = {}; private _terminalRenderers: ExtHostTerminalRenderer[] = []; private _getTerminalPromises: { [id: number]: Promise } = {}; @@ -318,11 +321,24 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { public createTerminalFromOptions(options: vscode.TerminalOptions): vscode.Terminal { const terminal = new ExtHostTerminal(this._proxy, options.name); - if ((options).isVirtualProcess) { - terminal.createVirtualProcess(); - } else { - terminal.create(options.shellPath, options.shellArgs, options.cwd, options.env, /*options.waitOnExit*/ undefined, options.strictEnv, options.hideFromUser); - } + terminal.create(options.shellPath, options.shellArgs, options.cwd, options.env, /*options.waitOnExit*/ undefined, options.strictEnv, options.hideFromUser); + this._terminals.push(terminal); + return terminal; + } + + public createVirtualProcessTerminal(options: vscode.TerminalVirtualProcessOptions): vscode.Terminal { + const terminal = new ExtHostTerminal(this._proxy, options.name); + terminal.createVirtualProcess().then(() => { + const id = terminal._id; + console.log('virtual process id: ' + terminal._id); + // TODO: The ID is ready now + const p = new ExtHostVirtualProcess(options.virtualProcess); + p.onProcessReady((e: { pid: number, cwd: string }) => this._proxy.$sendProcessReady(id, e.pid, e.cwd)); + p.onProcessTitleChanged(title => this._proxy.$sendProcessTitle(id, title)); + p.onProcessData(data => this._proxy.$sendProcessData(id, data)); + p.onProcessExit(exitCode => this._onProcessExit(id, exitCode)); + this._terminalProcesses[terminal._id] = p; + }); this._terminals.push(terminal); return terminal; } @@ -607,9 +623,6 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { } private _onProcessExit(id: number, exitCode: number): void { - // Remove listeners - this._terminalProcesses[id].dispose(); - // Remove process reference delete this._terminalProcesses[id]; @@ -690,3 +703,59 @@ class ApiRequest { this._callback.apply(proxy, [id].concat(this._args)); } } + +class ExtHostVirtualProcess implements ITerminalChildProcess { + private readonly _onProcessData = new Emitter(); + public get onProcessData(): Event { return this._onProcessData.event; } + private readonly _onProcessExit = new Emitter(); + public get onProcessExit(): Event { return this._onProcessExit.event; } + private readonly _onProcessReady = new Emitter<{ pid: number, cwd: string }>(); + public get onProcessReady(): Event<{ pid: number, cwd: string }> { return this._onProcessReady.event; } + private readonly _onProcessTitleChanged = new Emitter(); + public get onProcessTitleChanged(): Event { return this._onProcessTitleChanged.event; } + + constructor( + private readonly _virtualProcess: vscode.TerminalVirtualProcess + ) { + // TODO: Events need to be buffered until the terminal id is set + this._virtualProcess.write(e => this._onProcessData.fire(e)); + if (this._virtualProcess.exit) { + this._virtualProcess.exit(e => this._onProcessExit.fire(e)); + } + if (this._virtualProcess.overrideDimensions) { + // TODO: Implement this + } + } + + shutdown(): void { + if (this._virtualProcess.onDidShutdownTerminal) { + this._virtualProcess.onDidShutdownTerminal(); + } + } + + input(data: string): void { + if (this._virtualProcess.onDidAcceptInput) { + this._virtualProcess.onDidAcceptInput(data); + } + } + + resize(cols: number, rows: number): void { + if (this._virtualProcess.onDidChangeDimensions) { + this._virtualProcess.onDidChangeDimensions({ columns: cols, rows }); + } + } + + // TODO: Are these returns correct? + getInitialCwd(): Promise { + return Promise.resolve(''); + } + + getCwd(): Promise { + return Promise.resolve(''); + } + + getLatency(): Promise { + return Promise.resolve(0); + } + +} \ No newline at end of file diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts index 1c00b861138..a08182cb91f 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts @@ -104,8 +104,8 @@ export class TerminalProcessManager implements ITerminalProcessManager { isScreenReaderModeEnabled: boolean ): Promise { if (shellLaunchConfig.isVirtualProcess) { - // TODO: Hook up proxy this._process = this._instantiationService.createInstance(TerminalProcessExtHostProxy, this._terminalId, shellLaunchConfig, undefined, cols, rows, this._configHelper); + console.log('set terminal process ext host proxy', this._process); } else { const forceExtHostProcess = (this._configHelper.config as any).extHostProcess; if (shellLaunchConfig.cwd && typeof shellLaunchConfig.cwd === 'object') { diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index 91fd6e142eb..2d0fbb433ee 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -227,6 +227,7 @@ export interface ITerminalService { onInstanceDimensionsChanged: Event; onInstanceMaximumDimensionsChanged: Event; onInstanceRequestExtHostProcess: Event; + onInstanceRequestVirtualProcess: Event; onInstancesChanged: Event; onInstanceTitleChanged: Event; onActiveInstanceChanged: Event; @@ -294,6 +295,7 @@ export interface ITerminalService { extHostReady(remoteAuthority: string): void; requestExtHostProcess(proxy: ITerminalProcessExtHostProxy, shellLaunchConfig: IShellLaunchConfig, activeWorkspaceRootUri: URI, cols: number, rows: number, isWorkspaceShellAllowed: boolean): void; + requestVirtualProcess(proxy: ITerminalProcessExtHostProxy): void; } /** diff --git a/src/vs/workbench/contrib/terminal/common/terminalProcessExtHostProxy.ts b/src/vs/workbench/contrib/terminal/common/terminalProcessExtHostProxy.ts index 097d3b3145d..edc4cbb459c 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalProcessExtHostProxy.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalProcessExtHostProxy.ts @@ -51,14 +51,21 @@ export class TerminalProcessExtHostProxy extends Disposable implements ITerminal @IRemoteAgentService readonly remoteAgentService: IRemoteAgentService ) { super(); - remoteAgentService.getEnvironment().then(env => { - if (!env) { - throw new Error('Could not fetch environment'); + + // Request a process if needed, if this is a virtual process this step can be skipped as + // there is no real "process" and we know it's ready on the ext host already. + if (shellLaunchConfig.isVirtualProcess) { + this._terminalService.requestVirtualProcess(this); + } else { + remoteAgentService.getEnvironment().then(env => { + if (!env) { + throw new Error('Could not fetch environment'); + } + this._terminalService.requestExtHostProcess(this, shellLaunchConfig, activeWorkspaceRootUri, cols, rows, configHelper.checkWorkspaceShellPermissions(env.os)); + }); + if (!hasReceivedResponse) { + setTimeout(() => this._onProcessTitleChanged.fire(nls.localize('terminal.integrated.starting', "Starting...")), 0); } - this._terminalService.requestExtHostProcess(this, shellLaunchConfig, activeWorkspaceRootUri, cols, rows, configHelper.checkWorkspaceShellPermissions(env.os)); - }); - if (!hasReceivedResponse) { - setTimeout(() => this._onProcessTitleChanged.fire(nls.localize('terminal.integrated.starting', "Starting...")), 0); } } diff --git a/src/vs/workbench/contrib/terminal/common/terminalService.ts b/src/vs/workbench/contrib/terminal/common/terminalService.ts index a5d78c06cf5..6aed26e5885 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalService.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalService.ts @@ -55,6 +55,8 @@ export abstract class TerminalService implements ITerminalService { public get onInstanceProcessIdReady(): Event { return this._onInstanceProcessIdReady.event; } protected readonly _onInstanceRequestExtHostProcess = new Emitter(); public get onInstanceRequestExtHostProcess(): Event { return this._onInstanceRequestExtHostProcess.event; } + protected readonly _onInstanceRequestVirtualProcess = new Emitter(); + public get onInstanceRequestVirtualProcess(): Event { return this._onInstanceRequestVirtualProcess.event; } protected readonly _onInstanceDimensionsChanged = new Emitter(); public get onInstanceDimensionsChanged(): Event { return this._onInstanceDimensionsChanged.event; } protected readonly _onInstanceMaximumDimensionsChanged = new Emitter(); @@ -142,6 +144,11 @@ export abstract class TerminalService implements ITerminalService { }); } + public requestVirtualProcess(proxy: ITerminalProcessExtHostProxy): void { + // Don't need to wait on extensions here as this can only be triggered by an extension + this._onInstanceRequestVirtualProcess.fire(proxy); + } + public extHostReady(remoteAuthority: string): void { this._extHostsReady[remoteAuthority] = true; } From 29303c819d101726826a68fed2190fa692cbbd50 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 1 Jul 2019 16:14:13 -0700 Subject: [PATCH 0855/1449] Get input working --- src/vs/vscode.proposed.d.ts | 4 ++-- .../api/browser/mainThreadTerminalService.ts | 5 ++++- .../api/node/extHostTerminalService.ts | 18 ++++++------------ .../terminal/browser/terminalProcessManager.ts | 9 ++++++++- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index df2dc250d13..a545270f657 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1294,9 +1294,9 @@ declare module 'vscode' { onDidChangeDimensions?(dimensions: TerminalDimensions): void; /** - * F + * This is called when the user closes the terminal. */ - onDidShutdownTerminal(): void; + onDidShutdownTerminal?(): void; } //#endregion diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index 558df53ba74..81e26f293e0 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -262,7 +262,10 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape private _onTerminalRequestVirtualProcess(proxy: ITerminalProcessExtHostProxy): void { console.log('_onTerminalRequestVirtualProcess', proxy); this._terminalProcesses[proxy.terminalId] = proxy; - proxy.onInput(data => this._proxy.$acceptProcessInput(proxy.terminalId, data)); + proxy.onInput(data => { + console.log('_onTerminalRequestVirtualProcess onInput', data); + this._proxy.$acceptProcessInput(proxy.terminalId, data); + }); proxy.onResize(dimensions => this._proxy.$acceptProcessResize(proxy.terminalId, dimensions.cols, dimensions.rows)); proxy.onShutdown(immediate => this._proxy.$acceptProcessShutdown(proxy.terminalId, immediate)); proxy.onRequestCwd(() => this._proxy.$acceptProcessRequestCwd(proxy.terminalId)); diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 8ebbbf4f339..79ab9893e4e 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -328,17 +328,8 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { public createVirtualProcessTerminal(options: vscode.TerminalVirtualProcessOptions): vscode.Terminal { const terminal = new ExtHostTerminal(this._proxy, options.name); - terminal.createVirtualProcess().then(() => { - const id = terminal._id; - console.log('virtual process id: ' + terminal._id); - // TODO: The ID is ready now - const p = new ExtHostVirtualProcess(options.virtualProcess); - p.onProcessReady((e: { pid: number, cwd: string }) => this._proxy.$sendProcessReady(id, e.pid, e.cwd)); - p.onProcessTitleChanged(title => this._proxy.$sendProcessTitle(id, title)); - p.onProcessData(data => this._proxy.$sendProcessData(id, data)); - p.onProcessExit(exitCode => this._onProcessExit(id, exitCode)); - this._terminalProcesses[terminal._id] = p; - }); + const p = new ExtHostVirtualProcess(options.virtualProcess); + terminal.createVirtualProcess().then(() => this._setupExtHostProcessListeners(terminal._id, p)); this._terminals.push(terminal); return terminal; } @@ -571,7 +562,10 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { // TODO: Support conpty on remote, it doesn't seem to work for some reason? // TODO: When conpty is enabled, only enable it when accessibilityMode is off const enableConpty = false; //terminalConfig.get('windowsEnableConpty') as boolean; - const p = new TerminalProcess(shellLaunchConfig, initialCwd, cols, rows, env, enableConpty, this._logService); + this._setupExtHostProcessListeners(id, new TerminalProcess(shellLaunchConfig, initialCwd, cols, rows, env, enableConpty, this._logService)); + } + + private _setupExtHostProcessListeners(id: number, p: ITerminalChildProcess): void { p.onProcessReady((e: { pid: number, cwd: string }) => this._proxy.$sendProcessReady(id, e.pid, e.cwd)); p.onProcessTitleChanged(title => this._proxy.$sendProcessTitle(id, title)); p.onProcessData(data => this._proxy.$sendProcessData(id, data)); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts index a08182cb91f..55b186aef7a 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts @@ -29,6 +29,11 @@ const LAUNCHING_DURATION = 500; */ const LATENCY_MEASURING_INTERVAL = 1000; +enum ProcessType { + Process, + VirtualProcess +} + /** * Holds all state related to the creation and management of terminal processes. * @@ -46,6 +51,7 @@ export class TerminalProcessManager implements ITerminalProcessManager { public userHome: string | undefined; private _process: ITerminalChildProcess | null = null; + private _processType: ProcessType = ProcessType.Process; private _preLaunchInputQueue: string[] = []; private _latency: number = -1; private _latencyRequest: Promise; @@ -104,6 +110,7 @@ export class TerminalProcessManager implements ITerminalProcessManager { isScreenReaderModeEnabled: boolean ): Promise { if (shellLaunchConfig.isVirtualProcess) { + this._processType = ProcessType.VirtualProcess; this._process = this._instantiationService.createInstance(TerminalProcessExtHostProxy, this._terminalId, shellLaunchConfig, undefined, cols, rows, this._configHelper); console.log('set terminal process ext host proxy', this._process); } else { @@ -210,7 +217,7 @@ export class TerminalProcessManager implements ITerminalProcessManager { } public write(data: string): void { - if (this.shellProcessId) { + if (this.shellProcessId || this._processType === ProcessType.VirtualProcess) { if (this._process) { // Send data if the pty is ready this._process.input(data); From c35b88a7a28d9250e6742648a24c0c76ffbdbbfc Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 1 Jul 2019 16:33:10 -0700 Subject: [PATCH 0856/1449] Add queue system --- .../api/node/extHostTerminalService.ts | 42 ++++++++++++++++--- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 79ab9893e4e..e1e2e2d032d 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -22,6 +22,7 @@ import { ExtHostVariableResolverService } from 'vs/workbench/api/node/extHostDeb import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; import { getSystemShell, detectAvailableShells } from 'vs/workbench/contrib/terminal/node/terminal'; import { getMainProcessParentEnv } from 'vs/workbench/contrib/terminal/node/terminalEnvironment'; +import { IDisposable } from 'vs/base/common/lifecycle'; const RENDERER_NO_PROCESS_ID = -1; @@ -329,7 +330,11 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { public createVirtualProcessTerminal(options: vscode.TerminalVirtualProcessOptions): vscode.Terminal { const terminal = new ExtHostTerminal(this._proxy, options.name); const p = new ExtHostVirtualProcess(options.virtualProcess); - terminal.createVirtualProcess().then(() => this._setupExtHostProcessListeners(terminal._id, p)); + terminal.createVirtualProcess().then(() => { + this._setupExtHostProcessListeners(terminal._id, p); + // TODO: Why isn't 1 being send from extension? + p.startSendingEvents(); + }); this._terminals.push(terminal); return terminal; } @@ -699,6 +704,9 @@ class ApiRequest { } class ExtHostVirtualProcess implements ITerminalChildProcess { + private _queuedEvents: (IQueuedEvent | IQueuedEvent | IQueuedEvent<{ pid: number, cwd: string }>)[] = []; + private _queueDisposables: IDisposable[] | undefined; + private readonly _onProcessData = new Emitter(); public get onProcessData(): Event { return this._onProcessData.event; } private readonly _onProcessExit = new Emitter(); @@ -711,13 +719,13 @@ class ExtHostVirtualProcess implements ITerminalChildProcess { constructor( private readonly _virtualProcess: vscode.TerminalVirtualProcess ) { - // TODO: Events need to be buffered until the terminal id is set - this._virtualProcess.write(e => this._onProcessData.fire(e)); + this._queueDisposables = []; + this._queueDisposables.push(this._virtualProcess.write(e => this._queuedEvents.push({ emitter: this._onProcessData, data: e }))); if (this._virtualProcess.exit) { - this._virtualProcess.exit(e => this._onProcessExit.fire(e)); + this._queueDisposables.push(this._virtualProcess.exit(e => this._queuedEvents.push({ emitter: this._onProcessExit, data: e }))); } + // TODO: Handle overrideDimensions, use an optional event on the interface? if (this._virtualProcess.overrideDimensions) { - // TODO: Implement this } } @@ -752,4 +760,26 @@ class ExtHostVirtualProcess implements ITerminalChildProcess { return Promise.resolve(0); } -} \ No newline at end of file + startSendingEvents(): void { + // Flush all buffered events + this._queuedEvents.forEach(e => { + e.emitter.fire(e.data); + }); + this._queuedEvents = []; + this._queueDisposables = undefined; + + // Attach the real listeners + this._virtualProcess.write(e => this._onProcessData.fire(e)); + if (this._virtualProcess.exit) { + this._virtualProcess.exit(e => this._onProcessExit.fire(e)); + } + if (this._virtualProcess.overrideDimensions) { + // TODO: Implement this + } + } +} + +interface IQueuedEvent { + emitter: Emitter; + data: T; +} From cc9418df0c0973ef7ad44e30bd62cfee079e9d18 Mon Sep 17 00:00:00 2001 From: Rachel Macfarlane Date: Mon, 1 Jul 2019 16:57:34 -0700 Subject: [PATCH 0857/1449] Fix #76440, comment thread collapsible state incorrectly set --- .../workbench/contrib/comments/browser/commentThreadWidget.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts b/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts index 92a0c5c183d..ce8407db283 100644 --- a/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts +++ b/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts @@ -127,7 +127,7 @@ export class ReviewZoneWidget extends ZoneWidget implements ICommentThreadWidget this._commentThreadContextValue = contextKeyService.createKey('commentThread', _commentThread.contextValue); this._resizeObserver = null; - this._isExpanded = _commentThread.collapsibleState ? _commentThread.collapsibleState === modes.CommentThreadCollapsibleState.Expanded : undefined; + this._isExpanded = _commentThread.collapsibleState === modes.CommentThreadCollapsibleState.Expanded; this._globalToDispose = []; this._commentThreadDisposables = []; this._submitActionsDisposables = []; From ae977ba1e0cd6c9e1b22d9695ecbd622960bea30 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 1 Jul 2019 16:57:43 -0700 Subject: [PATCH 0858/1449] Make sure we always kill the syntax server when the semantic server exists --- .../typescript-language-features/src/tsServer/server.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/extensions/typescript-language-features/src/tsServer/server.ts b/extensions/typescript-language-features/src/tsServer/server.ts index c51aab0fa4b..f10b02abf8e 100644 --- a/extensions/typescript-language-features/src/tsServer/server.ts +++ b/extensions/typescript-language-features/src/tsServer/server.ts @@ -311,7 +311,10 @@ export class SyntaxRoutingTsServer extends Disposable implements ITypeScriptServ this._register(syntaxServer.onEvent(e => this._onEvent.fire(e))); this._register(semanticServer.onEvent(e => this._onEvent.fire(e))); - this._register(semanticServer.onExit(e => this._onExit.fire(e))); + this._register(semanticServer.onExit(e => { + this._onExit.fire(e); + this.syntaxServer.kill(); + })); this._register(semanticServer.onError(e => this._onError.fire(e))); } From 4727c9a0455ff30960e1c2e7b445734892b04238 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 1 Jul 2019 17:04:00 -0700 Subject: [PATCH 0859/1449] Use Set instead of array + object map --- .../services/themes/browser/workbenchThemeService.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/services/themes/browser/workbenchThemeService.ts b/src/vs/workbench/services/themes/browser/workbenchThemeService.ts index a70a2d7c92e..d17412a1930 100644 --- a/src/vs/workbench/services/themes/browser/workbenchThemeService.ts +++ b/src/vs/workbench/services/themes/browser/workbenchThemeService.ts @@ -372,18 +372,16 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { } private updateDynamicCSSRules(themeData: ITheme) { - let cssRules: string[] = []; - let hasRule: { [rule: string]: boolean } = {}; - let ruleCollector = { + const cssRules = new Set(); + const ruleCollector = { addRule: (rule: string) => { - if (!hasRule[rule]) { - cssRules.push(rule); - hasRule[rule] = true; + if (!cssRules.has(rule)) { + cssRules.add(rule); } } }; themingRegistry.getThemingParticipants().forEach(p => p(themeData, ruleCollector, this.environmentService)); - _applyRules(cssRules.join('\n'), colorThemeRulesClassName); + _applyRules([...cssRules].join('\n'), colorThemeRulesClassName); } private applyTheme(newTheme: ColorThemeData, settingsTarget: ConfigurationTarget | undefined | 'auto', silent = false): Promise { From 612901a9e9317faf4d76173db200b6fca6bcfbea Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 1 Jul 2019 17:29:59 -0700 Subject: [PATCH 0860/1449] Replacing object map with true map --- .../browser/services/codeEditorServiceImpl.ts | 13 ++++++------- src/vs/editor/contrib/colorPicker/colorDetector.ts | 8 ++++---- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/vs/editor/browser/services/codeEditorServiceImpl.ts b/src/vs/editor/browser/services/codeEditorServiceImpl.ts index 7ad0bcc4078..67822938da1 100644 --- a/src/vs/editor/browser/services/codeEditorServiceImpl.ts +++ b/src/vs/editor/browser/services/codeEditorServiceImpl.ts @@ -17,18 +17,17 @@ import { ITheme, IThemeService, ThemeColor } from 'vs/platform/theme/common/them export abstract class CodeEditorServiceImpl extends AbstractCodeEditorService { private readonly _styleSheet: HTMLStyleElement; - private readonly _decorationOptionProviders: { [key: string]: IModelDecorationOptionsProvider }; + private readonly _decorationOptionProviders = new Map(); private readonly _themeService: IThemeService; constructor(@IThemeService themeService: IThemeService, styleSheet = dom.createStyleSheet()) { super(); this._styleSheet = styleSheet; - this._decorationOptionProviders = Object.create(null); this._themeService = themeService; } public registerDecorationType(key: string, options: IDecorationRenderOptions, parentTypeKey?: string): void { - let provider = this._decorationOptionProviders[key]; + let provider = this._decorationOptionProviders.get(key); if (!provider) { const providerArgs: ProviderArguments = { styleSheet: this._styleSheet, @@ -41,17 +40,17 @@ export abstract class CodeEditorServiceImpl extends AbstractCodeEditorService { } else { provider = new DecorationSubTypeOptionsProvider(this._themeService, providerArgs); } - this._decorationOptionProviders[key] = provider; + this._decorationOptionProviders.set(key, provider); } provider.refCount++; } public removeDecorationType(key: string): void { - const provider = this._decorationOptionProviders[key]; + const provider = this._decorationOptionProviders.get(key); if (provider) { provider.refCount--; if (provider.refCount <= 0) { - delete this._decorationOptionProviders[key]; + this._decorationOptionProviders.delete(key); provider.dispose(); this.listCodeEditors().forEach((ed) => ed.removeDecorations(key)); } @@ -59,7 +58,7 @@ export abstract class CodeEditorServiceImpl extends AbstractCodeEditorService { } public resolveDecorationOptions(decorationTypeKey: string, writable: boolean): IModelDecorationOptions { - const provider = this._decorationOptionProviders[decorationTypeKey]; + const provider = this._decorationOptionProviders.get(decorationTypeKey); if (!provider) { throw new Error('Unknown decoration type key: ' + decorationTypeKey); } diff --git a/src/vs/editor/contrib/colorPicker/colorDetector.ts b/src/vs/editor/contrib/colorPicker/colorDetector.ts index 93ce80a2499..1f8da300725 100644 --- a/src/vs/editor/contrib/colorPicker/colorDetector.ts +++ b/src/vs/editor/contrib/colorPicker/colorDetector.ts @@ -36,7 +36,7 @@ export class ColorDetector extends Disposable implements IEditorContribution { private _colorDatas = new Map(); private _colorDecoratorIds: string[] = []; - private readonly _decorationsTypes: { [key: string]: boolean } = {}; + private readonly _decorationsTypes = new Set(); private _isEnabled: boolean; @@ -180,7 +180,7 @@ export class ColorDetector extends Disposable implements IEditorContribution { let color = `rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, ${rgba.a})`; let key = 'colorBox-' + subKey; - if (!this._decorationsTypes[key] && !newDecorationsTypes[key]) { + if (!this._decorationsTypes.has(key) && !newDecorationsTypes[key]) { this._codeEditorService.registerDecorationType(key, { before: { contentText: ' ', @@ -210,7 +210,7 @@ export class ColorDetector extends Disposable implements IEditorContribution { }); } - for (let subType in this._decorationsTypes) { + for (const subType of this._decorationsTypes) { if (!newDecorationsTypes[subType]) { this._codeEditorService.removeDecorationType(subType); } @@ -223,7 +223,7 @@ export class ColorDetector extends Disposable implements IEditorContribution { this._decorationsIds = this._editor.deltaDecorations(this._decorationsIds, []); this._colorDecoratorIds = this._editor.deltaDecorations(this._colorDecoratorIds, []); - for (let subType in this._decorationsTypes) { + for (const subType of this._decorationsTypes) { this._codeEditorService.removeDecorationType(subType); } } From de320f40612792cf1e31fd351bcc8ebd884fc85c Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 1 Jul 2019 17:32:12 -0700 Subject: [PATCH 0861/1449] Use a proper Map for ICommandsMap Changes the `ICommandsMap` type to be a proper map. This can help catch type errors and also gets us closer to being able to disable the tsconfig suppressImplicitAnyIndexErrors workaround --- src/vs/platform/actions/common/actions.ts | 41 ++++++++----------- src/vs/platform/commands/common/commands.ts | 15 +++---- .../platform/commands/test/commands.test.ts | 8 ++-- .../keybinding/common/keybindingResolver.ts | 4 +- .../api/browser/mainThreadCommands.ts | 9 ++-- .../keybinding/browser/keybindingService.ts | 6 +-- .../common/keybindingsEditorModel.ts | 2 +- .../api/extHostApiCommands.test.ts | 5 ++- 8 files changed, 43 insertions(+), 47 deletions(-) diff --git a/src/vs/platform/actions/common/actions.ts b/src/vs/platform/actions/common/actions.ts index 5cf2b340070..d4a1359982c 100644 --- a/src/vs/platform/actions/common/actions.ts +++ b/src/vs/platform/actions/common/actions.ts @@ -121,64 +121,59 @@ export interface IMenuService { createMenu(id: MenuId, scopedKeybindingService: IContextKeyService): IMenu; } +export type ICommandsMap = Map; + export interface IMenuRegistry { addCommand(userCommand: ICommandAction): IDisposable; - getCommand(id: string): ICommandAction; + getCommand(id: string): ICommandAction | undefined; getCommands(): ICommandsMap; appendMenuItem(menu: MenuId, item: IMenuItem | ISubmenuItem): IDisposable; getMenuItems(loc: MenuId): Array; readonly onDidChangeMenu: Event; } -export interface ICommandsMap { - [id: string]: ICommandAction; -} - export const MenuRegistry: IMenuRegistry = new class implements IMenuRegistry { - private readonly _commands: { [id: string]: ICommandAction } = Object.create(null); - private readonly _menuItems: { [loc: number]: Array } = Object.create(null); + private readonly _commands = new Map(); + private readonly _menuItems = new Map>(); private readonly _onDidChangeMenu = new Emitter(); readonly onDidChangeMenu: Event = this._onDidChangeMenu.event; addCommand(command: ICommandAction): IDisposable { - this._commands[command.id] = command; + this._commands.set(command.id, command); this._onDidChangeMenu.fire(MenuId.CommandPalette); return { dispose: () => { - if (delete this._commands[command.id]) { + if (this._commands.delete(command.id)) { this._onDidChangeMenu.fire(MenuId.CommandPalette); } } }; } - getCommand(id: string): ICommandAction { - return this._commands[id]; + getCommand(id: string): ICommandAction | undefined { + return this._commands.get(id); } getCommands(): ICommandsMap { - const result: ICommandsMap = Object.create(null); - for (const key in this._commands) { - result[key] = this.getCommand(key); - } - return result; + return new Map(this._commands.entries()); } appendMenuItem(id: MenuId, item: IMenuItem | ISubmenuItem): IDisposable { - let array = this._menuItems[id]; + let array = this._menuItems.get(id); if (!array) { - this._menuItems[id] = array = [item]; + array = [item]; + this._menuItems.set(id, array); } else { array.push(item); } this._onDidChangeMenu.fire(id); return { dispose: () => { - const idx = array.indexOf(item); + const idx = array!.indexOf(item); if (idx >= 0) { - array.splice(idx, 1); + array!.splice(idx, 1); this._onDidChangeMenu.fire(id); } } @@ -186,7 +181,7 @@ export const MenuRegistry: IMenuRegistry = new class implements IMenuRegistry { } getMenuItems(id: MenuId): Array { - const result = (this._menuItems[id] || []).slice(0); + const result = (this._menuItems.get(id) || []).slice(0); if (id === MenuId.CommandPalette) { // CommandPalette is special because it shows @@ -207,9 +202,9 @@ export const MenuRegistry: IMenuRegistry = new class implements IMenuRegistry { set.add(alt.id); } } - for (let id in this._commands) { + for (const [id, command] of this._commands) { if (!set.has(id)) { - result.push({ command: this._commands[id] }); + result.push({ command }); } } } diff --git a/src/vs/platform/commands/common/commands.ts b/src/vs/platform/commands/common/commands.ts index 91541847a17..7605efb866d 100644 --- a/src/vs/platform/commands/common/commands.ts +++ b/src/vs/platform/commands/common/commands.ts @@ -22,9 +22,7 @@ export interface ICommandService { executeCommand(commandId: string, ...args: any[]): Promise; } -export interface ICommandsMap { - [id: string]: ICommand; -} +export type ICommandsMap = Map; export interface ICommandHandler { (accessor: ServicesAccessor, ...args: any[]): void; @@ -122,10 +120,13 @@ export const CommandsRegistry: ICommandRegistry = new class implements ICommandR } getCommands(): ICommandsMap { - const result: ICommandsMap = Object.create(null); - this._commands.forEach((value, key) => { - result[key] = this.getCommand(key)!; - }); + const result = new Map(); + for (const key of this._commands.keys()) { + const command = this.getCommand(key); + if (command) { + result.set(key, command); + } + } return result; } }; diff --git a/src/vs/platform/commands/test/commands.test.ts b/src/vs/platform/commands/test/commands.test.ts index 02e019154ff..33c613935fb 100644 --- a/src/vs/platform/commands/test/commands.test.ts +++ b/src/vs/platform/commands/test/commands.test.ts @@ -68,10 +68,10 @@ suite('Command Tests', function () { } }); - CommandsRegistry.getCommands()['test'].handler.apply(undefined, [undefined!, 'string']); - CommandsRegistry.getCommands()['test2'].handler.apply(undefined, [undefined!, 'string']); - assert.throws(() => CommandsRegistry.getCommands()['test3'].handler.apply(undefined, [undefined!, 'string'])); - assert.equal(CommandsRegistry.getCommands()['test3'].handler.apply(undefined, [undefined!, 1]), true); + CommandsRegistry.getCommands().get('test')!.handler.apply(undefined, [undefined!, 'string']); + CommandsRegistry.getCommands().get('test2')!.handler.apply(undefined, [undefined!, 'string']); + assert.throws(() => CommandsRegistry.getCommands().get('test3')!.handler.apply(undefined, [undefined!, 'string'])); + assert.equal(CommandsRegistry.getCommands().get('test3')!.handler.apply(undefined, [undefined!, 1]), true); }); }); diff --git a/src/vs/platform/keybinding/common/keybindingResolver.ts b/src/vs/platform/keybinding/common/keybindingResolver.ts index 3e3306d8747..2b36653666d 100644 --- a/src/vs/platform/keybinding/common/keybindingResolver.ts +++ b/src/vs/platform/keybinding/common/keybindingResolver.ts @@ -334,10 +334,10 @@ export class KeybindingResolver { } unboundCommands.push(id); }; - for (const id in MenuRegistry.getCommands()) { + for (const id of MenuRegistry.getCommands().keys()) { addCommand(id, true); } - for (const id in CommandsRegistry.getCommands()) { + for (const id of CommandsRegistry.getCommands().keys()) { addCommand(id, false); } diff --git a/src/vs/workbench/api/browser/mainThreadCommands.ts b/src/vs/workbench/api/browser/mainThreadCommands.ts index fcf82fcfdb8..2f4d043f048 100644 --- a/src/vs/workbench/api/browser/mainThreadCommands.ts +++ b/src/vs/workbench/api/browser/mainThreadCommands.ts @@ -36,10 +36,9 @@ export class MainThreadCommands implements MainThreadCommandsShape { return this._proxy.$getContributedCommandHandlerDescriptions().then(result => { // add local commands const commands = CommandsRegistry.getCommands(); - for (let id in commands) { - let { description } = commands[id]; - if (description) { - result[id] = description; + for (const [id, command] of commands) { + if (command.description) { + result[id] = command.description; } } @@ -79,7 +78,7 @@ export class MainThreadCommands implements MainThreadCommandsShape { } $getCommands(): Promise { - return Promise.resolve(Object.keys(CommandsRegistry.getCommands())); + return Promise.resolve([...CommandsRegistry.getCommands().keys()]); } } diff --git a/src/vs/workbench/services/keybinding/browser/keybindingService.ts b/src/vs/workbench/services/keybinding/browser/keybindingService.ts index 60509939c87..37ead9db496 100644 --- a/src/vs/workbench/services/keybinding/browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/browser/keybindingService.ts @@ -675,8 +675,8 @@ function updateSchema() { }; const allCommands = CommandsRegistry.getCommands(); - for (let commandId in allCommands) { - const commandDescription = allCommands[commandId].description; + for (const [commandId, command] of allCommands) { + const commandDescription = command.description; addKnownCommand(commandId, commandDescription ? commandDescription.description : undefined); @@ -704,7 +704,7 @@ function updateSchema() { } const menuCommands = MenuRegistry.getCommands(); - for (let commandId in menuCommands) { + for (const commandId of menuCommands.keys()) { addKnownCommand(commandId); } } diff --git a/src/vs/workbench/services/preferences/common/keybindingsEditorModel.ts b/src/vs/workbench/services/preferences/common/keybindingsEditorModel.ts index 0f80e25b1d2..5dde33ee560 100644 --- a/src/vs/workbench/services/preferences/common/keybindingsEditorModel.ts +++ b/src/vs/workbench/services/preferences/common/keybindingsEditorModel.ts @@ -210,7 +210,7 @@ export class KeybindingsEditorModel extends EditorModel { } private static toKeybindingEntry(command: string, keybindingItem: ResolvedKeybindingItem, workbenchActionsRegistry: IWorkbenchActionRegistry, editorActions: { [id: string]: string; }): IKeybindingItem { - const menuCommand = MenuRegistry.getCommand(command); + const menuCommand = MenuRegistry.getCommand(command)!; const editorActionLabel = editorActions[command]; return { keybinding: keybindingItem.resolvedKeybinding, diff --git a/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts b/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts index 8eb327c11c7..779c40e9656 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts @@ -68,10 +68,11 @@ suite('ExtHostLanguageFeatureCommands', function () { instantiationService.stub(ICommandService, { _serviceBrand: undefined, executeCommand(id: string, args: any): any { - if (!CommandsRegistry.getCommands()[id]) { + const command = CommandsRegistry.getCommands().get(id); + if (!command) { return Promise.reject(new Error(id + ' NOT known')); } - let { handler } = CommandsRegistry.getCommands()[id]; + const { handler } = command; return Promise.resolve(instantiationService.invokeFunction(handler, args)); } }); From 2c3e8a8e39d568464e4a14ab861ef2658f25612a Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 2 Jul 2019 07:52:27 +0200 Subject: [PATCH 0862/1449] fix one for #76442 --- src/vs/code/electron-main/window.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index 37f1ee30537..bbfe1bd21a0 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -340,12 +340,14 @@ export class CodeWindow extends Disposable implements ICodeWindow { }); this._win.webContents.session.webRequest.onHeadersReceived(null!, (details, callback) => { - const contentType: string[] = (details.responseHeaders['content-type'] || details.responseHeaders['Content-Type']); + const responseHeaders = details.responseHeaders as { [key: string]: string[] }; + + const contentType: string[] = (responseHeaders['content-type'] || responseHeaders['Content-Type']); if (contentType && Array.isArray(contentType) && contentType.some(x => x.toLowerCase().indexOf('image/svg') >= 0)) { return callback({ cancel: true }); } - return callback({ cancel: false, responseHeaders: details.responseHeaders }); + return callback({ cancel: false, responseHeaders }); }); // Remember that we loaded From b472feaafa2effea078280b8b1d62cde2a6245bf Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 2 Jul 2019 08:45:47 +0200 Subject: [PATCH 0863/1449] add node build script --- build/lib/node.js | 15 +++++++++++++++ build/lib/node.ts | 16 ++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 build/lib/node.js create mode 100644 build/lib/node.ts diff --git a/build/lib/node.js b/build/lib/node.js new file mode 100644 index 00000000000..403ae3d9657 --- /dev/null +++ b/build/lib/node.js @@ -0,0 +1,15 @@ +"use strict"; +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +const path = require("path"); +const fs = require("fs"); +const root = path.dirname(path.dirname(__dirname)); +const yarnrcPath = path.join(root, 'remote', '.yarnrc'); +const yarnrc = fs.readFileSync(yarnrcPath, 'utf8'); +const version = /^target\s+"([^"]+)"$/m.exec(yarnrc)[1]; +const node = process.platform === 'win32' ? 'node.exe' : 'node'; +const nodePath = path.join(root, '.build', 'node', `v${version}`, `${process.platform}-${process.arch}`, node); +console.log(nodePath); diff --git a/build/lib/node.ts b/build/lib/node.ts new file mode 100644 index 00000000000..64397034461 --- /dev/null +++ b/build/lib/node.ts @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as path from 'path'; +import * as fs from 'fs'; + +const root = path.dirname(path.dirname(__dirname)); +const yarnrcPath = path.join(root, 'remote', '.yarnrc'); +const yarnrc = fs.readFileSync(yarnrcPath, 'utf8'); +const version = /^target\s+"([^"]+)"$/m.exec(yarnrc)![1]; +const node = process.platform === 'win32' ? 'node.exe' : 'node'; +const nodePath = path.join(root, '.build', 'node', `v${version}`, `${process.platform}-${process.arch}`, node); + +console.log(nodePath); \ No newline at end of file From ff8b62430df15dde48a0bc587624650be0f56440 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 2 Jul 2019 08:55:07 +0200 Subject: [PATCH 0864/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 183da8019eb..698da608de9 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "283437b4d514089d746fb98338d4ec831e588e06", + "distro": "8ca3202293a9a3370a1faf2702646e1ca3a2fc17", "author": { "name": "Microsoft Corporation" }, From 06d2f9c05de76f6b631e27ae492e6aae47887d72 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Tue, 2 Jul 2019 09:54:28 +0200 Subject: [PATCH 0865/1449] Update C++ grammar to get macro fix Also added a macro to the test Fixes #76430 --- extensions/cpp/syntaxes/cpp.tmLanguage.json | 57 ++++++++- .../cpp/test/colorize-fixtures/test.cpp | 2 + .../cpp/test/colorize-results/test_cpp.json | 110 ++++++++++++++++++ 3 files changed, 168 insertions(+), 1 deletion(-) diff --git a/extensions/cpp/syntaxes/cpp.tmLanguage.json b/extensions/cpp/syntaxes/cpp.tmLanguage.json index f65768b6ad3..1b9cf4b3a77 100644 --- a/extensions/cpp/syntaxes/cpp.tmLanguage.json +++ b/extensions/cpp/syntaxes/cpp.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/jeff-hykin/cpp-textmate-grammar/commit/9c4f4b3291538d9f5144f02d3b6af877b84f2cb2", + "version": "https://github.com/jeff-hykin/cpp-textmate-grammar/commit/19ef66475b6bb21b5ed466cbcf8cef4e1b1fa212", "name": "C++", "scopeName": "source.cpp", "patterns": [ @@ -57,6 +57,9 @@ }, "ever_present_context": { "patterns": [ + { + "include": "#single_line_macro" + }, { "include": "#preprocessor_rule_enabled" }, @@ -11193,6 +11196,58 @@ "match": "(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))#define.*(? using namespace std; +#define EXTERN_C extern "C" + class Rectangle { int width, height; public: diff --git a/extensions/cpp/test/colorize-results/test_cpp.json b/extensions/cpp/test/colorize-results/test_cpp.json index 89be32fb7c1..500a487e9ec 100644 --- a/extensions/cpp/test/colorize-results/test_cpp.json +++ b/extensions/cpp/test/colorize-results/test_cpp.json @@ -153,6 +153,116 @@ "hc_black": "default: #FFFFFF" } }, + { + "c": "#", + "t": "source.cpp source.cpp meta.preprocessor.macro.cpp keyword.control.directive.define.cpp punctuation.definition.directive.cpp", + "r": { + "dark_plus": "keyword.control: #C586C0", + "light_plus": "keyword.control: #AF00DB", + "dark_vs": "keyword.control: #569CD6", + "light_vs": "keyword.control: #0000FF", + "hc_black": "keyword.control: #C586C0" + } + }, + { + "c": "define", + "t": "source.cpp source.cpp meta.preprocessor.macro.cpp keyword.control.directive.define.cpp", + "r": { + "dark_plus": "keyword.control: #C586C0", + "light_plus": "keyword.control: #AF00DB", + "dark_vs": "keyword.control: #569CD6", + "light_vs": "keyword.control: #0000FF", + "hc_black": "keyword.control: #C586C0" + } + }, + { + "c": " ", + "t": "source.cpp source.cpp meta.preprocessor.macro.cpp", + "r": { + "dark_plus": "meta.preprocessor: #569CD6", + "light_plus": "meta.preprocessor: #0000FF", + "dark_vs": "meta.preprocessor: #569CD6", + "light_vs": "meta.preprocessor: #0000FF", + "hc_black": "meta.preprocessor: #569CD6" + } + }, + { + "c": "EXTERN_C", + "t": "source.cpp source.cpp meta.preprocessor.macro.cpp entity.name.function.preprocessor.cpp", + "r": { + "dark_plus": "entity.name.function: #DCDCAA", + "light_plus": "entity.name.function: #795E26", + "dark_vs": "meta.preprocessor: #569CD6", + "light_vs": "meta.preprocessor: #0000FF", + "hc_black": "entity.name.function: #DCDCAA" + } + }, + { + "c": " ", + "t": "source.cpp source.cpp meta.preprocessor.macro.cpp", + "r": { + "dark_plus": "meta.preprocessor: #569CD6", + "light_plus": "meta.preprocessor: #0000FF", + "dark_vs": "meta.preprocessor: #569CD6", + "light_vs": "meta.preprocessor: #0000FF", + "hc_black": "meta.preprocessor: #569CD6" + } + }, + { + "c": "extern", + "t": "source.cpp source.cpp meta.preprocessor.macro.cpp meta.block.extern.cpp meta.head.extern.cpp storage.type.extern.cpp", + "r": { + "dark_plus": "storage.type: #569CD6", + "light_plus": "storage.type: #0000FF", + "dark_vs": "storage.type: #569CD6", + "light_vs": "storage.type: #0000FF", + "hc_black": "storage.type: #569CD6" + } + }, + { + "c": " ", + "t": "source.cpp source.cpp meta.preprocessor.macro.cpp meta.block.extern.cpp meta.head.extern.cpp", + "r": { + "dark_plus": "meta.preprocessor: #569CD6", + "light_plus": "meta.preprocessor: #0000FF", + "dark_vs": "meta.preprocessor: #569CD6", + "light_vs": "meta.preprocessor: #0000FF", + "hc_black": "meta.preprocessor: #569CD6" + } + }, + { + "c": "\"", + "t": "source.cpp source.cpp meta.preprocessor.macro.cpp meta.block.extern.cpp meta.head.extern.cpp string.quoted.double.cpp punctuation.definition.string.begin.cpp", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" + } + }, + { + "c": "C", + "t": "source.cpp source.cpp meta.preprocessor.macro.cpp meta.block.extern.cpp meta.head.extern.cpp string.quoted.double.cpp", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" + } + }, + { + "c": "\"", + "t": "source.cpp source.cpp meta.preprocessor.macro.cpp meta.block.extern.cpp meta.head.extern.cpp string.quoted.double.cpp punctuation.definition.string.end.cpp", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" + } + }, { "c": "class", "t": "source.cpp source.cpp meta.block.class.cpp meta.head.class.cpp storage.type.class.cpp", From 44a0062a905bbe52d74ab908902b4e6e4f179a04 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 2 Jul 2019 10:11:47 +0200 Subject: [PATCH 0866/1449] Revert: do not use withFileTypes on readdir (fix #76425) --- src/vs/base/node/pfs.ts | 20 +++----------------- src/vs/base/test/node/pfs/pfs.test.ts | 18 ------------------ 2 files changed, 3 insertions(+), 35 deletions(-) diff --git a/src/vs/base/node/pfs.ts b/src/vs/base/node/pfs.ts index 7d4577e1168..14dca3d5f49 100644 --- a/src/vs/base/node/pfs.ts +++ b/src/vs/base/node/pfs.ts @@ -138,20 +138,6 @@ export async function readdir(path: string): Promise { return handleDirectoryChildren(await promisify(fs.readdir)(path)); } -export async function readdirWithFileTypes(path: string): Promise { - const children = await promisify(fs.readdir)(path, { withFileTypes: true }); - - // Mac: uses NFD unicode form on disk, but we want NFC - // See also https://github.com/nodejs/node/issues/2165 - if (platform.isMacintosh) { - for (const child of children) { - child.name = normalizeNFC(child.name); - } - } - - return children; -} - export function readdirSync(path: string): string[] { return handleDirectoryChildren(fs.readdirSync(path)); } @@ -479,12 +465,12 @@ function ensureWriteOptions(options?: IWriteFileOptions): IEnsuredWriteFileOptio } export async function readDirsInDir(dirPath: string): Promise { - const children = await readdirWithFileTypes(dirPath); + const children = await readdir(dirPath); const directories: string[] = []; for (const child of children) { - if (child.isDirectory()) { - directories.push(child.name); + if (await dirExists(join(dirPath, child))) { + directories.push(child); } } diff --git a/src/vs/base/test/node/pfs/pfs.test.ts b/src/vs/base/test/node/pfs/pfs.test.ts index 33b10c5dc34..4f09ad2b56d 100644 --- a/src/vs/base/test/node/pfs/pfs.test.ts +++ b/src/vs/base/test/node/pfs/pfs.test.ts @@ -386,24 +386,6 @@ suite('PFS', () => { } }); - test('readdirWithFileTypes', async () => { - if (canNormalize && typeof process.versions['electron'] !== 'undefined' /* needs electron */) { - const id = uuid.generateUuid(); - const parentDir = path.join(os.tmpdir(), 'vsctests', id); - const newDir = path.join(parentDir, 'pfs', id, 'öäü'); - - await pfs.mkdirp(newDir, 493); - - assert.ok(fs.existsSync(newDir)); - - const children = await pfs.readdirWithFileTypes(path.join(parentDir, 'pfs', id)); - assert.equal(children.some(n => n.name === 'öäü'), true); // Mac always converts to NFD, so - assert.equal(children.some(n => n.isDirectory()), true); - - await pfs.rimraf(parentDir); - } - }); - test('writeFile (string)', async () => { const smallData = 'Hello World'; const bigData = (new Array(100 * 1024)).join('Large String\n'); From 9348711b416cf832ae2e8e4da9c097b1652293a8 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Tue, 2 Jul 2019 10:18:13 +0200 Subject: [PATCH 0867/1449] Remove suppressImplicitAnyIndexErrors from tasks Part of #76442 --- .../workbench/contrib/tasks/browser/abstractTaskService.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts index d6efef22ba6..13c49ee0fb1 100644 --- a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts +++ b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts @@ -786,7 +786,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer }; let identifier: TaskConfig.TaskIdentifier = Objects.assign(Object.create(null), task.defines); delete identifier['_key']; - Object.keys(identifier).forEach(key => toCustomize![key] = identifier[key]); + Object.keys(identifier).forEach(key => (toCustomize)![key] = identifier[key]); if (task.configurationProperties.problemMatchers && task.configurationProperties.problemMatchers.length > 0 && Types.isStringArray(task.configurationProperties.problemMatchers)) { toCustomize.problemMatcher = task.configurationProperties.problemMatchers; } @@ -796,9 +796,9 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer } if (properties) { for (let property of Object.getOwnPropertyNames(properties)) { - let value = properties[property]; + let value = (properties)[property]; if (value !== undefined && value !== null) { - toCustomize[property] = value; + (toCustomize)[property] = value; } } } else { From 1a254a3a8de39555abe1b84b1f96f314a8259360 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 2 Jul 2019 10:19:55 +0200 Subject: [PATCH 0868/1449] yarn update-distro --- build/npm/update-distro.js | 18 ++++++++++++++++++ package.json | 3 ++- 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 build/npm/update-distro.js diff --git a/build/npm/update-distro.js b/build/npm/update-distro.js new file mode 100644 index 00000000000..947a4967d60 --- /dev/null +++ b/build/npm/update-distro.js @@ -0,0 +1,18 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +const cp = require('child_process'); +const path = require('path'); +const fs = require('fs'); + +const rootPath = path.dirname(path.dirname(path.dirname(__dirname))); +const vscodePath = path.join(rootPath, 'vscode'); +const distroPath = path.join(rootPath, 'vscode-distro'); +const commit = cp.execSync('git rev-parse HEAD', { cwd: distroPath, encoding: 'utf8' }).trim(); +const packageJsonPath = path.join(vscodePath, 'package.json'); +const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')); + +packageJson.distro = commit; +fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2)); \ No newline at end of file diff --git a/package.json b/package.json index 1eeaf09d94f..ecf3e2f1958 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,8 @@ "smoketest": "cd test/smoke && node test/index.js", "download-builtin-extensions": "node build/lib/builtInExtensions.js", "monaco-compile-check": "tsc -p src/tsconfig.monaco.json --noEmit", - "strict-initialization-watch": "tsc --watch -p src/tsconfig.json --noEmit --strictPropertyInitialization" + "strict-initialization-watch": "tsc --watch -p src/tsconfig.json --noEmit --strictPropertyInitialization", + "update-distro": "node build/npm/update-distro.js" }, "dependencies": { "applicationinsights": "1.0.8", From 73084faf86d80614c85bddef03ddb4866f301f8f Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 2 Jul 2019 10:21:11 +0200 Subject: [PATCH 0869/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 259b0ecff40..8b7653c3e1a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "8ca3202293a9a3370a1faf2702646e1ca3a2fc17", + "distro": "75609bf0699e818e21e7238528c2e354e5212904", "author": { "name": "Microsoft Corporation" }, From b5bac44688fe5c7e77243d3a85a2b99b8440f1cf Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 2 Jul 2019 10:30:44 +0200 Subject: [PATCH 0870/1449] add inverse icon --- src/vs/editor/contrib/suggest/media/Misc_inverse_16x.svg | 1 + 1 file changed, 1 insertion(+) create mode 100755 src/vs/editor/contrib/suggest/media/Misc_inverse_16x.svg diff --git a/src/vs/editor/contrib/suggest/media/Misc_inverse_16x.svg b/src/vs/editor/contrib/suggest/media/Misc_inverse_16x.svg new file mode 100755 index 00000000000..50a038657b2 --- /dev/null +++ b/src/vs/editor/contrib/suggest/media/Misc_inverse_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file From f506d66c498e04899749af4fbf6b7e8b74b6f848 Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 2 Jul 2019 10:31:04 +0200 Subject: [PATCH 0871/1449] fixes #76264 --- src/vs/workbench/contrib/files/browser/fileActions.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/files/browser/fileActions.ts b/src/vs/workbench/contrib/files/browser/fileActions.ts index 1fd4fba81b1..4d7115afb8b 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.ts @@ -1047,12 +1047,12 @@ export const pasteFileHandler = async (accessor: ServicesAccessor) => { // Cut is done. Make sure to clear cut state. explorerService.setToCopy([], false); } - if (stats.length === 1) { + if (stats.length >= 1) { const stat = stats[0]; + if (stat && !stat.isDirectory && stats.length === 1) { + await editorService.openEditor({ resource: stat.resource, options: { pinned: true, preserveFocus: true } }); + } if (stat) { - if (!stat.isDirectory) { - await editorService.openEditor({ resource: stat.resource, options: { pinned: true, preserveFocus: true } }); - } await explorerService.select(stat.resource); } } From 7111d8073089e4b2f88eb36c683ba445910dec3f Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 2 Jul 2019 10:32:17 +0200 Subject: [PATCH 0872/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8b7653c3e1a..4812bbefddc 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "75609bf0699e818e21e7238528c2e354e5212904", + "distro": "ae7f4db44d14b2893b3f918843ecb7fd750c8fcc", "author": { "name": "Microsoft Corporation" }, From 675a30a14ac1c0d20abdaf092ac4c8aaad502303 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 2 Jul 2019 10:50:38 +0200 Subject: [PATCH 0873/1449] build - switch schedule to cron syntax --- build/azure-pipelines/product-build.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 6ef418e21e9..4a1895327af 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -112,4 +112,11 @@ jobs: - LinuxAlpine - macOS steps: - - template: sync-mooncake.yml \ No newline at end of file + - template: sync-mooncake.yml + +schedules: +- cron: "0 6 * * Mon-Fri" + displayName: Mon through Fri at 6:00 + branches: + include: + - master \ No newline at end of file From 7694303571d28e423a8016fef5cd57dde4dfb95a Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 2 Jul 2019 10:51:24 +0200 Subject: [PATCH 0874/1449] :lipstick: --- build/azure-pipelines/product-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 4a1895327af..85903906f12 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -116,7 +116,7 @@ jobs: schedules: - cron: "0 6 * * Mon-Fri" - displayName: Mon through Fri at 6:00 + displayName: Mon-Fri at 6:00 branches: include: - master \ No newline at end of file From 8af1b9fe1b0b10e5b19c8e6f174b6a99634e6144 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Tue, 2 Jul 2019 11:07:48 +0200 Subject: [PATCH 0875/1449] '.' bug in file picker Fixes #76426 --- .../services/dialogs/browser/remoteFileDialog.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts b/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts index 0ae7ef8a596..6e892d18f95 100644 --- a/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts +++ b/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts @@ -388,7 +388,11 @@ export class RemoteFileDialog { const relativePath = resources.relativePath(currentDisplayUri, directUri); const isSameRoot = (this.filePickBox.value.length > 1 && currentPath.length > 1) ? equalsIgnoreCase(this.filePickBox.value.substr(0, 2), currentPath.substr(0, 2)) : false; if (relativePath && isSameRoot) { - const path = resources.joinPath(this.currentFolder, relativePath); + let path = resources.joinPath(this.currentFolder, relativePath); + const directBasename = resources.basename(directUri); + if ((directBasename === '.') || (directBasename === '..')) { + path = this.remoteUriFrom(this.pathAppend(path, directBasename)); + } return resources.hasTrailingPathSeparator(directUri) ? resources.addTrailingPathSeparator(path) : path; } else { return directUri; @@ -479,7 +483,7 @@ export class RemoteFileDialog { } catch (e) { // do nothing } - if (statWithoutTrailing && statWithoutTrailing.isDirectory && (resources.basename(valueUri) !== '.')) { + if (statWithoutTrailing && statWithoutTrailing.isDirectory) { await this.updateItems(inputUriDirname, false, resources.basename(valueUri)); this.badPath = undefined; return UpdateResult.Updated; @@ -689,7 +693,7 @@ export class RemoteFileDialog { this.busy = true; this.userEnteredPathSegment = trailing ? trailing : ''; this.autoCompletePathSegment = ''; - const newValue = trailing ? this.pathFromUri(resources.joinPath(newFolder, trailing)) : this.pathFromUri(newFolder, true); + const newValue = trailing ? this.pathAppend(newFolder, trailing) : this.pathFromUri(newFolder, true); this.currentFolder = resources.addTrailingPathSeparator(newFolder, this.separator); return this.createItems(this.currentFolder).then(items => { this.filePickBox.items = items; @@ -728,7 +732,7 @@ export class RemoteFileDialog { private pathAppend(uri: URI, additional: string): string { if ((additional === '..') || (additional === '.')) { const basePath = this.pathFromUri(uri); - return basePath + (this.endsWithSlash(basePath) ? '' : this.separator) + additional; + return basePath + this.separator + additional; } else { return this.pathFromUri(resources.joinPath(uri, additional)); } From f91bd1869c47bd574a50066e47f82ce7ef2c6ffc Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 2 Jul 2019 11:14:26 +0200 Subject: [PATCH 0876/1449] distro build: push release branches --- build/azure-pipelines/distro-build.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/build/azure-pipelines/distro-build.yml b/build/azure-pipelines/distro-build.yml index 639456ad4ce..ab8a5e778c8 100644 --- a/build/azure-pipelines/distro-build.yml +++ b/build/azure-pipelines/distro-build.yml @@ -30,7 +30,13 @@ steps: git remote add distro "https://github.com/$VSCODE_MIXIN_REPO.git" git fetch distro - git push distro origin/master:refs/heads/master + + # Push master branch into master and oss/master + git push distro origin/master:refs/heads/master origin/master:refs/heads/oss/master + + # Push every release branch into oss/release + git for-each-ref --format="%(refname:short)" refs/remotes/origin/release/* | sed 's/^origin\/\(.*\)$/\0:refs\/heads\/oss\/\1/' | xargs git push + git merge $(node -p "require('./package.json').distro") displayName: Sync & Merge Distro \ No newline at end of file From b57a00bd28bee23a982c50f36ea528c56aaffd00 Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 2 Jul 2019 11:17:40 +0200 Subject: [PATCH 0877/1449] debug: Handle disposable result of createAndFillInActionBarActions #76419 --- .../contrib/debug/browser/debugToolBar.ts | 21 +++++++++++++++---- .../contrib/debug/browser/debugViewlet.ts | 10 ++++++++- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/debug/browser/debugToolBar.ts b/src/vs/workbench/contrib/debug/browser/debugToolBar.ts index 678ff1bad19..56fda384f0d 100644 --- a/src/vs/workbench/contrib/debug/browser/debugToolBar.ts +++ b/src/vs/workbench/contrib/debug/browser/debugToolBar.ts @@ -31,6 +31,7 @@ import { createAndFillInActionBarActions, MenuEntryActionViewItem } from 'vs/pla import { IMenu, IMenuService, MenuId, MenuItemAction } from 'vs/platform/actions/common/actions'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { FocusSessionAction } from 'vs/workbench/contrib/debug/browser/debugActions'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; const DEBUG_TOOLBAR_POSITION_KEY = 'debug.actionswidgetposition'; const DEBUG_TOOLBAR_Y_KEY = 'debug.actionswidgety'; @@ -54,6 +55,7 @@ export class DebugToolBar extends Themable implements IWorkbenchContribution { private activeActions: IAction[]; private updateScheduler: RunOnceScheduler; private debugToolBarMenu: IMenu; + private disposeOnUpdate: IDisposable; private isVisible: boolean; private isBuilt: boolean; @@ -105,12 +107,17 @@ export class DebugToolBar extends Themable implements IWorkbenchContribution { return this.hide(); } - const actions = DebugToolBar.getActions(this.debugToolBarMenu, this.debugService, this.instantiationService); + const { actions, disposable } = DebugToolBar.getActions(this.debugToolBarMenu, this.debugService, this.instantiationService); if (!arrays.equals(actions, this.activeActions, (first, second) => first.id === second.id)) { this.actionBar.clear(); this.actionBar.push(actions, { icon: true, label: false }); this.activeActions = actions; } + if (this.disposeOnUpdate) { + dispose(this.disposeOnUpdate); + } + this.disposeOnUpdate = disposable; + this.show(); }, 20)); @@ -257,14 +264,17 @@ export class DebugToolBar extends Themable implements IWorkbenchContribution { dom.hide(this.$el); } - public static getActions(menu: IMenu, debugService: IDebugService, instantiationService: IInstantiationService): IAction[] { + public static getActions(menu: IMenu, debugService: IDebugService, instantiationService: IInstantiationService): { actions: IAction[], disposable: IDisposable } { const actions: IAction[] = []; - createAndFillInActionBarActions(menu, undefined, actions, () => false); + const disposable = createAndFillInActionBarActions(menu, undefined, actions, () => false); if (debugService.getViewModel().isMultiSessionView()) { actions.push(instantiationService.createInstance(FocusSessionAction, FocusSessionAction.ID, FocusSessionAction.LABEL)); } - return actions.filter(a => !(a instanceof Separator)); // do not render separators for now + return { + actions: actions.filter(a => !(a instanceof Separator)), // do not render separators for now + disposable + }; } public dispose(): void { @@ -274,5 +284,8 @@ export class DebugToolBar extends Themable implements IWorkbenchContribution { this.$el.remove(); delete this.$el; } + if (this.disposeOnUpdate) { + dispose(this.disposeOnUpdate); + } } } diff --git a/src/vs/workbench/contrib/debug/browser/debugViewlet.ts b/src/vs/workbench/contrib/debug/browser/debugViewlet.ts index 09f06f523ce..c4bf84c04a0 100644 --- a/src/vs/workbench/contrib/debug/browser/debugViewlet.ts +++ b/src/vs/workbench/contrib/debug/browser/debugViewlet.ts @@ -41,6 +41,7 @@ export class DebugViewlet extends ViewContainerViewlet { private breakpointView: ViewletPanel; private panelListeners = new Map(); private debugToolBarMenu: IMenu; + private disposeOnTitleUpdate: IDisposable; constructor( @IWorkbenchLayoutService layoutService: IWorkbenchLayoutService, @@ -114,7 +115,14 @@ export class DebugViewlet extends ViewContainerViewlet { this.debugToolBarMenu = this.menuService.createMenu(MenuId.DebugToolBar, this.contextKeyService); this._register(this.debugToolBarMenu); } - return DebugToolBar.getActions(this.debugToolBarMenu, this.debugService, this.instantiationService); + + const { actions, disposable } = DebugToolBar.getActions(this.debugToolBarMenu, this.debugService, this.instantiationService); + if (this.disposeOnTitleUpdate) { + dispose(this.disposeOnTitleUpdate); + } + this.disposeOnTitleUpdate = disposable; + + return actions; } get showInitialDebugActions(): boolean { From e79052776a2ce184762ed0b4280370ea02155b3d Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 2 Jul 2019 11:19:21 +0200 Subject: [PATCH 0878/1449] fix distro build --- build/azure-pipelines/distro-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/azure-pipelines/distro-build.yml b/build/azure-pipelines/distro-build.yml index ab8a5e778c8..4057894f025 100644 --- a/build/azure-pipelines/distro-build.yml +++ b/build/azure-pipelines/distro-build.yml @@ -35,7 +35,7 @@ steps: git push distro origin/master:refs/heads/master origin/master:refs/heads/oss/master # Push every release branch into oss/release - git for-each-ref --format="%(refname:short)" refs/remotes/origin/release/* | sed 's/^origin\/\(.*\)$/\0:refs\/heads\/oss\/\1/' | xargs git push + git for-each-ref --format="%(refname:short)" refs/remotes/origin/release/* | sed 's/^origin\/\(.*\)$/\0:refs\/heads\/oss\/\1/' | xargs git push distro git merge $(node -p "require('./package.json').distro") From 5967934c55a32b1aaab273e232a5688df225288f Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 2 Jul 2019 11:23:37 +0200 Subject: [PATCH 0879/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ecf3e2f1958..c52ce057f89 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "2b36463d246567c8e51d136b5868513a8c866886", + "distro": "f737a181ef604c1b4f43a4c233607c986878bb20", "author": { "name": "Microsoft Corporation" }, From ca44b6c61809eceef9acbe937a465a06067e7670 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 2 Jul 2019 11:47:07 +0200 Subject: [PATCH 0880/1449] bring back close --- src/vs/workbench/contrib/comments/browser/media/close.svg | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/vs/workbench/contrib/comments/browser/media/close.svg diff --git a/src/vs/workbench/contrib/comments/browser/media/close.svg b/src/vs/workbench/contrib/comments/browser/media/close.svg new file mode 100644 index 00000000000..751e89b3b02 --- /dev/null +++ b/src/vs/workbench/contrib/comments/browser/media/close.svg @@ -0,0 +1 @@ + \ No newline at end of file From d050f2a132ce3bcfcc43c9da40e88f957f79837a Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 2 Jul 2019 11:49:28 +0200 Subject: [PATCH 0881/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f651b94b313..fbb57a28435 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "f737a181ef604c1b4f43a4c233607c986878bb20", + "distro": "a7a2b61e2bc046d72cca791b8483d1d74f484f5d", "author": { "name": "Microsoft Corporation" }, From d3d884ab8a17965038c67aff0bc291ecd4f53f5d Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 2 Jul 2019 11:59:04 +0200 Subject: [PATCH 0882/1449] composite - ensure the editor progress service is always there --- src/vs/workbench/browser/parts/compositePart.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/browser/parts/compositePart.ts b/src/vs/workbench/browser/parts/compositePart.ts index d30b9923308..38b5da80ef5 100644 --- a/src/vs/workbench/browser/parts/compositePart.ts +++ b/src/vs/workbench/browser/parts/compositePart.ts @@ -23,7 +23,8 @@ import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/la import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IProgressIndicator } from 'vs/platform/progress/common/progress'; +import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; +import { IProgressIndicator, IEditorProgressService } from 'vs/platform/progress/common/progress'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IThemeService } from 'vs/platform/theme/common/themeService'; @@ -168,15 +169,16 @@ export abstract class CompositePart extends Part { // Instantiate composite from registry otherwise const compositeDescriptor = this.registry.getComposite(id); if (compositeDescriptor) { - const composite = compositeDescriptor.instantiate(this.instantiationService); + const compositeProgressIndicator = this.instantiationService.createInstance(CompositeProgressIndicator, this.progressBar, compositeDescriptor.id, isActive); + const compositeInstantiationService = this.instantiationService.createChild(new ServiceCollection( + [IEditorProgressService, compositeProgressIndicator] // provide the editor progress service for any editors instantiated within the composite + )); + + const composite = compositeDescriptor.instantiate(compositeInstantiationService); const disposable = new DisposableStore(); // Remember as Instantiated - this.instantiatedCompositeItems.set(id, { - composite, - disposable, - progress: this._register(this.instantiationService.createInstance(CompositeProgressIndicator, this.progressBar, compositeDescriptor.id, isActive)) - }); + this.instantiatedCompositeItems.set(id, { composite, disposable, progress: compositeProgressIndicator }); // Register to title area update events from the composite disposable.add(composite.onTitleAreaUpdate(() => this.onTitleAreaUpdate(composite.getId()), this)); From a8f323677f07b9dfe86b84de42ee15e27eab94a6 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 1 Jul 2019 21:17:45 +0200 Subject: [PATCH 0883/1449] configure polling --- .../files/node/diskFileSystemProvider.ts | 22 +++++++++---------- .../watcher/unix/chokidarWatcherService.ts | 2 +- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/services/files/node/diskFileSystemProvider.ts b/src/vs/workbench/services/files/node/diskFileSystemProvider.ts index 9cdf02e1438..4e72d7b7c78 100644 --- a/src/vs/workbench/services/files/node/diskFileSystemProvider.ts +++ b/src/vs/workbench/services/files/node/diskFileSystemProvider.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import { mkdir, open, close, read, write, fdatasync } from 'fs'; -import * as os from 'os'; import { promisify } from 'util'; import { IDisposable, Disposable, toDisposable, dispose, combinedDisposable } from 'vs/base/common/lifecycle'; import { IFileSystemProvider, FileSystemProviderCapabilities, IFileChange, IWatchOptions, IStat, FileType, FileDeleteOptions, FileOverwriteOptions, FileWriteOptions, FileOpenOptions, FileSystemProviderErrorCode, createFileSystemProviderError, FileSystemProviderError } from 'vs/platform/files/common/files'; @@ -24,9 +23,14 @@ import { FileWatcher as WindowsWatcherService } from 'vs/workbench/services/file import { FileWatcher as NsfwWatcherService } from 'vs/workbench/services/files/node/watcher/nsfw/watcherService'; import { FileWatcher as NodeJSWatcherService } from 'vs/workbench/services/files/node/watcher/nodejs/watcherService'; +export interface WatcherOptions { + pollingInterval?: number; + usePolling: boolean; +} + export class DiskFileSystemProvider extends Disposable implements IFileSystemProvider { - constructor(private logService: ILogService) { + constructor(private logService: ILogService, private watcherOptions?: WatcherOptions) { super(); } @@ -410,15 +414,15 @@ export class DiskFileSystemProvider extends Disposable implements IFileSystemPro onChange: (changes: IDiskFileChange[]) => void, onLogMessage: (msg: ILogMessage) => void, verboseLogging: boolean, - watcherOptions?: { [key: string]: boolean | number | string } + watcherOptions?: WatcherOptions ): WindowsWatcherService | UnixWatcherService | NsfwWatcherService }; let watcherOptions = undefined; - if (this.forcePolling()) { - // WSL needs a polling watcher + if (this.watcherOptions && this.watcherOptions.usePolling) { + // requires a polling watcher watcherImpl = UnixWatcherService; - watcherOptions = { usePolling: true }; + watcherOptions = this.watcherOptions; } else { // Single Folder Watcher if (this.recursiveFoldersToWatch.length === 1) { @@ -514,12 +518,6 @@ export class DiskFileSystemProvider extends Disposable implements IFileSystemPro return createFileSystemProviderError(error, code); } - - forcePolling(): boolean { - // wsl1 needs polling - return isLinux && /^[\.\-0-9]+-Microsoft/.test(os.release()); - } - //#endregion dispose(): void { diff --git a/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts b/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts index 2302d222f57..9c6a4c9ad3a 100644 --- a/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts +++ b/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts @@ -103,7 +103,7 @@ export class ChokidarWatcherService implements IWatcherService { this.log(`Start watching: ${basePath}]`); } - const pollingInterval = this._pollingInterval || 1000; + const pollingInterval = this._pollingInterval || 5000; const usePolling = this._usePolling; if (usePolling && this._verboseLogging) { this.log(`Use polling instead of fs.watch: Polling interval ${pollingInterval} ms`); From e4c5f2101ae97be04a4f57e5b497690058939295 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 1 Jul 2019 22:58:43 +0200 Subject: [PATCH 0884/1449] rename to IWatcherOptions --- .../workbench/services/files/node/diskFileSystemProvider.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/services/files/node/diskFileSystemProvider.ts b/src/vs/workbench/services/files/node/diskFileSystemProvider.ts index 4e72d7b7c78..b8d4b7aa553 100644 --- a/src/vs/workbench/services/files/node/diskFileSystemProvider.ts +++ b/src/vs/workbench/services/files/node/diskFileSystemProvider.ts @@ -23,14 +23,14 @@ import { FileWatcher as WindowsWatcherService } from 'vs/workbench/services/file import { FileWatcher as NsfwWatcherService } from 'vs/workbench/services/files/node/watcher/nsfw/watcherService'; import { FileWatcher as NodeJSWatcherService } from 'vs/workbench/services/files/node/watcher/nodejs/watcherService'; -export interface WatcherOptions { +export interface IWatcherOptions { pollingInterval?: number; usePolling: boolean; } export class DiskFileSystemProvider extends Disposable implements IFileSystemProvider { - constructor(private logService: ILogService, private watcherOptions?: WatcherOptions) { + constructor(private logService: ILogService, private watcherOptions?: IWatcherOptions) { super(); } @@ -414,7 +414,7 @@ export class DiskFileSystemProvider extends Disposable implements IFileSystemPro onChange: (changes: IDiskFileChange[]) => void, onLogMessage: (msg: ILogMessage) => void, verboseLogging: boolean, - watcherOptions?: WatcherOptions + watcherOptions?: IWatcherOptions ): WindowsWatcherService | UnixWatcherService | NsfwWatcherService }; let watcherOptions = undefined; From 1da6ba5b0e81b32de6fbc8d6215f395f9788172d Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 2 Jul 2019 12:40:40 +0200 Subject: [PATCH 0885/1449] :lipstick: --- src/vs/code/browser/workbench/workbench.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/code/browser/workbench/workbench.html b/src/vs/code/browser/workbench/workbench.html index daf45dab6e4..647bb7d0391 100644 --- a/src/vs/code/browser/workbench/workbench.html +++ b/src/vs/code/browser/workbench/workbench.html @@ -4,10 +4,10 @@ - + - + From 5af067a1e8bc56173007de73fd053f5dd29ef1cc Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Tue, 2 Jul 2019 12:41:52 +0200 Subject: [PATCH 0886/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c52ce057f89..1d820eb338e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "f737a181ef604c1b4f43a4c233607c986878bb20", + "distro": "7b3230919021cff88b2d9d4cc31271e26a7ee7f4", "author": { "name": "Microsoft Corporation" }, From 075c3a50423a567a8054d7af7547cc14819499b4 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 2 Jul 2019 12:41:58 +0200 Subject: [PATCH 0887/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1d820eb338e..ad8726438d1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "7b3230919021cff88b2d9d4cc31271e26a7ee7f4", + "distro": "4c6fd35a96a7f53ee8fe64148e341ad0a95986b7", "author": { "name": "Microsoft Corporation" }, From 4b7353f56a8bc632c9955c95603f2739107d0470 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 2 Jul 2019 12:48:00 +0200 Subject: [PATCH 0888/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ad8726438d1..68593fd4470 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "4c6fd35a96a7f53ee8fe64148e341ad0a95986b7", + "distro": "9ef976e0058e674f01d720af9c5fe2ac796ef2c5", "author": { "name": "Microsoft Corporation" }, From 74544c637a4241adf2c03c37305a9d4d806f88cf Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 2 Jul 2019 12:51:53 +0200 Subject: [PATCH 0889/1449] web - revert fullscreen restore --- src/vs/workbench/browser/web.simpleservices.ts | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index cecded0fb10..fd4463dfe2a 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -54,7 +54,6 @@ import { ParsedArgs } from 'vs/platform/environment/common/environment'; import { ClassifiedEvent, StrictPropertyCheck, GDPRClassification } from 'vs/platform/telemetry/common/gdprTypings'; import { IProcessEnvironment } from 'vs/base/common/platform'; import { toStoreData, restoreRecentlyOpened } from 'vs/platform/history/common/historyStorage'; -import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; //#region Backup File @@ -758,13 +757,11 @@ export class SimpleWindowService extends Disposable implements IWindowService { @IFileService private readonly fileService: IFileService, @IConfigurationService private readonly configurationService: IConfigurationService, @IStorageService private readonly storageService: IStorageService, - @IWorkspaceContextService private readonly workspaceService: IWorkspaceContextService, - @IWorkbenchLayoutService private readonly layoutService: IWorkbenchLayoutService + @IWorkspaceContextService private readonly workspaceService: IWorkspaceContextService ) { super(); this.addWorkspaceToRecentlyOpened(); - this.restoreFullScreen(); this.registerListeners(); } @@ -780,12 +777,6 @@ export class SimpleWindowService extends Disposable implements IWindowService { } } - private restoreFullScreen(): void { - if (document.location.href.indexOf('&fullscreen=true') > 0) { - setTimeout(() => this.toggleFullScreen(this.layoutService.getWorkbenchElement()), 0); - } - } - private registerListeners(): void { this._register(addDisposableListener(document, EventType.FULLSCREEN_CHANGE, () => { if (document.fullscreenElement || (document).webkitFullscreenElement) { @@ -962,7 +953,7 @@ export class SimpleWindowService extends Disposable implements IWindowService { for (let i = 0; i < _uris.length; i++) { const uri = _uris[i]; if ('folderUri' in uri) { - const newAddress = `${document.location.origin}/?folder=${uri.folderUri.path}&fullscreen=${!!browser.isFullscreen()}`; + const newAddress = `${document.location.origin}/?folder=${uri.folderUri.path}`; if (openFolderInNewWindow) { window.open(newAddress); } else { @@ -970,7 +961,7 @@ export class SimpleWindowService extends Disposable implements IWindowService { } } if ('workspaceUri' in uri) { - const newAddress = `${document.location.origin}/?workspace=${uri.workspaceUri.path}&fullscreen=${!!browser.isFullscreen()}`; + const newAddress = `${document.location.origin}/?workspace=${uri.workspaceUri.path}`; if (openFolderInNewWindow) { window.open(newAddress); } else { From 3abbf8d01a030bd5abb520f43962bd346930500a Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 2 Jul 2019 12:58:59 +0200 Subject: [PATCH 0890/1449] clean release task --- build/azure-pipelines/product-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 85903906f12..0353fa27200 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -85,7 +85,7 @@ jobs: - template: darwin/product-build-darwin.yml - job: Release - condition: and(succeeded(), or(eq(variables['VSCODE_RELEASE'], 'true'), and(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['Build.Reason'], 'Schedule')), and(eq(variables['VSCODE_QUALITY'], 'exploration'), eq(variables['Build.SourceBranch'], 'refs/heads/electron-6.0.x')))) + condition: and(succeeded(), or(eq(variables['VSCODE_RELEASE'], 'true'), and(or(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['VSCODE_QUALITY'], 'exploration')), eq(variables['Build.Reason'], 'Schedule')))) pool: vmImage: 'Ubuntu-16.04' dependsOn: From 8508bb8b7719e4ea3f7bc3bc4b49708c53efa55f Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Tue, 2 Jul 2019 19:33:58 +0800 Subject: [PATCH 0891/1449] Allow ignoring the keymap mismatch --- .../keybinding/browser/keymapService.ts | 20 +++++++++++++++---- .../test/browserKeyboardMapper.test.ts | 8 +++++--- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/services/keybinding/browser/keymapService.ts b/src/vs/workbench/services/keybinding/browser/keymapService.ts index 590dab59664..50424158297 100644 --- a/src/vs/workbench/services/keybinding/browser/keymapService.ts +++ b/src/vs/workbench/services/keybinding/browser/keymapService.ts @@ -29,6 +29,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { INavigatorWithKeyboard } from 'vs/workbench/services/keybinding/common/navigatorKeyboard'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { ICommandService } from 'vs/platform/commands/common/commands'; +import { StorageScope, IStorageService } from 'vs/platform/storage/common/storage'; export class BrowserKeyboardMapperFactoryBase { // keyboard mapper @@ -72,6 +73,7 @@ export class BrowserKeyboardMapperFactoryBase { protected constructor( private _notificationService: INotificationService, + private _storageService: IStorageService, private _commandService: ICommandService ) { this._keyboardMapper = null; @@ -180,6 +182,11 @@ export class BrowserKeyboardMapperFactoryBase { let score = matchedKeyboardLayout.score; if (keymap && score < 0) { + const donotAskUpdateKey = 'missing.keyboardlayout.donotask'; + if (this._storageService.getBoolean(donotAskUpdateKey, StorageScope.GLOBAL)) { + return; + } + // the keyboard layout doesn't actually match the key event or the keymap from chromium this._notificationService.prompt( Severity.Info, @@ -187,7 +194,11 @@ export class BrowserKeyboardMapperFactoryBase { [{ label: nls.localize('keyboardLayoutMissing.configure', "Configure"), run: () => this._commandService.executeCommand('workbench.action.openKeyboardLayoutPicker') - }], + }, { + label: nls.localize('neverAgain', "Don't Show Again"), + isSecondary: true, + run: () => this._storageService.store(donotAskUpdateKey, true, StorageScope.GLOBAL) + }] ); return; @@ -413,8 +424,8 @@ export class BrowserKeyboardMapperFactoryBase { } export class BrowserKeyboardMapperFactory extends BrowserKeyboardMapperFactoryBase { - constructor(notificationService: INotificationService, commandService: ICommandService) { - super(notificationService, commandService); + constructor(notificationService: INotificationService, storageService: IStorageService, commandService: ICommandService) { + super(notificationService, storageService, commandService); const platform = isWindows ? 'win' : isMacintosh ? 'darwin' : 'linux'; @@ -549,13 +560,14 @@ class BrowserKeymapService extends Disposable implements IKeymapService { @IEnvironmentService environmentService: IEnvironmentService, @IFileService fileService: IFileService, @INotificationService notificationService: INotificationService, + @IStorageService storageService: IStorageService, @ICommandService commandService: ICommandService, @IConfigurationService private configurationService: IConfigurationService, ) { super(); const keyboardConfig = configurationService.getValue<{ layout: string }>('keyboard'); const layout = keyboardConfig.layout; - this._factory = new BrowserKeyboardMapperFactory(notificationService, commandService); + this._factory = new BrowserKeyboardMapperFactory(notificationService, storageService, commandService); this.registerKeyboardListener(); diff --git a/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts b/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts index 452d2c166a7..acf45e1358d 100644 --- a/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts +++ b/src/vs/workbench/services/keybinding/test/browserKeyboardMapper.test.ts @@ -11,10 +11,11 @@ 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'; class TestKeyboardMapperFactory extends BrowserKeyboardMapperFactoryBase { - constructor(notificationService: INotificationService, commandService: ICommandService) { - super(notificationService, commandService); + constructor(notificationService: INotificationService, storageService: IStorageService, commandService: ICommandService) { + super(notificationService, storageService, commandService); let keymapInfos: IKeymapInfo[] = KeyboardLayoutContribution.INSTANCE.layoutInfos; this._keymapInfos.push(...keymapInfos.map(info => (new KeymapInfo(info.layout, info.secondaryLayouts, info.mapping, info.isUserKeyboardLayout)))); @@ -28,8 +29,9 @@ class TestKeyboardMapperFactory extends BrowserKeyboardMapperFactoryBase { suite('keyboard layout loader', () => { let instantiationService: TestInstantiationService = new TestInstantiationService(); let notitifcationService = instantiationService.stub(INotificationService, {}); + let storageService = instantiationService.stub(IStorageService, {}); let commandService = instantiationService.stub(ICommandService, {}); - let instance = new TestKeyboardMapperFactory(notitifcationService, commandService); + let instance = new TestKeyboardMapperFactory(notitifcationService, storageService, commandService); test.skip('load default US keyboard layout', () => { assert.notEqual(instance.activeKeyboardLayout, null); From d896ca63eec74515d5abaea189b30fe279820985 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 2 Jul 2019 14:13:55 +0200 Subject: [PATCH 0892/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fbb57a28435..8172fd61777 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "a7a2b61e2bc046d72cca791b8483d1d74f484f5d", + "distro": "e9e29b0d353af8fdea143524cbd15376ecf1c0c2", "author": { "name": "Microsoft Corporation" }, From 490459b90ecd621db609e24180326becda3068d5 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 2 Jul 2019 14:58:11 +0200 Subject: [PATCH 0893/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8172fd61777..a2847f6f639 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "e9e29b0d353af8fdea143524cbd15376ecf1c0c2", + "distro": "9290232045cde96be94438491d48d174378783e1", "author": { "name": "Microsoft Corporation" }, From 519ec86ae421afd2a53146c101a69b5a06762c8a Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 2 Jul 2019 15:16:34 +0200 Subject: [PATCH 0894/1449] swap web.resources with service worker approach --- resourceServiceWorkerMain.js | 40 ----- src/vs/workbench/browser/web.main.ts | 6 +- src/vs/workbench/browser/web.resources.ts | 124 --------------- .../browser/resourceServiceWorker.ts | 67 ++++++++- .../browser/resourceServiceWorkerClient.ts | 142 ++++++++++++++++-- .../browser/resourceServiceWorkerMain.ts | 59 ++++---- 6 files changed, 225 insertions(+), 213 deletions(-) delete mode 100644 resourceServiceWorkerMain.js delete mode 100644 src/vs/workbench/browser/web.resources.ts diff --git a/resourceServiceWorkerMain.js b/resourceServiceWorkerMain.js deleted file mode 100644 index 38278c36043..00000000000 --- a/resourceServiceWorkerMain.js +++ /dev/null @@ -1,40 +0,0 @@ -"use strict"; -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -(function () { - let handler; - self.addEventListener('fetch', event => { - console.log('FETCH', event); - if (handler) { - handler.handleFetchEvent(event); - } - else { - //@ts-ignore - event.respondWith(fetch(event.request)); - } - }); - self.addEventListener('install', event => { - let loadPromise = new Promise((resolve, reject) => { - // load loader - const monacoBaseUrl = './out/'; - importScripts(monacoBaseUrl + 'vs/loader.js'); - require.config({ - baseUrl: monacoBaseUrl, - catchError: true - }); - require(['vs/workbench/contrib/resources/browser/resourceServiceWorker'], module => { - handler = module; - resolve(); - }, reject); - }); - //@ts-ignore - event.waitUntil(Promise.all([loadPromise, self.skipWaiting()])); - }); - self.addEventListener('activate', event => { - //@ts-ignore - event.waitUntil(self.clients.claim()); // Become available to all pages - }); -})(); -//# sourceMappingURL=resourceServiceWorkerMain.js.map diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index f87f57f07dc..9519bdb5158 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -29,7 +29,6 @@ import { URI } from 'vs/base/common/uri'; import { IWorkspaceInitializationPayload } from 'vs/platform/workspaces/common/workspaces'; import { WorkspaceService } from 'vs/workbench/services/configuration/browser/configurationService'; import { ConfigurationCache } from 'vs/workbench/services/configuration/browser/configurationCache'; -import { WebResources } from 'vs/workbench/browser/web.resources'; import { ISignService } from 'vs/platform/sign/common/sign'; import { SignService } from 'vs/platform/sign/browser/signService'; import { hash } from 'vs/base/common/hash'; @@ -68,9 +67,6 @@ class CodeRendererMain extends Disposable { // Layout this._register(addDisposableListener(window, EventType.RESIZE, () => this.workbench.layout())); - // Resource Loading - this._register(new WebResources(services.serviceCollection.get(IFileService))); - // Workbench Lifecycle this._register(this.workbench.onShutdown(() => this.dispose())); @@ -199,4 +195,4 @@ export function main(domElement: HTMLElement, options: IWorkbenchConstructionOpt const renderer = new CodeRendererMain(domElement, options); return renderer.open(); -} \ No newline at end of file +} diff --git a/src/vs/workbench/browser/web.resources.ts b/src/vs/workbench/browser/web.resources.ts deleted file mode 100644 index 2b9adf61c5e..00000000000 --- a/src/vs/workbench/browser/web.resources.ts +++ /dev/null @@ -1,124 +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 { IFileService } from 'vs/platform/files/common/files'; -import { URI } from 'vs/base/common/uri'; -import { getMediaMime } from 'vs/base/common/mime'; - -export class WebResources { - - private readonly _regexp = /url\(('|")?(vscode-remote:\/\/.*?)\1\)/g; - private readonly _urlCache = new Map(); - private readonly _requestCache = new Map>(); - private readonly _observer: MutationObserver; - - constructor(@IFileService private readonly _fileService: IFileService) { - // todo@joh add observer to more than head-element - // todo@joh explore alternative approach - this._observer = new MutationObserver(r => this._handleMutation(r)); - this._observer.observe(document, { - subtree: true, - childList: true, - attributes: true, - attributeFilter: ['style'] - }); - } - - dispose(): void { - this._observer.disconnect(); - this._urlCache.forEach(value => URL.revokeObjectURL(value)); - } - - private _handleMutation(records: MutationRecord[]): void { - for (const record of records) { - if (record.target.nodeName === 'STYLE') { - // style-element directly modified - this._handleStyleNode(record.target); - - } else if (record.target.nodeName === 'HEAD' && record.type === 'childList') { - // style-element added to head - record.addedNodes.forEach(node => { - if (node.nodeName === 'STYLE') { - this._handleStyleNode(node); - } - }); - } else if (record.type === 'attributes') { - // style-attribute - this._handleAttrMutation(record.target); - } - } - } - - private _handleStyleNode(target: Node): void { - if (target.textContent && target.textContent.indexOf('vscode-remote://') >= 0) { - const content = target.textContent; - this._rewriteUrls(content).then(value => { - if (content === target.textContent) { - target.textContent = value; - } - }).catch(e => { - console.error(e); - }); - } - } - - private _handleAttrMutation(target: Node): void { - const styleValue = (target).getAttribute('style'); - if (styleValue && styleValue.indexOf('vscode-remote://') >= 0) { - this._rewriteUrls(styleValue).then(value => { - if (value !== styleValue) { - (target).setAttribute('style', value); - } - }).catch(e => { - console.error(e); - }); - } - } - - private async _rewriteUrls(textContent: string): Promise { - - return textContent.replace(/url\(('|")?(vscode-remote:\/\/(.*?))\1\)/ig, function (_m, quote, url) { - return `url("http://localhost:9888/out/vs/workbench/contrib/resources/browser/foo?${encodeURIComponent(url)}")`; - // return `url(${quote}${location.href}out/vs/workbench/contrib/resources/browser/?${encodeURIComponent(url)}${quote})`; - }); - } - - private async _rewriteUrls2(textContent: string): Promise { - - const positions: number[] = []; - const promises: Promise[] = []; - - let match: RegExpMatchArray | null = null; - while (match = this._regexp.exec(textContent)) { - - const remoteUrl = match[2]; - positions.push(match.index! + 'url('.length + (typeof match[1] === 'string' ? match[1].length : 0)); - positions.push(remoteUrl.length); - - if (!this._urlCache.has(remoteUrl)) { - let request = this._requestCache.get(remoteUrl); - if (!request) { - const uri = URI.parse(remoteUrl, true); - request = this._fileService.readFile(uri).then(file => { - const blobUrl = URL.createObjectURL(new Blob([file.value.buffer], { type: getMediaMime(uri.path) })); - this._urlCache.set(remoteUrl, blobUrl); - }); - this._requestCache.set(remoteUrl, request); - } - promises.push(request); - } - } - - let content = textContent; - await Promise.all(promises); - for (let i = positions.length - 1; i >= 0; i -= 2) { - const start = positions[i - 1]; - const len = positions[i]; - const url = this._urlCache.get(content.substr(start, len)); - content = content.substring(0, start) + url + content.substring(start + len); - } - return content; - } -} diff --git a/src/vs/workbench/contrib/resources/browser/resourceServiceWorker.ts b/src/vs/workbench/contrib/resources/browser/resourceServiceWorker.ts index d311f8d8676..c2163194783 100644 --- a/src/vs/workbench/contrib/resources/browser/resourceServiceWorker.ts +++ b/src/vs/workbench/contrib/resources/browser/resourceServiceWorker.ts @@ -3,9 +3,72 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { URI } from 'vs/base/common/uri'; +import { generateUuid } from 'vs/base/common/uuid'; +import { getMediaMime } from 'vs/base/common/mime'; -export function handleFetchEvent(event) { +const cacheName = 'vscode-resources'; - console.log('FETCH', event); +declare const clients: { get(s: string): Promise }; + + +const _pending = new Map(); + +export function handleMessageEvent(event: MessageEvent): void { + const fn = _pending.get(event.data.token); + if (fn) { + fn(event.data.data); + _pending.delete(event.data.token); + } +} + +export async function handleFetchEvent(event: any): Promise { + + const url = URI.parse(event.request.url); + + if (url.path !== '/vscode-resources/fetch') { + return undefined; + } + + if (!event.clientId) { + return undefined; + } + + const cachedValue = await caches.open(cacheName).then(cache => cache.match(event.request)); + if (cachedValue) { + return cachedValue; + } + + // console.log('fetch', url.query); + try { + const token = generateUuid(); + return new Promise(async resolve => { + + const handle = setTimeout(() => { + resolve(new Response(undefined, { status: 500, statusText: 'timeout' })); + _pending.delete(token); + }, 5000); + + _pending.set(token, (data: ArrayBuffer) => { + clearTimeout(handle); + const res = new Response(data, { + status: 200, + headers: { 'Content-Type': getMediaMime(URI.parse(url.query).path) || 'text/plain' } + }); + caches.open(cacheName).then(cache => { + cache.put(event.request, res.clone()); + resolve(res); + }); + }); + + const client = await clients.get(event.clientId); + client.postMessage({ uri: url.query, token }); + }); + + + } catch (err) { + console.error(err); + return new Response(err, { status: 500 }); + } } diff --git a/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerClient.ts b/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerClient.ts index b4222bf304d..592b17e9a8a 100644 --- a/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerClient.ts +++ b/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerClient.ts @@ -4,26 +4,142 @@ *--------------------------------------------------------------------------------------------*/ import { IFileService } from 'vs/platform/files/common/files'; +import { DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; +import { URI } from 'vs/base/common/uri'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { IWorkbenchContributionsRegistry, Extensions } from 'vs/workbench/common/contributions'; +import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; -export class ResourceServiceWorkerService { +// todo@joh explore alternative, explicit approach +class ResourcesMutationObserver { + + private readonly _urlCache = new Map(); + private readonly _observer: MutationObserver; + + private readonly _regexp = /url\(('|")?(vscode-remote:\/\/(.*?))\1\)/ig; + + constructor() { + this._observer = new MutationObserver(r => this._handleMutation(r)); + this._observer.observe(document, { + subtree: true, + childList: true, + attributes: true, + attributeFilter: ['style'] + }); + this.scan(); + } + + scan(): void { + document.querySelectorAll('style').forEach(value => this._handleStyleNode(value)); + // todo@joh more! + } + + dispose(): void { + this._observer.disconnect(); + this._urlCache.forEach(value => URL.revokeObjectURL(value)); + } + + private _handleMutation(records: MutationRecord[]): void { + for (const record of records) { + if (record.target.nodeName === 'STYLE') { + // style-element directly modified + this._handleStyleNode(record.target); + + } else if (record.target.nodeName === 'HEAD' && record.type === 'childList') { + // style-element added to head + record.addedNodes.forEach(node => { + if (node.nodeName === 'STYLE') { + this._handleStyleNode(node); + } + }); + } else if (record.type === 'attributes') { + // style-attribute + this._handleAttrMutation(record.target); + } + } + } + + private _handleStyleNode(target: Node): void { + if (target.textContent && target.textContent.indexOf('vscode-remote://') >= 0) { + const content = target.textContent; + this._rewriteUrls(content).then(value => { + if (content === target.textContent) { + target.textContent = value; + } + }).catch(e => { + console.error(e); + }); + } + } + + private _handleAttrMutation(target: Node): void { + const styleValue = (target).getAttribute('style'); + if (styleValue && styleValue.indexOf('vscode-remote://') >= 0) { + this._rewriteUrls(styleValue).then(value => { + if (value !== styleValue) { + (target).setAttribute('style', value); + } + }).catch(e => { + console.error(e); + }); + } + } + + private async _rewriteUrls(textContent: string): Promise { + return textContent.replace(this._regexp, function (_m, quote, url) { + return `url(${quote}${location.href}vscode-resources/fetch?${encodeURIComponent(url)}${quote})`; + }); + } +} + +class ResourceServiceWorker { + + private readonly _disposables = new DisposableStore(); constructor( @IFileService private readonly _fileService: IFileService, ) { - console.log(this._fileService); + this._initServiceWorker(); + this._initFetchHandler(); + } + + dispose(): void { + this._disposables.dispose(); + } + + private _initServiceWorker(): void { + const url = './resourceServiceWorkerMain.js'; + navigator.serviceWorker.register(url).then(() => { + // console.log('registered'); + return navigator.serviceWorker.ready; + }).then(() => { + // console.log('ready'); + this._disposables.add(new ResourcesMutationObserver()); + }).catch(err => { + console.error(err); + }); + } + + private _initFetchHandler(): void { + + const fetchListener: (this: ServiceWorkerContainer, ev: MessageEvent) => void = event => { + const uri = URI.parse(event.data.uri); + this._fileService.readFile(uri).then(file => { + // todo@joh typings + (event.source).postMessage({ + token: event.data.token, + data: file.value.buffer.buffer + }, [file.value.buffer.buffer]); + }); + }; + navigator.serviceWorker.addEventListener('message', fetchListener); + this._disposables.add(toDisposable(() => navigator.serviceWorker.removeEventListener('message', fetchListener))); } } -// const url = require.toUrl('./resourceServiceWorkerMain.js'); -const url = './resourceServiceWorkerMain.js'; +Registry.as(Extensions.Workbench).registerWorkbenchContribution( + ResourceServiceWorker, + LifecyclePhase.Starting +); -navigator.serviceWorker.register( - url, - // { scope: './out/vs/workbench/contrib/resources/browser/' } -).then(value => { - console.log(value); - console.log(navigator.serviceWorker.controller); -}).catch(err => { - console.error(err); -}); diff --git a/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts b/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts index 997a74fbfc5..d2c9220fad5 100644 --- a/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts +++ b/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts @@ -4,41 +4,42 @@ *--------------------------------------------------------------------------------------------*/ (function () { - type Handler = { - handleFetchEvent(event: Event): void; + handleFetchEvent(event: Event): Promise; + handleMessageEvent(event: MessageEvent): void; }; - let handler: Handler | undefined; - self.addEventListener('fetch', event => { - console.log('FETCH', event); - if (handler) { - handler.handleFetchEvent(event); - } else { - //@ts-ignore - event.respondWith(fetch(event.request)); - } + const handlerPromise = new Promise((resolve, reject) => { + // load loader + const baseUrl = './out/'; + importScripts(baseUrl + 'vs/loader.js'); + require.config({ + baseUrl, + catchError: true + }); + require(['vs/workbench/contrib/resources/browser/resourceServiceWorker'], resolve, reject); + }); + + self.addEventListener('message', event => { + handlerPromise.then(handler => { + handler.handleMessageEvent(event); + }); + }); + + self.addEventListener('fetch', (event: any) => { + event.respondWith(handlerPromise.then(handler => { + return handler.handleFetchEvent(event).then(value => { + if (value instanceof Response) { + return value; + } else { + return fetch(event.request); + } + }); + })); }); self.addEventListener('install', event => { - - let loadPromise = new Promise((resolve, reject) => { - - // load loader - const monacoBaseUrl = '../../../../../'; - importScripts(monacoBaseUrl + 'vs/loader.js'); - require.config({ - baseUrl: monacoBaseUrl, - catchError: true - }); - - require(['vs/workbench/contrib/resources/browser/resourceServiceWorker'], module => { - handler = module; - resolve(); - }, reject); - }); - //@ts-ignore - event.waitUntil(Promise.all([loadPromise, self.skipWaiting()])); + event.waitUntil(self.skipWaiting()); }); self.addEventListener('activate', event => { From ab5b94db3475ea785eed2d52b6aa54352ac6d1d9 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 2 Jul 2019 15:33:43 +0200 Subject: [PATCH 0895/1449] some of #76442 --- src/vs/base/common/objects.ts | 8 ++++---- src/vs/editor/contrib/snippet/snippetVariables.ts | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vs/base/common/objects.ts b/src/vs/base/common/objects.ts index 97c8f9196c0..1475bf4a550 100644 --- a/src/vs/base/common/objects.ts +++ b/src/vs/base/common/objects.ts @@ -14,11 +14,11 @@ export function deepClone(obj: T): T { return obj as any; } const result: any = Array.isArray(obj) ? [] : {}; - Object.keys(obj as any).forEach((key: string) => { - if (obj[key] && typeof obj[key] === 'object') { - result[key] = deepClone(obj[key]); + Object.keys(obj).forEach((key: string) => { + if ((obj)[key] && typeof (obj)[key] === 'object') { + result[key] = deepClone((obj)[key]); } else { - result[key] = obj[key]; + result[key] = (obj)[key]; } }); return result; diff --git a/src/vs/editor/contrib/snippet/snippetVariables.ts b/src/vs/editor/contrib/snippet/snippetVariables.ts index 0cca7a56ffe..876a5f8be65 100644 --- a/src/vs/editor/contrib/snippet/snippetVariables.ts +++ b/src/vs/editor/contrib/snippet/snippetVariables.ts @@ -14,7 +14,7 @@ import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { isSingleFolderWorkspaceIdentifier, toWorkspaceIdentifier, WORKSPACE_EXTENSION } from 'vs/platform/workspaces/common/workspaces'; -export const KnownSnippetVariableNames = Object.freeze({ +export const KnownSnippetVariableNames: { [key: string]: true } = Object.freeze({ 'CURRENT_YEAR': true, 'CURRENT_YEAR_SHORT': true, 'CURRENT_MONTH': true, @@ -275,4 +275,4 @@ export class WorkspaceBasedVariableResolver implements VariableResolver { } return filename; } -} \ No newline at end of file +} From 833796d25c2ab1fbec8bd1e9755517ac3f43783b Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 2 Jul 2019 15:38:23 +0200 Subject: [PATCH 0896/1449] remove gulpfile.ci --- .../darwin/product-build-darwin.yml | 8 ++- .../linux/product-build-linux.yml | 8 ++- .../win32/product-build-win32.yml | 6 +- build/gulpfile.ci.js | 69 ------------------- build/gulpfile.reh.js | 5 ++ gulpfile.js | 4 +- 6 files changed, 25 insertions(+), 75 deletions(-) delete mode 100644 build/gulpfile.ci.js diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index cde0a7a3c2b..cb77d68c9e9 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -76,8 +76,14 @@ steps: - script: | set -e + yarn gulp compile-build + yarn gulp compile-extensions-build VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp darwin-min + yarn gulp vscode-darwin-ci + VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ + yarn gulp vscode-reh-darwin-ci + VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ + yarn gulp vscode-web-darwin-ci AZURE_STORAGE_ACCESS_KEY="$(ticino-storage-key)" \ yarn gulp upload-vscode-sourcemaps displayName: Build diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index f03c41a0709..a32dd127dfa 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -77,8 +77,14 @@ steps: - script: | set -e + yarn gulp compile-build + yarn gulp compile-extensions-build VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp linux-$VSCODE_ARCH-min + yarn gulp vscode-linux-$VSCODE_ARCH-min-ci + VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ + yarn gulp vscode-reh-$VSCODE_ARCH-min-ci + VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ + yarn gulp vscode-web-$VSCODE_ARCH-min-ci displayName: Build - script: | diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 411d2f784e7..cd574f085f5 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -85,7 +85,11 @@ steps: . build/azure-pipelines/win32/exec.ps1 $ErrorActionPreference = "Stop" $env:VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" - exec { yarn gulp "win32-$env:VSCODE_ARCH-min" } + exec { yarn gulp compile-build } + exec { yarn gulp compile-extensions-build } + exec { yarn gulp "vscode-win32-$env:VSCODE_ARCH-min-ci" } + exec { yarn gulp "vscode-reh-win32-$env:VSCODE_ARCH-min-ci" } + exec { yarn gulp "vscode-web-win32-$env:VSCODE_ARCH-min-ci" } exec { yarn gulp "vscode-win32-$env:VSCODE_ARCH-inno-updater" } displayName: Build diff --git a/build/gulpfile.ci.js b/build/gulpfile.ci.js deleted file mode 100644 index ab3746af2a6..00000000000 --- a/build/gulpfile.ci.js +++ /dev/null @@ -1,69 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -const gulp = require('gulp'); -const task = require('./lib/task'); - -gulp.task(task.define('win32-ia32', task.series( - gulp.task('compile-build'), - gulp.task('compile-extensions-build'), - gulp.task('vscode-win32-ia32-ci') -))); - -gulp.task(task.define('win32-ia32-min', task.series( - gulp.task('compile-build'), - gulp.task('compile-extensions-build'), - gulp.task('vscode-win32-ia32-min-ci') -))); - -gulp.task(task.define('win32-x64', task.series( - gulp.task('compile-build'), - gulp.task('compile-extensions-build'), - gulp.task('vscode-win32-x64-ci') -))); - -gulp.task(task.define('win32-x64-min', task.series( - gulp.task('compile-build'), - gulp.task('compile-extensions-build'), - gulp.task('vscode-win32-x64-min-ci') -))); - -gulp.task(task.define('linux-ia32', task.series( - gulp.task('compile-build'), - gulp.task('compile-extensions-build'), - gulp.task('vscode-linux-ia32-ci') -))); - -gulp.task(task.define('linux-ia32-min', task.series( - gulp.task('compile-build'), - gulp.task('compile-extensions-build'), - gulp.task('vscode-linux-ia32-min-ci') -))); - -gulp.task(task.define('linux-x64', task.series( - gulp.task('compile-build'), - gulp.task('compile-extensions-build'), - gulp.task('vscode-linux-x64-ci') -))); - -gulp.task(task.define('linux-x64-min', task.series( - gulp.task('compile-build'), - gulp.task('compile-extensions-build'), - gulp.task('vscode-linux-x64-min-ci') -))); - -gulp.task(task.define('darwin', task.series( - gulp.task('compile-build'), - gulp.task('compile-extensions-build'), - gulp.task('vscode-darwin-ci') -))); - -gulp.task(task.define('darwin-min', task.series( - gulp.task('compile-build'), - gulp.task('compile-extensions-build'), - gulp.task('vscode-darwin-min-ci') -))); diff --git a/build/gulpfile.reh.js b/build/gulpfile.reh.js index 02f680af01c..8828a0d394f 100644 --- a/build/gulpfile.reh.js +++ b/build/gulpfile.reh.js @@ -43,6 +43,11 @@ gulp.task('vscode-reh-linux-x64-min', noop); gulp.task('vscode-reh-linux-armhf-min', noop); gulp.task('vscode-reh-linux-alpine-min', noop); +gulp.task('vscode-web-win32-ia32-min', noop); +gulp.task('vscode-web-win32-x64-min', noop); +gulp.task('vscode-web-darwin-min', noop); +gulp.task('vscode-web-linux-x64-min', noop); +gulp.task('vscode-web-linux-alpine-min', noop); function getNodeVersion() { const yarnrc = fs.readFileSync(path.join(REPO_ROOT, 'remote', '.yarnrc'), 'utf8'); diff --git a/gulpfile.js b/gulpfile.js index e41bf4a498f..8a5eff502f6 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -40,6 +40,4 @@ process.on('unhandledRejection', (reason, p) => { // Load all the gulpfiles only if running tasks other than the editor tasks const build = path.join(__dirname, 'build'); require('glob').sync('gulpfile.*.js', { cwd: build }) - .filter(f => !/gulpfile\.ci\.js/.test(f)) - .forEach(f => require(`./build/${f}`)); -require('./build/gulpfile.ci.js'); \ No newline at end of file + .forEach(f => require(`./build/${f}`)); \ No newline at end of file From ddc8276d622ac3c8b64ee7721f089e7aa5fef6d7 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 2 Jul 2019 15:41:18 +0200 Subject: [PATCH 0897/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a2847f6f639..8f8ca04521f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "9290232045cde96be94438491d48d174378783e1", + "distro": "9db24329805f1ca7a3333f8fd803816bb05f685c", "author": { "name": "Microsoft Corporation" }, From 9e8c8112d1bb69885f302064eed48acd3753004b Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 2 Jul 2019 15:58:47 +0200 Subject: [PATCH 0898/1449] use yarn cache --- .../darwin/product-build-darwin.yml | 14 ++++++++++++++ .../linux/product-build-linux.yml | 16 +++++++++++++++- .../win32/product-build-win32.yml | 14 ++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index cb77d68c9e9..09b2ffe463d 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -35,10 +35,24 @@ steps: git merge $(node -p "require('./package.json').distro") displayName: Merge distro +- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + inputs: + keyfile: '**/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'npm-vscode' + - script: | set -e yarn --frozen-lockfile displayName: Install dependencies + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) + +- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 + inputs: + keyfile: '**/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'npm-vscode' + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - script: | set -e diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index a32dd127dfa..2c4b1e434a0 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -36,10 +36,24 @@ steps: git merge $(node -p "require('./package.json').distro") displayName: Merge distro +- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + inputs: + keyfile: '**/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'npm-vscode' + - script: | set -e - CHILD_CONCURRENCY=1 yarn --frozen-lockfile + yarn --frozen-lockfile displayName: Install dependencies + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) + +- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 + inputs: + keyfile: '**/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'npm-vscode' + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - script: | set -e diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index cd574f085f5..46362f655ad 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -35,6 +35,12 @@ steps: exec { git merge $(node -p "require('./package.json').distro") } displayName: Merge distro +- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + inputs: + keyfile: '**/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'npm-vscode' + - powershell: | . build/azure-pipelines/win32/exec.ps1 $ErrorActionPreference = "Stop" @@ -42,6 +48,14 @@ steps: $env:CHILD_CONCURRENCY="1" exec { yarn --frozen-lockfile } displayName: Install dependencies + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) + +- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 + inputs: + keyfile: '**/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'npm-vscode' + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - powershell: | . build/azure-pipelines/win32/exec.ps1 From 7f5541d56d97d4c98f953179b067c53a1871041b Mon Sep 17 00:00:00 2001 From: Robo Date: Tue, 2 Jul 2019 07:04:01 -0700 Subject: [PATCH 0899/1449] chore: Bump nsfw@1.2.5 (#76434) * chore: Bump nsfw@1.2.5 * adopt newDirectory property --- package.json | 4 +- remote/package.json | 2 +- remote/yarn.lock | 37 +++++++++++-------- src/typings/{vscode-nsfw.d.ts => nsfw.d.ts} | 3 +- .../node/watcher/nsfw/nsfwWatcherService.ts | 4 +- yarn.lock | 36 +++++++++--------- 6 files changed, 46 insertions(+), 40 deletions(-) rename src/typings/{vscode-nsfw.d.ts => nsfw.d.ts} (95%) diff --git a/package.json b/package.json index 68593fd4470..5270be485a8 100644 --- a/package.json +++ b/package.json @@ -41,13 +41,13 @@ "native-keymap": "1.2.6", "native-watchdog": "1.0.0", "node-pty": "0.9.0-beta17", + "nsfw": "1.2.5", "onigasm-umd": "^2.2.2", "semver": "^5.5.0", "spdlog": "^0.9.0", "sudo-prompt": "8.2.0", "v8-inspect-profiler": "^0.0.20", "vscode-chokidar": "1.6.5", - "vscode-nsfw": "1.1.2", "vscode-proxy-agent": "0.4.0", "vscode-ripgrep": "^1.2.5", "vscode-sqlite3": "4.0.7", @@ -156,4 +156,4 @@ "windows-mutex": "0.2.1", "windows-process-tree": "0.2.3" } -} \ No newline at end of file +} diff --git a/remote/package.json b/remote/package.json index 7a48c4cb238..2dff7439783 100644 --- a/remote/package.json +++ b/remote/package.json @@ -13,11 +13,11 @@ "minimist": "1.2.0", "native-watchdog": "1.0.0", "node-pty": "0.9.0-beta17", + "nsfw": "1.2.5", "onigasm-umd": "^2.2.2", "semver": "^5.5.0", "spdlog": "^0.9.0", "vscode-chokidar": "1.6.5", - "vscode-nsfw": "1.1.1", "vscode-proxy-agent": "0.4.0", "vscode-ripgrep": "^1.2.5", "vscode-textmate": "^4.1.1", diff --git a/remote/yarn.lock b/remote/yarn.lock index 6bf34b0726a..883fec5d65d 100644 --- a/remote/yarn.lock +++ b/remote/yarn.lock @@ -379,11 +379,16 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" -graceful-fs@4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: +graceful-fs@4.1.11, graceful-fs@^4.1.2: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= +graceful-fs@^4.1.6: + version "4.2.0" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.0.tgz#8d8fdc73977cb04104721cb53666c1ca64cd328b" + integrity sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg== + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -604,16 +609,16 @@ nan@2.8.0: resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" integrity sha1-7XFfP+neArV6XmJS2QqWZ14fCFo= +nan@^2.0.0, nan@^2.12.1, nan@^2.13.2, nan@^2.14.0: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + nan@^2.10.0: version "2.11.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.0.tgz#574e360e4d954ab16966ec102c0c049fd961a099" integrity sha512-F4miItu2rGnV2ySkXOQoA8FKz/SR2Q2sWP0sbTxNxz/tuokeC8WxOhPMcwi0qIyGtVn/rrSeLbvVkznqCdwYnw== -nan@^2.12.1, nan@^2.13.2, nan@^2.14.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== - native-watchdog@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/native-watchdog/-/native-watchdog-1.0.0.tgz#97344e83cd6815a8c8e6c44a52e7be05832e65ca" @@ -665,6 +670,16 @@ npmlog@^4.0.1: gauge "~2.7.3" set-blocking "~2.0.0" +nsfw@1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/nsfw/-/nsfw-1.2.5.tgz#febe581af616f7b042f89df133abe62416c4c803" + integrity sha512-m3mwZUKXiCR69PDMLfAmKmiNzy0Oe9LhFE0DYZC5cc1htNj5Hyb1sAgglXhuaDkibFy22AVvPC5cCFB3A6mYIw== + dependencies: + fs-extra "^7.0.0" + lodash.isinteger "^4.0.4" + lodash.isundefined "^3.0.1" + nan "^2.0.0" + number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -1073,16 +1088,6 @@ vscode-fsevents@0.3.10: dependencies: nan "^2.10.0" -vscode-nsfw@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/vscode-nsfw/-/vscode-nsfw-1.1.1.tgz#7c3febe153677c5850b197a0b64a197cd11e95c7" - integrity sha512-Wg3vzN1U3T6P1uE13LdVVRIhdy7XWnWkwmAXhkLsIkH2QY0E/pvNDRLrwAMMW6GC1Fvvbxm3hzdIrCmr7Hq3FA== - dependencies: - fs-extra "^7.0.0" - lodash.isinteger "^4.0.4" - lodash.isundefined "^3.0.1" - nan "^2.10.0" - vscode-proxy-agent@0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/vscode-proxy-agent/-/vscode-proxy-agent-0.4.0.tgz#574833e65405c6333f350f1b9fef9909deccb6b5" diff --git a/src/typings/vscode-nsfw.d.ts b/src/typings/nsfw.d.ts similarity index 95% rename from src/typings/vscode-nsfw.d.ts rename to src/typings/nsfw.d.ts index 5f70eb30f7b..f8bb423a2f8 100644 --- a/src/typings/vscode-nsfw.d.ts +++ b/src/typings/nsfw.d.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -declare module 'vscode-nsfw' { +declare module 'nsfw' { interface NsfwWatcher { start(): any; stop(): any; @@ -22,6 +22,7 @@ declare module 'vscode-nsfw' { directory: string; file?: string; newFile?: string; + newDirectory?: string; oldFile?: string; } diff --git a/src/vs/workbench/services/files/node/watcher/nsfw/nsfwWatcherService.ts b/src/vs/workbench/services/files/node/watcher/nsfw/nsfwWatcherService.ts index 87aae11e6bf..37340c40168 100644 --- a/src/vs/workbench/services/files/node/watcher/nsfw/nsfwWatcherService.ts +++ b/src/vs/workbench/services/files/node/watcher/nsfw/nsfwWatcherService.ts @@ -8,7 +8,7 @@ import * as extpath from 'vs/base/common/extpath'; import * as path from 'vs/base/common/path'; import * as platform from 'vs/base/common/platform'; import { IDiskFileChange, normalizeFileChanges, ILogMessage } from 'vs/workbench/services/files/node/watcher/watcher'; -import * as nsfw from 'vscode-nsfw'; +import * as nsfw from 'nsfw'; import { IWatcherService, IWatcherRequest, IWatcherOptions } from 'vs/workbench/services/files/node/watcher/nsfw/watcher'; import { ThrottledDelayer } from 'vs/base/common/async'; import { FileChangeType } from 'vs/platform/files/common/files'; @@ -118,7 +118,7 @@ export class NsfwWatcherService implements IWatcherService { } else if (this._verboseLogging) { this.log(` >> ignored ${absolutePath}`); } - absolutePath = path.join(e.directory, e.newFile || ''); + absolutePath = path.join(e.newDirectory || e.directory, e.newFile || ''); if (!this._isPathIgnored(absolutePath, this._pathWatchers[request.path].ignored)) { undeliveredFileEvents.push({ type: FileChangeType.ADDED, path: absolutePath }); } else if (this._verboseLogging) { diff --git a/yarn.lock b/yarn.lock index acd186d7f7e..8f54d420978 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3410,9 +3410,9 @@ fs-extra@^2.0.0: jsonfile "^2.1.0" fs-extra@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.0.tgz#8cc3f47ce07ef7b3593a11b9fb245f7e34c041d6" - integrity sha512-EglNDLRpmaTWiD/qraZn6HREAEAHJcJOmxNEYwq6xeMKnVMAy3GUcFB+wXt2C6k4CNvB/mP1y/U3dzvKKj5OtQ== + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" @@ -5909,6 +5909,11 @@ nan@2.8.0: resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" integrity sha1-7XFfP+neArV6XmJS2QqWZ14fCFo= +nan@^2.0.0, nan@^2.13.2, nan@^2.14.0: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + nan@^2.10.0: version "2.11.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.0.tgz#574e360e4d954ab16966ec102c0c049fd961a099" @@ -5919,11 +5924,6 @@ nan@^2.12.1: resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" integrity sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw== -nan@^2.13.2, nan@^2.14.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== - nan@^2.9.2, nan@~2.10.0: version "2.10.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" @@ -6172,6 +6172,16 @@ npmlog@^4.0.1, npmlog@^4.0.2: gauge "~2.7.3" set-blocking "~2.0.0" +nsfw@1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/nsfw/-/nsfw-1.2.5.tgz#febe581af616f7b042f89df133abe62416c4c803" + integrity sha512-m3mwZUKXiCR69PDMLfAmKmiNzy0Oe9LhFE0DYZC5cc1htNj5Hyb1sAgglXhuaDkibFy22AVvPC5cCFB3A6mYIw== + dependencies: + fs-extra "^7.0.0" + lodash.isinteger "^4.0.4" + lodash.isundefined "^3.0.1" + nan "^2.0.0" + nth-check@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" @@ -9470,16 +9480,6 @@ vscode-nls-dev@3.2.5: xml2js "^0.4.19" yargs "^10.1.1" -vscode-nsfw@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vscode-nsfw/-/vscode-nsfw-1.1.2.tgz#9cb9073b5854386801afe41f7152f721b4ea9e80" - integrity sha512-J0So+JNK/5kQboTO1hKNk4ie/wwUegrJilYSY5sVxU9JJlo3aQdP0zi2NtU8CEK3kkN6qRp0MbXCzbT0LKGorg== - dependencies: - fs-extra "^7.0.0" - lodash.isinteger "^4.0.4" - lodash.isundefined "^3.0.1" - nan "^2.10.0" - vscode-proxy-agent@0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/vscode-proxy-agent/-/vscode-proxy-agent-0.4.0.tgz#574833e65405c6333f350f1b9fef9909deccb6b5" From da528ed5228a40eff7d2bd438556aadaed53da18 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 2 Jul 2019 16:08:26 +0200 Subject: [PATCH 0900/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5270be485a8..35a86a741d2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "9ef976e0058e674f01d720af9c5fe2ac796ef2c5", + "distro": "aeb8d17f84c592c5a508830f47aa1881dd35a156", "author": { "name": "Microsoft Corporation" }, From 627e9fcca6aefb251d58cb07f17d5046592e2fb3 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 2 Jul 2019 16:10:55 +0200 Subject: [PATCH 0901/1449] nsfw - update ignore --- build/.nativeignore | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/build/.nativeignore b/build/.nativeignore index 64286dae790..e3dca97ca41 100644 --- a/build/.nativeignore +++ b/build/.nativeignore @@ -83,13 +83,13 @@ node-pty/deps/** !node-pty/build/Release/*.dll !node-pty/build/Release/*.node -vscode-nsfw/binding.gyp -vscode-nsfw/build/** -vscode-nsfw/src/** -vscode-nsfw/openpa/** -vscode-nsfw/includes/** -!vscode-nsfw/build/Release/*.node -!vscode-nsfw/**/*.a +nsfw/binding.gyp +nsfw/build/** +nsfw/src/** +nsfw/openpa/** +nsfw/includes/** +!nsfw/build/Release/*.node +!nsfw/**/*.a vsda/binding.gyp vsda/README.md From 41ae43ed749926e17260457f0e038c5ef02af6c9 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 2 Jul 2019 16:37:53 +0200 Subject: [PATCH 0902/1449] electron 4 - provide access to clipboard module --- src/vs/code/electron-main/app.ts | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index 535f64b8d7c..d34f16ef958 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -138,12 +138,34 @@ export class CodeApplication extends Disposable { // // !!! DO NOT CHANGE without consulting the documentation !!! // - app.on('remote-require', event => event.preventDefault()); - app.on('remote-get-global', event => event.preventDefault()); - app.on('remote-get-builtin', event => event.preventDefault()); - app.on('remote-get-current-window', event => event.preventDefault()); - app.on('remote-get-current-web-contents', event => event.preventDefault()); // app.on('remote-get-guest-web-contents', event => event.preventDefault()); // TODO@Ben TODO@Matt revisit this need for + app.on('remote-require', (event, sender, module) => { + this.logService.trace('App#on(remote-require): prevented'); + + event.preventDefault(); + }); + app.on('remote-get-global', (event, sender, module) => { + this.logService.trace(`App#on(remote-get-global): prevented on ${module}`); + + event.preventDefault(); + }); + app.on('remote-get-builtin', (event, sender, module) => { + this.logService.trace(`App#on(remote-get-builtin): prevented on ${module}`); + + if (module !== 'clipboard') { + event.preventDefault(); + } + }); + app.on('remote-get-current-window', event => { + this.logService.trace(`App#on(remote-get-current-window): prevented`); + + event.preventDefault(); + }); + app.on('remote-get-current-web-contents', event => { + this.logService.trace(`App#on(remote-get-current-web-contents): prevented`); + + event.preventDefault(); + }); app.on('web-contents-created', (_event: Electron.Event, contents) => { contents.on('will-attach-webview', (event: Electron.Event, webPreferences, params) => { From 044a5f9206033c7fef2ad4136cacd8f6e28193f4 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Tue, 2 Jul 2019 16:37:17 +0200 Subject: [PATCH 0903/1449] Remove suppressImplicitAnyIndexErrors (#76442) --- src/vs/workbench/api/browser/mainThreadQuickOpen.ts | 8 ++++---- src/vs/workbench/api/common/extHost.protocol.ts | 2 ++ src/vs/workbench/api/common/extHostQuickOpen.ts | 6 +++--- .../workbench/browser/parts/quickinput/quickInputList.ts | 2 +- .../workbench/browser/parts/quickinput/quickInputUtils.ts | 2 +- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadQuickOpen.ts b/src/vs/workbench/api/browser/mainThreadQuickOpen.ts index a44c01c215b..78f8439bf22 100644 --- a/src/vs/workbench/api/browser/mainThreadQuickOpen.ts +++ b/src/vs/workbench/api/browser/mainThreadQuickOpen.ts @@ -174,13 +174,13 @@ export class MainThreadQuickOpen implements MainThreadQuickOpenShape { params[param].forEach((item: TransferQuickPickItems) => { handlesToItems.set(item.handle, item); }); - input[param] = params[param]; + (input as any)[param] = params[param]; } else if (param === 'activeItems' || param === 'selectedItems') { - input[param] = params[param] + (input as any)[param] = params[param] .filter((handle: number) => handlesToItems.has(handle)) .map((handle: number) => handlesToItems.get(handle)); } else if (param === 'buttons') { - input[param] = params.buttons!.map(button => { + (input as any)[param] = params.buttons!.map(button => { if (button.handle === -1) { return this._quickInputService.backButton; } @@ -195,7 +195,7 @@ export class MainThreadQuickOpen implements MainThreadQuickOpenShape { }; }); } else { - input[param] = params[param]; + (input as any)[param] = params[param]; } } return Promise.resolve(undefined); diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 6b747ffac41..b702c64c2da 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -425,6 +425,8 @@ export type TransferQuickInput = TransferQuickPick | TransferInputBox; export interface BaseTransferQuickInput { + [key: string]: any; + id: number; type?: 'quickPick' | 'inputBox'; diff --git a/src/vs/workbench/api/common/extHostQuickOpen.ts b/src/vs/workbench/api/common/extHostQuickOpen.ts index f4c9f456c13..467b05f5c96 100644 --- a/src/vs/workbench/api/common/extHostQuickOpen.ts +++ b/src/vs/workbench/api/common/extHostQuickOpen.ts @@ -458,14 +458,14 @@ function getLightIconUri(iconPath: QuickInputButton['iconPath']) { || iconPath instanceof URI) { return getIconUri(iconPath); } - return getIconUri(iconPath['light']); + return getIconUri((iconPath as any).light); } return undefined; } function getDarkIconUri(iconPath: QuickInputButton['iconPath']) { - if (iconPath && !(iconPath instanceof ThemeIcon) && iconPath['dark']) { - return getIconUri(iconPath['dark']); + if (iconPath && !(iconPath instanceof ThemeIcon) && (iconPath as any).dark) { + return getIconUri((iconPath as any).dark); } return undefined; } diff --git a/src/vs/workbench/browser/parts/quickinput/quickInputList.ts b/src/vs/workbench/browser/parts/quickinput/quickInputList.ts index 7f779285752..a3de4f70c07 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInputList.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInputList.ts @@ -456,7 +456,7 @@ export class QuickInputList { what = 'Last'; } - this.list['focus' + what](); + (this.list as any)['focus' + what](); this.list.reveal(this.list.getFocus()[0]); } diff --git a/src/vs/workbench/browser/parts/quickinput/quickInputUtils.ts b/src/vs/workbench/browser/parts/quickinput/quickInputUtils.ts index babe9495114..3ea185f4750 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInputUtils.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInputUtils.ts @@ -8,7 +8,7 @@ import * as dom from 'vs/base/browser/dom'; import { URI } from 'vs/base/common/uri'; import { IdGenerator } from 'vs/base/common/idGenerator'; -const iconPathToClass = {}; +const iconPathToClass: Record = {}; const iconClassGenerator = new IdGenerator('quick-input-button-icon-'); export function getIconClass(iconPath: { dark: URI; light?: URI; } | undefined): string | undefined { From 878d97fe417d289833bc1dffd7e44da915ba5739 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 2 Jul 2019 17:15:16 +0200 Subject: [PATCH 0904/1449] fix linux build --- build/azure-pipelines/linux/product-build-linux.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 2c4b1e434a0..16f65b8681a 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -96,9 +96,9 @@ steps: VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ yarn gulp vscode-linux-$VSCODE_ARCH-min-ci VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-reh-$VSCODE_ARCH-min-ci + yarn gulp vscode-linux-reh-$VSCODE_ARCH-min-ci VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-web-$VSCODE_ARCH-min-ci + yarn gulp vscode-linux-web-$VSCODE_ARCH-min-ci displayName: Build - script: | From da1691e620a9880940444031129d7e3eabcccff5 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 2 Jul 2019 17:18:55 +0200 Subject: [PATCH 0905/1449] fix builds --- build/azure-pipelines/linux/product-build-linux-alpine.yml | 2 ++ build/azure-pipelines/linux/product-build-linux-arm.yml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/build/azure-pipelines/linux/product-build-linux-alpine.yml b/build/azure-pipelines/linux/product-build-linux-alpine.yml index 5bce791dcf6..b5fe88487a9 100644 --- a/build/azure-pipelines/linux/product-build-linux-alpine.yml +++ b/build/azure-pipelines/linux/product-build-linux-alpine.yml @@ -68,6 +68,8 @@ steps: - script: | set -e + yarn gulp compile-build + yarn gulp compile-extensions-build ./build/azure-pipelines/linux/build-alpine.sh displayName: Build diff --git a/build/azure-pipelines/linux/product-build-linux-arm.yml b/build/azure-pipelines/linux/product-build-linux-arm.yml index 6aac72535bc..c091a44b5f2 100644 --- a/build/azure-pipelines/linux/product-build-linux-arm.yml +++ b/build/azure-pipelines/linux/product-build-linux-arm.yml @@ -68,6 +68,8 @@ steps: - script: | set -e + yarn gulp compile-build + yarn gulp compile-extensions-build ./build/azure-pipelines/linux/build-arm.sh displayName: Build From ffba5d13dad7112ecf8223f944b53aaae6f1231f Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 2 Jul 2019 17:19:29 +0200 Subject: [PATCH 0906/1449] distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8f8ca04521f..5ad5d9637d8 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "9db24329805f1ca7a3333f8fd803816bb05f685c", + "distro": "c64ec576bb320a17e03b2fbfd1c90f2c545a66d2", "author": { "name": "Microsoft Corporation" }, From 0df3e606cf7d688abc89e5edc97e1e7ad220ec50 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 2 Jul 2019 17:23:54 +0200 Subject: [PATCH 0907/1449] better task running conditions --- build/azure-pipelines/product-build.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 85903906f12..d73c162b35d 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -14,7 +14,7 @@ jobs: # - template: compile.yml - job: Windows - condition: eq(variables['VSCODE_BUILD_WIN32'], 'true') + condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32'], 'true')) timeoutInMinutes: 120 pool: vmImage: VS2017-Win2016 @@ -24,7 +24,7 @@ jobs: - template: win32/product-build-win32.yml - job: Windows32 - condition: eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true') + condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true')) timeoutInMinutes: 120 pool: vmImage: VS2017-Win2016 @@ -34,7 +34,7 @@ jobs: - template: win32/product-build-win32.yml - job: Linux - condition: eq(variables['VSCODE_BUILD_LINUX'], 'true') + condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) timeoutInMinutes: 120 pool: vmImage: 'Ubuntu-16.04' @@ -45,7 +45,7 @@ jobs: - template: linux/product-build-linux.yml - job: LinuxSnap - condition: eq(variables['VSCODE_BUILD_LINUX'], 'true') + condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) timeoutInMinutes: 120 pool: vmImage: 'Ubuntu-16.04' @@ -57,7 +57,7 @@ jobs: - template: linux/snap-build-linux.yml - job: LinuxArmhf - condition: and(eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) + condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) timeoutInMinutes: 120 pool: vmImage: 'Ubuntu-16.04' @@ -67,7 +67,7 @@ jobs: - template: linux/product-build-linux-arm.yml - job: LinuxAlpine - condition: and(eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) + condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) timeoutInMinutes: 120 pool: vmImage: 'Ubuntu-16.04' @@ -77,7 +77,7 @@ jobs: - template: linux/product-build-linux-alpine.yml - job: macOS - condition: eq(variables['VSCODE_BUILD_MACOS'], 'true') + condition: and(succeeded(), eq(variables['VSCODE_BUILD_MACOS'], 'true')) timeoutInMinutes: 120 pool: vmImage: macOS 10.13 From 39c9d853725f5d832ad81a65940f495ce507b767 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 2 Jul 2019 17:28:42 +0200 Subject: [PATCH 0908/1449] api - move workspace.workspaceFile out of proposed (#76469) --- src/vs/vscode.d.ts | 31 ++++++++++++++++++++++++++++++ src/vs/vscode.proposed.d.ts | 38 ------------------------------------- 2 files changed, 31 insertions(+), 38 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index a3743d7eeb4..67b899a4313 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -7539,6 +7539,37 @@ declare module 'vscode' { */ export const name: string | undefined; + /** + * The location of the workspace file, for example: + * + * `file:///Users/name/Development/myProject.code-workspace` + * + * or + * + * `untitled:1555503116870` + * + * for a workspace that is untitled and not yet saved. + * + * Depending on the workspace that is opened, the value will be: + * * `undefined` when no workspace or a single folder is opened + * * the path of the workspace file as `Uri` otherwise. if the workspace + * is untitled, the returned URI will use the `untitled:` scheme + * + * The location can e.g. be used with the `vscode.openFolder` command to + * open the workspace again after it has been closed. + * + * **Example:** + * ```typescript + * vscode.commands.executeCommand('vscode.openFolder', uriOfWorkspace); + * ``` + * + * **Note:** it is not advised to use `workspace.workspaceFile` to write + * configuration data into the file. You can use `workspace.getConfiguration().update()` + * for that purpose which will work both when a single folder is opened as + * well as an untitled or saved workspace. + */ + export const workspaceFile: Uri | undefined; + /** * An event that is emitted when a workspace folder is added or removed. */ diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 9fec616de5a..8bdccfcb63f 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1385,44 +1385,6 @@ declare module 'vscode' { } //#endregion - //#region Workspace URI Ben - - export namespace workspace { - - /** - * The location of the workspace file, for example: - * - * `file:///Users/name/Development/myProject.code-workspace` - * - * or - * - * `untitled:1555503116870` - * - * for a workspace that is untitled and not yet saved. - * - * Depending on the workspace that is opened, the value will be: - * * `undefined` when no workspace or a single folder is opened - * * the path of the workspace file as `Uri` otherwise. if the workspace - * is untitled, the returned URI will use the `untitled:` scheme - * - * The location can e.g. be used with the `vscode.openFolder` command to - * open the workspace again after it has been closed. - * - * **Example:** - * ```typescript - * vscode.commands.executeCommand('vscode.openFolder', uriOfWorkspace); - * ``` - * - * **Note:** it is not advised to use `workspace.workspaceFile` to write - * configuration data into the file. You can use `workspace.getConfiguration().update()` - * for that purpose which will work both when a single folder is opened as - * well as an untitled or saved workspace. - */ - export const workspaceFile: Uri | undefined; - } - - //#endregion - // #region Ben - status bar item with ID and Name export namespace window { From 48764becf23f8dc32bdcd16b2e771c7071eacd4b Mon Sep 17 00:00:00 2001 From: Haneef Mohammed Date: Tue, 2 Jul 2019 08:57:31 -0700 Subject: [PATCH 0909/1449] Alternate implementation for lost tree state using getViewState() --- .vscode/launch.json | 6 +-- .../contrib/debug/browser/variablesView.ts | 46 ++++++++++--------- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 1d8207865fd..319de3b2647 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -122,9 +122,9 @@ "type": "chrome", "request": "launch", "name": "Launch VS Code", + "timeout": 20000, "windows": { "runtimeExecutable": "${workspaceFolder}/scripts/code.bat", - "timeout": 20000 }, "osx": { "runtimeExecutable": "${workspaceFolder}/scripts/code.sh" @@ -136,7 +136,7 @@ "VSCODE_EXTHOST_WILL_SEND_SOCKET": null }, "breakOnLoad": false, - "urlFilter": "*workbench.html*", + //"urlFilter": "*workbench.html*", "runtimeArgs": [ "--inspect=5875", "--no-cached-data" @@ -279,4 +279,4 @@ ] }, ] -} \ No newline at end of file +} diff --git a/src/vs/workbench/contrib/debug/browser/variablesView.ts b/src/vs/workbench/contrib/debug/browser/variablesView.ts index ee244fab36d..cf134a73933 100644 --- a/src/vs/workbench/contrib/debug/browser/variablesView.ts +++ b/src/vs/workbench/contrib/debug/browser/variablesView.ts @@ -24,6 +24,7 @@ import { ITreeRenderer, ITreeNode, ITreeMouseEvent, ITreeContextMenuEvent, IAsyn import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { Emitter } from 'vs/base/common/event'; import { WorkbenchAsyncDataTree } from 'vs/platform/list/browser/listService'; +import { IAsyncDataTreeViewState } from 'vs/base/browser/ui/tree/asyncDataTree'; import { onUnexpectedError } from 'vs/base/common/errors'; import { FuzzyScore, createMatches } from 'vs/base/common/filters'; import { HighlightedLabel, IHighlight } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel'; @@ -39,7 +40,7 @@ export class VariablesView extends ViewletPanel { private onFocusStackFrameScheduler: RunOnceScheduler; private needsRefresh: boolean; private tree: WorkbenchAsyncDataTree; - private treeContainer: HTMLElement; + private savedViewState: IAsyncDataTreeViewState | undefined; constructor( options: IViewletViewOptions, @@ -54,35 +55,36 @@ export class VariablesView extends ViewletPanel { // Use scheduler to prevent unnecessary flashing this.onFocusStackFrameScheduler = new RunOnceScheduler(() => { - if (!this.debugService.getViewModel().focusedStackFrame) { - // This is called even when there is no stackFrame (transition from stopped to running) - // We don't want to clear/udate the tree just yet. We will be called again when we have an actual - // stacktrace available. So, simply hide the tree. Thill help preserve the tree state better and - // will even remember state across a restart. - this.treeContainer.hidden = true; - return; - } - this.treeContainer.hidden = false; + const stackFrame = this.debugService.getViewModel().focusedStackFrame; + this.needsRefresh = false; - this.tree.updateChildren().then(() => { - const stackFrame = this.debugService.getViewModel().focusedStackFrame; - if (stackFrame) { - stackFrame.getScopes().then(scopes => { - // Expand the first scope if it is not expensive and if there is no expansion state (all are collapsed) - if (scopes.every(s => this.tree.getNode(s).collapsed) && scopes.length > 0 && !scopes[0].expensive) { - this.tree.expand(scopes[0]).then(undefined, onUnexpectedError); - } - }); + if (stackFrame && this.savedViewState) { + this.tree.setInput(this.debugService.getViewModel(), this.savedViewState).then(null, onUnexpectedError); + this.savedViewState = undefined; + } else { + if (!stackFrame && !this.savedViewState) { + // We have no stackFrame, save tree state before it is cleared + this.savedViewState = this.tree.getViewState(); } - }, onUnexpectedError); + this.tree.updateChildren().then(() => { + if (stackFrame) { + stackFrame.getScopes().then(scopes => { + // Expand the first scope if it is not expensive and if there is no expansion state (all are collapsed) + if (scopes.every(s => this.tree.getNode(s).collapsed) && scopes.length > 0 && !scopes[0].expensive) { + this.tree.expand(scopes[0]).then(undefined, onUnexpectedError); + } + }); + } + }, onUnexpectedError); + } }, 400); } renderBody(container: HTMLElement): void { dom.addClass(container, 'debug-variables'); - this.treeContainer = renderViewTree(container); + const treeContainer = renderViewTree(container); - this.tree = this.instantiationService.createInstance(WorkbenchAsyncDataTree, this.treeContainer, new VariablesDelegate(), + this.tree = this.instantiationService.createInstance(WorkbenchAsyncDataTree, treeContainer, new VariablesDelegate(), [this.instantiationService.createInstance(VariablesRenderer), new ScopesRenderer()], new VariablesDataSource(), { ariaLabel: nls.localize('variablesAriaTreeLabel', "Debug Variables"), From 01defd1c60a49b29c3f27e6c86d5d3696137acf9 Mon Sep 17 00:00:00 2001 From: Logan Ramos Date: Tue, 2 Jul 2019 09:19:10 -0700 Subject: [PATCH 0910/1449] Cleanup argv (#76416) --- src/vs/code/node/cliProcessMain.ts | 2 +- src/vs/platform/environment/node/argv.ts | 38 +----------------- src/vs/platform/telemetry/node/telemetry.ts | 44 +++++++++++++++++++++ 3 files changed, 46 insertions(+), 38 deletions(-) create mode 100644 src/vs/platform/telemetry/node/telemetry.ts diff --git a/src/vs/code/node/cliProcessMain.ts b/src/vs/code/node/cliProcessMain.ts index 5caccaf03b9..69ab16d03f7 100644 --- a/src/vs/code/node/cliProcessMain.ts +++ b/src/vs/code/node/cliProcessMain.ts @@ -41,7 +41,7 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { LocalizationsService } from 'vs/platform/localizations/node/localizations'; import { Schemas } from 'vs/base/common/network'; import { SpdLogService } from 'vs/platform/log/node/spdlogService'; -import { buildTelemetryMessage } from 'vs/platform/environment/node/argv'; +import { buildTelemetryMessage } from 'vs/platform/telemetry/node/telemetry'; const notFound = (id: string) => localize('notFound', "Extension '{0}' not found.", id); const notInstalled = (id: string) => localize('notInstalled', "Extension '{0}' is not installed.", id); diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts index 18cbe48940d..ee259e1ddbe 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts @@ -8,8 +8,7 @@ import * as os from 'os'; import { localize } from 'vs/nls'; import { ParsedArgs } from 'vs/platform/environment/common/environment'; import { join } from 'vs/base/common/path'; -import { statSync, readFileSync } from 'fs'; -import { writeFileSync, readdirSync } from 'vs/base/node/pfs'; +import { writeFileSync } from 'vs/base/node/pfs'; /** * This code is also used by standalone cli's. Avoid adding any other dependencies. @@ -219,41 +218,6 @@ export function buildVersionMessage(version: string | undefined, commit: string return `${version || localize('unknownVersion', "Unknown version")}\n${commit || localize('unknownCommit', "Unknown commit")}\n${process.arch}`; } -export function buildTelemetryMessage(appRoot: string, extensionsPath: string): string { - // Gets all the directories inside the extension directory - const dirs = readdirSync(extensionsPath).filter(files => { - // This handles case where broken symbolic links can cause statSync to throw and error - try { - return statSync(join(extensionsPath, files)).isDirectory(); - } catch { - return false; - } - }); - const telemetryJsonFolders: string[] = []; - dirs.forEach((dir) => { - const files = readdirSync(join(extensionsPath, dir)).filter(file => file === 'telemetry.json'); - // We know it contains a telemetry.json file so we add it to the list of folders which have one - if (files.length === 1) { - telemetryJsonFolders.push(dir); - } - }); - const mergedTelemetry = Object.create(null); - // Simple function to merge the telemetry into one json object - const mergeTelemetry = (contents: string, dirName: string) => { - const telemetryData = JSON.parse(contents); - mergedTelemetry[dirName] = telemetryData; - }; - telemetryJsonFolders.forEach((folder) => { - const contents = readFileSync(join(extensionsPath, folder, 'telemetry.json')).toString(); - mergeTelemetry(contents, folder); - }); - let contents = readFileSync(join(appRoot, 'telemetry-core.json')).toString(); - mergeTelemetry(contents, 'vscode-core'); - contents = readFileSync(join(appRoot, 'telemetry-extensions.json')).toString(); - mergeTelemetry(contents, 'vscode-extensions'); - return JSON.stringify(mergedTelemetry, null, 4); -} - /** * Converts an argument into an array * @param arg a argument value. Can be undefined, an entry or an array diff --git a/src/vs/platform/telemetry/node/telemetry.ts b/src/vs/platform/telemetry/node/telemetry.ts new file mode 100644 index 00000000000..31b4ca31d46 --- /dev/null +++ b/src/vs/platform/telemetry/node/telemetry.ts @@ -0,0 +1,44 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + + +import { readdirSync } from 'vs/base/node/pfs'; +import { statSync, readFileSync } from 'fs'; +import { join } from 'vs/base/common/path'; + +export function buildTelemetryMessage(appRoot: string, extensionsPath: string): string { + // Gets all the directories inside the extension directory + const dirs = readdirSync(extensionsPath).filter(files => { + // This handles case where broken symbolic links can cause statSync to throw and error + try { + return statSync(join(extensionsPath, files)).isDirectory(); + } catch { + return false; + } + }); + const telemetryJsonFolders: string[] = []; + dirs.forEach((dir) => { + const files = readdirSync(join(extensionsPath, dir)).filter(file => file === 'telemetry.json'); + // We know it contains a telemetry.json file so we add it to the list of folders which have one + if (files.length === 1) { + telemetryJsonFolders.push(dir); + } + }); + const mergedTelemetry = Object.create(null); + // Simple function to merge the telemetry into one json object + const mergeTelemetry = (contents: string, dirName: string) => { + const telemetryData = JSON.parse(contents); + mergedTelemetry[dirName] = telemetryData; + }; + telemetryJsonFolders.forEach((folder) => { + const contents = readFileSync(join(extensionsPath, folder, 'telemetry.json')).toString(); + mergeTelemetry(contents, folder); + }); + let contents = readFileSync(join(appRoot, 'telemetry-core.json')).toString(); + mergeTelemetry(contents, 'vscode-core'); + contents = readFileSync(join(appRoot, 'telemetry-extensions.json')).toString(); + mergeTelemetry(contents, 'vscode-extensions'); + return JSON.stringify(mergedTelemetry, null, 4); +} \ No newline at end of file From 003fb37af99fa13d449c83c6de34d6540699df61 Mon Sep 17 00:00:00 2001 From: Haneef Mohammed Date: Tue, 2 Jul 2019 09:23:19 -0700 Subject: [PATCH 0911/1449] Revert back to original. 'urlFilter' is producing error/timeouts on Mac but don't want to make this into the PR --- .vscode/launch.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 319de3b2647..1d8207865fd 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -122,9 +122,9 @@ "type": "chrome", "request": "launch", "name": "Launch VS Code", - "timeout": 20000, "windows": { "runtimeExecutable": "${workspaceFolder}/scripts/code.bat", + "timeout": 20000 }, "osx": { "runtimeExecutable": "${workspaceFolder}/scripts/code.sh" @@ -136,7 +136,7 @@ "VSCODE_EXTHOST_WILL_SEND_SOCKET": null }, "breakOnLoad": false, - //"urlFilter": "*workbench.html*", + "urlFilter": "*workbench.html*", "runtimeArgs": [ "--inspect=5875", "--no-cached-data" @@ -279,4 +279,4 @@ ] }, ] -} +} \ No newline at end of file From fe1258b594c72c1ee014b66ee3193acf67d03f1d Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Tue, 2 Jul 2019 09:25:22 -0700 Subject: [PATCH 0912/1449] Fix #76412, apply background size to custom view actions --- src/vs/workbench/browser/parts/views/media/views.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/browser/parts/views/media/views.css b/src/vs/workbench/browser/parts/views/media/views.css index 43724543ae6..7469562967f 100644 --- a/src/vs/workbench/browser/parts/views/media/views.css +++ b/src/vs/workbench/browser/parts/views/media/views.css @@ -152,6 +152,7 @@ .customview-tree .monaco-tree .custom-view-tree-node-item > .custom-view-tree-node-item-resourceLabel > .actions .action-label { width: 16px; height: 100%; + background-size: 16px; background-position: 50% 50%; background-repeat: no-repeat; } \ No newline at end of file From 969f79b75bee6fa6e1477356b0365db05409ea41 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 2 Jul 2019 18:27:27 +0200 Subject: [PATCH 0913/1449] fix linux build --- build/azure-pipelines/linux/product-build-linux.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 16f65b8681a..33bb6520baf 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -96,9 +96,9 @@ steps: VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ yarn gulp vscode-linux-$VSCODE_ARCH-min-ci VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-linux-reh-$VSCODE_ARCH-min-ci + yarn gulp vscode-reh-linux-$VSCODE_ARCH-min-ci VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-linux-web-$VSCODE_ARCH-min-ci + yarn gulp vscode-web-linux-$VSCODE_ARCH-min-ci displayName: Build - script: | From b96cbd870b01a3c757e72f755a9b17a6ab585290 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 2 Jul 2019 09:44:37 -0700 Subject: [PATCH 0914/1449] Fix issues with early ext host terminal messages going missing --- src/vs/vscode.proposed.d.ts | 2 ++ .../api/browser/mainThreadTerminalService.ts | 24 +++++++++++-------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 5715e0efa4e..ec70b181c74 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1272,6 +1272,8 @@ declare module 'vscode' { // Allows ~ to be resolved in Live Share // userHome?: string; + + // cwd: string } interface TerminalVirtualProcess { diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index 81e26f293e0..42d9969caa4 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -18,7 +18,8 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape private _proxy: ExtHostTerminalServiceShape; private _remoteAuthority: string | null; private _toDispose: IDisposable[] = []; - private _terminalProcesses: { [id: number]: ITerminalProcessExtHostProxy } = {}; + private _terminalProcesses: { [id: number]: Promise } = {}; + private _terminalProcessesReady: { [id: number]: (proxy: ITerminalProcessExtHostProxy) => void } = {}; private _terminalOnDidWriteDataListeners: { [id: number]: IDisposable } = {}; private _terminalOnDidAcceptInputListeners: { [id: number]: IDisposable } = {}; @@ -92,6 +93,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape isVirtualProcess }; const terminal = this._terminalService.createTerminal(shellLaunchConfig); + this._terminalProcesses[terminal.id] = new Promise(r => this._terminalProcessesReady[terminal.id] = r); return Promise.resolve({ id: terminal.id, name: terminal.title @@ -242,7 +244,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape return; } - this._terminalProcesses[request.proxy.terminalId] = request.proxy; + this._terminalProcessesReady[request.proxy.terminalId](request.proxy); const shellLaunchConfigDto: ShellLaunchConfigDto = { name: request.shellLaunchConfig.name, executable: request.shellLaunchConfig.executable, @@ -261,7 +263,9 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape private _onTerminalRequestVirtualProcess(proxy: ITerminalProcessExtHostProxy): void { console.log('_onTerminalRequestVirtualProcess', proxy); - this._terminalProcesses[proxy.terminalId] = proxy; + this._terminalProcessesReady[proxy.terminalId](proxy); + delete this._terminalProcessesReady[proxy.terminalId]; + proxy.onInput(data => { console.log('_onTerminalRequestVirtualProcess onInput', data); this._proxy.$acceptProcessInput(proxy.terminalId, data); @@ -274,28 +278,28 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape } public $sendProcessTitle(terminalId: number, title: string): void { - this._terminalProcesses[terminalId].emitTitle(title); + this._terminalProcesses[terminalId].then(e => e.emitTitle(title)); } public $sendProcessData(terminalId: number, data: string): void { - this._terminalProcesses[terminalId].emitData(data); + this._terminalProcesses[terminalId].then(e => e.emitData(data)); } public $sendProcessReady(terminalId: number, pid: number, cwd: string): void { - this._terminalProcesses[terminalId].emitReady(pid, cwd); + this._terminalProcesses[terminalId].then(e => e.emitReady(pid, cwd)); } public $sendProcessExit(terminalId: number, exitCode: number): void { - this._terminalProcesses[terminalId].emitExit(exitCode); + this._terminalProcesses[terminalId].then(e => e.emitExit(exitCode)); delete this._terminalProcesses[terminalId]; } public $sendProcessInitialCwd(terminalId: number, initialCwd: string): void { - this._terminalProcesses[terminalId].emitInitialCwd(initialCwd); + this._terminalProcesses[terminalId].then(e => e.emitInitialCwd(initialCwd)); } public $sendProcessCwd(terminalId: number, cwd: string): void { - this._terminalProcesses[terminalId].emitCwd(cwd); + this._terminalProcesses[terminalId].then(e => e.emitCwd(cwd)); } private async _onRequestLatency(terminalId: number): Promise { @@ -307,7 +311,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape sw.stop(); sum += sw.elapsed(); } - this._terminalProcesses[terminalId].emitLatency(sum / COUNT); + this._terminalProcesses[terminalId].then(e => e.emitLatency(sum / COUNT)); } private _isPrimaryExtHost(): boolean { From 059c302338ba261f33d8ff8fec5c5f55f247e4d5 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 2 Jul 2019 09:48:03 -0700 Subject: [PATCH 0915/1449] doc --- src/vs/workbench/contrib/terminal/common/terminal.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index 2d0fbb433ee..f995eac6960 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -184,12 +184,13 @@ export interface IShellLaunchConfig { initialText?: string; /** - * When true the terminal will be created with no process. This is primarily used to give - * extensions full control over the terminal. * @deprecated use `isVirtualProcess` */ isRendererOnly?: boolean; + /** + * When true an extension is acting as the terminal's process. + */ isVirtualProcess?: boolean; /** From 51aab4d1eb70a737240680a13880eab4d91edbc3 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 2 Jul 2019 10:26:59 -0700 Subject: [PATCH 0916/1449] Impl overrideDimensions --- src/vs/vscode.proposed.d.ts | 2 +- .../api/browser/mainThreadTerminalService.ts | 4 ++++ src/vs/workbench/api/common/extHost.protocol.ts | 1 + .../workbench/api/node/extHostTerminalService.ts | 16 ++++++++++------ .../contrib/terminal/browser/terminalInstance.ts | 5 +++-- .../terminal/browser/terminalProcessManager.ts | 7 ++++++- .../contrib/terminal/common/terminal.ts | 3 +++ .../common/terminalProcessExtHostProxy.ts | 8 +++++++- 8 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index ec70b181c74..3b386973426 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1281,7 +1281,7 @@ declare module 'vscode' { write: Event; // Lets the extension override the dimensions of the terminal - overrideDimensions?: Event; + overrideDimensions?: Event; // Lets the extension exit the process with an exit code, this was not in the TerminalRenderer // API but it makes sense to include this as it's the main thing missing for a virtual process diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index 42d9969caa4..08b316ba0ba 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -294,6 +294,10 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape delete this._terminalProcesses[terminalId]; } + public $sendOverrideDimensions(terminalId: number, dimensions: ITerminalDimensions | undefined): void { + this._terminalProcesses[terminalId].then(e => e.emitOverrideDimensions(dimensions)); + } + public $sendProcessInitialCwd(terminalId: number, initialCwd: string): void { this._terminalProcesses[terminalId].then(e => e.emitInitialCwd(initialCwd)); } diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index c2ecdd2e1b1..0733bc2776d 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -403,6 +403,7 @@ export interface MainThreadTerminalServiceShape extends IDisposable { $sendProcessData(terminalId: number, data: string): void; $sendProcessReady(terminalId: number, pid: number, cwd: string): void; $sendProcessExit(terminalId: number, exitCode: number): void; + $sendOverrideDimensions(terminalId: number, dimensions: ITerminalDimensions | undefined): void; $sendProcessInitialCwd(terminalId: number, cwd: string): void; $sendProcessCwd(terminalId: number, initialCwd: string): void; diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index e1e2e2d032d..cbac2f8f96b 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -13,7 +13,7 @@ import { Event, Emitter } from 'vs/base/common/event'; import { ExtHostTerminalServiceShape, MainContext, MainThreadTerminalServiceShape, IMainContext, ShellLaunchConfigDto, IShellDefinitionDto, IShellAndArgsDto } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostConfiguration, ExtHostConfigProvider } from 'vs/workbench/api/common/extHostConfiguration'; import { ILogService } from 'vs/platform/log/common/log'; -import { EXT_HOST_CREATION_DELAY, IShellLaunchConfig, ITerminalEnvironment, ITerminalChildProcess } from 'vs/workbench/contrib/terminal/common/terminal'; +import { EXT_HOST_CREATION_DELAY, IShellLaunchConfig, ITerminalEnvironment, ITerminalChildProcess, ITerminalDimensions } from 'vs/workbench/contrib/terminal/common/terminal'; import { TerminalProcess } from 'vs/workbench/contrib/terminal/node/terminalProcess'; import { timeout } from 'vs/base/common/async'; import { ExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; @@ -575,6 +575,9 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { p.onProcessTitleChanged(title => this._proxy.$sendProcessTitle(id, title)); p.onProcessData(data => this._proxy.$sendProcessData(id, data)); p.onProcessExit(exitCode => this._onProcessExit(id, exitCode)); + if (p.onProcessOverrideDimensions) { + p.onProcessOverrideDimensions(e => this._proxy.$sendOverrideDimensions(id, e)); + } this._terminalProcesses[id] = p; } @@ -704,7 +707,7 @@ class ApiRequest { } class ExtHostVirtualProcess implements ITerminalChildProcess { - private _queuedEvents: (IQueuedEvent | IQueuedEvent | IQueuedEvent<{ pid: number, cwd: string }>)[] = []; + private _queuedEvents: (IQueuedEvent | IQueuedEvent | IQueuedEvent<{ pid: number, cwd: string }> | IQueuedEvent)[] = []; private _queueDisposables: IDisposable[] | undefined; private readonly _onProcessData = new Emitter(); @@ -715,6 +718,8 @@ class ExtHostVirtualProcess implements ITerminalChildProcess { public get onProcessReady(): Event<{ pid: number, cwd: string }> { return this._onProcessReady.event; } private readonly _onProcessTitleChanged = new Emitter(); public get onProcessTitleChanged(): Event { return this._onProcessTitleChanged.event; } + private readonly _onProcessOverrideDimensions = new Emitter(); + public get onProcessOverrideDimensions(): Event { return this._onProcessOverrideDimensions.event; } constructor( private readonly _virtualProcess: vscode.TerminalVirtualProcess @@ -726,6 +731,7 @@ class ExtHostVirtualProcess implements ITerminalChildProcess { } // TODO: Handle overrideDimensions, use an optional event on the interface? if (this._virtualProcess.overrideDimensions) { + this._queueDisposables.push(this._virtualProcess.overrideDimensions(e => this._queuedEvents.push({ emitter: this._onProcessOverrideDimensions, data: e ? { cols: e.columns, rows: e.rows } : undefined }))); } } @@ -762,9 +768,7 @@ class ExtHostVirtualProcess implements ITerminalChildProcess { startSendingEvents(): void { // Flush all buffered events - this._queuedEvents.forEach(e => { - e.emitter.fire(e.data); - }); + this._queuedEvents.forEach(e => (e.emitter.fire)(e.data)); this._queuedEvents = []; this._queueDisposables = undefined; @@ -774,7 +778,7 @@ class ExtHostVirtualProcess implements ITerminalChildProcess { this._virtualProcess.exit(e => this._onProcessExit.fire(e)); } if (this._virtualProcess.overrideDimensions) { - // TODO: Implement this + this._virtualProcess.overrideDimensions(e => this._onProcessOverrideDimensions.fire(e ? { cols: e.columns, rows: e.rows } : e)); } } } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index 05fdc623efa..cfe096303a2 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -174,7 +174,7 @@ export class TerminalInstance implements ITerminalInstance { private _terminalHasTextContextKey: IContextKey; private _cols: number; private _rows: number; - private _dimensionsOverride: ITerminalDimensions; + private _dimensionsOverride: ITerminalDimensions | undefined; private _windowsShellHelper: IWindowsShellHelper | undefined; private _xtermReadyPromise: Promise; private _titleReadyPromise: Promise; @@ -945,6 +945,7 @@ export class TerminalInstance implements ITerminalInstance { this._processManager.onProcessReady(() => this._onProcessIdReady.fire(this)); this._processManager.onProcessExit(exitCode => this._onProcessExit(exitCode)); this._processManager.onProcessData(data => this._onData.fire(data)); + this._processManager.onProcessOverrideDimensions(e => this.setDimensions(e)); if (this._shellLaunchConfig.name) { this.setTitle(this._shellLaunchConfig.name, false); @@ -1343,7 +1344,7 @@ export class TerminalInstance implements ITerminalInstance { return this._titleReadyPromise; } - public setDimensions(dimensions: ITerminalDimensions): void { + public setDimensions(dimensions: ITerminalDimensions | undefined): void { this._dimensionsOverride = dimensions; this._resize(); } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts index 55b186aef7a..a2fa6621c5d 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts @@ -5,7 +5,7 @@ import * as platform from 'vs/base/common/platform'; import * as terminalEnvironment from 'vs/workbench/contrib/terminal/common/terminalEnvironment'; -import { ProcessState, ITerminalProcessManager, IShellLaunchConfig, ITerminalConfigHelper, ITerminalChildProcess, IBeforeProcessDataEvent, ITerminalEnvironment } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ProcessState, ITerminalProcessManager, IShellLaunchConfig, ITerminalConfigHelper, ITerminalChildProcess, IBeforeProcessDataEvent, ITerminalEnvironment, ITerminalDimensions } from 'vs/workbench/contrib/terminal/common/terminal'; import { ILogService } from 'vs/platform/log/common/log'; import { Emitter, Event } from 'vs/base/common/event'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; @@ -68,6 +68,8 @@ export class TerminalProcessManager implements ITerminalProcessManager { public get onProcessTitle(): Event { return this._onProcessTitle.event; } private readonly _onProcessExit = new Emitter(); public get onProcessExit(): Event { return this._onProcessExit.event; } + private readonly _onProcessOverrideDimensions = new Emitter(); + public get onProcessOverrideDimensions(): Event { return this._onProcessOverrideDimensions.event; } constructor( private readonly _terminalId: number, @@ -166,6 +168,9 @@ export class TerminalProcessManager implements ITerminalProcessManager { this._process.onProcessTitleChanged(title => this._onProcessTitle.fire(title)); this._process.onProcessExit(exitCode => this._onExit(exitCode)); + if (this._process.onProcessOverrideDimensions) { + this._process.onProcessOverrideDimensions(e => this._onProcessOverrideDimensions.fire(e)); + } setTimeout(() => { if (this.processState === ProcessState.LAUNCHING) { diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index f995eac6960..faddc2df87d 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -706,6 +706,7 @@ export interface ITerminalProcessManager extends IDisposable { readonly onProcessData: Event; readonly onProcessTitle: Event; readonly onProcessExit: Event; + readonly onProcessOverrideDimensions: Event; dispose(immediate?: boolean): void; createProcess(shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number, isScreenReaderModeEnabled: boolean): Promise; @@ -743,6 +744,7 @@ export interface ITerminalProcessExtHostProxy extends IDisposable { emitTitle(title: string): void; emitReady(pid: number, cwd: string): void; emitExit(exitCode: number): void; + emitOverrideDimensions(dimensions: ITerminalDimensions | undefined): void; emitInitialCwd(initialCwd: string): void; emitCwd(cwd: string): void; emitLatency(latency: number): void; @@ -791,6 +793,7 @@ export interface ITerminalChildProcess { onProcessExit: Event; onProcessReady: Event<{ pid: number, cwd: string }>; onProcessTitleChanged: Event; + onProcessOverrideDimensions?: Event; /** * Shutdown the terminal process. diff --git a/src/vs/workbench/contrib/terminal/common/terminalProcessExtHostProxy.ts b/src/vs/workbench/contrib/terminal/common/terminalProcessExtHostProxy.ts index edc4cbb459c..f551c553efb 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalProcessExtHostProxy.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalProcessExtHostProxy.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Event, Emitter } from 'vs/base/common/event'; -import { ITerminalService, ITerminalProcessExtHostProxy, IShellLaunchConfig, ITerminalChildProcess, ITerminalConfigHelper } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ITerminalService, ITerminalProcessExtHostProxy, IShellLaunchConfig, ITerminalChildProcess, ITerminalConfigHelper, ITerminalDimensions } from 'vs/workbench/contrib/terminal/common/terminal'; import { Disposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; @@ -22,6 +22,8 @@ export class TerminalProcessExtHostProxy extends Disposable implements ITerminal public get onProcessReady(): Event<{ pid: number, cwd: string }> { return this._onProcessReady.event; } private readonly _onProcessTitleChanged = this._register(new Emitter()); public readonly onProcessTitleChanged: Event = this._onProcessTitleChanged.event; + private readonly _onProcessOverrideDimensions = new Emitter(); + public get onProcessOverrideDimensions(): Event { return this._onProcessOverrideDimensions.event; } private readonly _onInput = this._register(new Emitter()); public readonly onInput: Event = this._onInput.event; @@ -87,6 +89,10 @@ export class TerminalProcessExtHostProxy extends Disposable implements ITerminal this.dispose(); } + public emitOverrideDimensions(dimensions: ITerminalDimensions | undefined): void { + this._onProcessOverrideDimensions.fire(dimensions); + } + public emitInitialCwd(initialCwd: string): void { while (this._pendingInitialCwdRequests.length > 0) { this._pendingInitialCwdRequests.pop()!(initialCwd); From d8106f5ca8732f0a4580ba46680f385b0c0df321 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 2 Jul 2019 19:45:20 +0200 Subject: [PATCH 0917/1449] fix #76354 --- src/vs/editor/contrib/suggest/suggestModel.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/vs/editor/contrib/suggest/suggestModel.ts b/src/vs/editor/contrib/suggest/suggestModel.ts index 97eaa3dafda..63de4055d7e 100644 --- a/src/vs/editor/contrib/suggest/suggestModel.ts +++ b/src/vs/editor/contrib/suggest/suggestModel.ts @@ -293,6 +293,9 @@ export class SuggestModel implements IDisposable { this.cancel(); this._triggerQuickSuggest.cancelAndSet(() => { + if (this._state !== State.Idle) { + return; + } if (!LineContext.shouldAutoTrigger(this._editor)) { return; } From b9edd59300226dd4416af36731ebea70e39adc42 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Tue, 2 Jul 2019 10:55:17 -0700 Subject: [PATCH 0918/1449] Add dark info icon for suggest widget --- src/vs/editor/contrib/suggest/media/suggest.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/vs/editor/contrib/suggest/media/suggest.css b/src/vs/editor/contrib/suggest/media/suggest.css index a93e5b8be49..23f9e36ad30 100644 --- a/src/vs/editor/contrib/suggest/media/suggest.css +++ b/src/vs/editor/contrib/suggest/media/suggest.css @@ -301,6 +301,11 @@ background-image: url('./close-dark.svg'); } +.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .readMore, +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .readMore { + background-image: url('./info-dark.svg'); +} + .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .suggest-icon::before, .monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .suggest-icon::before { background-image: url('Misc_inverse_16x.svg'); } From 6130309edce46d1eb882c0f3089fe55a9f6cc4d3 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 2 Jul 2019 10:57:59 -0700 Subject: [PATCH 0919/1449] API docs --- src/vs/vscode.proposed.d.ts | 103 +++++++++++++++++++++++++++++++----- 1 file changed, 91 insertions(+), 12 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 3b386973426..f56afd09c5e 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1258,13 +1258,30 @@ declare module 'vscode' { //#region Terminal virtual process - // export function createTerminal(options: TerminalOptions | TerminalVirtualProcessOptions): Terminal; + export namespace window { + /** + * Creates a [Terminal](#Terminal) where an extension acts as the process. + * + * @param options A [TerminalVirtualProcessOptions](#TerminalVirtualProcessOptions) object describing the + * characteristics of the new terminal. + * @return A new Terminal. + */ + export function createTerminal(options: TerminalVirtualProcessOptions): Terminal; + } + /** + * Value-object describing what options a virtual process terminal should use. + */ export interface TerminalVirtualProcessOptions { - // For a name property for TerminalVirtualProcessOptions. - // Note that this is mandatory here as there's no process/shell to grab the title from + /** + * A human-readable string which will be used to represent the terminal in the UI. + */ name: string; + /** + * An implementation of [TerminalVirtualProcess](#TerminalVirtualProcess) that allows an + * extension to act as a terminal's backing process. + */ virtualProcess: TerminalVirtualProcess; // Allows Windows or non-Windows local link handler to be used based on Live Share host OS @@ -1276,27 +1293,89 @@ declare module 'vscode' { // cwd: string } + /** + * Defines the interface of a terminal virtual process, enabling extensions to act as a process + * in the terminal. + */ interface TerminalVirtualProcess { - // The ext should fire this when they want to write to the terminal + /** + * An event that when fired will write data to the terminal. Unlike + * [Terminal.sendText](#Terminal.sendText) which sends text to the underlying _process_, + * this will write the text to the terminal itself. + * + * **Example:** Write red text to the terminal + * ```typescript + * const writeEmitter = new vscode.EventEmitter(); + * const virtualProcess: TerminalVirtualProcess = { + * write: writeEmitter.event + * }; + * vscode.window.createTerminal({ name: 'My terminal', virtualProcess }); + * writeEmitter.fire('\x1b[31mHello world\x1b[0m'); + * ``` + * + * **Example:** Move the cursor to the 10th row and 20th column and write an asterisk + * ```typescript + * writeEmitter.fire('\x1b[10;20H*'); + * ``` + */ write: Event; - // Lets the extension override the dimensions of the terminal + /** + * An event that when fired allows overriding the [dimensions](#Terminal.dimensions) of the + * terminal. Note that when set the overridden dimensions will only take effect when they + * are lower than the actual dimensions of the terminal (ie. there will never be a scroll + * bar). Set to `undefined` for the terminal to go back to the regular dimensions. + * + * **Example:** Override the dimensions of a terminal to 20 columns and 10 rows + * ```typescript + * const dimensionsEmitter = new vscode.EventEmitter(); + * const virtualProcess: TerminalVirtualProcess = { + * write: writeEmitter.event, + * overrideDimensions: dimensionsEmitter.event + * }; + * vscode.window.createTerminal({ name: 'My terminal', virtualProcess }); + * dimensionsEmitter.fire({ + * columns: 20, + * rows: 10 + * }); + * ``` + */ overrideDimensions?: Event; - // Lets the extension exit the process with an exit code, this was not in the TerminalRenderer - // API but it makes sense to include this as it's the main thing missing for a virtual process - // to truly act like a process + /** + * An event that when fired will exit the process with an exit code, this will behave the + * same for a virtual process as when a regular process exits with an exit code. + */ exit?: Event; - // This will be called when the user types + /** + * Implement to handle keystrokes in the terminal or when an extension calls + * [Terminal.sendText](#Terminal.sendText). Keystrokes are converted into theircorresponding + * VT sequence representation. + * + * **Example:** Echo input in the terminal. The sequence for enter (`\r`) is translated to + * CRLF to go to a new line and move the cursor to the start of the line. + * ```typescript + * const writeEmitter = new vscode.EventEmitter(); + * const virtualProcess: TerminalVirtualProcess = { + * write: writeEmitter.event, + * onDidAcceptInput: data => writeEmitter.fire(data === '\r' ? '\r\n' : data); + * }; + * vscode.window.createTerminal({ name: 'Local echo', virtualProcess }); + * ``` + */ onDidAcceptInput?(text: string): void; - // This is called fire when window.onDidChangeTerminalDimensions fires as CustomExecution need - // access to the "maximum" dimensions and don't want access to Terminal + /** + * Implement to handle when the number of rows and columns that fit into the terminal panel + * changes, for example when font size changes or when the panel is resized. + * + * @param dimensions The new dimensions. + */ onDidChangeDimensions?(dimensions: TerminalDimensions): void; /** - * This is called when the user closes the terminal. + * Implement to handle when the terminal shuts down by an act of the user. */ onDidShutdownTerminal?(): void; } From 1e742e302f20df0563a70fe15c3c22141f786830 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 2 Jul 2019 10:59:51 -0700 Subject: [PATCH 0920/1449] More docs --- src/vs/vscode.proposed.d.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index f56afd09c5e..52cf3806819 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1368,7 +1368,9 @@ declare module 'vscode' { /** * Implement to handle when the number of rows and columns that fit into the terminal panel - * changes, for example when font size changes or when the panel is resized. + * changes, for example when font size changes or when the panel is resized. The initial + * state of a terminal's dimensions should be treated as `undefined` until this is triggered + * as the size of a terminal isn't know until it shows up in the user interface. * * @param dimensions The new dimensions. */ From 0d809b4036da21038e2c488e95e4920d78bb9248 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 2 Jul 2019 11:10:13 -0700 Subject: [PATCH 0921/1449] Clean up --- src/vs/vscode.proposed.d.ts | 8 -------- src/vs/workbench/api/browser/mainThreadTerminalService.ts | 7 +------ .../contrib/terminal/browser/terminalProcessManager.ts | 1 - 3 files changed, 1 insertion(+), 15 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 52cf3806819..92e842dc78c 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1283,14 +1283,6 @@ declare module 'vscode' { * extension to act as a terminal's backing process. */ virtualProcess: TerminalVirtualProcess; - - // Allows Windows or non-Windows local link handler to be used based on Live Share host OS - // os?: OperatingSystem; - - // Allows ~ to be resolved in Live Share - // userHome?: string; - - // cwd: string } /** diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index 08b316ba0ba..5ba2b3bbb24 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -79,7 +79,6 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape } public $createTerminal(name?: string, shellPath?: string, shellArgs?: string[] | string, cwd?: string | UriComponents, env?: { [key: string]: string }, waitOnExit?: boolean, strictEnv?: boolean, hideFromUser?: boolean, isVirtualProcess?: boolean): Promise<{ id: number, name: string }> { - console.log('$createTerminal', arguments); const shellLaunchConfig: IShellLaunchConfig = { name, executable: shellPath, @@ -262,14 +261,10 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape } private _onTerminalRequestVirtualProcess(proxy: ITerminalProcessExtHostProxy): void { - console.log('_onTerminalRequestVirtualProcess', proxy); this._terminalProcessesReady[proxy.terminalId](proxy); delete this._terminalProcessesReady[proxy.terminalId]; - proxy.onInput(data => { - console.log('_onTerminalRequestVirtualProcess onInput', data); - this._proxy.$acceptProcessInput(proxy.terminalId, data); - }); + proxy.onInput(data => this._proxy.$acceptProcessInput(proxy.terminalId, data)); proxy.onResize(dimensions => this._proxy.$acceptProcessResize(proxy.terminalId, dimensions.cols, dimensions.rows)); proxy.onShutdown(immediate => this._proxy.$acceptProcessShutdown(proxy.terminalId, immediate)); proxy.onRequestCwd(() => this._proxy.$acceptProcessRequestCwd(proxy.terminalId)); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts index a2fa6621c5d..5bbb0612709 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts @@ -114,7 +114,6 @@ export class TerminalProcessManager implements ITerminalProcessManager { if (shellLaunchConfig.isVirtualProcess) { this._processType = ProcessType.VirtualProcess; this._process = this._instantiationService.createInstance(TerminalProcessExtHostProxy, this._terminalId, shellLaunchConfig, undefined, cols, rows, this._configHelper); - console.log('set terminal process ext host proxy', this._process); } else { const forceExtHostProcess = (this._configHelper.config as any).extHostProcess; if (shellLaunchConfig.cwd && typeof shellLaunchConfig.cwd === 'object') { From 188c3652d444f841073128f4e65662150d683b90 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 2 Jul 2019 11:16:17 -0700 Subject: [PATCH 0922/1449] doc polish --- src/vs/vscode.proposed.d.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 92e842dc78c..042ac65a4bd 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1342,8 +1342,10 @@ declare module 'vscode' { /** * Implement to handle keystrokes in the terminal or when an extension calls - * [Terminal.sendText](#Terminal.sendText). Keystrokes are converted into theircorresponding - * VT sequence representation. + * [Terminal.sendText](#Terminal.sendText). Keystrokes are converted into their + * corresponding VT sequence representation. + * + * @param data The sent data. * * **Example:** Echo input in the terminal. The sequence for enter (`\r`) is translated to * CRLF to go to a new line and move the cursor to the start of the line. @@ -1356,7 +1358,7 @@ declare module 'vscode' { * vscode.window.createTerminal({ name: 'Local echo', virtualProcess }); * ``` */ - onDidAcceptInput?(text: string): void; + onDidAcceptInput?(data: string): void; /** * Implement to handle when the number of rows and columns that fit into the terminal panel From 00549804819dcaf056f9a747cef412f218222760 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 2 Jul 2019 11:20:59 -0700 Subject: [PATCH 0923/1449] Pass args via object --- .../api/browser/mainThreadTerminalService.ts | 24 +++++++++---------- .../workbench/api/common/extHost.protocol.ts | 14 ++++++++++- .../api/node/extHostTerminalService.ts | 5 ++-- 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index 5ba2b3bbb24..a388f623d74 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -5,9 +5,9 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { ITerminalService, ITerminalInstance, IShellLaunchConfig, ITerminalProcessExtHostProxy, ITerminalProcessExtHostRequest, ITerminalDimensions, EXT_HOST_CREATION_DELAY, IAvailableShellsRequest, IDefaultShellAndArgsRequest } from 'vs/workbench/contrib/terminal/common/terminal'; -import { ExtHostContext, ExtHostTerminalServiceShape, MainThreadTerminalServiceShape, MainContext, IExtHostContext, ShellLaunchConfigDto } from 'vs/workbench/api/common/extHost.protocol'; +import { ExtHostContext, ExtHostTerminalServiceShape, MainThreadTerminalServiceShape, MainContext, IExtHostContext, ShellLaunchConfigDto, TerminalLaunchConfig } from 'vs/workbench/api/common/extHost.protocol'; import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; -import { UriComponents, URI } from 'vs/base/common/uri'; +import { URI } from 'vs/base/common/uri'; import { StopWatch } from 'vs/base/common/stopwatch'; import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; @@ -78,18 +78,18 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape // when the extension host process goes down ? } - public $createTerminal(name?: string, shellPath?: string, shellArgs?: string[] | string, cwd?: string | UriComponents, env?: { [key: string]: string }, waitOnExit?: boolean, strictEnv?: boolean, hideFromUser?: boolean, isVirtualProcess?: boolean): Promise<{ id: number, name: string }> { + public $createTerminal(launchConfig: TerminalLaunchConfig): Promise<{ id: number, name: string }> { const shellLaunchConfig: IShellLaunchConfig = { - name, - executable: shellPath, - args: shellArgs, - cwd: typeof cwd === 'string' ? cwd : URI.revive(cwd), - waitOnExit, + name: launchConfig.name, + executable: launchConfig.shellPath, + args: launchConfig.shellArgs, + cwd: typeof launchConfig.cwd === 'string' ? launchConfig.cwd : URI.revive(launchConfig.cwd), + waitOnExit: launchConfig.waitOnExit, ignoreConfigurationCwd: true, - env, - strictEnv, - hideFromUser, - isVirtualProcess + env: launchConfig.env, + strictEnv: launchConfig.strictEnv, + hideFromUser: launchConfig.hideFromUser, + isVirtualProcess: launchConfig.isVirtualProcess }; const terminal = this._terminalService.createTerminal(shellLaunchConfig); this._terminalProcesses[terminal.id] = new Promise(r => this._terminalProcessesReady[terminal.id] = r); diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 0733bc2776d..603fe598cfe 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -389,8 +389,20 @@ export interface MainThreadProgressShape extends IDisposable { $progressEnd(handle: number): void; } +export interface TerminalLaunchConfig { + name?: string; + shellPath?: string; + shellArgs?: string[] | string; + cwd?: string | UriComponents; + env?: { [key: string]: string | null }; + waitOnExit?: boolean; + strictEnv?: boolean; + hideFromUser?: boolean; + isVirtualProcess?: boolean; +} + export interface MainThreadTerminalServiceShape extends IDisposable { - $createTerminal(name?: string, shellPath?: string, shellArgs?: string[] | string, cwd?: string | UriComponents, env?: { [key: string]: string | null }, waitOnExit?: boolean, strictEnv?: boolean, hideFromUser?: boolean, isVirtualProcess?: boolean): Promise<{ id: number, name: string }>; + $createTerminal(config: TerminalLaunchConfig): Promise<{ id: number, name: string }>; $createTerminalRenderer(name: string): Promise; $dispose(terminalId: number): void; $hide(terminalId: number): void; diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index cbac2f8f96b..9d737f484d0 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -119,15 +119,14 @@ export class ExtHostTerminal extends BaseExtHostTerminal implements vscode.Termi strictEnv?: boolean, hideFromUser?: boolean ): void { - this._proxy.$createTerminal(this._name, shellPath, shellArgs, cwd, env, waitOnExit, strictEnv, hideFromUser).then(terminal => { + this._proxy.$createTerminal({ name: this._name, shellPath, shellArgs, cwd, env, waitOnExit, strictEnv, hideFromUser }).then(terminal => { this._name = terminal.name; this._runQueuedRequests(terminal.id); }); } public createVirtualProcess(): Promise { - // TODO: Change $createTerminal to accept an object - return this._proxy.$createTerminal(this._name, undefined, undefined, undefined, undefined, undefined, undefined, undefined, true).then(terminal => { + return this._proxy.$createTerminal({ name: this._name, isVirtualProcess: true }).then(terminal => { this._name = terminal.name; this._runQueuedRequests(terminal.id); }); From 92ad9f3fc7cb62eb32324603d9a812c5e47dd0ef Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 2 Jul 2019 11:23:26 -0700 Subject: [PATCH 0924/1449] Add deprecation notices to terminal renderer APIs --- src/vs/vscode.proposed.d.ts | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 042ac65a4bd..659cd1e9490 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1162,6 +1162,8 @@ declare module 'vscode' { * [Terminal.sendText](#Terminal.sendText) is triggered that will fire the * [TerminalRenderer.onDidAcceptInput](#TerminalRenderer.onDidAcceptInput) event. * + * @deprecated Use [virtual processes](#TerminalVirtualProcess) instead. + * * **Example:** Create a terminal renderer, show it and write hello world in red * ```typescript * const renderer = window.createTerminalRenderer('foo'); @@ -1172,6 +1174,7 @@ declare module 'vscode' { export interface TerminalRenderer { /** * The name of the terminal, this will appear in the terminal selector. + * @deprecated Use [virtual processes](#TerminalVirtualProcess) instead. */ name: string; @@ -1180,6 +1183,8 @@ declare module 'vscode' { * a value smaller than the maximum value, if this is undefined the terminal will auto fit * to the maximum value [maximumDimensions](TerminalRenderer.maximumDimensions). * + * @deprecated Use [virtual processes](#TerminalVirtualProcess) instead. + * * **Example:** Override the dimensions of a TerminalRenderer to 20 columns and 10 rows * ```typescript * terminalRenderer.dimensions = { @@ -1195,11 +1200,15 @@ declare module 'vscode' { * terminal renderer is created and also until the terminal becomes visible in the UI. * Listen to [onDidChangeMaximumDimensions](TerminalRenderer.onDidChangeMaximumDimensions) * to get notified when this value changes. + * + * @deprecated Use [virtual processes](#TerminalVirtualProcess) instead. */ readonly maximumDimensions: TerminalDimensions | undefined; /** * The corresponding [Terminal](#Terminal) for this TerminalRenderer. + * + * @deprecated Use [virtual processes](#TerminalVirtualProcess) instead. */ readonly terminal: Terminal; @@ -1207,6 +1216,9 @@ declare module 'vscode' { * Write text to the terminal. Unlike [Terminal.sendText](#Terminal.sendText) which sends * text to the underlying _process_, this will write the text to the terminal itself. * + * @param text The text to write. + * @deprecated Use [virtual processes](#TerminalVirtualProcess) instead. + * * **Example:** Write red text to the terminal * ```typescript * terminalRenderer.write('\x1b[31mHello world\x1b[0m'); @@ -1216,8 +1228,6 @@ declare module 'vscode' { * ```typescript * terminalRenderer.write('\x1b[10;20H*'); * ``` - * - * @param text The text to write. */ write(text: string): void; @@ -1226,6 +1236,8 @@ declare module 'vscode' { * [Terminal.sendText](#Terminal.sendText). Keystrokes are converted into their * corresponding VT sequence representation. * + * @deprecated Use [virtual processes](#TerminalVirtualProcess) instead. + * * **Example:** Simulate interaction with the terminal from an outside extension or a * workbench command such as `workbench.action.terminal.runSelectedText` * ```typescript @@ -1241,6 +1253,8 @@ declare module 'vscode' { /** * An event which fires when the [maximum dimensions](#TerminalRenderer.maximumDimensions) of * the terminal renderer change. + * + * @deprecated Use [virtual processes](#TerminalVirtualProcess) instead. */ readonly onDidChangeMaximumDimensions: Event; } @@ -1250,6 +1264,7 @@ declare module 'vscode' { * Create a [TerminalRenderer](#TerminalRenderer). * * @param name The name of the terminal renderer, this shows up in the terminal selector. + * @deprecated Use [virtual processes](#TerminalVirtualProcess) instead. */ export function createTerminalRenderer(name: string): TerminalRenderer; } From d5043415f3c8963a691d1d15a4b6cc23edf8dd81 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 2 Jul 2019 11:25:34 -0700 Subject: [PATCH 0925/1449] Remove resolved todos --- src/vs/workbench/api/node/extHostTerminalService.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 9d737f484d0..66b370a505e 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -331,7 +331,6 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { const p = new ExtHostVirtualProcess(options.virtualProcess); terminal.createVirtualProcess().then(() => { this._setupExtHostProcessListeners(terminal._id, p); - // TODO: Why isn't 1 being send from extension? p.startSendingEvents(); }); this._terminals.push(terminal); @@ -728,7 +727,6 @@ class ExtHostVirtualProcess implements ITerminalChildProcess { if (this._virtualProcess.exit) { this._queueDisposables.push(this._virtualProcess.exit(e => this._queuedEvents.push({ emitter: this._onProcessExit, data: e }))); } - // TODO: Handle overrideDimensions, use an optional event on the interface? if (this._virtualProcess.overrideDimensions) { this._queueDisposables.push(this._virtualProcess.overrideDimensions(e => this._queuedEvents.push({ emitter: this._onProcessOverrideDimensions, data: e ? { cols: e.columns, rows: e.rows } : undefined }))); } @@ -752,7 +750,6 @@ class ExtHostVirtualProcess implements ITerminalChildProcess { } } - // TODO: Are these returns correct? getInitialCwd(): Promise { return Promise.resolve(''); } From a2b1f3e77c29ba1fba95906064ff01057de797e6 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 2 Jul 2019 11:33:34 -0700 Subject: [PATCH 0926/1449] Use Map instead of object map #76442 --- .../browser/standaloneThemeServiceImpl.ts | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/vs/editor/standalone/browser/standaloneThemeServiceImpl.ts b/src/vs/editor/standalone/browser/standaloneThemeServiceImpl.ts index 5e9074577a3..3f04994e55c 100644 --- a/src/vs/editor/standalone/browser/standaloneThemeServiceImpl.ts +++ b/src/vs/editor/standalone/browser/standaloneThemeServiceImpl.ts @@ -27,7 +27,7 @@ class StandaloneTheme implements IStandaloneTheme { public readonly themeName: string; private readonly themeData: IStandaloneThemeData; - private colors: { [colorId: string]: Color } | null; + private colors: Map | null; private readonly defaultColors: { [colorId: string]: Color | undefined; }; private _tokenTheme: TokenTheme | null; @@ -57,19 +57,18 @@ class StandaloneTheme implements IStandaloneTheme { } } - private getColors(): { [colorId: string]: Color } { + private getColors(): Map { if (!this.colors) { - let colors: { [colorId: string]: Color } = Object.create(null); + const colors = new Map(); for (let id in this.themeData.colors) { - colors[id] = Color.fromHex(this.themeData.colors[id]); + colors.set(id, Color.fromHex(this.themeData.colors[id])); } if (this.themeData.inherit) { let baseData = getBuiltinRules(this.themeData.base); for (let id in baseData.colors) { - if (!colors[id]) { - colors[id] = Color.fromHex(baseData.colors[id]); + if (!colors.has(id)) { + colors.set(id, Color.fromHex(baseData.colors[id])); } - } } this.colors = colors; @@ -78,7 +77,7 @@ class StandaloneTheme implements IStandaloneTheme { } public getColor(colorId: ColorIdentifier, useDefault?: boolean): Color | undefined { - const color = this.getColors()[colorId]; + const color = this.getColors().get(colorId); if (color) { return color; } From 2d6205a54803a5f40143093fc07fcd69074f2288 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 2 Jul 2019 11:34:26 -0700 Subject: [PATCH 0927/1449] Supress implicit index error with any #76442 --- src/vs/base/common/collections.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/base/common/collections.ts b/src/vs/base/common/collections.ts index d0c3e84ece3..a0f6695e8ae 100644 --- a/src/vs/base/common/collections.ts +++ b/src/vs/base/common/collections.ts @@ -46,9 +46,9 @@ export function size(from: IStringDictionary | INumberDictionary): numb } export function first(from: IStringDictionary | INumberDictionary): T | undefined { - for (let key in from) { + for (const key in from) { if (hasOwnProperty.call(from, key)) { - return from[key]; + return (from as any)[key]; } } return undefined; From 85da8ee3f5117e8fe13c1e0bb49032843f4d009d Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Tue, 2 Jul 2019 11:08:50 -0700 Subject: [PATCH 0928/1449] Update ripgrep, enable --auto-hybrid-regex Note, the invalid literal test is n/a with auto-hybrid-regex, it's ok because in vscode we would be in multiline mode in that case anyway Fix #72459 --- package.json | 2 +- .../search/node/ripgrepTextSearchEngine.ts | 6 ++++-- .../test/node/textSearch.integrationTest.ts | 20 ++----------------- yarn.lock | 8 ++++---- 4 files changed, 11 insertions(+), 25 deletions(-) diff --git a/package.json b/package.json index 35a86a741d2..266e699815d 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "v8-inspect-profiler": "^0.0.20", "vscode-chokidar": "1.6.5", "vscode-proxy-agent": "0.4.0", - "vscode-ripgrep": "^1.2.5", + "vscode-ripgrep": "^1.3.1", "vscode-sqlite3": "4.0.7", "vscode-textmate": "^4.1.1", "xterm": "3.15.0-beta50", diff --git a/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts b/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts index 12e027284d5..78061db1d0d 100644 --- a/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts +++ b/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts @@ -121,9 +121,10 @@ export class RipgrepTextSearchEngine { * "failed" when a fatal error was produced. */ export function rgErrorMsgForDisplay(msg: string): Maybe { - const firstLine = msg.split('\n')[0].trim(); + const lines = msg.split('\n'); + const firstLine = lines[0].trim(); - if (startsWith(firstLine, 'regex parse error')) { + if (lines.some(l => startsWith(l, 'regex parse error'))) { return new SearchError('Regex parse error', SearchErrorCode.regexParseError); } @@ -427,6 +428,7 @@ function getRgArgs(query: TextSearchQuery, options: TextSearchOptions): string[] fixedRegexpQuery = fixRegexCRMatchingNonWordClass(fixedRegexpQuery, !!query.isMultiline); fixedRegexpQuery = fixRegexCRMatchingWhitespaceClass(fixedRegexpQuery, !!query.isMultiline); args.push('--regexp', fixedRegexpQuery); + args.push('--auto-hybrid-regex'); } else { searchPatternAfterDoubleDashes = pattern; args.push('--fixed-strings'); diff --git a/src/vs/workbench/services/search/test/node/textSearch.integrationTest.ts b/src/vs/workbench/services/search/test/node/textSearch.integrationTest.ts index b751b3b0c15..6f39df77250 100644 --- a/src/vs/workbench/services/search/test/node/textSearch.integrationTest.ts +++ b/src/vs/workbench/services/search/test/node/textSearch.integrationTest.ts @@ -378,7 +378,7 @@ suite('Search-integration', function () { folderQueries: ROOT_FOLDER_QUERY, contentPattern: { pattern: 'foo' }, includePattern: { - '***': true + '{{}': true } }; @@ -386,26 +386,10 @@ suite('Search-integration', function () { throw new Error('expected fail'); }, err => { const searchError = deserializeSearchError(err.message); - assert.equal(searchError.message, 'Error parsing glob \'***\': invalid use of **; must be one path component'); + assert.equal(searchError.message, 'Error parsing glob \'/{{}\': nested alternate groups are not allowed'); assert.equal(searchError.code, SearchErrorCode.globParseError); }); }); - - test('invalid literal', () => { - const config: ITextQuery = { - type: QueryType.Text, - folderQueries: ROOT_FOLDER_QUERY, - contentPattern: { pattern: 'foo\nbar', isRegExp: true } - }; - - return doSearchTest(config, 0).then(() => { - throw new Error('expected fail'); - }, err => { - const searchError = deserializeSearchError(err.message); - assert.equal(searchError.message, 'The literal \'"\\n"\' is not allowed in a regex'); - assert.equal(searchError.code, SearchErrorCode.invalidLiteral); - }); - }); }); }); diff --git a/yarn.lock b/yarn.lock index 8f54d420978..967f27dee76 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9490,10 +9490,10 @@ vscode-proxy-agent@0.4.0: https-proxy-agent "2.2.1" socks-proxy-agent "4.0.1" -vscode-ripgrep@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/vscode-ripgrep/-/vscode-ripgrep-1.2.5.tgz#2093c8f36d52bd2dab9eb45b003dd02533c5499c" - integrity sha512-n5XBm9od5hahpljw9T8wbkuMnAY7LlAG1OyEEtcCZEX9aCHFuBKSP0IcvciGRTbtWRovNuT83A2iRjt6PL3bLg== +vscode-ripgrep@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/vscode-ripgrep/-/vscode-ripgrep-1.3.1.tgz#51fb93debcd0c18a8b90dbc37f84f94333d0c486" + integrity sha512-4WLB/n4ZeWNi5AEzPTkfYrqbKtXlv0SlgmxbRVdulwZzGx/lfWeWPu9Shy32orM27IofQAQDuirbRBOYNJVzBA== vscode-sqlite3@4.0.7: version "4.0.7" From 83e905419cd6bb9c120ebbac7ad43c9e5a6b4de2 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Tue, 2 Jul 2019 11:42:32 -0700 Subject: [PATCH 0929/1449] Use rg --crlf flag and remove hacks around \s and \r Fix #74395, fix #70173 --- .../search/node/ripgrepTextSearchEngine.ts | 28 ++------ .../test/node/ripgrepTextSearchEngine.test.ts | 66 +------------------ 2 files changed, 5 insertions(+), 89 deletions(-) diff --git a/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts b/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts index 78061db1d0d..449f0f08761 100644 --- a/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts +++ b/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts @@ -416,17 +416,17 @@ function getRgArgs(query: TextSearchQuery, options: TextSearchOptions): string[] } } + // Allow $ to match /r/n + args.push('--crlf'); + let searchPatternAfterDoubleDashes: Maybe; if (query.isWordMatch) { const regexp = createRegExp(pattern, !!query.isRegExp, { wholeWord: query.isWordMatch }); const regexpStr = regexp.source.replace(/\\\//g, '/'); // RegExp.source arbitrarily returns escaped slashes. Search and destroy. args.push('--regexp', regexpStr); } else if (query.isRegExp) { - let fixedRegexpQuery = fixRegexEndingPattern(query.pattern); - fixedRegexpQuery = fixRegexNewline(fixedRegexpQuery); + let fixedRegexpQuery = fixRegexNewline(query.pattern); fixedRegexpQuery = fixNewline(fixedRegexpQuery); - fixedRegexpQuery = fixRegexCRMatchingNonWordClass(fixedRegexpQuery, !!query.isMultiline); - fixedRegexpQuery = fixRegexCRMatchingWhitespaceClass(fixedRegexpQuery, !!query.isMultiline); args.push('--regexp', fixedRegexpQuery); args.push('--auto-hybrid-regex'); } else { @@ -510,32 +510,12 @@ export interface IRgSubmatch { export type IRgBytesOrText = { bytes: string } | { text: string }; -export function fixRegexEndingPattern(pattern: string): string { - // Replace an unescaped $ at the end of the pattern with \r?$ - // Match $ preceeded by none or even number of literal \ - return pattern.match(/([^\\]|^)(\\\\)*\$$/) ? - pattern.replace(/\$$/, '\\r?$') : - pattern; -} - export function fixRegexNewline(pattern: string): string { // Replace an unescaped $ at the end of the pattern with \r?$ // Match $ preceeded by none or even number of literal \ return pattern.replace(/([^\\]|^)(\\\\)*\\n/g, '$1$2\\r?\\n'); } -export function fixRegexCRMatchingWhitespaceClass(pattern: string, isMultiline: boolean): string { - return isMultiline ? - pattern.replace(/([^\\]|^)((?:\\\\)*)\\s/g, '$1$2(\\r?\\n|[^\\S\\r])') : - pattern.replace(/([^\\]|^)((?:\\\\)*)\\s/g, '$1$2[ \\t\\f]'); -} - -export function fixRegexCRMatchingNonWordClass(pattern: string, isMultiline: boolean): string { - return isMultiline ? - pattern.replace(/([^\\]|^)((?:\\\\)*)\\W/g, '$1$2(\\r?\\n|[^\\w\\r])') : - pattern.replace(/([^\\]|^)((?:\\\\)*)\\W/g, '$1$2[^\\w\\r]'); -} - export function fixNewline(pattern: string): string { return pattern.replace(/\n/g, '\\r?\\n'); } diff --git a/src/vs/workbench/services/search/test/node/ripgrepTextSearchEngine.test.ts b/src/vs/workbench/services/search/test/node/ripgrepTextSearchEngine.test.ts index 262074bf079..998f1e22e09 100644 --- a/src/vs/workbench/services/search/test/node/ripgrepTextSearchEngine.test.ts +++ b/src/vs/workbench/services/search/test/node/ripgrepTextSearchEngine.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { joinPath } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; -import { fixRegexCRMatchingNonWordClass, fixRegexCRMatchingWhitespaceClass, fixRegexEndingPattern, fixRegexNewline, IRgMatch, IRgMessage, RipgrepParser, unicodeEscapesToPCRE2, fixNewline } from 'vs/workbench/services/search/node/ripgrepTextSearchEngine'; +import { fixRegexNewline, IRgMatch, IRgMessage, RipgrepParser, unicodeEscapesToPCRE2, fixNewline } from 'vs/workbench/services/search/node/ripgrepTextSearchEngine'; import { Range, TextSearchResult } from 'vs/workbench/services/search/common/searchExtTypes'; suite('RipgrepTextSearchEngine', () => { @@ -24,70 +24,6 @@ suite('RipgrepTextSearchEngine', () => { assert.equal(unicodeEscapesToPCRE2(''), ''); }); - test('fixRegexEndingPattern', () => { - function testFixRegexEndingPattern([input, expectedResult]: string[]): void { - assert.equal(fixRegexEndingPattern(input), expectedResult); - } - - [ - ['foo', 'foo'], - ['', ''], - ['^foo.*bar\\s+', '^foo.*bar\\s+'], - ['foo$', 'foo\\r?$'], - ['$', '\\r?$'], - ['foo\\$', 'foo\\$'], - ['foo\\\\$', 'foo\\\\\\r?$'], - ].forEach(testFixRegexEndingPattern); - }); - - test('fixRegexCRMatchingWhitespaceClass', () => { - function testFixRegexCRMatchingWhitespaceClass([inputReg, isMultiline, testStr, shouldMatch]: [string, boolean, string, boolean]): void { - const fixed = fixRegexCRMatchingWhitespaceClass(inputReg, isMultiline); - const reg = new RegExp(fixed); - assert.equal(reg.test(testStr), shouldMatch, `${inputReg} => ${reg}, ${testStr}, ${shouldMatch}`); - } - - [ - ['foo', false, 'foo', true], - - ['foo\\s', false, 'foo\r\n', false], - ['foo\\sabc', true, 'foo\r\nabc', true], - - ['foo\\s', false, 'foo\n', false], - ['foo\\s', true, 'foo\n', true], - - ['foo\\s\\n', true, 'foo\r\n', false], - ['foo\\r\\s', true, 'foo\r\n', true], - - ['foo\\s+abc', true, 'foo \r\nabc', true], - ['foo\\s+abc', false, 'foo \t abc', true], - ].forEach(testFixRegexCRMatchingWhitespaceClass); - }); - - test('fixRegexCRMatchingNonWordClass', () => { - function testRegexCRMatchingNonWordClass([inputReg, isMultiline, testStr, shouldMatch]: [string, boolean, string, boolean]): void { - const fixed = fixRegexCRMatchingNonWordClass(inputReg, isMultiline); - const reg = new RegExp(fixed); - assert.equal(reg.test(testStr), shouldMatch, `${inputReg} => ${reg}, ${testStr}, ${shouldMatch}`); - } - - [ - ['foo', false, 'foo', true], - - ['foo\\W', false, 'foo\r\n', false], - ['foo\\Wabc', true, 'foo\r\nabc', true], - - ['foo\\W', false, 'foo\n', true], - ['foo\\W', true, 'foo\n', true], - - ['foo\\W\\n', true, 'foo\r\n', false], - ['foo\\r\\W', true, 'foo\r\n', true], - - ['foo\\W+abc', true, 'foo \r\nabc', true], - ['foo\\W+abc', false, 'foo .-\t abc', true], - ].forEach(testRegexCRMatchingNonWordClass); - }); - test('fixRegexNewline', () => { function testFixRegexNewline([inputReg, testStr, shouldMatch]: [string, string, boolean]): void { const fixed = fixRegexNewline(inputReg); From 5e804dc4edd0ad8634d1f571ea80498a30063700 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 2 Jul 2019 11:51:42 -0700 Subject: [PATCH 0930/1449] Move terminal api tests into new file --- .../src/singlefolder-tests/terminal.test.ts | 206 ++++++++++++++++++ .../src/singlefolder-tests/window.test.ts | 199 +---------------- 2 files changed, 207 insertions(+), 198 deletions(-) create mode 100644 extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts new file mode 100644 index 00000000000..b6c6ec8c4f9 --- /dev/null +++ b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts @@ -0,0 +1,206 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { window, commands, Terminal, TerminalDimensionsChangeEvent } from 'vscode'; +import { doesNotThrow, equal, ok } from 'assert'; + +suite('window namespace tests', () => { + (process.platform === 'win32' ? suite.skip /* https://github.com/microsoft/vscode/issues/75689 */ : suite)('Terminal', () => { + test('sendText immediately after createTerminal should not throw', () => { + const terminal = window.createTerminal(); + doesNotThrow(terminal.sendText.bind(terminal, 'echo "foo"')); + terminal.dispose(); + }); + + test('onDidCloseTerminal event fires when terminal is disposed', (done) => { + const terminal = window.createTerminal(); + const reg = window.onDidCloseTerminal((eventTerminal) => { + equal(terminal, eventTerminal); + reg.dispose(); + done(); + }); + terminal.dispose(); + }); + + test('processId immediately after createTerminal should fetch the pid', (done) => { + const terminal = window.createTerminal(); + terminal.processId.then(id => { + ok(id > 0); + terminal.dispose(); + done(); + }); + }); + + test('name in constructor should set terminal.name', () => { + const terminal = window.createTerminal('a'); + equal(terminal.name, 'a'); + terminal.dispose(); + }); + + test('onDidOpenTerminal should fire when a terminal is created', (done) => { + const reg1 = window.onDidOpenTerminal(term => { + equal(term.name, 'b'); + reg1.dispose(); + const reg2 = window.onDidCloseTerminal(() => { + reg2.dispose(); + done(); + }); + terminal.dispose(); + }); + const terminal = window.createTerminal('b'); + }); + + test('createTerminalRenderer should fire onDidOpenTerminal and onDidCloseTerminal', (done) => { + const reg1 = window.onDidOpenTerminal(term => { + equal(term.name, 'c'); + reg1.dispose(); + const reg2 = window.onDidCloseTerminal(() => { + reg2.dispose(); + done(); + }); + term.dispose(); + }); + window.createTerminalRenderer('c'); + }); + + test('terminal renderers should get maximum dimensions set when shown', (done) => { + let terminal: Terminal; + const reg1 = window.onDidOpenTerminal(term => { + reg1.dispose(); + term.show(); + terminal = term; + }); + const renderer = window.createTerminalRenderer('foo'); + const reg2 = renderer.onDidChangeMaximumDimensions(dimensions => { + ok(dimensions.columns > 0); + ok(dimensions.rows > 0); + reg2.dispose(); + const reg3 = window.onDidCloseTerminal(() => { + reg3.dispose(); + done(); + }); + terminal.dispose(); + }); + }); + + test('TerminalRenderer.write should fire Terminal.onData', (done) => { + const reg1 = window.onDidOpenTerminal(terminal => { + reg1.dispose(); + const reg2 = terminal.onDidWriteData(data => { + equal(data, 'bar'); + reg2.dispose(); + const reg3 = window.onDidCloseTerminal(() => { + reg3.dispose(); + done(); + }); + terminal.dispose(); + }); + renderer.write('bar'); + }); + const renderer = window.createTerminalRenderer('foo'); + }); + + test('Terminal.sendText should fire Terminal.onInput', (done) => { + const reg1 = window.onDidOpenTerminal(terminal => { + reg1.dispose(); + const reg2 = renderer.onDidAcceptInput(data => { + equal(data, 'bar'); + reg2.dispose(); + const reg3 = window.onDidCloseTerminal(() => { + reg3.dispose(); + done(); + }); + terminal.dispose(); + }); + terminal.sendText('bar', false); + }); + const renderer = window.createTerminalRenderer('foo'); + }); + + test('onDidChangeActiveTerminal should fire when new terminals are created', (done) => { + const reg1 = window.onDidChangeActiveTerminal((active: Terminal | undefined) => { + equal(active, terminal); + equal(active, window.activeTerminal); + reg1.dispose(); + const reg2 = window.onDidChangeActiveTerminal((active: Terminal | undefined) => { + equal(active, undefined); + equal(active, window.activeTerminal); + reg2.dispose(); + done(); + }); + terminal.dispose(); + }); + const terminal = window.createTerminal(); + terminal.show(); + }); + + test('onDidChangeTerminalDimensions should fire when new terminals are created', (done) => { + const reg1 = window.onDidChangeTerminalDimensions(async (event: TerminalDimensionsChangeEvent) => { + equal(event.terminal, terminal1); + equal(typeof event.dimensions.columns, 'number'); + equal(typeof event.dimensions.rows, 'number'); + ok(event.dimensions.columns > 0); + ok(event.dimensions.rows > 0); + reg1.dispose(); + let terminal2: Terminal; + const reg2 = window.onDidOpenTerminal((newTerminal) => { + // This is guarantees to fire before dimensions change event + if (newTerminal !== terminal1) { + terminal2 = newTerminal; + reg2.dispose(); + } + }); + let firstCalled = false; + let secondCalled = false; + const reg3 = window.onDidChangeTerminalDimensions((event: TerminalDimensionsChangeEvent) => { + if (event.terminal === terminal1) { + // The original terminal should fire dimension change after a split + firstCalled = true; + } else if (event.terminal !== terminal1) { + // The new split terminal should fire dimension change + secondCalled = true; + } + if (firstCalled && secondCalled) { + terminal1.dispose(); + terminal2.dispose(); + reg3.dispose(); + done(); + } + }); + await timeout(500); + commands.executeCommand('workbench.action.terminal.split'); + }); + const terminal1 = window.createTerminal({ name: 'test' }); + terminal1.show(); + }); + + test('hideFromUser terminal: onDidWriteData should work', done => { + const terminal = window.createTerminal({ name: 'bg', hideFromUser: true }); + let data = ''; + terminal.onDidWriteData(e => { + data += e; + if (data.indexOf('foo') !== -1) { + terminal.dispose(); + done(); + } + }); + terminal.sendText('foo'); + }); + + test('hideFromUser terminal: should be available to terminals API', done => { + const terminal = window.createTerminal({ name: 'bg', hideFromUser: true }); + window.onDidOpenTerminal(t => { + equal(t, terminal); + equal(t.name, 'bg'); + ok(window.terminals.indexOf(terminal) !== -1); + done(); + }); + }); + }); +}); + +async function timeout(ms = 0): Promise { + return new Promise(resolve => setTimeout(() => resolve(), ms)); +} diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts index 19184284108..c2ec4f13681 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { workspace, window, commands, ViewColumn, TextEditorViewColumnChangeEvent, Uri, Selection, Position, CancellationTokenSource, TextEditorSelectionChangeKind, Terminal, TerminalDimensionsChangeEvent } from 'vscode'; +import { workspace, window, commands, ViewColumn, TextEditorViewColumnChangeEvent, Uri, Selection, Position, CancellationTokenSource, TextEditorSelectionChangeKind } from 'vscode'; import { join } from 'path'; import { closeAllEditors, pathEquals, createRandomFile } from '../utils'; @@ -568,201 +568,4 @@ suite('window namespace tests', () => { }); }); - - (process.platform === 'win32' ? suite.skip /* https://github.com/microsoft/vscode/issues/75689 */ : suite)('Terminal', () => { - test('sendText immediately after createTerminal should not throw', () => { - const terminal = window.createTerminal(); - assert.doesNotThrow(terminal.sendText.bind(terminal, 'echo "foo"')); - terminal.dispose(); - }); - - test('onDidCloseTerminal event fires when terminal is disposed', (done) => { - const terminal = window.createTerminal(); - const reg = window.onDidCloseTerminal((eventTerminal) => { - assert.equal(terminal, eventTerminal); - reg.dispose(); - done(); - }); - terminal.dispose(); - }); - - test('processId immediately after createTerminal should fetch the pid', (done) => { - const terminal = window.createTerminal(); - terminal.processId.then(id => { - assert.ok(id > 0); - terminal.dispose(); - done(); - }); - }); - - test('name in constructor should set terminal.name', () => { - const terminal = window.createTerminal('a'); - assert.equal(terminal.name, 'a'); - terminal.dispose(); - }); - - test('onDidOpenTerminal should fire when a terminal is created', (done) => { - const reg1 = window.onDidOpenTerminal(term => { - assert.equal(term.name, 'b'); - reg1.dispose(); - const reg2 = window.onDidCloseTerminal(() => { - reg2.dispose(); - done(); - }); - terminal.dispose(); - }); - const terminal = window.createTerminal('b'); - }); - - test('createTerminalRenderer should fire onDidOpenTerminal and onDidCloseTerminal', (done) => { - const reg1 = window.onDidOpenTerminal(term => { - assert.equal(term.name, 'c'); - reg1.dispose(); - const reg2 = window.onDidCloseTerminal(() => { - reg2.dispose(); - done(); - }); - term.dispose(); - }); - window.createTerminalRenderer('c'); - }); - - test('terminal renderers should get maximum dimensions set when shown', (done) => { - let terminal: Terminal; - const reg1 = window.onDidOpenTerminal(term => { - reg1.dispose(); - term.show(); - terminal = term; - }); - const renderer = window.createTerminalRenderer('foo'); - const reg2 = renderer.onDidChangeMaximumDimensions(dimensions => { - assert.ok(dimensions.columns > 0); - assert.ok(dimensions.rows > 0); - reg2.dispose(); - const reg3 = window.onDidCloseTerminal(() => { - reg3.dispose(); - done(); - }); - terminal.dispose(); - }); - }); - - test('TerminalRenderer.write should fire Terminal.onData', (done) => { - const reg1 = window.onDidOpenTerminal(terminal => { - reg1.dispose(); - const reg2 = terminal.onDidWriteData(data => { - assert.equal(data, 'bar'); - reg2.dispose(); - const reg3 = window.onDidCloseTerminal(() => { - reg3.dispose(); - done(); - }); - terminal.dispose(); - }); - renderer.write('bar'); - }); - const renderer = window.createTerminalRenderer('foo'); - }); - - test('Terminal.sendText should fire Terminal.onInput', (done) => { - const reg1 = window.onDidOpenTerminal(terminal => { - reg1.dispose(); - const reg2 = renderer.onDidAcceptInput(data => { - assert.equal(data, 'bar'); - reg2.dispose(); - const reg3 = window.onDidCloseTerminal(() => { - reg3.dispose(); - done(); - }); - terminal.dispose(); - }); - terminal.sendText('bar', false); - }); - const renderer = window.createTerminalRenderer('foo'); - }); - - test('onDidChangeActiveTerminal should fire when new terminals are created', (done) => { - const reg1 = window.onDidChangeActiveTerminal((active: Terminal | undefined) => { - assert.equal(active, terminal); - assert.equal(active, window.activeTerminal); - reg1.dispose(); - const reg2 = window.onDidChangeActiveTerminal((active: Terminal | undefined) => { - assert.equal(active, undefined); - assert.equal(active, window.activeTerminal); - reg2.dispose(); - done(); - }); - terminal.dispose(); - }); - const terminal = window.createTerminal(); - terminal.show(); - }); - - test('onDidChangeTerminalDimensions should fire when new terminals are created', (done) => { - const reg1 = window.onDidChangeTerminalDimensions(async (event: TerminalDimensionsChangeEvent) => { - assert.equal(event.terminal, terminal1); - assert.equal(typeof event.dimensions.columns, 'number'); - assert.equal(typeof event.dimensions.rows, 'number'); - assert.ok(event.dimensions.columns > 0); - assert.ok(event.dimensions.rows > 0); - reg1.dispose(); - let terminal2: Terminal; - const reg2 = window.onDidOpenTerminal((newTerminal) => { - // This is guarantees to fire before dimensions change event - if (newTerminal !== terminal1) { - terminal2 = newTerminal; - reg2.dispose(); - } - }); - let firstCalled = false; - let secondCalled = false; - const reg3 = window.onDidChangeTerminalDimensions((event: TerminalDimensionsChangeEvent) => { - if (event.terminal === terminal1) { - // The original terminal should fire dimension change after a split - firstCalled = true; - } else if (event.terminal !== terminal1) { - // The new split terminal should fire dimension change - secondCalled = true; - } - if (firstCalled && secondCalled) { - terminal1.dispose(); - terminal2.dispose(); - reg3.dispose(); - done(); - } - }); - await timeout(500); - commands.executeCommand('workbench.action.terminal.split'); - }); - const terminal1 = window.createTerminal({ name: 'test' }); - terminal1.show(); - }); - - test('hideFromUser terminal: onDidWriteData should work', done => { - const terminal = window.createTerminal({ name: 'bg', hideFromUser: true }); - let data = ''; - terminal.onDidWriteData(e => { - data += e; - if (data.indexOf('foo') !== -1) { - terminal.dispose(); - done(); - } - }); - terminal.sendText('foo'); - }); - - test('hideFromUser terminal: should be available to terminals API', done => { - const terminal = window.createTerminal({ name: 'bg', hideFromUser: true }); - window.onDidOpenTerminal(t => { - assert.equal(t, terminal); - assert.equal(t.name, 'bg'); - assert.ok(window.terminals.indexOf(terminal) !== -1); - done(); - }); - }); - }); }); - -async function timeout(ms = 0): Promise { - return new Promise(resolve => setTimeout(() => resolve(), ms)); -} \ No newline at end of file From ac46e53f89a867985625023faa7598b7bfc9ecd2 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 2 Jul 2019 23:31:54 +0200 Subject: [PATCH 0931/1449] distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5ad5d9637d8..0555e1090d8 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "c64ec576bb320a17e03b2fbfd1c90f2c545a66d2", + "distro": "242ad1fe68c7e5b2beea29a20510d3f88c4d8853", "author": { "name": "Microsoft Corporation" }, From 45ccecfcee407fdfca7dfaec54505369c242a524 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 2 Jul 2019 14:26:49 -0700 Subject: [PATCH 0932/1449] Add explicit index signature #76442 --- src/vs/platform/state/node/stateService.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/vs/platform/state/node/stateService.ts b/src/vs/platform/state/node/stateService.ts index d0a48280bbe..be587a9fb09 100644 --- a/src/vs/platform/state/node/stateService.ts +++ b/src/vs/platform/state/node/stateService.ts @@ -11,14 +11,16 @@ import { isUndefined, isUndefinedOrNull } from 'vs/base/common/types'; import { IStateService } from 'vs/platform/state/common/state'; import { ILogService } from 'vs/platform/log/common/log'; +type StorageDatebase = { [key: string]: any; }; + export class FileStorage { - private _database: object | null = null; + private _database: StorageDatebase | null = null; private lastFlushedSerializedDatabase: string | null = null; constructor(private dbPath: string, private onError: (error: Error) => void) { } - private get database(): object { + private get database(): StorageDatebase { if (!this._database) { this._database = this.loadSync(); } @@ -40,7 +42,7 @@ export class FileStorage { this._database = database; } - private loadSync(): object { + private loadSync(): StorageDatebase { try { this.lastFlushedSerializedDatabase = fs.readFileSync(this.dbPath).toString(); @@ -54,7 +56,7 @@ export class FileStorage { } } - private async loadAsync(): Promise { + private async loadAsync(): Promise { try { this.lastFlushedSerializedDatabase = (await readFile(this.dbPath)).toString(); From 94f0c3a0ea98ee22a24e69adce393ebd8008458b Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 2 Jul 2019 14:29:32 -0700 Subject: [PATCH 0933/1449] Add scripts property to manifest so that index access is valid #76442 --- src/vs/platform/extensions/common/extensions.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/platform/extensions/common/extensions.ts b/src/vs/platform/extensions/common/extensions.ts index 2a2edf29312..93a52746e6b 100644 --- a/src/vs/platform/extensions/common/extensions.ts +++ b/src/vs/platform/extensions/common/extensions.ts @@ -140,6 +140,7 @@ export interface IExtensionManifest { readonly bugs?: { url: string; }; readonly enableProposedApi?: boolean; readonly api?: string; + readonly scripts?: { [key: string]: string; }; } export const enum ExtensionType { From 57415669e6cc09435fe03c4a61f530ae09b4ec55 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 2 Jul 2019 14:40:22 -0700 Subject: [PATCH 0934/1449] Remove unused function --- src/vs/base/common/parsers.ts | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/src/vs/base/common/parsers.ts b/src/vs/base/common/parsers.ts index 748abd4fd47..125b965f5e4 100644 --- a/src/vs/base/common/parsers.ts +++ b/src/vs/base/common/parsers.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as Types from 'vs/base/common/types'; - export const enum ValidationState { OK = 0, Info = 1, @@ -78,25 +76,4 @@ export abstract class Parser { public fatal(message: string): void { this._problemReporter.fatal(message); } - - protected static merge(destination: T, source: T, overwrite: boolean): void { - Object.keys(source).forEach((key: string) => { - const destValue = destination[key]; - const sourceValue = source[key]; - if (Types.isUndefined(sourceValue)) { - return; - } - if (Types.isUndefined(destValue)) { - destination[key] = sourceValue; - } else { - if (overwrite) { - if (Types.isObject(destValue) && Types.isObject(sourceValue)) { - this.merge(destValue, sourceValue, overwrite); - } else { - destination[key] = sourceValue; - } - } - } - }); - } } \ No newline at end of file From 15916055fe0cb9411a5f36119b3b012458fe0a1d Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 2 Jul 2019 14:43:10 -0700 Subject: [PATCH 0935/1449] Fix a few more implicit index errors #76442 --- .../electron-browser/experimentService.ts | 4 +++- .../electron-browser/experimentalPrompts.test.ts | 15 ++++++++------- .../electron-browser/telemetryOptOut.ts | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/contrib/experiments/electron-browser/experimentService.ts b/src/vs/workbench/contrib/experiments/electron-browser/experimentService.ts index 3a451dc20bd..0deb24c7201 100644 --- a/src/vs/workbench/contrib/experiments/electron-browser/experimentService.ts +++ b/src/vs/workbench/contrib/experiments/electron-browser/experimentService.ts @@ -77,8 +77,10 @@ export enum ExperimentActionType { ExtensionSearchResults = 'ExtensionSearchResults' } +export type LocalizedPromptText = { [locale: string]: string; }; + export interface IExperimentActionPromptProperties { - promptText: string | { [key: string]: string }; + promptText: string | LocalizedPromptText; commands: IExperimentActionPromptCommand[]; } 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 bd21a63a6a2..ec566e9c57a 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 @@ -13,7 +13,7 @@ import { IStorageService, StorageScope } from 'vs/platform/storage/common/storag import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; import { ExperimentalPrompts } from 'vs/workbench/contrib/experiments/electron-browser/experimentalPrompt'; -import { ExperimentActionType, ExperimentState, IExperiment, IExperimentActionPromptProperties, IExperimentService } from 'vs/workbench/contrib/experiments/electron-browser/experimentService'; +import { ExperimentActionType, ExperimentState, IExperiment, IExperimentActionPromptProperties, IExperimentService, LocalizedPromptText } from 'vs/workbench/contrib/experiments/electron-browser/experimentService'; import { TestExperimentService } from 'vs/workbench/contrib/experiments/test/electron-browser/experimentService.test'; import { TestLifecycleService } from 'vs/workbench/test/workbenchTestServices'; @@ -185,12 +185,13 @@ suite('Experimental Prompts', () => { }; assert.equal(ExperimentalPrompts.getLocalizedText(simpleTextCase.promptText, 'any-language'), simpleTextCase.promptText); - assert.equal(ExperimentalPrompts.getLocalizedText(multipleLocaleCase.promptText, 'en'), multipleLocaleCase.promptText['en']); - assert.equal(ExperimentalPrompts.getLocalizedText(multipleLocaleCase.promptText, 'de'), multipleLocaleCase.promptText['de']); - assert.equal(ExperimentalPrompts.getLocalizedText(multipleLocaleCase.promptText, 'en-au'), multipleLocaleCase.promptText['en-au']); - assert.equal(ExperimentalPrompts.getLocalizedText(multipleLocaleCase.promptText, 'en-gb'), multipleLocaleCase.promptText['en']); - assert.equal(ExperimentalPrompts.getLocalizedText(multipleLocaleCase.promptText, 'fr'), multipleLocaleCase.promptText['en']); - assert.equal(ExperimentalPrompts.getLocalizedText(englishUSTextCase.promptText, 'fr'), englishUSTextCase.promptText['en-us']); + const multipleLocalePromptText = multipleLocaleCase.promptText as LocalizedPromptText; + assert.equal(ExperimentalPrompts.getLocalizedText(multipleLocaleCase.promptText, 'en'), multipleLocalePromptText['en']); + assert.equal(ExperimentalPrompts.getLocalizedText(multipleLocaleCase.promptText, 'de'), multipleLocalePromptText['de']); + assert.equal(ExperimentalPrompts.getLocalizedText(multipleLocaleCase.promptText, 'en-au'), multipleLocalePromptText['en-au']); + assert.equal(ExperimentalPrompts.getLocalizedText(multipleLocaleCase.promptText, 'en-gb'), multipleLocalePromptText['en']); + assert.equal(ExperimentalPrompts.getLocalizedText(multipleLocaleCase.promptText, 'fr'), multipleLocalePromptText['en']); + assert.equal(ExperimentalPrompts.getLocalizedText(englishUSTextCase.promptText, 'fr'), (englishUSTextCase.promptText as LocalizedPromptText)['en-us']); assert.equal(!!ExperimentalPrompts.getLocalizedText(noEnglishTextCase.promptText, 'fr'), false); }); }); diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/electron-browser/telemetryOptOut.ts b/src/vs/workbench/contrib/welcome/gettingStarted/electron-browser/telemetryOptOut.ts index 67edffb9c5f..0441799acfd 100644 --- a/src/vs/workbench/contrib/welcome/gettingStarted/electron-browser/telemetryOptOut.ts +++ b/src/vs/workbench/contrib/welcome/gettingStarted/electron-browser/telemetryOptOut.ts @@ -96,7 +96,7 @@ export class TelemetryOptOut implements IWorkbenchContribution { return this.galleryService.getCoreTranslation(extensionToFetchTranslationsFrom, locale!) .then(translation => { - const translationsFromPack = translation && translation.contents ? translation.contents['vs/workbench/contrib/welcome/gettingStarted/electron-browser/telemetryOptOut'] : {}; + const translationsFromPack: any = translation && translation.contents ? translation.contents['vs/workbench/contrib/welcome/gettingStarted/electron-browser/telemetryOptOut'] : {}; if (!!translationsFromPack[promptMessageKey] && !!translationsFromPack[yesLabelKey] && !!translationsFromPack[noLabelKey]) { promptMessage = translationsFromPack[promptMessageKey].replace('{0}', this.privacyUrl) + ' (Please help Microsoft improve Visual Studio Code by allowing the collection of usage data.)'; yesLabel = translationsFromPack[yesLabelKey] + ' (Yes)'; From f7a36ce0b9cf2e28b7fd1608bf9e47409ffc6cf2 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 2 Jul 2019 15:02:50 -0700 Subject: [PATCH 0936/1449] Fixing/supressing more implictIndex errors #76442 --- src/vs/base/test/common/decorators.test.ts | 2 +- src/vs/editor/contrib/colorPicker/colorDetector.ts | 2 +- src/vs/platform/environment/node/argv.ts | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vs/base/test/common/decorators.test.ts b/src/vs/base/test/common/decorators.test.ts index aaabb2b5094..05a58c318c0 100644 --- a/src/vs/base/test/common/decorators.test.ts +++ b/src/vs/base/test/common/decorators.test.ts @@ -119,7 +119,7 @@ suite('Decorators', () => { assert.equal(foo.answer, 42); try { - foo['$memoize$answer'] = 1337; + (foo as any)['$memoize$answer'] = 1337; assert(false); } catch (e) { assert.equal(foo.answer, 42); diff --git a/src/vs/editor/contrib/colorPicker/colorDetector.ts b/src/vs/editor/contrib/colorPicker/colorDetector.ts index 359bec95638..0ccf498c009 100644 --- a/src/vs/editor/contrib/colorPicker/colorDetector.ts +++ b/src/vs/editor/contrib/colorPicker/colorDetector.ts @@ -78,7 +78,7 @@ export class ColorDetector extends Disposable implements IEditorContribution { // handle deprecated settings. [languageId].colorDecorators.enable const deprecatedConfig = this._configurationService.getValue<{}>(languageId.language); if (deprecatedConfig) { - const colorDecorators = deprecatedConfig['colorDecorators']; // deprecatedConfig.valueOf('.colorDecorators.enable'); + const colorDecorators = (deprecatedConfig as any)['colorDecorators']; // deprecatedConfig.valueOf('.colorDecorators.enable'); if (colorDecorators && colorDecorators['enable'] !== undefined && !colorDecorators['enable']) { return colorDecorators['enable']; } diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts index ee259e1ddbe..f78e5d7cc62 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts @@ -121,8 +121,8 @@ export function parseArgs(args: string[], isOptionSupported = (_: Option) => tru } } // remote aliases to avoid confusion - const parsedArgs = minimist(args, { string, boolean, alias }) as ParsedArgs; - for (let o of options) { + const parsedArgs = minimist(args, { string, boolean, alias }); + for (const o of options) { if (o.alias) { delete parsedArgs[o.alias]; } @@ -203,10 +203,10 @@ export function buildHelpMessage(productName: string, executableName: string, ve } help.push(''); } - for (let key in categories) { + for (const key in categories) { let categoryOptions = options.filter(o => !!o.description && o.cat === key && isOptionSupported(o)); if (categoryOptions.length) { - help.push(categories[key]); + help.push(categories[key as keyof HelpCategories]); help.push(...formatOptions(categoryOptions, columns)); help.push(''); } From a571be2a712a495ca60ab4ecd33f21d6e1861aa0 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 2 Jul 2019 15:09:44 -0700 Subject: [PATCH 0937/1449] Fixing/supressing more implict index errors #76442 --- src/vs/base/common/path.ts | 2 +- src/vs/base/node/encoding.ts | 2 +- src/vs/base/test/browser/ui/grid/gridview.test.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/base/common/path.ts b/src/vs/base/common/path.ts index 029bfc01632..c8532347224 100644 --- a/src/vs/base/common/path.ts +++ b/src/vs/base/common/path.ts @@ -212,7 +212,7 @@ export const win32: IPath = { // absolute path, get cwd for that drive, or the process cwd if // the drive cwd is not available. We're sure the device is not // a UNC path at this points, because UNC paths are always absolute. - path = process.env['=' + resolvedDevice] || process.cwd(); + path = (process.env as any)['=' + resolvedDevice] || process.cwd(); // Verify that a cwd was found and that it actually points // to our drive. If not, default to the drive's root. diff --git a/src/vs/base/node/encoding.ts b/src/vs/base/node/encoding.ts index 9b04d9f0a96..8e23d0adeb2 100644 --- a/src/vs/base/node/encoding.ts +++ b/src/vs/base/node/encoding.ts @@ -395,7 +395,7 @@ export async function resolveTerminalEncoding(verbose?: boolean): Promise { if (stdout) { - const windowsTerminalEncodingKeys = Object.keys(windowsTerminalEncodings); + const windowsTerminalEncodingKeys = Object.keys(windowsTerminalEncodings) as Array; for (const key of windowsTerminalEncodingKeys) { if (stdout.indexOf(key) >= 0) { return resolve(windowsTerminalEncodings[key]); diff --git a/src/vs/base/test/browser/ui/grid/gridview.test.ts b/src/vs/base/test/browser/ui/grid/gridview.test.ts index 3d000d85a67..76f4e4ac68c 100644 --- a/src/vs/base/test/browser/ui/grid/gridview.test.ts +++ b/src/vs/base/test/browser/ui/grid/gridview.test.ts @@ -59,8 +59,8 @@ suite('Gridview', function () { ]; gridview.addView(views[0] as IView, 200, [0]); - gridview.addView(views[1][0] as IView, 200, [1]); - gridview.addView(views[1][1] as IView, 200, [1, 1]); + gridview.addView((views[1] as TestView[])[0] as IView, 200, [1]); + gridview.addView((views[1] as TestView[])[1] as IView, 200, [1, 1]); assert.deepEqual(nodesToArrays(gridview.getViews()), views); From 6e4e5397eefc129299ca075e21bb4c353522b4ad Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Tue, 2 Jul 2019 15:31:30 -0700 Subject: [PATCH 0938/1449] Fix #74983, update current breakpoint and stackframe icon --- .../contrib/debug/browser/media/current-and-breakpoint.svg | 2 +- .../contrib/debug/browser/media/stackframe-and-breakpoint.svg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/debug/browser/media/current-and-breakpoint.svg b/src/vs/workbench/contrib/debug/browser/media/current-and-breakpoint.svg index 89f72e4bb8f..17d71fddac9 100755 --- a/src/vs/workbench/contrib/debug/browser/media/current-and-breakpoint.svg +++ b/src/vs/workbench/contrib/debug/browser/media/current-and-breakpoint.svg @@ -1,4 +1,4 @@ - + diff --git a/src/vs/workbench/contrib/debug/browser/media/stackframe-and-breakpoint.svg b/src/vs/workbench/contrib/debug/browser/media/stackframe-and-breakpoint.svg index 0279a733d92..3ce31c822c7 100644 --- a/src/vs/workbench/contrib/debug/browser/media/stackframe-and-breakpoint.svg +++ b/src/vs/workbench/contrib/debug/browser/media/stackframe-and-breakpoint.svg @@ -1,4 +1,4 @@ - + From 98b5ee978b2796f996f47b1bf2737bd456af560e Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 2 Jul 2019 16:11:17 -0700 Subject: [PATCH 0939/1449] Replacing IDisposible[] with DisposableStore #74250 --- .../processExplorer/processExplorerMain.ts | 10 +++++----- .../contrib/nodeCachedDataCleaner.ts | 8 ++++---- .../sharedProcess/sharedProcessMain.ts | 18 +++++++++--------- src/vs/code/electron-main/sharedProcess.ts | 8 ++++---- .../browser/services/codeEditorServiceImpl.ts | 11 +++++------ .../editor/common/services/modelServiceImpl.ts | 11 +++++------ .../editor/contrib/contextmenu/contextmenu.ts | 12 ++++++------ 7 files changed, 38 insertions(+), 40 deletions(-) diff --git a/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts index 58cdb40a491..321a5611e74 100644 --- a/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts +++ b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts @@ -16,7 +16,7 @@ import { IContextMenuItem } from 'vs/base/parts/contextmenu/common/contextmenu'; import { popup } from 'vs/base/parts/contextmenu/electron-browser/contextmenu'; import { ProcessItem } from 'vs/base/common/processes'; import { addDisposableListener } from 'vs/base/browser/dom'; -import { IDisposable } from 'vs/base/common/lifecycle'; +import { DisposableStore } from 'vs/base/common/lifecycle'; import { isRemoteDiagnosticError, IRemoteDiagnosticError } from 'vs/platform/diagnostics/common/diagnosticsService'; @@ -24,7 +24,7 @@ let mapPidToWindowTitle = new Map(); const DEBUG_FLAGS_PATTERN = /\s--(inspect|debug)(-brk|port)?=(\d+)?/; const DEBUG_PORT_PATTERN = /\s--(inspect|debug)-port=(\d+)/; -const listeners: IDisposable[] = []; +const listeners = new DisposableStore(); const collapsedStateCache: Map = new Map(); let lastRequestTime: number; @@ -171,7 +171,7 @@ function renderProcessGroupHeader(sectionName: string, body: HTMLElement, contai updateSectionCollapsedState(!collapsedStateCache.get(sectionName), body, twistie, sectionName); data.prepend(twistie); - listeners.push(addDisposableListener(data, 'click', (e) => { + listeners.add(addDisposableListener(data, 'click', (e) => { const isHidden = body.classList.contains('hidden'); updateSectionCollapsedState(isHidden, body, twistie, sectionName); })); @@ -222,7 +222,7 @@ function renderTableSection(sectionName: string, processList: FormattedProcessIt row.append(cpu, memory, pid, name); - listeners.push(addDisposableListener(row, 'contextmenu', (e) => { + listeners.add(addDisposableListener(row, 'contextmenu', (e) => { showContextMenu(e, p, sectionIsLocal); })); @@ -239,7 +239,7 @@ function updateProcessInfo(processLists: [{ name: string, rootProcess: ProcessIt } container.innerHTML = ''; - listeners.forEach(l => l.dispose()); + listeners.clear(); const tableHead = document.createElement('thead'); tableHead.innerHTML = ` diff --git a/src/vs/code/electron-browser/sharedProcess/contrib/nodeCachedDataCleaner.ts b/src/vs/code/electron-browser/sharedProcess/contrib/nodeCachedDataCleaner.ts index fba3f2eb42f..5c0b0ef0b8c 100644 --- a/src/vs/code/electron-browser/sharedProcess/contrib/nodeCachedDataCleaner.ts +++ b/src/vs/code/electron-browser/sharedProcess/contrib/nodeCachedDataCleaner.ts @@ -5,7 +5,7 @@ import { basename, dirname, join } from 'vs/base/common/path'; import { onUnexpectedError } from 'vs/base/common/errors'; -import { dispose, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { readdir, rimraf, stat } from 'vs/base/node/pfs'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import product from 'vs/platform/product/node/product'; @@ -16,7 +16,7 @@ export class NodeCachedDataCleaner { ? 1000 * 60 * 60 * 24 * 7 // roughly 1 week : 1000 * 60 * 60 * 24 * 30 * 3; // roughly 3 months - private _disposables: IDisposable[] = []; + private readonly _disposables = new DisposableStore(); constructor( @IEnvironmentService private readonly _environmentService: IEnvironmentService @@ -25,7 +25,7 @@ export class NodeCachedDataCleaner { } dispose(): void { - this._disposables = dispose(this._disposables); + this._disposables.dispose(); } private _manageCachedDataSoon(): void { @@ -76,7 +76,7 @@ export class NodeCachedDataCleaner { }, 30 * 1000); - this._disposables.push(toDisposable(() => { + this._disposables.add(toDisposable(() => { if (handle) { clearTimeout(handle); handle = undefined; diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts index c1cda361423..00acb515cb3 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts @@ -37,7 +37,7 @@ import { ILocalizationsService } from 'vs/platform/localizations/common/localiza import { LocalizationsChannel } from 'vs/platform/localizations/node/localizationsIpc'; import { DialogChannelClient } from 'vs/platform/dialogs/node/dialogIpc'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; -import { IDisposable, dispose, combinedDisposable } from 'vs/base/common/lifecycle'; +import { combinedDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { DownloadService } from 'vs/platform/download/node/downloadService'; import { IDownloadService } from 'vs/platform/download/common/download'; import { IChannel, IServerChannel, StaticRouter } from 'vs/base/parts/ipc/common/ipc'; @@ -85,24 +85,24 @@ class MainProcessService implements IMainProcessService { async function main(server: Server, initData: ISharedProcessInitData, configuration: ISharedProcessConfiguration): Promise { const services = new ServiceCollection(); - const disposables: IDisposable[] = []; + const disposables = new DisposableStore(); - const onExit = () => dispose(disposables); + const onExit = () => disposables.dispose(); process.once('exit', onExit); ipcRenderer.once('handshake:goodbye', onExit); - disposables.push(server); + disposables.add(server); const environmentService = new EnvironmentService(initData.args, process.execPath); const mainRouter = new StaticRouter(ctx => ctx === 'main'); const logLevelClient = new LogLevelSetterChannelClient(server.getChannel('loglevel', mainRouter)); const logService = new FollowerLogService(logLevelClient, new SpdLogService('sharedprocess', environmentService.logsPath, initData.logLevel)); - disposables.push(logService); + disposables.add(logService); logService.info('main', JSON.stringify(configuration)); const configurationService = new ConfigurationService(environmentService.settingsResource); - disposables.push(configurationService); + disposables.add(configurationService); await configurationService.initialize(); services.set(IEnvironmentService, environmentService); @@ -137,7 +137,7 @@ async function main(server: Server, initData: ISharedProcessInitData, configurat if (!extensionDevelopmentLocationURI && !environmentService.args['disable-telemetry'] && product.enableTelemetry) { if (product.aiConfig && product.aiConfig.asimovKey && isBuilt) { appInsightsAppender = new AppInsightsAppender(eventPrefix, null, product.aiConfig.asimovKey, telemetryLogService); - disposables.push(appInsightsAppender); // Ensure the AI appender is disposed so that it flushes remaining data + disposables.add(appInsightsAppender); // Ensure the AI appender is disposed so that it flushes remaining data } const config: ITelemetryServiceConfig = { appender: combinedAppender(appInsightsAppender, new LogAppender(logService)), @@ -179,13 +179,13 @@ async function main(server: Server, initData: ISharedProcessInitData, configurat // update localizations cache (localizationsService as LocalizationsService).update(); // cache clean ups - disposables.push(combinedDisposable( + disposables.add(combinedDisposable( instantiationService2.createInstance(NodeCachedDataCleaner), instantiationService2.createInstance(LanguagePackCachedDataCleaner), instantiationService2.createInstance(StorageDataCleaner), instantiationService2.createInstance(LogsDataCleaner) )); - disposables.push(extensionManagementService as ExtensionManagementService); + disposables.add(extensionManagementService as ExtensionManagementService); }); }); } diff --git a/src/vs/code/electron-main/sharedProcess.ts b/src/vs/code/electron-main/sharedProcess.ts index 8076c873cc6..70b6ec75768 100644 --- a/src/vs/code/electron-main/sharedProcess.ts +++ b/src/vs/code/electron-main/sharedProcess.ts @@ -12,7 +12,7 @@ import { Barrier } from 'vs/base/common/async'; import { ILogService } from 'vs/platform/log/common/log'; import { ILifecycleService } from 'vs/platform/lifecycle/electron-main/lifecycleMain'; import { IThemeMainService } from 'vs/platform/theme/electron-main/themeMainService'; -import { dispose, toDisposable, IDisposable } from 'vs/base/common/lifecycle'; +import { toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; export class SharedProcess implements ISharedProcess { @@ -66,10 +66,10 @@ export class SharedProcess implements ISharedProcess { this.window.on('close', onClose); - const disposables: IDisposable[] = []; + const disposables = new DisposableStore(); this.lifecycleService.onWillShutdown(() => { - dispose(disposables); + disposables.dispose(); // Shut the shared process down when we are quitting // @@ -103,7 +103,7 @@ export class SharedProcess implements ISharedProcess { logLevel: this.logService.getLevel() }); - disposables.push(toDisposable(() => sender.send('handshake:goodbye'))); + disposables.add(toDisposable(() => sender.send('handshake:goodbye'))); ipcMain.once('handshake:im ready', () => c(undefined)); }); }); diff --git a/src/vs/editor/browser/services/codeEditorServiceImpl.ts b/src/vs/editor/browser/services/codeEditorServiceImpl.ts index 67822938da1..0779fe452a4 100644 --- a/src/vs/editor/browser/services/codeEditorServiceImpl.ts +++ b/src/vs/editor/browser/services/codeEditorServiceImpl.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as dom from 'vs/base/browser/dom'; -import { IDisposable, dispose as disposeAll } from 'vs/base/common/lifecycle'; +import { IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import * as strings from 'vs/base/common/strings'; import { URI } from 'vs/base/common/uri'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; @@ -123,7 +123,7 @@ interface ProviderArguments { class DecorationTypeOptionsProvider implements IModelDecorationOptionsProvider { - private _disposables: IDisposable[]; + private readonly _disposables = new DisposableStore(); public refCount: number; public className: string | undefined; @@ -138,11 +138,10 @@ class DecorationTypeOptionsProvider implements IModelDecorationOptionsProvider { constructor(themeService: IThemeService, providerArgs: ProviderArguments) { this.refCount = 0; - this._disposables = []; const createCSSRules = (type: ModelDecorationCSSRuleType) => { const rules = new DecorationCSSRules(type, providerArgs, themeService); - this._disposables.push(rules); + this._disposables.add(rules); if (rules.hasContent) { return rules.className; } @@ -150,7 +149,7 @@ class DecorationTypeOptionsProvider implements IModelDecorationOptionsProvider { }; const createInlineCSSRules = (type: ModelDecorationCSSRuleType) => { const rules = new DecorationCSSRules(type, providerArgs, themeService); - this._disposables.push(rules); + this._disposables.add(rules); if (rules.hasContent) { return { className: rules.className, hasLetterSpacing: rules.hasLetterSpacing }; } @@ -202,7 +201,7 @@ class DecorationTypeOptionsProvider implements IModelDecorationOptionsProvider { } public dispose(): void { - this._disposables = disposeAll(this._disposables); + this._disposables.dispose(); } } diff --git a/src/vs/editor/common/services/modelServiceImpl.ts b/src/vs/editor/common/services/modelServiceImpl.ts index 166bec43d97..00a95b42c78 100644 --- a/src/vs/editor/common/services/modelServiceImpl.ts +++ b/src/vs/editor/common/services/modelServiceImpl.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Emitter, Event } from 'vs/base/common/event'; -import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { Disposable, IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import * as platform from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; import { EDITOR_MODEL_DEFAULTS } from 'vs/editor/common/config/editorOptions'; @@ -30,7 +30,7 @@ class ModelData implements IDisposable { private _languageSelection: ILanguageSelection | null; private _languageSelectionListener: IDisposable | null; - private _modelEventListeners: IDisposable[]; + private readonly _modelEventListeners = new DisposableStore(); constructor( model: ITextModel, @@ -42,9 +42,8 @@ class ModelData implements IDisposable { this._languageSelection = null; this._languageSelectionListener = null; - this._modelEventListeners = []; - this._modelEventListeners.push(model.onWillDispose(() => onWillDispose(model))); - this._modelEventListeners.push(model.onDidChangeLanguage((e) => onDidChangeLanguage(model, e))); + this._modelEventListeners.add(model.onWillDispose(() => onWillDispose(model))); + this._modelEventListeners.add(model.onDidChangeLanguage((e) => onDidChangeLanguage(model, e))); } private _disposeLanguageSelection(): void { @@ -59,7 +58,7 @@ class ModelData implements IDisposable { } public dispose(): void { - this._modelEventListeners = dispose(this._modelEventListeners); + this._modelEventListeners.dispose(); this._disposeLanguageSelection(); } diff --git a/src/vs/editor/contrib/contextmenu/contextmenu.ts b/src/vs/editor/contrib/contextmenu/contextmenu.ts index a0c3f8903a5..2209b38da7f 100644 --- a/src/vs/editor/contrib/contextmenu/contextmenu.ts +++ b/src/vs/editor/contrib/contextmenu/contextmenu.ts @@ -10,7 +10,7 @@ import { ActionViewItem, Separator } from 'vs/base/browser/ui/actionbar/actionba import { IAnchor } from 'vs/base/browser/ui/contextview/contextview'; import { IAction } from 'vs/base/common/actions'; import { KeyCode, KeyMod, ResolvedKeybinding } from 'vs/base/common/keyCodes'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { DisposableStore } from 'vs/base/common/lifecycle'; import { ICodeEditor, IEditorMouseEvent, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { EditorAction, ServicesAccessor, registerEditorAction, registerEditorContribution } from 'vs/editor/browser/editorExtensions'; import { IEditorContribution, ScrollType } from 'vs/editor/common/editorCommon'; @@ -31,7 +31,7 @@ export class ContextMenuController implements IEditorContribution { return editor.getContribution(ContextMenuController.ID); } - private _toDispose: IDisposable[] = []; + private readonly _toDispose = new DisposableStore(); private _contextMenuIsBeingShownCount: number = 0; private readonly _editor: ICodeEditor; @@ -45,13 +45,13 @@ export class ContextMenuController implements IEditorContribution { ) { this._editor = editor; - this._toDispose.push(this._editor.onContextMenu((e: IEditorMouseEvent) => this._onContextMenu(e))); - this._toDispose.push(this._editor.onMouseWheel((e: IMouseWheelEvent) => { + this._toDispose.add(this._editor.onContextMenu((e: IEditorMouseEvent) => this._onContextMenu(e))); + this._toDispose.add(this._editor.onMouseWheel((e: IMouseWheelEvent) => { if (this._contextMenuIsBeingShownCount > 0) { this._contextViewService.hideContextView(); } })); - this._toDispose.push(this._editor.onKeyDown((e: IKeyboardEvent) => { + this._toDispose.add(this._editor.onKeyDown((e: IKeyboardEvent) => { if (e.keyCode === KeyCode.ContextMenu) { // Chrome is funny like that e.preventDefault(); @@ -217,7 +217,7 @@ export class ContextMenuController implements IEditorContribution { this._contextViewService.hideContextView(); } - this._toDispose = dispose(this._toDispose); + this._toDispose.dispose(); } } From ae2cc878f89945a8e29b91599b9083308f1cf70b Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 2 Jul 2019 16:35:49 -0700 Subject: [PATCH 0940/1449] Using DisposableStore in mainThread class #74250 --- .../api/browser/mainThreadDebugService.ts | 25 ++++++++-------- .../api/browser/mainThreadDocuments.ts | 21 +++++++------ .../browser/mainThreadDocumentsAndEditors.ts | 30 ++++++++----------- .../workbench/api/browser/mainThreadEditor.ts | 30 +++++++++---------- .../api/browser/mainThreadEditors.ts | 18 +++++------ src/vs/workbench/api/browser/mainThreadSCM.ts | 6 ++-- .../workbench/api/browser/mainThreadSearch.ts | 8 ++--- .../api/browser/mainThreadTerminalService.ts | 28 ++++++++--------- .../workbench/api/browser/mainThreadWindow.ts | 6 ++-- .../api/browser/mainThreadWorkspace.ts | 6 ++-- 10 files changed, 84 insertions(+), 94 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadDebugService.ts b/src/vs/workbench/api/browser/mainThreadDebugService.ts index d49f770e9ef..7386b69e611 100644 --- a/src/vs/workbench/api/browser/mainThreadDebugService.ts +++ b/src/vs/workbench/api/browser/mainThreadDebugService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { DisposableStore } from 'vs/base/common/lifecycle'; import { URI as uri } from 'vs/base/common/uri'; import { IDebugService, IConfig, IDebugConfigurationProvider, IBreakpoint, IFunctionBreakpoint, IBreakpointData, ITerminalSettings, IDebugAdapter, IDebugAdapterDescriptorFactory, IDebugSession, IDebugAdapterFactory } from 'vs/workbench/contrib/debug/common/debug'; import { @@ -20,7 +20,7 @@ import { convertToVSCPaths, convertToDAPaths } from 'vs/workbench/contrib/debug/ export class MainThreadDebugService implements MainThreadDebugServiceShape, IDebugAdapterFactory { private readonly _proxy: ExtHostDebugServiceShape; - private _toDispose: IDisposable[]; + private readonly _toDispose = new DisposableStore(); private _breakpointEventsActive: boolean; private readonly _debugAdapters: Map; private _debugAdaptersHandleCounter = 1; @@ -33,19 +33,18 @@ export class MainThreadDebugService implements MainThreadDebugServiceShape, IDeb @IDebugService private readonly debugService: IDebugService ) { this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostDebugService); - this._toDispose = []; - this._toDispose.push(debugService.onDidNewSession(session => { + this._toDispose.add(debugService.onDidNewSession(session => { this._proxy.$acceptDebugSessionStarted(this.getSessionDto(session)); })); // Need to start listening early to new session events because a custom event can come while a session is initialising - this._toDispose.push(debugService.onWillNewSession(session => { - this._toDispose.push(session.onDidCustomEvent(event => this._proxy.$acceptDebugSessionCustomEvent(this.getSessionDto(session), event))); + this._toDispose.add(debugService.onWillNewSession(session => { + this._toDispose.add(session.onDidCustomEvent(event => this._proxy.$acceptDebugSessionCustomEvent(this.getSessionDto(session), event))); })); - this._toDispose.push(debugService.onDidEndSession(session => { + this._toDispose.add(debugService.onDidEndSession(session => { this._proxy.$acceptDebugSessionTerminated(this.getSessionDto(session)); this._sessions.delete(session.getId()); })); - this._toDispose.push(debugService.getViewModel().onDidFocusSession(session => { + this._toDispose.add(debugService.getViewModel().onDidFocusSession(session => { this._proxy.$acceptDebugSessionActiveChanged(this.getSessionDto(session)); })); @@ -56,7 +55,7 @@ export class MainThreadDebugService implements MainThreadDebugServiceShape, IDeb } public dispose(): void { - this._toDispose = dispose(this._toDispose); + this._toDispose.dispose(); } // interface IDebugAdapterProvider @@ -79,7 +78,7 @@ export class MainThreadDebugService implements MainThreadDebugServiceShape, IDeb // RPC methods (MainThreadDebugServiceShape) public $registerDebugTypes(debugTypes: string[]) { - this._toDispose.push(this.debugService.getConfigurationManager().registerDebugAdapterFactory(debugTypes, this)); + this._toDispose.add(this.debugService.getConfigurationManager().registerDebugAdapterFactory(debugTypes, this)); } public $startBreakpointEvents(): void { @@ -88,7 +87,7 @@ export class MainThreadDebugService implements MainThreadDebugServiceShape, IDeb this._breakpointEventsActive = true; // set up a handler to send more - this._toDispose.push(this.debugService.getModel().onDidChangeBreakpoints(e => { + this._toDispose.add(this.debugService.getModel().onDidChangeBreakpoints(e => { // Ignore session only breakpoint events since they should only reflect in the UI if (e && !e.sessionOnly) { const delta: IBreakpointsDeltaDto = {}; @@ -170,7 +169,7 @@ export class MainThreadDebugService implements MainThreadDebugServiceShape, IDeb }; } this._debugConfigurationProviders.set(handle, provider); - this._toDispose.push(this.debugService.getConfigurationManager().registerDebugConfigurationProvider(provider)); + this._toDispose.add(this.debugService.getConfigurationManager().registerDebugConfigurationProvider(provider)); return Promise.resolve(undefined); } @@ -192,7 +191,7 @@ export class MainThreadDebugService implements MainThreadDebugServiceShape, IDeb } }; this._debugAdapterDescriptorFactories.set(handle, provider); - this._toDispose.push(this.debugService.getConfigurationManager().registerDebugAdapterDescriptorFactory(provider)); + this._toDispose.add(this.debugService.getConfigurationManager().registerDebugAdapterDescriptorFactory(provider)); return Promise.resolve(undefined); } diff --git a/src/vs/workbench/api/browser/mainThreadDocuments.ts b/src/vs/workbench/api/browser/mainThreadDocuments.ts index af99b8a7720..adfef42555b 100644 --- a/src/vs/workbench/api/browser/mainThreadDocuments.ts +++ b/src/vs/workbench/api/browser/mainThreadDocuments.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { toErrorMessage } from 'vs/base/common/errorMessage'; -import { IDisposable, IReference, dispose } from 'vs/base/common/lifecycle'; +import { IDisposable, IReference, dispose, DisposableStore } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; import { URI, UriComponents } from 'vs/base/common/uri'; import { ITextModel } from 'vs/editor/common/model'; @@ -73,7 +73,7 @@ export class MainThreadDocuments implements MainThreadDocumentsShape { private readonly _untitledEditorService: IUntitledEditorService; private readonly _environmentService: IWorkbenchEnvironmentService; - private _toDispose: IDisposable[]; + private readonly _toDispose = new DisposableStore(); private _modelToDisposeMap: { [modelUrl: string]: IDisposable; }; private readonly _proxy: ExtHostDocumentsShape; private readonly _modelIsSynced: { [modelId: string]: boolean; }; @@ -100,23 +100,22 @@ export class MainThreadDocuments implements MainThreadDocumentsShape { this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostDocuments); this._modelIsSynced = {}; - this._toDispose = []; - this._toDispose.push(documentsAndEditors.onDocumentAdd(models => models.forEach(this._onModelAdded, this))); - this._toDispose.push(documentsAndEditors.onDocumentRemove(urls => urls.forEach(this._onModelRemoved, this))); - this._toDispose.push(this._modelReferenceCollection); - this._toDispose.push(modelService.onModelModeChanged(this._onModelModeChanged, this)); + this._toDispose.add(documentsAndEditors.onDocumentAdd(models => models.forEach(this._onModelAdded, this))); + this._toDispose.add(documentsAndEditors.onDocumentRemove(urls => urls.forEach(this._onModelRemoved, this))); + this._toDispose.add(this._modelReferenceCollection); + this._toDispose.add(modelService.onModelModeChanged(this._onModelModeChanged, this)); - this._toDispose.push(textFileService.models.onModelSaved(e => { + this._toDispose.add(textFileService.models.onModelSaved(e => { if (this._shouldHandleFileEvent(e)) { this._proxy.$acceptModelSaved(e.resource); } })); - this._toDispose.push(textFileService.models.onModelReverted(e => { + this._toDispose.add(textFileService.models.onModelReverted(e => { if (this._shouldHandleFileEvent(e)) { this._proxy.$acceptDirtyStateChanged(e.resource, false); } })); - this._toDispose.push(textFileService.models.onModelDirty(e => { + this._toDispose.add(textFileService.models.onModelDirty(e => { if (this._shouldHandleFileEvent(e)) { this._proxy.$acceptDirtyStateChanged(e.resource, true); } @@ -130,7 +129,7 @@ export class MainThreadDocuments implements MainThreadDocumentsShape { this._modelToDisposeMap[modelUrl].dispose(); }); this._modelToDisposeMap = Object.create(null); - this._toDispose = dispose(this._toDispose); + this._toDispose.dispose(); } private _shouldHandleFileEvent(e: TextFileModelChangeEvent): boolean { diff --git a/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.ts b/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.ts index 5c8a9b248bb..575e7448869 100644 --- a/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.ts +++ b/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Emitter, Event } from 'vs/base/common/event'; -import { IDisposable, combinedDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IDisposable, combinedDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { values } from 'vs/base/common/map'; import { URI } from 'vs/base/common/uri'; import { ICodeEditor, isCodeEditor, isDiffEditor, IActiveCodeEditor } from 'vs/editor/browser/editorBrowser'; @@ -144,7 +144,7 @@ const enum ActiveEditorOrder { class MainThreadDocumentAndEditorStateComputer { - private _toDispose: IDisposable[] = []; + private readonly _toDispose = new DisposableStore(); private _toDisposeOnEditorRemove = new Map(); private _currentState: DocumentAndEditorState; private _activeEditorOrder: ActiveEditorOrder = ActiveEditorOrder.Editor; @@ -172,7 +172,7 @@ class MainThreadDocumentAndEditorStateComputer { } dispose(): void { - this._toDispose = dispose(this._toDispose); + this._toDispose.dispose(); } private _onDidAddEditor(e: ICodeEditor): void { @@ -304,9 +304,8 @@ class MainThreadDocumentAndEditorStateComputer { @extHostCustomer export class MainThreadDocumentsAndEditors { - private _toDispose: IDisposable[]; + private readonly _toDispose = new DisposableStore(); private readonly _proxy: ExtHostDocumentsAndEditorsShape; - private readonly _stateComputer: MainThreadDocumentAndEditorStateComputer; private _textEditors = <{ [id: string]: MainThreadTextEditor }>Object.create(null); private _onTextEditorAdd = new Emitter(); @@ -336,28 +335,23 @@ export class MainThreadDocumentsAndEditors { ) { this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostDocumentsAndEditors); - const mainThreadDocuments = new MainThreadDocuments(this, extHostContext, this._modelService, modeService, this._textFileService, fileService, textModelResolverService, untitledEditorService, environmentService); + const mainThreadDocuments = this._toDispose.add(new MainThreadDocuments(this, extHostContext, this._modelService, modeService, this._textFileService, fileService, textModelResolverService, untitledEditorService, environmentService)); extHostContext.set(MainContext.MainThreadDocuments, mainThreadDocuments); - const mainThreadTextEditors = new MainThreadTextEditors(this, extHostContext, codeEditorService, bulkEditService, this._editorService, this._editorGroupService); + const mainThreadTextEditors = this._toDispose.add(new MainThreadTextEditors(this, extHostContext, codeEditorService, bulkEditService, this._editorService, this._editorGroupService)); extHostContext.set(MainContext.MainThreadTextEditors, mainThreadTextEditors); // It is expected that the ctor of the state computer calls our `_onDelta`. - this._stateComputer = new MainThreadDocumentAndEditorStateComputer(delta => this._onDelta(delta), _modelService, codeEditorService, this._editorService, panelService); + this._toDispose.add(new MainThreadDocumentAndEditorStateComputer(delta => this._onDelta(delta), _modelService, codeEditorService, this._editorService, panelService)); - this._toDispose = [ - mainThreadDocuments, - mainThreadTextEditors, - this._stateComputer, - this._onTextEditorAdd, - this._onTextEditorRemove, - this._onDocumentAdd, - this._onDocumentRemove, - ]; + this._toDispose.add(this._onTextEditorAdd); + this._toDispose.add(this._onTextEditorRemove); + this._toDispose.add(this._onDocumentAdd); + this._toDispose.add(this._onDocumentRemove); } dispose(): void { - this._toDispose = dispose(this._toDispose); + this._toDispose.dispose(); } private _onDelta(delta: DocumentAndEditorStateDelta): void { diff --git a/src/vs/workbench/api/browser/mainThreadEditor.ts b/src/vs/workbench/api/browser/mainThreadEditor.ts index 59c9f2c2c2c..5e65f41e3c5 100644 --- a/src/vs/workbench/api/browser/mainThreadEditor.ts +++ b/src/vs/workbench/api/browser/mainThreadEditor.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Emitter, Event } from 'vs/base/common/event'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { DisposableStore } from 'vs/base/common/lifecycle'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { RenderLineNumbersType, TextEditorCursorStyle, cursorStyleToString } from 'vs/editor/common/config/editorOptions'; import { IRange, Range } from 'vs/editor/common/core/range'; @@ -173,10 +173,10 @@ export class MainThreadTextEditor { private readonly _id: string; private _model: ITextModel; private readonly _modelService: IModelService; - private _modelListeners: IDisposable[]; + private readonly _modelListeners = new DisposableStore(); private _codeEditor: ICodeEditor | null; private readonly _focusTracker: IFocusTracker; - private _codeEditorListeners: IDisposable[]; + private readonly _codeEditorListeners = new DisposableStore(); private _properties: MainThreadTextEditorProperties; private readonly _onPropertiesChanged: Emitter; @@ -193,12 +193,10 @@ export class MainThreadTextEditor { this._codeEditor = null; this._focusTracker = focusTracker; this._modelService = modelService; - this._codeEditorListeners = []; this._onPropertiesChanged = new Emitter(); - this._modelListeners = []; - this._modelListeners.push(this._model.onDidChangeOptions((e) => { + this._modelListeners.add(this._model.onDidChangeOptions((e) => { this._updatePropertiesNow(null); })); @@ -208,9 +206,9 @@ export class MainThreadTextEditor { public dispose(): void { this._model = null!; - this._modelListeners = dispose(this._modelListeners); + this._modelListeners.dispose(); this._codeEditor = null; - this._codeEditorListeners = dispose(this._codeEditorListeners); + this._codeEditorListeners.dispose(); } private _updatePropertiesNow(selectionChangeSource: string | null): void { @@ -249,36 +247,36 @@ export class MainThreadTextEditor { // Nothing to do... return; } - this._codeEditorListeners = dispose(this._codeEditorListeners); + this._codeEditorListeners.clear(); this._codeEditor = codeEditor; if (this._codeEditor) { // Catch early the case that this code editor gets a different model set and disassociate from this model - this._codeEditorListeners.push(this._codeEditor.onDidChangeModel(() => { + this._codeEditorListeners.add(this._codeEditor.onDidChangeModel(() => { this.setCodeEditor(null); })); - this._codeEditorListeners.push(this._codeEditor.onDidFocusEditorWidget(() => { + this._codeEditorListeners.add(this._codeEditor.onDidFocusEditorWidget(() => { this._focusTracker.onGainedFocus(); })); - this._codeEditorListeners.push(this._codeEditor.onDidBlurEditorWidget(() => { + this._codeEditorListeners.add(this._codeEditor.onDidBlurEditorWidget(() => { this._focusTracker.onLostFocus(); })); - this._codeEditorListeners.push(this._codeEditor.onDidChangeCursorSelection((e) => { + this._codeEditorListeners.add(this._codeEditor.onDidChangeCursorSelection((e) => { // selection this._updatePropertiesNow(e.source); })); - this._codeEditorListeners.push(this._codeEditor.onDidChangeConfiguration(() => { + this._codeEditorListeners.add(this._codeEditor.onDidChangeConfiguration(() => { // options this._updatePropertiesNow(null); })); - this._codeEditorListeners.push(this._codeEditor.onDidLayoutChange(() => { + this._codeEditorListeners.add(this._codeEditor.onDidLayoutChange(() => { // visibleRanges this._updatePropertiesNow(null); })); - this._codeEditorListeners.push(this._codeEditor.onDidScrollChange(() => { + this._codeEditorListeners.add(this._codeEditor.onDidScrollChange(() => { // visibleRanges this._updatePropertiesNow(null); })); diff --git a/src/vs/workbench/api/browser/mainThreadEditors.ts b/src/vs/workbench/api/browser/mainThreadEditors.ts index 05e90326a1b..25f4a8e1e9c 100644 --- a/src/vs/workbench/api/browser/mainThreadEditors.ts +++ b/src/vs/workbench/api/browser/mainThreadEditors.ts @@ -5,7 +5,7 @@ import { localize } from 'vs/nls'; import { disposed } from 'vs/base/common/errors'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose, DisposableStore } from 'vs/base/common/lifecycle'; import { equals as objectEquals } from 'vs/base/common/objects'; import { URI, UriComponents } from 'vs/base/common/uri'; import { IBulkEditService } from 'vs/editor/browser/services/bulkEditService'; @@ -32,7 +32,7 @@ export class MainThreadTextEditors implements MainThreadTextEditorsShape { private readonly _instanceId: string; private readonly _proxy: ExtHostEditorsShape; private readonly _documentsAndEditors: MainThreadDocumentsAndEditors; - private _toDispose: IDisposable[]; + private readonly _toDispose = new DisposableStore(); private _textEditorsListenersMap: { [editorId: string]: IDisposable[]; }; private _editorPositionData: ITextEditorPositionData | null; private _registeredDecorationTypes: { [decorationType: string]: boolean; }; @@ -48,16 +48,16 @@ export class MainThreadTextEditors implements MainThreadTextEditorsShape { this._instanceId = String(++MainThreadTextEditors.INSTANCE_COUNT); this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostEditors); this._documentsAndEditors = documentsAndEditors; - this._toDispose = []; + this._textEditorsListenersMap = Object.create(null); this._editorPositionData = null; - this._toDispose.push(documentsAndEditors.onTextEditorAdd(editors => editors.forEach(this._onTextEditorAdd, this))); - this._toDispose.push(documentsAndEditors.onTextEditorRemove(editors => editors.forEach(this._onTextEditorRemove, this))); + this._toDispose.add(documentsAndEditors.onTextEditorAdd(editors => editors.forEach(this._onTextEditorAdd, this))); + this._toDispose.add(documentsAndEditors.onTextEditorRemove(editors => editors.forEach(this._onTextEditorRemove, this))); - this._toDispose.push(this._editorService.onDidVisibleEditorsChange(() => this._updateActiveAndVisibleTextEditors())); - this._toDispose.push(this._editorGroupService.onDidRemoveGroup(() => this._updateActiveAndVisibleTextEditors())); - this._toDispose.push(this._editorGroupService.onDidMoveGroup(() => this._updateActiveAndVisibleTextEditors())); + this._toDispose.add(this._editorService.onDidVisibleEditorsChange(() => this._updateActiveAndVisibleTextEditors())); + this._toDispose.add(this._editorGroupService.onDidRemoveGroup(() => this._updateActiveAndVisibleTextEditors())); + this._toDispose.add(this._editorGroupService.onDidMoveGroup(() => this._updateActiveAndVisibleTextEditors())); this._registeredDecorationTypes = Object.create(null); } @@ -67,7 +67,7 @@ export class MainThreadTextEditors implements MainThreadTextEditorsShape { dispose(this._textEditorsListenersMap[editorId]); }); this._textEditorsListenersMap = Object.create(null); - this._toDispose = dispose(this._toDispose); + this._toDispose.dispose(); for (let decorationType in this._registeredDecorationTypes) { this._codeEditorService.removeDecorationType(decorationType); } diff --git a/src/vs/workbench/api/browser/mainThreadSCM.ts b/src/vs/workbench/api/browser/mainThreadSCM.ts index 86113dda17c..5dfdc620625 100644 --- a/src/vs/workbench/api/browser/mainThreadSCM.ts +++ b/src/vs/workbench/api/browser/mainThreadSCM.ts @@ -6,7 +6,7 @@ import { URI, UriComponents } from 'vs/base/common/uri'; import { Event, Emitter } from 'vs/base/common/event'; import { assign } from 'vs/base/common/objects'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { ISCMService, ISCMRepository, ISCMProvider, ISCMResource, ISCMResourceGroup, ISCMResourceDecorations, IInputValidation } from 'vs/workbench/contrib/scm/common/scm'; import { ExtHostContext, MainThreadSCMShape, ExtHostSCMShape, SCMProviderFeatures, SCMRawResourceSplices, SCMGroupFeatures, MainContext, IExtHostContext } from '../common/extHost.protocol'; import { Command } from 'vs/editor/common/modes'; @@ -268,7 +268,7 @@ export class MainThreadSCM implements MainThreadSCMShape { private readonly _proxy: ExtHostSCMShape; private _repositories: { [handle: number]: ISCMRepository; } = Object.create(null); private _inputDisposables: { [handle: number]: IDisposable; } = Object.create(null); - private _disposables: IDisposable[] = []; + private readonly _disposables = new DisposableStore(); constructor( extHostContext: IExtHostContext, @@ -289,7 +289,7 @@ export class MainThreadSCM implements MainThreadSCMShape { .forEach(id => this._inputDisposables[id].dispose()); this._inputDisposables = Object.create(null); - this._disposables = dispose(this._disposables); + this._disposables.dispose(); } $registerSourceControl(handle: number, id: string, label: string, rootUri: UriComponents | undefined): void { diff --git a/src/vs/workbench/api/browser/mainThreadSearch.ts b/src/vs/workbench/api/browser/mainThreadSearch.ts index 5fa7df39b18..426f361e786 100644 --- a/src/vs/workbench/api/browser/mainThreadSearch.ts +++ b/src/vs/workbench/api/browser/mainThreadSearch.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { CancellationToken } from 'vs/base/common/cancellation'; -import { dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { dispose, IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { values } from 'vs/base/common/map'; import { URI, UriComponents } from 'vs/base/common/uri'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -96,7 +96,7 @@ class SearchOperation { class RemoteSearchProvider implements ISearchResultProvider, IDisposable { - private readonly _registrations: IDisposable[]; + private readonly _registrations = new DisposableStore(); private readonly _searches = new Map(); constructor( @@ -106,11 +106,11 @@ class RemoteSearchProvider implements ISearchResultProvider, IDisposable { private readonly _handle: number, private readonly _proxy: ExtHostSearchShape ) { - this._registrations = [searchService.registerSearchResultProvider(this._scheme, type, this)]; + this._registrations.add(searchService.registerSearchResultProvider(this._scheme, type, this)); } dispose(): void { - dispose(this._registrations); + this._registrations.dispose(); } fileSearch(query: IFileQuery, token: CancellationToken = CancellationToken.None): Promise { diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index b975524b5f6..ac3d1229aec 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { ITerminalService, ITerminalInstance, IShellLaunchConfig, ITerminalProcessExtHostProxy, ITerminalProcessExtHostRequest, ITerminalDimensions, EXT_HOST_CREATION_DELAY, IAvailableShellsRequest, IDefaultShellAndArgsRequest } from 'vs/workbench/contrib/terminal/common/terminal'; import { ExtHostContext, ExtHostTerminalServiceShape, MainThreadTerminalServiceShape, MainContext, IExtHostContext, ShellLaunchConfigDto } from 'vs/workbench/api/common/extHost.protocol'; import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; @@ -17,7 +17,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape private _proxy: ExtHostTerminalServiceShape; private _remoteAuthority: string | null; - private _toDispose: IDisposable[] = []; + private readonly _toDispose = new DisposableStore(); private _terminalProcesses: { [id: number]: ITerminalProcessExtHostProxy } = {}; private _terminalOnDidWriteDataListeners: { [id: number]: IDisposable } = {}; private _terminalOnDidAcceptInputListeners: { [id: number]: IDisposable } = {}; @@ -32,7 +32,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape this._remoteAuthority = extHostContext.remoteAuthority; // ITerminalService listeners - this._toDispose.push(_terminalService.onInstanceCreated((instance) => { + this._toDispose.add(_terminalService.onInstanceCreated((instance) => { // Delay this message so the TerminalInstance constructor has a chance to finish and // return the ID normally to the extension host. The ID that is passed here will be used // to register non-extension API terminals in the extension host. @@ -41,19 +41,19 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape this._onInstanceDimensionsChanged(instance); }, EXT_HOST_CREATION_DELAY); })); - this._toDispose.push(_terminalService.onInstanceDisposed(instance => this._onTerminalDisposed(instance))); - this._toDispose.push(_terminalService.onInstanceProcessIdReady(instance => this._onTerminalProcessIdReady(instance))); - this._toDispose.push(_terminalService.onInstanceDimensionsChanged(instance => this._onInstanceDimensionsChanged(instance))); - this._toDispose.push(_terminalService.onInstanceMaximumDimensionsChanged(instance => this._onInstanceMaximumDimensionsChanged(instance))); - this._toDispose.push(_terminalService.onInstanceRequestExtHostProcess(request => this._onTerminalRequestExtHostProcess(request))); - this._toDispose.push(_terminalService.onActiveInstanceChanged(instance => this._onActiveTerminalChanged(instance ? instance.id : null))); - this._toDispose.push(_terminalService.onInstanceTitleChanged(instance => this._onTitleChanged(instance.id, instance.title))); - this._toDispose.push(_terminalService.configHelper.onWorkspacePermissionsChanged(isAllowed => this._onWorkspacePermissionsChanged(isAllowed))); - this._toDispose.push(_terminalService.onRequestAvailableShells(e => this._onRequestAvailableShells(e))); + this._toDispose.add(_terminalService.onInstanceDisposed(instance => this._onTerminalDisposed(instance))); + this._toDispose.add(_terminalService.onInstanceProcessIdReady(instance => this._onTerminalProcessIdReady(instance))); + this._toDispose.add(_terminalService.onInstanceDimensionsChanged(instance => this._onInstanceDimensionsChanged(instance))); + this._toDispose.add(_terminalService.onInstanceMaximumDimensionsChanged(instance => this._onInstanceMaximumDimensionsChanged(instance))); + this._toDispose.add(_terminalService.onInstanceRequestExtHostProcess(request => this._onTerminalRequestExtHostProcess(request))); + this._toDispose.add(_terminalService.onActiveInstanceChanged(instance => this._onActiveTerminalChanged(instance ? instance.id : null))); + this._toDispose.add(_terminalService.onInstanceTitleChanged(instance => this._onTitleChanged(instance.id, instance.title))); + this._toDispose.add(_terminalService.configHelper.onWorkspacePermissionsChanged(isAllowed => this._onWorkspacePermissionsChanged(isAllowed))); + this._toDispose.add(_terminalService.onRequestAvailableShells(e => this._onRequestAvailableShells(e))); // ITerminalInstanceService listeners if (terminalInstanceService.onRequestDefaultShellAndArgs) { - this._toDispose.push(terminalInstanceService.onRequestDefaultShellAndArgs(e => this._onRequestDefaultShellAndArgs(e))); + this._toDispose.add(terminalInstanceService.onRequestDefaultShellAndArgs(e => this._onRequestDefaultShellAndArgs(e))); } // Set initial ext host state @@ -70,7 +70,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape } public dispose(): void { - this._toDispose = dispose(this._toDispose); + this._toDispose.dispose(); // TODO@Daniel: Should all the previously created terminals be disposed // when the extension host process goes down ? diff --git a/src/vs/workbench/api/browser/mainThreadWindow.ts b/src/vs/workbench/api/browser/mainThreadWindow.ts index 533dbb62eae..1e948912b0c 100644 --- a/src/vs/workbench/api/browser/mainThreadWindow.ts +++ b/src/vs/workbench/api/browser/mainThreadWindow.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Event } from 'vs/base/common/event'; -import { dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { DisposableStore } from 'vs/base/common/lifecycle'; import { URI, UriComponents } from 'vs/base/common/uri'; import { IWindowService, IWindowsService } from 'vs/platform/windows/common/windows'; import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; @@ -17,7 +17,7 @@ import { extractLocalHostUriMetaDataForPortMapping } from 'vs/workbench/contrib/ export class MainThreadWindow implements MainThreadWindowShape { private readonly proxy: ExtHostWindowShape; - private disposables: IDisposable[] = []; + private readonly disposables = new DisposableStore(); private readonly _tunnels = new Map>(); constructor( @@ -34,7 +34,7 @@ export class MainThreadWindow implements MainThreadWindowShape { } dispose(): void { - this.disposables = dispose(this.disposables); + this.disposables.dispose(); for (const tunnel of this._tunnels.values()) { tunnel.then(tunnel => tunnel.dispose()); diff --git a/src/vs/workbench/api/browser/mainThreadWorkspace.ts b/src/vs/workbench/api/browser/mainThreadWorkspace.ts index 6720db87bf9..f8cb326f992 100644 --- a/src/vs/workbench/api/browser/mainThreadWorkspace.ts +++ b/src/vs/workbench/api/browser/mainThreadWorkspace.ts @@ -5,7 +5,7 @@ import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { isPromiseCanceledError } from 'vs/base/common/errors'; -import { dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { DisposableStore } from 'vs/base/common/lifecycle'; import { URI, UriComponents } from 'vs/base/common/uri'; import { localize } from 'vs/nls'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; @@ -28,7 +28,7 @@ import { INotificationService } from 'vs/platform/notification/common/notificati @extHostNamedCustomer(MainContext.MainThreadWorkspace) export class MainThreadWorkspace implements MainThreadWorkspaceShape { - private readonly _toDispose: IDisposable[] = []; + private readonly _toDispose = new DisposableStore(); private readonly _activeCancelTokens: { [id: number]: CancellationTokenSource } = Object.create(null); private readonly _proxy: ExtHostWorkspaceShape; private readonly _queryBuilder = this._instantiationService.createInstance(QueryBuilder); @@ -52,7 +52,7 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape { } dispose(): void { - dispose(this._toDispose); + this._toDispose.dispose(); for (let requestId in this._activeCancelTokens) { const tokenSource = this._activeCancelTokens[requestId]; From 228fe8a6bb21f254cd2b969190f0a772e4f0eb7b Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 2 Jul 2019 16:37:27 -0700 Subject: [PATCH 0941/1449] Replaceing uses of IDisposableWith DisposableStore #74250 --- src/vs/editor/contrib/links/links.ts | 25 +++++++++---------- .../wordHighlighter/wordHighlighter.ts | 13 +++++----- .../browser/menuEntryActionViewItem.ts | 16 ++++++------ .../contextkey/browser/contextKeyService.ts | 8 +++--- .../contextview/browser/contextMenuHandler.ts | 8 +++--- .../telemetry/browser/errorTelemetry.ts | 2 +- .../telemetry/common/errorTelemetry.ts | 8 +++--- 7 files changed, 39 insertions(+), 41 deletions(-) diff --git a/src/vs/editor/contrib/links/links.ts b/src/vs/editor/contrib/links/links.ts index 056e2cb5b35..de26df3e3d4 100644 --- a/src/vs/editor/contrib/links/links.ts +++ b/src/vs/editor/contrib/links/links.ts @@ -9,7 +9,7 @@ import * as async from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; import { onUnexpectedError } from 'vs/base/common/errors'; import { MarkdownString } from 'vs/base/common/htmlContent'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { DisposableStore } from 'vs/base/common/lifecycle'; import * as platform from 'vs/base/common/platform'; import { ICodeEditor, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { EditorAction, ServicesAccessor, registerEditorAction, registerEditorContribution } from 'vs/editor/browser/editorExtensions'; @@ -172,7 +172,7 @@ class LinkDetector implements editorCommon.IEditorContribution { private readonly editor: ICodeEditor; private enabled: boolean; - private listenersToRemove: IDisposable[]; + private readonly listenersToRemove = new DisposableStore(); private readonly timeout: async.TimeoutTimer; private computePromise: async.CancelablePromise | null; private activeLinksList: LinksList | null; @@ -189,22 +189,21 @@ class LinkDetector implements editorCommon.IEditorContribution { this.editor = editor; this.openerService = openerService; this.notificationService = notificationService; - this.listenersToRemove = []; let clickLinkGesture = new ClickLinkGesture(editor); - this.listenersToRemove.push(clickLinkGesture); - this.listenersToRemove.push(clickLinkGesture.onMouseMoveOrRelevantKeyDown(([mouseEvent, keyboardEvent]) => { + this.listenersToRemove.add(clickLinkGesture); + this.listenersToRemove.add(clickLinkGesture.onMouseMoveOrRelevantKeyDown(([mouseEvent, keyboardEvent]) => { this._onEditorMouseMove(mouseEvent, keyboardEvent); })); - this.listenersToRemove.push(clickLinkGesture.onExecute((e) => { + this.listenersToRemove.add(clickLinkGesture.onExecute((e) => { this.onEditorMouseUp(e); })); - this.listenersToRemove.push(clickLinkGesture.onCancel((e) => { + this.listenersToRemove.add(clickLinkGesture.onCancel((e) => { this.cleanUpActiveLinkDecoration(); })); this.enabled = editor.getConfiguration().contribInfo.links; - this.listenersToRemove.push(editor.onDidChangeConfiguration((e) => { + this.listenersToRemove.add(editor.onDidChangeConfiguration((e) => { let enabled = editor.getConfiguration().contribInfo.links; if (this.enabled === enabled) { // No change in our configuration option @@ -221,10 +220,10 @@ class LinkDetector implements editorCommon.IEditorContribution { // Start computing (for the getting enabled case) this.beginCompute(); })); - this.listenersToRemove.push(editor.onDidChangeModelContent((e) => this.onChange())); - this.listenersToRemove.push(editor.onDidChangeModel((e) => this.onModelChanged())); - this.listenersToRemove.push(editor.onDidChangeModelLanguage((e) => this.onModelModeChanged())); - this.listenersToRemove.push(LinkProviderRegistry.onDidChange((e) => this.onModelModeChanged())); + this.listenersToRemove.add(editor.onDidChangeModelContent((e) => this.onChange())); + this.listenersToRemove.add(editor.onDidChangeModel((e) => this.onModelChanged())); + this.listenersToRemove.add(editor.onDidChangeModelLanguage((e) => this.onModelModeChanged())); + this.listenersToRemove.add(LinkProviderRegistry.onDidChange((e) => this.onModelModeChanged())); this.timeout = new async.TimeoutTimer(); this.computePromise = null; @@ -414,7 +413,7 @@ class LinkDetector implements editorCommon.IEditorContribution { } public dispose(): void { - this.listenersToRemove = dispose(this.listenersToRemove); + this.listenersToRemove.dispose(); this.stop(); this.timeout.dispose(); } diff --git a/src/vs/editor/contrib/wordHighlighter/wordHighlighter.ts b/src/vs/editor/contrib/wordHighlighter/wordHighlighter.ts index 6b918096810..0820b22ce51 100644 --- a/src/vs/editor/contrib/wordHighlighter/wordHighlighter.ts +++ b/src/vs/editor/contrib/wordHighlighter/wordHighlighter.ts @@ -9,7 +9,7 @@ import { CancelablePromise, createCancelablePromise, first, timeout } from 'vs/b import { CancellationToken } from 'vs/base/common/cancellation'; import { onUnexpectedError, onUnexpectedExternalError } from 'vs/base/common/errors'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; -import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { IActiveCodeEditor, ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorAction, IActionOptions, registerDefaultLanguageCommand, registerEditorAction, registerEditorContribution } from 'vs/editor/browser/editorExtensions'; import { CursorChangeReason, ICursorPositionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; @@ -164,7 +164,7 @@ class WordHighlighter { private occurrencesHighlight: boolean; private readonly model: ITextModel; private _decorationIds: string[]; - private toUnhook: IDisposable[]; + private readonly toUnhook = new DisposableStore(); private workerRequestTokenId: number = 0; private workerRequest: IOccurenceAtPositionRequest | null; @@ -183,8 +183,7 @@ class WordHighlighter { this._ignorePositionChangeEvent = false; this.occurrencesHighlight = this.editor.getConfiguration().contribInfo.occurrencesHighlight; this.model = this.editor.getModel(); - this.toUnhook = []; - this.toUnhook.push(editor.onDidChangeCursorPosition((e: ICursorPositionChangedEvent) => { + this.toUnhook.add(editor.onDidChangeCursorPosition((e: ICursorPositionChangedEvent) => { if (this._ignorePositionChangeEvent) { // We are changing the position => ignore this event @@ -199,10 +198,10 @@ class WordHighlighter { this._onPositionChanged(e); })); - this.toUnhook.push(editor.onDidChangeModelContent((e) => { + this.toUnhook.add(editor.onDidChangeModelContent((e) => { this._stopAll(); })); - this.toUnhook.push(editor.onDidChangeConfiguration((e) => { + this.toUnhook.add(editor.onDidChangeConfiguration((e) => { let newValue = this.editor.getConfiguration().contribInfo.occurrencesHighlight; if (this.occurrencesHighlight !== newValue) { this.occurrencesHighlight = newValue; @@ -454,7 +453,7 @@ class WordHighlighter { public dispose(): void { this._stopAll(); - this.toUnhook = dispose(this.toUnhook); + this.toUnhook.dispose(); } } diff --git a/src/vs/platform/actions/browser/menuEntryActionViewItem.ts b/src/vs/platform/actions/browser/menuEntryActionViewItem.ts index 4d73996185d..2ec3d2e5d78 100644 --- a/src/vs/platform/actions/browser/menuEntryActionViewItem.ts +++ b/src/vs/platform/actions/browser/menuEntryActionViewItem.ts @@ -9,7 +9,7 @@ import { ActionViewItem, Separator } from 'vs/base/browser/ui/actionbar/actionba import { IAction } from 'vs/base/common/actions'; import { Emitter } from 'vs/base/common/event'; import { IdGenerator } from 'vs/base/common/idGenerator'; -import { dispose, IDisposable, toDisposable, MutableDisposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { IDisposable, toDisposable, MutableDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { isLinux, isWindows } from 'vs/base/common/platform'; import { localize } from 'vs/nls'; import { ICommandAction, IMenu, IMenuActionOptions, MenuItemAction, SubmenuItemAction } from 'vs/platform/actions/common/actions'; @@ -20,7 +20,7 @@ import { INotificationService } from 'vs/platform/notification/common/notificati // The alternative key on all platforms is alt. On windows we also support shift as an alternative key #44136 class AlternativeKeyEmitter extends Emitter { - private _subscriptions: IDisposable[] = []; + private readonly _subscriptions = new DisposableStore(); private _isPressed: boolean; private static instance: AlternativeKeyEmitter; private _suppressAltKeyUp: boolean = false; @@ -28,10 +28,10 @@ class AlternativeKeyEmitter extends Emitter { private constructor(contextMenuService: IContextMenuService) { super(); - this._subscriptions.push(domEvent(document.body, 'keydown')(e => { + this._subscriptions.add(domEvent(document.body, 'keydown')(e => { this.isPressed = e.altKey || ((isWindows || isLinux) && e.shiftKey); })); - this._subscriptions.push(domEvent(document.body, 'keyup')(e => { + this._subscriptions.add(domEvent(document.body, 'keyup')(e => { if (this.isPressed) { if (this._suppressAltKeyUp) { e.preventDefault(); @@ -41,10 +41,10 @@ class AlternativeKeyEmitter extends Emitter { this._suppressAltKeyUp = false; this.isPressed = false; })); - this._subscriptions.push(domEvent(document.body, 'mouseleave')(e => this.isPressed = false)); - this._subscriptions.push(domEvent(document.body, 'blur')(e => this.isPressed = false)); + this._subscriptions.add(domEvent(document.body, 'mouseleave')(e => this.isPressed = false)); + this._subscriptions.add(domEvent(document.body, 'blur')(e => this.isPressed = false)); // Workaround since we do not get any events while a context menu is shown - this._subscriptions.push(contextMenuService.onDidContextMenu(() => this.isPressed = false)); + this._subscriptions.add(contextMenuService.onDidContextMenu(() => this.isPressed = false)); } get isPressed(): boolean { @@ -72,7 +72,7 @@ class AlternativeKeyEmitter extends Emitter { dispose() { super.dispose(); - this._subscriptions = dispose(this._subscriptions); + this._subscriptions.dispose(); } } diff --git a/src/vs/platform/contextkey/browser/contextKeyService.ts b/src/vs/platform/contextkey/browser/contextKeyService.ts index bd7008325ee..7b23bc6e6f5 100644 --- a/src/vs/platform/contextkey/browser/contextKeyService.ts +++ b/src/vs/platform/contextkey/browser/contextKeyService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Emitter, Event, PauseableEmitter } from 'vs/base/common/event'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { keys } from 'vs/base/common/map'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { ConfigurationTarget, IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -323,7 +323,7 @@ export class ContextKeyService extends AbstractContextKeyService implements ICon private _lastContextId: number; private readonly _contexts = new Map(); - private _toDispose: IDisposable[] = []; + private readonly _toDispose = new DisposableStore(); constructor(@IConfigurationService configurationService: IConfigurationService) { super(0); @@ -332,7 +332,7 @@ export class ContextKeyService extends AbstractContextKeyService implements ICon const myContext = new ConfigAwareContextValuesContainer(this._myContextId, configurationService, this._onDidChangeContext); this._contexts.set(this._myContextId, myContext); - this._toDispose.push(myContext); + this._toDispose.add(myContext); // Uncomment this to see the contexts continuously logged // let lastLoggedValue: string | null = null; @@ -348,7 +348,7 @@ export class ContextKeyService extends AbstractContextKeyService implements ICon public dispose(): void { this._isDisposed = true; - this._toDispose = dispose(this._toDispose); + this._toDispose.dispose(); } public getContextValuesContainer(contextId: number): Context { diff --git a/src/vs/platform/contextview/browser/contextMenuHandler.ts b/src/vs/platform/contextview/browser/contextMenuHandler.ts index e5e32109271..8bcf74d2b6e 100644 --- a/src/vs/platform/contextview/browser/contextMenuHandler.ts +++ b/src/vs/platform/contextview/browser/contextMenuHandler.ts @@ -5,7 +5,7 @@ import 'vs/css!./contextMenuHandler'; -import { IDisposable, combinedDisposable } from 'vs/base/common/lifecycle'; +import { combinedDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { ActionRunner, IRunEvent, WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; import { Menu } from 'vs/base/browser/ui/menu/menu'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; @@ -67,7 +67,7 @@ export class ContextMenuHandler { this.block = container.appendChild($('.context-view-block')); } - const menuDisposables: IDisposable[] = []; + const menuDisposables = new DisposableStore(); const actionRunner = delegate.actionRunner || new ActionRunner(); actionRunner.onDidBeforeRun(this.onActionRun, this, menuDisposables); @@ -79,7 +79,7 @@ export class ContextMenuHandler { getKeyBinding: delegate.getKeyBinding ? delegate.getKeyBinding : action => this.keybindingService.lookupKeybinding(action.id) }); - menuDisposables.push(attachMenuStyler(menu, this.themeService)); + menuDisposables.add(attachMenuStyler(menu, this.themeService)); menu.onDidCancel(() => this.contextViewService.hideContextView(true), null, menuDisposables); menu.onDidBlur(() => this.contextViewService.hideContextView(true), null, menuDisposables); @@ -104,7 +104,7 @@ export class ContextMenuHandler { this.contextViewService.hideContextView(true); }, null, menuDisposables); - return combinedDisposable(...menuDisposables, menu); + return combinedDisposable(menuDisposables, menu); }, focus: () => { diff --git a/src/vs/platform/telemetry/browser/errorTelemetry.ts b/src/vs/platform/telemetry/browser/errorTelemetry.ts index 26380fa6ef0..6ecc99a211c 100644 --- a/src/vs/platform/telemetry/browser/errorTelemetry.ts +++ b/src/vs/platform/telemetry/browser/errorTelemetry.ts @@ -20,7 +20,7 @@ export default class ErrorTelemetry extends BaseErrorTelemetry { oldOnError.apply(this, arguments); } }; - this._disposables.push(toDisposable(function () { + this._disposables.add(toDisposable(() => { if (oldOnError) { globals.onerror = oldOnError; } diff --git a/src/vs/platform/telemetry/common/errorTelemetry.ts b/src/vs/platform/telemetry/common/errorTelemetry.ts index 4145ed158c9..d58610ecc67 100644 --- a/src/vs/platform/telemetry/common/errorTelemetry.ts +++ b/src/vs/platform/telemetry/common/errorTelemetry.ts @@ -5,7 +5,7 @@ import { binarySearch } from 'vs/base/common/arrays'; import * as Errors from 'vs/base/common/errors'; -import { dispose, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { safeStringify } from 'vs/base/common/objects'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -49,7 +49,7 @@ export default abstract class BaseErrorTelemetry { private _flushDelay: number; private _flushHandle: any = -1; private _buffer: ErrorEvent[] = []; - protected _disposables: IDisposable[] = []; + protected readonly _disposables = new DisposableStore(); constructor(telemetryService: ITelemetryService, flushDelay = BaseErrorTelemetry.ERROR_FLUSH_TIMEOUT) { this._telemetryService = telemetryService; @@ -57,7 +57,7 @@ export default abstract class BaseErrorTelemetry { // (1) check for unexpected but handled errors const unbind = Errors.errorHandler.addListener((err) => this._onErrorEvent(err)); - this._disposables.push(toDisposable(unbind)); + this._disposables.add(toDisposable(unbind)); // (2) install implementation-specific error listeners this.installErrorListeners(); @@ -66,7 +66,7 @@ export default abstract class BaseErrorTelemetry { dispose() { clearTimeout(this._flushHandle); this._flushBuffer(); - this._disposables = dispose(this._disposables); + this._disposables.dispose(); } protected installErrorListeners(): void { From 306be61f22cb974b78c950ed80851ef23af4edd6 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 2 Jul 2019 17:33:51 -0700 Subject: [PATCH 0942/1449] Fix monaco editor check errors --- src/vs/platform/actions/common/actions.ts | 8 +++++--- src/vs/platform/commands/common/commands.ts | 3 ++- src/vs/platform/keybinding/common/keybindingResolver.ts | 5 +++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/vs/platform/actions/common/actions.ts b/src/vs/platform/actions/common/actions.ts index d4a1359982c..046c46b157f 100644 --- a/src/vs/platform/actions/common/actions.ts +++ b/src/vs/platform/actions/common/actions.ts @@ -157,7 +157,9 @@ export const MenuRegistry: IMenuRegistry = new class implements IMenuRegistry { } getCommands(): ICommandsMap { - return new Map(this._commands.entries()); + const map = new Map(); + this._commands.forEach((value, key) => map.set(key, value)); + return map; } appendMenuItem(id: MenuId, item: IMenuItem | ISubmenuItem): IDisposable { @@ -202,11 +204,11 @@ export const MenuRegistry: IMenuRegistry = new class implements IMenuRegistry { set.add(alt.id); } } - for (const [id, command] of this._commands) { + this._commands.forEach((command, id) => { if (!set.has(id)) { result.push({ command }); } - } + }); } }; diff --git a/src/vs/platform/commands/common/commands.ts b/src/vs/platform/commands/common/commands.ts index 7605efb866d..4777d1ddef7 100644 --- a/src/vs/platform/commands/common/commands.ts +++ b/src/vs/platform/commands/common/commands.ts @@ -9,6 +9,7 @@ import { ServicesAccessor, createDecorator } from 'vs/platform/instantiation/com import { Event, Emitter } from 'vs/base/common/event'; import { LinkedList } from 'vs/base/common/linkedList'; import { IJSONSchema } from 'vs/base/common/jsonSchema'; +import { keys } from 'vs/base/common/map'; export const ICommandService = createDecorator('commandService'); @@ -121,7 +122,7 @@ export const CommandsRegistry: ICommandRegistry = new class implements ICommandR getCommands(): ICommandsMap { const result = new Map(); - for (const key of this._commands.keys()) { + for (const key of keys(this._commands)) { const command = this.getCommand(key); if (command) { result.set(key, command); diff --git a/src/vs/platform/keybinding/common/keybindingResolver.ts b/src/vs/platform/keybinding/common/keybindingResolver.ts index 2b36653666d..1436cfa6604 100644 --- a/src/vs/platform/keybinding/common/keybindingResolver.ts +++ b/src/vs/platform/keybinding/common/keybindingResolver.ts @@ -8,6 +8,7 @@ import { MenuRegistry } from 'vs/platform/actions/common/actions'; import { CommandsRegistry, ICommandHandlerDescription } from 'vs/platform/commands/common/commands'; import { ContextKeyAndExpr, ContextKeyExpr, IContext } from 'vs/platform/contextkey/common/contextkey'; import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKeybindingItem'; +import { keys } from 'vs/base/common/map'; export interface IResolveResult { enterChord: boolean; @@ -334,10 +335,10 @@ export class KeybindingResolver { } unboundCommands.push(id); }; - for (const id of MenuRegistry.getCommands().keys()) { + for (const id of keys(MenuRegistry.getCommands())) { addCommand(id, true); } - for (const id of CommandsRegistry.getCommands().keys()) { + for (const id of keys(CommandsRegistry.getCommands())) { addCommand(id, false); } From 9d01ac89495483a2d4406eb6d83fc0790ff37bf3 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 2 Jul 2019 17:40:25 -0700 Subject: [PATCH 0943/1449] Fix virtual process resize and debounce event --- .../src/singlefolder-tests/terminal.test.ts | 63 ++++++++++++++++++- .../api/browser/mainThreadTerminalService.ts | 3 +- .../api/node/extHostTerminalService.ts | 21 ++++--- .../terminal/browser/terminalInstance.ts | 9 ++- 4 files changed, 84 insertions(+), 12 deletions(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts index b6c6ec8c4f9..b8d10e1ee5d 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { window, commands, Terminal, TerminalDimensionsChangeEvent } from 'vscode'; +import { window, commands, Terminal, TerminalDimensionsChangeEvent, TerminalVirtualProcess, EventEmitter } from 'vscode'; import { doesNotThrow, equal, ok } from 'assert'; suite('window namespace tests', () => { @@ -198,6 +198,67 @@ suite('window namespace tests', () => { done(); }); }); + + suite('Virtual process terminals', () => { + test('should fire onDidOpenTerminal and onDidCloseTerminal', (done) => { + const reg1 = window.onDidOpenTerminal(term => { + equal(term.name, 'c'); + reg1.dispose(); + const reg2 = window.onDidCloseTerminal(() => { + reg2.dispose(); + done(); + }); + term.dispose(); + }); + const virtualProcess: TerminalVirtualProcess = { + write: new EventEmitter().event + }; + window.createTerminal({ name: 'c', virtualProcess }); + }); + + test('should get dimensions event when shown', (done) => { + const reg1 = window.onDidOpenTerminal(term => { + reg1.dispose(); + equal(terminal, term); + term.show(); + }); + const virtualProcess: TerminalVirtualProcess = { + write: new EventEmitter().event, + onDidChangeDimensions: dimensions => { + ok(dimensions.columns > 0); + ok(dimensions.rows > 0); + const reg2 = window.onDidCloseTerminal(() => { + reg2.dispose(); + done(); + }); + terminal.dispose(); + } + }; + const terminal = window.createTerminal({ name: 'foo', virtualProcess }); + }); + + test('should fire Terminal.onData on write', (done) => { + const reg1 = window.onDidOpenTerminal(term => { + equal(terminal, term); + reg1.dispose(); + const reg2 = terminal.onDidWriteData(data => { + equal(data, 'bar'); + reg2.dispose(); + const reg3 = window.onDidCloseTerminal(() => { + reg3.dispose(); + done(); + }); + terminal.dispose(); + }); + writeEmitter.fire('bar'); + }); + const writeEmitter = new EventEmitter(); + const virtualProcess: TerminalVirtualProcess = { + write: writeEmitter.event + }; + const terminal = window.createTerminal({ name: 'foo', virtualProcess }); + }); + }); }); }); diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index a388f623d74..d340fd55ed6 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -264,8 +264,9 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape this._terminalProcessesReady[proxy.terminalId](proxy); delete this._terminalProcessesReady[proxy.terminalId]; + // Note that onReisze is not being listened to here as it needs to fire when max dimensions + // change, excluding the dimension override proxy.onInput(data => this._proxy.$acceptProcessInput(proxy.terminalId, data)); - proxy.onResize(dimensions => this._proxy.$acceptProcessResize(proxy.terminalId, dimensions.cols, dimensions.rows)); proxy.onShutdown(immediate => this._proxy.$acceptProcessShutdown(proxy.terminalId, immediate)); proxy.onRequestCwd(() => this._proxy.$acceptProcessRequestCwd(proxy.terminalId)); proxy.onRequestInitialCwd(() => this._proxy.$acceptProcessRequestInitialCwd(proxy.terminalId)); diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 66b370a505e..0605a48b680 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -433,13 +433,20 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { } public $acceptTerminalMaximumDimensions(id: number, cols: number, rows: number): void { - this._getTerminalByIdEventually(id).then(() => { - // When a terminal's dimensions change, a renderer's _maximum_ dimensions change - const renderer = this._getTerminalRendererById(id); - if (renderer) { - renderer._setMaximumDimensions(cols, rows); - } - }); + if (this._terminalProcesses[id]) { + // Virtual processes only - when virtual process resize fires it means that the + // terminal's maximum dimensions changed + this._terminalProcesses[id].resize(cols, rows); + } else { + // Terminal renderer + this._getTerminalByIdEventually(id).then(() => { + // When a terminal's dimensions change, a renderer's _maximum_ dimensions change + const renderer = this._getTerminalRendererById(id); + if (renderer) { + renderer._setMaximumDimensions(cols, rows); + } + }); + } } public $acceptTerminalRendererInput(id: number, data: string): void { diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index cfe096303a2..9cff1fd187d 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -363,14 +363,17 @@ export class TerminalInstance implements ITerminalInstance { if (this._cols !== newCols || this._rows !== newRows) { this._cols = newCols; this._rows = newRows; - if (this.shellLaunchConfig.isRendererOnly) { - this._onMaximumDimensionsChanged.fire(); - } + this._fireMaximumDimensionsChanged(); } return dimension.width; } + @debounce(50) + private _fireMaximumDimensionsChanged(): void { + this._onMaximumDimensionsChanged.fire(); + } + private _getDimension(width: number, height: number): dom.Dimension | null { // The font needs to have been initialized const font = this._configHelper.getFont(this._xterm); From b3cd0e5b37d763e8ebad13894203447f276c19c8 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 2 Jul 2019 18:09:33 -0700 Subject: [PATCH 0944/1449] Move renderer tests into a suite --- .../src/singlefolder-tests/terminal.test.ts | 102 +++++++++--------- 1 file changed, 52 insertions(+), 50 deletions(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts index b8d10e1ee5d..fe8e70130fa 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts @@ -52,56 +52,6 @@ suite('window namespace tests', () => { const terminal = window.createTerminal('b'); }); - test('createTerminalRenderer should fire onDidOpenTerminal and onDidCloseTerminal', (done) => { - const reg1 = window.onDidOpenTerminal(term => { - equal(term.name, 'c'); - reg1.dispose(); - const reg2 = window.onDidCloseTerminal(() => { - reg2.dispose(); - done(); - }); - term.dispose(); - }); - window.createTerminalRenderer('c'); - }); - - test('terminal renderers should get maximum dimensions set when shown', (done) => { - let terminal: Terminal; - const reg1 = window.onDidOpenTerminal(term => { - reg1.dispose(); - term.show(); - terminal = term; - }); - const renderer = window.createTerminalRenderer('foo'); - const reg2 = renderer.onDidChangeMaximumDimensions(dimensions => { - ok(dimensions.columns > 0); - ok(dimensions.rows > 0); - reg2.dispose(); - const reg3 = window.onDidCloseTerminal(() => { - reg3.dispose(); - done(); - }); - terminal.dispose(); - }); - }); - - test('TerminalRenderer.write should fire Terminal.onData', (done) => { - const reg1 = window.onDidOpenTerminal(terminal => { - reg1.dispose(); - const reg2 = terminal.onDidWriteData(data => { - equal(data, 'bar'); - reg2.dispose(); - const reg3 = window.onDidCloseTerminal(() => { - reg3.dispose(); - done(); - }); - terminal.dispose(); - }); - renderer.write('bar'); - }); - const renderer = window.createTerminalRenderer('foo'); - }); - test('Terminal.sendText should fire Terminal.onInput', (done) => { const reg1 = window.onDidOpenTerminal(terminal => { reg1.dispose(); @@ -199,6 +149,58 @@ suite('window namespace tests', () => { }); }); + suite('Terminal renderers (deprecated)', () => { + test('should fire onDidOpenTerminal and onDidCloseTerminal from createTerminalRenderer terminal', (done) => { + const reg1 = window.onDidOpenTerminal(term => { + equal(term.name, 'c'); + reg1.dispose(); + const reg2 = window.onDidCloseTerminal(() => { + reg2.dispose(); + done(); + }); + term.dispose(); + }); + window.createTerminalRenderer('c'); + }); + + test('should get maximum dimensions set when shown', (done) => { + let terminal: Terminal; + const reg1 = window.onDidOpenTerminal(term => { + reg1.dispose(); + term.show(); + terminal = term; + }); + const renderer = window.createTerminalRenderer('foo'); + const reg2 = renderer.onDidChangeMaximumDimensions(dimensions => { + ok(dimensions.columns > 0); + ok(dimensions.rows > 0); + reg2.dispose(); + const reg3 = window.onDidCloseTerminal(() => { + reg3.dispose(); + done(); + }); + terminal.dispose(); + }); + }); + + test('should fire Terminal.onData on write', (done) => { + const reg1 = window.onDidOpenTerminal(terminal => { + reg1.dispose(); + const reg2 = terminal.onDidWriteData(data => { + equal(data, 'bar'); + reg2.dispose(); + const reg3 = window.onDidCloseTerminal(() => { + reg3.dispose(); + done(); + }); + terminal.dispose(); + }); + renderer.write('bar'); + }); + const renderer = window.createTerminalRenderer('foo'); + }); + }) + suite('Virtual process terminals', () => { test('should fire onDidOpenTerminal and onDidCloseTerminal', (done) => { const reg1 = window.onDidOpenTerminal(term => { From fa74f76e6d44eccf599e236e96ec3e10bf1d7307 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 2 Jul 2019 18:19:32 -0700 Subject: [PATCH 0945/1449] Add dimensions override test --- .../src/singlefolder-tests/terminal.test.ts | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts index eb7d05217e4..e292a29d7ba 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { window, commands, Terminal, TerminalDimensionsChangeEvent, TerminalVirtualProcess, EventEmitter } from 'vscode'; +import { window, commands, Terminal, TerminalDimensionsChangeEvent, TerminalVirtualProcess, EventEmitter, TerminalDimensions } from 'vscode'; import { doesNotThrow, equal, ok } from 'assert'; suite('window namespace tests', () => { @@ -262,6 +262,33 @@ suite('window namespace tests', () => { }; const terminal = window.createTerminal({ name: 'foo', virtualProcess }); }); + + test('should respect dimension overrides', (done) => { + const reg1 = window.onDidOpenTerminal(term => { + equal(terminal, term); + reg1.dispose(); + term.show(); + const reg2 = window.onDidChangeTerminalDimensions(e => { + equal(e.dimensions.columns, 10); + equal(e.dimensions.rows, 5); + equal(e.terminal, terminal) + reg2.dispose(); + const reg3 = window.onDidCloseTerminal(() => { + reg3.dispose(); + done(); + }); + terminal.dispose(); + }); + overrideDimensionsEmitter.fire({ columns: 10, rows: 5 }); + }); + const writeEmitter = new EventEmitter(); + const overrideDimensionsEmitter = new EventEmitter(); + const virtualProcess: TerminalVirtualProcess = { + write: writeEmitter.event, + overrideDimensions: overrideDimensionsEmitter.event + }; + const terminal = window.createTerminal({ name: 'foo', virtualProcess }); + }); }); }); }); From 57cb739976e66fb741bef70fd19f40586870abff Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Tue, 2 Jul 2019 19:52:48 -0700 Subject: [PATCH 0946/1449] Deprecate search.usePCRE2 setting --- src/vs/workbench/contrib/search/browser/search.contribution.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/search/browser/search.contribution.ts b/src/vs/workbench/contrib/search/browser/search.contribution.ts index 197aa870f72..8c46d8864bc 100644 --- a/src/vs/workbench/contrib/search/browser/search.contribution.ts +++ b/src/vs/workbench/contrib/search/browser/search.contribution.ts @@ -741,7 +741,8 @@ configurationRegistry.registerConfiguration({ 'search.usePCRE2': { type: 'boolean', default: false, - description: nls.localize('search.usePCRE2', "Whether to use the PCRE2 regex engine in text search. This enables using some advanced regex features like lookahead and backreferences. However, not all PCRE2 features are supported - only features that are also supported by JavaScript.") + description: nls.localize('search.usePCRE2', "Whether to use the PCRE2 regex engine in text search. This enables using some advanced regex features like lookahead and backreferences. However, not all PCRE2 features are supported - only features that are also supported by JavaScript."), + deprecationMessage: nls.localize('usePCRE2Deprecated', "Deprecated. PCRE2 will be used automatically when using regex features that are only supported by PCRE2."), }, 'search.actionsPosition': { type: 'string', From b0a519d62175a0a293cf4f546f343f5c4d3eafef Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Tue, 2 Jul 2019 19:58:39 -0700 Subject: [PATCH 0947/1449] Search - Map all \u unicode escapes to \x because only that format is supported by both the Rust regex engine and PCRE2 --- .../services/search/node/ripgrepTextSearchEngine.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts b/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts index 449f0f08761..43542561f0e 100644 --- a/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts +++ b/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts @@ -410,10 +410,10 @@ function getRgArgs(query: TextSearchQuery, options: TextSearchOptions): string[] if ((options).usePCRE2) { args.push('--pcre2'); + } - if (query.isRegExp) { - pattern = unicodeEscapesToPCRE2(pattern); - } + if (query.isRegExp) { + pattern = unicodeEscapesToPCRE2(pattern); } // Allow $ to match /r/n From 35aa7b1f5b1c1515a2d05e945a4c446a2e4f757c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 07:02:53 +0200 Subject: [PATCH 0948/1449] distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0555e1090d8..b1a081a321c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "242ad1fe68c7e5b2beea29a20510d3f88c4d8853", + "distro": "f45c7e875e40b31f0d7e0e0a8ff89aee49343949", "author": { "name": "Microsoft Corporation" }, From cbc16932bf77da9b23d58efc6b651336f8ebc2dc Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 3 Jul 2019 08:18:52 +0200 Subject: [PATCH 0949/1449] deps - bump sudo-prompt, iconv-lite --- package.json | 4 ++-- yarn.lock | 23 +++++++++++++++-------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 266e699815d..84ca45029f5 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "graceful-fs": "4.1.11", "http-proxy-agent": "^2.1.0", "https-proxy-agent": "^2.2.1", - "iconv-lite": "0.4.23", + "iconv-lite": "0.5.0", "jschardet": "1.6.0", "keytar": "4.2.1", "minimist": "1.2.0", @@ -45,7 +45,7 @@ "onigasm-umd": "^2.2.2", "semver": "^5.5.0", "spdlog": "^0.9.0", - "sudo-prompt": "8.2.0", + "sudo-prompt": "9.0.0", "v8-inspect-profiler": "^0.0.20", "vscode-chokidar": "1.6.5", "vscode-proxy-agent": "0.4.0", diff --git a/yarn.lock b/yarn.lock index 967f27dee76..bc55225d8d7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4329,10 +4329,10 @@ iconv-lite@0.4.19, iconv-lite@^0.4.19: resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" integrity sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ== -iconv-lite@0.4.23, iconv-lite@^0.4.22, iconv-lite@^0.4.4: - version "0.4.23" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" - integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== +iconv-lite@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.5.0.tgz#59cdde0a2a297cc2aeb0c6445a195ee89f127550" + integrity sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw== dependencies: safer-buffer ">= 2.1.2 < 3" @@ -4343,6 +4343,13 @@ iconv-lite@^0.4.17, iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.4.22, iconv-lite@^0.4.4: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + ieee754@^1.1.11, ieee754@^1.1.4: version "1.1.12" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" @@ -8504,10 +8511,10 @@ strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -sudo-prompt@8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-8.2.0.tgz#bcd4aaacdb367b77b4bffcce1c658c2b1dd327f3" - integrity sha512-n5Nv2lIZaWfVBg10EWC8yaJCB6xV7sEsuaISAVFIS9F4fTRjy/O35A82lkweKuSqQItDlKOGQpTHK9/udQhRRw== +sudo-prompt@9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-9.0.0.tgz#eebedeee9fcd6f661324e6bb46335e3288e8dc8a" + integrity sha512-kUn5fiOk0nhY2oKD9onIkcNCE4Zt85WTsvOfSmqCplmlEvXCcPOmp1npH5YWuf8Bmyy9wLWkIxx+D+8cThBORQ== sumchecker@^2.0.1: version "2.0.2" From 56c9c96d560fdb0edd59debc0c3911640f47847d Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 08:26:38 +0200 Subject: [PATCH 0950/1449] update distro --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 65c63af678c..b07d1a9caaf 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "f45c7e875e40b31f0d7e0e0a8ff89aee49343949", + "distro": "91bd8be4b931ffb4f2c42d4258465739d5939014", "author": { "name": "Microsoft Corporation" }, @@ -156,4 +156,4 @@ "windows-mutex": "0.2.1", "windows-process-tree": "0.2.3" } -} +} \ No newline at end of file From 2320fcbefc9fd195afc37236670066622baf8539 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 08:27:37 +0200 Subject: [PATCH 0951/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b07d1a9caaf..1fae670926f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "91bd8be4b931ffb4f2c42d4258465739d5939014", + "distro": "f9346c9c93b0ce1ad89b51de7d1aa282a24b3c51", "author": { "name": "Microsoft Corporation" }, From b9e80bd178a6f4f73c2c8b874d740095085f2600 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 08:32:13 +0200 Subject: [PATCH 0952/1449] test yarn cache --- .../linux/product-build-linux.yml | 137 ++++++++------- build/azure-pipelines/product-build.yml | 164 +++++++++--------- 2 files changed, 150 insertions(+), 151 deletions(-) diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 33bb6520baf..7b65718659c 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -38,7 +38,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: '**/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '**/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !**/node_modules/**/.yarnrc, !**/.*/**/.yarnrc' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' @@ -50,84 +50,83 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: '**/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '**/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !**/node_modules/**/.yarnrc, !**/.*/**/.yarnrc' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' - condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) -- script: | - set -e - yarn gulp mixin - displayName: Mix in quality +# - script: | +# set -e +# yarn gulp mixin +# displayName: Mix in quality -- script: | - set -e - yarn gulp hygiene - yarn monaco-compile-check - displayName: Run hygiene checks - condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) +# - script: | +# set -e +# yarn gulp hygiene +# yarn monaco-compile-check +# displayName: Run hygiene checks +# condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) -- script: | - set -e - node build/azure-pipelines/common/installDistroDependencies.js - node build/azure-pipelines/common/installDistroDependencies.js remote - node build/lib/builtInExtensions.js - displayName: Install distro dependencies and extensions +# - script: | +# set -e +# node build/azure-pipelines/common/installDistroDependencies.js +# node build/azure-pipelines/common/installDistroDependencies.js remote +# node build/lib/builtInExtensions.js +# displayName: Install distro dependencies and extensions -- script: | - set -e - cd $BUILD_STAGINGDIRECTORY - git clone https://github.com/microsoft/vscode-telemetry-extractor.git - cd vscode-telemetry-extractor - git checkout 3b04aba5bfdfcca1a5426cd2c51a90d18740d0bc - npm i - npm run setup-extension-repos - node ./out/cli-extract.js --sourceDir $BUILD_SOURCESDIRECTORY --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents - node ./out/cli-extract-extensions.js --sourceDir ./src/telemetry-sources --outputDir . --applyEndpoints --includeIsMeasurement - mkdir -p $BUILD_SOURCESDIRECTORY/.build/telemetry - mv declarations-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-core.json - mv declarations-extensions-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-extensions.json - displayName: Extract Telemetry +# - script: | +# set -e +# cd $BUILD_STAGINGDIRECTORY +# git clone https://github.com/microsoft/vscode-telemetry-extractor.git +# cd vscode-telemetry-extractor +# git checkout 3b04aba5bfdfcca1a5426cd2c51a90d18740d0bc +# npm i +# npm run setup-extension-repos +# node ./out/cli-extract.js --sourceDir $BUILD_SOURCESDIRECTORY --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents +# node ./out/cli-extract-extensions.js --sourceDir ./src/telemetry-sources --outputDir . --applyEndpoints --includeIsMeasurement +# mkdir -p $BUILD_SOURCESDIRECTORY/.build/telemetry +# mv declarations-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-core.json +# mv declarations-extensions-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-extensions.json +# displayName: Extract Telemetry -- script: | - set -e - yarn gulp compile-build - yarn gulp compile-extensions-build - VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-linux-$VSCODE_ARCH-min-ci - VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-reh-linux-$VSCODE_ARCH-min-ci - VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-web-linux-$VSCODE_ARCH-min-ci - displayName: Build +# - script: | +# set -e +# yarn gulp compile-build +# yarn gulp compile-extensions-build +# VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ +# yarn gulp vscode-linux-$VSCODE_ARCH-min-ci +# VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ +# yarn gulp vscode-reh-linux-$VSCODE_ARCH-min-ci +# VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ +# yarn gulp vscode-web-linux-$VSCODE_ARCH-min-ci +# displayName: Build -- script: | - set -e - yarn gulp "electron-$(VSCODE_ARCH)" +# - script: | +# set -e +# yarn gulp "electron-$(VSCODE_ARCH)" - # xvfb seems to be crashing often, let's make sure it's always up - service xvfb start +# # xvfb seems to be crashing often, let's make sure it's always up +# service xvfb start - DISPLAY=:10 ./scripts/test.sh --build --tfs "Unit Tests" - # yarn smoketest -- --build "$(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH)" - displayName: Run unit tests - condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) +# DISPLAY=:10 ./scripts/test.sh --build --tfs "Unit Tests" +# # yarn smoketest -- --build "$(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH)" +# displayName: Run unit tests +# condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) -- script: | - set -e - AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ - AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ - VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ - ./build/azure-pipelines/linux/publish.sh - displayName: Publish +# - script: | +# set -e +# AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ +# AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ +# VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ +# VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ +# ./build/azure-pipelines/linux/publish.sh +# displayName: Publish -- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 - displayName: 'Component Detection' - continueOnError: true +# - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 +# displayName: 'Component Detection' +# continueOnError: true -- task: PublishPipelineArtifact@0 - displayName: 'Publish Pipeline Artifact' - inputs: - artifactName: snap-$(VSCODE_ARCH) - targetPath: .build/linux/snap-tarball +# - task: PublishPipelineArtifact@0 +# displayName: 'Publish Pipeline Artifact' +# inputs: +# artifactName: snap-$(VSCODE_ARCH) +# targetPath: .build/linux/snap-tarball diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 77f9e5b4781..2e0df5ef552 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -13,25 +13,25 @@ jobs: # steps: # - template: compile.yml -- job: Windows - condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32'], 'true')) - timeoutInMinutes: 120 - pool: - vmImage: VS2017-Win2016 - variables: - VSCODE_ARCH: x64 - steps: - - template: win32/product-build-win32.yml +# - job: Windows +# condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32'], 'true')) +# timeoutInMinutes: 120 +# pool: +# vmImage: VS2017-Win2016 +# variables: +# VSCODE_ARCH: x64 +# steps: +# - template: win32/product-build-win32.yml -- job: Windows32 - condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true')) - timeoutInMinutes: 120 - pool: - vmImage: VS2017-Win2016 - variables: - VSCODE_ARCH: ia32 - steps: - - template: win32/product-build-win32.yml +# - job: Windows32 +# condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true')) +# timeoutInMinutes: 120 +# pool: +# vmImage: VS2017-Win2016 +# variables: +# VSCODE_ARCH: ia32 +# steps: +# - template: win32/product-build-win32.yml - job: Linux condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) @@ -44,75 +44,75 @@ jobs: steps: - template: linux/product-build-linux.yml -- job: LinuxSnap - condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) - timeoutInMinutes: 120 - pool: - vmImage: 'Ubuntu-16.04' - variables: - VSCODE_ARCH: x64 - container: snapcraft - dependsOn: Linux - steps: - - template: linux/snap-build-linux.yml +# - job: LinuxSnap +# condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) +# timeoutInMinutes: 120 +# pool: +# vmImage: 'Ubuntu-16.04' +# variables: +# VSCODE_ARCH: x64 +# container: snapcraft +# dependsOn: Linux +# steps: +# - template: linux/snap-build-linux.yml -- job: LinuxArmhf - condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) - timeoutInMinutes: 120 - pool: - vmImage: 'Ubuntu-16.04' - variables: - VSCODE_ARCH: armhf - steps: - - template: linux/product-build-linux-arm.yml +# - job: LinuxArmhf +# condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) +# timeoutInMinutes: 120 +# pool: +# vmImage: 'Ubuntu-16.04' +# variables: +# VSCODE_ARCH: armhf +# steps: +# - template: linux/product-build-linux-arm.yml -- job: LinuxAlpine - condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) - timeoutInMinutes: 120 - pool: - vmImage: 'Ubuntu-16.04' - variables: - VSCODE_ARCH: alpine - steps: - - template: linux/product-build-linux-alpine.yml +# - job: LinuxAlpine +# condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) +# timeoutInMinutes: 120 +# pool: +# vmImage: 'Ubuntu-16.04' +# variables: +# VSCODE_ARCH: alpine +# steps: +# - template: linux/product-build-linux-alpine.yml -- job: macOS - condition: and(succeeded(), eq(variables['VSCODE_BUILD_MACOS'], 'true')) - timeoutInMinutes: 120 - pool: - vmImage: macOS 10.13 - steps: - - template: darwin/product-build-darwin.yml +# - job: macOS +# condition: and(succeeded(), eq(variables['VSCODE_BUILD_MACOS'], 'true')) +# timeoutInMinutes: 120 +# pool: +# vmImage: macOS 10.13 +# steps: +# - template: darwin/product-build-darwin.yml -- job: Release - condition: and(succeeded(), or(eq(variables['VSCODE_RELEASE'], 'true'), and(or(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['VSCODE_QUALITY'], 'exploration')), eq(variables['Build.Reason'], 'Schedule')))) - pool: - vmImage: 'Ubuntu-16.04' - dependsOn: - - Windows - - Windows32 - - Linux - - LinuxSnap - - LinuxArmhf - - LinuxAlpine - - macOS - steps: - - template: release.yml +# - job: Release +# condition: and(succeeded(), or(eq(variables['VSCODE_RELEASE'], 'true'), and(or(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['VSCODE_QUALITY'], 'exploration')), eq(variables['Build.Reason'], 'Schedule')))) +# pool: +# vmImage: 'Ubuntu-16.04' +# dependsOn: +# - Windows +# - Windows32 +# - Linux +# - LinuxSnap +# - LinuxArmhf +# - LinuxAlpine +# - macOS +# steps: +# - template: release.yml -- job: Mooncake - pool: - vmImage: 'Ubuntu-16.04' - condition: true - dependsOn: - - Windows - - Windows32 - - Linux - - LinuxSnap - - LinuxArmhf - - LinuxAlpine - - macOS - steps: - - template: sync-mooncake.yml +# - job: Mooncake +# pool: +# vmImage: 'Ubuntu-16.04' +# condition: true +# dependsOn: +# - Windows +# - Windows32 +# - Linux +# - LinuxSnap +# - LinuxArmhf +# - LinuxAlpine +# - macOS +# steps: +# - template: sync-mooncake.yml schedules: - cron: "0 6 * * Mon-Fri" From 89b68c9cd60f6a17935ca214a9bb3d0da0cbb448 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 08:51:53 +0200 Subject: [PATCH 0953/1449] test yarn cache task --- build/azure-pipelines/linux/product-build-linux.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 7b65718659c..68f67f0881f 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -38,7 +38,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: '**/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !**/node_modules/**/.yarnrc, !**/.*/**/.yarnrc' + keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' @@ -50,7 +50,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: '**/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !**/node_modules/**/.yarnrc, !**/.*/**/.yarnrc' + keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' From 8e47e98e0884a710791170cc1507ef44b6692c9b Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 3 Jul 2019 08:59:29 +0200 Subject: [PATCH 0954/1449] build - disable schedule for now --- build/azure-pipelines/product-build.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 77f9e5b4781..3b4b01bc96e 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -114,9 +114,9 @@ jobs: steps: - template: sync-mooncake.yml -schedules: -- cron: "0 6 * * Mon-Fri" - displayName: Mon-Fri at 6:00 - branches: - include: - - master \ No newline at end of file +# schedules: +# - cron: "0 6 * * Mon-Fri" +# displayName: Mon-Fri at 6:00 +# branches: +# include: +# - master \ No newline at end of file From 76e01dc02bfa8cf70932ef3cbf3d8ce80f995f7c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 09:07:22 +0200 Subject: [PATCH 0955/1449] more yarn cache --- build/azure-pipelines/linux/product-build-linux.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 68f67f0881f..f3ac9a91713 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -38,7 +38,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' @@ -50,7 +50,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' From b462757eb61c4d969224e975af00fd3827e3b789 Mon Sep 17 00:00:00 2001 From: Xhulio Hasani Date: Wed, 3 Jul 2019 03:12:32 -0400 Subject: [PATCH 0956/1449] HEAD label appears on tab (#76329) --- extensions/git/src/commands.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 85ec8ce866a..1b5ea0447cf 100755 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -738,6 +738,8 @@ export class CommandCenter { } const HEAD = await this.getLeftResource(resource); + const basename = path.basename(resource.resourceUri.fsPath); + const title = `${basename} (HEAD)`; if (!HEAD) { window.showWarningMessage(localize('HEAD not available', "HEAD version of '{0}' is not available.", path.basename(resource.resourceUri.fsPath))); @@ -748,7 +750,7 @@ export class CommandCenter { preview }; - return await commands.executeCommand('vscode.open', HEAD, opts); + return await commands.executeCommand('vscode.open', HEAD, opts, title); } @command('git.openChange') From b378c5cc8c9d88d2c1728fae8debe0e4919c7c5b Mon Sep 17 00:00:00 2001 From: sharkykh Date: Wed, 3 Jul 2019 10:15:07 +0300 Subject: [PATCH 0957/1449] Put current git branch name as value when renaming (#72957) * Put current git branch name as value when renaming * Simplify code --- extensions/git/src/commands.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 1b5ea0447cf..8b4a0923532 100755 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -1572,8 +1572,11 @@ export class CommandCenter { @command('git.renameBranch', { repository: true }) async renameBranch(repository: Repository): Promise { - const placeHolder = localize('provide branch name', "Please provide a branch name"); - const name = await window.showInputBox({ placeHolder }); + const name = await window.showInputBox({ + placeHolder: localize('branch name', "Branch name"), + prompt: localize('provide branch name', "Please provide a branch name"), + value: repository.HEAD && repository.HEAD.name + }); if (!name || name.trim().length === 0) { return; From 638d39969ac262bf3c8ccca9efa693069bd644bf Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 3 Jul 2019 09:53:03 +0200 Subject: [PATCH 0958/1449] debt - use service worker headers --- package.json | 2 +- .../resources/browser/resourceServiceWorkerClient.ts | 8 ++++---- .../resources/browser/resourceServiceWorkerMain.ts | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 1fae670926f..343fe871f13 100644 --- a/package.json +++ b/package.json @@ -156,4 +156,4 @@ "windows-mutex": "0.2.1", "windows-process-tree": "0.2.3" } -} \ No newline at end of file +} diff --git a/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerClient.ts b/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerClient.ts index 592b17e9a8a..5cbcf68b1be 100644 --- a/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerClient.ts +++ b/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerClient.ts @@ -86,7 +86,7 @@ class ResourcesMutationObserver { } private async _rewriteUrls(textContent: string): Promise { - return textContent.replace(this._regexp, function (_m, quote, url) { + return textContent.replace(this._regexp, function (_m, quote = '', url) { return `url(${quote}${location.href}vscode-resources/fetch?${encodeURIComponent(url)}${quote})`; }); } @@ -108,9 +108,9 @@ class ResourceServiceWorker { } private _initServiceWorker(): void { - const url = './resourceServiceWorkerMain.js'; - navigator.serviceWorker.register(url).then(() => { - // console.log('registered'); + const url = require.toUrl('./resourceServiceWorkerMain.js'); + navigator.serviceWorker.register(url, { scope: '/' }).then(reg => { + console.log('registered', reg); return navigator.serviceWorker.ready; }).then(() => { // console.log('ready'); diff --git a/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts b/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts index d2c9220fad5..7002131ba5d 100644 --- a/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts +++ b/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts @@ -11,7 +11,7 @@ const handlerPromise = new Promise((resolve, reject) => { // load loader - const baseUrl = './out/'; + const baseUrl = '../../../../../'; importScripts(baseUrl + 'vs/loader.js'); require.config({ baseUrl, From a67b138d51c18e9bbeefbd2356c54eb5e37e385d Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 09:57:07 +0200 Subject: [PATCH 0959/1449] use es6 maps in mainThreadSCM related to #76442 --- src/vs/workbench/api/browser/mainThreadSCM.ts | 46 +++++++++---------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadSCM.ts b/src/vs/workbench/api/browser/mainThreadSCM.ts index 5dfdc620625..b0a25696935 100644 --- a/src/vs/workbench/api/browser/mainThreadSCM.ts +++ b/src/vs/workbench/api/browser/mainThreadSCM.ts @@ -266,8 +266,8 @@ class MainThreadSCMProvider implements ISCMProvider { export class MainThreadSCM implements MainThreadSCMShape { private readonly _proxy: ExtHostSCMShape; - private _repositories: { [handle: number]: ISCMRepository; } = Object.create(null); - private _inputDisposables: { [handle: number]: IDisposable; } = Object.create(null); + private _repositories = new Map(); + private _inputDisposables = new Map(); private readonly _disposables = new DisposableStore(); constructor( @@ -281,13 +281,11 @@ export class MainThreadSCM implements MainThreadSCMShape { } dispose(): void { - Object.keys(this._repositories) - .forEach(id => this._repositories[id].dispose()); - this._repositories = Object.create(null); + this._repositories.forEach(r => r.dispose()); + this._repositories.clear(); - Object.keys(this._inputDisposables) - .forEach(id => this._inputDisposables[id].dispose()); - this._inputDisposables = Object.create(null); + this._inputDisposables.forEach(d => d.dispose()); + this._inputDisposables.clear(); this._disposables.dispose(); } @@ -295,14 +293,14 @@ export class MainThreadSCM implements MainThreadSCMShape { $registerSourceControl(handle: number, id: string, label: string, rootUri: UriComponents | undefined): void { const provider = new MainThreadSCMProvider(this._proxy, handle, id, label, rootUri && URI.revive(rootUri), this.scmService); const repository = this.scmService.registerSCMProvider(provider); - this._repositories[handle] = repository; + this._repositories.set(handle, repository); const inputDisposable = repository.input.onDidChange(value => this._proxy.$onInputBoxValueChange(handle, value)); - this._inputDisposables[handle] = inputDisposable; + this._inputDisposables.set(handle, inputDisposable); } $updateSourceControl(handle: number, features: SCMProviderFeatures): void { - const repository = this._repositories[handle]; + const repository = this._repositories.get(handle); if (!repository) { return; @@ -313,21 +311,21 @@ export class MainThreadSCM implements MainThreadSCMShape { } $unregisterSourceControl(handle: number): void { - const repository = this._repositories[handle]; + const repository = this._repositories.get(handle); if (!repository) { return; } - this._inputDisposables[handle].dispose(); - delete this._inputDisposables[handle]; + this._inputDisposables.get(handle)!.dispose(); + this._inputDisposables.delete(handle); repository.dispose(); - delete this._repositories[handle]; + this._repositories.delete(handle); } $registerGroup(sourceControlHandle: number, groupHandle: number, id: string, label: string): void { - const repository = this._repositories[sourceControlHandle]; + const repository = this._repositories.get(sourceControlHandle); if (!repository) { return; @@ -338,7 +336,7 @@ export class MainThreadSCM implements MainThreadSCMShape { } $updateGroup(sourceControlHandle: number, groupHandle: number, features: SCMGroupFeatures): void { - const repository = this._repositories[sourceControlHandle]; + const repository = this._repositories.get(sourceControlHandle); if (!repository) { return; @@ -349,7 +347,7 @@ export class MainThreadSCM implements MainThreadSCMShape { } $updateGroupLabel(sourceControlHandle: number, groupHandle: number, label: string): void { - const repository = this._repositories[sourceControlHandle]; + const repository = this._repositories.get(sourceControlHandle); if (!repository) { return; @@ -360,7 +358,7 @@ export class MainThreadSCM implements MainThreadSCMShape { } $spliceResourceStates(sourceControlHandle: number, splices: SCMRawResourceSplices[]): void { - const repository = this._repositories[sourceControlHandle]; + const repository = this._repositories.get(sourceControlHandle); if (!repository) { return; @@ -371,7 +369,7 @@ export class MainThreadSCM implements MainThreadSCMShape { } $unregisterGroup(sourceControlHandle: number, handle: number): void { - const repository = this._repositories[sourceControlHandle]; + const repository = this._repositories.get(sourceControlHandle); if (!repository) { return; @@ -382,7 +380,7 @@ export class MainThreadSCM implements MainThreadSCMShape { } $setInputBoxValue(sourceControlHandle: number, value: string): void { - const repository = this._repositories[sourceControlHandle]; + const repository = this._repositories.get(sourceControlHandle); if (!repository) { return; @@ -392,7 +390,7 @@ export class MainThreadSCM implements MainThreadSCMShape { } $setInputBoxPlaceholder(sourceControlHandle: number, placeholder: string): void { - const repository = this._repositories[sourceControlHandle]; + const repository = this._repositories.get(sourceControlHandle); if (!repository) { return; @@ -402,7 +400,7 @@ export class MainThreadSCM implements MainThreadSCMShape { } $setInputBoxVisibility(sourceControlHandle: number, visible: boolean): void { - const repository = this._repositories[sourceControlHandle]; + const repository = this._repositories.get(sourceControlHandle); if (!repository) { return; @@ -412,7 +410,7 @@ export class MainThreadSCM implements MainThreadSCMShape { } $setValidationProviderIsEnabled(sourceControlHandle: number, enabled: boolean): void { - const repository = this._repositories[sourceControlHandle]; + const repository = this._repositories.get(sourceControlHandle); if (!repository) { return; From 9e818acf0a89ef61580c2ae4f4470df80353f8ce Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 3 Jul 2019 10:21:57 +0200 Subject: [PATCH 0960/1449] remove console.log --- .../contrib/resources/browser/resourceServiceWorkerClient.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerClient.ts b/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerClient.ts index 5cbcf68b1be..bed5775bf1e 100644 --- a/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerClient.ts +++ b/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerClient.ts @@ -110,7 +110,7 @@ class ResourceServiceWorker { private _initServiceWorker(): void { const url = require.toUrl('./resourceServiceWorkerMain.js'); navigator.serviceWorker.register(url, { scope: '/' }).then(reg => { - console.log('registered', reg); + // console.log('registered', reg); return navigator.serviceWorker.ready; }).then(() => { // console.log('ready'); From 33c187558e666d9ca231800723b87823e52dcfe2 Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Wed, 3 Jul 2019 10:29:54 +0200 Subject: [PATCH 0961/1449] move externalTerminalService from electron-browser to node; fixes #76174 --- .../workbench/contrib/debug/node/terminals.ts | 2 +- .../externalTerminal.contribution.ts | 56 --------- .../electron-browser/externalTerminal.ts | 47 -------- .../TerminalHelper.scpt | Bin .../externalTerminalService.ts | 107 +++++++++++++++++- .../iTermHelper.scpt | Bin .../externalTerminalService.test.ts | 3 +- src/vs/workbench/workbench.main.ts | 3 +- 8 files changed, 105 insertions(+), 113 deletions(-) rename src/vs/workbench/contrib/externalTerminal/{electron-browser => browser}/externalTerminal.contribution.ts (64%) delete mode 100644 src/vs/workbench/contrib/externalTerminal/electron-browser/externalTerminal.ts rename src/vs/workbench/contrib/externalTerminal/{electron-browser => node}/TerminalHelper.scpt (100%) rename src/vs/workbench/contrib/externalTerminal/{electron-browser => node}/externalTerminalService.ts (71%) rename src/vs/workbench/contrib/externalTerminal/{electron-browser => node}/iTermHelper.scpt (100%) diff --git a/src/vs/workbench/contrib/debug/node/terminals.ts b/src/vs/workbench/contrib/debug/node/terminals.ts index 164dd27a15a..da3bfa8e8ab 100644 --- a/src/vs/workbench/contrib/debug/node/terminals.ts +++ b/src/vs/workbench/contrib/debug/node/terminals.ts @@ -133,7 +133,7 @@ class MacTerminalService extends TerminalLauncher { // and then launches the program inside that window. const script = terminalApp === MacTerminalService.DEFAULT_TERMINAL_OSX ? 'TerminalHelper' : 'iTermHelper'; - const scriptpath = getPathFromAmdModule(require, `vs/workbench/contrib/externalTerminal/electron-browser/${script}.scpt`); + const scriptpath = getPathFromAmdModule(require, `vs/workbench/contrib/externalTerminal/node/${script}.scpt`); const osaArgs = [ scriptpath, diff --git a/src/vs/workbench/contrib/externalTerminal/electron-browser/externalTerminal.contribution.ts b/src/vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution.ts similarity index 64% rename from src/vs/workbench/contrib/externalTerminal/electron-browser/externalTerminal.contribution.ts rename to src/vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution.ts index 4facc9d8566..308f43bf60f 100644 --- a/src/vs/workbench/contrib/externalTerminal/electron-browser/externalTerminal.contribution.ts +++ b/src/vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution.ts @@ -4,19 +4,13 @@ *--------------------------------------------------------------------------------------------*/ import * as nls from 'vs/nls'; -import * as env from 'vs/base/common/platform'; -import { Registry } from 'vs/platform/registry/common/platform'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import * as paths from 'vs/base/common/path'; import { URI as uri } from 'vs/base/common/uri'; import { IExternalTerminalConfiguration, IExternalTerminalService } from 'vs/workbench/contrib/externalTerminal/common/externalTerminal'; import { MenuId, MenuRegistry } from 'vs/platform/actions/common/actions'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; -import { Extensions, IConfigurationRegistry, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { ITerminalService as IIntegratedTerminalService, KEYBINDING_CONTEXT_TERMINAL_NOT_FOCUSED } from 'vs/workbench/contrib/terminal/common/terminal'; -import { getDefaultTerminalWindows, getDefaultTerminalLinuxReady, DEFAULT_TERMINAL_OSX } from 'vs/workbench/contrib/externalTerminal/electron-browser/externalTerminal'; -import { WindowsExternalTerminalService, MacExternalTerminalService, LinuxExternalTerminalService } from 'vs/workbench/contrib/externalTerminal/electron-browser/externalTerminalService'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { ResourceContextKey } from 'vs/workbench/common/resources'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; @@ -28,56 +22,6 @@ import { Schemas } from 'vs/base/common/network'; import { distinct } from 'vs/base/common/arrays'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -if (env.isWindows) { - registerSingleton(IExternalTerminalService, WindowsExternalTerminalService, true); -} else if (env.isMacintosh) { - registerSingleton(IExternalTerminalService, MacExternalTerminalService, true); -} else if (env.isLinux) { - registerSingleton(IExternalTerminalService, LinuxExternalTerminalService, true); -} - -getDefaultTerminalLinuxReady().then(defaultTerminalLinux => { - let configurationRegistry = Registry.as(Extensions.Configuration); - configurationRegistry.registerConfiguration({ - id: 'externalTerminal', - order: 100, - title: nls.localize('terminalConfigurationTitle', "External Terminal"), - type: 'object', - properties: { - 'terminal.explorerKind': { - type: 'string', - enum: [ - 'integrated', - 'external' - ], - enumDescriptions: [ - nls.localize('terminal.explorerKind.integrated', "Use VS Code's integrated terminal."), - nls.localize('terminal.explorerKind.external', "Use the configured external terminal.") - ], - description: nls.localize('explorer.openInTerminalKind', "Customizes what kind of terminal to launch."), - default: 'integrated' - }, - 'terminal.external.windowsExec': { - type: 'string', - description: nls.localize('terminal.external.windowsExec', "Customizes which terminal to run on Windows."), - default: getDefaultTerminalWindows(), - scope: ConfigurationScope.APPLICATION - }, - 'terminal.external.osxExec': { - type: 'string', - description: nls.localize('terminal.external.osxExec', "Customizes which terminal application to run on macOS."), - default: DEFAULT_TERMINAL_OSX, - scope: ConfigurationScope.APPLICATION - }, - 'terminal.external.linuxExec': { - type: 'string', - description: nls.localize('terminal.external.linuxExec', "Customizes which terminal to run on Linux."), - default: defaultTerminalLinux, - scope: ConfigurationScope.APPLICATION - } - } - }); -}); const OPEN_IN_TERMINAL_COMMAND_ID = 'openInTerminal'; CommandsRegistry.registerCommand({ diff --git a/src/vs/workbench/contrib/externalTerminal/electron-browser/externalTerminal.ts b/src/vs/workbench/contrib/externalTerminal/electron-browser/externalTerminal.ts deleted file mode 100644 index ccbfeed874f..00000000000 --- a/src/vs/workbench/contrib/externalTerminal/electron-browser/externalTerminal.ts +++ /dev/null @@ -1,47 +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 env from 'vs/base/common/platform'; -import * as pfs from 'vs/base/node/pfs'; - -let _DEFAULT_TERMINAL_LINUX_READY: Promise | null = null; -export function getDefaultTerminalLinuxReady(): Promise { - if (!_DEFAULT_TERMINAL_LINUX_READY) { - _DEFAULT_TERMINAL_LINUX_READY = new Promise(c => { - if (env.isLinux) { - Promise.all([pfs.exists('/etc/debian_version'), process.lazyEnv || Promise.resolve(undefined)]).then(([isDebian]) => { - if (isDebian) { - c('x-terminal-emulator'); - } else if (process.env.DESKTOP_SESSION === 'gnome' || process.env.DESKTOP_SESSION === 'gnome-classic') { - c('gnome-terminal'); - } else if (process.env.DESKTOP_SESSION === 'kde-plasma') { - c('konsole'); - } else if (process.env.COLORTERM) { - c(process.env.COLORTERM); - } else if (process.env.TERM) { - c(process.env.TERM); - } else { - c('xterm'); - } - }); - return; - } - - c('xterm'); - }); - } - return _DEFAULT_TERMINAL_LINUX_READY; -} - -export const DEFAULT_TERMINAL_OSX = 'Terminal.app'; - -let _DEFAULT_TERMINAL_WINDOWS: string | null = null; -export function getDefaultTerminalWindows(): string { - if (!_DEFAULT_TERMINAL_WINDOWS) { - const isWoW64 = !!process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432'); - _DEFAULT_TERMINAL_WINDOWS = `${process.env.windir ? process.env.windir : 'C:\\Windows'}\\${isWoW64 ? 'Sysnative' : 'System32'}\\cmd.exe`; - } - return _DEFAULT_TERMINAL_WINDOWS; -} diff --git a/src/vs/workbench/contrib/externalTerminal/electron-browser/TerminalHelper.scpt b/src/vs/workbench/contrib/externalTerminal/node/TerminalHelper.scpt similarity index 100% rename from src/vs/workbench/contrib/externalTerminal/electron-browser/TerminalHelper.scpt rename to src/vs/workbench/contrib/externalTerminal/node/TerminalHelper.scpt diff --git a/src/vs/workbench/contrib/externalTerminal/electron-browser/externalTerminalService.ts b/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts similarity index 71% rename from src/vs/workbench/contrib/externalTerminal/electron-browser/externalTerminalService.ts rename to src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts index d502513259e..64bd1ddda5e 100644 --- a/src/vs/workbench/contrib/externalTerminal/electron-browser/externalTerminalService.ts +++ b/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts @@ -7,15 +7,21 @@ import * as cp from 'child_process'; import * as path from 'vs/base/common/path'; import * as processes from 'vs/base/node/processes'; import * as nls from 'vs/nls'; +import * as pfs from 'vs/base/node/pfs'; +import * as env from 'vs/base/common/platform'; import { assign } from 'vs/base/common/objects'; import { IExternalTerminalService, IExternalTerminalConfiguration } from 'vs/workbench/contrib/externalTerminal/common/externalTerminal'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { getDefaultTerminalWindows, getDefaultTerminalLinuxReady, DEFAULT_TERMINAL_OSX } from 'vs/workbench/contrib/externalTerminal/electron-browser/externalTerminal'; -import { IProcessEnvironment } from 'vs/base/common/platform'; import { getPathFromAmdModule } from 'vs/base/common/amd'; +import { IConfigurationRegistry, Extensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { Registry } from 'vs/platform/registry/common/platform'; + +export const DEFAULT_TERMINAL_OSX = 'Terminal.app'; const TERMINAL_TITLE = nls.localize('console.title', "VS Code Console"); + enum WinSpawnType { CMD, CMDER @@ -37,7 +43,7 @@ export class WindowsExternalTerminalService implements IExternalTerminalService this.spawnTerminal(cp, configuration, processes.getWindowsShell(), cwd); } - public runInTerminal(title: string, dir: string, args: string[], envVars: IProcessEnvironment): Promise { + public runInTerminal(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment): Promise { const configuration = this._configurationService.getValue(); const terminalConfig = configuration.terminal.external; @@ -128,7 +134,7 @@ export class MacExternalTerminalService implements IExternalTerminalService { this.spawnTerminal(cp, configuration, cwd); } - public runInTerminal(title: string, dir: string, args: string[], envVars: IProcessEnvironment): Promise { + public runInTerminal(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment): Promise { const configuration = this._configurationService.getValue(); const terminalConfig = configuration.terminal.external; @@ -142,7 +148,7 @@ export class MacExternalTerminalService implements IExternalTerminalService { // and then launches the program inside that window. const script = terminalApp === DEFAULT_TERMINAL_OSX ? 'TerminalHelper' : 'iTermHelper'; - const scriptpath = getPathFromAmdModule(require, `vs/workbench/contrib/externalTerminal/electron-browser/${script}.scpt`); + const scriptpath = getPathFromAmdModule(require, `vs/workbench/contrib/externalTerminal/node/${script}.scpt`); const osaArgs = [ scriptpath, @@ -224,7 +230,7 @@ export class LinuxExternalTerminalService implements IExternalTerminalService { this.spawnTerminal(cp, configuration, cwd); } - public runInTerminal(title: string, dir: string, args: string[], envVars: IProcessEnvironment): Promise { + public runInTerminal(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment): Promise { const configuration = this._configurationService.getValue(); const terminalConfig = configuration.terminal.external; @@ -310,3 +316,92 @@ function quote(args: string[]): string { } return r; } + +let _DEFAULT_TERMINAL_WINDOWS: string | null = null; +export function getDefaultTerminalWindows(): string { + if (!_DEFAULT_TERMINAL_WINDOWS) { + const isWoW64 = !!process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432'); + _DEFAULT_TERMINAL_WINDOWS = `${process.env.windir ? process.env.windir : 'C:\\Windows'}\\${isWoW64 ? 'Sysnative' : 'System32'}\\cmd.exe`; + } + return _DEFAULT_TERMINAL_WINDOWS; +} + +let _DEFAULT_TERMINAL_LINUX_READY: Promise | null = null; +export function getDefaultTerminalLinuxReady(): Promise { + if (!_DEFAULT_TERMINAL_LINUX_READY) { + _DEFAULT_TERMINAL_LINUX_READY = new Promise(c => { + if (env.isLinux) { + Promise.all([pfs.exists('/etc/debian_version'), process.lazyEnv || Promise.resolve(undefined)]).then(([isDebian]) => { + if (isDebian) { + c('x-terminal-emulator'); + } else if (process.env.DESKTOP_SESSION === 'gnome' || process.env.DESKTOP_SESSION === 'gnome-classic') { + c('gnome-terminal'); + } else if (process.env.DESKTOP_SESSION === 'kde-plasma') { + c('konsole'); + } else if (process.env.COLORTERM) { + c(process.env.COLORTERM); + } else if (process.env.TERM) { + c(process.env.TERM); + } else { + c('xterm'); + } + }); + return; + } + + c('xterm'); + }); + } + return _DEFAULT_TERMINAL_LINUX_READY; +} + +if (env.isWindows) { + registerSingleton(IExternalTerminalService, WindowsExternalTerminalService, true); +} else if (env.isMacintosh) { + registerSingleton(IExternalTerminalService, MacExternalTerminalService, true); +} else if (env.isLinux) { + registerSingleton(IExternalTerminalService, LinuxExternalTerminalService, true); +} + +getDefaultTerminalLinuxReady().then(defaultTerminalLinux => { + let configurationRegistry = Registry.as(Extensions.Configuration); + configurationRegistry.registerConfiguration({ + id: 'externalTerminal', + order: 100, + title: nls.localize('terminalConfigurationTitle', "External Terminal"), + type: 'object', + properties: { + 'terminal.explorerKind': { + type: 'string', + enum: [ + 'integrated', + 'external' + ], + enumDescriptions: [ + nls.localize('terminal.explorerKind.integrated', "Use VS Code's integrated terminal."), + nls.localize('terminal.explorerKind.external', "Use the configured external terminal.") + ], + description: nls.localize('explorer.openInTerminalKind', "Customizes what kind of terminal to launch."), + default: 'integrated' + }, + 'terminal.external.windowsExec': { + type: 'string', + description: nls.localize('terminal.external.windowsExec', "Customizes which terminal to run on Windows."), + default: getDefaultTerminalWindows(), + scope: ConfigurationScope.APPLICATION + }, + 'terminal.external.osxExec': { + type: 'string', + description: nls.localize('terminal.external.osxExec', "Customizes which terminal application to run on macOS."), + default: DEFAULT_TERMINAL_OSX, + scope: ConfigurationScope.APPLICATION + }, + 'terminal.external.linuxExec': { + type: 'string', + description: nls.localize('terminal.external.linuxExec', "Customizes which terminal to run on Linux."), + default: defaultTerminalLinux, + scope: ConfigurationScope.APPLICATION + } + } + }); +}); diff --git a/src/vs/workbench/contrib/externalTerminal/electron-browser/iTermHelper.scpt b/src/vs/workbench/contrib/externalTerminal/node/iTermHelper.scpt similarity index 100% rename from src/vs/workbench/contrib/externalTerminal/electron-browser/iTermHelper.scpt rename to src/vs/workbench/contrib/externalTerminal/node/iTermHelper.scpt diff --git a/src/vs/workbench/contrib/externalTerminal/test/electron-browser/externalTerminalService.test.ts b/src/vs/workbench/contrib/externalTerminal/test/electron-browser/externalTerminalService.test.ts index 8690ad8ae34..1ba20ae542a 100644 --- a/src/vs/workbench/contrib/externalTerminal/test/electron-browser/externalTerminalService.test.ts +++ b/src/vs/workbench/contrib/externalTerminal/test/electron-browser/externalTerminalService.test.ts @@ -4,8 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { deepEqual, equal } from 'assert'; -import { WindowsExternalTerminalService, LinuxExternalTerminalService, MacExternalTerminalService } from 'vs/workbench/contrib/externalTerminal/electron-browser/externalTerminalService'; -import { getDefaultTerminalWindows, getDefaultTerminalLinuxReady, DEFAULT_TERMINAL_OSX } from 'vs/workbench/contrib/externalTerminal/electron-browser/externalTerminal'; +import { WindowsExternalTerminalService, LinuxExternalTerminalService, MacExternalTerminalService, DEFAULT_TERMINAL_OSX, getDefaultTerminalWindows, getDefaultTerminalLinuxReady } from 'vs/workbench/contrib/externalTerminal/node/externalTerminalService'; suite('ExternalTerminalService', () => { let mockOnExit: Function; diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index 8535066a63b..b9c655b8f03 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -287,7 +287,8 @@ import 'vs/workbench/contrib/codeEditor/browser/codeEditor.contribution'; import 'vs/workbench/contrib/codeEditor/electron-browser/codeEditor.contribution'; // Execution -import 'vs/workbench/contrib/externalTerminal/electron-browser/externalTerminal.contribution'; +import 'vs/workbench/contrib/externalTerminal/node/externalTerminalService'; +import 'vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution'; // Snippets import 'vs/workbench/contrib/snippets/browser/snippets.contribution'; From 9c71dd0cfb9145cce4d105e8bab3e6119ed3fcf6 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 10:35:28 +0200 Subject: [PATCH 0962/1449] better lifecycle for actions fixes #76419 --- .../contrib/scm/browser/dirtydiffDecorator.ts | 2 +- .../workbench/contrib/scm/browser/scmMenus.ts | 9 +++++++-- .../contrib/scm/browser/scmViewlet.ts | 18 +++++++++++++----- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator.ts b/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator.ts index 3d2ca1bdcdf..6f90e69127a 100644 --- a/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator.ts +++ b/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator.ts @@ -258,7 +258,7 @@ class DirtyDiffWidget extends PeekViewWidget { this._actionbarWidget.push([previous, next], { label: false, icon: true }); const actions: IAction[] = []; - createAndFillInActionBarActions(this.menu, { shouldForwardArgs: true }, actions); + this._disposables.add(createAndFillInActionBarActions(this.menu, { shouldForwardArgs: true }, actions)); this._actionbarWidget.push(actions, { label: false, icon: true }); } diff --git a/src/vs/workbench/contrib/scm/browser/scmMenus.ts b/src/vs/workbench/contrib/scm/browser/scmMenus.ts index 739872f8f65..827765114ef 100644 --- a/src/vs/workbench/contrib/scm/browser/scmMenus.ts +++ b/src/vs/workbench/contrib/scm/browser/scmMenus.ts @@ -5,7 +5,7 @@ import 'vs/css!./media/scmViewlet'; import { Event, Emitter } from 'vs/base/common/event'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IMenuService, MenuId, IMenu } from 'vs/platform/actions/common/actions'; import { IAction } from 'vs/base/common/actions'; @@ -37,6 +37,8 @@ export class SCMMenus implements IDisposable { private contextKeyService: IContextKeyService; private titleMenu: IMenu; + + private titleActionDisposable: IDisposable = Disposable.None; private titleActions: IAction[] = []; private titleSecondaryActions: IAction[] = []; @@ -76,12 +78,15 @@ export class SCMMenus implements IDisposable { const primary: IAction[] = []; const secondary: IAction[] = []; - createAndFillInActionBarActions(this.titleMenu, { shouldForwardArgs: true }, { primary, secondary }); + const disposable = createAndFillInActionBarActions(this.titleMenu, { shouldForwardArgs: true }, { primary, secondary }); if (equals(primary, this.titleActions, actionEquals) && equals(secondary, this.titleSecondaryActions, actionEquals)) { + disposable.dispose(); return; } + this.titleActionDisposable.dispose(); + this.titleActionDisposable = disposable; this.titleActions = primary; this.titleSecondaryActions = secondary; diff --git a/src/vs/workbench/contrib/scm/browser/scmViewlet.ts b/src/vs/workbench/contrib/scm/browser/scmViewlet.ts index 4d8a5d69079..e56bd970377 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewlet.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewlet.ts @@ -8,7 +8,7 @@ import { localize } from 'vs/nls'; import { Event, Emitter } from 'vs/base/common/event'; import { domEvent } from 'vs/base/browser/event'; import { basename } from 'vs/base/common/resources'; -import { IDisposable, dispose, Disposable, DisposableStore, combinedDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose, Disposable, DisposableStore, combinedDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { ViewletPanel, IViewletPanelOptions } from 'vs/workbench/browser/parts/views/panelViewlet'; import { append, $, addClass, toggleClass, trackFocus, removeClass, addClasses } from 'vs/base/browser/dom'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -108,26 +108,32 @@ class StatusBarActionViewItem extends ActionViewItem { } function connectPrimaryMenuToInlineActionBar(menu: IMenu, actionBar: ActionBar): IDisposable { + let cachedDisposable: IDisposable = Disposable.None; let cachedPrimary: IAction[] = []; const updateActions = () => { const primary: IAction[] = []; const secondary: IAction[] = []; - const result = { primary, secondary }; - createAndFillInActionBarActions(menu, { shouldForwardArgs: true }, result, g => /^inline/.test(g)); + const disposable = createAndFillInActionBarActions(menu, { shouldForwardArgs: true }, { primary, secondary }, g => /^inline/.test(g)); if (equals(cachedPrimary, primary, (a, b) => a.id === b.id)) { + disposable.dispose(); return; } + cachedDisposable = disposable; cachedPrimary = primary; + actionBar.clear(); actionBar.push(primary, { icon: true, label: false }); }; updateActions(); - return menu.onDidChange(updateActions); + + return combinedDisposable(menu.onDidChange(updateActions), toDisposable(() => { + cachedDisposable.dispose(); + })); } interface RepositoryTemplateData { @@ -299,7 +305,7 @@ export class MainPanel extends ViewletPanel { const secondary: IAction[] = []; const result = { primary, secondary }; - createAndFillInContextMenuActions(menu, { shouldForwardArgs: true }, result, this.contextMenuService, g => g === 'inline'); + const disposable = createAndFillInContextMenuActions(menu, { shouldForwardArgs: true }, result, this.contextMenuService, g => g === 'inline'); menu.dispose(); contextKeyService.dispose(); @@ -313,6 +319,8 @@ export class MainPanel extends ViewletPanel { getActions: () => secondary, getActionsContext: () => repository.provider }); + + disposable.dispose(); } private onListSelectionChange(e: IListEvent): void { From 05a0175c8fd68e384e60766f69cefc5099822898 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 10:37:03 +0200 Subject: [PATCH 0963/1449] yarn cache should worry about .yarnrc --- build/azure-pipelines/compile.yml | 4 ++-- build/azure-pipelines/darwin/continuous-build-darwin.yml | 4 ++-- build/azure-pipelines/linux/continuous-build-linux.yml | 4 ++-- build/azure-pipelines/win32/continuous-build-win32.yml | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/build/azure-pipelines/compile.yml b/build/azure-pipelines/compile.yml index 831a22ccaee..a6b7f79a8a5 100644 --- a/build/azure-pipelines/compile.yml +++ b/build/azure-pipelines/compile.yml @@ -31,7 +31,7 @@ steps: # - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 # inputs: -# keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' +# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' # targetfolder: '**/node_modules, !**/node_modules/**/node_modules' # vstsFeed: '$(ArtifactFeed)' @@ -45,7 +45,7 @@ steps: # - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 # inputs: -# keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' +# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' # targetfolder: '**/node_modules, !**/node_modules/**/node_modules' # vstsFeed: '$(ArtifactFeed)' # condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) diff --git a/build/azure-pipelines/darwin/continuous-build-darwin.yml b/build/azure-pipelines/darwin/continuous-build-darwin.yml index 0588b0ae961..018719423fe 100644 --- a/build/azure-pipelines/darwin/continuous-build-darwin.yml +++ b/build/azure-pipelines/darwin/continuous-build-darwin.yml @@ -4,7 +4,7 @@ steps: versionSpec: "10.15.1" - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: '$(ArtifactFeed)' - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 @@ -16,7 +16,7 @@ steps: condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: '$(ArtifactFeed)' condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) diff --git a/build/azure-pipelines/linux/continuous-build-linux.yml b/build/azure-pipelines/linux/continuous-build-linux.yml index d1e38506f5d..6f3008f73d2 100644 --- a/build/azure-pipelines/linux/continuous-build-linux.yml +++ b/build/azure-pipelines/linux/continuous-build-linux.yml @@ -12,7 +12,7 @@ steps: versionSpec: "10.15.1" - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: '$(ArtifactFeed)' - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 @@ -24,7 +24,7 @@ steps: condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: '$(ArtifactFeed)' condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) diff --git a/build/azure-pipelines/win32/continuous-build-win32.yml b/build/azure-pipelines/win32/continuous-build-win32.yml index 7f10e74d7c5..9b6d61ee974 100644 --- a/build/azure-pipelines/win32/continuous-build-win32.yml +++ b/build/azure-pipelines/win32/continuous-build-win32.yml @@ -11,7 +11,7 @@ steps: addToPath: true - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: '$(ArtifactFeed)' - powershell: | @@ -20,7 +20,7 @@ steps: condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: '$(ArtifactFeed)' condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) From 5c8845063d10de6a8562a44e4f4fd7bfa1e6d9fd Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 3 Jul 2019 10:40:06 +0200 Subject: [PATCH 0964/1449] update distro (again) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 343fe871f13..ffdf8e3b44f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "f9346c9c93b0ce1ad89b51de7d1aa282a24b3c51", + "distro": "fa2bc559711db882ee1d8a13a035ec3273d25e96", "author": { "name": "Microsoft Corporation" }, From 0d5eea741d0e9c8ba6657709aee5827a0019e78e Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 10:41:08 +0200 Subject: [PATCH 0965/1449] use yarn cache everywhere --- .../darwin/product-build-darwin.yml | 5 +- .../linux/product-build-linux-alpine.yml | 15 +- .../linux/product-build-linux-arm.yml | 15 +- .../linux/product-build-linux.yml | 132 +++++++------- build/azure-pipelines/product-build.yml | 166 +++++++++--------- .../win32/product-build-win32.yml | 5 +- 6 files changed, 181 insertions(+), 157 deletions(-) diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index 09b2ffe463d..0ae47fc8d8f 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -37,7 +37,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: '**/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' @@ -49,10 +49,9 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: '**/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' - condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - script: | set -e diff --git a/build/azure-pipelines/linux/product-build-linux-alpine.yml b/build/azure-pipelines/linux/product-build-linux-alpine.yml index b5fe88487a9..5a3c0b4b4b1 100644 --- a/build/azure-pipelines/linux/product-build-linux-alpine.yml +++ b/build/azure-pipelines/linux/product-build-linux-alpine.yml @@ -44,10 +44,23 @@ steps: git merge $(node -p "require('./package.json').distro") displayName: Merge distro +- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + inputs: + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'npm-vscode' + - script: | set -e - CHILD_CONCURRENCY=1 yarn --frozen-lockfile + yarn --frozen-lockfile displayName: Install dependencies + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) + +- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 + inputs: + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'npm-vscode' - script: | set -e diff --git a/build/azure-pipelines/linux/product-build-linux-arm.yml b/build/azure-pipelines/linux/product-build-linux-arm.yml index c091a44b5f2..a9d32ee5dc2 100644 --- a/build/azure-pipelines/linux/product-build-linux-arm.yml +++ b/build/azure-pipelines/linux/product-build-linux-arm.yml @@ -44,10 +44,23 @@ steps: git merge $(node -p "require('./package.json').distro") displayName: Merge distro +- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + inputs: + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'npm-vscode' + - script: | set -e - CHILD_CONCURRENCY=1 yarn --frozen-lockfile + yarn --frozen-lockfile displayName: Install dependencies + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) + +- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 + inputs: + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'npm-vscode' - script: | set -e diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index f3ac9a91713..15d39b37a69 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -54,79 +54,79 @@ steps: targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' -# - script: | -# set -e -# yarn gulp mixin -# displayName: Mix in quality +- script: | + set -e + yarn gulp mixin + displayName: Mix in quality -# - script: | -# set -e -# yarn gulp hygiene -# yarn monaco-compile-check -# displayName: Run hygiene checks -# condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) +- script: | + set -e + yarn gulp hygiene + yarn monaco-compile-check + displayName: Run hygiene checks + condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) -# - script: | -# set -e -# node build/azure-pipelines/common/installDistroDependencies.js -# node build/azure-pipelines/common/installDistroDependencies.js remote -# node build/lib/builtInExtensions.js -# displayName: Install distro dependencies and extensions +- script: | + set -e + node build/azure-pipelines/common/installDistroDependencies.js + node build/azure-pipelines/common/installDistroDependencies.js remote + node build/lib/builtInExtensions.js + displayName: Install distro dependencies and extensions -# - script: | -# set -e -# cd $BUILD_STAGINGDIRECTORY -# git clone https://github.com/microsoft/vscode-telemetry-extractor.git -# cd vscode-telemetry-extractor -# git checkout 3b04aba5bfdfcca1a5426cd2c51a90d18740d0bc -# npm i -# npm run setup-extension-repos -# node ./out/cli-extract.js --sourceDir $BUILD_SOURCESDIRECTORY --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents -# node ./out/cli-extract-extensions.js --sourceDir ./src/telemetry-sources --outputDir . --applyEndpoints --includeIsMeasurement -# mkdir -p $BUILD_SOURCESDIRECTORY/.build/telemetry -# mv declarations-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-core.json -# mv declarations-extensions-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-extensions.json -# displayName: Extract Telemetry +- script: | + set -e + cd $BUILD_STAGINGDIRECTORY + git clone https://github.com/microsoft/vscode-telemetry-extractor.git + cd vscode-telemetry-extractor + git checkout 3b04aba5bfdfcca1a5426cd2c51a90d18740d0bc + npm i + npm run setup-extension-repos + node ./out/cli-extract.js --sourceDir $BUILD_SOURCESDIRECTORY --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents + node ./out/cli-extract-extensions.js --sourceDir ./src/telemetry-sources --outputDir . --applyEndpoints --includeIsMeasurement + mkdir -p $BUILD_SOURCESDIRECTORY/.build/telemetry + mv declarations-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-core.json + mv declarations-extensions-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-extensions.json + displayName: Extract Telemetry -# - script: | -# set -e -# yarn gulp compile-build -# yarn gulp compile-extensions-build -# VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ -# yarn gulp vscode-linux-$VSCODE_ARCH-min-ci -# VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ -# yarn gulp vscode-reh-linux-$VSCODE_ARCH-min-ci -# VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ -# yarn gulp vscode-web-linux-$VSCODE_ARCH-min-ci -# displayName: Build +- script: | + set -e + yarn gulp compile-build + yarn gulp compile-extensions-build + VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ + yarn gulp vscode-linux-$VSCODE_ARCH-min-ci + VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ + yarn gulp vscode-reh-linux-$VSCODE_ARCH-min-ci + VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ + yarn gulp vscode-web-linux-$VSCODE_ARCH-min-ci + displayName: Build -# - script: | -# set -e -# yarn gulp "electron-$(VSCODE_ARCH)" +- script: | + set -e + yarn gulp "electron-$(VSCODE_ARCH)" -# # xvfb seems to be crashing often, let's make sure it's always up -# service xvfb start + # xvfb seems to be crashing often, let's make sure it's always up + service xvfb start -# DISPLAY=:10 ./scripts/test.sh --build --tfs "Unit Tests" -# # yarn smoketest -- --build "$(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH)" -# displayName: Run unit tests -# condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) + DISPLAY=:10 ./scripts/test.sh --build --tfs "Unit Tests" + # yarn smoketest -- --build "$(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH)" + displayName: Run unit tests + condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) -# - script: | -# set -e -# AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ -# AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ -# VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ -# VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ -# ./build/azure-pipelines/linux/publish.sh -# displayName: Publish +- script: | + set -e + AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ + AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ + VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ + VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ + ./build/azure-pipelines/linux/publish.sh + displayName: Publish -# - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 -# displayName: 'Component Detection' -# continueOnError: true +- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 + displayName: 'Component Detection' + continueOnError: true -# - task: PublishPipelineArtifact@0 -# displayName: 'Publish Pipeline Artifact' -# inputs: -# artifactName: snap-$(VSCODE_ARCH) -# targetPath: .build/linux/snap-tarball +- task: PublishPipelineArtifact@0 + displayName: 'Publish Pipeline Artifact' + inputs: + artifactName: snap-$(VSCODE_ARCH) + targetPath: .build/linux/snap-tarball diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 2e0df5ef552..0353a0354d5 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -7,31 +7,31 @@ resources: image: snapcore/snapcraft:stable jobs: -# - job: Linux +# - job: Compile # pool: # vmImage: 'Ubuntu-16.04' # steps: # - template: compile.yml -# - job: Windows -# condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32'], 'true')) -# timeoutInMinutes: 120 -# pool: -# vmImage: VS2017-Win2016 -# variables: -# VSCODE_ARCH: x64 -# steps: -# - template: win32/product-build-win32.yml +- job: Windows + condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32'], 'true')) + timeoutInMinutes: 120 + pool: + vmImage: VS2017-Win2016 + variables: + VSCODE_ARCH: x64 + steps: + - template: win32/product-build-win32.yml -# - job: Windows32 -# condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true')) -# timeoutInMinutes: 120 -# pool: -# vmImage: VS2017-Win2016 -# variables: -# VSCODE_ARCH: ia32 -# steps: -# - template: win32/product-build-win32.yml +- job: Windows32 + condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true')) + timeoutInMinutes: 120 + pool: + vmImage: VS2017-Win2016 + variables: + VSCODE_ARCH: ia32 + steps: + - template: win32/product-build-win32.yml - job: Linux condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) @@ -44,75 +44,75 @@ jobs: steps: - template: linux/product-build-linux.yml -# - job: LinuxSnap -# condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) -# timeoutInMinutes: 120 -# pool: -# vmImage: 'Ubuntu-16.04' -# variables: -# VSCODE_ARCH: x64 -# container: snapcraft -# dependsOn: Linux -# steps: -# - template: linux/snap-build-linux.yml +- job: LinuxSnap + condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) + timeoutInMinutes: 120 + pool: + vmImage: 'Ubuntu-16.04' + variables: + VSCODE_ARCH: x64 + container: snapcraft + dependsOn: Linux + steps: + - template: linux/snap-build-linux.yml -# - job: LinuxArmhf -# condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) -# timeoutInMinutes: 120 -# pool: -# vmImage: 'Ubuntu-16.04' -# variables: -# VSCODE_ARCH: armhf -# steps: -# - template: linux/product-build-linux-arm.yml +- job: LinuxArmhf + condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) + timeoutInMinutes: 120 + pool: + vmImage: 'Ubuntu-16.04' + variables: + VSCODE_ARCH: armhf + steps: + - template: linux/product-build-linux-arm.yml -# - job: LinuxAlpine -# condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) -# timeoutInMinutes: 120 -# pool: -# vmImage: 'Ubuntu-16.04' -# variables: -# VSCODE_ARCH: alpine -# steps: -# - template: linux/product-build-linux-alpine.yml +- job: LinuxAlpine + condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) + timeoutInMinutes: 120 + pool: + vmImage: 'Ubuntu-16.04' + variables: + VSCODE_ARCH: alpine + steps: + - template: linux/product-build-linux-alpine.yml -# - job: macOS -# condition: and(succeeded(), eq(variables['VSCODE_BUILD_MACOS'], 'true')) -# timeoutInMinutes: 120 -# pool: -# vmImage: macOS 10.13 -# steps: -# - template: darwin/product-build-darwin.yml +- job: macOS + condition: and(succeeded(), eq(variables['VSCODE_BUILD_MACOS'], 'true')) + timeoutInMinutes: 120 + pool: + vmImage: macOS 10.13 + steps: + - template: darwin/product-build-darwin.yml -# - job: Release -# condition: and(succeeded(), or(eq(variables['VSCODE_RELEASE'], 'true'), and(or(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['VSCODE_QUALITY'], 'exploration')), eq(variables['Build.Reason'], 'Schedule')))) -# pool: -# vmImage: 'Ubuntu-16.04' -# dependsOn: -# - Windows -# - Windows32 -# - Linux -# - LinuxSnap -# - LinuxArmhf -# - LinuxAlpine -# - macOS -# steps: -# - template: release.yml +- job: Release + condition: and(succeeded(), or(eq(variables['VSCODE_RELEASE'], 'true'), and(or(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['VSCODE_QUALITY'], 'exploration')), eq(variables['Build.Reason'], 'Schedule')))) + pool: + vmImage: 'Ubuntu-16.04' + dependsOn: + - Windows + - Windows32 + - Linux + - LinuxSnap + - LinuxArmhf + - LinuxAlpine + - macOS + steps: + - template: release.yml -# - job: Mooncake -# pool: -# vmImage: 'Ubuntu-16.04' -# condition: true -# dependsOn: -# - Windows -# - Windows32 -# - Linux -# - LinuxSnap -# - LinuxArmhf -# - LinuxAlpine -# - macOS -# steps: -# - template: sync-mooncake.yml +- job: Mooncake + pool: + vmImage: 'Ubuntu-16.04' + condition: true + dependsOn: + - Windows + - Windows32 + - Linux + - LinuxSnap + - LinuxArmhf + - LinuxAlpine + - macOS + steps: + - template: sync-mooncake.yml schedules: - cron: "0 6 * * Mon-Fri" diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 46362f655ad..9a2162d1a33 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -37,7 +37,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: '**/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' @@ -52,10 +52,9 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: '**/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' - condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - powershell: | . build/azure-pipelines/win32/exec.ps1 From 7013ce7a007b96361c27ac2046ccb18d227ca90e Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 10:47:20 +0200 Subject: [PATCH 0966/1449] comment out publish step --- .../darwin/product-build-darwin.yml | 18 +++++++++--------- .../linux/product-build-linux-alpine.yml | 16 ++++++++-------- .../linux/product-build-linux-arm.yml | 16 ++++++++-------- .../linux/product-build-linux.yml | 16 ++++++++-------- .../win32/product-build-win32.yml | 18 +++++++++--------- 5 files changed, 42 insertions(+), 42 deletions(-) diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index 0ae47fc8d8f..69f6de209e4 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -139,15 +139,15 @@ steps: SessionTimeout: 120 displayName: Codesign -- script: | - set -e - VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ - AZURE_STORAGE_ACCESS_KEY="$(ticino-storage-key)" \ - AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ - VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ - ./build/azure-pipelines/darwin/publish.sh - displayName: Publish +# - script: | +# set -e +# VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ +# AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ +# AZURE_STORAGE_ACCESS_KEY="$(ticino-storage-key)" \ +# AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ +# VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ +# ./build/azure-pipelines/darwin/publish.sh +# displayName: Publish - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 displayName: 'Component Detection' diff --git a/build/azure-pipelines/linux/product-build-linux-alpine.yml b/build/azure-pipelines/linux/product-build-linux-alpine.yml index 5a3c0b4b4b1..70cb21d13ef 100644 --- a/build/azure-pipelines/linux/product-build-linux-alpine.yml +++ b/build/azure-pipelines/linux/product-build-linux-alpine.yml @@ -86,14 +86,14 @@ steps: ./build/azure-pipelines/linux/build-alpine.sh displayName: Build -- script: | - set -e - AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ - AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ - VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ - ./build/azure-pipelines/linux/publish-alpine.sh - displayName: Publish +# - script: | +# set -e +# AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ +# AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ +# VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ +# VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ +# ./build/azure-pipelines/linux/publish-alpine.sh +# displayName: Publish - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 displayName: 'Component Detection' diff --git a/build/azure-pipelines/linux/product-build-linux-arm.yml b/build/azure-pipelines/linux/product-build-linux-arm.yml index a9d32ee5dc2..94c3c208217 100644 --- a/build/azure-pipelines/linux/product-build-linux-arm.yml +++ b/build/azure-pipelines/linux/product-build-linux-arm.yml @@ -86,14 +86,14 @@ steps: ./build/azure-pipelines/linux/build-arm.sh displayName: Build -- script: | - set -e - AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ - AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ - VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ - ./build/azure-pipelines/linux/publish-arm.sh - displayName: Publish +# - script: | +# set -e +# AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ +# AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ +# VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ +# VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ +# ./build/azure-pipelines/linux/publish-arm.sh +# displayName: Publish - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 displayName: 'Component Detection' diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 15d39b37a69..27484027162 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -112,14 +112,14 @@ steps: displayName: Run unit tests condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) -- script: | - set -e - AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ - AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ - VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ - ./build/azure-pipelines/linux/publish.sh - displayName: Publish +# - script: | +# set -e +# AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ +# AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ +# VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ +# VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ +# ./build/azure-pipelines/linux/publish.sh +# displayName: Publish - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 displayName: 'Component Detection' diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 9a2162d1a33..271f95c12c8 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -196,15 +196,15 @@ steps: .\build\azure-pipelines\win32\import-esrp-auth-cert.ps1 -AuthCertificateBase64 $(esrp-auth-certificate) -AuthCertificateKey $(esrp-auth-certificate-key) displayName: Import ESRP Auth Certificate -- powershell: | - . build/azure-pipelines/win32/exec.ps1 - $ErrorActionPreference = "Stop" - $env:AZURE_STORAGE_ACCESS_KEY_2 = "$(vscode-storage-key)" - $env:AZURE_DOCUMENTDB_MASTERKEY = "$(builds-docdb-key-readwrite)" - $env:VSCODE_HOCKEYAPP_TOKEN = "$(vscode-hockeyapp-token)" - $env:VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" - .\build\azure-pipelines\win32\publish.ps1 - displayName: Publish +# - powershell: | +# . build/azure-pipelines/win32/exec.ps1 +# $ErrorActionPreference = "Stop" +# $env:AZURE_STORAGE_ACCESS_KEY_2 = "$(vscode-storage-key)" +# $env:AZURE_DOCUMENTDB_MASTERKEY = "$(builds-docdb-key-readwrite)" +# $env:VSCODE_HOCKEYAPP_TOKEN = "$(vscode-hockeyapp-token)" +# $env:VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" +# .\build\azure-pipelines\win32\publish.ps1 +# displayName: Publish - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 displayName: 'Component Detection' From b816ed5b5488d7aebb38ed86ede91650a902eb27 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 10:58:09 +0200 Subject: [PATCH 0967/1449] run postinstall scripts if yarn cache is restored --- .../linux/product-build-linux.yml | 9 + build/azure-pipelines/product-build.yml | 164 +++++++++--------- 2 files changed, 91 insertions(+), 82 deletions(-) diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 27484027162..3d9624893ac 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -54,6 +54,15 @@ steps: targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' +- script: | + set -e + yarn postinstall + (cd build && yarn postinstall) + (cd extensions && yarn postinstall) + (cd test/smoke && yarn postinstall) + displayName: Run postinstall scripts + condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) + - script: | set -e yarn gulp mixin diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 0353a0354d5..e775d2a7681 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -13,25 +13,25 @@ jobs: # steps: # - template: compile.yml -- job: Windows - condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32'], 'true')) - timeoutInMinutes: 120 - pool: - vmImage: VS2017-Win2016 - variables: - VSCODE_ARCH: x64 - steps: - - template: win32/product-build-win32.yml +# - job: Windows +# condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32'], 'true')) +# timeoutInMinutes: 120 +# pool: +# vmImage: VS2017-Win2016 +# variables: +# VSCODE_ARCH: x64 +# steps: +# - template: win32/product-build-win32.yml -- job: Windows32 - condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true')) - timeoutInMinutes: 120 - pool: - vmImage: VS2017-Win2016 - variables: - VSCODE_ARCH: ia32 - steps: - - template: win32/product-build-win32.yml +# - job: Windows32 +# condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true')) +# timeoutInMinutes: 120 +# pool: +# vmImage: VS2017-Win2016 +# variables: +# VSCODE_ARCH: ia32 +# steps: +# - template: win32/product-build-win32.yml - job: Linux condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) @@ -44,75 +44,75 @@ jobs: steps: - template: linux/product-build-linux.yml -- job: LinuxSnap - condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) - timeoutInMinutes: 120 - pool: - vmImage: 'Ubuntu-16.04' - variables: - VSCODE_ARCH: x64 - container: snapcraft - dependsOn: Linux - steps: - - template: linux/snap-build-linux.yml +# - job: LinuxSnap +# condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) +# timeoutInMinutes: 120 +# pool: +# vmImage: 'Ubuntu-16.04' +# variables: +# VSCODE_ARCH: x64 +# container: snapcraft +# dependsOn: Linux +# steps: +# - template: linux/snap-build-linux.yml -- job: LinuxArmhf - condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) - timeoutInMinutes: 120 - pool: - vmImage: 'Ubuntu-16.04' - variables: - VSCODE_ARCH: armhf - steps: - - template: linux/product-build-linux-arm.yml +# - job: LinuxArmhf +# condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) +# timeoutInMinutes: 120 +# pool: +# vmImage: 'Ubuntu-16.04' +# variables: +# VSCODE_ARCH: armhf +# steps: +# - template: linux/product-build-linux-arm.yml -- job: LinuxAlpine - condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) - timeoutInMinutes: 120 - pool: - vmImage: 'Ubuntu-16.04' - variables: - VSCODE_ARCH: alpine - steps: - - template: linux/product-build-linux-alpine.yml +# - job: LinuxAlpine +# condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) +# timeoutInMinutes: 120 +# pool: +# vmImage: 'Ubuntu-16.04' +# variables: +# VSCODE_ARCH: alpine +# steps: +# - template: linux/product-build-linux-alpine.yml -- job: macOS - condition: and(succeeded(), eq(variables['VSCODE_BUILD_MACOS'], 'true')) - timeoutInMinutes: 120 - pool: - vmImage: macOS 10.13 - steps: - - template: darwin/product-build-darwin.yml +# - job: macOS +# condition: and(succeeded(), eq(variables['VSCODE_BUILD_MACOS'], 'true')) +# timeoutInMinutes: 120 +# pool: +# vmImage: macOS 10.13 +# steps: +# - template: darwin/product-build-darwin.yml -- job: Release - condition: and(succeeded(), or(eq(variables['VSCODE_RELEASE'], 'true'), and(or(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['VSCODE_QUALITY'], 'exploration')), eq(variables['Build.Reason'], 'Schedule')))) - pool: - vmImage: 'Ubuntu-16.04' - dependsOn: - - Windows - - Windows32 - - Linux - - LinuxSnap - - LinuxArmhf - - LinuxAlpine - - macOS - steps: - - template: release.yml +# - job: Release +# condition: and(succeeded(), or(eq(variables['VSCODE_RELEASE'], 'true'), and(or(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['VSCODE_QUALITY'], 'exploration')), eq(variables['Build.Reason'], 'Schedule')))) +# pool: +# vmImage: 'Ubuntu-16.04' +# dependsOn: +# - Windows +# - Windows32 +# - Linux +# - LinuxSnap +# - LinuxArmhf +# - LinuxAlpine +# - macOS +# steps: +# - template: release.yml -- job: Mooncake - pool: - vmImage: 'Ubuntu-16.04' - condition: true - dependsOn: - - Windows - - Windows32 - - Linux - - LinuxSnap - - LinuxArmhf - - LinuxAlpine - - macOS - steps: - - template: sync-mooncake.yml +# - job: Mooncake +# pool: +# vmImage: 'Ubuntu-16.04' +# condition: true +# dependsOn: +# - Windows +# - Windows32 +# - Linux +# - LinuxSnap +# - LinuxArmhf +# - LinuxAlpine +# - macOS +# steps: +# - template: sync-mooncake.yml schedules: - cron: "0 6 * * Mon-Fri" From 674d8a544906aec7239711430cd893f3d7f9c870 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 11:23:45 +0200 Subject: [PATCH 0968/1449] postinstall scripts all around --- .../darwin/product-build-darwin.yml | 9 + .../linux/product-build-linux-alpine.yml | 8 + .../linux/product-build-linux-arm.yml | 8 + .../linux/snap-build-linux.yml | 6 +- build/azure-pipelines/product-build.yml | 164 +++++++++--------- .../win32/product-build-win32.yml | 10 ++ 6 files changed, 120 insertions(+), 85 deletions(-) diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index 69f6de209e4..ab3bd63d787 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -53,6 +53,15 @@ steps: targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' +- script: | + set -e + yarn postinstall + (cd build && yarn postinstall) + (cd extensions && yarn postinstall) + (cd test/smoke && yarn postinstall) + displayName: Run postinstall scripts + condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) + - script: | set -e yarn gulp mixin diff --git a/build/azure-pipelines/linux/product-build-linux-alpine.yml b/build/azure-pipelines/linux/product-build-linux-alpine.yml index 70cb21d13ef..b85c9627be7 100644 --- a/build/azure-pipelines/linux/product-build-linux-alpine.yml +++ b/build/azure-pipelines/linux/product-build-linux-alpine.yml @@ -62,6 +62,14 @@ steps: targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' +- script: | + set -e + yarn postinstall + (cd build && yarn postinstall) + (cd extensions && yarn postinstall) + displayName: Run postinstall scripts + condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) + - script: | set -e yarn gulp mixin diff --git a/build/azure-pipelines/linux/product-build-linux-arm.yml b/build/azure-pipelines/linux/product-build-linux-arm.yml index 94c3c208217..9fb0ba941a5 100644 --- a/build/azure-pipelines/linux/product-build-linux-arm.yml +++ b/build/azure-pipelines/linux/product-build-linux-arm.yml @@ -62,6 +62,14 @@ steps: targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' +- script: | + set -e + yarn postinstall + (cd build && yarn postinstall) + (cd extensions && yarn postinstall) + displayName: Run postinstall scripts + condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) + - script: | set -e yarn gulp mixin diff --git a/build/azure-pipelines/linux/snap-build-linux.yml b/build/azure-pipelines/linux/snap-build-linux.yml index 9dbe920b87b..83bcdfe36e5 100644 --- a/build/azure-pipelines/linux/snap-build-linux.yml +++ b/build/azure-pipelines/linux/snap-build-linux.yml @@ -50,6 +50,6 @@ steps: (cd $SNAP_ROOT/code-* && sudo --preserve-env snapcraft snap --output "$SNAP_PATH") # Publish snap package - AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ - AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ - node build/azure-pipelines/common/publish.js "$VSCODE_QUALITY" "linux-snap-$ARCH" package "$SNAP_FILENAME" "$VERSION" true "$SNAP_PATH" \ No newline at end of file + # AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ + # AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ + # node build/azure-pipelines/common/publish.js "$VSCODE_QUALITY" "linux-snap-$ARCH" package "$SNAP_FILENAME" "$VERSION" true "$SNAP_PATH" \ No newline at end of file diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index e775d2a7681..0353a0354d5 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -13,25 +13,25 @@ jobs: # steps: # - template: compile.yml -# - job: Windows -# condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32'], 'true')) -# timeoutInMinutes: 120 -# pool: -# vmImage: VS2017-Win2016 -# variables: -# VSCODE_ARCH: x64 -# steps: -# - template: win32/product-build-win32.yml +- job: Windows + condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32'], 'true')) + timeoutInMinutes: 120 + pool: + vmImage: VS2017-Win2016 + variables: + VSCODE_ARCH: x64 + steps: + - template: win32/product-build-win32.yml -# - job: Windows32 -# condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true')) -# timeoutInMinutes: 120 -# pool: -# vmImage: VS2017-Win2016 -# variables: -# VSCODE_ARCH: ia32 -# steps: -# - template: win32/product-build-win32.yml +- job: Windows32 + condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true')) + timeoutInMinutes: 120 + pool: + vmImage: VS2017-Win2016 + variables: + VSCODE_ARCH: ia32 + steps: + - template: win32/product-build-win32.yml - job: Linux condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) @@ -44,75 +44,75 @@ jobs: steps: - template: linux/product-build-linux.yml -# - job: LinuxSnap -# condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) -# timeoutInMinutes: 120 -# pool: -# vmImage: 'Ubuntu-16.04' -# variables: -# VSCODE_ARCH: x64 -# container: snapcraft -# dependsOn: Linux -# steps: -# - template: linux/snap-build-linux.yml +- job: LinuxSnap + condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) + timeoutInMinutes: 120 + pool: + vmImage: 'Ubuntu-16.04' + variables: + VSCODE_ARCH: x64 + container: snapcraft + dependsOn: Linux + steps: + - template: linux/snap-build-linux.yml -# - job: LinuxArmhf -# condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) -# timeoutInMinutes: 120 -# pool: -# vmImage: 'Ubuntu-16.04' -# variables: -# VSCODE_ARCH: armhf -# steps: -# - template: linux/product-build-linux-arm.yml +- job: LinuxArmhf + condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) + timeoutInMinutes: 120 + pool: + vmImage: 'Ubuntu-16.04' + variables: + VSCODE_ARCH: armhf + steps: + - template: linux/product-build-linux-arm.yml -# - job: LinuxAlpine -# condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) -# timeoutInMinutes: 120 -# pool: -# vmImage: 'Ubuntu-16.04' -# variables: -# VSCODE_ARCH: alpine -# steps: -# - template: linux/product-build-linux-alpine.yml +- job: LinuxAlpine + condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) + timeoutInMinutes: 120 + pool: + vmImage: 'Ubuntu-16.04' + variables: + VSCODE_ARCH: alpine + steps: + - template: linux/product-build-linux-alpine.yml -# - job: macOS -# condition: and(succeeded(), eq(variables['VSCODE_BUILD_MACOS'], 'true')) -# timeoutInMinutes: 120 -# pool: -# vmImage: macOS 10.13 -# steps: -# - template: darwin/product-build-darwin.yml +- job: macOS + condition: and(succeeded(), eq(variables['VSCODE_BUILD_MACOS'], 'true')) + timeoutInMinutes: 120 + pool: + vmImage: macOS 10.13 + steps: + - template: darwin/product-build-darwin.yml -# - job: Release -# condition: and(succeeded(), or(eq(variables['VSCODE_RELEASE'], 'true'), and(or(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['VSCODE_QUALITY'], 'exploration')), eq(variables['Build.Reason'], 'Schedule')))) -# pool: -# vmImage: 'Ubuntu-16.04' -# dependsOn: -# - Windows -# - Windows32 -# - Linux -# - LinuxSnap -# - LinuxArmhf -# - LinuxAlpine -# - macOS -# steps: -# - template: release.yml +- job: Release + condition: and(succeeded(), or(eq(variables['VSCODE_RELEASE'], 'true'), and(or(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['VSCODE_QUALITY'], 'exploration')), eq(variables['Build.Reason'], 'Schedule')))) + pool: + vmImage: 'Ubuntu-16.04' + dependsOn: + - Windows + - Windows32 + - Linux + - LinuxSnap + - LinuxArmhf + - LinuxAlpine + - macOS + steps: + - template: release.yml -# - job: Mooncake -# pool: -# vmImage: 'Ubuntu-16.04' -# condition: true -# dependsOn: -# - Windows -# - Windows32 -# - Linux -# - LinuxSnap -# - LinuxArmhf -# - LinuxAlpine -# - macOS -# steps: -# - template: sync-mooncake.yml +- job: Mooncake + pool: + vmImage: 'Ubuntu-16.04' + condition: true + dependsOn: + - Windows + - Windows32 + - Linux + - LinuxSnap + - LinuxArmhf + - LinuxAlpine + - macOS + steps: + - template: sync-mooncake.yml schedules: - cron: "0 6 * * Mon-Fri" diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 271f95c12c8..3764aad474a 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -56,6 +56,16 @@ steps: targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' +- powershell: | + . build/azure-pipelines/win32/exec.ps1 + $ErrorActionPreference = "Stop" + exec { yarn postinstall } + exec { pushd build ; yarn postinstall ; popd } + exec { pushd extensions ; yarn postinstall ; popd } + exec { pushd test\smoke ; yarn postinstall ; popd } + displayName: Run postinstall scripts + condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) + - powershell: | . build/azure-pipelines/win32/exec.ps1 $ErrorActionPreference = "Stop" From ffc49d53246953faee3d4ecaa16624167b0b29a8 Mon Sep 17 00:00:00 2001 From: skprabhanjan Date: Wed, 3 Jul 2019 14:54:55 +0530 Subject: [PATCH 0969/1449] Added same border color as panel border , added image preview border color in theme --- .../browser/parts/editor/media/resourceviewer.css | 1 - src/vs/workbench/browser/parts/editor/resourceViewer.ts | 7 +++++++ src/vs/workbench/common/theme.ts | 6 ++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/editor/media/resourceviewer.css b/src/vs/workbench/browser/parts/editor/media/resourceviewer.css index 1878d4f8f9c..b6f7b107db7 100644 --- a/src/vs/workbench/browser/parts/editor/media/resourceviewer.css +++ b/src/vs/workbench/browser/parts/editor/media/resourceviewer.css @@ -22,7 +22,6 @@ padding: 0; background-position: 0 0, 8px 8px; background-size: 16px 16px; - border: 1px solid; } .vs .monaco-resource-viewer.image img { diff --git a/src/vs/workbench/browser/parts/editor/resourceViewer.ts b/src/vs/workbench/browser/parts/editor/resourceViewer.ts index a5e644112b5..ed9f4f5bff1 100644 --- a/src/vs/workbench/browser/parts/editor/resourceViewer.ts +++ b/src/vs/workbench/browser/parts/editor/resourceViewer.ts @@ -21,6 +21,8 @@ import { IFileService } from 'vs/platform/files/common/files'; import { IStatusbarEntry, IStatusbarEntryAccessor, IStatusbarService, StatusbarAlignment } from 'vs/platform/statusbar/common/statusbar'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { ITheme, registerThemingParticipant, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; +import { IMAGE_PREVIEW_BORDER } from 'vs/workbench/common/theme'; export interface IResourceDescriptor { readonly resource: URI; @@ -67,6 +69,11 @@ interface ResourceViewerDelegate { metadataClb(meta: string): void; } +registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { + const borderColor = theme.getColor(IMAGE_PREVIEW_BORDER); + collector.addRule(`.monaco-resource-viewer.image img { border : 1px solid ${borderColor ? borderColor.toString() : ''}; }`); +}); + /** * Helper to actually render the given resource into the provided container. Will adjust scrollbar (if provided) automatically based on loading * progress of the binary resource. diff --git a/src/vs/workbench/common/theme.ts b/src/vs/workbench/common/theme.ts index 2d453924e8a..81eac44ae20 100644 --- a/src/vs/workbench/common/theme.ts +++ b/src/vs/workbench/common/theme.ts @@ -200,7 +200,13 @@ export const EDITOR_DRAG_AND_DROP_BACKGROUND = registerColor('editorGroup.dropBa hc: null }, nls.localize('editorDragAndDropBackground', "Background color when dragging editors around. The color should have transparency so that the editor contents can still shine through.")); +// < --- Resource Viewer --- > +export const IMAGE_PREVIEW_BORDER = registerColor('imagePreview.border', { + dark: Color.fromHex('#808080').transparent(0.35), + light: Color.fromHex('#808080').transparent(0.35), + hc: contrastBorder +}, nls.localize('imagePreviewBorder', "Border color for image in image preview.")); // < --- Panels --- > From 9e4a7e672c21cdaff678f6e408cd5244239a2789 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 11:25:09 +0200 Subject: [PATCH 0970/1449] clean postinstall --- build/azure-pipelines/darwin/product-build-darwin.yml | 3 --- build/azure-pipelines/linux/product-build-linux-alpine.yml | 2 -- build/azure-pipelines/linux/product-build-linux-arm.yml | 2 -- build/azure-pipelines/linux/product-build-linux.yml | 3 --- build/azure-pipelines/win32/product-build-win32.yml | 3 --- 5 files changed, 13 deletions(-) diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index ab3bd63d787..589df3a22e3 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -56,9 +56,6 @@ steps: - script: | set -e yarn postinstall - (cd build && yarn postinstall) - (cd extensions && yarn postinstall) - (cd test/smoke && yarn postinstall) displayName: Run postinstall scripts condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) diff --git a/build/azure-pipelines/linux/product-build-linux-alpine.yml b/build/azure-pipelines/linux/product-build-linux-alpine.yml index b85c9627be7..66acf1d42e3 100644 --- a/build/azure-pipelines/linux/product-build-linux-alpine.yml +++ b/build/azure-pipelines/linux/product-build-linux-alpine.yml @@ -65,8 +65,6 @@ steps: - script: | set -e yarn postinstall - (cd build && yarn postinstall) - (cd extensions && yarn postinstall) displayName: Run postinstall scripts condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) diff --git a/build/azure-pipelines/linux/product-build-linux-arm.yml b/build/azure-pipelines/linux/product-build-linux-arm.yml index 9fb0ba941a5..33519b1d704 100644 --- a/build/azure-pipelines/linux/product-build-linux-arm.yml +++ b/build/azure-pipelines/linux/product-build-linux-arm.yml @@ -65,8 +65,6 @@ steps: - script: | set -e yarn postinstall - (cd build && yarn postinstall) - (cd extensions && yarn postinstall) displayName: Run postinstall scripts condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 3d9624893ac..d13c1944678 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -57,9 +57,6 @@ steps: - script: | set -e yarn postinstall - (cd build && yarn postinstall) - (cd extensions && yarn postinstall) - (cd test/smoke && yarn postinstall) displayName: Run postinstall scripts condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 3764aad474a..5c0a21020b0 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -60,9 +60,6 @@ steps: . build/azure-pipelines/win32/exec.ps1 $ErrorActionPreference = "Stop" exec { yarn postinstall } - exec { pushd build ; yarn postinstall ; popd } - exec { pushd extensions ; yarn postinstall ; popd } - exec { pushd test\smoke ; yarn postinstall ; popd } displayName: Run postinstall scripts condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) From 5bcdd6643b81ec6aa7ae2cb26fc9cb4f4a3814fe Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 3 Jul 2019 11:58:49 +0200 Subject: [PATCH 0971/1449] use preload navigation --- .../browser/resourceServiceWorkerMain.ts | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts b/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts index 7002131ba5d..f1b1a56927c 100644 --- a/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts +++ b/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts @@ -27,23 +27,30 @@ }); self.addEventListener('fetch', (event: any) => { - event.respondWith(handlerPromise.then(handler => { - return handler.handleFetchEvent(event).then(value => { - if (value instanceof Response) { - return value; - } else { - return fetch(event.request); - } - }); + event.respondWith(handlerPromise.then(async handler => { + // try handler + const value = await handler.handleFetchEvent(event); + if (value instanceof Response) { + return value; + } + // try the network (prefetch or fetch) + const res = await event.preloadResponse; + if (res) { + return res; + } else { + return fetch(event.request); + } })); }); - self.addEventListener('install', event => { - //@ts-ignore - event.waitUntil(self.skipWaiting()); + self.addEventListener('install', (event: any) => { + event.waitUntil((self as any).skipWaiting()); }); - self.addEventListener('activate', event => { - //@ts-ignore - event.waitUntil(self.clients.claim()); // Become available to all pages + self.addEventListener('activate', (event: any) => { + + event.waitUntil((async () => { + await (self as any).registration.navigationPreload.enable(); // Enable navigation preloads! + await (self as any).clients.claim(); // Become available to all pages + })()); }); })(); From 6cee0791bfc013dff5647861788ddd6ead795a09 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 3 Jul 2019 11:57:51 +0200 Subject: [PATCH 0972/1449] Remove suppressImplicitAnyIndexErrors For. #76442 --- src/vs/code/node/cli.ts | 10 +++++---- src/vs/code/node/cliProcessMain.ts | 2 +- src/vs/editor/contrib/folding/foldingModel.ts | 2 +- .../environment/common/environment.ts | 3 +++ src/vs/platform/environment/node/argv.ts | 21 ++++++++++--------- src/vs/platform/history/common/history.ts | 6 +++--- .../platform/history/common/historyStorage.ts | 14 ++++++++++--- .../themes/browser/themes.contribution.ts | 4 ++-- .../services/themes/common/colorThemeData.ts | 9 ++++---- .../themes/common/fileIconThemeData.ts | 2 +- .../services/themes/common/plistParser.ts | 4 ++-- .../themes/common/themeCompatibility.ts | 3 ++- .../themes/common/workbenchThemeService.ts | 2 ++ 13 files changed, 50 insertions(+), 32 deletions(-) diff --git a/src/vs/code/node/cli.ts b/src/vs/code/node/cli.ts index 978ecdd42b8..afa7acafa94 100644 --- a/src/vs/code/node/cli.ts +++ b/src/vs/code/node/cli.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { spawn, ChildProcess } from 'child_process'; +import { spawn, ChildProcess, SpawnOptions } from 'child_process'; import { assign } from 'vs/base/common/objects'; import { buildHelpMessage, buildVersionMessage, addArg, createWaitMarkerFile } from 'vs/platform/environment/node/argv'; import { parseCLIProcessArgv } from 'vs/platform/environment/node/argvHelper'; @@ -19,6 +19,7 @@ import { resolveTerminalEncoding } from 'vs/base/node/encoding'; import * as iconv from 'iconv-lite'; import { isWindows } from 'vs/base/common/platform'; import { ProfilingSession, Target } from 'v8-inspect-profiler'; +import { isString } from 'vs/base/common/types'; function shouldSpawnCliProcess(argv: ParsedArgs): boolean { return !!argv['install-source'] @@ -339,14 +340,15 @@ export async function main(argv: string[]): Promise { }); } - if (args['js-flags']) { - const match = /max_old_space_size=(\d+)/g.exec(args['js-flags']); + const jsFlags = args['js-flags']; + if (isString(jsFlags)) { + const match = /max_old_space_size=(\d+)/g.exec(jsFlags); if (match && !args['max-memory']) { addArg(argv, `--max-memory=${match[1]}`); } } - const options = { + const options: SpawnOptions = { detached: true, env }; diff --git a/src/vs/code/node/cliProcessMain.ts b/src/vs/code/node/cliProcessMain.ts index 69ab16d03f7..9446ef00d59 100644 --- a/src/vs/code/node/cliProcessMain.ts +++ b/src/vs/code/node/cliProcessMain.ts @@ -85,7 +85,7 @@ export class Main { } else if (argv['install-extension']) { const arg = argv['install-extension']; const args: string[] = typeof arg === 'string' ? [arg] : arg; - await this.installExtensions(args, argv['force']); + await this.installExtensions(args, !!argv['force']); } else if (argv['uninstall-extension']) { const arg = argv['uninstall-extension']; diff --git a/src/vs/editor/contrib/folding/foldingModel.ts b/src/vs/editor/contrib/folding/foldingModel.ts index 0375be9f13f..70906b653eb 100644 --- a/src/vs/editor/contrib/folding/foldingModel.ts +++ b/src/vs/editor/contrib/folding/foldingModel.ts @@ -47,7 +47,7 @@ export class FoldingModel { if (!regions.length) { return; } - let processed = {}; + let processed: { [key: string]: boolean | undefined } = {}; this._decorationProvider.changeDecorations(accessor => { for (let region of regions) { let index = region.regionIndex; diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index dc75380ba18..2d2fdbb51cc 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -71,6 +71,9 @@ export interface ParsedArgs { 'disable-user-env-probe'?: boolean; 'enable-remote-auto-shutdown'?: boolean; 'disable-inspect'?: boolean; + 'force'?: boolean; + 'js-flags'?: boolean; + 'gitCredential'?: string; } export const IEnvironmentService = createDecorator('environmentService'); diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts index f78e5d7cc62..3cdfd35e417 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts @@ -14,11 +14,11 @@ import { writeFileSync } from 'vs/base/node/pfs'; * This code is also used by standalone cli's. Avoid adding any other dependencies. */ -class HelpCategories { - o = localize('optionsUpperCase', "Options"); - e = localize('extensionsManagement', "Extensions Management"); - t = localize('troubleshooting', "Troubleshooting"); -} +const helpCategories = { + o: localize('optionsUpperCase', "Options"), + e: localize('extensionsManagement', "Extensions Management"), + t: localize('troubleshooting', "Troubleshooting") +}; export interface Option { id: string; @@ -27,7 +27,7 @@ export interface Option { deprecates?: string; // old deprecated id args?: string | string[]; description?: string; - cat?: keyof HelpCategories; + cat?: keyof typeof helpCategories; } export const options: Option[] = [ @@ -94,6 +94,7 @@ export const options: Option[] = [ { id: 'trace-category-filter', type: 'string' }, { id: 'trace-options', type: 'string' }, { id: 'prof-code-loading', type: 'boolean' }, + { id: 'js-flags', type: 'string' }, { id: '_', type: 'string' } ]; @@ -189,8 +190,6 @@ function wrapText(text: string, columns: number): string[] { export function buildHelpMessage(productName: string, executableName: string, version: string, isOptionSupported = (_: Option) => true, isPipeSupported = true): string { const columns = (process.stdout).isTTY && (process.stdout).columns || 80; - let categories = new HelpCategories(); - let help = [`${productName} ${version}`]; help.push(''); help.push(`${localize('usage', "Usage")}: ${executableName} [${localize('options', "options")}][${localize('paths', 'paths')}...]`); @@ -203,10 +202,12 @@ export function buildHelpMessage(productName: string, executableName: string, ve } help.push(''); } - for (const key in categories) { + for (let helpCategoryKey in helpCategories) { + const key = helpCategoryKey; + let categoryOptions = options.filter(o => !!o.description && o.cat === key && isOptionSupported(o)); if (categoryOptions.length) { - help.push(categories[key as keyof HelpCategories]); + help.push(helpCategories[key]); help.push(...formatOptions(categoryOptions, columns)); help.push(''); } diff --git a/src/vs/platform/history/common/history.ts b/src/vs/platform/history/common/history.ts index 2d7a8e08611..d2ea48abad1 100644 --- a/src/vs/platform/history/common/history.ts +++ b/src/vs/platform/history/common/history.ts @@ -34,15 +34,15 @@ export interface IRecentFile { } export function isRecentWorkspace(curr: IRecent): curr is IRecentWorkspace { - return !!curr['workspace']; + return curr.hasOwnProperty('workspace'); } export function isRecentFolder(curr: IRecent): curr is IRecentFolder { - return !!curr['folderUri']; + return curr.hasOwnProperty('folderUri'); } export function isRecentFile(curr: IRecent): curr is IRecentFile { - return !!curr['fileUri']; + return curr.hasOwnProperty('fileUri'); } diff --git a/src/vs/platform/history/common/historyStorage.ts b/src/vs/platform/history/common/historyStorage.ts index c9175cdb919..2d5f47f3981 100644 --- a/src/vs/platform/history/common/historyStorage.ts +++ b/src/vs/platform/history/common/historyStorage.ts @@ -21,6 +21,14 @@ interface ILegacySerializedRecentlyOpened { interface ISerializedWorkspace { id: string; configURIPath: string; } interface ILegacySerializedWorkspace { id: string; configPath: string; } +function isLegacySerializedWorkspace(curr: any): curr is ILegacySerializedWorkspace { + return typeof curr === 'object' && typeof curr['id'] === 'string' && typeof curr['configPath'] === 'string'; +} + +function isUriComponents(curr: any): curr is UriComponents { + return curr && typeof curr['path'] === 'string' && typeof curr['scheme'] === 'string'; +} + export type RecentlyOpenedStorageData = object; export function restoreRecentlyOpened(data: RecentlyOpenedStorageData | undefined): IRecentlyOpened { @@ -51,9 +59,9 @@ export function restoreRecentlyOpened(data: RecentlyOpenedStorageData | undefine for (const workspace of storedRecents.workspaces) { if (typeof workspace === 'string') { result.workspaces.push({ folderUri: URI.file(workspace) }); - } else if (typeof workspace === 'object' && typeof workspace['id'] === 'string' && typeof workspace['configPath'] === 'string') { - result.workspaces.push({ workspace: { id: workspace['id'], configPath: URI.file(workspace['configPath']) } }); - } else if (workspace && typeof workspace['path'] === 'string' && typeof workspace['scheme'] === 'string') { + } else if (isLegacySerializedWorkspace(workspace)) { + result.workspaces.push({ workspace: { id: workspace.id, configPath: URI.file(workspace.configPath) } }); + } else if (isUriComponents(window)) { // added by 1.26-insiders result.workspaces.push({ folderUri: URI.revive(workspace) }); } diff --git a/src/vs/workbench/contrib/themes/browser/themes.contribution.ts b/src/vs/workbench/contrib/themes/browser/themes.contribution.ts index afb4012f4f3..5026e50adad 100644 --- a/src/vs/workbench/contrib/themes/browser/themes.contribution.ts +++ b/src/vs/workbench/contrib/themes/browser/themes.contribution.ts @@ -181,7 +181,7 @@ interface ThemeItem { } function isItem(i: QuickPickInput): i is ThemeItem { - return i['type'] !== 'separatpr'; + return (i)['type'] !== 'separator'; } function toEntries(themes: Array, label?: string): QuickPickInput[] { @@ -212,7 +212,7 @@ class GenerateColorThemeAction extends Action { let theme = this.themeService.getColorTheme(); let colors = Registry.as(ColorRegistryExtensions.ColorContribution).getColors(); let colorIds = colors.map(c => c.id).sort(); - let resultingColors = {}; + let resultingColors: { [key: string]: string } = {}; let inherited: string[] = []; for (let colorId of colorIds) { const color = theme.getColor(colorId, false); diff --git a/src/vs/workbench/services/themes/common/colorThemeData.ts b/src/vs/workbench/services/themes/common/colorThemeData.ts index 08253f09445..6d39ebd157e 100644 --- a/src/vs/workbench/services/themes/common/colorThemeData.ts +++ b/src/vs/workbench/services/themes/common/colorThemeData.ts @@ -23,7 +23,7 @@ import { startsWith } from 'vs/base/common/strings'; let colorRegistry = Registry.as(Extensions.ColorContribution); -const tokenGroupToScopesMap: { [setting: string]: string[] } = { +const tokenGroupToScopesMap = { comments: ['comment'], strings: ['string'], keywords: ['keyword - keyword.operator', 'keyword.control', 'storage', 'storage.type'], @@ -146,10 +146,11 @@ export class ColorThemeData implements IColorTheme { // Put the general customizations such as comments, strings, etc. first so that // they can be overridden by specific customizations like "string.interpolated" for (let tokenGroup in tokenGroupToScopesMap) { - let value = customTokenColors[tokenGroup]; + const group = tokenGroup; // TS doesn't type 'tokenGroup' properly + let value = customTokenColors[group]; if (value) { let settings = typeof value === 'string' ? { foreground: value } : value; - let scopes = tokenGroupToScopesMap[tokenGroup]; + let scopes = tokenGroupToScopesMap[group]; for (let scope of scopes) { this.customTokenColors.push({ scope, settings }); } @@ -186,7 +187,7 @@ export class ColorThemeData implements IColorTheme { } toStorageData() { - let colorMapData = {}; + let colorMapData: { [key: string]: string } = {}; for (let key in this.colorMap) { colorMapData[key] = Color.Format.CSS.formatHexA(this.colorMap[key], true); } diff --git a/src/vs/workbench/services/themes/common/fileIconThemeData.ts b/src/vs/workbench/services/themes/common/fileIconThemeData.ts index 306d58f9155..efdaaaef68c 100644 --- a/src/vs/workbench/services/themes/common/fileIconThemeData.ts +++ b/src/vs/workbench/services/themes/common/fileIconThemeData.ts @@ -366,5 +366,5 @@ function _processIconThemeDocument(id: string, iconThemeDocumentLocation: URI, i return result; } function escapeCSS(str: string) { - return window['CSS'].escape(str); + return (window)['CSS'].escape(str); } diff --git a/src/vs/workbench/services/themes/common/plistParser.ts b/src/vs/workbench/services/themes/common/plistParser.ts index e4478a5ecf6..6825c65147b 100644 --- a/src/vs/workbench/services/themes/common/plistParser.ts +++ b/src/vs/workbench/services/themes/common/plistParser.ts @@ -143,7 +143,7 @@ function _parse(content: string, filename: string | null, locationKeyName: strin if (curKey === null) { return fail('missing '); } - let newDict = {}; + let newDict: { [key: string]: any } = {}; if (locationKeyName !== null) { newDict[locationKeyName] = { filename: filename, @@ -168,7 +168,7 @@ function _parse(content: string, filename: string | null, locationKeyName: strin const arrState = { enterDict: function () { - let newDict = {}; + let newDict: { [key: string]: any } = {}; if (locationKeyName !== null) { newDict[locationKeyName] = { filename: filename, diff --git a/src/vs/workbench/services/themes/common/themeCompatibility.ts b/src/vs/workbench/services/themes/common/themeCompatibility.ts index 577b32e4206..6518ff4a4ac 100644 --- a/src/vs/workbench/services/themes/common/themeCompatibility.ts +++ b/src/vs/workbench/services/themes/common/themeCompatibility.ts @@ -26,7 +26,8 @@ export function convertSettings(oldSettings: ITokenColorizationRule[], resultRul if (!settings) { rule.settings = {}; } else { - for (let key in settings) { + for (const settingKey in settings) { + const key = settingKey; let mappings = settingToColorIdMapping[key]; if (mappings) { let colorHex = settings[key]; diff --git a/src/vs/workbench/services/themes/common/workbenchThemeService.ts b/src/vs/workbench/services/themes/common/workbenchThemeService.ts index 831b8ad3391..deb116b60f8 100644 --- a/src/vs/workbench/services/themes/common/workbenchThemeService.ts +++ b/src/vs/workbench/services/themes/common/workbenchThemeService.ts @@ -69,6 +69,7 @@ export interface IColorCustomizations { } export interface ITokenColorCustomizations { + [groupIdOrThemeSettingsId: string]: string | ITokenColorizationSetting | ITokenColorCustomizations | undefined | ITokenColorizationRule[]; comments?: string | ITokenColorizationSetting; strings?: string | ITokenColorizationSetting; numbers?: string | ITokenColorizationSetting; @@ -103,5 +104,6 @@ export interface IThemeExtensionPoint { label?: string; description?: string; path: string; + uiTheme?: typeof VS_LIGHT_THEME | typeof VS_DARK_THEME | typeof VS_HC_THEME; _watch: boolean; // unsupported options to watch location } \ No newline at end of file From 191756a0404819033654c00528a69bf9b88613e9 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 3 Jul 2019 12:43:11 +0200 Subject: [PATCH 0973/1449] Option.key: keyof ParsedArgs --- src/vs/code/test/node/argv.test.ts | 27 ++++++++++--------- .../environment/common/environment.ts | 5 +++- src/vs/platform/environment/node/argv.ts | 13 +++++---- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/vs/code/test/node/argv.test.ts b/src/vs/code/test/node/argv.test.ts index 6ce5684fab0..6ac49bc9988 100644 --- a/src/vs/code/test/node/argv.test.ts +++ b/src/vs/code/test/node/argv.test.ts @@ -4,10 +4,11 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; import { formatOptions, Option, addArg } from 'vs/platform/environment/node/argv'; +import { ParsedArgs } from 'vs/platform/environment/common/environment'; suite('formatOptions', () => { - function o(id: string, description: string): Option { + function o(id: keyof ParsedArgs, description: string): Option { return { id, description, type: 'string' }; @@ -16,30 +17,30 @@ suite('formatOptions', () => { test('Text should display small columns correctly', () => { assert.deepEqual( formatOptions([ - o('foo', 'bar') + o('add', 'bar') ], 80), - [' --foo bar'] + [' --add bar'] ); assert.deepEqual( formatOptions([ - o('f', 'bar'), - o('fo', 'ba'), - o('foo', 'b') + o('add', 'bar'), + o('wait', 'ba'), + o('trace', 'b') ], 80), [ - ' --f bar', - ' --fo ba', - ' --foo b' + ' --add bar', + ' --wait ba', + ' --trace b' ]); }); test('Text should wrap', () => { assert.deepEqual( formatOptions([ - o('foo', ('bar ').repeat(9)) + o('add', ('bar ').repeat(9)) ], 40), [ - ' --foo bar bar bar bar bar bar bar bar', + ' --add bar bar bar bar bar bar bar bar', ' bar' ]); }); @@ -47,10 +48,10 @@ suite('formatOptions', () => { test('Text should revert to the condensed view when the terminal is too narrow', () => { assert.deepEqual( formatOptions([ - o('foo', ('bar ').repeat(9)) + o('add', ('bar ').repeat(9)) ], 30), [ - ' --foo', + ' --add', ' bar bar bar bar bar bar bar bar bar ' ]); }); diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index 2d2fdbb51cc..e442d7ad0ef 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -72,8 +72,11 @@ export interface ParsedArgs { 'enable-remote-auto-shutdown'?: boolean; 'disable-inspect'?: boolean; 'force'?: boolean; - 'js-flags'?: boolean; 'gitCredential'?: string; + // node flags + 'js-flags'?: boolean; + 'disable-gpu'?: boolean; + 'nolazy'?: boolean; } export const IEnvironmentService = createDecorator('environmentService'); diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts index 3cdfd35e417..71d6e6cc882 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts @@ -21,7 +21,7 @@ const helpCategories = { }; export interface Option { - id: string; + id: keyof ParsedArgs; type: 'boolean' | 'string'; alias?: string; deprecates?: string; // old deprecated id @@ -29,7 +29,7 @@ export interface Option { description?: string; cat?: keyof typeof helpCategories; } - +//_urls export const options: Option[] = [ { id: 'diff', type: 'boolean', cat: 'o', alias: 'd', args: ['file', 'file'], description: localize('diff', "Compare two files with each other.") }, { id: 'add', type: 'boolean', cat: 'o', alias: 'a', args: 'folder', description: localize('add', "Add folder(s) to the last active window.") }, @@ -85,17 +85,16 @@ export const options: Option[] = [ { id: 'skip-add-to-recently-opened', type: 'boolean' }, { id: 'unity-launch', type: 'boolean' }, { id: 'open-url', type: 'boolean' }, - { id: 'nolazy', type: 'boolean' }, - { id: 'issue', type: 'boolean' }, { id: 'file-write', type: 'boolean' }, { id: 'file-chmod', type: 'boolean' }, { id: 'driver-verbose', type: 'boolean' }, { id: 'force', type: 'boolean' }, { id: 'trace-category-filter', type: 'string' }, { id: 'trace-options', type: 'string' }, - { id: 'prof-code-loading', type: 'boolean' }, - { id: 'js-flags', type: 'string' }, - { id: '_', type: 'string' } + { id: '_', type: 'string' }, + + { id: 'js-flags', type: 'string' }, // chrome js flags + { id: 'nolazy', type: 'boolean' }, // node inspect ]; export function parseArgs(args: string[], isOptionSupported = (_: Option) => true): ParsedArgs { From 53fa2618179ab404f9bcb5daccfe2bb7e5e1aeaa Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 3 Jul 2019 12:56:25 +0200 Subject: [PATCH 0974/1449] remote - sync package.json with main --- remote/package.json | 8 ++++---- remote/yarn.lock | 38 +++++++++++++++++++------------------- vscode-electron-5.0.x | 1 + 3 files changed, 24 insertions(+), 23 deletions(-) create mode 160000 vscode-electron-5.0.x diff --git a/remote/package.json b/remote/package.json index 2dff7439783..c8c31cd7920 100644 --- a/remote/package.json +++ b/remote/package.json @@ -3,11 +3,11 @@ "version": "0.0.0", "dependencies": { "applicationinsights": "1.0.8", - "getmac": "^1.4.6", + "getmac": "1.4.1", "graceful-fs": "4.1.11", "http-proxy-agent": "^2.1.0", "https-proxy-agent": "^2.2.1", - "iconv-lite": "0.4.23", + "iconv-lite": "0.5.0", "jschardet": "1.6.0", "keytar": "4.2.1", "minimist": "1.2.0", @@ -19,9 +19,9 @@ "spdlog": "^0.9.0", "vscode-chokidar": "1.6.5", "vscode-proxy-agent": "0.4.0", - "vscode-ripgrep": "^1.2.5", + "vscode-ripgrep": "^1.3.1", "vscode-textmate": "^4.1.1", - "xterm": "3.15.0-beta34", + "xterm": "3.15.0-beta50", "xterm-addon-search": "0.1.0-beta6", "xterm-addon-web-links": "0.1.0-beta10", "yauzl": "^2.9.2", diff --git a/remote/yarn.lock b/remote/yarn.lock index 883fec5d65d..0924b99c5f3 100644 --- a/remote/yarn.lock +++ b/remote/yarn.lock @@ -209,12 +209,12 @@ eachr@^3.2.0: editions "^1.1.1" typechecker "^4.3.0" -editions@^1.1.1: +editions@^1.1.1, editions@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" integrity sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg== -editions@^2.0.2, editions@^2.1.0, editions@^2.1.2: +editions@^2.1.0, editions@^2.1.2: version "2.1.3" resolved "https://registry.yarnpkg.com/editions/-/editions-2.1.3.tgz#727ccf3ec2c7b12dcc652c71000f16c4824d6f7d" integrity sha512-xDZyVm0A4nLgMNWVVLJvcwMjI80ShiH/27RyLiCnW1L273TcJIA25C4pwJ33AWV01OX6UriP35Xu+lH4S7HWQw== @@ -351,12 +351,12 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -getmac@^1.4.6: - version "1.4.6" - resolved "https://registry.yarnpkg.com/getmac/-/getmac-1.4.6.tgz#ffe7db07900e222916939d44e4c7274adbecc662" - integrity sha512-3JPwiIr4P6Sgr6y6SVXX0+l2mrB6pyf4Cdyua7rvEV7SveWQkAp11vrkNym8wvRxzLrBenKRcwe93asdghuwWg== +getmac@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/getmac/-/getmac-1.4.1.tgz#cfefcb3ee7d7a73cba5292129cb100c19afbe17a" + integrity sha512-mQp+8D+grQX0gG8EJn6VfH0PxE56ZKNsTguOMxPShAiVk9lvH8Ey36eXepG705Ac1HCsvaSrQ/6bPHZ0++F/Mg== dependencies: - editions "^2.0.2" + editions "^1.3.4" extract-opts "^3.2.0" github-from-package@0.0.0: @@ -410,10 +410,10 @@ https-proxy-agent@2.2.1, https-proxy-agent@^2.2.1: agent-base "^4.1.0" debug "^3.1.0" -iconv-lite@0.4.23: - version "0.4.23" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" - integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== +iconv-lite@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.5.0.tgz#59cdde0a2a297cc2aeb0c6445a195ee89f127550" + integrity sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw== dependencies: safer-buffer ">= 2.1.2 < 3" @@ -1098,10 +1098,10 @@ vscode-proxy-agent@0.4.0: https-proxy-agent "2.2.1" socks-proxy-agent "4.0.1" -vscode-ripgrep@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/vscode-ripgrep/-/vscode-ripgrep-1.2.5.tgz#2093c8f36d52bd2dab9eb45b003dd02533c5499c" - integrity sha512-n5XBm9od5hahpljw9T8wbkuMnAY7LlAG1OyEEtcCZEX9aCHFuBKSP0IcvciGRTbtWRovNuT83A2iRjt6PL3bLg== +vscode-ripgrep@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/vscode-ripgrep/-/vscode-ripgrep-1.3.1.tgz#51fb93debcd0c18a8b90dbc37f84f94333d0c486" + integrity sha512-4WLB/n4ZeWNi5AEzPTkfYrqbKtXlv0SlgmxbRVdulwZzGx/lfWeWPu9Shy32orM27IofQAQDuirbRBOYNJVzBA== vscode-textmate@^4.1.1: version "4.1.1" @@ -1156,10 +1156,10 @@ xterm-addon-web-links@0.1.0-beta10: resolved "https://registry.yarnpkg.com/xterm-addon-web-links/-/xterm-addon-web-links-0.1.0-beta10.tgz#610fa9773a2a5ccd41c1c83ba0e2dd2c9eb66a23" integrity sha512-xfpjy0V6bB4BR44qIgZQPoCMVakxb65gMscPkHpO//QxvUxKzabV3dxOsIbeZRFkUGsWTFlvz2OoaBLoNtv5gg== -xterm@3.15.0-beta34: - version "3.15.0-beta34" - resolved "https://registry.yarnpkg.com/xterm/-/xterm-3.15.0-beta34.tgz#32ca9523f842cfc213bf64cbb199bb9adaddcd2d" - integrity sha512-eqq/K002xVCfYXZggbI7v7dRgRKTvJhVFTHqcs6MdMHuiOYl4lwZFkv4aFf896kkbnKQOZZGGzhnBFfa1w1rTA== +xterm@3.15.0-beta50: + version "3.15.0-beta50" + resolved "https://registry.yarnpkg.com/xterm/-/xterm-3.15.0-beta50.tgz#6413057fe36ff5808a41eba337f83076144d5c10" + integrity sha512-LAJ8kP3U8oXnVR3uaL4NxNFKcFDt3Zoec53hgYppwW8P5LdmL/dc0eDpgqiEsPLx4GgD37d8J92EcoMzKs2vVw== yauzl@^2.9.2: version "2.10.0" diff --git a/vscode-electron-5.0.x b/vscode-electron-5.0.x new file mode 160000 index 00000000000..767a6b354a8 --- /dev/null +++ b/vscode-electron-5.0.x @@ -0,0 +1 @@ +Subproject commit 767a6b354a85af60c170ad0924c105e7ece86d37 From 9622565cc13a31aa530eaf19679e1301f9e885cb Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 3 Jul 2019 13:58:49 +0200 Subject: [PATCH 0975/1449] remove accidentally added submodule --- vscode-electron-5.0.x | 1 - 1 file changed, 1 deletion(-) delete mode 160000 vscode-electron-5.0.x diff --git a/vscode-electron-5.0.x b/vscode-electron-5.0.x deleted file mode 160000 index 767a6b354a8..00000000000 --- a/vscode-electron-5.0.x +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 767a6b354a85af60c170ad0924c105e7ece86d37 From 62fefa2451e9fff30f770175d3dc3019a2fbd0d1 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 3 Jul 2019 14:11:28 +0200 Subject: [PATCH 0976/1449] User data changes - Introduce containers - Write tests for file user data provider --- .../userData/common/fileUserDataProvider.ts | 12 +- .../services/userData/common/userData.ts | 38 +- .../common/userDataFileSystemProvider.ts | 65 ++- .../fileUserDataProvider.test.ts | 408 ++++++++++++++++++ 4 files changed, 501 insertions(+), 22 deletions(-) create mode 100644 src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts diff --git a/src/vs/workbench/services/userData/common/fileUserDataProvider.ts b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts index b842b0f7165..fb6e86576c8 100644 --- a/src/vs/workbench/services/userData/common/fileUserDataProvider.ts +++ b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts @@ -45,16 +45,8 @@ export class FileUserDataProvider extends Disposable implements IUserDataProvide async readFile(path: string): Promise { const resource = this.toResource(path); - try { - const content = await this.fileService.readFile(resource); - return content.value.buffer; - } catch (e) { - const exists = await this.fileService.exists(resource); - if (exists) { - throw e; - } - } - return VSBuffer.fromString('').buffer; + const content = await this.fileService.readFile(resource); + return content.value.buffer; } writeFile(path: string, value: Uint8Array): Promise { diff --git a/src/vs/workbench/services/userData/common/userData.ts b/src/vs/workbench/services/userData/common/userData.ts index dc448d2c9c5..ae21a5c8bd3 100644 --- a/src/vs/workbench/services/userData/common/userData.ts +++ b/src/vs/workbench/services/userData/common/userData.ts @@ -4,6 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { Event } from 'vs/base/common/event'; +import { TernarySearchTree } from 'vs/base/common/map'; +import { Registry } from 'vs/platform/registry/common/platform'; /** * The userDataProvider is used to handle user specific application @@ -61,4 +63,38 @@ export interface IUserDataProvider { * Throw an error if the path does not exist or points to a file. */ listFiles(path: string): Promise; -} \ No newline at end of file +} + +export interface IUserDataContainerRegistry { + + /** + * Register the given path as an user data container if user data files are stored under this path. + * + * It is required to register the container to access the user data files under the container. + */ + registerContainer(path: string): void; + + /** + * Returns true if the given path is an user data container. + */ + isContainer(path: string): boolean; +} + +class UserDataContainerRegistry implements IUserDataContainerRegistry { + + private containers: TernarySearchTree = TernarySearchTree.forStrings(); + + public registerContainer(path: string): void { + this.containers.set(path, path); + } + + isContainer(path: string): boolean { + return !!this.containers.get(path) || !!this.containers.findSuperstr(path); + } +} + +export const Extensions = { + UserDataContainers: 'workbench.contributions.userDataContainers' +}; + +Registry.add(Extensions.UserDataContainers, new UserDataContainerRegistry()); \ No newline at end of file diff --git a/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts b/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts index ad1be9760c8..bf6f7029a99 100644 --- a/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts +++ b/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts @@ -5,11 +5,12 @@ import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; import { FileSystemProviderCapabilities, FileWriteOptions, IStat, FileType, FileDeleteOptions, IWatchOptions, FileOverwriteOptions, IFileSystemProviderWithFileReadWriteCapability, IFileChange, FileChangesEvent, FileChangeType } from 'vs/platform/files/common/files'; -import { IUserDataProvider } from 'vs/workbench/services/userData/common/userData'; +import { IUserDataProvider, IUserDataContainerRegistry, Extensions } from 'vs/workbench/services/userData/common/userData'; import { URI } from 'vs/base/common/uri'; import { Event, Emitter } from 'vs/base/common/event'; import { TernarySearchTree } from 'vs/base/common/map'; import { startsWith } from 'vs/base/common/strings'; +import { Registry } from 'vs/platform/registry/common/platform'; export class UserDataFileSystemProvider extends Disposable implements IFileSystemProviderWithFileReadWriteCapability { @@ -32,11 +33,11 @@ export class UserDataFileSystemProvider extends Disposable implements IFileSyste watch(resource: URI, opts: IWatchOptions): IDisposable { const path = this.toPath(resource); if (!path) { - throw new Error(`Invalud user data resource ${resource}`); + throw new Error(`Invalid user data resource ${resource}`); } return this.userDataProvider.onDidChangeFile(e => { if (new UserDataChangesEvent(e).contains(path)) { - this.versions.set(path, (this.versions.get(path) || 1) + 1); + this.versions.set(path, this.getOrSetVersion(path) + 1); this._onDidChangeFile.fire(new FileChangesEvent([{ resource, type: FileChangeType.UPDATED }]).changes); } }); @@ -44,25 +45,36 @@ export class UserDataFileSystemProvider extends Disposable implements IFileSyste async stat(resource: URI): Promise { const path = this.toPath(resource); - if (!path) { - throw new Error(`Invalud user data resource ${resource}`); + if (path === undefined) { + throw new Error(`Invalid user data resource ${resource}`); } + if (this.isContainer(path)) { + return { + type: FileType.Directory, + ctime: 0, + mtime: this.getOrSetVersion(path), + size: 0 + }; + } + const result = await this.readFile(resource); return { type: FileType.File, ctime: 0, - mtime: this.versions.get(path) || 0, - size: 0 + mtime: this.getOrSetVersion(path), + size: result.byteLength }; } mkdir(resource: URI): Promise { throw new Error('not supported'); } - delete(resource: URI, opts: FileDeleteOptions): Promise { throw new Error('not supported'); } rename(from: URI, to: URI, opts: FileOverwriteOptions): Promise { throw new Error('not supported'); } async readFile(resource: URI): Promise { const path = this.toPath(resource); if (!path) { - throw new Error(`Invalud user data resource ${resource}`); + throw new Error(`Invalid user data resource ${resource}`); + } + if (this.isContainer(path)) { + throw new Error(`Invalid user data file ${resource}`); } return this.userDataProvider.readFile(path); } @@ -70,7 +82,10 @@ export class UserDataFileSystemProvider extends Disposable implements IFileSyste async readdir(resource: URI): Promise<[string, FileType][]> { const path = this.toPath(resource); if (!path) { - throw new Error(`Invalud user data resource ${resource}`); + throw new Error(`Invalid user data resource ${resource}`); + } + if (!this.isContainer(path)) { + throw new Error(`Invalid user data container ${resource}`); } const children = await this.userDataProvider.listFiles(path); return children.map(c => [c, FileType.Unknown]); @@ -79,11 +94,39 @@ export class UserDataFileSystemProvider extends Disposable implements IFileSyste writeFile(resource: URI, content: Uint8Array, opts: FileWriteOptions): Promise { const path = this.toPath(resource); if (!path) { - throw new Error(`Invalud user data resource ${resource}`); + throw new Error(`Invalid user data resource ${resource}`); + } + if (this.isContainer(path)) { + throw new Error(`Invalid user data file ${resource}`); } return this.userDataProvider.writeFile(path, content); } + delete(resource: URI, opts: FileDeleteOptions): Promise { + const path = this.toPath(resource); + if (!path) { + throw new Error(`Invalid user data resource ${resource}`); + } + if (this.isContainer(path)) { + throw new Error(`Invalid user data file ${resource}`); + } + return this.userDataProvider.deleteFile(path); + } + + private getOrSetVersion(path: string): number { + if (!this.versions.has(path)) { + this.versions.set(path, 1); + } + return this.versions.get(path)!; + } + + private isContainer(path: string): boolean { + if (path === '') { + return true; // Root + } + return Registry.as(Extensions.UserDataContainers).isContainer(path); + } + private toPath(resource: URI): string | undefined { const resourcePath = resource.toString(); const userDataHomePath = this.userDataHome.toString(); diff --git a/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts b/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts new file mode 100644 index 00000000000..60aeb74a31f --- /dev/null +++ b/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts @@ -0,0 +1,408 @@ +/*--------------------------------------------------------------------------------------------- + * 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 os from 'os'; +import * as path from 'vs/base/common/path'; +import * as uuid from 'vs/base/common/uuid'; +import * as pfs from 'vs/base/node/pfs'; +import { IFileService } from 'vs/platform/files/common/files'; +import { FileService } from 'vs/workbench/services/files/common/fileService'; +import { NullLogService } from 'vs/platform/log/common/log'; +import { Schemas } from 'vs/base/common/network'; +import { UserDataFileSystemProvider } from 'vs/workbench/services/userData/common/userDataFileSystemProvider'; +import { URI } from 'vs/base/common/uri'; +import { FileUserDataProvider } from 'vs/workbench/services/userData/common/fileUserDataProvider'; +import { joinPath } from 'vs/base/common/resources'; +import { VSBuffer } from 'vs/base/common/buffer'; +import { DiskFileSystemProvider } from 'vs/workbench/services/files/electron-browser/diskFileSystemProvider'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { IUserDataContainerRegistry, Extensions } from 'vs/workbench/services/userData/common/userData'; + +suite('UserDataFileSystemProvider', () => { + + let testObject: IFileService; + let userDataPath: string; + let userDataResource: URI; + const userDataContainersRegistry = Registry.as(Extensions.UserDataContainers); + + setup(() => { + const logService = new NullLogService(); + testObject = new FileService(logService); + testObject.registerProvider(Schemas.file, new DiskFileSystemProvider(logService)); + userDataPath = path.join(os.tmpdir(), 'vsctests', uuid.generateUuid()); + userDataResource = URI.from({ scheme: Schemas.userData, path: '/user' }); + testObject.registerProvider(Schemas.userData, new UserDataFileSystemProvider(userDataResource, new FileUserDataProvider(URI.file(userDataPath), testObject))); + userDataContainersRegistry.registerContainer('testContainer'); + return pfs.mkdirp(userDataPath); + }); + + teardown(() => { + return pfs.rimraf(userDataPath, pfs.RimRafMode.MOVE); + }); + + test('exists return false when file does not exist', async () => { + const exists = await testObject.exists(joinPath(userDataResource, 'settings.json')); + assert.equal(exists, false); + }); + + test('read file throws error if not exist', async () => { + try { + await testObject.readFile(joinPath(userDataResource, 'settings.json')); + assert.fail('Should fail since file does not exist'); + } catch (e) { } + }); + + test('read existing file', async () => { + await pfs.writeFile(path.join(userDataPath, 'settings.json'), '{}'); + const result = await testObject.readFile(joinPath(userDataResource, 'settings.json')); + assert.equal(result.value, '{}'); + }); + + test('create file', async () => { + await testObject.createFile(joinPath(userDataResource, 'settings.json'), VSBuffer.fromString('{}')); + const result = await pfs.readFile(path.join(userDataPath, 'settings.json')); + assert.equal(result, '{}'); + }); + + test('write file creates the file if not exist', async () => { + await testObject.writeFile(joinPath(userDataResource, 'settings.json'), VSBuffer.fromString('{}')); + const result = await pfs.readFile(path.join(userDataPath, 'settings.json')); + assert.equal(result, '{}'); + }); + + test('write to existing file', async () => { + await pfs.writeFile(path.join(userDataPath, 'settings.json'), '{}'); + await testObject.writeFile(joinPath(userDataResource, 'settings.json'), VSBuffer.fromString('{a:1}')); + const result = await pfs.readFile(path.join(userDataPath, 'settings.json')); + assert.equal(result, '{a:1}'); + }); + + test('watch file - event is triggerred when file is created', async (done) => { + const resource = joinPath(userDataResource, 'settings.json'); + const disposable = testObject.watch(resource); + testObject.onFileChanges(e => { + if (e.contains(resource)) { + disposable.dispose(); + done(); + } + }); + await testObject.writeFile(resource, VSBuffer.fromString('{a:1}')); + }); + + test('watch file - event is triggerred when file is created externally', async (done) => { + const resource = joinPath(userDataResource, 'settings.json'); + const disposable = testObject.watch(resource); + testObject.onFileChanges(e => { + if (e.contains(resource)) { + disposable.dispose(); + done(); + } + }); + await pfs.writeFile(path.join(userDataPath, 'settings.json'), '{}'); + }); + + test('watch file - event is triggerred when file is updated', async (done) => { + const resource = joinPath(userDataResource, 'settings.json'); + await testObject.writeFile(resource, VSBuffer.fromString('{}')); + const disposable = testObject.watch(resource); + testObject.onFileChanges(e => { + if (e.contains(resource)) { + disposable.dispose(); + done(); + } + }); + await testObject.writeFile(resource, VSBuffer.fromString('{a:1}')); + }); + + test('watch file - event is triggerred when file is update externally', async (done) => { + const resource = joinPath(userDataResource, 'settings.json'); + await testObject.writeFile(resource, VSBuffer.fromString('{}')); + const disposable = testObject.watch(resource); + testObject.onFileChanges(e => { + if (e.contains(resource)) { + disposable.dispose(); + done(); + } + }); + await pfs.writeFile(path.join(userDataPath, 'settings.json'), '{a:1}'); + }); + + test('watch file - event is triggerred when file is deleted', async (done) => { + const resource = joinPath(userDataResource, 'settings.json'); + await testObject.writeFile(resource, VSBuffer.fromString('{}')); + const disposable = testObject.watch(resource); + testObject.onFileChanges(e => { + if (e.contains(resource)) { + disposable.dispose(); + done(); + } + }); + await testObject.del(resource); + }); + + test('watch file - event is triggerred when file is deleted externally', async (done) => { + const resource = joinPath(userDataResource, 'settings.json'); + await testObject.writeFile(resource, VSBuffer.fromString('{}')); + const disposable = testObject.watch(resource); + testObject.onFileChanges(e => { + if (e.contains(resource)) { + disposable.dispose(); + done(); + } + }); + await pfs.unlink(path.join(userDataPath, 'settings.json')); + }); + + test('delete file', async () => { + await pfs.writeFile(path.join(userDataPath, 'settings.json'), ''); + await testObject.del(joinPath(userDataResource, 'settings.json')); + const result = await pfs.exists(path.join(userDataPath, 'settings.json')); + assert.equal(false, result); + }); + + test('exists return true for container', async () => { + const exists = await testObject.exists(joinPath(userDataResource, 'testContainer')); + assert.equal(exists, true); + }); + + test('exists return false for non registered container', async () => { + await pfs.mkdirp(path.join(userDataPath, 'container')); + const exists = await testObject.exists(joinPath(userDataResource, 'container')); + assert.equal(exists, false); + }); + + test('read file throws error for container', async () => { + try { + await testObject.readFile(joinPath(userDataResource, 'testContainer')); + assert.fail('Should fail since read file is not supported for container'); + } catch (e) { } + }); + + test('read file under container', async () => { + await pfs.mkdirp(path.join(userDataPath, 'testContainer')); + await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); + const actual = await testObject.readFile(joinPath(userDataResource, 'testContainer/settings.json')); + assert.equal(actual.value, '{}'); + }); + + test('create file throws error for container', async () => { + try { + await testObject.createFile(joinPath(userDataResource, 'testContainer'), VSBuffer.fromString('{}')); + assert.fail('Should fail since create file is not supported for container'); + } catch (e) { } + }); + + test('create file under container that exists', async () => { + await pfs.mkdirp(path.join(userDataPath, 'testContainer')); + await testObject.createFile(joinPath(userDataResource, 'testContainer/settings.json'), VSBuffer.fromString('{}')); + const actual = await pfs.readFile(path.join(userDataPath, 'testContainer', 'settings.json')); + assert.equal(actual, '{}'); + }); + + test('create file under container that does not exist', async () => { + await testObject.createFile(joinPath(userDataResource, 'testContainer/settings.json'), VSBuffer.fromString('{}')); + const actual = await pfs.readFile(path.join(userDataPath, 'testContainer', 'settings.json')); + assert.equal(actual, '{}'); + }); + + test('write file throws error for container', async () => { + try { + await testObject.writeFile(joinPath(userDataResource, 'testContainer'), VSBuffer.fromString('{}')); + assert.fail('Should fail since write file is not supported for container'); + } catch (e) { } + }); + + test('write to not existing file under container that exists', async () => { + await pfs.mkdirp(path.join(userDataPath, 'testContainer')); + await testObject.writeFile(joinPath(userDataResource, 'testContainer/settings.json'), VSBuffer.fromString('{}')); + const actual = await pfs.readFile(path.join(userDataPath, 'testContainer', 'settings.json')); + assert.equal(actual, '{}'); + }); + + test('write to not existing file under container that does not exists', async () => { + await testObject.writeFile(joinPath(userDataResource, 'testContainer/settings.json'), VSBuffer.fromString('{}')); + const actual = await pfs.readFile(path.join(userDataPath, 'testContainer', 'settings.json')); + assert.equal(actual, '{}'); + }); + + test('write to existing file under container', async () => { + await pfs.mkdirp(path.join(userDataPath, 'testContainer')); + await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); + await testObject.writeFile(joinPath(userDataResource, 'testContainer/settings.json'), VSBuffer.fromString('{a:1}')); + const actual = await pfs.readFile(path.join(userDataPath, 'testContainer', 'settings.json')); + assert.equal(actual.toString(), '{a:1}'); + }); + + test('delete file throws error for container that does not exist', async () => { + try { + await testObject.del(joinPath(userDataResource, 'testContainer')); + assert.fail('Should fail since delete file is not supported for container'); + } catch (e) { } + }); + + test('delete file throws error for container that exist', async () => { + await pfs.mkdirp(path.join(userDataPath, 'testContainer')); + try { + await testObject.del(joinPath(userDataResource, 'testContainer')); + assert.fail('Should fail since delete file is not supported for container'); + } catch (e) { } + }); + + test('delete not existing file under container that exists', async () => { + await pfs.mkdirp(path.join(userDataPath, 'testContainer')); + try { + await testObject.del(joinPath(userDataResource, 'testContainer')); + assert.fail('Should fail since file does not exist'); + } catch (e) { } + }); + + test('delete not existing file under container that does not exists', async () => { + try { + await testObject.del(joinPath(userDataResource, 'testContainer/settings.json')); + assert.fail('Should fail since file does not exist'); + } catch (e) { } + }); + + test('delete existing file under container', async () => { + await pfs.mkdirp(path.join(userDataPath, 'testContainer')); + pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); + await testObject.del(joinPath(userDataResource, 'testContainer/settings.json')); + const exists = await pfs.exists(path.join(userDataPath, 'testContainer', 'settings.json')); + assert.equal(exists, false); + }); + + test('watch file under container - event is triggerred when file is created', async (done) => { + const resource = joinPath(userDataResource, 'testContainer/settings.json'); + const disposable = testObject.watch(resource); + testObject.onFileChanges(e => { + if (e.contains(resource)) { + disposable.dispose(); + done(); + } + }); + await testObject.writeFile(joinPath(userDataResource, 'testContainer/settings.json'), VSBuffer.fromString('{a:1}')); + }); + + test('watch file under container - event is triggerred when file is created externally', async (done) => { + const resource = joinPath(userDataResource, 'testContainer/settings.json'); + const disposable = testObject.watch(resource); + testObject.onFileChanges(e => { + if (e.contains(resource)) { + disposable.dispose(); + done(); + } + }); + await pfs.mkdirp(path.join(userDataPath, 'testContainer')); + await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); + }); + + test('watch file under container - event is triggerred when file is updated', async (done) => { + const resource = joinPath(userDataResource, 'testContainer/settings.json'); + await pfs.mkdirp(path.join(userDataPath, 'testContainer')); + await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); + const disposable = testObject.watch(resource); + testObject.onFileChanges(e => { + if (e.contains(resource)) { + disposable.dispose(); + done(); + } + }); + await testObject.writeFile(resource, VSBuffer.fromString('{a:1}')); + }); + + test('watch file under container - event is triggerred when file is updated externally', async (done) => { + const resource = joinPath(userDataResource, 'testContainer/settings.json'); + await pfs.mkdirp(path.join(userDataPath, 'testContainer')); + await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); + const disposable = testObject.watch(resource); + testObject.onFileChanges(e => { + if (e.contains(resource)) { + disposable.dispose(); + done(); + } + }); + await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{a:1}'); + }); + + test('watch file under container - event is triggerred when file is deleted', async (done) => { + const resource = joinPath(userDataResource, 'testContainer/settings.json'); + await testObject.writeFile(resource, VSBuffer.fromString('{}')); + const disposable = testObject.watch(resource); + testObject.onFileChanges(e => { + if (e.contains(resource)) { + disposable.dispose(); + done(); + } + }); + await testObject.del(resource); + }); + + test('watch file under container - event is triggerred when file is deleted externally', async (done) => { + const resource = joinPath(userDataResource, 'testContainer/settings.json'); + await testObject.writeFile(resource, VSBuffer.fromString('{}')); + const disposable = testObject.watch(resource); + testObject.onFileChanges(e => { + if (e.contains(resource)) { + disposable.dispose(); + done(); + } + }); + await pfs.unlink(path.join(userDataPath, 'testContainer', 'settings.json')); + }); + + test('watch container - event is triggerred when file under container is created', async (done) => { + const container = joinPath(userDataResource, 'testContainer'); + const disposable = testObject.watch(container); + testObject.onFileChanges(e => { + if (e.contains(container)) { + disposable.dispose(); + done(); + } + }); + await testObject.writeFile(joinPath(userDataResource, 'testContainer/settings.json'), VSBuffer.fromString('{a:1}')); + }); + + test('watch container - event is triggerred when file under container is created externally', async (done) => { + await pfs.mkdirp(path.join(userDataPath, 'testContainer')); + const container = joinPath(userDataResource, 'testContainer'); + const disposable = testObject.watch(container); + testObject.onFileChanges(e => { + if (e.contains(container)) { + disposable.dispose(); + done(); + } + }); + await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); + }); + + test('watch container - event is triggerred when file under container is deleted', async (done) => { + const container = joinPath(userDataResource, 'testContainer'); + const resource = joinPath(userDataResource, 'testContainer/settings.json'); + await testObject.writeFile(resource, VSBuffer.fromString('{}')); + const disposable = testObject.watch(container); + testObject.onFileChanges(e => { + if (e.contains(container)) { + disposable.dispose(); + done(); + } + }); + await testObject.del(resource); + }); + + test('watch container - event is triggerred when file under container is deleted externally ', async (done) => { + const container = joinPath(userDataResource, 'testContainer'); + const resource = joinPath(userDataResource, 'testContainer/settings.json'); + await testObject.writeFile(resource, VSBuffer.fromString('{}')); + const disposable = testObject.watch(container); + testObject.onFileChanges(e => { + if (e.contains(container)) { + disposable.dispose(); + done(); + } + }); + await pfs.unlink(path.join(userDataPath, 'testContainer', 'settings.json')); + }); +}); \ No newline at end of file From a17fe44cfd2875ff7707d05491dfc5c9e7606853 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 14:13:57 +0200 Subject: [PATCH 0977/1449] arch dependent win32 yarn cache --- build/azure-pipelines/win32/product-build-win32.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 5c0a21020b0..6e5595524ea 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -25,6 +25,9 @@ steps: exec { git config user.email "vscode@microsoft.com" } exec { git config user.name "VSCode" } + + mkdir .build -ea 0 + echo $(VSCODE_ARCH) > .build\arch displayName: Prepare tooling - powershell: | @@ -37,7 +40,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.build/arch, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' @@ -52,7 +55,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.build/arch, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' From 481eabb3cc1e76bfd07f7bcada51b65877d893f7 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 14:15:01 +0200 Subject: [PATCH 0978/1449] clean build --- .../linux/product-build-linux.yml | 10 +++---- build/azure-pipelines/product-build.yml | 26 +++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index d13c1944678..74357335d63 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -131,8 +131,8 @@ steps: displayName: 'Component Detection' continueOnError: true -- task: PublishPipelineArtifact@0 - displayName: 'Publish Pipeline Artifact' - inputs: - artifactName: snap-$(VSCODE_ARCH) - targetPath: .build/linux/snap-tarball +# - task: PublishPipelineArtifact@0 +# displayName: 'Publish Pipeline Artifact' +# inputs: +# artifactName: snap-$(VSCODE_ARCH) +# targetPath: .build/linux/snap-tarball diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 0353a0354d5..565bd1c1f14 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -44,17 +44,17 @@ jobs: steps: - template: linux/product-build-linux.yml -- job: LinuxSnap - condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) - timeoutInMinutes: 120 - pool: - vmImage: 'Ubuntu-16.04' - variables: - VSCODE_ARCH: x64 - container: snapcraft - dependsOn: Linux - steps: - - template: linux/snap-build-linux.yml +# - job: LinuxSnap +# condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) +# timeoutInMinutes: 120 +# pool: +# vmImage: 'Ubuntu-16.04' +# variables: +# VSCODE_ARCH: x64 +# container: snapcraft +# dependsOn: Linux +# steps: +# - template: linux/snap-build-linux.yml - job: LinuxArmhf condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) @@ -92,7 +92,7 @@ jobs: - Windows - Windows32 - Linux - - LinuxSnap + # - LinuxSnap - LinuxArmhf - LinuxAlpine - macOS @@ -107,7 +107,7 @@ jobs: - Windows - Windows32 - Linux - - LinuxSnap + # - LinuxSnap - LinuxArmhf - LinuxAlpine - macOS From 089810efdef9118e8099bda782293673fa471972 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 14:33:04 +0200 Subject: [PATCH 0979/1449] shave off a few seconds from cache restore --- build/azure-pipelines/darwin/product-build-darwin.yml | 1 + build/azure-pipelines/linux/product-build-linux-alpine.yml | 1 + build/azure-pipelines/linux/product-build-linux-arm.yml | 1 + build/azure-pipelines/linux/product-build-linux.yml | 1 + build/azure-pipelines/win32/product-build-win32.yml | 1 + 5 files changed, 5 insertions(+) diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index 589df3a22e3..9187dcc23b1 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -52,6 +52,7 @@ steps: keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - script: | set -e diff --git a/build/azure-pipelines/linux/product-build-linux-alpine.yml b/build/azure-pipelines/linux/product-build-linux-alpine.yml index 66acf1d42e3..1354118a93c 100644 --- a/build/azure-pipelines/linux/product-build-linux-alpine.yml +++ b/build/azure-pipelines/linux/product-build-linux-alpine.yml @@ -61,6 +61,7 @@ steps: keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - script: | set -e diff --git a/build/azure-pipelines/linux/product-build-linux-arm.yml b/build/azure-pipelines/linux/product-build-linux-arm.yml index 33519b1d704..62ed46e6a60 100644 --- a/build/azure-pipelines/linux/product-build-linux-arm.yml +++ b/build/azure-pipelines/linux/product-build-linux-arm.yml @@ -61,6 +61,7 @@ steps: keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - script: | set -e diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 74357335d63..972e46f8283 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -53,6 +53,7 @@ steps: keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - script: | set -e diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 6e5595524ea..f47016c76ff 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -58,6 +58,7 @@ steps: keyfile: '.build/arch, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - powershell: | . build/azure-pipelines/win32/exec.ps1 From 5ed3bb2297413a464857f20cec2652b80da6d796 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 15:10:07 +0200 Subject: [PATCH 0980/1449] bring back builds --- .../darwin/product-build-darwin.yml | 18 ++++++------- .../linux/product-build-linux-alpine.yml | 16 ++++++------ .../linux/product-build-linux-arm.yml | 16 ++++++------ .../linux/product-build-linux.yml | 26 +++++++++---------- .../linux/snap-build-linux.yml | 6 ++--- build/azure-pipelines/product-build.yml | 26 +++++++++---------- .../win32/product-build-win32.yml | 18 ++++++------- 7 files changed, 63 insertions(+), 63 deletions(-) diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index 9187dcc23b1..4b747443cc1 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -146,15 +146,15 @@ steps: SessionTimeout: 120 displayName: Codesign -# - script: | -# set -e -# VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ -# AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ -# AZURE_STORAGE_ACCESS_KEY="$(ticino-storage-key)" \ -# AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ -# VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ -# ./build/azure-pipelines/darwin/publish.sh -# displayName: Publish +- script: | + set -e + VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ + AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ + AZURE_STORAGE_ACCESS_KEY="$(ticino-storage-key)" \ + AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ + VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ + ./build/azure-pipelines/darwin/publish.sh + displayName: Publish - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 displayName: 'Component Detection' diff --git a/build/azure-pipelines/linux/product-build-linux-alpine.yml b/build/azure-pipelines/linux/product-build-linux-alpine.yml index 1354118a93c..d3da7c4d952 100644 --- a/build/azure-pipelines/linux/product-build-linux-alpine.yml +++ b/build/azure-pipelines/linux/product-build-linux-alpine.yml @@ -93,14 +93,14 @@ steps: ./build/azure-pipelines/linux/build-alpine.sh displayName: Build -# - script: | -# set -e -# AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ -# AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ -# VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ -# VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ -# ./build/azure-pipelines/linux/publish-alpine.sh -# displayName: Publish +- script: | + set -e + AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ + AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ + VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ + VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ + ./build/azure-pipelines/linux/publish-alpine.sh + displayName: Publish - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 displayName: 'Component Detection' diff --git a/build/azure-pipelines/linux/product-build-linux-arm.yml b/build/azure-pipelines/linux/product-build-linux-arm.yml index 62ed46e6a60..708fd1bf66f 100644 --- a/build/azure-pipelines/linux/product-build-linux-arm.yml +++ b/build/azure-pipelines/linux/product-build-linux-arm.yml @@ -93,14 +93,14 @@ steps: ./build/azure-pipelines/linux/build-arm.sh displayName: Build -# - script: | -# set -e -# AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ -# AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ -# VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ -# VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ -# ./build/azure-pipelines/linux/publish-arm.sh -# displayName: Publish +- script: | + set -e + AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ + AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ + VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ + VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ + ./build/azure-pipelines/linux/publish-arm.sh + displayName: Publish - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 displayName: 'Component Detection' diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 972e46f8283..f6887313aef 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -119,21 +119,21 @@ steps: displayName: Run unit tests condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) -# - script: | -# set -e -# AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ -# AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ -# VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ -# VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ -# ./build/azure-pipelines/linux/publish.sh -# displayName: Publish +- script: | + set -e + AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ + AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ + VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ + VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ + ./build/azure-pipelines/linux/publish.sh + displayName: Publish - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 displayName: 'Component Detection' continueOnError: true -# - task: PublishPipelineArtifact@0 -# displayName: 'Publish Pipeline Artifact' -# inputs: -# artifactName: snap-$(VSCODE_ARCH) -# targetPath: .build/linux/snap-tarball +- task: PublishPipelineArtifact@0 + displayName: 'Publish Pipeline Artifact' + inputs: + artifactName: snap-$(VSCODE_ARCH) + targetPath: .build/linux/snap-tarball diff --git a/build/azure-pipelines/linux/snap-build-linux.yml b/build/azure-pipelines/linux/snap-build-linux.yml index 83bcdfe36e5..9dbe920b87b 100644 --- a/build/azure-pipelines/linux/snap-build-linux.yml +++ b/build/azure-pipelines/linux/snap-build-linux.yml @@ -50,6 +50,6 @@ steps: (cd $SNAP_ROOT/code-* && sudo --preserve-env snapcraft snap --output "$SNAP_PATH") # Publish snap package - # AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ - # AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ - # node build/azure-pipelines/common/publish.js "$VSCODE_QUALITY" "linux-snap-$ARCH" package "$SNAP_FILENAME" "$VERSION" true "$SNAP_PATH" \ No newline at end of file + AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ + AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ + node build/azure-pipelines/common/publish.js "$VSCODE_QUALITY" "linux-snap-$ARCH" package "$SNAP_FILENAME" "$VERSION" true "$SNAP_PATH" \ No newline at end of file diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 565bd1c1f14..0353a0354d5 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -44,17 +44,17 @@ jobs: steps: - template: linux/product-build-linux.yml -# - job: LinuxSnap -# condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) -# timeoutInMinutes: 120 -# pool: -# vmImage: 'Ubuntu-16.04' -# variables: -# VSCODE_ARCH: x64 -# container: snapcraft -# dependsOn: Linux -# steps: -# - template: linux/snap-build-linux.yml +- job: LinuxSnap + condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) + timeoutInMinutes: 120 + pool: + vmImage: 'Ubuntu-16.04' + variables: + VSCODE_ARCH: x64 + container: snapcraft + dependsOn: Linux + steps: + - template: linux/snap-build-linux.yml - job: LinuxArmhf condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) @@ -92,7 +92,7 @@ jobs: - Windows - Windows32 - Linux - # - LinuxSnap + - LinuxSnap - LinuxArmhf - LinuxAlpine - macOS @@ -107,7 +107,7 @@ jobs: - Windows - Windows32 - Linux - # - LinuxSnap + - LinuxSnap - LinuxArmhf - LinuxAlpine - macOS diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index f47016c76ff..799599251a8 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -207,15 +207,15 @@ steps: .\build\azure-pipelines\win32\import-esrp-auth-cert.ps1 -AuthCertificateBase64 $(esrp-auth-certificate) -AuthCertificateKey $(esrp-auth-certificate-key) displayName: Import ESRP Auth Certificate -# - powershell: | -# . build/azure-pipelines/win32/exec.ps1 -# $ErrorActionPreference = "Stop" -# $env:AZURE_STORAGE_ACCESS_KEY_2 = "$(vscode-storage-key)" -# $env:AZURE_DOCUMENTDB_MASTERKEY = "$(builds-docdb-key-readwrite)" -# $env:VSCODE_HOCKEYAPP_TOKEN = "$(vscode-hockeyapp-token)" -# $env:VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" -# .\build\azure-pipelines\win32\publish.ps1 -# displayName: Publish +- powershell: | + . build/azure-pipelines/win32/exec.ps1 + $ErrorActionPreference = "Stop" + $env:AZURE_STORAGE_ACCESS_KEY_2 = "$(vscode-storage-key)" + $env:AZURE_DOCUMENTDB_MASTERKEY = "$(builds-docdb-key-readwrite)" + $env:VSCODE_HOCKEYAPP_TOKEN = "$(vscode-hockeyapp-token)" + $env:VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" + .\build\azure-pipelines\win32\publish.ps1 + displayName: Publish - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 displayName: 'Component Detection' From f7ff421b117e54b0c446c4fece5e2c4996a20a31 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 3 Jul 2019 15:16:17 +0200 Subject: [PATCH 0981/1449] :up: chokidar@2.1.7 --- package.json | 2 +- remote/package.json | 2 +- remote/yarn.lock | 878 ++++++++++---- src/typings/chokidar.d.ts | 242 +++- .../watcher/unix/chokidarWatcherService.ts | 10 +- .../unix/test/chockidarWatcherService.test.ts | 6 +- test/smoke/yarn.lock | 1053 ++++++++++++----- yarn.lock | 71 +- 8 files changed, 1612 insertions(+), 652 deletions(-) diff --git a/package.json b/package.json index ffdf8e3b44f..0b3cd6247ee 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "spdlog": "^0.9.0", "sudo-prompt": "9.0.0", "v8-inspect-profiler": "^0.0.20", - "vscode-chokidar": "1.6.5", + "vscode-chokidar": "2.1.7", "vscode-proxy-agent": "0.4.0", "vscode-ripgrep": "^1.3.1", "vscode-sqlite3": "4.0.7", diff --git a/remote/package.json b/remote/package.json index c8c31cd7920..f42c63cb320 100644 --- a/remote/package.json +++ b/remote/package.json @@ -17,7 +17,7 @@ "onigasm-umd": "^2.2.2", "semver": "^5.5.0", "spdlog": "^0.9.0", - "vscode-chokidar": "1.6.5", + "vscode-chokidar": "2.1.7", "vscode-proxy-agent": "0.4.0", "vscode-ripgrep": "^1.3.1", "vscode-textmate": "^4.1.1", diff --git a/remote/yarn.lock b/remote/yarn.lock index 0924b99c5f3..c59cdeb73e7 100644 --- a/remote/yarn.lock +++ b/remote/yarn.lock @@ -48,32 +48,53 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= - dependencies: - arr-flatten "^1.0.1" +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= -arr-flatten@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" - integrity sha1-5f/lTUXhnzLyFukeuZyM6JK7YEs= +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - integrity sha1-GdOGodntxufByF04iu28xW0zYC0= +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -balanced-match@^1.0.0: +assign-symbols@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" binary-extensions@^1.0.0: version "1.10.0" @@ -95,22 +116,21 @@ bl@^1.0.0: readable-stream "^2.3.5" safe-buffer "^5.1.1" -brace-expansion@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" - integrity sha1-wHshHHyVLsH479Uad+8NHTmQopI= +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" buffer-alloc-unsafe@^0.1.0: version "0.1.1" @@ -135,26 +155,64 @@ buffer-fill@^0.1.0: resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-0.1.1.tgz#76d825c4d6e50e06b7a31eb520c04d08cc235071" integrity sha512-YgBMBzdRLEfgxJIGu2wrvI2E03tMCFU1p7d1KhB4BOoMN0VxmTFjSyN5JtKt9z8Z9JajMHruI6SE25W96wNv7Q== +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + chownr@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" integrity sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE= +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -167,6 +225,18 @@ debug@3.1.0, debug@^3.1.0: dependencies: ms "2.0.0" +debug@^2.2.0, debug@^2.3.3: + 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" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + decompress-response@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" @@ -179,6 +249,28 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" @@ -248,31 +340,52 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= dependencies: - is-posix-bracket "^0.1.0" - -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= - dependencies: - fill-range "^2.1.0" + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" expand-template@^1.0.2: version "1.1.1" resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-1.1.1.tgz#981f188c0c3a87d2e28f559bc541426ff94f21dd" integrity sha512-cebqLtV8KOZfw0UI8TEFWxtczxxC1jvyUvx6H4fyp1K1FN7A4Q+uggVUlOsI1K8AGU0rwOGqP8nCapdrw8CYQg== -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= dependencies: - is-extglob "^1.0.0" + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" extract-opts@^3.2.0: version "3.3.1" @@ -295,33 +408,27 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== -filename-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" - integrity sha1-mW4+gEebmLmJfxWopYs9CE6SZ3U= - -fill-range@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" - integrity sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM= +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^1.1.3" - repeat-element "^1.1.2" - repeat-string "^1.5.2" + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" -for-in@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.5.tgz#007374e2b6d5c67420a1479bdb75a04872b738c4" - integrity sha1-AHN04rbVxnQgoUeb23WgSHK3OMQ= +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= -for-own@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" - integrity sha1-AUm0GjkIjHUV9R6+HBOG1F+TUHI= +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= dependencies: - for-in "^0.1.5" + map-cache "^0.2.2" fs-constants@^1.0.0: version "1.0.0" @@ -351,6 +458,11 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + getmac@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/getmac/-/getmac-1.4.1.tgz#cfefcb3ee7d7a73cba5292129cb100c19afbe17a" @@ -364,27 +476,20 @@ github-from-package@0.0.0: resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= - dependencies: - is-glob "^2.0.0" + is-glob "^3.1.0" + path-dirname "^1.0.0" graceful-fs@4.1.11, graceful-fs@^4.1.2: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= -graceful-fs@^4.1.6: +graceful-fs@^4.1.11, graceful-fs@^4.1.6: version "4.2.0" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.0.tgz#8d8fdc73977cb04104721cb53666c1ca64cd328b" integrity sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg== @@ -394,6 +499,37 @@ has-unicode@^2.0.0: resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + http-proxy-agent@2.1.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" @@ -417,7 +553,12 @@ iconv-lite@0.5.0: dependencies: safer-buffer ">= 2.1.2 < 3" -inherits@^2.0.1, inherits@~2.0.3: +inherits@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= @@ -432,6 +573,20 @@ ip@^1.1.5: resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -444,27 +599,59 @@ is-buffer@^1.0.2: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" integrity sha1-z8hszV3FpS+oBIkRHGkgxFfi2Ys= -is-dotfile@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" - integrity sha1-LBMjg/ORmfjtwmjKAbmwB9IFzE0= +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= dependencies: - is-primitive "^2.0.0" + kind-of "^3.0.2" -is-extendable@^0.1.1: +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-fullwidth-code-point@^1.0.0: version "1.0.0" @@ -478,29 +665,38 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= dependencies: - is-extglob "^1.0.0" + is-extglob "^2.1.0" -is-number@^2.0.2, is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= +is-glob@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= dependencies: kind-of "^3.0.2" -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== isarray@1.0.0, isarray@~1.0.0: version "1.0.0" @@ -514,6 +710,11 @@ isobject@^2.0.0: dependencies: isarray "1.0.0" +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + jschardet@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.6.0.tgz#c7d1a71edcff2839db2f9ec30fc5d5ebd3c1a678" @@ -541,6 +742,30 @@ kind-of@^3.0.2: dependencies: is-buffer "^1.0.2" +kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + lodash.isinteger@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" @@ -551,37 +776,42 @@ lodash.isundefined@^3.0.1: resolved "https://registry.yarnpkg.com/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz#23ef3d9535565203a66cefd5b830f848911afb48" integrity sha1-I+89lTVWUgOmbO/VuDD4SJEa+0g= -micromatch@^2.1.5: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" + object-visit "^1.0.0" + +micromatch@^3.1.10: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" mimic-response@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.0.tgz#df3d3652a73fded6b9b0b24146e6fd052353458e" integrity sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4= -minimatch@^3.0.2: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" @@ -592,6 +822,14 @@ minimist@1.2.0, minimist@^1.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + mkdirp@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" @@ -614,10 +852,22 @@ nan@^2.0.0, nan@^2.12.1, nan@^2.13.2, nan@^2.14.0: resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== -nan@^2.10.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.0.tgz#574e360e4d954ab16966ec102c0c049fd961a099" - integrity sha512-F4miItu2rGnV2ySkXOQoA8FKz/SR2Q2sWP0sbTxNxz/tuokeC8WxOhPMcwi0qIyGtVn/rrSeLbvVkznqCdwYnw== +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" native-watchdog@1.0.0: version "1.0.0" @@ -648,17 +898,10 @@ noop-logger@^0.1.1: resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI= -normalize-path@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" - integrity sha1-R4hqwWYnYNQmG32XnSQXCdPOP3o= +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== npmlog@^4.0.1: version "4.1.2" @@ -690,13 +933,28 @@ object-assign@^4.1.0: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= -object.omit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.0.tgz#868597333d54e60662940bb458605dd6ae12fe94" - integrity sha1-hoWXMz1U5gZilAu0WGBd1q4S/pQ= +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= dependencies: - for-own "^0.1.3" - is-extendable "^0.1.1" + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" once@^1.3.1, once@^1.4.0: version "1.4.0" @@ -722,15 +980,15 @@ os-homedir@^1.0.1: resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= path-is-absolute@^1.0.0: version "1.0.1" @@ -742,6 +1000,16 @@ pend@~1.2.0: resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= +picomatch@^2.0.4: + version "2.0.7" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" + integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== + +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" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + prebuild-install@^2.4.1: version "2.5.3" resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-2.5.3.tgz#9f65f242782d370296353710e9bc843490c19f69" @@ -763,11 +1031,6 @@ prebuild-install@^2.4.1: tunnel-agent "^0.6.0" which-pm-runs "^1.0.0" -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= - process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" @@ -794,14 +1057,6 @@ pump@^2.0.1: end-of-stream "^1.1.0" once "^1.3.1" -randomatic@^1.1.3: - version "1.1.5" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.5.tgz#5e9ef5f2d573c67bd2b8124ae90b5156e457840b" - integrity sha1-Xp718tVzxnvSuBJK6QtRVuRXhAs= - dependencies: - is-number "^2.0.2" - kind-of "^3.0.2" - rc@^1.1.6: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -838,44 +1093,55 @@ readable-stream@^2.0.6, readable-stream@^2.3.0, readable-stream@^2.3.5: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" - integrity sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg= +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" + graceful-fs "^4.1.11" + micromatch "^3.1.10" readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" -regex-cache@^0.4.2: - version "0.4.3" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" - integrity sha1-mxpsNdTQ3871cRrmUejp09cRQUU= +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== dependencies: - is-equal-shallow "^0.1.3" - is-primitive "^2.0.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + extend-shallow "^3.0.2" + safe-regex "^1.1.0" repeat-element@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" integrity sha1-7wiaF40Ug7quTZPrmLT55OEdmQo= -repeat-string@^1.5.2: - version "1.5.4" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.5.4.tgz#64ec0c91e0f4b475f90d5b643651e3e6e5b6c2d5" - integrity sha1-ZOwMkeD0tHX5DVtkNlHj5uW2wtU= +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + "safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -901,10 +1167,15 @@ set-blocking@~2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" signal-exit@^3.0.0: version "3.0.2" @@ -930,6 +1201,36 @@ smart-buffer@^4.0.1: resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.0.1.tgz#07ea1ca8d4db24eb4cac86537d7d18995221ace3" integrity sha512-RFqinRVJVcCAL9Uh1oVqE6FZkqsyLiVOYEZ20TqIOjuX7iFVJ+zsbs4RIghnw/pTs7mZvt8ZHhvm1ZUrR4fykg== +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + socks-proxy-agent@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz#5936bf8b707a993079c6f37db2091821bffa6473" @@ -946,6 +1247,27 @@ socks@~2.2.0: ip "^1.1.5" smart-buffer "^4.0.1" +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + spdlog@^0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/spdlog/-/spdlog-0.9.0.tgz#c85dd9d0b9cd385f6f3f5b92dc9d2e1691092b5c" @@ -955,6 +1277,21 @@ spdlog@^0.9.0: mkdirp "^0.5.1" nan "^2.14.0" +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -1033,6 +1370,31 @@ to-buffer@^1.1.0: resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -1047,46 +1409,82 @@ typechecker@^4.3.0: dependencies: editions "^2.1.0" +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" + integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -vscode-anymatch@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/vscode-anymatch/-/vscode-anymatch-1.3.3.tgz#0613d31a949c8025473bbdad848d219f47a44f86" - integrity sha512-LQ4vF4BWb9gwAvbMtN+3HC4HKDxLd+ZyWmAjACOdD05O/ZMcgvvnjO24GseEIQ6cWn8gW+Ft08gHFihnQy1eSw== +vscode-anymatch@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/vscode-anymatch/-/vscode-anymatch-3.0.3.tgz#5a79101e6df7e659a1f070367bc42f190eb4ae76" + integrity sha512-qQgfbzJJ5nNShh4jjC3BBekY4d8emcxHFgnqcXwsB/PUKvJPCg7AZYXM7hqS7EDnKrX9tsIFwFMihZ7yut92Qg== dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" + normalize-path "^3.0.0" + picomatch "^2.0.4" -vscode-chokidar@1.6.5: - version "1.6.5" - resolved "https://registry.yarnpkg.com/vscode-chokidar/-/vscode-chokidar-1.6.5.tgz#f38a1f909fa364a5429a4d4d70ecb40a15b54d0b" - integrity sha512-bc5dNF8tW2R+oesYT/Au//qumyd/0HTwSRqVXcg8ADQW1MsWKFwv+IxfSIuCHckaEy4I81GpSDaRWVGQqtsELw== +vscode-chokidar@2.1.7: + version "2.1.7" + resolved "https://registry.yarnpkg.com/vscode-chokidar/-/vscode-chokidar-2.1.7.tgz#c5b31eb87402f4779bb4170915245bdcb6f7854b" + integrity sha512-uSNEQetPjAlgIAHmcF9E6M+KCw0f842rsEnJ64aamUAV6TO7gkXNCvLSzb4MuLsPU7ZQyCa++DrLQFjvciK5dg== dependencies: - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" is-binary-path "^1.0.0" - is-glob "^2.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" path-is-absolute "^1.0.0" - readdirp "^2.0.0" - vscode-anymatch "1.3.3" + readdirp "^2.2.1" + upath "^1.1.1" + vscode-anymatch "3.0.3" optionalDependencies: - vscode-fsevents "0.3.10" + vscode-fsevents "1.2.12" -vscode-fsevents@0.3.10: - version "0.3.10" - resolved "https://registry.yarnpkg.com/vscode-fsevents/-/vscode-fsevents-0.3.10.tgz#65a586c3c6df3080bea20482146963a0f3a2c58d" - integrity sha512-iNlCKNgEB9A2JZkLf4h4sJlOS1u0lbe4QjM0Dr0PHaTmsttkJEfOaQeci2Ja1wUA7hUUAF6sNbei/Qp2DacFLw== +vscode-fsevents@1.2.12: + version "1.2.12" + resolved "https://registry.yarnpkg.com/vscode-fsevents/-/vscode-fsevents-1.2.12.tgz#01a71a01f90ee95ca822c34427aba437a17c03a7" + integrity sha512-bH/jRdDpSesGpqiVLjp6gHLSKUOh7oNvppzZ17JIrdbRYCcDmV7dIWR5gQc27DFy0RD9JDT+t+ixMid94MkM1A== dependencies: - nan "^2.10.0" + nan "^2.14.0" vscode-proxy-agent@0.4.0: version "0.4.0" diff --git a/src/typings/chokidar.d.ts b/src/typings/chokidar.d.ts index 411080c2cc7..7f78ded23d4 100644 --- a/src/typings/chokidar.d.ts +++ b/src/typings/chokidar.d.ts @@ -5,84 +5,196 @@ declare module 'vscode-chokidar' { + // TypeScript Version: 3.0 + + import * as fs from "fs"; + import { EventEmitter } from "events"; + /** - * takes paths to be watched recursively and options + * The object's keys are all the directories (using absolute paths unless the `cwd` option was + * used), and the values are arrays of the names of the items contained in each directory. */ - export function watch(paths: string | string[], options: IOptions): FSWatcher; - - export interface IOptions { - - /** - * (regexp or function) files to be ignored. This function or regexp is tested against the whole path, not just filename. - * If it is a function with two arguments, it gets called twice per path - once with a single argument (the path), second time with two arguments (the path and the fs.Stats object of that path). - */ - ignored?: any; - - /** - * (default: false). Indicates whether the process should continue to run as long as files are being watched. - */ - persistent?: boolean; - - /** - * (default: false). Indicates whether to watch files that don't have read permissions. - */ - ignorePermissionErrors?: boolean; - - /** - * (default: false). Indicates whether chokidar should ignore the initial add events or not. - */ - ignoreInitial?: boolean; - - /** - * (default: 100). Interval of file system polling. - */ - interval?: number; - - /** - * (default: 300). Interval of file system polling for binary files (see extensions in src/is-binary). - */ - binaryInterval?: number; - - /** - * (default: false on Windows, true on Linux and OS X). Whether to use fs.watchFile (backed by polling), or fs.watch. If polling leads to high CPU utilization, consider setting this to false. - */ - usePolling?: boolean; - - /** - * (default: true on OS X). Whether to use the fsevents watching interface if available. When set to true explicitly and fsevents is available this supercedes the usePolling setting. When set to false on OS X, usePolling: true becomes the default. - */ - useFsEvents?: boolean; - - /** - * (default: true). When false, only the symlinks themselves will be watched for changes instead of following the link references and bubbling events through the link's path. - */ - followSymlinks?: boolean; - - /** - * (default: false). If set to true then the strings passed to .watch() and .add() are treated as literal path names, even if they look like globs. - */ - disableGlobbing?: boolean; + export interface WatchedPaths { + [directory: string]: string[]; } - export interface FSWatcher { + export class FSWatcher extends EventEmitter implements fs.FSWatcher { - add(fileDirOrGlob: string): void; - add(filesDirsOrGlobs: Array): void; - - unwatch(fileDirOrGlob: string): void; - unwatch(filesDirsOrGlobs: Array): void; + readonly options?: WatchOptions; /** - * Listen for an FS event. Available events: add, addDir, change, unlink, unlinkDir, error. Additionally all is available which gets emitted for every non-error event. + * Constructs a new FSWatcher instance with optional WatchOptions parameter. */ - on(event: string, clb: (type: string, path: string) => void): void; - on(event: string, clb: (error: Error) => void): void; + constructor(options?: WatchOptions); + + /** + * Add files, directories, or glob patterns for tracking. Takes an array of strings or just one + * string. + */ + add(paths: string | string[]): void; + + /** + * Stop watching files, directories, or glob patterns. Takes an array of strings or just one + * string. + */ + unwatch(paths: string | string[]): void; + + /** + * Returns an object representing all the paths on the file system being watched by this + * `FSWatcher` instance. The object's keys are all the directories (using absolute paths unless + * the `cwd` option was used), and the values are arrays of the names of the items contained in + * each directory. + */ + getWatched(): WatchedPaths; /** * Removes all listeners from watched files. */ close(): void; - options: IOptions; + on(event: 'add' | 'addDir' | 'change', listener: (path: string, stats?: fs.Stats) => void): this; + + on(event: 'all', listener: (eventName: 'add' | 'addDir' | 'change' | 'unlink' | 'unlinkDir', path: string, stats?: fs.Stats) => void): this; + + /** + * Error occured + */ + on(event: 'error', listener: (error: Error) => void): this; + + /** + * Exposes the native Node `fs.FSWatcher events` + */ + on(event: 'raw', listener: (eventName: string, path: string, details: any) => void): this; + + /** + * Fires when the initial scan is complete + */ + on(event: 'ready', listener: () => void): this; + + on(event: 'unlink' | 'unlinkDir', listener: (path: string) => void): this; + + on(event: string, listener: (...args: any[]) => void): this; } + + export interface WatchOptions { + /** + * Indicates whether the process should continue to run as long as files are being watched. If + * set to `false` when using `fsevents` to watch, no more events will be emitted after `ready`, + * even if the process continues to run. + */ + persistent?: boolean; + + /** + * ([anymatch](https://github.com/es128/anymatch)-compatible definition) Defines files/paths to + * be ignored. The whole relative or absolute path is tested, not just filename. If a function + * with two arguments is provided, it gets called twice per path - once with a single argument + * (the path), second time with two arguments (the path and the + * [`fs.Stats`](http://nodejs.org/api/fs.html#fs_class_fs_stats) object of that path). + */ + ignored?: any; + + /** + * If set to `false` then `add`/`addDir` events are also emitted for matching paths while + * instantiating the watching as chokidar discovers these file paths (before the `ready` event). + */ + ignoreInitial?: boolean; + + /** + * When `false`, only the symlinks themselves will be watched for changes instead of following + * the link references and bubbling events through the link's path. + */ + followSymlinks?: boolean; + + /** + * The base directory from which watch `paths` are to be derived. Paths emitted with events will + * be relative to this. + */ + cwd?: string; + + /** + * If set to true then the strings passed to .watch() and .add() are treated as literal path + * names, even if they look like globs. Default: false. + */ + disableGlobbing?: boolean; + + /** + * Whether to use fs.watchFile (backed by polling), or fs.watch. If polling leads to high CPU + * utilization, consider setting this to `false`. It is typically necessary to **set this to + * `true` to successfully watch files over a network**, and it may be necessary to successfully + * watch files in other non-standard situations. Setting to `true` explicitly on OS X overrides + * the `useFsEvents` default. + */ + usePolling?: boolean; + + /** + * Whether to use the `fsevents` watching interface if available. When set to `true` explicitly + * and `fsevents` is available this supercedes the `usePolling` setting. When set to `false` on + * OS X, `usePolling: true` becomes the default. + */ + useFsEvents?: boolean; + + /** + * If relying upon the [`fs.Stats`](http://nodejs.org/api/fs.html#fs_class_fs_stats) object that + * may get passed with `add`, `addDir`, and `change` events, set this to `true` to ensure it is + * provided even in cases where it wasn't already available from the underlying watch events. + */ + alwaysStat?: boolean; + + /** + * If set, limits how many levels of subdirectories will be traversed. + */ + depth?: number; + + /** + * Interval of file system polling. + */ + interval?: number; + + /** + * Interval of file system polling for binary files. ([see list of binary extensions](https://gi + * thub.com/sindresorhus/binary-extensions/blob/master/binary-extensions.json)) + */ + binaryInterval?: number; + + /** + * Indicates whether to watch files that don't have read permissions if possible. If watching + * fails due to `EPERM` or `EACCES` with this set to `true`, the errors will be suppressed + * silently. + */ + ignorePermissionErrors?: boolean; + + /** + * `true` if `useFsEvents` and `usePolling` are `false`). Automatically filters out artifacts + * that occur when using editors that use "atomic writes" instead of writing directly to the + * source file. If a file is re-added within 100 ms of being deleted, Chokidar emits a `change` + * event rather than `unlink` then `add`. If the default of 100 ms does not work well for you, + * you can override it by setting `atomic` to a custom value, in milliseconds. + */ + atomic?: boolean | number; + + /** + * can be set to an object in order to adjust timing params: + */ + awaitWriteFinish?: AwaitWriteFinishOptions | boolean; + } + + export interface AwaitWriteFinishOptions { + /** + * Amount of time in milliseconds for a file size to remain constant before emitting its event. + */ + stabilityThreshold?: number; + + /** + * File size polling interval. + */ + pollInterval?: number; + } + + /** + * produces an instance of `FSWatcher`. + */ + export function watch( + paths: string | string[], + options?: WatchOptions + ): FSWatcher; } \ No newline at end of file diff --git a/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts b/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts index 9c6a4c9ad3a..b88f36e4512 100644 --- a/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts +++ b/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts @@ -109,7 +109,7 @@ export class ChokidarWatcherService implements IWatcherService { this.log(`Use polling instead of fs.watch: Polling interval ${pollingInterval} ms`); } - const watcherOpts: chokidar.IOptions = { + const watcherOpts: chokidar.WatchOptions = { ignoreInitial: true, ignorePermissionErrors: true, followSymlinks: true, // this is the default of chokidar and supports file events through symlinks @@ -149,7 +149,7 @@ export class ChokidarWatcherService implements IWatcherService { this._watcherCount++; // Detect if for some reason the native watcher library fails to load - if (isMacintosh && !chokidarWatcher.options.useFsEvents) { + if (isMacintosh && chokidarWatcher.options && !chokidarWatcher.options.useFsEvents) { this.warn('Watcher is not using native fsevents library and is falling back to unefficient polling.'); } @@ -293,15 +293,15 @@ export class ChokidarWatcherService implements IWatcherService { } private log(message: string) { - this._onLogMessage.fire({ type: 'trace', message: `[File Watcher (chockidar)] ` + message }); + this._onLogMessage.fire({ type: 'trace', message: `[File Watcher (chokidar)] ` + message }); } private warn(message: string) { - this._onLogMessage.fire({ type: 'warn', message: `[File Watcher (chockidar)] ` + message }); + this._onLogMessage.fire({ type: 'warn', message: `[File Watcher (chokidar)] ` + message }); } private error(message: string) { - this._onLogMessage.fire({ type: 'error', message: `[File Watcher (chockidar)] ` + message }); + this._onLogMessage.fire({ type: 'error', message: `[File Watcher (chokidar)] ` + message }); } } diff --git a/src/vs/workbench/services/files/node/watcher/unix/test/chockidarWatcherService.test.ts b/src/vs/workbench/services/files/node/watcher/unix/test/chockidarWatcherService.test.ts index d28dc4adfa0..974169f5148 100644 --- a/src/vs/workbench/services/files/node/watcher/unix/test/chockidarWatcherService.test.ts +++ b/src/vs/workbench/services/files/node/watcher/unix/test/chockidarWatcherService.test.ts @@ -55,7 +55,7 @@ async function assertFileEvents(actuals: IDiskFileChange[], expected: IDiskFileC actuals.length = 0; } -suite('Chockidar normalizeRoots', () => { +suite('Chokidar normalizeRoots', () => { test('should not impacts roots that don\'t overlap', () => { if (platform.isWindows) { assertNormalizedRootPath(['C:\\a'], ['C:\\a']); @@ -116,9 +116,9 @@ suite('Chockidar normalizeRoots', () => { }); }); -suite.skip('Chockidar watching', () => { +suite.skip('Chokidar watching', () => { const tmpdir = os.tmpdir(); - const testDir = path.join(tmpdir, 'chockidartest-' + Date.now()); + const testDir = path.join(tmpdir, 'chokidartest-' + Date.now()); const aFolder = path.join(testDir, 'a'); const bFolder = path.join(testDir, 'b'); const b2Folder = path.join(bFolder, 'b2'); diff --git a/test/smoke/yarn.lock b/test/smoke/yarn.lock index b6424c799b9..ca28dd6bf19 100644 --- a/test/smoke/yarn.lock +++ b/test/smoke/yarn.lock @@ -74,14 +74,6 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -ajv@^4.9.1: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" - integrity sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY= - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" - ajv@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.3.0.tgz#4414ff74a50879c208ee5fdc826e32c303549eda" @@ -126,9 +118,9 @@ aproba@^1.0.3: integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== are-we-there-yet@~1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" - integrity sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0= + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== dependencies: delegates "^1.0.0" readable-stream "^2.0.6" @@ -140,11 +132,21 @@ arr-diff@^2.0.0: dependencies: arr-flatten "^1.0.1" -arr-flatten@^1.0.1: +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + array-filter@~0.0.0: version "0.0.1" resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" @@ -170,6 +172,11 @@ array-unique@^0.2.1: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + asn1@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" @@ -180,36 +187,31 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" - integrity sha1-104bh+ev/A24qttwIfP+SBAasjQ= +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - integrity sha1-GdOGodntxufByF04iu28xW0zYC0= + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== 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.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" - integrity sha1-FDQt0428yU0OW4fXY81jYSwOeU8= +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== 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.2.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" - integrity sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w== - aws4@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" @@ -228,6 +230,19 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + bcrypt-pbkdf@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" @@ -236,29 +251,15 @@ bcrypt-pbkdf@^1.0.0: tweetnacl "^0.14.3" binary-extensions@^1.0.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" - integrity sha1-RqoXUftqL5PuXmibsQh9SxTGwgU= - -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= - dependencies: - inherits "~2.0.0" + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== bluebird@^2.9.34: version "2.11.0" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" integrity sha1-U0uQM8AiyVecVro7Plpcqvu2UOE= -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - integrity sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8= - dependencies: - hoek "2.x.x" - boom@4.x.x: version "4.3.1" resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" @@ -290,6 +291,22 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" @@ -300,6 +317,21 @@ builtin-modules@^1.0.0: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" @@ -350,6 +382,21 @@ chokidar@^1.6.0: optionalDependencies: fsevents "^1.0.0" +chownr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -360,6 +407,14 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + combined-stream@^1.0.5, combined-stream@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" @@ -382,6 +437,11 @@ commander@^2.8.1: resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" integrity sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ== +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -415,10 +475,15 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + core-js@^2.4.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" - integrity sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs= + version "2.6.9" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" + integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -447,13 +512,6 @@ crypt@~0.0.1: resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" - integrity sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g= - dependencies: - boom "2.x.x" - cryptiles@3.x.x: version "3.1.2" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" @@ -480,7 +538,7 @@ date-fns@^1.23.0: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" integrity sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw== -debug@2.6.9, debug@^2.1.3, debug@^2.2.0: +debug@2.6.9, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -494,7 +552,7 @@ debug@3.1.0, debug@^3.1.0: dependencies: ms "2.0.0" -debug@^3.0.0: +debug@^3.0.0, debug@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -506,15 +564,37 @@ decamelize@^1.1.2: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-extend@~0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" - integrity sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8= +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" delayed-stream@~1.0.0: version "1.0.0" @@ -641,6 +721,19 @@ expand-brackets@^0.1.4: dependencies: is-posix-bracket "^0.1.0" +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" @@ -648,7 +741,22 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" -extend@~3.0.0, extend@~3.0.1: +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" integrity sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ= @@ -660,6 +768,20 @@ extglob@^0.3.1: dependencies: is-extglob "^1.0.0" +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + extract-zip@^1.0.3: version "1.6.6" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.6.tgz#1290ede8d20d0872b429fd3f351ca128ec5ef85c" @@ -698,16 +820,26 @@ filename-regex@^2.0.0: integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= fill-range@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" - integrity sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM= + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== dependencies: is-number "^2.1.0" isobject "^2.0.0" - randomatic "^1.1.3" + randomatic "^3.0.0" repeat-element "^1.1.2" repeat-string "^1.5.2" +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + find-index@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" @@ -721,7 +853,7 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -for-in@^1.0.1: +for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= @@ -738,15 +870,6 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -form-data@~2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" - integrity sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE= - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" - form-data@~2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" @@ -756,6 +879,13 @@ form-data@~2.3.1: combined-stream "^1.0.5" mime-types "^2.1.12" +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + fs-extra@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" @@ -765,37 +895,25 @@ fs-extra@^4.0.1: jsonfile "^4.0.0" universalify "^0.1.0" +fs-minipass@^1.2.5: + version "1.2.6" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07" + integrity sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ== + dependencies: + minipass "^2.2.1" + 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= fsevents@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" - integrity sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q== + version "1.2.9" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" + integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== dependencies: - nan "^2.3.0" - node-pre-gyp "^0.6.39" - -fstream-ignore@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" - integrity sha1-nDHa40dnAY/h0kmyTa2mfQktoQU= - dependencies: - fstream "^1.0.0" - inherits "2" - minimatch "^3.0.0" - -fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: - version "1.0.11" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" - integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE= - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" + nan "^2.12.1" + node-pre-gyp "^0.12.0" gauge@~2.7.3: version "2.7.4" @@ -816,6 +934,11 @@ get-stdin@^4.0.1: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -857,6 +980,11 @@ glob@7.1.2, glob@^7.0.5: once "^1.3.0" path-is-absolute "^1.0.0" +graceful-fs@^4.1.11: + version "4.2.0" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.0.tgz#8d8fdc73977cb04104721cb53666c1ca64cd328b" + integrity sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg== + graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -867,24 +995,11 @@ growl@1.10.5: resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== -har-schema@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" - integrity sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4= - 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@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" - integrity sha1-M0gdDxu/9gDdID11gSpqX7oALio= - dependencies: - ajv "^4.9.1" - har-schema "^1.0.5" - har-validator@~5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" @@ -915,15 +1030,36 @@ has-unicode@^2.0.0: resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= -hawk@3.1.3, hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" - integrity sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ= +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" hawk@~6.0.2: version "6.0.2" @@ -940,11 +1076,6 @@ he@1.1.1: resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" - integrity sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0= - hoek@4.x.x: version "4.2.0" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" @@ -967,15 +1098,6 @@ htmlparser2@^3.9.2: inherits "^2.0.1" readable-stream "^2.0.2" -http-signature@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" - integrity sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8= - dependencies: - assert-plus "^0.2.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -985,6 +1107,20 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" +iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + dependencies: + minimatch "^3.0.4" + indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" @@ -1000,7 +1136,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= @@ -1010,6 +1146,20 @@ ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" integrity sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4= +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -1034,6 +1184,38 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" @@ -1046,11 +1228,18 @@ is-equal-shallow@^0.1.3: dependencies: is-primitive "^2.0.0" -is-extendable@^0.1.1: +is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" @@ -1070,6 +1259,11 @@ is-fullwidth-code-point@^1.0.0: dependencies: number-is-nan "^1.0.0" +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -1091,6 +1285,18 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" @@ -1111,6 +1317,11 @@ is-utf8@^0.2.0: resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -1128,6 +1339,11 @@ isobject@^2.0.0: dependencies: isarray "1.0.0" +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -1148,13 +1364,6 @@ json-schema@0.2.3: resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= - dependencies: - jsonify "~0.0.0" - 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" @@ -1182,7 +1391,7 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" -kind-of@^3.0.2: +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= @@ -1196,6 +1405,16 @@ kind-of@^4.0.0: dependencies: is-buffer "^1.1.5" +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -1225,11 +1444,28 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +math-random@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" + integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== + md5@^2.1.0: version "2.2.1" resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" @@ -1279,16 +1515,30 @@ micromatch@^2.1.5: parse-glob "^3.0.4" regex-cache "^0.4.2" +micromatch@^3.1.10: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + mime-db@~1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" integrity sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE= -mime-db@~1.33.0: - version "1.33.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" - integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== - mime-types@^2.1.12, mime-types@~2.1.17: version "2.1.17" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" @@ -1296,14 +1546,7 @@ mime-types@^2.1.12, mime-types@~2.1.17: dependencies: mime-db "~1.30.0" -mime-types@~2.1.7: - version "2.1.18" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" - integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== - dependencies: - mime-db "~1.33.0" - -minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: +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== @@ -1320,6 +1563,29 @@ minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= +minipass@^2.2.1, minipass@^2.3.5: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== + dependencies: + minipass "^2.2.1" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + mkdirp@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" @@ -1327,7 +1593,7 @@ mkdirp@0.5.0: dependencies: minimist "0.0.8" -mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.1: +mkdirp@0.5.1, mkdirp@^0.5.0, 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= @@ -1380,32 +1646,57 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -nan@^2.3.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" - integrity sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA== +nan@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" ncp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" integrity sha1-GVoh1sRuNh0vsSgbo4uR6d9727M= -node-pre-gyp@^0.6.39: - version "0.6.39" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" - integrity sha512-OsJV74qxnvz/AMGgcfZoDaeDXKD3oY3QVIbBmwszTFkRisTSXbMQyn4UWzUMOtA5SVhrBZOTp0wcoSBgfMfMmQ== +needle@^2.2.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" + integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + +node-pre-gyp@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" + integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== dependencies: detect-libc "^1.0.2" - hawk "3.1.3" mkdirp "^0.5.1" + needle "^2.2.1" nopt "^4.0.1" + npm-packlist "^1.1.6" npmlog "^4.0.2" - rc "^1.1.7" - request "2.81.0" + rc "^1.2.7" rimraf "^2.6.1" semver "^5.3.0" - tar "^2.2.1" - tar-pack "^3.4.0" + tar "^4" nopt@^4.0.1: version "4.0.1" @@ -1432,6 +1723,19 @@ normalize-path@^2.0.0, normalize-path@^2.0.1: dependencies: remove-trailing-separator "^1.0.1" +npm-bundled@^1.0.1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== + +npm-packlist@^1.1.6: + version "1.4.4" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.4.tgz#866224233850ac534b63d1a6e76050092b5d2f44" + integrity sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" @@ -1460,7 +1764,7 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -oauth-sign@~0.8.1, oauth-sign@~0.8.2: +oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" integrity sha1-Rqarfwrq2N6unsBWV4C31O/rnUM= @@ -1470,11 +1774,27 @@ object-assign@^4.0.1, object-assign@^4.1.0: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + object-keys@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" @@ -1483,7 +1803,14 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" -once@^1.3.0, once@^1.3.3: +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -1525,6 +1852,11 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" @@ -1542,10 +1874,10 @@ 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= -path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" - integrity sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME= +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== path-type@^1.0.0: version "1.1.0" @@ -1561,11 +1893,6 @@ pend@~1.2.0: resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= -performance-now@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" - integrity sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU= - performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -1597,6 +1924,11 @@ portastic@^1.0.1: commander "^2.8.1" debug "^2.2.0" +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" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" @@ -1616,9 +1948,9 @@ process-nextick-args@~1.0.6: integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== + version "2.0.1" + 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-stream@^1.1.0: version "1.2.0" @@ -1633,35 +1965,21 @@ punycode@^1.4.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= -qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" - integrity sha1-E+JtKK1rD/qpExLNO/cI7TUecjM= - qs@~6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" integrity sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A== -randomatic@^1.1.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" - integrity sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how== +randomatic@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" + integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" -rc@^1.1.7: - version "1.2.6" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.6.tgz#eb18989c6d4f4f162c399f79ddd29f3835568092" - integrity sha1-6xiYnG1PTxYsOZ953dKfODVWgJI= - dependencies: - deep-extend "~0.4.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -rc@^1.2.1: +rc@^1.2.1, rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -1701,7 +2019,7 @@ readable-stream@^2.0.2, readable-stream@^2.2.2: string_decoder "~1.0.3" util-deprecate "~1.0.1" -readable-stream@^2.0.6, readable-stream@^2.1.4: +readable-stream@^2.0.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -1725,14 +2043,13 @@ readable-stream@~1.1.9: string_decoder "~0.10.x" readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" - integrity sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg= + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" + graceful-fs "^4.1.11" + micromatch "^3.1.10" readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" redent@^1.0.0: version "1.0.0" @@ -1743,9 +2060,9 @@ redent@^1.0.0: strip-indent "^1.0.1" regenerator-runtime@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" - integrity sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A== + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regex-cache@^0.4.2: version "0.4.4" @@ -1754,17 +2071,25 @@ regex-cache@^0.4.2: dependencies: is-equal-shallow "^0.1.3" +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" - integrity sha1-7wiaF40Ug7quTZPrmLT55OEdmQo= + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.5.2: +repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= @@ -1776,34 +2101,6 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request@2.81.0: - version "2.81.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" - integrity sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA= - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "^0.6.0" - uuid "^3.0.0" - request@^2.45.0: version "2.83.0" resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" @@ -1832,14 +2129,24 @@ request@^2.45.0: tunnel-agent "^0.6.0" uuid "^3.1.0" -resolve@^1.1.7: - version "1.7.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.0.tgz#2bdf5374811207285df0df652b78f118ab8f3c5e" - integrity sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA== - dependencies: - path-parse "^1.0.5" +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1: +resolve@^1.1.7: + version "1.11.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" + integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw== + dependencies: + path-parse "^1.0.6" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== @@ -1856,11 +2163,38 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== -"semver@2 || 3 || 4 || 5", semver@^5.3.0: +safe-buffer@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +"semver@2 || 3 || 4 || 5": version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== +semver@^5.3.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== + semver@^5.4.1: version "5.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" @@ -1871,10 +2205,15 @@ set-blocking@~2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" shell-quote@^1.6.1: version "1.6.1" @@ -1898,12 +2237,35 @@ single-line-log@^1.1.2: dependencies: string-width "^1.0.1" -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" - integrity sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg= +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== dependencies: - hoek "2.x.x" + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" sntp@2.x.x: version "2.1.0" @@ -1912,6 +2274,27 @@ sntp@2.x.x: dependencies: hoek "4.x.x" +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + spawn-command@^0.0.2-1: version "0.0.2-1" resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" @@ -1939,6 +2322,13 @@ speedometer@~0.1.2: resolved "https://registry.yarnpkg.com/speedometer/-/speedometer-0.1.4.tgz#9876dbd2a169d3115402d48e6ea6329c8816a50d" integrity sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0= +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + sshpk@^1.7.0: version "1.13.1" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" @@ -1954,7 +2344,15 @@ sshpk@^1.7.0: jsbn "~0.1.0" tweetnacl "~0.14.0" -string-width@^1.0.1, string-width@^1.0.2: +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= @@ -1963,6 +2361,14 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" @@ -1982,7 +2388,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -stringstream@~0.0.4, stringstream@~0.0.5: +stringstream@~0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" integrity sha1-TkhM1N5aC7vuGORjB3EKioFiGHg= @@ -2060,28 +2466,18 @@ supports-color@^3.2.3: dependencies: has-flag "^1.0.0" -tar-pack@^3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" - integrity sha512-PPRybI9+jM5tjtCbN2cxmmRU7YmqT3Zv/UDy48tAh2XRkLa9bAORtSWLkVc13+GJF+cdTh1yEnHEk3cpTaL5Kg== +tar@^4: + version "4.4.10" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1" + integrity sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA== dependencies: - debug "^2.2.0" - fstream "^1.0.10" - fstream-ignore "^1.0.5" - once "^1.3.3" - readable-stream "^2.1.4" - rimraf "^2.5.1" - tar "^2.2.1" - uid-number "^0.0.6" - -tar@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" - integrity sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE= - dependencies: - block-stream "*" - fstream "^1.0.2" - inherits "2" + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.3.5" + minizlib "^1.2.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.3" throttleit@0.0.2: version "0.0.2" @@ -2103,12 +2499,30 @@ tmp@0.0.33: dependencies: os-tmpdir "~1.0.2" -tough-cookie@~2.3.0: - version "2.3.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" - integrity sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA== +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= dependencies: - punycode "^1.4.1" + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" tough-cookie@~2.3.3: version "2.3.3" @@ -2149,26 +2563,44 @@ typescript@2.9.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" integrity sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w== -uid-number@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -uuid@^3.0.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" - integrity sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA== - uuid@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" @@ -2200,11 +2632,11 @@ watch@^1.0.2: minimist "^1.2.0" wide-align@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" - integrity sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w== + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== dependencies: - string-width "^1.0.2" + string-width "^1.0.2 || 2" wrappy@1: version "1.0.2" @@ -2223,6 +2655,11 @@ xtend@~2.1.1: dependencies: object-keys "~0.4.0" +yallist@^3.0.0, yallist@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== + yauzl@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" diff --git a/yarn.lock b/yarn.lock index bc55225d8d7..3742868224a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5628,7 +5628,7 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^2.1.5, micromatch@^2.3.7: +micromatch@^2.3.7: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= @@ -6110,18 +6110,18 @@ normalize-path@^1.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379" integrity sha1-MtDkcvkf80VwHBWoMRAY07CpA3k= -normalize-path@^2.0.0, normalize-path@^2.1.1: +normalize-path@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" + integrity sha1-R4hqwWYnYNQmG32XnSQXCdPOP3o= + +normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" -normalize-path@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" - integrity sha1-R4hqwWYnYNQmG32XnSQXCdPOP3o= - normalize-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -6729,6 +6729,11 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +picomatch@^2.0.4: + version "2.0.7" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" + integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -9161,6 +9166,11 @@ upath@^1.0.5, upath@^1.1.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw== +upath@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" + integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== + uri-js@^4.2.1, uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" @@ -9433,41 +9443,44 @@ vsce@1.48.0: yauzl "^2.3.1" yazl "^2.2.2" -vscode-anymatch@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/vscode-anymatch/-/vscode-anymatch-1.3.3.tgz#0613d31a949c8025473bbdad848d219f47a44f86" - integrity sha512-LQ4vF4BWb9gwAvbMtN+3HC4HKDxLd+ZyWmAjACOdD05O/ZMcgvvnjO24GseEIQ6cWn8gW+Ft08gHFihnQy1eSw== +vscode-anymatch@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/vscode-anymatch/-/vscode-anymatch-3.0.3.tgz#5a79101e6df7e659a1f070367bc42f190eb4ae76" + integrity sha512-qQgfbzJJ5nNShh4jjC3BBekY4d8emcxHFgnqcXwsB/PUKvJPCg7AZYXM7hqS7EDnKrX9tsIFwFMihZ7yut92Qg== dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" + normalize-path "^3.0.0" + picomatch "^2.0.4" -vscode-chokidar@1.6.5: - version "1.6.5" - resolved "https://registry.yarnpkg.com/vscode-chokidar/-/vscode-chokidar-1.6.5.tgz#f38a1f909fa364a5429a4d4d70ecb40a15b54d0b" - integrity sha512-bc5dNF8tW2R+oesYT/Au//qumyd/0HTwSRqVXcg8ADQW1MsWKFwv+IxfSIuCHckaEy4I81GpSDaRWVGQqtsELw== +vscode-chokidar@2.1.7: + version "2.1.7" + resolved "https://registry.yarnpkg.com/vscode-chokidar/-/vscode-chokidar-2.1.7.tgz#c5b31eb87402f4779bb4170915245bdcb6f7854b" + integrity sha512-uSNEQetPjAlgIAHmcF9E6M+KCw0f842rsEnJ64aamUAV6TO7gkXNCvLSzb4MuLsPU7ZQyCa++DrLQFjvciK5dg== dependencies: - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" is-binary-path "^1.0.0" - is-glob "^2.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" path-is-absolute "^1.0.0" - readdirp "^2.0.0" - vscode-anymatch "1.3.3" + readdirp "^2.2.1" + upath "^1.1.1" + vscode-anymatch "3.0.3" optionalDependencies: - vscode-fsevents "0.3.10" + vscode-fsevents "1.2.12" vscode-debugprotocol@1.35.0: version "1.35.0" resolved "https://registry.yarnpkg.com/vscode-debugprotocol/-/vscode-debugprotocol-1.35.0.tgz#565140cd42945e30c6c85cafb38c631457d4a46c" integrity sha512-+OMm11R1bGYbpIJ5eQIkwoDGFF4GvBz3Ztl6/VM+/RNNb2Gjk2c0Ku+oMmfhlTmTlPCpgHBsH4JqVCbUYhu5bA== -vscode-fsevents@0.3.10: - version "0.3.10" - resolved "https://registry.yarnpkg.com/vscode-fsevents/-/vscode-fsevents-0.3.10.tgz#65a586c3c6df3080bea20482146963a0f3a2c58d" - integrity sha512-iNlCKNgEB9A2JZkLf4h4sJlOS1u0lbe4QjM0Dr0PHaTmsttkJEfOaQeci2Ja1wUA7hUUAF6sNbei/Qp2DacFLw== +vscode-fsevents@1.2.12: + version "1.2.12" + resolved "https://registry.yarnpkg.com/vscode-fsevents/-/vscode-fsevents-1.2.12.tgz#01a71a01f90ee95ca822c34427aba437a17c03a7" + integrity sha512-bH/jRdDpSesGpqiVLjp6gHLSKUOh7oNvppzZ17JIrdbRYCcDmV7dIWR5gQc27DFy0RD9JDT+t+ixMid94MkM1A== dependencies: - nan "^2.10.0" + nan "^2.14.0" vscode-nls-dev@3.2.5: version "3.2.5" From b36e9047d9beb479a84b0813565ed98be27679ff Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 15:31:02 +0200 Subject: [PATCH 0982/1449] compile job --- build/azure-pipelines/compile.yml | 78 --------- build/azure-pipelines/product-build.yml | 194 +++++++++++----------- build/azure-pipelines/product-compile.yml | 124 ++++++++++++++ 3 files changed, 221 insertions(+), 175 deletions(-) delete mode 100644 build/azure-pipelines/compile.yml create mode 100644 build/azure-pipelines/product-compile.yml diff --git a/build/azure-pipelines/compile.yml b/build/azure-pipelines/compile.yml deleted file mode 100644 index a6b7f79a8a5..00000000000 --- a/build/azure-pipelines/compile.yml +++ /dev/null @@ -1,78 +0,0 @@ -steps: -- task: AzureKeyVault@1 - displayName: 'Azure Key Vault: Get Secrets' - inputs: - azureSubscription: 'vscode-builds-subscription' - KeyVaultName: vscode - -- task: NodeTool@0 - inputs: - versionSpec: "10.15.1" - -- script: | - set -e - cat << EOF > ~/.netrc - machine monacotools.visualstudio.com - password $(devops-pat) - machine github.com - login vscode - password $(github-distro-mixin-password) - EOF - git config user.email "vscode@microsoft.com" - git config user.name "VSCode" - displayName: Prepare tooling - -- script: | - set -e - git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git" - git fetch distro - git merge $(node -p "require('./package.json').distro") - displayName: Merge distro - -# - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 -# inputs: -# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' -# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' -# vstsFeed: '$(ArtifactFeed)' - -- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 - inputs: - versionSpec: "1.10.1" - -- script: 'yarn --frozen-lockfile' - displayName: Install Dependencies - condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - -# - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 -# inputs: -# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' -# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' -# vstsFeed: '$(ArtifactFeed)' -# condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - -- script: 'yarn gulp mixin' - displayName: Mix in quality - -- script: 'yarn gulp hygiene' - displayName: Run hygiene checks - -- script: 'yarn monaco-compile-check' - displayName: Run Monaco compilation checks - -- script: | - set -e - cd $BUILD_STAGINGDIRECTORY - git clone https://github.com/microsoft/vscode-telemetry-extractor.git - cd vscode-telemetry-extractor - git checkout 3b04aba5bfdfcca1a5426cd2c51a90d18740d0bc - npm i - npm run setup-extension-repos - node ./out/cli-extract.js --sourceDir $BUILD_SOURCESDIRECTORY --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents - node ./out/cli-extract-extensions.js --sourceDir ./src/telemetry-sources --outputDir . --applyEndpoints --includeIsMeasurement - mkdir -p $BUILD_SOURCESDIRECTORY/.build/telemetry - mv declarations-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-core.json - mv declarations-extensions-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-extensions.json - displayName: Extract Telemetry - -- script: 'VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" ./build/azure-pipelines/linux/build.sh' - displayName: Build \ No newline at end of file diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index aca968c646d..045d67507c0 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -7,112 +7,112 @@ resources: image: snapcore/snapcraft:stable jobs: -# - job: Compile +- job: Compile + pool: + vmImage: 'Ubuntu-16.04' + steps: + - template: product-compile.yml + +# - job: Windows +# condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32'], 'true')) +# timeoutInMinutes: 120 +# pool: +# vmImage: VS2017-Win2016 +# variables: +# VSCODE_ARCH: x64 +# steps: +# - template: win32/product-build-win32.yml + +# - job: Windows32 +# condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true')) +# timeoutInMinutes: 120 +# pool: +# vmImage: VS2017-Win2016 +# variables: +# VSCODE_ARCH: ia32 +# steps: +# - template: win32/product-build-win32.yml + +# - job: Linux +# condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) +# timeoutInMinutes: 120 # pool: # vmImage: 'Ubuntu-16.04' +# variables: +# VSCODE_ARCH: x64 +# container: vscode-x64 # steps: -# - template: compile.yml +# - template: linux/product-build-linux.yml -- job: Windows - condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32'], 'true')) - timeoutInMinutes: 120 - pool: - vmImage: VS2017-Win2016 - variables: - VSCODE_ARCH: x64 - steps: - - template: win32/product-build-win32.yml +# - job: LinuxSnap +# condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) +# timeoutInMinutes: 120 +# pool: +# vmImage: 'Ubuntu-16.04' +# variables: +# VSCODE_ARCH: x64 +# container: snapcraft +# dependsOn: Linux +# steps: +# - template: linux/snap-build-linux.yml -- job: Windows32 - condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true')) - timeoutInMinutes: 120 - pool: - vmImage: VS2017-Win2016 - variables: - VSCODE_ARCH: ia32 - steps: - - template: win32/product-build-win32.yml +# - job: LinuxArmhf +# condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) +# timeoutInMinutes: 120 +# pool: +# vmImage: 'Ubuntu-16.04' +# variables: +# VSCODE_ARCH: armhf +# steps: +# - template: linux/product-build-linux-arm.yml -- job: Linux - condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) - timeoutInMinutes: 120 - pool: - vmImage: 'Ubuntu-16.04' - variables: - VSCODE_ARCH: x64 - container: vscode-x64 - steps: - - template: linux/product-build-linux.yml +# - job: LinuxAlpine +# condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) +# timeoutInMinutes: 120 +# pool: +# vmImage: 'Ubuntu-16.04' +# variables: +# VSCODE_ARCH: alpine +# steps: +# - template: linux/product-build-linux-alpine.yml -- job: LinuxSnap - condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) - timeoutInMinutes: 120 - pool: - vmImage: 'Ubuntu-16.04' - variables: - VSCODE_ARCH: x64 - container: snapcraft - dependsOn: Linux - steps: - - template: linux/snap-build-linux.yml +# - job: macOS +# condition: and(succeeded(), eq(variables['VSCODE_BUILD_MACOS'], 'true')) +# timeoutInMinutes: 120 +# pool: +# vmImage: macOS 10.13 +# steps: +# - template: darwin/product-build-darwin.yml -- job: LinuxArmhf - condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) - timeoutInMinutes: 120 - pool: - vmImage: 'Ubuntu-16.04' - variables: - VSCODE_ARCH: armhf - steps: - - template: linux/product-build-linux-arm.yml +# - job: Release +# condition: and(succeeded(), or(eq(variables['VSCODE_RELEASE'], 'true'), and(or(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['VSCODE_QUALITY'], 'exploration')), eq(variables['Build.Reason'], 'Schedule')))) +# pool: +# vmImage: 'Ubuntu-16.04' +# dependsOn: +# - Windows +# - Windows32 +# - Linux +# - LinuxSnap +# - LinuxArmhf +# - LinuxAlpine +# - macOS +# steps: +# - template: release.yml -- job: LinuxAlpine - condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) - timeoutInMinutes: 120 - pool: - vmImage: 'Ubuntu-16.04' - variables: - VSCODE_ARCH: alpine - steps: - - template: linux/product-build-linux-alpine.yml - -- job: macOS - condition: and(succeeded(), eq(variables['VSCODE_BUILD_MACOS'], 'true')) - timeoutInMinutes: 120 - pool: - vmImage: macOS 10.13 - steps: - - template: darwin/product-build-darwin.yml - -- job: Release - condition: and(succeeded(), or(eq(variables['VSCODE_RELEASE'], 'true'), and(or(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['VSCODE_QUALITY'], 'exploration')), eq(variables['Build.Reason'], 'Schedule')))) - pool: - vmImage: 'Ubuntu-16.04' - dependsOn: - - Windows - - Windows32 - - Linux - - LinuxSnap - - LinuxArmhf - - LinuxAlpine - - macOS - steps: - - template: release.yml - -- job: Mooncake - pool: - vmImage: 'Ubuntu-16.04' - condition: true - dependsOn: - - Windows - - Windows32 - - Linux - - LinuxSnap - - LinuxArmhf - - LinuxAlpine - - macOS - steps: - - template: sync-mooncake.yml +# - job: Mooncake +# pool: +# vmImage: 'Ubuntu-16.04' +# condition: true +# dependsOn: +# - Windows +# - Windows32 +# - Linux +# - LinuxSnap +# - LinuxArmhf +# - LinuxAlpine +# - macOS +# steps: +# - template: sync-mooncake.yml # schedules: # - cron: "0 6 * * Mon-Fri" diff --git a/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml new file mode 100644 index 00000000000..c34da000bcb --- /dev/null +++ b/build/azure-pipelines/product-compile.yml @@ -0,0 +1,124 @@ +steps: +- script: | + mkdir -p .build + echo $BUILD_SOURCEVERSION > .build/commit + displayName: Prepare cache flag + +- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + inputs: + keyfile: '.build/commit' + targetfolder: '.build, out-build' + vstsFeed: 'npm-vscode' + alias: 'Compilation' + +- task: NodeTool@0 + inputs: + versionSpec: "10.15.1" + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + +- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 + inputs: + versionSpec: "1.10.1" + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + +- task: AzureKeyVault@1 + displayName: 'Azure Key Vault: Get Secrets' + inputs: + azureSubscription: 'vscode-builds-subscription' + KeyVaultName: vscode + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + +- script: | + set -e + export npm_config_arch="$(VSCODE_ARCH)" + + cat << EOF > ~/.netrc + machine monacotools.visualstudio.com + password $(devops-pat) + machine github.com + login vscode + password $(github-distro-mixin-password) + EOF + + git config user.email "vscode@microsoft.com" + git config user.name "VSCode" + displayName: Prepare tooling + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + +- script: | + set -e + git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git" + git fetch distro + git merge $(node -p "require('./package.json').distro") + displayName: Merge distro + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + +- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + inputs: + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'npm-vscode' + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + +- script: | + set -e + yarn --frozen-lockfile + displayName: Install dependencies + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), ne(variables['CacheRestored'], 'true')) + +- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 + inputs: + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'npm-vscode' + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), ne(variables['CacheRestored'], 'true')) + +- script: | + set -e + yarn postinstall + displayName: Run postinstall scripts + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), eq(variables['CacheRestored'], 'true')) + +- script: | + set -e + yarn gulp mixin + displayName: Mix in quality + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + +- script: | + set -e + yarn gulp hygiene + yarn monaco-compile-check + displayName: Run hygiene checks + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) + +- script: | + set -e + cd $BUILD_STAGINGDIRECTORY + git clone https://github.com/microsoft/vscode-telemetry-extractor.git + cd vscode-telemetry-extractor + git checkout 3b04aba5bfdfcca1a5426cd2c51a90d18740d0bc + npm i + npm run setup-extension-repos + node ./out/cli-extract.js --sourceDir $BUILD_SOURCESDIRECTORY --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents + node ./out/cli-extract-extensions.js --sourceDir ./src/telemetry-sources --outputDir . --applyEndpoints --includeIsMeasurement + mkdir -p $BUILD_SOURCESDIRECTORY/.build/telemetry + mv declarations-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-core.json + mv declarations-extensions-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-extensions.json + displayName: Extract Telemetry + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + +- script: | + set -e + yarn gulp compile-build + yarn gulp compile-extensions-build + displayName: Compile + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + +- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 + inputs: + keyfile: '.build/commit' + targetfolder: '.build, out-build' + vstsFeed: 'npm-vscode' + alias: 'Compilation' + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) \ No newline at end of file From acaa0ea66084c3c57e91a2adf3827773fa79ef64 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 3 Jul 2019 15:35:13 +0200 Subject: [PATCH 0983/1449] support backups in file user data provider --- .../environment/common/environment.ts | 2 + .../environment/node/environmentService.ts | 4 +- .../userData/common/fileUserDataProvider.ts | 13 +++- .../fileUserDataProvider.test.ts | 75 +++++++++++++++++-- 4 files changed, 86 insertions(+), 8 deletions(-) diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index dc75380ba18..5229a389269 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -84,6 +84,8 @@ export interface IExtensionHostDebugParams extends IDebugParams { debugId?: string; } +export const BACKUPS = 'Backups'; + export interface IEnvironmentService { _serviceBrand: any; diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts index 55c3d8302ae..9de4c60783b 100644 --- a/src/vs/platform/environment/node/environmentService.ts +++ b/src/vs/platform/environment/node/environmentService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IEnvironmentService, ParsedArgs, IDebugParams, IExtensionHostDebugParams } from 'vs/platform/environment/common/environment'; +import { IEnvironmentService, ParsedArgs, IDebugParams, IExtensionHostDebugParams, BACKUPS } from 'vs/platform/environment/common/environment'; import * as crypto from 'crypto'; import * as paths from 'vs/base/node/paths'; import * as os from 'os'; @@ -145,7 +145,7 @@ export class EnvironmentService implements IEnvironmentService { get isExtensionDevelopment(): boolean { return !!this._args.extensionDevelopmentPath; } @memoize - get backupHome(): string { return path.join(this.userDataPath, 'Backups'); } + get backupHome(): string { return path.join(this.userDataPath, BACKUPS); } @memoize get backupWorkspacesPath(): string { return path.join(this.backupHome, 'workspaces.json'); } diff --git a/src/vs/workbench/services/userData/common/fileUserDataProvider.ts b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts index fb6e86576c8..7e996734a90 100644 --- a/src/vs/workbench/services/userData/common/fileUserDataProvider.ts +++ b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts @@ -11,6 +11,7 @@ import { URI } from 'vs/base/common/uri'; import * as resources from 'vs/base/common/resources'; import { VSBuffer } from 'vs/base/common/buffer'; import { startsWith } from 'vs/base/common/strings'; +import { BACKUPS } from 'vs/platform/environment/common/environment'; export class FileUserDataProvider extends Disposable implements IUserDataProvider { @@ -63,12 +64,22 @@ export class FileUserDataProvider extends Disposable implements IUserDataProvide } private toResource(path: string): URI { + if (path === BACKUPS || startsWith(path, `${BACKUPS}/`)) { + return resources.joinPath(resources.dirname(this.userDataHome), path); + } return resources.joinPath(this.userDataHome, path); } private toPath(resource: URI): string | undefined { const resourcePath = resource.toString(); const userDataHomePath = this.userDataHome.toString(); - return startsWith(resourcePath, userDataHomePath) ? resourcePath.substr(userDataHomePath.length + 1) : undefined; + const backupHomePath = resources.joinPath(resources.dirname(this.userDataHome), BACKUPS).toString(); + if (startsWith(resourcePath, userDataHomePath)) { + return resourcePath.substr(userDataHomePath.length + 1); + } + if (startsWith(resourcePath, backupHomePath)) { + return resourcePath.substr(backupHomePath.length + 1); + } + return undefined; } } \ No newline at end of file diff --git a/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts b/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts index 60aeb74a31f..245d119305c 100644 --- a/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts +++ b/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts @@ -20,27 +20,34 @@ import { VSBuffer } from 'vs/base/common/buffer'; import { DiskFileSystemProvider } from 'vs/workbench/services/files/electron-browser/diskFileSystemProvider'; import { Registry } from 'vs/platform/registry/common/platform'; import { IUserDataContainerRegistry, Extensions } from 'vs/workbench/services/userData/common/userData'; +import { BACKUPS } from 'vs/platform/environment/common/environment'; -suite('UserDataFileSystemProvider', () => { +suite('FileUserDataProvider', () => { let testObject: IFileService; + let rootPath: string; let userDataPath: string; + let backupsPath: string; let userDataResource: URI; const userDataContainersRegistry = Registry.as(Extensions.UserDataContainers); - setup(() => { + setup(async () => { const logService = new NullLogService(); testObject = new FileService(logService); testObject.registerProvider(Schemas.file, new DiskFileSystemProvider(logService)); - userDataPath = path.join(os.tmpdir(), 'vsctests', uuid.generateUuid()); + rootPath = path.join(os.tmpdir(), 'vsctests', uuid.generateUuid()); + userDataPath = path.join(rootPath, 'user'); + backupsPath = path.join(rootPath, BACKUPS); + await Promise.all([pfs.mkdirp(userDataPath), pfs.mkdirp(backupsPath)]); userDataResource = URI.from({ scheme: Schemas.userData, path: '/user' }); testObject.registerProvider(Schemas.userData, new UserDataFileSystemProvider(userDataResource, new FileUserDataProvider(URI.file(userDataPath), testObject))); userDataContainersRegistry.registerContainer('testContainer'); - return pfs.mkdirp(userDataPath); + userDataContainersRegistry.registerContainer('testContainer/subContainer'); + userDataContainersRegistry.registerContainer(BACKUPS); }); teardown(() => { - return pfs.rimraf(userDataPath, pfs.RimRafMode.MOVE); + return pfs.rimraf(rootPath, pfs.RimRafMode.MOVE); }); test('exists return false when file does not exist', async () => { @@ -163,6 +170,13 @@ suite('UserDataFileSystemProvider', () => { assert.equal(false, result); }); + test('resolve file', async () => { + await pfs.writeFile(path.join(userDataPath, 'settings.json'), ''); + const result = await testObject.resolve(joinPath(userDataResource, 'settings.json')); + assert.ok(!result.isDirectory); + assert.ok(result.children === undefined); + }); + test('exists return true for container', async () => { const exists = await testObject.exists(joinPath(userDataResource, 'testContainer')); assert.equal(exists, true); @@ -188,6 +202,13 @@ suite('UserDataFileSystemProvider', () => { assert.equal(actual.value, '{}'); }); + test('read file under sub container', async () => { + await pfs.mkdirp(path.join(userDataPath, 'testContainer', 'subContainer')); + await pfs.writeFile(path.join(userDataPath, 'testContainer', 'subContainer', 'settings.json'), '{}'); + const actual = await testObject.readFile(joinPath(userDataResource, 'testContainer/subContainer/settings.json')); + assert.equal(actual.value, '{}'); + }); + test('create file throws error for container', async () => { try { await testObject.createFile(joinPath(userDataResource, 'testContainer'), VSBuffer.fromString('{}')); @@ -236,6 +257,12 @@ suite('UserDataFileSystemProvider', () => { assert.equal(actual.toString(), '{a:1}'); }); + test('write file under sub container', async () => { + await testObject.writeFile(joinPath(userDataResource, 'testContainer/subContainer/settings.json'), VSBuffer.fromString('{}')); + const actual = await pfs.readFile(path.join(userDataPath, 'testContainer', 'subContainer', 'settings.json')); + assert.equal(actual, '{}'); + }); + test('delete file throws error for container that does not exist', async () => { try { await testObject.del(joinPath(userDataResource, 'testContainer')); @@ -274,6 +301,16 @@ suite('UserDataFileSystemProvider', () => { assert.equal(exists, false); }); + test('resolve container', async () => { + await pfs.mkdirp(path.join(userDataPath, 'testContainer')); + pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); + const result = await testObject.resolve(joinPath(userDataResource, 'testContainer')); + assert.ok(result.isDirectory); + assert.ok(result.children !== undefined); + assert.equal(result.children!.length, 1); + assert.equal(result.children![0].name, 'settings.json'); + }); + test('watch file under container - event is triggerred when file is created', async (done) => { const resource = joinPath(userDataResource, 'testContainer/settings.json'); const disposable = testObject.watch(resource); @@ -405,4 +442,32 @@ suite('UserDataFileSystemProvider', () => { }); await pfs.unlink(path.join(userDataPath, 'testContainer', 'settings.json')); }); + + test('read backup file', async () => { + await pfs.writeFile(path.join(backupsPath, 'backup.json'), '{}'); + const result = await testObject.readFile(joinPath(userDataResource, `${BACKUPS}/backup.json`)); + assert.equal(result.value, '{}'); + }); + + test('create backup file', async () => { + await testObject.createFile(joinPath(userDataResource, `${BACKUPS}/backup.json`), VSBuffer.fromString('{}')); + const result = await pfs.readFile(path.join(backupsPath, 'backup.json')); + assert.equal(result, '{}'); + }); + + test('write backup file', async () => { + await pfs.writeFile(path.join(backupsPath, 'backup.json'), '{}'); + await testObject.writeFile(joinPath(userDataResource, `${BACKUPS}/backup.json`), VSBuffer.fromString('{a:1}')); + const result = await pfs.readFile(path.join(backupsPath, 'backup.json')); + assert.equal(result, '{a:1}'); + }); + + test('resolve backups container', async () => { + pfs.writeFile(path.join(backupsPath, 'backup.json'), '{}'); + const result = await testObject.resolve(joinPath(userDataResource, BACKUPS)); + assert.ok(result.isDirectory); + assert.ok(result.children !== undefined); + assert.equal(result.children!.length, 1); + assert.equal(result.children![0].name, 'backup.json'); + }); }); \ No newline at end of file From 9b28638e8c7e6fefb458016342563f90c28fdfd2 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Wed, 3 Jul 2019 15:41:16 +0200 Subject: [PATCH 0984/1449] File picker cursor at beginning Fixes #76461 --- src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts b/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts index 6e892d18f95..c910dcaf35a 100644 --- a/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts +++ b/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts @@ -532,7 +532,7 @@ export class RemoteFileDialog { // Either force the autocomplete, or the old value should be one smaller than the new value and match the new value. if (itemBasename === '..') { // Don't match on the up directory item ever. - this.userEnteredPathSegment = startingValue; + this.userEnteredPathSegment = ''; this.autoCompletePathSegment = ''; this.activeItem = quickPickItem; if (force) { From b6089b1db51dbfb7b096a829261a0b3b9370d6e5 Mon Sep 17 00:00:00 2001 From: Joel Day Date: Wed, 3 Jul 2019 06:47:37 -0700 Subject: [PATCH 0985/1449] Adding support for TaskProvider.resolveTask (#71027) * Adding support for TaskProvider.resolveTask. * Reorganize task grouping and resolution async code for readability. * Made small changes and implmented resolveTask for gulp --- extensions/gulp/src/main.ts | 107 ++++++++++++------ .../workbench/api/browser/mainThreadTask.ts | 29 +++-- .../workbench/api/common/extHost.protocol.ts | 3 +- src/vs/workbench/api/node/extHost.api.impl.ts | 4 +- src/vs/workbench/api/node/extHostTask.ts | 57 ++++++++-- .../tasks/browser/abstractTaskService.ts | 38 ++++++- .../contrib/tasks/common/taskConfiguration.ts | 15 ++- .../contrib/tasks/common/taskService.ts | 3 +- .../workbench/contrib/tasks/common/tasks.ts | 3 + 9 files changed, 197 insertions(+), 62 deletions(-) diff --git a/extensions/gulp/src/main.ts b/extensions/gulp/src/main.ts index 49011bf7d68..ddc07a2f5c5 100644 --- a/extensions/gulp/src/main.ts +++ b/extensions/gulp/src/main.ts @@ -67,6 +67,24 @@ function showError() { }); } +async function findGulpCommand(rootPath: string): Promise { + let gulpCommand: string; + let platform = process.platform; + if (platform === 'win32' && await exists(path.join(rootPath, 'node_modules', '.bin', 'gulp.cmd'))) { + const globalGulp = path.join(process.env.APPDATA ? process.env.APPDATA : '', 'npm', 'gulp.cmd'); + if (await exists(globalGulp)) { + gulpCommand = '"' + globalGulp + '"'; + } else { + gulpCommand = path.join('.', 'node_modules', '.bin', 'gulp.cmd'); + } + } else if ((platform === 'linux' || platform === 'darwin') && await exists(path.join(rootPath, 'node_modules', '.bin', 'gulp'))) { + gulpCommand = path.join('.', 'node_modules', '.bin', 'gulp'); + } else { + gulpCommand = 'gulp'; + } + return gulpCommand; +} + interface GulpTaskDefinition extends vscode.TaskDefinition { task: string; file?: string; @@ -77,7 +95,9 @@ class FolderDetector { private fileWatcher: vscode.FileSystemWatcher | undefined; private promise: Thenable | undefined; - constructor(private _workspaceFolder: vscode.WorkspaceFolder) { + constructor( + private _workspaceFolder: vscode.WorkspaceFolder, + private _gulpCommand: Promise) { } public get workspaceFolder(): vscode.WorkspaceFolder { @@ -97,10 +117,28 @@ class FolderDetector { } public async getTasks(): Promise { - if (!this.promise) { - this.promise = this.computeTasks(); + if (this.isEnabled()) { + if (!this.promise) { + this.promise = this.computeTasks(); + } + return this.promise; + } else { + return []; } - return this.promise; + } + + public async getTask(_task: vscode.Task): Promise { + const gulpTask = (_task.definition).task; + if (gulpTask) { + let kind: GulpTaskDefinition = { + type: 'gulp', + task: gulpTask + }; + let options: vscode.ShellExecutionOptions = { cwd: this.workspaceFolder.uri.fsPath }; + let task = new vscode.Task(kind, this.workspaceFolder, gulpTask, 'gulp', new vscode.ShellExecution(await this._gulpCommand, [gulpTask], options)); + return task; + } + return undefined; } private async computeTasks(): Promise { @@ -117,22 +155,7 @@ class FolderDetector { } } - let gulpCommand: string; - let platform = process.platform; - if (platform === 'win32' && await exists(path.join(rootPath!, 'node_modules', '.bin', 'gulp.cmd'))) { - const globalGulp = path.join(process.env.APPDATA ? process.env.APPDATA : '', 'npm', 'gulp.cmd'); - if (await exists(globalGulp)) { - gulpCommand = '"' + globalGulp + '"'; - } else { - gulpCommand = path.join('.', 'node_modules', '.bin', 'gulp.cmd'); - } - } else if ((platform === 'linux' || platform === 'darwin') && await exists(path.join(rootPath!, 'node_modules', '.bin', 'gulp'))) { - gulpCommand = path.join('.', 'node_modules', '.bin', 'gulp'); - } else { - gulpCommand = 'gulp'; - } - - let commandLine = `${gulpCommand} --tasks-simple --no-color`; + let commandLine = `${await this._gulpCommand} --tasks-simple --no-color`; try { let { stdout, stderr } = await exec(commandLine, { cwd: rootPath }); if (stderr && stderr.length > 0) { @@ -151,7 +174,7 @@ class FolderDetector { task: line }; let options: vscode.ShellExecutionOptions = { cwd: this.workspaceFolder.uri.fsPath }; - let task = new vscode.Task(kind, this.workspaceFolder, line, 'gulp', new vscode.ShellExecution(gulpCommand, [line], options)); + let task = new vscode.Task(kind, this.workspaceFolder, line, 'gulp', new vscode.ShellExecution(await this._gulpCommand, [line], options)); result.push(task); let lowerCaseLine = line.toLowerCase(); if (isBuildTask(lowerCaseLine)) { @@ -218,9 +241,9 @@ class TaskDetector { } } for (let add of added) { - let detector = new FolderDetector(add); + let detector = new FolderDetector(add, findGulpCommand(add.uri.fsPath)); + this.detectors.set(add.uri.toString(), detector); if (detector.isEnabled()) { - this.detectors.set(add.uri.toString(), detector); detector.start(); } } @@ -229,18 +252,16 @@ class TaskDetector { private updateConfiguration(): void { for (let detector of this.detectors.values()) { - if (!detector.isEnabled()) { - detector.dispose(); - this.detectors.delete(detector.workspaceFolder.uri.toString()); - } + detector.dispose(); + this.detectors.delete(detector.workspaceFolder.uri.toString()); } let folders = vscode.workspace.workspaceFolders; if (folders) { for (let folder of folders) { if (!this.detectors.has(folder.uri.toString())) { - let detector = new FolderDetector(folder); + let detector = new FolderDetector(folder, findGulpCommand(folder.uri.fsPath)); + this.detectors.set(folder.uri.toString(), detector); if (detector.isEnabled()) { - this.detectors.set(folder.uri.toString(), detector); detector.start(); } } @@ -251,12 +272,13 @@ class TaskDetector { private updateProvider(): void { if (!this.taskProvider && this.detectors.size > 0) { + const thisCapture = this; this.taskProvider = vscode.workspace.registerTaskProvider('gulp', { - provideTasks: () => { - return this.getTasks(); + provideTasks(): Promise { + return thisCapture.getTasks(); }, - resolveTask(_task: vscode.Task): vscode.Task | undefined { - return undefined; + resolveTask(_task: vscode.Task): Promise { + return thisCapture.getTask(_task); } }); } @@ -291,6 +313,25 @@ class TaskDetector { }); } } + + public async getTask(task: vscode.Task): Promise { + if (this.detectors.size === 0) { + return undefined; + } else if (this.detectors.size === 1) { + return this.detectors.values().next().value.getTask(task); + } else { + if ((task.scope === vscode.TaskScope.Workspace) || (task.scope === vscode.TaskScope.Global)) { + // Not supported, we don't have enough info to create the task. + return undefined; + } else if (task.scope) { + const detector = this.detectors.get(task.scope.uri.toString()); + if (detector) { + return detector.getTask(task); + } + } + return undefined; + } + } } let detector: TaskDetector; diff --git a/src/vs/workbench/api/browser/mainThreadTask.ts b/src/vs/workbench/api/browser/mainThreadTask.ts index 2b774c47ce6..16553729ee4 100644 --- a/src/vs/workbench/api/browser/mainThreadTask.ts +++ b/src/vs/workbench/api/browser/mainThreadTask.ts @@ -16,7 +16,7 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { IWorkspaceContextService, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { - ContributedTask, KeyedTaskIdentifier, TaskExecution, Task, TaskEvent, TaskEventKind, + ContributedTask, ConfiguringTask, KeyedTaskIdentifier, TaskExecution, Task, TaskEvent, TaskEventKind, PresentationOptions, CommandOptions, CommandConfiguration, RuntimeType, CustomTask, TaskScope, TaskSource, TaskSourceKind, ExtensionTaskSource, RunOptions, TaskSet, TaskDefinition } from 'vs/workbench/contrib/tasks/common/tasks'; @@ -304,8 +304,8 @@ namespace TaskHandleDTO { } namespace TaskDTO { - export function from(task: Task): TaskDTO | undefined { - if (task === undefined || task === null || (!CustomTask.is(task) && !ContributedTask.is(task))) { + export function from(task: Task | ConfiguringTask): TaskDTO | undefined { + if (task === undefined || task === null || (!CustomTask.is(task) && !ContributedTask.is(task) && !ConfiguringTask.is(task))) { return undefined; } const result: TaskDTO = { @@ -314,7 +314,7 @@ namespace TaskDTO { definition: TaskDefinitionDTO.from(task.getDefinition()), source: TaskSourceDTO.from(task._source), execution: undefined, - presentationOptions: task.command ? TaskPresentationOptionsDTO.from(task.command.presentation) : undefined, + presentationOptions: !ConfiguringTask.is(task) && task.command ? TaskPresentationOptionsDTO.from(task.command.presentation) : undefined, isBackground: task.configurationProperties.isBackground, problemMatchers: [], hasDefinedMatchers: ContributedTask.is(task) ? task.hasDefinedMatchers : false, @@ -323,7 +323,7 @@ namespace TaskDTO { if (task.configurationProperties.group) { result.group = task.configurationProperties.group; } - if (task.command) { + if (!ConfiguringTask.is(task) && task.command) { if (task.command.runtime === RuntimeType.Process) { result.execution = ProcessExecutionDTO.from(task.command); } else if (task.command.runtime === RuntimeType.Shell) { @@ -442,7 +442,7 @@ export class MainThreadTask implements MainThreadTaskShape { }); } - public $registerTaskProvider(handle: number): Promise { + public $registerTaskProvider(handle: number, type: string): Promise { const provider: ITaskProvider = { provideTasks: (validTypes: IStringDictionary) => { return Promise.resolve(this._proxy.$provideTasks(handle, validTypes)).then((value) => { @@ -460,9 +460,24 @@ export class MainThreadTask implements MainThreadTaskShape { extension: value.extension } as TaskSet; }); + }, + resolveTask: (task: ConfiguringTask) => { + const dto = TaskDTO.from(task); + + if (dto) { + dto.name = ((dto.name === undefined) ? '' : dto.name); // Using an empty name causes the name to default to the one given by the provider. + return Promise.resolve(this._proxy.$resolveTask(handle, dto)).then(resolvedTask => { + if (resolvedTask) { + return TaskDTO.to(resolvedTask, this._workspaceContextServer, true); + } + + return undefined; + }); + } + return Promise.resolve(undefined); } }; - const disposable = this._taskService.registerTaskProvider(provider); + const disposable = this._taskService.registerTaskProvider(provider, type); this._providers.set(handle, { disposable, provider }); return Promise.resolve(undefined); } diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 603fe598cfe..1f2802ea390 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -635,7 +635,7 @@ export interface MainThreadSearchShape extends IDisposable { export interface MainThreadTaskShape extends IDisposable { $createTaskId(task: tasks.TaskDTO): Promise; - $registerTaskProvider(handle: number): Promise; + $registerTaskProvider(handle: number, type: string): Promise; $unregisterTaskProvider(handle: number): Promise; $fetchTasks(filter?: tasks.TaskFilterDTO): Promise; $executeTask(task: tasks.TaskHandleDTO | tasks.TaskDTO): Promise; @@ -1183,6 +1183,7 @@ export interface ExtHostSCMShape { export interface ExtHostTaskShape { $provideTasks(handle: number, validTypes: { [key: string]: boolean; }): Thenable; + $resolveTask(handle: number, taskDTO: tasks.TaskDTO): Thenable; $onDidStartTask(execution: tasks.TaskExecutionDTO, terminalId: number): void; $onDidStartTaskProcess(value: tasks.TaskProcessStartedDTO): void; $onDidEndTaskProcess(value: tasks.TaskProcessEndedDTO): void; diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 090aae11322..bbb26a719e9 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -675,7 +675,7 @@ export function createApiFactory( return extHostDocumentContentProviders.registerTextDocumentContentProvider(scheme, provider); }, registerTaskProvider: (type: string, provider: vscode.TaskProvider) => { - return extHostTask.registerTaskProvider(extension, provider); + return extHostTask.registerTaskProvider(extension, type, provider); }, registerFileSystemProvider(scheme, provider, options) { return extHostFileSystem.registerFileSystemProvider(scheme, provider, options); @@ -776,7 +776,7 @@ export function createApiFactory( const tasks: typeof vscode.tasks = { registerTaskProvider: (type: string, provider: vscode.TaskProvider) => { - return extHostTask.registerTaskProvider(extension, provider); + return extHostTask.registerTaskProvider(extension, type, provider); }, fetchTasks: (filter?: vscode.TaskFilter): Thenable => { return extHostTask.fetchTasks(filter); diff --git a/src/vs/workbench/api/node/extHostTask.ts b/src/vs/workbench/api/node/extHostTask.ts index ca88785c082..cac5d242ad9 100644 --- a/src/vs/workbench/api/node/extHostTask.ts +++ b/src/vs/workbench/api/node/extHostTask.ts @@ -347,6 +347,7 @@ namespace TaskExecutionDTO { } interface HandlerData { + type: string; provider: vscode.TaskProvider; extension: IExtensionDescription; } @@ -492,13 +493,13 @@ export class ExtHostTask implements ExtHostTaskShape { this._activeCustomExecutions = new Map(); } - public registerTaskProvider(extension: IExtensionDescription, provider: vscode.TaskProvider): vscode.Disposable { + public registerTaskProvider(extension: IExtensionDescription, type: string, provider: vscode.TaskProvider): vscode.Disposable { if (!provider) { return new types.Disposable(() => { }); } const handle = this.nextHandle(); - this._handlers.set(handle, { provider, extension }); - this._proxy.$registerTaskProvider(handle); + this._handlers.set(handle, { type, provider, extension }); + this._proxy.$registerTaskProvider(handle, type); return new types.Disposable(() => { this._handlers.delete(handle); this._proxy.$unregisterTaskProvider(handle); @@ -652,15 +653,10 @@ export class ExtHostTask implements ExtHostTaskShape { taskDTOs.push(taskDTO); if (CustomExecutionDTO.is(taskDTO.execution)) { - taskIdPromises.push(new Promise((resolve) => { - // The ID is calculated on the main thread task side, so, let's call into it here. - // We need the task id's pre-computed for custom task executions because when OnDidStartTask - // is invoked, we have to be able to map it back to our data. - this._proxy.$createTaskId(taskDTO).then((taskId) => { - this._providedCustomExecutions.set(taskId, new CustomExecutionData((task).execution2, this._terminalService)); - resolve(); - }); - })); + // The ID is calculated on the main thread task side, so, let's call into it here. + // We need the task id's pre-computed for custom task executions because when OnDidStartTask + // is invoked, we have to be able to map it back to our data. + taskIdPromises.push(this.addCustomExecution(taskDTO, task)); } } } @@ -680,6 +676,38 @@ export class ExtHostTask implements ExtHostTaskShape { }); } + public async $resolveTask(handle: number, taskDTO: TaskDTO): Promise { + const handler = this._handlers.get(handle); + if (!handler) { + return Promise.reject(new Error('no handler found')); + } + + if (taskDTO.definition.type !== handler.type) { + throw new Error(`Unexpected: Task of type [${taskDTO.definition.type}] cannot be resolved by provider of type [${handler.type}].`); + } + + const task = await TaskDTO.to(taskDTO, this._workspaceProvider); + if (!task) { + throw new Error('Unexpected: Task cannot be resolved.'); + } + + const resolvedTask = await handler.provider.resolveTask(task, CancellationToken.None); + if (!resolvedTask) { + return; + } + + const resolvedTaskDTO: TaskDTO | undefined = TaskDTO.from(resolvedTask, handler.extension); + if (!resolvedTaskDTO) { + throw new Error('Unexpected: Task cannot be resolved.'); + } + + if (CustomExecutionDTO.is(resolvedTaskDTO.execution)) { + await this.addCustomExecution(taskDTO, task); + } + + return resolvedTaskDTO; + } + public async $resolveVariables(uriComponents: UriComponents, toResolve: { process?: { name: string; cwd?: string; path?: string }, variables: string[] }): Promise<{ process?: string, variables: { [key: string]: string; } }> { const configProvider = await this._configurationService.getConfigProvider(); const uri: URI = URI.revive(uriComponents); @@ -725,6 +753,11 @@ export class ExtHostTask implements ExtHostTaskShape { return this._handleCounter++; } + private async addCustomExecution(taskDTO: TaskDTO, task: vscode.Task2): Promise { + const taskId = await this._proxy.$createTaskId(taskDTO); + this._providedCustomExecutions.set(taskId, new CustomExecutionData((task).execution2, this._terminalService)); + } + private async getTaskExecution(execution: TaskExecutionDTO | string, task?: vscode.Task): Promise { if (typeof execution === 'string') { const taskExecution = this._taskExecutions.get(execution); diff --git a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts index 13c49ee0fb1..e235b3821cc 100644 --- a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts +++ b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts @@ -182,6 +182,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer private _ignoredWorkspaceFolders: IWorkspaceFolder[]; private _showIgnoreMessage?: boolean; private _providers: Map; + private _providerTypes: Map; protected _taskSystemInfos: Map; protected _workspaceTasksPromise?: Promise>; @@ -230,6 +231,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer this._taskSystemListener = undefined; this._outputChannel = this.outputService.getChannel(AbstractTaskService.OutputChannelId)!; this._providers = new Map(); + this._providerTypes = new Map(); this._taskSystemInfos = new Map(); this._register(this.contextService.onDidChangeWorkspaceFolders(() => { if (!this._taskSystem && !this._workspaceTasksPromise) { @@ -443,7 +445,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer } } - public registerTaskProvider(provider: ITaskProvider): IDisposable { + public registerTaskProvider(provider: ITaskProvider, type: string): IDisposable { if (!provider) { return { dispose: () => { } @@ -451,9 +453,11 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer } let handle = AbstractTaskService.nextHandle++; this._providers.set(handle, provider); + this._providerTypes.set(handle, type); return { dispose: () => { this._providers.delete(handle); + this._providerTypes.delete(handle); } }; } @@ -1154,6 +1158,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer }).then((contributedTaskSets) => { let result: TaskMap = new TaskMap(); let contributedTasks: TaskMap = new TaskMap(); + for (let set of contributedTaskSets) { for (let task of set.tasks) { let workspaceFolder = task.getWorkspaceFolder(); @@ -1162,8 +1167,10 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer } } } - return this.getWorkspaceTasks().then((customTasks) => { - customTasks.forEach((folderTasks, key) => { + + return this.getWorkspaceTasks().then(async (customTasks) => { + const customTasksKeyValuePairs = Array.from(customTasks); + const customTasksPromises = customTasksKeyValuePairs.map(async ([key, folderTasks]) => { let contributed = contributedTasks.get(key); if (!folderTasks.set) { if (contributed) { @@ -1221,8 +1228,26 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer } else { result.add(key, ...folderTasks.set.tasks); } - unUsedConfigurations.forEach((value) => { + + const unUsedConfigurationsAsArray = Array.from(unUsedConfigurations); + + const unUsedConfigurationPromises = unUsedConfigurationsAsArray.map(async (value) => { let configuringTask = configurations!.byIdentifier[value]; + + for (const [handle, provider] of this._providers) { + if (configuringTask.type === this._providerTypes.get(handle)) { + try { + const resolvedTask = await provider.resolveTask(configuringTask); + if (resolvedTask) { + result.add(key, TaskConfig.createCustomTask(resolvedTask, configuringTask)); + return; + } + } catch (error) { + // Ignore errors. The task could not be provided by any of the providers. + } + } + } + this._outputChannel.append(nls.localize( 'TaskService.noConfiguration', 'Error: The {0} task detection didn\'t contribute a task for the following configuration:\n{1}\nThe task will be ignored.\n', @@ -1231,12 +1256,17 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer )); this.showOutput(); }); + + await Promise.all(unUsedConfigurationPromises); } else { result.add(key, ...folderTasks.set.tasks); result.add(key, ...contributed); } } }); + + await Promise.all(customTasksPromises); + return result; }, () => { // If we can't read the tasks.json file provide at least the contributed tasks diff --git a/src/vs/workbench/contrib/tasks/common/taskConfiguration.ts b/src/vs/workbench/contrib/tasks/common/taskConfiguration.ts index 28f45c4edf7..515edd44738 100644 --- a/src/vs/workbench/contrib/tasks/common/taskConfiguration.ts +++ b/src/vs/workbench/contrib/tasks/common/taskConfiguration.ts @@ -7,6 +7,7 @@ import * as nls from 'vs/nls'; import * as Objects from 'vs/base/common/objects'; import { IStringDictionary } from 'vs/base/common/collections'; +import { IJSONSchemaMap } from 'vs/base/common/jsonSchema'; import { Platform } from 'vs/base/common/platform'; import * as Types from 'vs/base/common/types'; import * as UUID from 'vs/base/common/uuid'; @@ -22,6 +23,7 @@ import * as Tasks from './tasks'; import { TaskDefinitionRegistry } from './taskDefinitionRegistry'; import { ConfiguredInput } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; + export const enum ShellQuoting { /** * Default is character escaping. @@ -1240,11 +1242,20 @@ namespace ConfigurationProperties { { property: 'presentation', type: CommandConfiguration.PresentationOptions }, { property: 'problemMatchers' } ]; - export function from(this: void, external: ConfigurationProperties, context: ParseContext, includeCommandOptions: boolean): Tasks.ConfigurationProperties | undefined { + export function from(this: void, external: ConfigurationProperties, context: ParseContext, includeCommandOptions: boolean, properties?: IJSONSchemaMap): Tasks.ConfigurationProperties | undefined { if (!external) { return undefined; } let result: Tasks.ConfigurationProperties = {}; + + if (properties) { + for (const propertyName of Object.keys(properties)) { + if (external[propertyName] !== undefined) { + result[propertyName] = Objects.deepClone(external[propertyName]); + } + } + } + if (Types.isString(external.taskName)) { result.name = external.taskName; } @@ -1380,7 +1391,7 @@ namespace ConfiguringTask { RunOptions.fromConfiguration(external.runOptions), {} ); - let configuration = ConfigurationProperties.from(external, context, true); + let configuration = ConfigurationProperties.from(external, context, true, typeDeclaration.properties); if (configuration) { result.configurationProperties = Objects.assign(result.configurationProperties, configuration); if (result.configurationProperties.name) { diff --git a/src/vs/workbench/contrib/tasks/common/taskService.ts b/src/vs/workbench/contrib/tasks/common/taskService.ts index e8235e7877e..b154aed1cbe 100644 --- a/src/vs/workbench/contrib/tasks/common/taskService.ts +++ b/src/vs/workbench/contrib/tasks/common/taskService.ts @@ -20,6 +20,7 @@ export const ITaskService = createDecorator('taskService'); export interface ITaskProvider { provideTasks(validTypes: IStringDictionary): Promise; + resolveTask(task: ConfiguringTask): Promise; } export interface ProblemMatcherRunOptions { @@ -79,7 +80,7 @@ export interface ITaskService { customize(task: ContributedTask | CustomTask, properties?: {}, openConfig?: boolean): Promise; openConfig(task: CustomTask | undefined): Promise; - registerTaskProvider(taskProvider: ITaskProvider): IDisposable; + registerTaskProvider(taskProvider: ITaskProvider, type: string): IDisposable; registerTaskSystem(scheme: string, taskSystemInfo: TaskSystemInfo): void; diff --git a/src/vs/workbench/contrib/tasks/common/tasks.ts b/src/vs/workbench/contrib/tasks/common/tasks.ts index a9bab79d9ce..0b9ff835776 100644 --- a/src/vs/workbench/contrib/tasks/common/tasks.ts +++ b/src/vs/workbench/contrib/tasks/common/tasks.ts @@ -745,6 +745,9 @@ export class ConfiguringTask extends CommonTask { return object; } + public getDefinition(): KeyedTaskIdentifier { + return this.configures; + } } export class ContributedTask extends CommonTask { From 67cab1a7105aec77129b3336747fd6061bc934c9 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 15:51:08 +0200 Subject: [PATCH 0986/1449] empty commit From cb58cf91a79c200c656d9f13b6fcf783608688a3 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 3 Jul 2019 15:54:56 +0200 Subject: [PATCH 0987/1449] :up: vscode-sqlite3@4.0.8 --- package.json | 2 +- src/typings/vscode-sqlite3.d.ts | 8 +++++++- yarn.lock | 12 ++++++------ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 0b3cd6247ee..b0f93c2caf6 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "vscode-chokidar": "2.1.7", "vscode-proxy-agent": "0.4.0", "vscode-ripgrep": "^1.3.1", - "vscode-sqlite3": "4.0.7", + "vscode-sqlite3": "4.0.8", "vscode-textmate": "^4.1.1", "xterm": "3.15.0-beta50", "xterm-addon-search": "0.1.0-beta6", diff --git a/src/typings/vscode-sqlite3.d.ts b/src/typings/vscode-sqlite3.d.ts index 4363d251c46..9a79c4ded1c 100644 --- a/src/typings/vscode-sqlite3.d.ts +++ b/src/typings/vscode-sqlite3.d.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Type definitions for sqlite3 3.1 -// Project: https://github.com/mapbox/node-sqlite3 +// Project: http://github.com/mapbox/node-sqlite3 // Definitions by: Nick Malaguti // Sumant Manne // Behind The Math @@ -18,6 +18,9 @@ declare module 'vscode-sqlite3' { export const OPEN_READONLY: number; export const OPEN_READWRITE: number; export const OPEN_CREATE: number; + export const OPEN_SHAREDCACHE: number; + export const OPEN_PRIVATECACHE: number; + export const OPEN_URI: number; export const cached: { Database(filename: string, callback?: (this: Database, err: Error | null) => void): Database; @@ -100,6 +103,9 @@ declare module 'vscode-sqlite3' { OPEN_READONLY: number; OPEN_READWRITE: number; OPEN_CREATE: number; + OPEN_SHAREDCACHE: number; + OPEN_PRIVATECACHE: number; + OPEN_URI: number; cached: typeof cached; RunResult: RunResult; Statement: typeof Statement; diff --git a/yarn.lock b/yarn.lock index 3742868224a..dbc0d7fff9b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5931,7 +5931,7 @@ nan@^2.12.1: resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" integrity sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw== -nan@^2.9.2, nan@~2.10.0: +nan@^2.9.2: version "2.10.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" integrity sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA== @@ -9515,12 +9515,12 @@ vscode-ripgrep@^1.3.1: resolved "https://registry.yarnpkg.com/vscode-ripgrep/-/vscode-ripgrep-1.3.1.tgz#51fb93debcd0c18a8b90dbc37f84f94333d0c486" integrity sha512-4WLB/n4ZeWNi5AEzPTkfYrqbKtXlv0SlgmxbRVdulwZzGx/lfWeWPu9Shy32orM27IofQAQDuirbRBOYNJVzBA== -vscode-sqlite3@4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/vscode-sqlite3/-/vscode-sqlite3-4.0.7.tgz#7adbf0fe411c87716ca3c4e467f04de3a7353125" - integrity sha512-1BqWdf6Nzs+q7JC+JFXDLX2Z8ZID7lZH69AoLh9FXos7XgLbF4dsmUZO5a6d9X3Jccu/m0PfKK1K4E6dk/xiRg== +vscode-sqlite3@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/vscode-sqlite3/-/vscode-sqlite3-4.0.8.tgz#1eba415b996d2661628d80d4a191a20767713829" + integrity sha512-FsFtYSHmy0mYjtt9ibFKsJqbRzqaltDKZ5SLdpykjvORugFMr0HfGunkh+qGaz9CvAiqjM2KVO91NE9KdyTWKQ== dependencies: - nan "~2.10.0" + nan "^2.14.0" vscode-textmate@^4.1.1: version "4.1.1" From ab02882fed465bbced926e967f1cd384cc4d3290 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 3 Jul 2019 16:02:45 +0200 Subject: [PATCH 0988/1449] Extract TokensStore --- src/vs/editor/common/model/textModel.ts | 8 +- src/vs/editor/common/model/textModelTokens.ts | 197 +++++++++++------- .../test/common/model/model.modes.test.ts | 2 +- 3 files changed, 128 insertions(+), 79 deletions(-) diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index 344613d09eb..25a47febe22 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -1784,12 +1784,12 @@ export class TextModel extends Disposable implements model.ITextModel { startLineNumber = Math.max(1, startLineNumber); endLineNumber = Math.min(this.getLineCount(), endLineNumber); - if (endLineNumber <= this._tokens.inValidLineStartIndex) { + if (endLineNumber <= this._tokens.invalidLineStartIndex) { // nothing to do return; } - if (startLineNumber <= this._tokens.inValidLineStartIndex) { + if (startLineNumber <= this._tokens.invalidLineStartIndex) { // tokenization has reached the viewport start... this.forceTokenization(endLineNumber); return; @@ -1838,7 +1838,7 @@ export class TextModel extends Disposable implements model.ITextModel { // We cannot trust these states/tokens to be valid! // (see https://github.com/Microsoft/vscode/issues/67607) - this._tokens._setIsInvalid(i - 1, true); + this._tokens._invalidateLine(i - 1); this._tokens._setState(i - 1, state); state = r.endState.clone(); eventBuilder.registerChangedTokens(i); @@ -1884,7 +1884,7 @@ export class TextModel extends Disposable implements model.ITextModel { return false; } - if (lineNumber < this._tokens.inValidLineStartIndex + 1) { + if (lineNumber < this._tokens.invalidLineStartIndex + 1) { return true; } diff --git a/src/vs/editor/common/model/textModelTokens.ts b/src/vs/editor/common/model/textModelTokens.ts index 8387872c18f..4dbdda80829 100644 --- a/src/vs/editor/common/model/textModelTokens.ts +++ b/src/vs/editor/common/model/textModelTokens.ts @@ -165,37 +165,22 @@ class ModelLineTokens { } } -export class ModelLinesTokens { - - public readonly languageIdentifier: LanguageIdentifier; - public readonly tokenizationSupport: ITokenizationSupport | null; +class TokensStore { private _tokens: ModelLineTokens[]; - private _invalidLineStartIndex: number; - private _lastState: IState | null; + _invalidLineStartIndex: number; + _lastState: IState | null; - constructor(languageIdentifier: LanguageIdentifier, tokenizationSupport: ITokenizationSupport | null) { - this.languageIdentifier = languageIdentifier; - this.tokenizationSupport = tokenizationSupport; + constructor(initialState: IState | null) { this._tokens = []; - if (this.tokenizationSupport) { - let initialState: IState | null = null; - try { - initialState = this.tokenizationSupport.getInitialState(); - } catch (e) { - onUnexpectedError(e); - this.tokenizationSupport = null; - } - - if (initialState) { - this._tokens[0] = new ModelLineTokens(initialState); - } - } - this._invalidLineStartIndex = 0; this._lastState = null; + + if (initialState) { + this._tokens[0] = new ModelLineTokens(initialState); + } } - public get inValidLineStartIndex() { + public get invalidLineStartIndex() { return this._invalidLineStartIndex; } @@ -215,15 +200,6 @@ export class ModelLinesTokens { return new LineTokens(lineTokens, lineText); } - public isCheapToTokenize(lineNumber: number): boolean { - const firstInvalidLineNumber = this._invalidLineStartIndex + 1; - return (firstInvalidLineNumber >= lineNumber); - } - - public hasLinesToTokenize(buffer: ITextBuffer): boolean { - return (this._invalidLineStartIndex < buffer.getLineCount()); - } - public invalidateLine(lineIndex: number): void { this._setIsInvalid(lineIndex, true); if (lineIndex < this._invalidLineStartIndex) { @@ -232,27 +208,27 @@ export class ModelLinesTokens { } } - _setIsInvalid(lineIndex: number, invalid: boolean): void { + private _setIsInvalid(lineIndex: number, invalid: boolean): void { if (lineIndex < this._tokens.length && this._tokens[lineIndex]) { this._tokens[lineIndex]._invalid = invalid; } } - _isInvalid(lineIndex: number): boolean { + public isInvalid(lineIndex: number): boolean { if (lineIndex < this._tokens.length && this._tokens[lineIndex]) { return this._tokens[lineIndex]._invalid; } return true; } - _getState(lineIndex: number): IState | null { + public getState(lineIndex: number): IState | null { if (lineIndex < this._tokens.length && this._tokens[lineIndex]) { return this._tokens[lineIndex]._state; } return null; } - _setTokens(topLevelLanguageId: LanguageId, lineIndex: number, lineTextLength: number, tokens: Uint32Array): void { + public setTokens(topLevelLanguageId: LanguageId, lineIndex: number, lineTextLength: number, tokens: Uint32Array): void { let target: ModelLineTokens; if (lineIndex < this._tokens.length && this._tokens[lineIndex]) { target = this._tokens[lineIndex]; @@ -284,7 +260,43 @@ export class ModelLinesTokens { target._lineTokens = tokens.buffer; } - _setState(lineIndex: number, state: IState): void { + public setGoodTokens(topLevelLanguageId: LanguageId, linesLength: number, lineIndex: number, text: string, r: TokenizationResult2): void { + const endStateIndex = lineIndex + 1; + this.setTokens(topLevelLanguageId, lineIndex, text.length, r.tokens); + this._setIsInvalid(lineIndex, false); + + if (endStateIndex < linesLength) { + const previousEndState = this.getState(endStateIndex); + if (previousEndState !== null && r.endState.equals(previousEndState)) { + // The end state of this line remains the same + let nextInvalidLineIndex = lineIndex + 1; + while (nextInvalidLineIndex < linesLength) { + if (this.isInvalid(nextInvalidLineIndex)) { + break; + } + if (nextInvalidLineIndex + 1 < linesLength) { + if (this.getState(nextInvalidLineIndex + 1) === null) { + break; + } + } else { + if (this._lastState === null) { + break; + } + } + nextInvalidLineIndex++; + } + this._invalidLineStartIndex = nextInvalidLineIndex; + } else { + this._invalidLineStartIndex = lineIndex + 1; + this.setState(endStateIndex, r.endState); + } + } else { + this._lastState = r.endState; + this._invalidLineStartIndex = linesLength; + } + } + + public setState(lineIndex: number, state: IState): void { if (lineIndex < this._tokens.length && this._tokens[lineIndex]) { this._tokens[lineIndex]._state = state; } else { @@ -374,6 +386,74 @@ export class ModelLinesTokens { } //#endregion +} + +export class ModelLinesTokens { + + public readonly languageIdentifier: LanguageIdentifier; + public readonly tokenizationSupport: ITokenizationSupport | null; + public readonly store: TokensStore; + + constructor(languageIdentifier: LanguageIdentifier, tokenizationSupport: ITokenizationSupport | null) { + this.languageIdentifier = languageIdentifier; + this.tokenizationSupport = tokenizationSupport; + + let initialState: IState | null = null; + if (this.tokenizationSupport) { + try { + initialState = this.tokenizationSupport.getInitialState(); + } catch (e) { + onUnexpectedError(e); + this.tokenizationSupport = null; + } + } + this.store = new TokensStore(initialState); + } + + public get invalidLineStartIndex() { + return this.store.invalidLineStartIndex; + } + + public getTokens(topLevelLanguageId: LanguageId, lineIndex: number, lineText: string): LineTokens { + return this.store.getTokens(topLevelLanguageId, lineIndex, lineText); + } + + public isCheapToTokenize(lineNumber: number): boolean { + const firstInvalidLineNumber = this.store.invalidLineStartIndex + 1; + return (firstInvalidLineNumber >= lineNumber); + } + + public hasLinesToTokenize(buffer: ITextBuffer): boolean { + return (this.store.invalidLineStartIndex < buffer.getLineCount()); + } + + _isInvalid(lineIndex: number): boolean { + return this.store.isInvalid(lineIndex); + } + + _getState(lineIndex: number): IState | null { + return this.store.getState(lineIndex); + } + + _setTokens(topLevelLanguageId: LanguageId, lineIndex: number, lineTextLength: number, tokens: Uint32Array): void { + this.store.setTokens(topLevelLanguageId, lineIndex, lineTextLength, tokens); + } + + _setState(lineIndex: number, state: IState): void { + this.store.setState(lineIndex, state); + } + + //#region Editing + + public applyEdits(range: Range, eolCount: number, firstLineLength: number): void { + this.store.applyEdits(range, eolCount, firstLineLength); + } + + _invalidateLine(lineIndex: number): void { + this.store.invalidateLine(lineIndex); + } + + //#endregion //#region Tokenization @@ -381,7 +461,7 @@ export class ModelLinesTokens { if (!this.hasLinesToTokenize(buffer)) { return buffer.getLineCount() + 1; } - const lineNumber = this._invalidLineStartIndex + 1; + const lineNumber = this.store.invalidLineStartIndex + 1; this._updateTokensUntilLine(buffer, eventBuilder, lineNumber); return lineNumber; } @@ -405,7 +485,7 @@ export class ModelLinesTokens { public _updateTokensUntilLine(buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, lineNumber: number): void { if (!this.tokenizationSupport) { - this._invalidLineStartIndex = buffer.getLineCount(); + this.store._invalidLineStartIndex = buffer.getLineCount(); return; } @@ -413,8 +493,7 @@ export class ModelLinesTokens { const endLineIndex = lineNumber - 1; // Validate all states up to and including endLineIndex - for (let lineIndex = this._invalidLineStartIndex; lineIndex <= endLineIndex; lineIndex++) { - const endStateIndex = lineIndex + 1; + for (let lineIndex = this.store.invalidLineStartIndex; lineIndex <= endLineIndex; lineIndex++) { const text = buffer.getLineContent(lineIndex + 1); const lineStartState = this._getState(lineIndex); @@ -431,40 +510,10 @@ export class ModelLinesTokens { if (!r) { r = nullTokenize2(this.languageIdentifier.id, text, lineStartState, 0); } - this._setTokens(this.languageIdentifier.id, lineIndex, text.length, r.tokens); + this.store.setGoodTokens(this.languageIdentifier.id, linesLength, lineIndex, text, r); eventBuilder.registerChangedTokens(lineIndex + 1); - this._setIsInvalid(lineIndex, false); - - if (endStateIndex < linesLength) { - const previousEndState = this._getState(endStateIndex); - if (previousEndState !== null && r.endState.equals(previousEndState)) { - // The end state of this line remains the same - let nextInvalidLineIndex = lineIndex + 1; - while (nextInvalidLineIndex < linesLength) { - if (this._isInvalid(nextInvalidLineIndex)) { - break; - } - if (nextInvalidLineIndex + 1 < linesLength) { - if (this._getState(nextInvalidLineIndex + 1) === null) { - break; - } - } else { - if (this._lastState === null) { - break; - } - } - nextInvalidLineIndex++; - } - this._invalidLineStartIndex = Math.max(this._invalidLineStartIndex, nextInvalidLineIndex); - lineIndex = nextInvalidLineIndex - 1; // -1 because the outer loop increments it - } else { - this._setState(endStateIndex, r.endState); - } - } else { - this._lastState = r.endState; - } + lineIndex = this.store.invalidLineStartIndex - 1; // -1 because the outer loop increments it } - this._invalidLineStartIndex = Math.max(this._invalidLineStartIndex, endLineIndex + 1); } // #endregion diff --git a/src/vs/editor/test/common/model/model.modes.test.ts b/src/vs/editor/test/common/model/model.modes.test.ts index 3f2a4044f3e..61a8bee1f08 100644 --- a/src/vs/editor/test/common/model/model.modes.test.ts +++ b/src/vs/editor/test/common/model/model.modes.test.ts @@ -198,7 +198,7 @@ suite('Editor Model - Model Modes 2', () => { for (i = 0; i < len; i++) { stateEqual(model._tokens._getState(i)!, states[i]); } - stateEqual((model)._tokens._lastState, states[len]); + stateEqual(model._tokens.store._lastState!, states[len]); } let thisModel: TextModel; From 9757e35a5266f7e6b9d87684365a8b3dac72cbdc Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 16:06:55 +0200 Subject: [PATCH 0989/1449] use platform independent cache --- build/azure-pipelines/product-compile.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml index c34da000bcb..020b59a3e72 100644 --- a/build/azure-pipelines/product-compile.yml +++ b/build/azure-pipelines/product-compile.yml @@ -9,6 +9,7 @@ steps: keyfile: '.build/commit' targetfolder: '.build, out-build' vstsFeed: 'npm-vscode' + platformIndependent: true alias: 'Compilation' - task: NodeTool@0 @@ -120,5 +121,6 @@ steps: keyfile: '.build/commit' targetfolder: '.build, out-build' vstsFeed: 'npm-vscode' + platformIndependent: true alias: 'Compilation' condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) \ No newline at end of file From b9476a5256057b023c8571d898343c9a1e0864cd Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 16:12:26 +0200 Subject: [PATCH 0990/1449] linux build step should pick up on compile --- .../linux/product-build-linux.yml | 45 +++++++------------ build/azure-pipelines/product-build.yml | 22 ++++----- build/azure-pipelines/product-compile.yml | 6 --- 3 files changed, 29 insertions(+), 44 deletions(-) diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index f6887313aef..c868be07f08 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -1,4 +1,17 @@ steps: +- script: | + mkdir -p .build + echo $BUILD_SOURCEVERSION > .build/commit + displayName: Prepare cache flag + +- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + inputs: + keyfile: '.build/commit' + targetfolder: '.build, out-build' + vstsFeed: 'npm-vscode' + platformIndependent: true + alias: 'Compilation' + - task: NodeTool@0 inputs: versionSpec: "10.15.1" @@ -66,13 +79,6 @@ steps: yarn gulp mixin displayName: Mix in quality -- script: | - set -e - yarn gulp hygiene - yarn monaco-compile-check - displayName: Run hygiene checks - condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - - script: | set -e node build/azure-pipelines/common/installDistroDependencies.js @@ -82,23 +88,6 @@ steps: - script: | set -e - cd $BUILD_STAGINGDIRECTORY - git clone https://github.com/microsoft/vscode-telemetry-extractor.git - cd vscode-telemetry-extractor - git checkout 3b04aba5bfdfcca1a5426cd2c51a90d18740d0bc - npm i - npm run setup-extension-repos - node ./out/cli-extract.js --sourceDir $BUILD_SOURCESDIRECTORY --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents - node ./out/cli-extract-extensions.js --sourceDir ./src/telemetry-sources --outputDir . --applyEndpoints --includeIsMeasurement - mkdir -p $BUILD_SOURCESDIRECTORY/.build/telemetry - mv declarations-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-core.json - mv declarations-extensions-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-extensions.json - displayName: Extract Telemetry - -- script: | - set -e - yarn gulp compile-build - yarn gulp compile-extensions-build VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ yarn gulp vscode-linux-$VSCODE_ARCH-min-ci VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ @@ -128,12 +117,12 @@ steps: ./build/azure-pipelines/linux/publish.sh displayName: Publish -- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 - displayName: 'Component Detection' - continueOnError: true - - task: PublishPipelineArtifact@0 displayName: 'Publish Pipeline Artifact' inputs: artifactName: snap-$(VSCODE_ARCH) targetPath: .build/linux/snap-tarball + +- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 + displayName: 'Component Detection' + continueOnError: true diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 045d67507c0..9e52eccb457 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -33,16 +33,18 @@ jobs: # steps: # - template: win32/product-build-win32.yml -# - job: Linux -# condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) -# timeoutInMinutes: 120 -# pool: -# vmImage: 'Ubuntu-16.04' -# variables: -# VSCODE_ARCH: x64 -# container: vscode-x64 -# steps: -# - template: linux/product-build-linux.yml +- job: Linux + condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) + timeoutInMinutes: 120 + pool: + vmImage: 'Ubuntu-16.04' + variables: + VSCODE_ARCH: x64 + container: vscode-x64 + dependsOn: + - Compile + steps: + - template: linux/product-build-linux.yml # - job: LinuxSnap # condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) diff --git a/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml index 020b59a3e72..e1c9f90cabb 100644 --- a/build/azure-pipelines/product-compile.yml +++ b/build/azure-pipelines/product-compile.yml @@ -80,12 +80,6 @@ steps: displayName: Run postinstall scripts condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), eq(variables['CacheRestored'], 'true')) -- script: | - set -e - yarn gulp mixin - displayName: Mix in quality - condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) - - script: | set -e yarn gulp hygiene From b736c9aa5d6897dd8a75a2899502055d82a33606 Mon Sep 17 00:00:00 2001 From: Prabhanjan S Koushik Date: Wed, 3 Jul 2019 19:47:54 +0530 Subject: [PATCH 0991/1449] Add *.podspec to file associations Fixes #76315 --- extensions/ruby/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/ruby/package.json b/extensions/ruby/package.json index 93a1ae8f40e..a88b790d86f 100644 --- a/extensions/ruby/package.json +++ b/extensions/ruby/package.json @@ -12,7 +12,7 @@ "contributes": { "languages": [{ "id": "ruby", - "extensions": [ ".rb", ".rbx", ".rjs", ".gemspec", ".rake", ".ru", ".erb" ], + "extensions": [ ".rb", ".rbx", ".rjs", ".gemspec", ".rake", ".ru", ".erb",".podspec" ], "filenames": [ "rakefile", "gemfile", "guardfile", "podfile", "capfile" ], "aliases": [ "Ruby", "rb" ], "firstLine": "^#!\\s*/.*\\bruby\\b", From 8eb696e41e4ba2be5441cc397fa7e98a8716d78a Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 3 Jul 2019 16:54:46 +0200 Subject: [PATCH 0992/1449] handle disposables --- .../userData/common/fileUserDataProvider.ts | 2 +- .../fileUserDataProvider.test.ts | 72 +++++++++---------- 2 files changed, 36 insertions(+), 38 deletions(-) diff --git a/src/vs/workbench/services/userData/common/fileUserDataProvider.ts b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts index 7e996734a90..d599aa0c2e9 100644 --- a/src/vs/workbench/services/userData/common/fileUserDataProvider.ts +++ b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts @@ -24,7 +24,7 @@ export class FileUserDataProvider extends Disposable implements IUserDataProvide ) { super(); // Assumption: This path always exists - this.fileService.watch(this.userDataHome); + this._register(this.fileService.watch(this.userDataHome)); this._register(this.fileService.onFileChanges(e => this.handleFileChanges(e))); } diff --git a/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts b/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts index 245d119305c..33d27dadac4 100644 --- a/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts +++ b/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts @@ -21,6 +21,7 @@ import { DiskFileSystemProvider } from 'vs/workbench/services/files/electron-bro import { Registry } from 'vs/platform/registry/common/platform'; import { IUserDataContainerRegistry, Extensions } from 'vs/workbench/services/userData/common/userData'; import { BACKUPS } from 'vs/platform/environment/common/environment'; +import { DisposableStore } from 'vs/base/common/lifecycle'; suite('FileUserDataProvider', () => { @@ -30,24 +31,37 @@ suite('FileUserDataProvider', () => { let backupsPath: string; let userDataResource: URI; const userDataContainersRegistry = Registry.as(Extensions.UserDataContainers); + const disposables = new DisposableStore(); setup(async () => { const logService = new NullLogService(); testObject = new FileService(logService); - testObject.registerProvider(Schemas.file, new DiskFileSystemProvider(logService)); + disposables.add(testObject); + + const diskFileSystemProvider = new DiskFileSystemProvider(logService); + disposables.add(diskFileSystemProvider); + disposables.add(testObject.registerProvider(Schemas.file, diskFileSystemProvider)); + rootPath = path.join(os.tmpdir(), 'vsctests', uuid.generateUuid()); userDataPath = path.join(rootPath, 'user'); backupsPath = path.join(rootPath, BACKUPS); - await Promise.all([pfs.mkdirp(userDataPath), pfs.mkdirp(backupsPath)]); userDataResource = URI.from({ scheme: Schemas.userData, path: '/user' }); - testObject.registerProvider(Schemas.userData, new UserDataFileSystemProvider(userDataResource, new FileUserDataProvider(URI.file(userDataPath), testObject))); + await Promise.all([pfs.mkdirp(userDataPath), pfs.mkdirp(backupsPath)]); + + const fileUserDataProvider = new FileUserDataProvider(URI.file(userDataPath), testObject); + disposables.add(fileUserDataProvider); + const userDataFileSystemProvider = new UserDataFileSystemProvider(userDataResource, fileUserDataProvider); + disposables.add(userDataFileSystemProvider); + disposables.add(testObject.registerProvider(Schemas.userData, userDataFileSystemProvider)); + userDataContainersRegistry.registerContainer('testContainer'); userDataContainersRegistry.registerContainer('testContainer/subContainer'); userDataContainersRegistry.registerContainer(BACKUPS); }); - teardown(() => { - return pfs.rimraf(rootPath, pfs.RimRafMode.MOVE); + teardown(async () => { + disposables.clear(); + await pfs.rimraf(rootPath, pfs.RimRafMode.MOVE); }); test('exists return false when file does not exist', async () => { @@ -89,10 +103,9 @@ suite('FileUserDataProvider', () => { test('watch file - event is triggerred when file is created', async (done) => { const resource = joinPath(userDataResource, 'settings.json'); - const disposable = testObject.watch(resource); + disposables.add(testObject.watch(resource)); testObject.onFileChanges(e => { if (e.contains(resource)) { - disposable.dispose(); done(); } }); @@ -101,10 +114,9 @@ suite('FileUserDataProvider', () => { test('watch file - event is triggerred when file is created externally', async (done) => { const resource = joinPath(userDataResource, 'settings.json'); - const disposable = testObject.watch(resource); + disposables.add(testObject.watch(resource)); testObject.onFileChanges(e => { if (e.contains(resource)) { - disposable.dispose(); done(); } }); @@ -114,10 +126,9 @@ suite('FileUserDataProvider', () => { test('watch file - event is triggerred when file is updated', async (done) => { const resource = joinPath(userDataResource, 'settings.json'); await testObject.writeFile(resource, VSBuffer.fromString('{}')); - const disposable = testObject.watch(resource); + disposables.add(testObject.watch(resource)); testObject.onFileChanges(e => { if (e.contains(resource)) { - disposable.dispose(); done(); } }); @@ -127,10 +138,9 @@ suite('FileUserDataProvider', () => { test('watch file - event is triggerred when file is update externally', async (done) => { const resource = joinPath(userDataResource, 'settings.json'); await testObject.writeFile(resource, VSBuffer.fromString('{}')); - const disposable = testObject.watch(resource); + disposables.add(testObject.watch(resource)); testObject.onFileChanges(e => { if (e.contains(resource)) { - disposable.dispose(); done(); } }); @@ -140,10 +150,9 @@ suite('FileUserDataProvider', () => { test('watch file - event is triggerred when file is deleted', async (done) => { const resource = joinPath(userDataResource, 'settings.json'); await testObject.writeFile(resource, VSBuffer.fromString('{}')); - const disposable = testObject.watch(resource); + disposables.add(testObject.watch(resource)); testObject.onFileChanges(e => { if (e.contains(resource)) { - disposable.dispose(); done(); } }); @@ -153,10 +162,9 @@ suite('FileUserDataProvider', () => { test('watch file - event is triggerred when file is deleted externally', async (done) => { const resource = joinPath(userDataResource, 'settings.json'); await testObject.writeFile(resource, VSBuffer.fromString('{}')); - const disposable = testObject.watch(resource); + disposables.add(testObject.watch(resource)); testObject.onFileChanges(e => { if (e.contains(resource)) { - disposable.dispose(); done(); } }); @@ -313,10 +321,9 @@ suite('FileUserDataProvider', () => { test('watch file under container - event is triggerred when file is created', async (done) => { const resource = joinPath(userDataResource, 'testContainer/settings.json'); - const disposable = testObject.watch(resource); + disposables.add(testObject.watch(resource)); testObject.onFileChanges(e => { if (e.contains(resource)) { - disposable.dispose(); done(); } }); @@ -325,10 +332,9 @@ suite('FileUserDataProvider', () => { test('watch file under container - event is triggerred when file is created externally', async (done) => { const resource = joinPath(userDataResource, 'testContainer/settings.json'); - const disposable = testObject.watch(resource); + disposables.add(testObject.watch(resource)); testObject.onFileChanges(e => { if (e.contains(resource)) { - disposable.dispose(); done(); } }); @@ -340,10 +346,9 @@ suite('FileUserDataProvider', () => { const resource = joinPath(userDataResource, 'testContainer/settings.json'); await pfs.mkdirp(path.join(userDataPath, 'testContainer')); await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); - const disposable = testObject.watch(resource); + disposables.add(testObject.watch(resource)); testObject.onFileChanges(e => { if (e.contains(resource)) { - disposable.dispose(); done(); } }); @@ -354,10 +359,9 @@ suite('FileUserDataProvider', () => { const resource = joinPath(userDataResource, 'testContainer/settings.json'); await pfs.mkdirp(path.join(userDataPath, 'testContainer')); await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); - const disposable = testObject.watch(resource); + disposables.add(testObject.watch(resource)); testObject.onFileChanges(e => { if (e.contains(resource)) { - disposable.dispose(); done(); } }); @@ -367,10 +371,9 @@ suite('FileUserDataProvider', () => { test('watch file under container - event is triggerred when file is deleted', async (done) => { const resource = joinPath(userDataResource, 'testContainer/settings.json'); await testObject.writeFile(resource, VSBuffer.fromString('{}')); - const disposable = testObject.watch(resource); + disposables.add(testObject.watch(resource)); testObject.onFileChanges(e => { if (e.contains(resource)) { - disposable.dispose(); done(); } }); @@ -380,10 +383,9 @@ suite('FileUserDataProvider', () => { test('watch file under container - event is triggerred when file is deleted externally', async (done) => { const resource = joinPath(userDataResource, 'testContainer/settings.json'); await testObject.writeFile(resource, VSBuffer.fromString('{}')); - const disposable = testObject.watch(resource); + disposables.add(testObject.watch(resource)); testObject.onFileChanges(e => { if (e.contains(resource)) { - disposable.dispose(); done(); } }); @@ -392,10 +394,9 @@ suite('FileUserDataProvider', () => { test('watch container - event is triggerred when file under container is created', async (done) => { const container = joinPath(userDataResource, 'testContainer'); - const disposable = testObject.watch(container); + disposables.add(testObject.watch(container)); testObject.onFileChanges(e => { if (e.contains(container)) { - disposable.dispose(); done(); } }); @@ -405,10 +406,9 @@ suite('FileUserDataProvider', () => { test('watch container - event is triggerred when file under container is created externally', async (done) => { await pfs.mkdirp(path.join(userDataPath, 'testContainer')); const container = joinPath(userDataResource, 'testContainer'); - const disposable = testObject.watch(container); + disposables.add(testObject.watch(container)); testObject.onFileChanges(e => { if (e.contains(container)) { - disposable.dispose(); done(); } }); @@ -419,10 +419,9 @@ suite('FileUserDataProvider', () => { const container = joinPath(userDataResource, 'testContainer'); const resource = joinPath(userDataResource, 'testContainer/settings.json'); await testObject.writeFile(resource, VSBuffer.fromString('{}')); - const disposable = testObject.watch(container); + disposables.add(testObject.watch(container)); testObject.onFileChanges(e => { if (e.contains(container)) { - disposable.dispose(); done(); } }); @@ -433,10 +432,9 @@ suite('FileUserDataProvider', () => { const container = joinPath(userDataResource, 'testContainer'); const resource = joinPath(userDataResource, 'testContainer/settings.json'); await testObject.writeFile(resource, VSBuffer.fromString('{}')); - const disposable = testObject.watch(container); + disposables.add(testObject.watch(container)); testObject.onFileChanges(e => { if (e.contains(container)) { - disposable.dispose(); done(); } }); From a97f8be5638475c2781d6940bf94459e0db3ec7a Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 17:07:33 +0200 Subject: [PATCH 0993/1449] check cache --- .../linux/product-build-linux.yml | 198 +++++++++--------- 1 file changed, 102 insertions(+), 96 deletions(-) diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index c868be07f08..3407fde4727 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -12,117 +12,123 @@ steps: platformIndependent: true alias: 'Compilation' -- task: NodeTool@0 - inputs: - versionSpec: "10.15.1" - -- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 - inputs: - versionSpec: "1.10.1" - -- task: AzureKeyVault@1 - displayName: 'Azure Key Vault: Get Secrets' - inputs: - azureSubscription: 'vscode-builds-subscription' - KeyVaultName: vscode - - script: | set -e - export npm_config_arch="$(VSCODE_ARCH)" + ls -la .build + ls -la out-build + displayName: Check cache - cat << EOF > ~/.netrc - machine monacotools.visualstudio.com - password $(devops-pat) - machine github.com - login vscode - password $(github-distro-mixin-password) - EOF +# - task: NodeTool@0 +# inputs: +# versionSpec: "10.15.1" - git config user.email "vscode@microsoft.com" - git config user.name "VSCode" - displayName: Prepare tooling +# - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 +# inputs: +# versionSpec: "1.10.1" -- script: | - set -e - git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git" - git fetch distro - git merge $(node -p "require('./package.json').distro") - displayName: Merge distro +# - task: AzureKeyVault@1 +# displayName: 'Azure Key Vault: Get Secrets' +# inputs: +# azureSubscription: 'vscode-builds-subscription' +# KeyVaultName: vscode -- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 - inputs: - keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' - targetfolder: '**/node_modules, !**/node_modules/**/node_modules' - vstsFeed: 'npm-vscode' +# - script: | +# set -e +# export npm_config_arch="$(VSCODE_ARCH)" -- script: | - set -e - yarn --frozen-lockfile - displayName: Install dependencies - condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) +# cat << EOF > ~/.netrc +# machine monacotools.visualstudio.com +# password $(devops-pat) +# machine github.com +# login vscode +# password $(github-distro-mixin-password) +# EOF -- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 - inputs: - keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' - targetfolder: '**/node_modules, !**/node_modules/**/node_modules' - vstsFeed: 'npm-vscode' - condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) +# git config user.email "vscode@microsoft.com" +# git config user.name "VSCode" +# displayName: Prepare tooling -- script: | - set -e - yarn postinstall - displayName: Run postinstall scripts - condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) +# - script: | +# set -e +# git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git" +# git fetch distro +# git merge $(node -p "require('./package.json').distro") +# displayName: Merge distro -- script: | - set -e - yarn gulp mixin - displayName: Mix in quality +# - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 +# inputs: +# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' +# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' +# vstsFeed: 'npm-vscode' -- script: | - set -e - node build/azure-pipelines/common/installDistroDependencies.js - node build/azure-pipelines/common/installDistroDependencies.js remote - node build/lib/builtInExtensions.js - displayName: Install distro dependencies and extensions +# - script: | +# set -e +# yarn --frozen-lockfile +# displayName: Install dependencies +# condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) -- script: | - set -e - VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-linux-$VSCODE_ARCH-min-ci - VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-reh-linux-$VSCODE_ARCH-min-ci - VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-web-linux-$VSCODE_ARCH-min-ci - displayName: Build +# - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 +# inputs: +# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' +# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' +# vstsFeed: 'npm-vscode' +# condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) -- script: | - set -e - yarn gulp "electron-$(VSCODE_ARCH)" +# - script: | +# set -e +# yarn postinstall +# displayName: Run postinstall scripts +# condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) - # xvfb seems to be crashing often, let's make sure it's always up - service xvfb start +# - script: | +# set -e +# yarn gulp mixin +# displayName: Mix in quality - DISPLAY=:10 ./scripts/test.sh --build --tfs "Unit Tests" - # yarn smoketest -- --build "$(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH)" - displayName: Run unit tests - condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) +# - script: | +# set -e +# node build/azure-pipelines/common/installDistroDependencies.js +# node build/azure-pipelines/common/installDistroDependencies.js remote +# node build/lib/builtInExtensions.js +# displayName: Install distro dependencies and extensions -- script: | - set -e - AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ - AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ - VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ - ./build/azure-pipelines/linux/publish.sh - displayName: Publish +# - script: | +# set -e +# VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ +# yarn gulp vscode-linux-$VSCODE_ARCH-min-ci +# VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ +# yarn gulp vscode-reh-linux-$VSCODE_ARCH-min-ci +# VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ +# yarn gulp vscode-web-linux-$VSCODE_ARCH-min-ci +# displayName: Build -- task: PublishPipelineArtifact@0 - displayName: 'Publish Pipeline Artifact' - inputs: - artifactName: snap-$(VSCODE_ARCH) - targetPath: .build/linux/snap-tarball +# - script: | +# set -e +# yarn gulp "electron-$(VSCODE_ARCH)" -- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 - displayName: 'Component Detection' - continueOnError: true +# # xvfb seems to be crashing often, let's make sure it's always up +# service xvfb start + +# DISPLAY=:10 ./scripts/test.sh --build --tfs "Unit Tests" +# # yarn smoketest -- --build "$(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH)" +# displayName: Run unit tests +# condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) + +# - script: | +# set -e +# AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ +# AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ +# VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ +# VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ +# ./build/azure-pipelines/linux/publish.sh +# displayName: Publish + +# - task: PublishPipelineArtifact@0 +# displayName: 'Publish Pipeline Artifact' +# inputs: +# artifactName: snap-$(VSCODE_ARCH) +# targetPath: .build/linux/snap-tarball + +# - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 +# displayName: 'Component Detection' +# continueOnError: true From c0a9bc3988960a0edcb262ced7cc4793503a2df5 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 3 Jul 2019 17:11:02 +0200 Subject: [PATCH 0994/1449] fixes #76209 --- src/vs/workbench/browser/labels.ts | 8 ++++++-- .../contrib/files/browser/views/openEditorsView.ts | 5 +++-- .../contrib/files/common/editors/fileEditorInput.ts | 3 --- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/browser/labels.ts b/src/vs/workbench/browser/labels.ts index 99c24e24cb5..8742e98d27e 100644 --- a/src/vs/workbench/browser/labels.ts +++ b/src/vs/workbench/browser/labels.ts @@ -8,7 +8,7 @@ import * as resources from 'vs/base/common/resources'; import { IconLabel, IIconLabelValueOptions, IIconLabelCreationOptions } from 'vs/base/browser/ui/iconLabel/iconLabel'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { IModeService } from 'vs/editor/common/services/modeService'; -import { toResource, IEditorInput, SideBySideEditor } from 'vs/workbench/common/editor'; +import { toResource, IEditorInput, SideBySideEditor, Verbosity } from 'vs/workbench/common/editor'; import { PLAINTEXT_MODE_ID } from 'vs/editor/common/modes/modesRegistry'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -35,6 +35,7 @@ export interface IResourceLabelProps { export interface IResourceLabelOptions extends IIconLabelValueOptions { fileKind?: FileKind; fileDecorations?: { colors: boolean, badges: boolean, data?: IDecorationData }; + descriptionVerbosity?: Verbosity; } export interface IFileLabelOptions extends IResourceLabelOptions { @@ -316,6 +317,9 @@ class ResourceLabelWidget extends IconLabel { } notifyFormattersChange(): void { + if (this.label && this.label.resource) { + this.setFile(this.label.resource, this.options); + } this.render(false); } @@ -362,7 +366,7 @@ class ResourceLabelWidget extends IconLabel { this.setResource({ resource: toResource(editor, { supportSideBySide: SideBySideEditor.MASTER }), name: withNullAsUndefined(editor.getName()), - description: withNullAsUndefined(editor.getDescription()) + description: withNullAsUndefined(editor.getDescription(options ? options.descriptionVerbosity : undefined)) }, options); } diff --git a/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts b/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts index a7ee659d338..30e2150437b 100644 --- a/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts +++ b/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts @@ -12,7 +12,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { IEditorGroupsService, IEditorGroup, GroupChangeKind, GroupsOrder } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { IEditorInput } from 'vs/workbench/common/editor'; +import { IEditorInput, Verbosity } from 'vs/workbench/common/editor'; import { SaveAllAction, SaveAllInGroupAction, CloseGroupAction } from 'vs/workbench/contrib/files/browser/fileActions'; import { OpenEditorsFocusedContext, ExplorerFocusedContext, IFilesConfiguration, OpenEditor } from 'vs/workbench/contrib/files/common/files'; import { ITextFileService, AutoSaveMode } from 'vs/workbench/services/textfile/common/textfiles'; @@ -570,7 +570,8 @@ class OpenEditorRenderer implements IListRenderer().explorer.decorations + fileDecorations: this.configurationService.getValue().explorer.decorations, + descriptionVerbosity: Verbosity.MEDIUM }); } diff --git a/src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts b/src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts index d146effdb25..c9d15e680c1 100644 --- a/src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts +++ b/src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts @@ -150,17 +150,14 @@ export class FileEditorInput extends EditorInput implements IFileEditorInput { return this.decorateLabel(this.name); } - @memoize private get shortDescription(): string { return basename(this.labelService.getUriLabel(dirname(this.resource))); } - @memoize private get mediumDescription(): string { return this.labelService.getUriLabel(dirname(this.resource), { relative: true }); } - @memoize private get longDescription(): string { return this.labelService.getUriLabel(dirname(this.resource)); } From 9f20ed4d6e17e489eaea4dc2b47efed8a142870b Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Wed, 3 Jul 2019 17:14:36 +0200 Subject: [PATCH 0995/1449] consolidate externalTerminalService: dead wood removal --- .../workbench/api/node/extHostDebugService.ts | 7 +- .../browser/debugConfigurationManager.ts | 17 +- .../debug/browser/debugHelperService.ts | 8 +- .../workbench/contrib/debug/common/debug.ts | 4 +- .../contrib/debug/node/debugHelperService.ts | 8 +- .../contrib/debug/node/terminalSupport.ts | 73 ----- .../workbench/contrib/debug/node/terminals.ts | 271 +----------------- .../common/externalTerminal.ts | 4 +- .../node/externalTerminalService.ts | 81 ++++-- 9 files changed, 82 insertions(+), 391 deletions(-) delete mode 100644 src/vs/workbench/contrib/debug/node/terminalSupport.ts diff --git a/src/vs/workbench/api/node/extHostDebugService.ts b/src/vs/workbench/api/node/extHostDebugService.ts index fd0d9cdcc85..7683b5e9478 100644 --- a/src/vs/workbench/api/node/extHostDebugService.ts +++ b/src/vs/workbench/api/node/extHostDebugService.ts @@ -21,7 +21,7 @@ import { IExtHostWorkspaceProvider } from 'vs/workbench/api/common/extHostWorksp import { ExtHostExtensionService } from 'vs/workbench/api/node/extHostExtensionService'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; import { ITerminalSettings, IDebuggerContribution, IConfig, IDebugAdapter, IDebugAdapterServer, IDebugAdapterExecutable, IAdapterDescriptor } from 'vs/workbench/contrib/debug/common/debug'; -import { getTerminalLauncher, hasChildProcesses, prepareCommand } from 'vs/workbench/contrib/debug/node/terminals'; +import { hasChildProcesses, prepareCommand, runInExternalTerminal } from 'vs/workbench/contrib/debug/node/terminals'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { AbstractVariableResolverService } from 'vs/workbench/services/configurationResolver/common/variableResolver'; import { ExtHostConfiguration, ExtHostConfigProvider } from '../common/extHostConfiguration'; @@ -357,10 +357,7 @@ export class ExtHostDebugService implements ExtHostDebugServiceShape { } else if (args.kind === 'external') { - const terminalLauncher = getTerminalLauncher(); - if (terminalLauncher) { - return terminalLauncher.runInTerminal(args, config); - } + runInExternalTerminal(args, config); } return Promise.resolve(undefined); } diff --git a/src/vs/workbench/contrib/debug/browser/debugConfigurationManager.ts b/src/vs/workbench/contrib/debug/browser/debugConfigurationManager.ts index 317b77e3e78..0fc13734752 100644 --- a/src/vs/workbench/contrib/debug/browser/debugConfigurationManager.ts +++ b/src/vs/workbench/contrib/debug/browser/debugConfigurationManager.ts @@ -21,7 +21,7 @@ import { IFileService } from 'vs/platform/files/common/files'; import { IWorkspaceContextService, IWorkspaceFolder, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ICommandService } from 'vs/platform/commands/common/commands'; -import { IDebugConfigurationProvider, ICompound, IDebugConfiguration, IConfig, IGlobalConfig, IConfigurationManager, ILaunch, IDebugAdapterDescriptorFactory, IDebugAdapter, ITerminalSettings, ITerminalLauncher, IDebugSession, IAdapterDescriptor, CONTEXT_DEBUG_CONFIGURATION_TYPE, IDebugAdapterFactory, IDebugService, IDebugHelperService } from 'vs/workbench/contrib/debug/common/debug'; +import { IDebugConfigurationProvider, ICompound, IDebugConfiguration, IConfig, IGlobalConfig, IConfigurationManager, ILaunch, IDebugAdapterDescriptorFactory, IDebugAdapter, ITerminalSettings, IDebugSession, IAdapterDescriptor, CONTEXT_DEBUG_CONFIGURATION_TYPE, IDebugAdapterFactory, IDebugService } from 'vs/workbench/contrib/debug/common/debug'; import { Debugger } from 'vs/workbench/contrib/debug/common/debugger'; import { IEditorService, ACTIVE_GROUP, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { isCodeEditor } from 'vs/editor/browser/editorBrowser'; @@ -52,7 +52,6 @@ export class ConfigurationManager implements IConfigurationManager { private configProviders: IDebugConfigurationProvider[]; private adapterDescriptorFactories: IDebugAdapterDescriptorFactory[]; private debugAdapterFactories = new Map(); - private terminalLauncher: ITerminalLauncher; private debugConfigurationTypeContext: IContextKey; constructor( @@ -66,8 +65,7 @@ export class ConfigurationManager implements IConfigurationManager { @IStorageService private readonly storageService: IStorageService, @ILifecycleService lifecycleService: ILifecycleService, @IExtensionService private readonly extensionService: IExtensionService, - @IContextKeyService contextKeyService: IContextKeyService, - @IDebugHelperService private readonly debugHelperService: IDebugHelperService + @IContextKeyService contextKeyService: IContextKeyService ) { this.configProviders = []; this.adapterDescriptorFactories = []; @@ -111,14 +109,11 @@ export class ConfigurationManager implements IConfigurationManager { } runInTerminal(debugType: string, args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): Promise { - let tl: ITerminalLauncher | undefined = this.debugAdapterFactories.get(debugType); - if (!tl) { - if (!this.terminalLauncher) { - this.terminalLauncher = this.debugHelperService.createTerminalLauncher(this.instantiationService); - } - tl = this.terminalLauncher; + let tl = this.debugAdapterFactories.get(debugType); + if (tl) { + return tl.runInTerminal(args, config); } - return tl.runInTerminal(args, config); + return Promise.resolve(void 0); } // debug adapter diff --git a/src/vs/workbench/contrib/debug/browser/debugHelperService.ts b/src/vs/workbench/contrib/debug/browser/debugHelperService.ts index be123b31a5e..37d46f87b45 100644 --- a/src/vs/workbench/contrib/debug/browser/debugHelperService.ts +++ b/src/vs/workbench/contrib/debug/browser/debugHelperService.ts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ServiceIdentifier, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ITerminalLauncher, IDebugHelperService } from 'vs/workbench/contrib/debug/common/debug'; +import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; +import { IDebugHelperService } from 'vs/workbench/contrib/debug/common/debug'; import { TelemetryService } from 'vs/platform/telemetry/common/telemetryService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; @@ -13,10 +13,6 @@ export class BrowserDebugHelperService implements IDebugHelperService { _serviceBrand: ServiceIdentifier; - createTerminalLauncher(instantiationService: IInstantiationService): ITerminalLauncher { - throw new Error('Method createTerminalLauncher not implemented.'); - } - createTelemetryService(configurationService: IConfigurationService, args: string[]): TelemetryService | undefined { return undefined; } diff --git a/src/vs/workbench/contrib/debug/common/debug.ts b/src/vs/workbench/contrib/debug/common/debug.ts index f36d6529d77..ab30e1ce3d0 100644 --- a/src/vs/workbench/contrib/debug/common/debug.ts +++ b/src/vs/workbench/contrib/debug/common/debug.ts @@ -8,7 +8,7 @@ import { URI as uri } from 'vs/base/common/uri'; import severity from 'vs/base/common/severity'; import { Event } from 'vs/base/common/event'; import { IJSONSchemaSnippet } from 'vs/base/common/jsonSchema'; -import { createDecorator, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { ITextModel as EditorIModel } from 'vs/editor/common/model'; import { IEditor, ITextEditor } from 'vs/workbench/common/editor'; @@ -846,7 +846,5 @@ export const IDebugHelperService = createDecorator(DEBUG_HE export interface IDebugHelperService { _serviceBrand: any; - createTerminalLauncher(instantiationService: IInstantiationService): ITerminalLauncher; - createTelemetryService(configurationService: IConfigurationService, args: string[]): TelemetryService | undefined; } diff --git a/src/vs/workbench/contrib/debug/node/debugHelperService.ts b/src/vs/workbench/contrib/debug/node/debugHelperService.ts index 76fcf6e30e8..29aa2f3156b 100644 --- a/src/vs/workbench/contrib/debug/node/debugHelperService.ts +++ b/src/vs/workbench/contrib/debug/node/debugHelperService.ts @@ -3,9 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { TerminalLauncher } from 'vs/workbench/contrib/debug/node/terminalSupport'; -import { ITerminalLauncher, IDebugHelperService } from 'vs/workbench/contrib/debug/common/debug'; +import { IDebugHelperService } from 'vs/workbench/contrib/debug/common/debug'; import { Client as TelemetryClient } from 'vs/base/parts/ipc/node/ipc.cp'; import { TelemetryAppenderClient } from 'vs/platform/telemetry/node/telemetryIpc'; import { getPathFromAmdModule } from 'vs/base/common/amd'; @@ -20,10 +18,6 @@ export class NodeDebugHelperService implements IDebugHelperService { ) { } - createTerminalLauncher(instantiationService: IInstantiationService): ITerminalLauncher { - return instantiationService.createInstance(TerminalLauncher); - } - createTelemetryService(configurationService: IConfigurationService, args: string[]): TelemetryService | undefined { const client = new TelemetryClient( diff --git a/src/vs/workbench/contrib/debug/node/terminalSupport.ts b/src/vs/workbench/contrib/debug/node/terminalSupport.ts deleted file mode 100644 index 4692d3021a0..00000000000 --- a/src/vs/workbench/contrib/debug/node/terminalSupport.ts +++ /dev/null @@ -1,73 +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 nls from 'vs/nls'; -import { IDisposable } from 'vs/base/common/lifecycle'; -import { ITerminalService, ITerminalInstance } from 'vs/workbench/contrib/terminal/common/terminal'; -import { IExternalTerminalService } from 'vs/workbench/contrib/externalTerminal/common/externalTerminal'; -import { ITerminalLauncher, ITerminalSettings } from 'vs/workbench/contrib/debug/common/debug'; -import { hasChildProcesses, prepareCommand } from 'vs/workbench/contrib/debug/node/terminals'; -import { IProcessEnvironment } from 'vs/base/common/platform'; - -export class TerminalLauncher implements ITerminalLauncher { - - private integratedTerminalInstance: ITerminalInstance | undefined; - private terminalDisposedListener: IDisposable; - - constructor( - @ITerminalService private readonly terminalService: ITerminalService, - @IExternalTerminalService private readonly externalTerminalService: IExternalTerminalService - ) { - } - - runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): Promise { - - if (args.kind === 'external') { - return this.externalTerminalService.runInTerminal(args.title || '', args.cwd, args.args, args.env || {}); - } - - if (!this.terminalDisposedListener) { - // React on terminal disposed and check if that is the debug terminal #12956 - this.terminalDisposedListener = this.terminalService.onInstanceDisposed(terminal => { - if (this.integratedTerminalInstance && this.integratedTerminalInstance.id === terminal.id) { - this.integratedTerminalInstance = undefined; - } - }); - } - - let t = this.integratedTerminalInstance; - if ((t && (typeof t.processId === 'number') && hasChildProcesses(t.processId)) || !t) { - t = this.terminalService.createTerminal({ name: args.title || nls.localize('debug.terminal.title', "debuggee") }); - this.integratedTerminalInstance = t; - } - this.terminalService.setActiveInstance(t); - this.terminalService.showPanel(true); - - return new Promise((resolve, error) => { - if (t && typeof t.processId === 'number') { - // no need to wait - resolve(t.processId); - } - - // shell not ready: wait for ready event - const toDispose = t!.onProcessIdReady(t => { - toDispose.dispose(); - resolve(t.processId); - }); - - // do not wait longer than 5 seconds - setTimeout(_ => { - error(new Error('terminal shell timeout')); - }, 5000); - - }).then(shellProcessId => { - - const command = prepareCommand(args, config); - t!.sendText(command, true); - - return shellProcessId; - }); - } -} diff --git a/src/vs/workbench/contrib/debug/node/terminals.ts b/src/vs/workbench/contrib/debug/node/terminals.ts index da3bfa8e8ab..1c74432574d 100644 --- a/src/vs/workbench/contrib/debug/node/terminals.ts +++ b/src/vs/workbench/contrib/debug/node/terminals.ts @@ -4,277 +4,30 @@ *--------------------------------------------------------------------------------------------*/ import * as cp from 'child_process'; -import * as nls from 'vs/nls'; import * as env from 'vs/base/common/platform'; -import * as pfs from 'vs/base/node/pfs'; -import { assign } from 'vs/base/common/objects'; -import { ITerminalLauncher, ITerminalSettings } from 'vs/workbench/contrib/debug/common/debug'; -import { getPathFromAmdModule } from 'vs/base/common/amd'; +import { ITerminalSettings } from 'vs/workbench/contrib/debug/common/debug'; import { getSystemShell } from 'vs/workbench/contrib/terminal/node/terminal'; +import { WindowsExternalTerminalService, MacExternalTerminalService, LinuxExternalTerminalService } from 'vs/workbench/contrib/externalTerminal/node/externalTerminalService'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IExternalTerminalService } from 'vs/workbench/contrib/externalTerminal/common/externalTerminal'; -const TERMINAL_TITLE = nls.localize('console.title', "VS Code Console"); +let externalTerminalService: IExternalTerminalService | undefined = undefined; -let terminalLauncher: ITerminalLauncher | undefined = undefined; - -export function getTerminalLauncher() { - if (!terminalLauncher) { +export function runInExternalTerminal(args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): void { + if (!externalTerminalService) { if (env.isWindows) { - terminalLauncher = new WinTerminalService(); + externalTerminalService = new WindowsExternalTerminalService(undefined); } else if (env.isMacintosh) { - terminalLauncher = new MacTerminalService(); + externalTerminalService = new MacExternalTerminalService(undefined); } else if (env.isLinux) { - terminalLauncher = new LinuxTerminalService(); + externalTerminalService = new LinuxExternalTerminalService(undefined); } } - return terminalLauncher; -} - -let _DEFAULT_TERMINAL_LINUX_READY: Promise | null = null; - -export function getDefaultTerminalLinuxReady(): Promise { - if (!_DEFAULT_TERMINAL_LINUX_READY) { - _DEFAULT_TERMINAL_LINUX_READY = new Promise(resolve => { - if (env.isLinux) { - Promise.all([pfs.exists('/etc/debian_version'), process.lazyEnv]).then(([isDebian]) => { - if (isDebian) { - resolve('x-terminal-emulator'); - } else if (process.env.DESKTOP_SESSION === 'gnome' || process.env.DESKTOP_SESSION === 'gnome-classic') { - resolve('gnome-terminal'); - } else if (process.env.DESKTOP_SESSION === 'kde-plasma') { - resolve('konsole'); - } else if (process.env.COLORTERM) { - resolve(process.env.COLORTERM); - } else if (process.env.TERM) { - resolve(process.env.TERM); - } else { - resolve('xterm'); - } - }); - return; - } - - resolve('xterm'); - }); - } - return _DEFAULT_TERMINAL_LINUX_READY; -} - -let _DEFAULT_TERMINAL_WINDOWS: string | null = null; - -export function getDefaultTerminalWindows(): string { - if (!_DEFAULT_TERMINAL_WINDOWS) { - const isWoW64 = !!process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432'); - _DEFAULT_TERMINAL_WINDOWS = `${process.env.windir ? process.env.windir : 'C:\\Windows'}\\${isWoW64 ? 'Sysnative' : 'System32'}\\cmd.exe`; - } - return _DEFAULT_TERMINAL_WINDOWS; -} - -abstract class TerminalLauncher implements ITerminalLauncher { - runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): Promise { - return this.runInTerminal0(args.title!, args.cwd, args.args, args.env || {}, config); - } - - abstract runInTerminal0(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment | {}, config: ITerminalSettings): Promise; -} - -class WinTerminalService extends TerminalLauncher { - - private static readonly CMD = 'cmd.exe'; - - runInTerminal0(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment, configuration: ITerminalSettings): Promise { - - const exec = configuration.external.windowsExec || getDefaultTerminalWindows(); - - return new Promise((resolve, reject) => { - - const title = `"${dir} - ${TERMINAL_TITLE}"`; - const command = `""${args.join('" "')}" & pause"`; // use '|' to only pause on non-zero exit code - - const cmdArgs = [ - '/c', 'start', title, '/wait', exec, '/c', command - ]; - - // merge environment variables into a copy of the process.env - const env = assign({}, process.env, envVars); - - // delete environment variables that have a null value - Object.keys(env).filter(v => env[v] === null).forEach(key => delete env[key]); - - const options: any = { - cwd: dir, - env: env, - windowsVerbatimArguments: true - }; - - const cmd = cp.spawn(WinTerminalService.CMD, cmdArgs, options); - cmd.on('error', err => { - reject(improveError(err)); - }); - - resolve(undefined); - }); + if (externalTerminalService) { + externalTerminalService.runInTerminal(args.title!, args.cwd, args.args, args.env || {}, config); } } -class MacTerminalService extends TerminalLauncher { - - private static readonly DEFAULT_TERMINAL_OSX = 'Terminal.app'; - private static readonly OSASCRIPT = '/usr/bin/osascript'; // osascript is the AppleScript interpreter on OS X - - runInTerminal0(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment, configuration: ITerminalSettings): Promise { - - const terminalApp = configuration.external.osxExec || MacTerminalService.DEFAULT_TERMINAL_OSX; - - return new Promise((resolve, reject) => { - - if (terminalApp === MacTerminalService.DEFAULT_TERMINAL_OSX || terminalApp === 'iTerm.app') { - - // On OS X we launch an AppleScript that creates (or reuses) a Terminal window - // and then launches the program inside that window. - - const script = terminalApp === MacTerminalService.DEFAULT_TERMINAL_OSX ? 'TerminalHelper' : 'iTermHelper'; - const scriptpath = getPathFromAmdModule(require, `vs/workbench/contrib/externalTerminal/node/${script}.scpt`); - - const osaArgs = [ - scriptpath, - '-t', title || TERMINAL_TITLE, - '-w', dir, - ]; - - for (let a of args) { - osaArgs.push('-a'); - osaArgs.push(a); - } - - if (envVars) { - for (let key in envVars) { - const value = envVars[key]; - if (value === null) { - osaArgs.push('-u'); - osaArgs.push(key); - } else { - osaArgs.push('-e'); - osaArgs.push(`${key}=${value}`); - } - } - } - - let stderr = ''; - const osa = cp.spawn(MacTerminalService.OSASCRIPT, osaArgs); - osa.on('error', err => { - reject(improveError(err)); - }); - osa.stderr.on('data', (data) => { - stderr += data.toString(); - }); - osa.on('exit', (code: number) => { - if (code === 0) { // OK - resolve(undefined); - } else { - if (stderr) { - const lines = stderr.split('\n', 1); - reject(new Error(lines[0])); - } else { - reject(new Error(nls.localize('mac.terminal.script.failed', "Script '{0}' failed with exit code {1}", script, code))); - } - } - }); - } else { - reject(new Error(nls.localize('mac.terminal.type.not.supported', "'{0}' not supported", terminalApp))); - } - }); - } -} - -class LinuxTerminalService extends TerminalLauncher { - - private static readonly WAIT_MESSAGE = nls.localize('press.any.key', "Press any key to continue..."); - - runInTerminal0(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment, configuration: ITerminalSettings): Promise { - - const terminalConfig = configuration.external; - const execThenable: Promise = terminalConfig.linuxExec ? Promise.resolve(terminalConfig.linuxExec) : getDefaultTerminalLinuxReady(); - - return new Promise((resolve, reject) => { - - let termArgs: string[] = []; - //termArgs.push('--title'); - //termArgs.push(`"${TERMINAL_TITLE}"`); - execThenable.then(exec => { - if (exec.indexOf('gnome-terminal') >= 0) { - termArgs.push('-x'); - } else { - termArgs.push('-e'); - } - termArgs.push('bash'); - termArgs.push('-c'); - - const bashCommand = `${quote(args)}; echo; read -p "${LinuxTerminalService.WAIT_MESSAGE}" -n1;`; - termArgs.push(`''${bashCommand}''`); // wrapping argument in two sets of ' because node is so "friendly" that it removes one set... - - // merge environment variables into a copy of the process.env - const env = assign({}, process.env, envVars); - - // delete environment variables that have a null value - Object.keys(env).filter(v => env[v] === null).forEach(key => delete env[key]); - - const options: any = { - cwd: dir, - env: env - }; - - let stderr = ''; - const cmd = cp.spawn(exec, termArgs, options); - cmd.on('error', err => { - reject(improveError(err)); - }); - cmd.stderr.on('data', (data) => { - stderr += data.toString(); - }); - cmd.on('exit', (code: number) => { - if (code === 0) { // OK - resolve(undefined); - } else { - if (stderr) { - const lines = stderr.split('\n', 1); - reject(new Error(lines[0])); - } else { - reject(new Error(nls.localize('linux.term.failed', "'{0}' failed with exit code {1}", exec, code))); - } - } - }); - }); - }); - } -} - -/** - * tries to turn OS errors into more meaningful error messages - */ -function improveError(err: Error): Error { - if (err['errno'] === 'ENOENT' && err['path']) { - return new Error(nls.localize('ext.term.app.not.found', "can't find terminal application '{0}'", err['path'])); - } - return err; -} - -/** - * Quote args if necessary and combine into a space separated string. - */ -function quote(args: string[]): string { - let r = ''; - for (let a of args) { - if (a.indexOf(' ') >= 0) { - r += '"' + a + '"'; - } else { - r += a; - } - r += ' '; - } - return r; -} - - export function hasChildProcesses(processId: number): boolean { if (processId) { try { diff --git a/src/vs/workbench/contrib/externalTerminal/common/externalTerminal.ts b/src/vs/workbench/contrib/externalTerminal/common/externalTerminal.ts index 8b7f051b339..54980485f49 100644 --- a/src/vs/workbench/contrib/externalTerminal/common/externalTerminal.ts +++ b/src/vs/workbench/contrib/externalTerminal/common/externalTerminal.ts @@ -4,14 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { IProcessEnvironment } from 'vs/base/common/platform'; +import { ITerminalSettings } from 'vs/workbench/contrib/debug/common/debug'; export const IExternalTerminalService = createDecorator('nativeTerminalService'); export interface IExternalTerminalService { _serviceBrand: any; openTerminal(path: string): void; - runInTerminal(title: string, cwd: string, args: string[], env: IProcessEnvironment): Promise; + runInTerminal(title: string, cwd: string, args: string[], env: { [key: string]: string | null; }, configuration: ITerminalSettings): Promise; } export interface IExternalTerminalConfiguration { diff --git a/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts b/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts index 64bd1ddda5e..38f4bc89d92 100644 --- a/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts +++ b/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts @@ -16,11 +16,11 @@ import { getPathFromAmdModule } from 'vs/base/common/amd'; import { IConfigurationRegistry, Extensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { Registry } from 'vs/platform/registry/common/platform'; +import { ITerminalSettings } from 'vs/workbench/contrib/debug/common/debug'; -export const DEFAULT_TERMINAL_OSX = 'Terminal.app'; const TERMINAL_TITLE = nls.localize('console.title', "VS Code Console"); - +export const DEFAULT_TERMINAL_OSX = 'Terminal.app'; enum WinSpawnType { CMD, @@ -43,13 +43,18 @@ export class WindowsExternalTerminalService implements IExternalTerminalService this.spawnTerminal(cp, configuration, processes.getWindowsShell(), cwd); } + /* public runInTerminal(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment): Promise { - const configuration = this._configurationService.getValue(); - const terminalConfig = configuration.terminal.external; - const exec = terminalConfig.windowsExec || getDefaultTerminalWindows(); + return this.runInTerminal0(title, dir, args, envVars, configuration.terminal); + } + */ - return new Promise((c, e) => { + public runInTerminal(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment, configuration: ITerminalSettings): Promise { + + const exec = configuration.external.windowsExec || getDefaultTerminalWindows(); + + return new Promise((resolve, reject) => { const title = `"${dir} - ${TERMINAL_TITLE}"`; const command = `""${args.join('" "')}" & pause"`; // use '|' to only pause on non-zero exit code @@ -71,9 +76,11 @@ export class WindowsExternalTerminalService implements IExternalTerminalService }; const cmd = cp.spawn(WindowsExternalTerminalService.CMD, cmdArgs, options); - cmd.on('error', e); + cmd.on('error', err => { + reject(improveError(err)); + }); - c(undefined); + resolve(undefined); }); } @@ -134,13 +141,18 @@ export class MacExternalTerminalService implements IExternalTerminalService { this.spawnTerminal(cp, configuration, cwd); } + /* public runInTerminal(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment): Promise { - const configuration = this._configurationService.getValue(); - const terminalConfig = configuration.terminal.external; - const terminalApp = terminalConfig.osxExec || DEFAULT_TERMINAL_OSX; + return this.runInTerminal0(title, dir, args, envVars, configuration.terminal); + } + */ - return new Promise((c, e) => { + public runInTerminal(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment, configuration: ITerminalSettings): Promise { + + const terminalApp = configuration.external.osxExec || DEFAULT_TERMINAL_OSX; + + return new Promise((resolve, reject) => { if (terminalApp === DEFAULT_TERMINAL_OSX || terminalApp === 'iTerm.app') { @@ -176,24 +188,26 @@ export class MacExternalTerminalService implements IExternalTerminalService { let stderr = ''; const osa = cp.spawn(MacExternalTerminalService.OSASCRIPT, osaArgs); - osa.on('error', e); + osa.on('error', err => { + reject(improveError(err)); + }); osa.stderr.on('data', (data) => { stderr += data.toString(); }); osa.on('exit', (code: number) => { if (code === 0) { // OK - c(undefined); + resolve(undefined); } else { if (stderr) { const lines = stderr.split('\n', 1); - e(new Error(lines[0])); + reject(new Error(lines[0])); } else { - e(new Error(nls.localize('mac.terminal.script.failed', "Script '{0}' failed with exit code {1}", script, code))); + reject(new Error(nls.localize('mac.terminal.script.failed', "Script '{0}' failed with exit code {1}", script, code))); } } }); } else { - e(new Error(nls.localize('mac.terminal.type.not.supported', "'{0}' not supported", terminalApp))); + reject(new Error(nls.localize('mac.terminal.type.not.supported', "'{0}' not supported", terminalApp))); } }); } @@ -223,20 +237,25 @@ export class LinuxExternalTerminalService implements IExternalTerminalService { @IConfigurationService private readonly _configurationService: IConfigurationService ) { } - public openTerminal(cwd?: string): void { const configuration = this._configurationService.getValue(); this.spawnTerminal(cp, configuration, cwd); } + /* public runInTerminal(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment): Promise { - const configuration = this._configurationService.getValue(); - const terminalConfig = configuration.terminal.external; + return this.runInTerminal0(title, dir, args, envVars, configuration.terminal); + } + */ + + public runInTerminal(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment, configuration: ITerminalSettings): Promise { + + const terminalConfig = configuration.external; const execPromise = terminalConfig.linuxExec ? Promise.resolve(terminalConfig.linuxExec) : getDefaultTerminalLinuxReady(); - return new Promise((c, e) => { + return new Promise((resolve, reject) => { let termArgs: string[] = []; //termArgs.push('--title'); @@ -266,19 +285,21 @@ export class LinuxExternalTerminalService implements IExternalTerminalService { let stderr = ''; const cmd = cp.spawn(exec, termArgs, options); - cmd.on('error', e); + cmd.on('error', err => { + reject(improveError(err)); + }); cmd.stderr.on('data', (data) => { stderr += data.toString(); }); cmd.on('exit', (code: number) => { if (code === 0) { // OK - c(undefined); + resolve(undefined); } else { if (stderr) { const lines = stderr.split('\n', 1); - e(new Error(lines[0])); + reject(new Error(lines[0])); } else { - e(new Error(nls.localize('linux.term.failed', "'{0}' failed with exit code {1}", exec, code))); + reject(new Error(nls.localize('linux.term.failed', "'{0}' failed with exit code {1}", exec, code))); } } }); @@ -301,6 +322,16 @@ export class LinuxExternalTerminalService implements IExternalTerminalService { } } +/** + * tries to turn OS errors into more meaningful error messages + */ +function improveError(err: Error): Error { + if (err['errno'] === 'ENOENT' && err['path']) { + return new Error(nls.localize('ext.term.app.not.found', "can't find terminal application '{0}'", err['path'])); + } + return err; +} + /** * Quote args if necessary and combine into a space separated string. */ From 8a5f705e96247921108b42fb27e4f888feb9dd42 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 3 Jul 2019 16:41:05 +0200 Subject: [PATCH 0996/1449] Extract IModelLinesTokens --- src/vs/editor/common/model/textModel.ts | 37 ++--- src/vs/editor/common/model/textModelTokens.ts | 133 ++++++++++++------ .../test/common/model/model.line.test.ts | 6 +- .../test/common/model/model.modes.test.ts | 17 +-- 4 files changed, 109 insertions(+), 84 deletions(-) diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index 25a47febe22..5f404d807e8 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -23,7 +23,7 @@ import { IntervalNode, IntervalTree, getNodeIsInOverviewRuler, recomputeMaxEnd } import { PieceTreeTextBufferBuilder } from 'vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder'; import { IModelContentChangedEvent, IModelDecorationsChangedEvent, IModelLanguageChangedEvent, IModelLanguageConfigurationChangedEvent, IModelOptionsChangedEvent, IModelTokensChangedEvent, InternalModelContentChangeEvent, ModelRawChange, ModelRawContentChangedEvent, ModelRawEOLChanged, ModelRawFlush, ModelRawLineChanged, ModelRawLinesDeleted, ModelRawLinesInserted } from 'vs/editor/common/model/textModelEvents'; import { SearchData, SearchParams, TextModelSearch } from 'vs/editor/common/model/textModelSearch'; -import { ModelLinesTokens, ModelTokensChangedEventBuilder } from 'vs/editor/common/model/textModelTokens'; +import { ModelLinesTokens, ModelTokensChangedEventBuilder, IModelLinesTokens, safeTokenize } from 'vs/editor/common/model/textModelTokens'; import { getWordAtText } from 'vs/editor/common/model/wordHelper'; import { IState, LanguageId, LanguageIdentifier, TokenizationRegistry, FormattingOptions } from 'vs/editor/common/modes'; import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; @@ -287,7 +287,7 @@ export class TextModel extends Disposable implements model.ITextModel { private readonly _tokenizationListener: IDisposable; private readonly _languageRegistryListener: IDisposable; private _revalidateTokensTimeout: any; - /*private*/_tokens: ModelLinesTokens; + /*private*/_tokens: IModelLinesTokens; //#endregion constructor(source: string | model.ITextBufferFactory, creationOptions: model.ITextModelCreationOptions, languageIdentifier: LanguageIdentifier | null, associatedResource: URI | null = null) { @@ -1345,7 +1345,7 @@ export class TextModel extends Disposable implements model.ITextModel { this._tokens.applyEdits(change.range, eolCount, firstLineLength); } catch (err) { // emergency recovery => reset tokens - this._tokens = new ModelLinesTokens(this._tokens.languageIdentifier, this._tokens.tokenizationSupport); + this._tokens = new ModelLinesTokens(this._languageIdentifier, this._tokens.tokenizationSupport); } this._onDidChangeDecorations.fire(); this._decorationsTree.acceptReplace(change.rangeOffset, change.rangeLength, change.text.length, change.forceMoveMarkers); @@ -1806,7 +1806,7 @@ export class TextModel extends Disposable implements model.ITextModel { } if (newNonWhitespaceIndex < nonWhitespaceColumn) { - initialState = this._tokens._getState(i - 1); + initialState = this._tokens.getState(i - 1); if (initialState) { break; } @@ -1819,33 +1819,18 @@ export class TextModel extends Disposable implements model.ITextModel { initialState = this._tokens.tokenizationSupport.getInitialState(); } - let state = initialState.clone(); + let state = initialState; for (let i = fakeLines.length - 1; i >= 0; i--) { - let r = this._tokens._tokenizeText(this._buffer, fakeLines[i], state); + let r = safeTokenize(this._languageIdentifier, this._tokens.tokenizationSupport, fakeLines[i], state); if (r) { - state = r.endState.clone(); + state = r.endState; } else { - state = initialState.clone(); + state = initialState; } } const eventBuilder = new ModelTokensChangedEventBuilder(); - for (let i = startLineNumber; i <= endLineNumber; i++) { - let text = this.getLineContent(i); - let r = this._tokens._tokenizeText(this._buffer, text, state); - if (r) { - this._tokens._setTokens(this._tokens.languageIdentifier.id, i - 1, text.length, r.tokens); - - // We cannot trust these states/tokens to be valid! - // (see https://github.com/Microsoft/vscode/issues/67607) - this._tokens._invalidateLine(i - 1); - this._tokens._setState(i - 1, state); - state = r.endState.clone(); - eventBuilder.registerChangedTokens(i); - } else { - state = initialState.clone(); - } - } + this._tokens.fakeTokenizeLines(this._buffer, eventBuilder, state, startLineNumber, endLineNumber); const e = eventBuilder.build(); if (e) { @@ -1871,7 +1856,7 @@ export class TextModel extends Disposable implements model.ITextModel { const eventBuilder = new ModelTokensChangedEventBuilder(); - this._tokens._updateTokensUntilLine(this._buffer, eventBuilder, lineNumber); + this._tokens.updateTokensUntilLine(this._buffer, eventBuilder, lineNumber); const e = eventBuilder.build(); if (e) { @@ -1989,7 +1974,7 @@ export class TextModel extends Disposable implements model.ITextModel { break; } - const tokenizedLineNumber = this._tokens._tokenizeOneLine(this._buffer, eventBuilder); + const tokenizedLineNumber = this._tokens.tokenizeOneInvalidLine(this._buffer, eventBuilder); if (tokenizedLineNumber >= toLineNumber) { break; diff --git a/src/vs/editor/common/model/textModelTokens.ts b/src/vs/editor/common/model/textModelTokens.ts index 4dbdda80829..35fac7434f5 100644 --- a/src/vs/editor/common/model/textModelTokens.ts +++ b/src/vs/editor/common/model/textModelTokens.ts @@ -388,7 +388,27 @@ class TokensStore { //#endregion } -export class ModelLinesTokens { +export interface IModelLinesTokens { + readonly tokenizationSupport: ITokenizationSupport | null; + readonly invalidLineStartIndex: number; + + setTokens(topLevelLanguageId: LanguageId, lineIndex: number, lineTextLength: number, tokens: Uint32Array): void; + getTokens(topLevelLanguageId: LanguageId, lineIndex: number, lineText: string): LineTokens; + + isCheapToTokenize(lineNumber: number): boolean; + hasLinesToTokenize(buffer: ITextBuffer): boolean; + getState(lineIndex: number): IState | null; + applyEdits(range: Range, eolCount: number, firstLineLength: number): void; + + tokenizeOneInvalidLine(buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder): number; + updateTokensUntilLine(buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, lineNumber: number): void; + fakeTokenizeLines(buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, initialState: IState, startLineNumber: number, endLineNumber: number): void; + + _getAllStates(linesLength: number): (IState | null)[]; + _getAllInvalid(linesLength: number): number[]; +} + +export class ModelLinesTokens implements IModelLinesTokens { public readonly languageIdentifier: LanguageIdentifier; public readonly tokenizationSupport: ITokenizationSupport | null; @@ -427,19 +447,15 @@ export class ModelLinesTokens { return (this.store.invalidLineStartIndex < buffer.getLineCount()); } - _isInvalid(lineIndex: number): boolean { - return this.store.isInvalid(lineIndex); - } - - _getState(lineIndex: number): IState | null { + public getState(lineIndex: number): IState | null { return this.store.getState(lineIndex); } - _setTokens(topLevelLanguageId: LanguageId, lineIndex: number, lineTextLength: number, tokens: Uint32Array): void { + public setTokens(topLevelLanguageId: LanguageId, lineIndex: number, lineTextLength: number, tokens: Uint32Array): void { this.store.setTokens(topLevelLanguageId, lineIndex, lineTextLength, tokens); } - _setState(lineIndex: number, state: IState): void { + private _setState(lineIndex: number, state: IState): void { this.store.setState(lineIndex, state); } @@ -449,7 +465,7 @@ export class ModelLinesTokens { this.store.applyEdits(range, eolCount, firstLineLength); } - _invalidateLine(lineIndex: number): void { + private _invalidateLine(lineIndex: number): void { this.store.invalidateLine(lineIndex); } @@ -457,33 +473,16 @@ export class ModelLinesTokens { //#region Tokenization - public _tokenizeOneLine(buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder): number { + public tokenizeOneInvalidLine(buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder): number { if (!this.hasLinesToTokenize(buffer)) { return buffer.getLineCount() + 1; } const lineNumber = this.store.invalidLineStartIndex + 1; - this._updateTokensUntilLine(buffer, eventBuilder, lineNumber); + this.updateTokensUntilLine(buffer, eventBuilder, lineNumber); return lineNumber; } - public _tokenizeText(buffer: ITextBuffer, text: string, state: IState): TokenizationResult2 { - let r: TokenizationResult2 | null = null; - - if (this.tokenizationSupport) { - try { - r = this.tokenizationSupport.tokenize2(text, state, 0); - } catch (e) { - onUnexpectedError(e); - } - } - - if (!r) { - r = nullTokenize2(this.languageIdentifier.id, text, state, 0); - } - return r; - } - - public _updateTokensUntilLine(buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, lineNumber: number): void { + public updateTokensUntilLine(buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, lineNumber: number): void { if (!this.tokenizationSupport) { this.store._invalidLineStartIndex = buffer.getLineCount(); return; @@ -495,28 +494,76 @@ export class ModelLinesTokens { // Validate all states up to and including endLineIndex for (let lineIndex = this.store.invalidLineStartIndex; lineIndex <= endLineIndex; lineIndex++) { const text = buffer.getLineContent(lineIndex + 1); - const lineStartState = this._getState(lineIndex); + const lineStartState = this.getState(lineIndex); - let r: TokenizationResult2 | null = null; - - try { - // Tokenize only the first X characters - let freshState = lineStartState!.clone(); - r = this.tokenizationSupport.tokenize2(text, freshState, 0); - } catch (e) { - onUnexpectedError(e); - } - - if (!r) { - r = nullTokenize2(this.languageIdentifier.id, text, lineStartState, 0); - } + const r = safeTokenize(this.languageIdentifier, this.tokenizationSupport, text, lineStartState!); this.store.setGoodTokens(this.languageIdentifier.id, linesLength, lineIndex, text, r); eventBuilder.registerChangedTokens(lineIndex + 1); lineIndex = this.store.invalidLineStartIndex - 1; // -1 because the outer loop increments it } } + public fakeTokenizeLines(buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, initialState: IState, startLineNumber: number, endLineNumber: number): void { + if (!this.tokenizationSupport) { + return; + } + + let state = initialState; + for (let i = startLineNumber; i <= endLineNumber; i++) { + let text = buffer.getLineContent(i); + let r = safeTokenize(this.languageIdentifier, this.tokenizationSupport, text, state); + if (r) { + this.setTokens(this.languageIdentifier.id, i - 1, text.length, r.tokens); + + // We cannot trust these states/tokens to be valid! + // (see https://github.com/Microsoft/vscode/issues/67607) + this._invalidateLine(i - 1); + this._setState(i - 1, state); + state = r.endState; + eventBuilder.registerChangedTokens(i); + } else { + state = initialState; + } + } + } + // #endregion + + _getAllStates(linesLength: number): (IState | null)[] { + const r: (IState | null)[] = []; + for (let i = 0; i < linesLength; i++) { + r[i] = this.getState(i); + } + r[linesLength] = this.store._lastState; + return r; + } + + _getAllInvalid(linesLength: number): number[] { + const r: number[] = []; + for (let i = 0; i < linesLength; i++) { + if (this.store.isInvalid(i)) { + r.push(i); + } + } + return r; + } +} + +export function safeTokenize(languageIdentifier: LanguageIdentifier, tokenizationSupport: ITokenizationSupport | null, text: string, state: IState): TokenizationResult2 { + let r: TokenizationResult2 | null = null; + + if (tokenizationSupport) { + try { + r = tokenizationSupport.tokenize2(text, state.clone(), 0); + } catch (e) { + onUnexpectedError(e); + } + } + + if (!r) { + r = nullTokenize2(languageIdentifier.id, text, state, 0); + } + return r; } export class ModelTokensChangedEventBuilder { diff --git a/src/vs/editor/test/common/model/model.line.test.ts b/src/vs/editor/test/common/model/model.line.test.ts index 19379cd5c2f..3c00d5a72b3 100644 --- a/src/vs/editor/test/common/model/model.line.test.ts +++ b/src/vs/editor/test/common/model/model.line.test.ts @@ -110,7 +110,7 @@ suite('ModelLinesTokens', () => { for (let lineIndex = 0; lineIndex < initial.length; lineIndex++) { const lineTokens = initial[lineIndex].tokens; const lineTextLength = model.getLineMaxColumn(lineIndex + 1) - 1; - model._tokens._setTokens(0, lineIndex, lineTextLength, TestToken.toTokens(lineTokens)); + model._tokens.setTokens(0, lineIndex, lineTextLength, TestToken.toTokens(lineTokens)); } model.applyEdits(edits.map((ed) => ({ @@ -441,14 +441,14 @@ suite('ModelLinesTokens', () => { test('insertion on empty line', () => { const model = new TextModel('some text', TextModel.DEFAULT_CREATION_OPTIONS, new LanguageIdentifier('test', 0)); - model._tokens._setTokens(0, 0, model.getLineMaxColumn(1) - 1, TestToken.toTokens([new TestToken(0, 1)])); + model._tokens.setTokens(0, 0, model.getLineMaxColumn(1) - 1, TestToken.toTokens([new TestToken(0, 1)])); model.applyEdits([{ range: new Range(1, 1, 1, 10), text: '' }]); - model._tokens._setTokens(0, 0, model.getLineMaxColumn(1) - 1, new Uint32Array(0)); + model._tokens.setTokens(0, 0, model.getLineMaxColumn(1) - 1, new Uint32Array(0)); model.applyEdits([{ range: new Range(1, 1, 1, 1), diff --git a/src/vs/editor/test/common/model/model.modes.test.ts b/src/vs/editor/test/common/model/model.modes.test.ts index 61a8bee1f08..4252f69541e 100644 --- a/src/vs/editor/test/common/model/model.modes.test.ts +++ b/src/vs/editor/test/common/model/model.modes.test.ts @@ -180,25 +180,18 @@ suite('Editor Model - Model Modes 2', () => { }; function invalidEqual(model: TextModel, expected: number[]): void { - let actual: number[] = []; - for (let i = 0, len = model.getLineCount(); i < len; i++) { - if (model._tokens._isInvalid(i)) { - actual.push(i); - } - } - assert.deepEqual(actual, expected); + assert.deepEqual(model._tokens._getAllInvalid(model.getLineCount()), expected); } function stateEqual(state: modes.IState, content: string): void { assert.equal((state).prevLineContent, content); } - function statesEqual(model: TextModel, states: string[]): void { - let i, len = states.length - 1; - for (i = 0; i < len; i++) { - stateEqual(model._tokens._getState(i)!, states[i]); + function statesEqual(model: TextModel, expectedStates: string[]): void { + const actualStates = model._tokens._getAllStates(model.getLineCount()); + for (let i = 0, len = expectedStates.length; i < len; i++) { + stateEqual(actualStates[i]!, expectedStates[i]); } - stateEqual(model._tokens.store._lastState!, states[len]); } let thisModel: TextModel; From d1c16cff65c6aed727787d27d67cff8ad8ceb209 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 3 Jul 2019 17:23:24 +0200 Subject: [PATCH 0997/1449] Reduce IModelLinesTokens shape --- src/vs/editor/common/model/textModel.ts | 60 +-------- src/vs/editor/common/model/textModelTokens.ts | 122 +++++++++++------- .../test/common/model/model.line.test.ts | 6 +- 3 files changed, 80 insertions(+), 108 deletions(-) diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index 5f404d807e8..4273d95645b 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -23,9 +23,9 @@ import { IntervalNode, IntervalTree, getNodeIsInOverviewRuler, recomputeMaxEnd } import { PieceTreeTextBufferBuilder } from 'vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder'; import { IModelContentChangedEvent, IModelDecorationsChangedEvent, IModelLanguageChangedEvent, IModelLanguageConfigurationChangedEvent, IModelOptionsChangedEvent, IModelTokensChangedEvent, InternalModelContentChangeEvent, ModelRawChange, ModelRawContentChangedEvent, ModelRawEOLChanged, ModelRawFlush, ModelRawLineChanged, ModelRawLinesDeleted, ModelRawLinesInserted } from 'vs/editor/common/model/textModelEvents'; import { SearchData, SearchParams, TextModelSearch } from 'vs/editor/common/model/textModelSearch'; -import { ModelLinesTokens, ModelTokensChangedEventBuilder, IModelLinesTokens, safeTokenize } from 'vs/editor/common/model/textModelTokens'; +import { ModelLinesTokens, ModelTokensChangedEventBuilder, IModelLinesTokens } from 'vs/editor/common/model/textModelTokens'; import { getWordAtText } from 'vs/editor/common/model/wordHelper'; -import { IState, LanguageId, LanguageIdentifier, TokenizationRegistry, FormattingOptions } from 'vs/editor/common/modes'; +import { LanguageId, LanguageIdentifier, TokenizationRegistry, FormattingOptions } from 'vs/editor/common/modes'; import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; import { NULL_LANGUAGE_IDENTIFIER } from 'vs/editor/common/modes/nullMode'; import { ignoreBracketsInToken } from 'vs/editor/common/modes/supports'; @@ -1342,7 +1342,7 @@ export class TextModel extends Disposable implements model.ITextModel { const change = contentChanges[i]; const [eolCount, firstLineLength] = TextModel._eolCount(change.text); try { - this._tokens.applyEdits(change.range, eolCount, firstLineLength); + this._tokens.store.applyEdits(change.range, eolCount, firstLineLength); } catch (err) { // emergency recovery => reset tokens this._tokens = new ModelLinesTokens(this._languageIdentifier, this._tokens.tokenizationSupport); @@ -1776,61 +1776,11 @@ export class TextModel extends Disposable implements model.ITextModel { //#region Tokenization public tokenizeViewport(startLineNumber: number, endLineNumber: number): void { - if (!this._tokens.tokenizationSupport) { - // nothing to do - return; - } - startLineNumber = Math.max(1, startLineNumber); endLineNumber = Math.min(this.getLineCount(), endLineNumber); - if (endLineNumber <= this._tokens.invalidLineStartIndex) { - // nothing to do - return; - } - - if (startLineNumber <= this._tokens.invalidLineStartIndex) { - // tokenization has reached the viewport start... - this.forceTokenization(endLineNumber); - return; - } - - let nonWhitespaceColumn = this.getLineFirstNonWhitespaceColumn(startLineNumber); - let fakeLines: string[] = []; - let initialState: IState | null = null; - for (let i = startLineNumber - 1; nonWhitespaceColumn > 0 && i >= 1; i--) { - let newNonWhitespaceIndex = this.getLineFirstNonWhitespaceColumn(i); - - if (newNonWhitespaceIndex === 0) { - continue; - } - - if (newNonWhitespaceIndex < nonWhitespaceColumn) { - initialState = this._tokens.getState(i - 1); - if (initialState) { - break; - } - fakeLines.push(this.getLineContent(i)); - nonWhitespaceColumn = newNonWhitespaceIndex; - } - } - - if (!initialState) { - initialState = this._tokens.tokenizationSupport.getInitialState(); - } - - let state = initialState; - for (let i = fakeLines.length - 1; i >= 0; i--) { - let r = safeTokenize(this._languageIdentifier, this._tokens.tokenizationSupport, fakeLines[i], state); - if (r) { - state = r.endState; - } else { - state = initialState; - } - } - const eventBuilder = new ModelTokensChangedEventBuilder(); - this._tokens.fakeTokenizeLines(this._buffer, eventBuilder, state, startLineNumber, endLineNumber); + this._tokens.tokenizeViewport(this._buffer, eventBuilder, startLineNumber, endLineNumber); const e = eventBuilder.build(); if (e) { @@ -1896,7 +1846,7 @@ export class TextModel extends Disposable implements model.ITextModel { private _getLineTokens(lineNumber: number): LineTokens { const lineText = this._buffer.getLineContent(lineNumber); - return this._tokens.getTokens(this._languageIdentifier.id, lineNumber - 1, lineText); + return this._tokens.store.getTokens(this._languageIdentifier.id, lineNumber - 1, lineText); } public getLanguageIdentifier(): LanguageIdentifier { diff --git a/src/vs/editor/common/model/textModelTokens.ts b/src/vs/editor/common/model/textModelTokens.ts index 35fac7434f5..eaa45a33d4b 100644 --- a/src/vs/editor/common/model/textModelTokens.ts +++ b/src/vs/editor/common/model/textModelTokens.ts @@ -390,19 +390,15 @@ class TokensStore { export interface IModelLinesTokens { readonly tokenizationSupport: ITokenizationSupport | null; + readonly store: TokensStore; readonly invalidLineStartIndex: number; - setTokens(topLevelLanguageId: LanguageId, lineIndex: number, lineTextLength: number, tokens: Uint32Array): void; - getTokens(topLevelLanguageId: LanguageId, lineIndex: number, lineText: string): LineTokens; - isCheapToTokenize(lineNumber: number): boolean; hasLinesToTokenize(buffer: ITextBuffer): boolean; - getState(lineIndex: number): IState | null; - applyEdits(range: Range, eolCount: number, firstLineLength: number): void; tokenizeOneInvalidLine(buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder): number; updateTokensUntilLine(buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, lineNumber: number): void; - fakeTokenizeLines(buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, initialState: IState, startLineNumber: number, endLineNumber: number): void; + tokenizeViewport(buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, startLineNumber: number, endLineNumber: number): void; _getAllStates(linesLength: number): (IState | null)[]; _getAllInvalid(linesLength: number): number[]; @@ -410,12 +406,16 @@ export interface IModelLinesTokens { export class ModelLinesTokens implements IModelLinesTokens { - public readonly languageIdentifier: LanguageIdentifier; + private readonly _languageIdentifier: LanguageIdentifier; public readonly tokenizationSupport: ITokenizationSupport | null; public readonly store: TokensStore; + public get invalidLineStartIndex() { + return this.store.invalidLineStartIndex; + } + constructor(languageIdentifier: LanguageIdentifier, tokenizationSupport: ITokenizationSupport | null) { - this.languageIdentifier = languageIdentifier; + this._languageIdentifier = languageIdentifier; this.tokenizationSupport = tokenizationSupport; let initialState: IState | null = null; @@ -430,14 +430,6 @@ export class ModelLinesTokens implements IModelLinesTokens { this.store = new TokensStore(initialState); } - public get invalidLineStartIndex() { - return this.store.invalidLineStartIndex; - } - - public getTokens(topLevelLanguageId: LanguageId, lineIndex: number, lineText: string): LineTokens { - return this.store.getTokens(topLevelLanguageId, lineIndex, lineText); - } - public isCheapToTokenize(lineNumber: number): boolean { const firstInvalidLineNumber = this.store.invalidLineStartIndex + 1; return (firstInvalidLineNumber >= lineNumber); @@ -447,30 +439,6 @@ export class ModelLinesTokens implements IModelLinesTokens { return (this.store.invalidLineStartIndex < buffer.getLineCount()); } - public getState(lineIndex: number): IState | null { - return this.store.getState(lineIndex); - } - - public setTokens(topLevelLanguageId: LanguageId, lineIndex: number, lineTextLength: number, tokens: Uint32Array): void { - this.store.setTokens(topLevelLanguageId, lineIndex, lineTextLength, tokens); - } - - private _setState(lineIndex: number, state: IState): void { - this.store.setState(lineIndex, state); - } - - //#region Editing - - public applyEdits(range: Range, eolCount: number, firstLineLength: number): void { - this.store.applyEdits(range, eolCount, firstLineLength); - } - - private _invalidateLine(lineIndex: number): void { - this.store.invalidateLine(lineIndex); - } - - //#endregion - //#region Tokenization public tokenizeOneInvalidLine(buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder): number { @@ -494,16 +462,70 @@ export class ModelLinesTokens implements IModelLinesTokens { // Validate all states up to and including endLineIndex for (let lineIndex = this.store.invalidLineStartIndex; lineIndex <= endLineIndex; lineIndex++) { const text = buffer.getLineContent(lineIndex + 1); - const lineStartState = this.getState(lineIndex); + const lineStartState = this.store.getState(lineIndex); - const r = safeTokenize(this.languageIdentifier, this.tokenizationSupport, text, lineStartState!); - this.store.setGoodTokens(this.languageIdentifier.id, linesLength, lineIndex, text, r); + const r = safeTokenize(this._languageIdentifier, this.tokenizationSupport, text, lineStartState!); + this.store.setGoodTokens(this._languageIdentifier.id, linesLength, lineIndex, text, r); eventBuilder.registerChangedTokens(lineIndex + 1); lineIndex = this.store.invalidLineStartIndex - 1; // -1 because the outer loop increments it } } - public fakeTokenizeLines(buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, initialState: IState, startLineNumber: number, endLineNumber: number): void { + public tokenizeViewport(buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, startLineNumber: number, endLineNumber: number): void { + if (!this.tokenizationSupport) { + // nothing to do + return; + } + + if (endLineNumber <= this.invalidLineStartIndex) { + // nothing to do + return; + } + + if (startLineNumber <= this.invalidLineStartIndex) { + // tokenization has reached the viewport start... + this.updateTokensUntilLine(buffer, eventBuilder, endLineNumber); + return; + } + + let nonWhitespaceColumn = buffer.getLineFirstNonWhitespaceColumn(startLineNumber); + let fakeLines: string[] = []; + let initialState: IState | null = null; + for (let i = startLineNumber - 1; nonWhitespaceColumn > 0 && i >= 1; i--) { + let newNonWhitespaceIndex = buffer.getLineFirstNonWhitespaceColumn(i); + + if (newNonWhitespaceIndex === 0) { + continue; + } + + if (newNonWhitespaceIndex < nonWhitespaceColumn) { + initialState = this.store.getState(i - 1); + if (initialState) { + break; + } + fakeLines.push(buffer.getLineContent(i)); + nonWhitespaceColumn = newNonWhitespaceIndex; + } + } + + if (!initialState) { + initialState = this.tokenizationSupport.getInitialState(); + } + + let state = initialState; + for (let i = fakeLines.length - 1; i >= 0; i--) { + let r = safeTokenize(this._languageIdentifier, this.tokenizationSupport, fakeLines[i], state); + if (r) { + state = r.endState; + } else { + state = initialState; + } + } + + this._fakeTokenizeLines(buffer, eventBuilder, state, startLineNumber, endLineNumber); + } + + private _fakeTokenizeLines(buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, initialState: IState, startLineNumber: number, endLineNumber: number): void { if (!this.tokenizationSupport) { return; } @@ -511,14 +533,14 @@ export class ModelLinesTokens implements IModelLinesTokens { let state = initialState; for (let i = startLineNumber; i <= endLineNumber; i++) { let text = buffer.getLineContent(i); - let r = safeTokenize(this.languageIdentifier, this.tokenizationSupport, text, state); + let r = safeTokenize(this._languageIdentifier, this.tokenizationSupport, text, state); if (r) { - this.setTokens(this.languageIdentifier.id, i - 1, text.length, r.tokens); + this.store.setTokens(this._languageIdentifier.id, i - 1, text.length, r.tokens); // We cannot trust these states/tokens to be valid! // (see https://github.com/Microsoft/vscode/issues/67607) - this._invalidateLine(i - 1); - this._setState(i - 1, state); + this.store.invalidateLine(i - 1); + this.store.setState(i - 1, state); state = r.endState; eventBuilder.registerChangedTokens(i); } else { @@ -532,7 +554,7 @@ export class ModelLinesTokens implements IModelLinesTokens { _getAllStates(linesLength: number): (IState | null)[] { const r: (IState | null)[] = []; for (let i = 0; i < linesLength; i++) { - r[i] = this.getState(i); + r[i] = this.store.getState(i); } r[linesLength] = this.store._lastState; return r; @@ -549,7 +571,7 @@ export class ModelLinesTokens implements IModelLinesTokens { } } -export function safeTokenize(languageIdentifier: LanguageIdentifier, tokenizationSupport: ITokenizationSupport | null, text: string, state: IState): TokenizationResult2 { +function safeTokenize(languageIdentifier: LanguageIdentifier, tokenizationSupport: ITokenizationSupport | null, text: string, state: IState): TokenizationResult2 { let r: TokenizationResult2 | null = null; if (tokenizationSupport) { diff --git a/src/vs/editor/test/common/model/model.line.test.ts b/src/vs/editor/test/common/model/model.line.test.ts index 3c00d5a72b3..4c65dc30d48 100644 --- a/src/vs/editor/test/common/model/model.line.test.ts +++ b/src/vs/editor/test/common/model/model.line.test.ts @@ -110,7 +110,7 @@ suite('ModelLinesTokens', () => { for (let lineIndex = 0; lineIndex < initial.length; lineIndex++) { const lineTokens = initial[lineIndex].tokens; const lineTextLength = model.getLineMaxColumn(lineIndex + 1) - 1; - model._tokens.setTokens(0, lineIndex, lineTextLength, TestToken.toTokens(lineTokens)); + model._tokens.store.setTokens(0, lineIndex, lineTextLength, TestToken.toTokens(lineTokens)); } model.applyEdits(edits.map((ed) => ({ @@ -441,14 +441,14 @@ suite('ModelLinesTokens', () => { test('insertion on empty line', () => { const model = new TextModel('some text', TextModel.DEFAULT_CREATION_OPTIONS, new LanguageIdentifier('test', 0)); - model._tokens.setTokens(0, 0, model.getLineMaxColumn(1) - 1, TestToken.toTokens([new TestToken(0, 1)])); + model._tokens.store.setTokens(0, 0, model.getLineMaxColumn(1) - 1, TestToken.toTokens([new TestToken(0, 1)])); model.applyEdits([{ range: new Range(1, 1, 1, 10), text: '' }]); - model._tokens.setTokens(0, 0, model.getLineMaxColumn(1) - 1, new Uint32Array(0)); + model._tokens.store.setTokens(0, 0, model.getLineMaxColumn(1) - 1, new Uint32Array(0)); model.applyEdits([{ range: new Range(1, 1, 1, 1), From f7f2c289495292982565cac3e6d849a3ff3eb669 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 3 Jul 2019 17:24:14 +0200 Subject: [PATCH 0998/1449] do not run watch tests in non linux platforms --- .../fileUserDataProvider.test.ts | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts b/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts index 33d27dadac4..b8e3ee65f10 100644 --- a/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts +++ b/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts @@ -22,6 +22,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IUserDataContainerRegistry, Extensions } from 'vs/workbench/services/userData/common/userData'; import { BACKUPS } from 'vs/platform/environment/common/environment'; import { DisposableStore } from 'vs/base/common/lifecycle'; +import { isLinux } from 'vs/base/common/platform'; suite('FileUserDataProvider', () => { @@ -102,6 +103,9 @@ suite('FileUserDataProvider', () => { }); test('watch file - event is triggerred when file is created', async (done) => { + if (!isLinux) { + return done(); // watch tests are flaky on other platforms + } const resource = joinPath(userDataResource, 'settings.json'); disposables.add(testObject.watch(resource)); testObject.onFileChanges(e => { @@ -113,6 +117,9 @@ suite('FileUserDataProvider', () => { }); test('watch file - event is triggerred when file is created externally', async (done) => { + if (!isLinux) { + return done(); // watch tests are flaky on other platforms + } const resource = joinPath(userDataResource, 'settings.json'); disposables.add(testObject.watch(resource)); testObject.onFileChanges(e => { @@ -124,6 +131,9 @@ suite('FileUserDataProvider', () => { }); test('watch file - event is triggerred when file is updated', async (done) => { + if (!isLinux) { + return done(); // watch tests are flaky on other platforms + } const resource = joinPath(userDataResource, 'settings.json'); await testObject.writeFile(resource, VSBuffer.fromString('{}')); disposables.add(testObject.watch(resource)); @@ -136,6 +146,9 @@ suite('FileUserDataProvider', () => { }); test('watch file - event is triggerred when file is update externally', async (done) => { + if (!isLinux) { + return done(); // watch tests are flaky on other platforms + } const resource = joinPath(userDataResource, 'settings.json'); await testObject.writeFile(resource, VSBuffer.fromString('{}')); disposables.add(testObject.watch(resource)); @@ -148,6 +161,9 @@ suite('FileUserDataProvider', () => { }); test('watch file - event is triggerred when file is deleted', async (done) => { + if (!isLinux) { + return done(); // watch tests are flaky on other platforms + } const resource = joinPath(userDataResource, 'settings.json'); await testObject.writeFile(resource, VSBuffer.fromString('{}')); disposables.add(testObject.watch(resource)); @@ -160,6 +176,9 @@ suite('FileUserDataProvider', () => { }); test('watch file - event is triggerred when file is deleted externally', async (done) => { + if (!isLinux) { + return done(); // watch tests are flaky on other platforms + } const resource = joinPath(userDataResource, 'settings.json'); await testObject.writeFile(resource, VSBuffer.fromString('{}')); disposables.add(testObject.watch(resource)); @@ -320,6 +339,9 @@ suite('FileUserDataProvider', () => { }); test('watch file under container - event is triggerred when file is created', async (done) => { + if (!isLinux) { + return done(); // watch tests are flaky on other platforms + } const resource = joinPath(userDataResource, 'testContainer/settings.json'); disposables.add(testObject.watch(resource)); testObject.onFileChanges(e => { @@ -331,6 +353,9 @@ suite('FileUserDataProvider', () => { }); test('watch file under container - event is triggerred when file is created externally', async (done) => { + if (!isLinux) { + return done(); // watch tests are flaky on other platforms + } const resource = joinPath(userDataResource, 'testContainer/settings.json'); disposables.add(testObject.watch(resource)); testObject.onFileChanges(e => { @@ -343,6 +368,9 @@ suite('FileUserDataProvider', () => { }); test('watch file under container - event is triggerred when file is updated', async (done) => { + if (!isLinux) { + return done(); // watch tests are flaky on other platforms + } const resource = joinPath(userDataResource, 'testContainer/settings.json'); await pfs.mkdirp(path.join(userDataPath, 'testContainer')); await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); @@ -356,6 +384,9 @@ suite('FileUserDataProvider', () => { }); test('watch file under container - event is triggerred when file is updated externally', async (done) => { + if (!isLinux) { + return done(); // watch tests are flaky on other platforms + } const resource = joinPath(userDataResource, 'testContainer/settings.json'); await pfs.mkdirp(path.join(userDataPath, 'testContainer')); await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); @@ -369,6 +400,9 @@ suite('FileUserDataProvider', () => { }); test('watch file under container - event is triggerred when file is deleted', async (done) => { + if (!isLinux) { + return done(); // watch tests are flaky on other platforms + } const resource = joinPath(userDataResource, 'testContainer/settings.json'); await testObject.writeFile(resource, VSBuffer.fromString('{}')); disposables.add(testObject.watch(resource)); @@ -381,6 +415,9 @@ suite('FileUserDataProvider', () => { }); test('watch file under container - event is triggerred when file is deleted externally', async (done) => { + if (!isLinux) { + return done(); // watch tests are flaky on other platforms + } const resource = joinPath(userDataResource, 'testContainer/settings.json'); await testObject.writeFile(resource, VSBuffer.fromString('{}')); disposables.add(testObject.watch(resource)); @@ -393,6 +430,9 @@ suite('FileUserDataProvider', () => { }); test('watch container - event is triggerred when file under container is created', async (done) => { + if (!isLinux) { + return done(); // watch tests are flaky on other platforms + } const container = joinPath(userDataResource, 'testContainer'); disposables.add(testObject.watch(container)); testObject.onFileChanges(e => { @@ -404,6 +444,9 @@ suite('FileUserDataProvider', () => { }); test('watch container - event is triggerred when file under container is created externally', async (done) => { + if (!isLinux) { + return done(); // watch tests are flaky on other platforms + } await pfs.mkdirp(path.join(userDataPath, 'testContainer')); const container = joinPath(userDataResource, 'testContainer'); disposables.add(testObject.watch(container)); @@ -416,6 +459,9 @@ suite('FileUserDataProvider', () => { }); test('watch container - event is triggerred when file under container is deleted', async (done) => { + if (!isLinux) { + return done(); // watch tests are flaky on other platforms + } const container = joinPath(userDataResource, 'testContainer'); const resource = joinPath(userDataResource, 'testContainer/settings.json'); await testObject.writeFile(resource, VSBuffer.fromString('{}')); @@ -429,6 +475,9 @@ suite('FileUserDataProvider', () => { }); test('watch container - event is triggerred when file under container is deleted externally ', async (done) => { + if (!isLinux) { + return done(); // watch tests are flaky on other platforms + } const container = joinPath(userDataResource, 'testContainer'); const resource = joinPath(userDataResource, 'testContainer/settings.json'); await testObject.writeFile(resource, VSBuffer.fromString('{}')); From 346475351b4ad6deef15305088323e48ccecff04 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 17:31:24 +0200 Subject: [PATCH 0999/1449] expose compile-build --- build/gulpfile.compile.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build/gulpfile.compile.js b/build/gulpfile.compile.js index a32936ef4b2..21aa7896558 100644 --- a/build/gulpfile.compile.js +++ b/build/gulpfile.compile.js @@ -5,10 +5,12 @@ 'use strict'; +const gulp = require('gulp'); const util = require('./lib/util'); const task = require('./lib/task'); const compilation = require('./lib/compilation'); // Full compile, including nls and inline sources in sourcemaps, for build const compileBuildTask = task.define('compile-build', task.series(util.rimraf('out-build'), compilation.compileTask('src', 'out-build', true))); +gulp.task(compileBuildTask); exports.compileBuildTask = compileBuildTask; \ No newline at end of file From ada8fd30eee7f906ec2642ff8fa92e5909ed8c95 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 3 Jul 2019 09:05:39 -0700 Subject: [PATCH 1000/1449] xterm@3.15.0-beta66 Diff: https://github.com/xtermjs/xterm.js/compare/96eafd3...c55e938 Changes: - WebGL PR merged - wordSeparator option - Layering refactors - Benchmark merged in - declarationMap - tslint clean - Lower z-indexes (already fixed in vscode) - Guard against floats in API - Reset isWrapped on windows - Centered scroll - Fix selecting half of double width chars Fixes #50623 Fixes #76526 --- package.json | 2 +- remote/package.json | 2 +- remote/yarn.lock | 8 ++++---- yarn.lock | 8 ++++---- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index b0f93c2caf6..7fd5e9b9fac 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "vscode-ripgrep": "^1.3.1", "vscode-sqlite3": "4.0.8", "vscode-textmate": "^4.1.1", - "xterm": "3.15.0-beta50", + "xterm": "3.15.0-beta66", "xterm-addon-search": "0.1.0-beta6", "xterm-addon-web-links": "0.1.0-beta10", "yauzl": "^2.9.2", diff --git a/remote/package.json b/remote/package.json index f42c63cb320..588663f7c6a 100644 --- a/remote/package.json +++ b/remote/package.json @@ -21,7 +21,7 @@ "vscode-proxy-agent": "0.4.0", "vscode-ripgrep": "^1.3.1", "vscode-textmate": "^4.1.1", - "xterm": "3.15.0-beta50", + "xterm": "3.15.0-beta66", "xterm-addon-search": "0.1.0-beta6", "xterm-addon-web-links": "0.1.0-beta10", "yauzl": "^2.9.2", diff --git a/remote/yarn.lock b/remote/yarn.lock index c59cdeb73e7..0ef0ce48afb 100644 --- a/remote/yarn.lock +++ b/remote/yarn.lock @@ -1554,10 +1554,10 @@ xterm-addon-web-links@0.1.0-beta10: resolved "https://registry.yarnpkg.com/xterm-addon-web-links/-/xterm-addon-web-links-0.1.0-beta10.tgz#610fa9773a2a5ccd41c1c83ba0e2dd2c9eb66a23" integrity sha512-xfpjy0V6bB4BR44qIgZQPoCMVakxb65gMscPkHpO//QxvUxKzabV3dxOsIbeZRFkUGsWTFlvz2OoaBLoNtv5gg== -xterm@3.15.0-beta50: - version "3.15.0-beta50" - resolved "https://registry.yarnpkg.com/xterm/-/xterm-3.15.0-beta50.tgz#6413057fe36ff5808a41eba337f83076144d5c10" - integrity sha512-LAJ8kP3U8oXnVR3uaL4NxNFKcFDt3Zoec53hgYppwW8P5LdmL/dc0eDpgqiEsPLx4GgD37d8J92EcoMzKs2vVw== +xterm@3.15.0-beta66: + version "3.15.0-beta66" + resolved "https://registry.yarnpkg.com/xterm/-/xterm-3.15.0-beta66.tgz#b3aa25f0d86f02820f7b2ab2bcab14b02e6aed61" + integrity sha512-2DiQI2S6qvBhul9CkGIV6Zd2QTpMqsVB32qf3P6cbDeJBRztHkqpeCWg3hnsP7EBCiUSWlbqs0/fKP6JaSP7aQ== yauzl@^2.9.2: version "2.10.0" diff --git a/yarn.lock b/yarn.lock index dbc0d7fff9b..47bcae9e061 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9822,10 +9822,10 @@ xterm-addon-web-links@0.1.0-beta10: resolved "https://registry.yarnpkg.com/xterm-addon-web-links/-/xterm-addon-web-links-0.1.0-beta10.tgz#610fa9773a2a5ccd41c1c83ba0e2dd2c9eb66a23" integrity sha512-xfpjy0V6bB4BR44qIgZQPoCMVakxb65gMscPkHpO//QxvUxKzabV3dxOsIbeZRFkUGsWTFlvz2OoaBLoNtv5gg== -xterm@3.15.0-beta50: - version "3.15.0-beta50" - resolved "https://registry.yarnpkg.com/xterm/-/xterm-3.15.0-beta50.tgz#6413057fe36ff5808a41eba337f83076144d5c10" - integrity sha512-LAJ8kP3U8oXnVR3uaL4NxNFKcFDt3Zoec53hgYppwW8P5LdmL/dc0eDpgqiEsPLx4GgD37d8J92EcoMzKs2vVw== +xterm@3.15.0-beta66: + version "3.15.0-beta66" + resolved "https://registry.yarnpkg.com/xterm/-/xterm-3.15.0-beta66.tgz#b3aa25f0d86f02820f7b2ab2bcab14b02e6aed61" + integrity sha512-2DiQI2S6qvBhul9CkGIV6Zd2QTpMqsVB32qf3P6cbDeJBRztHkqpeCWg3hnsP7EBCiUSWlbqs0/fKP6JaSP7aQ== y18n@^3.2.1: version "3.2.1" From e3cd9c21cb55c4876309a442a6c14135dd6d7921 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 3 Jul 2019 09:07:18 -0700 Subject: [PATCH 1001/1449] xterm-addon-search@0.2.0-beta2 Fixes #50623 --- package.json | 2 +- remote/package.json | 2 +- remote/yarn.lock | 8 ++++---- yarn.lock | 8 ++++---- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 7fd5e9b9fac..b134ab4db02 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "vscode-sqlite3": "4.0.8", "vscode-textmate": "^4.1.1", "xterm": "3.15.0-beta66", - "xterm-addon-search": "0.1.0-beta6", + "xterm-addon-search": "0.2.0-beta2", "xterm-addon-web-links": "0.1.0-beta10", "yauzl": "^2.9.2", "yazl": "^2.4.3" diff --git a/remote/package.json b/remote/package.json index 588663f7c6a..189b0f5e3f7 100644 --- a/remote/package.json +++ b/remote/package.json @@ -22,7 +22,7 @@ "vscode-ripgrep": "^1.3.1", "vscode-textmate": "^4.1.1", "xterm": "3.15.0-beta66", - "xterm-addon-search": "0.1.0-beta6", + "xterm-addon-search": "0.2.0-beta2", "xterm-addon-web-links": "0.1.0-beta10", "yauzl": "^2.9.2", "yazl": "^2.4.3" diff --git a/remote/yarn.lock b/remote/yarn.lock index 0ef0ce48afb..b1a68e9e0e3 100644 --- a/remote/yarn.lock +++ b/remote/yarn.lock @@ -1544,10 +1544,10 @@ xtend@^4.0.0: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= -xterm-addon-search@0.1.0-beta6: - version "0.1.0-beta6" - resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.1.0-beta6.tgz#e2a2b441f8f7b0245c63731d0b2af32c7d4e6747" - integrity sha512-XKxdfO48HkCJW2m1wXW0PK/BOk00WEaN+W2LgDQqCBwwUjyBzWc9HaV8gzLXhSCDAYesWvtQa3RfqHfSp9qsbQ== +xterm-addon-search@0.2.0-beta2: + version "0.2.0-beta2" + resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.2.0-beta2.tgz#c3173f0a6f207ee9f1848849174ee5d6b6ce8262" + integrity sha512-XEcwi2TeFGk2MuIFjiI/OpVXSNO5dGQBvHH3o+9KzqG3ooVqhhDqzwxs092QGNcNCGh8hGn/PWZiczaBBnKm/g== xterm-addon-web-links@0.1.0-beta10: version "0.1.0-beta10" diff --git a/yarn.lock b/yarn.lock index 47bcae9e061..cc85dcfa0a7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9812,10 +9812,10 @@ xtend@~2.1.1: dependencies: object-keys "~0.4.0" -xterm-addon-search@0.1.0-beta6: - version "0.1.0-beta6" - resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.1.0-beta6.tgz#e2a2b441f8f7b0245c63731d0b2af32c7d4e6747" - integrity sha512-XKxdfO48HkCJW2m1wXW0PK/BOk00WEaN+W2LgDQqCBwwUjyBzWc9HaV8gzLXhSCDAYesWvtQa3RfqHfSp9qsbQ== +xterm-addon-search@0.2.0-beta2: + version "0.2.0-beta2" + resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.2.0-beta2.tgz#c3173f0a6f207ee9f1848849174ee5d6b6ce8262" + integrity sha512-XEcwi2TeFGk2MuIFjiI/OpVXSNO5dGQBvHH3o+9KzqG3ooVqhhDqzwxs092QGNcNCGh8hGn/PWZiczaBBnKm/g== xterm-addon-web-links@0.1.0-beta10: version "0.1.0-beta10" From 375bcf6f7c091c74f209d0954e97670bc1ac80b8 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 18:13:24 +0200 Subject: [PATCH 1002/1449] test out SaveCache theory --- build/azure-pipelines/linux/product-build-linux.yml | 2 +- build/azure-pipelines/product-compile.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 3407fde4727..9d52787fadc 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -7,7 +7,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: keyfile: '.build/commit' - targetfolder: '.build, out-build' + targetfolder: '.build, **/out-build' vstsFeed: 'npm-vscode' platformIndependent: true alias: 'Compilation' diff --git a/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml index e1c9f90cabb..a78c9ed8eea 100644 --- a/build/azure-pipelines/product-compile.yml +++ b/build/azure-pipelines/product-compile.yml @@ -7,7 +7,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: keyfile: '.build/commit' - targetfolder: '.build, out-build' + targetfolder: '.build, **/out-build' vstsFeed: 'npm-vscode' platformIndependent: true alias: 'Compilation' @@ -113,7 +113,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: keyfile: '.build/commit' - targetfolder: '.build, out-build' + targetfolder: '.build, **/out-build' vstsFeed: 'npm-vscode' platformIndependent: true alias: 'Compilation' From 2b7e92eeca5bf91d8a1ff7c26d29ac19dd2693d0 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 3 Jul 2019 09:21:10 -0700 Subject: [PATCH 1003/1449] Update virtual process API names Part of #70978 --- src/vs/vscode.proposed.d.ts | 16 +++++----- .../api/node/extHostTerminalService.ts | 32 +++++++++---------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 659cd1e9490..014a199a1a3 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1325,7 +1325,7 @@ declare module 'vscode' { * writeEmitter.fire('\x1b[10;20H*'); * ``` */ - write: Event; + onDidWrite: Event; /** * An event that when fired allows overriding the [dimensions](#Terminal.dimensions) of the @@ -1347,13 +1347,13 @@ declare module 'vscode' { * }); * ``` */ - overrideDimensions?: Event; + onDidOverrideDimensions?: Event; /** * An event that when fired will exit the process with an exit code, this will behave the * same for a virtual process as when a regular process exits with an exit code. */ - exit?: Event; + onDidExit?: Event; /** * Implement to handle keystrokes in the terminal or when an extension calls @@ -1367,13 +1367,13 @@ declare module 'vscode' { * ```typescript * const writeEmitter = new vscode.EventEmitter(); * const virtualProcess: TerminalVirtualProcess = { - * write: writeEmitter.event, - * onDidAcceptInput: data => writeEmitter.fire(data === '\r' ? '\r\n' : data); + * onDidWrite: writeEmitter.event, + * input: data => writeEmitter.fire(data === '\r' ? '\r\n' : data); * }; * vscode.window.createTerminal({ name: 'Local echo', virtualProcess }); * ``` */ - onDidAcceptInput?(data: string): void; + input?(data: string): void; /** * Implement to handle when the number of rows and columns that fit into the terminal panel @@ -1383,12 +1383,12 @@ declare module 'vscode' { * * @param dimensions The new dimensions. */ - onDidChangeDimensions?(dimensions: TerminalDimensions): void; + setDimensions?(dimensions: TerminalDimensions): void; /** * Implement to handle when the terminal shuts down by an act of the user. */ - onDidShutdownTerminal?(): void; + shutdown?(): void; } //#endregion diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 0605a48b680..71d4a0d0faf 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -730,30 +730,30 @@ class ExtHostVirtualProcess implements ITerminalChildProcess { private readonly _virtualProcess: vscode.TerminalVirtualProcess ) { this._queueDisposables = []; - this._queueDisposables.push(this._virtualProcess.write(e => this._queuedEvents.push({ emitter: this._onProcessData, data: e }))); - if (this._virtualProcess.exit) { - this._queueDisposables.push(this._virtualProcess.exit(e => this._queuedEvents.push({ emitter: this._onProcessExit, data: e }))); + this._queueDisposables.push(this._virtualProcess.onDidWrite(e => this._queuedEvents.push({ emitter: this._onProcessData, data: e }))); + if (this._virtualProcess.onDidExit) { + this._queueDisposables.push(this._virtualProcess.onDidExit(e => this._queuedEvents.push({ emitter: this._onProcessExit, data: e }))); } - if (this._virtualProcess.overrideDimensions) { - this._queueDisposables.push(this._virtualProcess.overrideDimensions(e => this._queuedEvents.push({ emitter: this._onProcessOverrideDimensions, data: e ? { cols: e.columns, rows: e.rows } : undefined }))); + if (this._virtualProcess.onDidOverrideDimensions) { + this._queueDisposables.push(this._virtualProcess.onDidOverrideDimensions(e => this._queuedEvents.push({ emitter: this._onProcessOverrideDimensions, data: e ? { cols: e.columns, rows: e.rows } : undefined }))); } } shutdown(): void { - if (this._virtualProcess.onDidShutdownTerminal) { - this._virtualProcess.onDidShutdownTerminal(); + if (this._virtualProcess.shutdown) { + this._virtualProcess.shutdown(); } } input(data: string): void { - if (this._virtualProcess.onDidAcceptInput) { - this._virtualProcess.onDidAcceptInput(data); + if (this._virtualProcess.acceptInput) { + this._virtualProcess.acceptInput(data); } } resize(cols: number, rows: number): void { - if (this._virtualProcess.onDidChangeDimensions) { - this._virtualProcess.onDidChangeDimensions({ columns: cols, rows }); + if (this._virtualProcess.setDimensions) { + this._virtualProcess.setDimensions({ columns: cols, rows }); } } @@ -776,12 +776,12 @@ class ExtHostVirtualProcess implements ITerminalChildProcess { this._queueDisposables = undefined; // Attach the real listeners - this._virtualProcess.write(e => this._onProcessData.fire(e)); - if (this._virtualProcess.exit) { - this._virtualProcess.exit(e => this._onProcessExit.fire(e)); + this._virtualProcess.onDidWrite(e => this._onProcessData.fire(e)); + if (this._virtualProcess.onDidExit) { + this._virtualProcess.onDidExit(e => this._onProcessExit.fire(e)); } - if (this._virtualProcess.overrideDimensions) { - this._virtualProcess.overrideDimensions(e => this._onProcessOverrideDimensions.fire(e ? { cols: e.columns, rows: e.rows } : e)); + if (this._virtualProcess.onDidOverrideDimensions) { + this._virtualProcess.onDidOverrideDimensions(e => this._onProcessOverrideDimensions.fire(e ? { cols: e.columns, rows: e.rows } : e)); } } } From 7d29ec2f5087c4c395c8931d9b30fb2f44ebc48d Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 3 Jul 2019 09:24:56 -0700 Subject: [PATCH 1004/1449] Add virtual process exit example Part of #70978 --- src/vs/vscode.proposed.d.ts | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 014a199a1a3..183828a6860 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1314,7 +1314,7 @@ declare module 'vscode' { * ```typescript * const writeEmitter = new vscode.EventEmitter(); * const virtualProcess: TerminalVirtualProcess = { - * write: writeEmitter.event + * onDidWrite: writeEmitter.event * }; * vscode.window.createTerminal({ name: 'My terminal', virtualProcess }); * writeEmitter.fire('\x1b[31mHello world\x1b[0m'); @@ -1337,8 +1337,8 @@ declare module 'vscode' { * ```typescript * const dimensionsEmitter = new vscode.EventEmitter(); * const virtualProcess: TerminalVirtualProcess = { - * write: writeEmitter.event, - * overrideDimensions: dimensionsEmitter.event + * onDidWrite: writeEmitter.event, + * onDidOverrideDimensions: dimensionsEmitter.event * }; * vscode.window.createTerminal({ name: 'My terminal', virtualProcess }); * dimensionsEmitter.fire({ @@ -1352,6 +1352,17 @@ declare module 'vscode' { /** * An event that when fired will exit the process with an exit code, this will behave the * same for a virtual process as when a regular process exits with an exit code. + * + * **Example:** Exit with an exit code of `0` if the y key is pressed, otherwise `1`. + * ```typescript + * const writeEmitter = new vscode.EventEmitter(); + * const exitEmitter = new vscode.EventEmitter(); + * const virtualProcess: TerminalVirtualProcess = { + * onDidWrite: writeEmitter.event, + * input: data => exitEmitter.fire(data === 'y' ? 0 : 1) + * }; + * vscode.window.createTerminal({ name: 'Exit example', virtualProcess }); + * writeEmitter.fire('Press y to exit successfully'); */ onDidExit?: Event; @@ -1368,7 +1379,7 @@ declare module 'vscode' { * const writeEmitter = new vscode.EventEmitter(); * const virtualProcess: TerminalVirtualProcess = { * onDidWrite: writeEmitter.event, - * input: data => writeEmitter.fire(data === '\r' ? '\r\n' : data); + * input: data => writeEmitter.fire(data === '\r' ? '\r\n' : data) * }; * vscode.window.createTerminal({ name: 'Local echo', virtualProcess }); * ``` From 27667093b40bf0d6acf723f954329eea33728a81 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 3 Jul 2019 09:27:17 -0700 Subject: [PATCH 1005/1449] Fix virtual process input api --- src/vs/workbench/api/node/extHostTerminalService.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 71d4a0d0faf..524cd7abb1e 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -746,8 +746,8 @@ class ExtHostVirtualProcess implements ITerminalChildProcess { } input(data: string): void { - if (this._virtualProcess.acceptInput) { - this._virtualProcess.acceptInput(data); + if (this._virtualProcess.input) { + this._virtualProcess.input(data); } } From e0722d1b8762c7313d4468c73248826df9d6d4f9 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 18:28:15 +0200 Subject: [PATCH 1006/1449] resume linux build --- .../linux/product-build-linux.yml | 198 +++++++++--------- 1 file changed, 96 insertions(+), 102 deletions(-) diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 9d52787fadc..d01a6fee819 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -12,123 +12,117 @@ steps: platformIndependent: true alias: 'Compilation' +- task: NodeTool@0 + inputs: + versionSpec: "10.15.1" + +- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 + inputs: + versionSpec: "1.10.1" + +- task: AzureKeyVault@1 + displayName: 'Azure Key Vault: Get Secrets' + inputs: + azureSubscription: 'vscode-builds-subscription' + KeyVaultName: vscode + - script: | set -e - ls -la .build - ls -la out-build - displayName: Check cache + export npm_config_arch="$(VSCODE_ARCH)" -# - task: NodeTool@0 -# inputs: -# versionSpec: "10.15.1" + cat << EOF > ~/.netrc + machine monacotools.visualstudio.com + password $(devops-pat) + machine github.com + login vscode + password $(github-distro-mixin-password) + EOF -# - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 -# inputs: -# versionSpec: "1.10.1" + git config user.email "vscode@microsoft.com" + git config user.name "VSCode" + displayName: Prepare tooling -# - task: AzureKeyVault@1 -# displayName: 'Azure Key Vault: Get Secrets' -# inputs: -# azureSubscription: 'vscode-builds-subscription' -# KeyVaultName: vscode +- script: | + set -e + git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git" + git fetch distro + git merge $(node -p "require('./package.json').distro") + displayName: Merge distro -# - script: | -# set -e -# export npm_config_arch="$(VSCODE_ARCH)" +- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + inputs: + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'npm-vscode' -# cat << EOF > ~/.netrc -# machine monacotools.visualstudio.com -# password $(devops-pat) -# machine github.com -# login vscode -# password $(github-distro-mixin-password) -# EOF +- script: | + set -e + yarn --frozen-lockfile + displayName: Install dependencies + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) -# git config user.email "vscode@microsoft.com" -# git config user.name "VSCode" -# displayName: Prepare tooling +- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 + inputs: + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'npm-vscode' + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) -# - script: | -# set -e -# git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git" -# git fetch distro -# git merge $(node -p "require('./package.json').distro") -# displayName: Merge distro +- script: | + set -e + yarn postinstall + displayName: Run postinstall scripts + condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) -# - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 -# inputs: -# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' -# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' -# vstsFeed: 'npm-vscode' +- script: | + set -e + yarn gulp mixin + displayName: Mix in quality -# - script: | -# set -e -# yarn --frozen-lockfile -# displayName: Install dependencies -# condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) +- script: | + set -e + node build/azure-pipelines/common/installDistroDependencies.js + node build/azure-pipelines/common/installDistroDependencies.js remote + node build/lib/builtInExtensions.js + displayName: Install distro dependencies and extensions -# - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 -# inputs: -# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' -# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' -# vstsFeed: 'npm-vscode' -# condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) +- script: | + set -e + VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ + yarn gulp vscode-linux-$VSCODE_ARCH-min-ci + VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ + yarn gulp vscode-reh-linux-$VSCODE_ARCH-min-ci + VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ + yarn gulp vscode-web-linux-$VSCODE_ARCH-min-ci + displayName: Build -# - script: | -# set -e -# yarn postinstall -# displayName: Run postinstall scripts -# condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) +- script: | + set -e + yarn gulp "electron-$(VSCODE_ARCH)" -# - script: | -# set -e -# yarn gulp mixin -# displayName: Mix in quality + # xvfb seems to be crashing often, let's make sure it's always up + service xvfb start -# - script: | -# set -e -# node build/azure-pipelines/common/installDistroDependencies.js -# node build/azure-pipelines/common/installDistroDependencies.js remote -# node build/lib/builtInExtensions.js -# displayName: Install distro dependencies and extensions + DISPLAY=:10 ./scripts/test.sh --build --tfs "Unit Tests" + # yarn smoketest -- --build "$(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH)" + displayName: Run unit tests + condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) -# - script: | -# set -e -# VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ -# yarn gulp vscode-linux-$VSCODE_ARCH-min-ci -# VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ -# yarn gulp vscode-reh-linux-$VSCODE_ARCH-min-ci -# VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ -# yarn gulp vscode-web-linux-$VSCODE_ARCH-min-ci -# displayName: Build +- script: | + set -e + AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ + AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ + VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ + VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ + ./build/azure-pipelines/linux/publish.sh + displayName: Publish -# - script: | -# set -e -# yarn gulp "electron-$(VSCODE_ARCH)" +- task: PublishPipelineArtifact@0 + displayName: 'Publish Pipeline Artifact' + inputs: + artifactName: snap-$(VSCODE_ARCH) + targetPath: .build/linux/snap-tarball -# # xvfb seems to be crashing often, let's make sure it's always up -# service xvfb start - -# DISPLAY=:10 ./scripts/test.sh --build --tfs "Unit Tests" -# # yarn smoketest -- --build "$(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH)" -# displayName: Run unit tests -# condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - -# - script: | -# set -e -# AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ -# AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ -# VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ -# VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ -# ./build/azure-pipelines/linux/publish.sh -# displayName: Publish - -# - task: PublishPipelineArtifact@0 -# displayName: 'Publish Pipeline Artifact' -# inputs: -# artifactName: snap-$(VSCODE_ARCH) -# targetPath: .build/linux/snap-tarball - -# - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 -# displayName: 'Component Detection' -# continueOnError: true +- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 + displayName: 'Component Detection' + continueOnError: true From 2ad9bd893c10dfa425e03167667cd189ca9395bb Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 18:29:25 +0200 Subject: [PATCH 1007/1449] run compilation inside container --- build/azure-pipelines/product-build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 9e52eccb457..11ed339a420 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -10,6 +10,9 @@ jobs: - job: Compile pool: vmImage: 'Ubuntu-16.04' + variables: + VSCODE_ARCH: x64 + container: vscode-x64 steps: - template: product-compile.yml From 7ca515846156939a5d6819ea0fcee15e89a6a649 Mon Sep 17 00:00:00 2001 From: Haneef Mohammed Date: Wed, 3 Jul 2019 09:47:03 -0700 Subject: [PATCH 1008/1449] simplify check before saving state. --- src/vs/workbench/contrib/debug/browser/variablesView.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/debug/browser/variablesView.ts b/src/vs/workbench/contrib/debug/browser/variablesView.ts index cf134a73933..b12ac70119b 100644 --- a/src/vs/workbench/contrib/debug/browser/variablesView.ts +++ b/src/vs/workbench/contrib/debug/browser/variablesView.ts @@ -62,7 +62,7 @@ export class VariablesView extends ViewletPanel { this.tree.setInput(this.debugService.getViewModel(), this.savedViewState).then(null, onUnexpectedError); this.savedViewState = undefined; } else { - if (!stackFrame && !this.savedViewState) { + if (!stackFrame) { // We have no stackFrame, save tree state before it is cleared this.savedViewState = this.tree.getViewState(); } From 4f930b907f836d36f2b3214dd8cb3851e3acceed Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 3 Jul 2019 10:09:38 -0700 Subject: [PATCH 1009/1449] Fix terminal suppressImplicitAnyIndexErrors Part of #76442 --- .../contrib/terminal/browser/terminalConfigHelper.ts | 2 +- .../contrib/terminal/common/terminalColorRegistry.ts | 4 ++-- .../workbench/contrib/terminal/common/terminalEnvironment.ts | 2 +- src/vs/workbench/contrib/terminal/node/terminal.ts | 2 +- src/vs/workbench/contrib/terminal/node/terminalEnvironment.ts | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalConfigHelper.ts b/src/vs/workbench/contrib/terminal/browser/terminalConfigHelper.ts index 4935f3122e7..899cbf7f524 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalConfigHelper.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalConfigHelper.ts @@ -176,7 +176,7 @@ export class TerminalConfigHelper implements IBrowserTerminalConfigHelper { const platformKey = osOverride === platform.OperatingSystem.Windows ? 'windows' : osOverride === platform.OperatingSystem.Macintosh ? 'osx' : 'linux'; const shellConfigValue = this._workspaceConfigurationService.inspect(`terminal.integrated.shell.${platformKey}`); const shellArgsConfigValue = this._workspaceConfigurationService.inspect(`terminal.integrated.shellArgs.${platformKey}`); - const envConfigValue = this._workspaceConfigurationService.inspect(`terminal.integrated.env.${platformKey}`); + const envConfigValue = this._workspaceConfigurationService.inspect<{ [key: string]: string }>(`terminal.integrated.env.${platformKey}`); // Check if workspace setting exists and whether it's whitelisted let isWorkspaceShellAllowed: boolean | undefined = false; diff --git a/src/vs/workbench/contrib/terminal/common/terminalColorRegistry.ts b/src/vs/workbench/contrib/terminal/common/terminalColorRegistry.ts index 1c53f04f3ff..61b7ee7740e 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalColorRegistry.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalColorRegistry.ts @@ -5,7 +5,7 @@ import * as nls from 'vs/nls'; -import { registerColor, ColorIdentifier } from 'vs/platform/theme/common/colorRegistry'; +import { registerColor, ColorIdentifier, ColorDefaults } from 'vs/platform/theme/common/colorRegistry'; import { PANEL_BORDER, PANEL_BACKGROUND } from 'vs/workbench/common/theme'; /** @@ -37,7 +37,7 @@ export const TERMINAL_BORDER_COLOR = registerColor('terminal.border', { hc: PANEL_BORDER }, nls.localize('terminal.border', 'The color of the border that separates split panes within the terminal. This defaults to panel.border.')); -export const ansiColorMap = { +export const ansiColorMap: { [key: string]: { index: number, defaults: ColorDefaults } } = { 'terminal.ansiBlack': { index: 0, defaults: { diff --git a/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts b/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts index 7309615c7fd..6ba23e4d400 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts @@ -92,7 +92,7 @@ function _getLangEnvVariable(locale?: string) { if (n === 1) { // app.getLocale can return just a language without a variant, fill in the variant for // supported languages as many shells expect a 2-part locale. - const languageVariants = { + const languageVariants: { [key: string]: string } = { cs: 'CZ', de: 'DE', en: 'US', diff --git a/src/vs/workbench/contrib/terminal/node/terminal.ts b/src/vs/workbench/contrib/terminal/node/terminal.ts index 1f8eeafa076..f686213d1cb 100644 --- a/src/vs/workbench/contrib/terminal/node/terminal.ts +++ b/src/vs/workbench/contrib/terminal/node/terminal.ts @@ -108,7 +108,7 @@ async function detectAvailableWindowsShells(): Promise { useWSLexe = true; } - const expectedLocations = { + const expectedLocations: { [key: string]: string[] } = { 'Command Prompt': [`${system32Path}\\cmd.exe`], PowerShell: [`${system32Path}\\WindowsPowerShell\\v1.0\\powershell.exe`], 'PowerShell Core': [await getShellPathFromRegistry('pwsh')], diff --git a/src/vs/workbench/contrib/terminal/node/terminalEnvironment.ts b/src/vs/workbench/contrib/terminal/node/terminalEnvironment.ts index 2df9ffe52b5..a362d720738 100644 --- a/src/vs/workbench/contrib/terminal/node/terminalEnvironment.ts +++ b/src/vs/workbench/contrib/terminal/node/terminalEnvironment.ts @@ -37,7 +37,7 @@ export async function getMainProcessParentEnv(): Promise { }); } while (name === codeProcessName); const rawEnv = await readFile(`/proc/${pid}/environ`, 'utf8'); - const env = {}; + const env: IProcessEnvironment = {}; rawEnv.split('\0').forEach(e => { const i = e.indexOf('='); env[e.substr(0, i)] = e.substr(i + 1); From 059882642be3f4b7f24173ebe1902a17eaac2b71 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 3 Jul 2019 10:09:53 -0700 Subject: [PATCH 1010/1449] Fix terminal.test.ts compile errors --- .../src/singlefolder-tests/terminal.test.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts index e292a29d7ba..4be1d9deeb5 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts @@ -215,7 +215,7 @@ suite('window namespace tests', () => { term.dispose(); }); const virtualProcess: TerminalVirtualProcess = { - write: new EventEmitter().event + onDidWrite: new EventEmitter().event }; window.createTerminal({ name: 'c', virtualProcess }); }); @@ -227,8 +227,8 @@ suite('window namespace tests', () => { term.show(); }); const virtualProcess: TerminalVirtualProcess = { - write: new EventEmitter().event, - onDidChangeDimensions: dimensions => { + onDidWrite: new EventEmitter().event, + setDimensions: dimensions => { ok(dimensions.columns > 0); ok(dimensions.rows > 0); const reg2 = window.onDidCloseTerminal(() => { @@ -258,7 +258,7 @@ suite('window namespace tests', () => { }); const writeEmitter = new EventEmitter(); const virtualProcess: TerminalVirtualProcess = { - write: writeEmitter.event + onDidWrite: writeEmitter.event }; const terminal = window.createTerminal({ name: 'foo', virtualProcess }); }); @@ -284,8 +284,8 @@ suite('window namespace tests', () => { const writeEmitter = new EventEmitter(); const overrideDimensionsEmitter = new EventEmitter(); const virtualProcess: TerminalVirtualProcess = { - write: writeEmitter.event, - overrideDimensions: overrideDimensionsEmitter.event + onDidWrite: writeEmitter.event, + onDidOverrideDimensions: overrideDimensionsEmitter.event }; const terminal = window.createTerminal({ name: 'foo', virtualProcess }); }); From 0991720b7b44ffc15760b578b284caff78ccf398 Mon Sep 17 00:00:00 2001 From: Logan Ramos Date: Wed, 3 Jul 2019 10:12:23 -0700 Subject: [PATCH 1011/1449] Build Improvements for Telemetry Command (#76431) * Update telemetry tooling commit * Extract telemetry build to helper script * Fix file permissions * Script fixes * Update telemetry commit * Update telemetry tool commit * Wrap commands in Exec * Fix some execs * Fixed typo * Update commit --- build/azure-pipelines/common/extract-telemetry.sh | 14 ++++++++++++++ .../darwin/product-build-darwin.yml | 12 +----------- .../azure-pipelines/linux/product-build-linux.yml | 12 +----------- .../azure-pipelines/win32/product-build-win32.yml | 12 ++++++------ 4 files changed, 22 insertions(+), 28 deletions(-) create mode 100755 build/azure-pipelines/common/extract-telemetry.sh diff --git a/build/azure-pipelines/common/extract-telemetry.sh b/build/azure-pipelines/common/extract-telemetry.sh new file mode 100755 index 00000000000..f07721cc5c1 --- /dev/null +++ b/build/azure-pipelines/common/extract-telemetry.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +set -e + +cd $BUILD_STAGINGDIRECTORY +git clone https://github.com/microsoft/vscode-telemetry-extractor.git +cd vscode-telemetry-extractor +git checkout f538e3157c84d1bd0b239dfc5ebccac226006d58 +npm i +npm run setup-extension-repos +node ./out/cli-extract.js --sourceDir $BUILD_SOURCESDIRECTORY --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents +node ./out/cli-extract-extensions.js --sourceDir ./src/telemetry-sources --outputDir . --applyEndpoints --includeIsMeasurement +mkdir -p $BUILD_SOURCESDIRECTORY/.build/telemetry +mv declarations-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-core.json +mv declarations-extensions-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-extensions.json \ No newline at end of file diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index 4b747443cc1..13691851e5b 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -81,17 +81,7 @@ steps: - script: | set -e - cd $BUILD_STAGINGDIRECTORY - git clone https://github.com/microsoft/vscode-telemetry-extractor.git - cd vscode-telemetry-extractor - git checkout 3b04aba5bfdfcca1a5426cd2c51a90d18740d0bc - npm i - npm run setup-extension-repos - node ./out/cli-extract.js --sourceDir $BUILD_SOURCESDIRECTORY --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents - node ./out/cli-extract-extensions.js --sourceDir ./src/telemetry-sources --outputDir . --applyEndpoints --includeIsMeasurement - mkdir -p $BUILD_SOURCESDIRECTORY/.build/telemetry - mv declarations-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-core.json - mv declarations-extensions-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-extensions.json + ./build/azure-pipelines/common/extract-telemetry.sh displayName: Extract Telemetry - script: | diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index f6887313aef..9322cd15a45 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -82,17 +82,7 @@ steps: - script: | set -e - cd $BUILD_STAGINGDIRECTORY - git clone https://github.com/microsoft/vscode-telemetry-extractor.git - cd vscode-telemetry-extractor - git checkout 3b04aba5bfdfcca1a5426cd2c51a90d18740d0bc - npm i - npm run setup-extension-repos - node ./out/cli-extract.js --sourceDir $BUILD_SOURCESDIRECTORY --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents - node ./out/cli-extract-extensions.js --sourceDir ./src/telemetry-sources --outputDir . --applyEndpoints --includeIsMeasurement - mkdir -p $BUILD_SOURCESDIRECTORY/.build/telemetry - mv declarations-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-core.json - mv declarations-extensions-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-extensions.json + ./build/azure-pipelines/common/extract-telemetry.sh displayName: Extract Telemetry - script: | diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 799599251a8..e6f663f0e31 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -93,13 +93,13 @@ steps: . build/azure-pipelines/win32/exec.ps1 $ErrorActionPreference = "Stop" cd $env:BUILD_STAGINGDIRECTORY - git clone https://github.com/microsoft/vscode-telemetry-extractor.git + exec { git clone https://github.com/microsoft/vscode-telemetry-extractor.git } cd vscode-telemetry-extractor - git checkout 3b04aba5bfdfcca1a5426cd2c51a90d18740d0bc - npm i - npm run setup-extension-repos - node .\out\cli-extract.js --sourceDir $env:BUILD_SOURCESDIRECTORY --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents - node .\out\cli-extract-extensions.js --sourceDir .\src\telemetry-sources --outputDir . --applyEndpoints --includeIsMeasurement + exec { git checkout f538e3157c84d1bd0b239dfc5ebccac226006d58 } + exec { npm i } + exec { npm run setup-extension-repos } + exec { node .\out\cli-extract.js --sourceDir $env:BUILD_SOURCESDIRECTORY --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents } + exec { node .\out\cli-extract-extensions.js --sourceDir .\src\telemetry-sources --outputDir . --applyEndpoints --includeIsMeasurement } mkdir $env:BUILD_SOURCESDIRECTORY\.build\telemetry -ea 0 mv declarations-resolved.json $env:BUILD_SOURCESDIRECTORY\.build\telemetry\telemetry-core.json mv declarations-extensions-resolved.json $env:BUILD_SOURCESDIRECTORY\.build\telemetry\telemetry-extensions.json From f7c692ab4cfbf0598e19de6e75e28c360d0c08e7 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 3 Jul 2019 10:14:29 -0700 Subject: [PATCH 1012/1449] Fix suppressImplicitAnyIndexErrors false in externalTerminal Part of #76442 --- .../contrib/externalTerminal/node/externalTerminalService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts b/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts index 38f4bc89d92..d894850a728 100644 --- a/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts +++ b/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts @@ -326,7 +326,7 @@ export class LinuxExternalTerminalService implements IExternalTerminalService { * tries to turn OS errors into more meaningful error messages */ function improveError(err: Error): Error { - if (err['errno'] === 'ENOENT' && err['path']) { + if ('errno' in err && err['errno'] === 'ENOENT' && 'path' in err && typeof err['path'] === 'string') { return new Error(nls.localize('ext.term.app.not.found', "can't find terminal application '{0}'", err['path'])); } return err; From 960f567da7ab501b9be41b3fc0d3e65c8ba539af Mon Sep 17 00:00:00 2001 From: Logan Ramos Date: Wed, 3 Jul 2019 10:15:28 -0700 Subject: [PATCH 1013/1449] Removes abbreviations in strongly typed telemetry events (#76478) * Remove abbreviations * Fixed spelling mistake --- src/vs/base/common/actions.ts | 4 ++-- .../contextview/browser/contextMenuHandler.ts | 4 ++-- .../node/extensionGalleryService.ts | 14 +++++++------- .../common/abstractKeybindingService.ts | 4 ++-- .../platform/menubar/electron-main/menubar.ts | 4 ++-- .../telemetry/common/telemetryService.ts | 4 ++-- .../telemetry/common/telemetryUtils.ts | 18 +++++++++--------- .../workbench/browser/parts/compositePart.ts | 4 ++-- .../browser/parts/editor/titleControl.ts | 4 ++-- .../notifications/notificationsActions.ts | 4 ++-- .../browser/parts/statusbar/statusbarPart.ts | 4 ++-- .../contrib/debug/browser/debugToolBar.ts | 4 ++-- .../contrib/feedback/browser/feedback.ts | 4 ++-- .../files/browser/views/explorerView.ts | 4 ++-- .../files/browser/views/openEditorsView.ts | 4 ++-- .../quickopen/browser/commandsHandler.ts | 4 ++-- .../welcome/page/browser/welcomePage.ts | 4 ++-- .../electron-browser/contextmenuService.ts | 4 ++-- 18 files changed, 48 insertions(+), 48 deletions(-) diff --git a/src/vs/base/common/actions.ts b/src/vs/base/common/actions.ts index 14925ea276a..b0e1b6f161e 100644 --- a/src/vs/base/common/actions.ts +++ b/src/vs/base/common/actions.ts @@ -12,12 +12,12 @@ export interface ITelemetryData { [key: string]: any; } -export type WBActionExecutedClassification = { +export type WorkbenchActionExecutedClassification = { id: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; from: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; }; -export type WBActionExecutedEvent = { +export type WorkbenchActionExecutedEvent = { id: string; from: string; }; diff --git a/src/vs/platform/contextview/browser/contextMenuHandler.ts b/src/vs/platform/contextview/browser/contextMenuHandler.ts index 8bcf74d2b6e..4d3479aae8b 100644 --- a/src/vs/platform/contextview/browser/contextMenuHandler.ts +++ b/src/vs/platform/contextview/browser/contextMenuHandler.ts @@ -5,8 +5,8 @@ import 'vs/css!./contextMenuHandler'; +import { ActionRunner, IRunEvent, WorkbenchActionExecutedEvent, WorkbenchActionExecutedClassification } from 'vs/base/common/actions'; import { combinedDisposable, DisposableStore } from 'vs/base/common/lifecycle'; -import { ActionRunner, IRunEvent, WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; import { Menu } from 'vs/base/browser/ui/menu/menu'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -132,7 +132,7 @@ export class ContextMenuHandler { private onActionRun(e: IRunEvent): void { if (this.telemetryService) { - this.telemetryService.publicLog2('workbenchActionExecuted', { id: e.action.id, from: 'contextMenu' }); + this.telemetryService.publicLog2('workbenchActionExecuted', { id: e.action.id, from: 'contextMenu' }); } this.contextViewService.hideContextView(false); diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts index ad13418d430..473b0af7e6b 100644 --- a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts @@ -647,26 +647,26 @@ export class ExtensionGalleryService implements IExtensionGalleryService { } const message = getErrorMessage(err); - type GalleryServiceREClassification = { + type GalleryServiceRequestErrorClassification = { url: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; cdn: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; message: { classification: 'CallstackOrException', purpose: 'FeatureInsight' }; }; - type GalleryServiceREServiceEvent = { + type GalleryServiceRequestErrorEvent = { url: string; cdn: boolean; message: string; }; - this.telemetryService.publicLog2('galleryService:requestError', { url, cdn: true, message }); - type GalleryServiceCDNFBClassification = { + this.telemetryService.publicLog2('galleryService:requestError', { url, cdn: true, message }); + type GalleryServiceCDNFallbackClassification = { url: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; message: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; }; - type GalleryServiceCDNFBEvent = { + type GalleryServiceCDNFallbackEvent = { url: string; message: string; }; - this.telemetryService.publicLog2('galleryService:cdnFallback', { url, message }); + this.telemetryService.publicLog2('galleryService:cdnFallback', { url, message }); const fallbackOptions = assign({}, options, { url: fallbackUrl }); return this.requestService.request(fallbackOptions, token).then(undefined, err => { @@ -675,7 +675,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { } const message = getErrorMessage(err); - this.telemetryService.publicLog2('galleryService:requestError', { url: fallbackUrl, cdn: false, message }); + this.telemetryService.publicLog2('galleryService:requestError', { url: fallbackUrl, cdn: false, message }); return Promise.reject(err); }); }); diff --git a/src/vs/platform/keybinding/common/abstractKeybindingService.ts b/src/vs/platform/keybinding/common/abstractKeybindingService.ts index ddbc309ec5a..0a138fd3639 100644 --- a/src/vs/platform/keybinding/common/abstractKeybindingService.ts +++ b/src/vs/platform/keybinding/common/abstractKeybindingService.ts @@ -16,7 +16,7 @@ import { IResolveResult, KeybindingResolver } from 'vs/platform/keybinding/commo import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKeybindingItem'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; +import { WorkbenchActionExecutedEvent, WorkbenchActionExecutedClassification } from 'vs/base/common/actions'; interface CurrentChord { keypress: string; @@ -196,7 +196,7 @@ export abstract class AbstractKeybindingService extends Disposable implements IK } else { this._commandService.executeCommand(resolveResult.commandId, resolveResult.commandArgs).then(undefined, err => this._notificationService.warn(err)); } - this._telemetryService.publicLog2('workbenchActionExecuted', { id: resolveResult.commandId, from: 'keybinding' }); + this._telemetryService.publicLog2('workbenchActionExecuted', { id: resolveResult.commandId, from: 'keybinding' }); } return shouldPreventDefault; diff --git a/src/vs/platform/menubar/electron-main/menubar.ts b/src/vs/platform/menubar/electron-main/menubar.ts index db54a6e81de..c8091409e3f 100644 --- a/src/vs/platform/menubar/electron-main/menubar.ts +++ b/src/vs/platform/menubar/electron-main/menubar.ts @@ -21,7 +21,7 @@ import { IMenubarData, IMenubarKeybinding, MenubarMenuItem, isMenubarMenuItemSep import { URI } from 'vs/base/common/uri'; import { IStateService } from 'vs/platform/state/common/state'; import { ILifecycleService } from 'vs/platform/lifecycle/electron-main/lifecycleMain'; -import { WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; +import { WorkbenchActionExecutedEvent, WorkbenchActionExecutedClassification } from 'vs/base/common/actions'; const telemetryFrom = 'menu'; @@ -784,7 +784,7 @@ export class Menubar { } private reportMenuActionTelemetry(id: string): void { - this.telemetryService.publicLog2('workbenchActionExecuted', { id, from: telemetryFrom }); + this.telemetryService.publicLog2('workbenchActionExecuted', { id, from: telemetryFrom }); } private mnemonicLabel(label: string): string { diff --git a/src/vs/platform/telemetry/common/telemetryService.ts b/src/vs/platform/telemetry/common/telemetryService.ts index 8790401d7c7..30fb12f5f79 100644 --- a/src/vs/platform/telemetry/common/telemetryService.ts +++ b/src/vs/platform/telemetry/common/telemetryService.ts @@ -57,13 +57,13 @@ export class TelemetryService implements ITelemetryService { if (this._configurationService) { this._updateUserOptIn(); this._configurationService.onDidChangeConfiguration(this._updateUserOptIn, this, this._disposables); - type OptInClass = { + type OptInClassification = { optIn: { classification: 'SystemMetaData', purpose: 'BusinessInsight', isMeasurement: true }; }; type OptInEvent = { optIn: boolean; }; - this.publicLog2('optInStatus', { optIn: this._userOptIn }); + this.publicLog2('optInStatus', { optIn: this._userOptIn }); this._commonProperties.then(values => { const isHashedId = /^[a-f0-9]+$/i.test(values['common.machineId']); diff --git a/src/vs/platform/telemetry/common/telemetryUtils.ts b/src/vs/platform/telemetry/common/telemetryUtils.ts index e05a710372b..dd9ef9aeea7 100644 --- a/src/vs/platform/telemetry/common/telemetryUtils.ts +++ b/src/vs/platform/telemetry/common/telemetryUtils.ts @@ -195,27 +195,27 @@ const configurationValueWhitelist = [ export function configurationTelemetry(telemetryService: ITelemetryService, configurationService: IConfigurationService): IDisposable { return configurationService.onDidChangeConfiguration(event => { if (event.source !== ConfigurationTarget.DEFAULT) { - type UpdateConfigClassification = { + type UpdateConfigurationClassification = { configurationSource: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; configurationKeys: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; }; - type UpdateConfigEvent = { + type UpdateConfigurationEvent = { configurationSource: string; configurationKeys: string[]; }; - telemetryService.publicLog2('updateConfiguration', { + telemetryService.publicLog2('updateConfiguration', { configurationSource: ConfigurationTargetToString(event.source), configurationKeys: flattenKeys(event.sourceConfig) }); - type UpdateConfigValClassification = { + type UpdateConfigurationValuesClassification = { configurationSource: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; configurationValues: { classification: 'CustomerContent', purpose: 'FeatureInsight' }; }; - type UpdateConfigValEvent = { + type UpdateConfigurationValuesEvent = { configurationSource: string; configurationValues: { [key: string]: any }[]; }; - telemetryService.publicLog2('updateConfigurationValues', { + telemetryService.publicLog2('updateConfigurationValues', { configurationSource: ConfigurationTargetToString(event.source), configurationValues: flattenValues(event.sourceConfig, configurationValueWhitelist) }); @@ -226,13 +226,13 @@ export function configurationTelemetry(telemetryService: ITelemetryService, conf export function keybindingsTelemetry(telemetryService: ITelemetryService, keybindingService: IKeybindingService): IDisposable { return keybindingService.onDidUpdateKeybindings(event => { if (event.source === KeybindingSource.User && event.keybindings) { - type UpdateKBClassification = { + type UpdateKeybindingsClassification = { bindings: { classification: 'CustomerContent', purpose: 'FeatureInsight' }; }; - type UpdateKBEvents = { + type UpdateKeybindingsEvents = { bindings: { key: string, command: string, when: string | undefined, args: boolean | undefined }[]; }; - telemetryService.publicLog2('updateKeybindings', { + telemetryService.publicLog2('updateKeybindings', { bindings: event.keybindings.map(binding => ({ key: binding.key, command: binding.command, diff --git a/src/vs/workbench/browser/parts/compositePart.ts b/src/vs/workbench/browser/parts/compositePart.ts index 38b5da80ef5..d09cf93901b 100644 --- a/src/vs/workbench/browser/parts/compositePart.ts +++ b/src/vs/workbench/browser/parts/compositePart.ts @@ -14,7 +14,7 @@ import { ToolBar } from 'vs/base/browser/ui/toolbar/toolbar'; import { IActionViewItem, ActionsOrientation } from 'vs/base/browser/ui/actionbar/actionbar'; import { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar'; import { prepareActions } from 'vs/workbench/browser/actions'; -import { IAction, WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; +import { IAction, WorkbenchActionExecutedEvent, WorkbenchActionExecutedClassification } from 'vs/base/common/actions'; import { Part, IPartOptions } from 'vs/workbench/browser/part'; import { Composite, CompositeRegistry } from 'vs/workbench/browser/composite'; import { IComposite } from 'vs/workbench/common/composite'; @@ -261,7 +261,7 @@ export abstract class CompositePart extends Part { // Log in telemetry if (this.telemetryService) { - this.telemetryService.publicLog2('workbenchActionExecuted', { id: e.action.id, from: this.nameForTelemetry }); + this.telemetryService.publicLog2('workbenchActionExecuted', { id: e.action.id, from: this.nameForTelemetry }); } }); diff --git a/src/vs/workbench/browser/parts/editor/titleControl.ts b/src/vs/workbench/browser/parts/editor/titleControl.ts index 3ae79e95d7d..967a587184f 100644 --- a/src/vs/workbench/browser/parts/editor/titleControl.ts +++ b/src/vs/workbench/browser/parts/editor/titleControl.ts @@ -8,7 +8,7 @@ import { addDisposableListener, Dimension, EventType } from 'vs/base/browser/dom import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import { ActionsOrientation, IActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { ToolBar } from 'vs/base/browser/ui/toolbar/toolbar'; -import { IAction, IRunEvent, WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; +import { IAction, IRunEvent, WorkbenchActionExecutedEvent, WorkbenchActionExecutedClassification } from 'vs/base/common/actions'; import * as arrays from 'vs/base/common/arrays'; import { ResolvedKeybinding } from 'vs/base/common/keyCodes'; import { dispose, DisposableStore } from 'vs/base/common/lifecycle'; @@ -152,7 +152,7 @@ export abstract class TitleControl extends Themable { // Log in telemetry if (this.telemetryService) { - this.telemetryService.publicLog2('workbenchActionExecuted', { id: e.action.id, from: 'editorPart' }); + this.telemetryService.publicLog2('workbenchActionExecuted', { id: e.action.id, from: 'editorPart' }); } })); } diff --git a/src/vs/workbench/browser/parts/notifications/notificationsActions.ts b/src/vs/workbench/browser/parts/notifications/notificationsActions.ts index eca2e75e76c..c4ef92629a4 100644 --- a/src/vs/workbench/browser/parts/notifications/notificationsActions.ts +++ b/src/vs/workbench/browser/parts/notifications/notificationsActions.ts @@ -6,7 +6,7 @@ import 'vs/css!./media/notificationsActions'; import { INotificationViewItem } from 'vs/workbench/common/notifications'; import { localize } from 'vs/nls'; -import { Action, IAction, ActionRunner, WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; +import { Action, IAction, ActionRunner, WorkbenchActionExecutedEvent, WorkbenchActionExecutedClassification } from 'vs/base/common/actions'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { CLEAR_NOTIFICATION, EXPAND_NOTIFICATION, COLLAPSE_NOTIFICATION, CLEAR_ALL_NOTIFICATIONS, HIDE_NOTIFICATIONS_CENTER } from 'vs/workbench/browser/parts/notifications/notificationsCommands'; @@ -161,7 +161,7 @@ export class NotificationActionRunner extends ActionRunner { } protected async runAction(action: IAction, context: INotificationViewItem): Promise { - this.telemetryService.publicLog2('workbenchActionExecuted', { id: action.id, from: 'message' }); + this.telemetryService.publicLog2('workbenchActionExecuted', { id: action.id, from: 'message' }); // Run and make sure to notify on any error again try { diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts index 82caead6b6d..7ae3a2a1d76 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts @@ -15,7 +15,7 @@ import { IInstantiationService, ServiceIdentifier } from 'vs/platform/instantiat import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { StatusbarAlignment, IStatusbarService, IStatusbarEntry, IStatusbarEntryAccessor } from 'vs/platform/statusbar/common/statusbar'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { Action, IAction, WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; +import { Action, IAction, WorkbenchActionExecutedEvent, WorkbenchActionExecutedClassification } from 'vs/base/common/actions'; import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector, ThemeColor } from 'vs/platform/theme/common/themeService'; import { STATUS_BAR_BACKGROUND, STATUS_BAR_FOREGROUND, STATUS_BAR_NO_FOLDER_BACKGROUND, STATUS_BAR_ITEM_HOVER_BACKGROUND, STATUS_BAR_ITEM_ACTIVE_BACKGROUND, STATUS_BAR_PROMINENT_ITEM_FOREGROUND, STATUS_BAR_PROMINENT_ITEM_BACKGROUND, STATUS_BAR_PROMINENT_ITEM_HOVER_BACKGROUND, STATUS_BAR_BORDER, STATUS_BAR_NO_FOLDER_FOREGROUND, STATUS_BAR_NO_FOLDER_BORDER } from 'vs/workbench/common/theme'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; @@ -725,7 +725,7 @@ class StatusbarEntryItem extends Disposable { activeTextEditorWidget.focus(); } - this.telemetryService.publicLog2('workbenchActionExecuted', { id, from: 'status bar' }); + this.telemetryService.publicLog2('workbenchActionExecuted', { id, from: 'status bar' }); try { await this.commandService.executeCommand(id, ...args); } catch (error) { diff --git a/src/vs/workbench/contrib/debug/browser/debugToolBar.ts b/src/vs/workbench/contrib/debug/browser/debugToolBar.ts index 56fda384f0d..dc603f4eedb 100644 --- a/src/vs/workbench/contrib/debug/browser/debugToolBar.ts +++ b/src/vs/workbench/contrib/debug/browser/debugToolBar.ts @@ -9,7 +9,7 @@ import * as browser from 'vs/base/browser/browser'; import * as dom from 'vs/base/browser/dom'; import * as arrays from 'vs/base/common/arrays'; import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; -import { IAction, IRunEvent, WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; +import { IAction, IRunEvent, WorkbenchActionExecutedEvent, WorkbenchActionExecutedClassification } from 'vs/base/common/actions'; import { ActionBar, ActionsOrientation, Separator } from 'vs/base/browser/ui/actionbar/actionbar'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; @@ -141,7 +141,7 @@ export class DebugToolBar extends Themable implements IWorkbenchContribution { // log in telemetry if (this.telemetryService) { - this.telemetryService.publicLog2('workbenchActionExecuted', { id: e.action.id, from: 'debugActionsWidget' }); + this.telemetryService.publicLog2('workbenchActionExecuted', { id: e.action.id, from: 'debugActionsWidget' }); } })); this._register(dom.addDisposableListener(window, dom.EventType.RESIZE, () => this.setCoordinates())); diff --git a/src/vs/workbench/contrib/feedback/browser/feedback.ts b/src/vs/workbench/contrib/feedback/browser/feedback.ts index 9655b55c958..9cebd7fe920 100644 --- a/src/vs/workbench/contrib/feedback/browser/feedback.ts +++ b/src/vs/workbench/contrib/feedback/browser/feedback.ts @@ -17,7 +17,7 @@ import { editorWidgetBackground, editorWidgetForeground, widgetShadow, inputBord import { IAnchor } from 'vs/base/browser/ui/contextview/contextview'; import { Button } from 'vs/base/browser/ui/button/button'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; +import { WorkbenchActionExecutedEvent, WorkbenchActionExecutedClassification } from 'vs/base/common/actions'; import { IStatusbarService } from 'vs/platform/statusbar/common/statusbar'; import { IProductService } from 'vs/platform/product/common/product'; @@ -213,7 +213,7 @@ export class FeedbackDropdown extends Dropdown { const actionId = 'workbench.action.openIssueReporter'; this.commandService.executeCommand(actionId); this.hide(); - this.telemetryService.publicLog2('workbenchActionExecuted', { id: actionId, from: 'feedback' }); + this.telemetryService.publicLog2('workbenchActionExecuted', { id: actionId, from: 'feedback' }); })); // Contact: Request a Feature diff --git a/src/vs/workbench/contrib/files/browser/views/explorerView.ts b/src/vs/workbench/contrib/files/browser/views/explorerView.ts index fbc052ece11..c00e7867bbf 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerView.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerView.ts @@ -6,7 +6,7 @@ import * as nls from 'vs/nls'; import { URI } from 'vs/base/common/uri'; import * as perf from 'vs/base/common/performance'; -import { Action, IAction, WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; +import { Action, IAction, WorkbenchActionExecutedEvent, WorkbenchActionExecutedClassification } from 'vs/base/common/actions'; import { memoize } from 'vs/base/common/decorators'; import { IFilesConfiguration, ExplorerFolderContext, FilesExplorerFocusedContext, ExplorerFocusedContext, ExplorerRootContext, ExplorerResourceReadonlyContext, IExplorerService, ExplorerResourceCut, ExplorerResourceMoveableToTrash } from 'vs/workbench/contrib/files/common/files'; import { NewFolderAction, NewFileAction, FileCopiedContext, RefreshExplorerView, CollapseExplorerView } from 'vs/workbench/contrib/files/browser/fileActions'; @@ -326,7 +326,7 @@ export class ExplorerView extends ViewletPanel { // Do not react if clicking on directories return; } - this.telemetryService.publicLog2('workbenchActionExecuted', { id: 'workbench.files.openFile', from: 'explorer' }); + this.telemetryService.publicLog2('workbenchActionExecuted', { id: 'workbench.files.openFile', from: 'explorer' }); this.editorService.openEditor({ resource: selection[0].resource, options: { preserveFocus: e.editorOptions.preserveFocus, pinned: e.editorOptions.pinned } }, e.sideBySide ? SIDE_GROUP : ACTIVE_GROUP) .then(undefined, onUnexpectedError); } diff --git a/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts b/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts index 30e2150437b..31a5963340f 100644 --- a/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts +++ b/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts @@ -5,7 +5,7 @@ import * as nls from 'vs/nls'; import { RunOnceScheduler } from 'vs/base/common/async'; -import { IAction, ActionRunner, WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; +import { IAction, ActionRunner, WorkbenchActionExecutedEvent, WorkbenchActionExecutedClassification } from 'vs/base/common/actions'; import * as dom from 'vs/base/browser/dom'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -345,7 +345,7 @@ export class OpenEditorsView extends ViewletPanel { private openEditor(element: OpenEditor, options: { preserveFocus: boolean; pinned: boolean; sideBySide: boolean; }): void { if (element) { - this.telemetryService.publicLog2('workbenchActionExecuted', { id: 'workbench.files.openFile', from: 'openEditors' }); + this.telemetryService.publicLog2('workbenchActionExecuted', { id: 'workbench.files.openFile', from: 'openEditors' }); const preserveActivateGroup = options.sideBySide && options.preserveFocus; // needed for https://github.com/Microsoft/vscode/issues/42399 if (!preserveActivateGroup) { diff --git a/src/vs/workbench/contrib/quickopen/browser/commandsHandler.ts b/src/vs/workbench/contrib/quickopen/browser/commandsHandler.ts index d1a3d725563..7728e87a884 100644 --- a/src/vs/workbench/contrib/quickopen/browser/commandsHandler.ts +++ b/src/vs/workbench/contrib/quickopen/browser/commandsHandler.ts @@ -7,7 +7,7 @@ import * as nls from 'vs/nls'; import * as arrays from 'vs/base/common/arrays'; import * as types from 'vs/base/common/types'; import { Language } from 'vs/base/common/platform'; -import { Action, WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; +import { Action, WorkbenchActionExecutedEvent, WorkbenchActionExecutedClassification } from 'vs/base/common/actions'; import { Mode, IEntryRunContext, IAutoFocus, IModel, IQuickNavigateConfiguration } from 'vs/base/parts/quickopen/common/quickOpen'; import { QuickOpenEntryGroup, IHighlight, QuickOpenModel, QuickOpenEntry } from 'vs/base/parts/quickopen/browser/quickOpenModel'; import { IMenuService, MenuId, MenuItemAction } from 'vs/platform/actions/common/actions'; @@ -297,7 +297,7 @@ abstract class BaseCommandEntry extends QuickOpenEntryGroup { setTimeout(async () => { if (action && (!(action instanceof Action) || action.enabled)) { try { - this.telemetryService.publicLog2('workbenchActionExecuted', { id: action.id, from: 'quick open' }); + this.telemetryService.publicLog2('workbenchActionExecuted', { id: action.id, from: 'quick open' }); const promise = action.run(); if (promise) { diff --git a/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts b/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts index 37218b7f241..64a9afe8fe8 100644 --- a/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts +++ b/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts @@ -17,7 +17,7 @@ import { IWindowService, IURIToOpen } from 'vs/platform/windows/common/windows'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; import { localize } from 'vs/nls'; -import { Action, WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; +import { Action, WorkbenchActionExecutedEvent, WorkbenchActionExecutedClassification } from 'vs/base/common/actions'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { Schemas } from 'vs/base/common/network'; import { IBackupFileService } from 'vs/workbench/services/backup/common/backup'; @@ -360,7 +360,7 @@ class WelcomePage extends Disposable { a.setAttribute('aria-label', localize('welcomePage.openFolderWithPath', "Open folder {0} with path {1}", name, parentPath)); a.href = 'javascript:void(0)'; a.addEventListener('click', e => { - this.telemetryService.publicLog2('workbenchActionExecuted', { + this.telemetryService.publicLog2('workbenchActionExecuted', { id: 'openRecentFolder', from: telemetryFrom }); diff --git a/src/vs/workbench/services/contextmenu/electron-browser/contextmenuService.ts b/src/vs/workbench/services/contextmenu/electron-browser/contextmenuService.ts index d06480d2b43..f0a715d5868 100644 --- a/src/vs/workbench/services/contextmenu/electron-browser/contextmenuService.ts +++ b/src/vs/workbench/services/contextmenu/electron-browser/contextmenuService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IAction, IActionRunner, ActionRunner, WBActionExecutedEvent, WBActionExecutedClassification } from 'vs/base/common/actions'; +import { IAction, IActionRunner, ActionRunner, WorkbenchActionExecutedEvent, WorkbenchActionExecutedClassification } from 'vs/base/common/actions'; import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; import * as dom from 'vs/base/browser/dom'; import { IContextMenuService, IContextViewService } from 'vs/platform/contextview/browser/contextView'; @@ -173,7 +173,7 @@ class NativeContextMenuService extends Disposable implements IContextMenuService } private async runAction(actionRunner: IActionRunner, actionToRun: IAction, delegate: IContextMenuDelegate, event: IContextMenuEvent): Promise { - this.telemetryService.publicLog2('workbenchActionExecuted', { id: actionToRun.id, from: 'contextMenu' }); + this.telemetryService.publicLog2('workbenchActionExecuted', { id: actionToRun.id, from: 'contextMenu' }); const context = delegate.getActionsContext ? delegate.getActionsContext(event) : event; From df55d2d93922eace424d83db6e2389f76b3ab1cf Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 3 Jul 2019 10:18:45 -0700 Subject: [PATCH 1014/1449] Fix test compile error from suppressImplicitAnyIndexErrors change --- .../contrib/debug/test/browser/debugANSIHandling.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 9064ef14567..49ac374d427 100644 --- a/src/vs/workbench/contrib/debug/test/browser/debugANSIHandling.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/debugANSIHandling.test.ts @@ -29,7 +29,7 @@ suite('Debug - ANSI Handling', () => { const colors: { [id: string]: string; } = {}; for (let color in ansiColorMap) { - colors[color] = ansiColorMap[color].defaults.dark; + colors[color] = ansiColorMap[color].defaults.dark; } const testTheme = new TestTheme(colors); themeService = new TestThemeService(testTheme); From 9f86032f9124d714558cf8af794a4ba2c393f67d Mon Sep 17 00:00:00 2001 From: Haneef Mohammed Date: Wed, 3 Jul 2019 10:39:28 -0700 Subject: [PATCH 1015/1449] Dummy change in comment to restart checks --- src/vs/workbench/contrib/debug/browser/variablesView.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/debug/browser/variablesView.ts b/src/vs/workbench/contrib/debug/browser/variablesView.ts index b12ac70119b..c6ae5025f41 100644 --- a/src/vs/workbench/contrib/debug/browser/variablesView.ts +++ b/src/vs/workbench/contrib/debug/browser/variablesView.ts @@ -63,7 +63,7 @@ export class VariablesView extends ViewletPanel { this.savedViewState = undefined; } else { if (!stackFrame) { - // We have no stackFrame, save tree state before it is cleared + // We have no stackFrame; save tree state before it is cleared this.savedViewState = this.tree.getViewState(); } this.tree.updateChildren().then(() => { From b790b187f7939667584e29375ba4f4950a94b420 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 3 Jul 2019 10:51:25 -0700 Subject: [PATCH 1016/1449] xterm@3.15.0-beta67 Diff: https://github.com/xtermjs/xterm.js/compare/c55e938...f235d70 Changes: - Remove blankLine string Fixes #76044 --- package.json | 2 +- remote/package.json | 2 +- remote/yarn.lock | 8 ++++---- src/typings/xterm.d.ts | 5 ----- .../contrib/terminal/browser/terminalInstance.ts | 1 - yarn.lock | 8 ++++---- 6 files changed, 10 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index b134ab4db02..874ef709f92 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "vscode-ripgrep": "^1.3.1", "vscode-sqlite3": "4.0.8", "vscode-textmate": "^4.1.1", - "xterm": "3.15.0-beta66", + "xterm": "3.15.0-beta67", "xterm-addon-search": "0.2.0-beta2", "xterm-addon-web-links": "0.1.0-beta10", "yauzl": "^2.9.2", diff --git a/remote/package.json b/remote/package.json index 189b0f5e3f7..f6c663cb0ad 100644 --- a/remote/package.json +++ b/remote/package.json @@ -21,7 +21,7 @@ "vscode-proxy-agent": "0.4.0", "vscode-ripgrep": "^1.3.1", "vscode-textmate": "^4.1.1", - "xterm": "3.15.0-beta66", + "xterm": "3.15.0-beta67", "xterm-addon-search": "0.2.0-beta2", "xterm-addon-web-links": "0.1.0-beta10", "yauzl": "^2.9.2", diff --git a/remote/yarn.lock b/remote/yarn.lock index b1a68e9e0e3..288e1f3e2cb 100644 --- a/remote/yarn.lock +++ b/remote/yarn.lock @@ -1554,10 +1554,10 @@ xterm-addon-web-links@0.1.0-beta10: resolved "https://registry.yarnpkg.com/xterm-addon-web-links/-/xterm-addon-web-links-0.1.0-beta10.tgz#610fa9773a2a5ccd41c1c83ba0e2dd2c9eb66a23" integrity sha512-xfpjy0V6bB4BR44qIgZQPoCMVakxb65gMscPkHpO//QxvUxKzabV3dxOsIbeZRFkUGsWTFlvz2OoaBLoNtv5gg== -xterm@3.15.0-beta66: - version "3.15.0-beta66" - resolved "https://registry.yarnpkg.com/xterm/-/xterm-3.15.0-beta66.tgz#b3aa25f0d86f02820f7b2ab2bcab14b02e6aed61" - integrity sha512-2DiQI2S6qvBhul9CkGIV6Zd2QTpMqsVB32qf3P6cbDeJBRztHkqpeCWg3hnsP7EBCiUSWlbqs0/fKP6JaSP7aQ== +xterm@3.15.0-beta67: + version "3.15.0-beta67" + resolved "https://registry.yarnpkg.com/xterm/-/xterm-3.15.0-beta67.tgz#71973e174bdc08df620945eecd3f87912f1ac550" + integrity sha512-qLfo9GHVlu/IxgDI3vRGObWZM7UL4eLhMfjZhprx2aXNMpzmrOW6l3JDRsCjUWm93EoVavbULtnDhGSiTlKitQ== yauzl@^2.9.2: version "2.10.0" diff --git a/src/typings/xterm.d.ts b/src/typings/xterm.d.ts index 8b16ab82523..b41d12219a9 100644 --- a/src/typings/xterm.d.ts +++ b/src/typings/xterm.d.ts @@ -310,11 +310,6 @@ declare module 'xterm' { * The set of localizable strings. */ export interface ILocalizableStrings { - /** - * Announcement for a blank line when `screenReaderMode` is enabled. - */ - blankLine: string; - /** * The aria label for the underlying input textarea for the terminal. */ diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index 9cff1fd187d..8aac6afa72f 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -417,7 +417,6 @@ export class TerminalInstance implements ITerminalInstance { xtermConstructor = new Promise(async (resolve) => { const Terminal = await this._terminalInstanceService.getXtermConstructor(); // Localize strings - Terminal.strings.blankLine = nls.localize('terminal.integrated.a11yBlankLine', 'Blank line'); Terminal.strings.promptLabel = nls.localize('terminal.integrated.a11yPromptLabel', 'Terminal input'); Terminal.strings.tooMuchOutput = nls.localize('terminal.integrated.a11yTooMuchOutput', 'Too much output to announce, navigate to rows manually to read'); resolve(Terminal); diff --git a/yarn.lock b/yarn.lock index cc85dcfa0a7..494e9ff51ca 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9822,10 +9822,10 @@ xterm-addon-web-links@0.1.0-beta10: resolved "https://registry.yarnpkg.com/xterm-addon-web-links/-/xterm-addon-web-links-0.1.0-beta10.tgz#610fa9773a2a5ccd41c1c83ba0e2dd2c9eb66a23" integrity sha512-xfpjy0V6bB4BR44qIgZQPoCMVakxb65gMscPkHpO//QxvUxKzabV3dxOsIbeZRFkUGsWTFlvz2OoaBLoNtv5gg== -xterm@3.15.0-beta66: - version "3.15.0-beta66" - resolved "https://registry.yarnpkg.com/xterm/-/xterm-3.15.0-beta66.tgz#b3aa25f0d86f02820f7b2ab2bcab14b02e6aed61" - integrity sha512-2DiQI2S6qvBhul9CkGIV6Zd2QTpMqsVB32qf3P6cbDeJBRztHkqpeCWg3hnsP7EBCiUSWlbqs0/fKP6JaSP7aQ== +xterm@3.15.0-beta67: + version "3.15.0-beta67" + resolved "https://registry.yarnpkg.com/xterm/-/xterm-3.15.0-beta67.tgz#71973e174bdc08df620945eecd3f87912f1ac550" + integrity sha512-qLfo9GHVlu/IxgDI3vRGObWZM7UL4eLhMfjZhprx2aXNMpzmrOW6l3JDRsCjUWm93EoVavbULtnDhGSiTlKitQ== y18n@^3.2.1: version "3.2.1" From 5e82cb77807d813ecc9459970063864a756c5523 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 3 Jul 2019 10:56:37 -0700 Subject: [PATCH 1017/1449] Set COLORTERM env var to tell apps that we support truecolor Fixes #76352 --- src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts b/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts index 6ba23e4d400..db22a46964d 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts @@ -58,6 +58,7 @@ export function addTerminalEnvironmentKeys(env: platform.IProcessEnvironment, ve if (setLocaleVariables) { env['LANG'] = _getLangEnvVariable(locale); } + env['COLORTERM'] = 'truecolor'; } function mergeNonNullKeys(env: platform.IProcessEnvironment, other: ITerminalEnvironment | NodeJS.ProcessEnv | undefined) { From e935bea36b38676ed16f1a3be9d1a2907ab55752 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 3 Jul 2019 19:38:56 +0200 Subject: [PATCH 1018/1449] Move the TokensStore to the TextModel --- src/vs/editor/common/model/textModel.ts | 57 ++++--- src/vs/editor/common/model/textModelTokens.ts | 145 +++++++++--------- .../test/common/model/model.line.test.ts | 6 +- 3 files changed, 104 insertions(+), 104 deletions(-) diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index 4273d95645b..4ccc4db9c7c 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -23,9 +23,9 @@ import { IntervalNode, IntervalTree, getNodeIsInOverviewRuler, recomputeMaxEnd } import { PieceTreeTextBufferBuilder } from 'vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder'; import { IModelContentChangedEvent, IModelDecorationsChangedEvent, IModelLanguageChangedEvent, IModelLanguageConfigurationChangedEvent, IModelOptionsChangedEvent, IModelTokensChangedEvent, InternalModelContentChangeEvent, ModelRawChange, ModelRawContentChangedEvent, ModelRawEOLChanged, ModelRawFlush, ModelRawLineChanged, ModelRawLinesDeleted, ModelRawLinesInserted } from 'vs/editor/common/model/textModelEvents'; import { SearchData, SearchParams, TextModelSearch } from 'vs/editor/common/model/textModelSearch'; -import { ModelLinesTokens, ModelTokensChangedEventBuilder, IModelLinesTokens } from 'vs/editor/common/model/textModelTokens'; +import { ModelLinesTokens, ModelTokensChangedEventBuilder, IModelLinesTokens, TokensStore } from 'vs/editor/common/model/textModelTokens'; import { getWordAtText } from 'vs/editor/common/model/wordHelper'; -import { LanguageId, LanguageIdentifier, TokenizationRegistry, FormattingOptions } from 'vs/editor/common/modes'; +import { LanguageId, LanguageIdentifier, TokenizationRegistry, FormattingOptions, IState } from 'vs/editor/common/modes'; import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; import { NULL_LANGUAGE_IDENTIFIER } from 'vs/editor/common/modes/nullMode'; import { ignoreBracketsInToken } from 'vs/editor/common/modes/supports'; @@ -34,8 +34,6 @@ import { ITheme, ThemeColor } from 'vs/platform/theme/common/themeService'; import { withUndefinedAsNull } from 'vs/base/common/types'; import { VSBufferReadableStream, VSBuffer } from 'vs/base/common/buffer'; -const CHEAP_TOKENIZATION_LENGTH_LIMIT = 2048; - function createTextBufferBuilder() { return new PieceTreeTextBufferBuilder(); } @@ -287,7 +285,8 @@ export class TextModel extends Disposable implements model.ITextModel { private readonly _tokenizationListener: IDisposable; private readonly _languageRegistryListener: IDisposable; private _revalidateTokensTimeout: any; - /*private*/_tokens: IModelLinesTokens; + private _tokenization: IModelLinesTokens; + /*private*/_tokens: TokensStore; //#endregion constructor(source: string | model.ITextBufferFactory, creationOptions: model.ITextModelCreationOptions, languageIdentifier: LanguageIdentifier | null, associatedResource: URI | null = null) { @@ -531,7 +530,17 @@ export class TextModel extends Disposable implements model.ITextModel { ? null : TokenizationRegistry.get(this._languageIdentifier.language) ); - this._tokens = new ModelLinesTokens(this._languageIdentifier, tokenizationSupport); + let initialState: IState | null = null; + if (tokenizationSupport) { + try { + initialState = tokenizationSupport.getInitialState(); + } catch (e) { + onUnexpectedError(e); + tokenizationSupport = null; + } + } + this._tokenization = new ModelLinesTokens(this._languageIdentifier, tokenizationSupport); + this._tokens = new TokensStore(initialState); this._beginBackgroundTokenization(); } @@ -1342,10 +1351,10 @@ export class TextModel extends Disposable implements model.ITextModel { const change = contentChanges[i]; const [eolCount, firstLineLength] = TextModel._eolCount(change.text); try { - this._tokens.store.applyEdits(change.range, eolCount, firstLineLength); + this._tokens.applyEdits(change.range, eolCount, firstLineLength); } catch (err) { // emergency recovery => reset tokens - this._tokens = new ModelLinesTokens(this._languageIdentifier, this._tokens.tokenizationSupport); + this._tokens.reset(); } this._onDidChangeDecorations.fire(); this._decorationsTree.acceptReplace(change.rangeOffset, change.rangeLength, change.text.length, change.forceMoveMarkers); @@ -1407,7 +1416,7 @@ export class TextModel extends Disposable implements model.ITextModel { ); } - if (this._tokens.hasLinesToTokenize(this._buffer)) { + if (this._tokenization.hasLinesToTokenize(this._tokens, this._buffer)) { this._beginBackgroundTokenization(); } @@ -1780,7 +1789,7 @@ export class TextModel extends Disposable implements model.ITextModel { endLineNumber = Math.min(this.getLineCount(), endLineNumber); const eventBuilder = new ModelTokensChangedEventBuilder(); - this._tokens.tokenizeViewport(this._buffer, eventBuilder, startLineNumber, endLineNumber); + this._tokenization.tokenizeViewport(this._tokens, this._buffer, eventBuilder, startLineNumber, endLineNumber); const e = eventBuilder.build(); if (e) { @@ -1806,7 +1815,7 @@ export class TextModel extends Disposable implements model.ITextModel { const eventBuilder = new ModelTokensChangedEventBuilder(); - this._tokens.updateTokensUntilLine(this._buffer, eventBuilder, lineNumber); + this._tokenization.updateTokensUntilLine(this._tokens, this._buffer, eventBuilder, lineNumber); const e = eventBuilder.build(); if (e) { @@ -1815,19 +1824,7 @@ export class TextModel extends Disposable implements model.ITextModel { } public isCheapToTokenize(lineNumber: number): boolean { - if (!this._tokens.isCheapToTokenize(lineNumber)) { - return false; - } - - if (lineNumber < this._tokens.invalidLineStartIndex + 1) { - return true; - } - - if (this.getLineLength(lineNumber) < CHEAP_TOKENIZATION_LENGTH_LIMIT) { - return true; - } - - return false; + return this._tokenization.isCheapToTokenize(this._tokens, this._buffer, lineNumber); } public tokenizeIfCheap(lineNumber: number): void { @@ -1846,7 +1843,7 @@ export class TextModel extends Disposable implements model.ITextModel { private _getLineTokens(lineNumber: number): LineTokens { const lineText = this._buffer.getLineContent(lineNumber); - return this._tokens.store.getTokens(this._languageIdentifier.id, lineNumber - 1, lineText); + return this._tokens.getTokens(this._languageIdentifier.id, lineNumber - 1, lineText); } public getLanguageIdentifier(): LanguageIdentifier { @@ -1885,7 +1882,7 @@ export class TextModel extends Disposable implements model.ITextModel { } public getLanguageIdAtPosition(_lineNumber: number, _column: number): LanguageId { - if (!this._tokens.tokenizationSupport) { + if (!this._tokenization.tokenizationSupport) { return this._languageIdentifier.id; } let { lineNumber, column } = this.validatePosition({ lineNumber: _lineNumber, column: _column }); @@ -1908,7 +1905,7 @@ export class TextModel extends Disposable implements model.ITextModel { const maxLineNumber = Math.min(100, this.getLineCount()); this._revalidateTokensNow(maxLineNumber); - if (this._tokens.hasLinesToTokenize(this._buffer)) { + if (this._tokenization.hasLinesToTokenize(this._tokens, this._buffer)) { this._beginBackgroundTokenization(); } } @@ -1918,20 +1915,20 @@ export class TextModel extends Disposable implements model.ITextModel { const eventBuilder = new ModelTokensChangedEventBuilder(); const sw = StopWatch.create(false); - while (this._tokens.hasLinesToTokenize(this._buffer)) { + while (this._tokenization.hasLinesToTokenize(this._tokens, this._buffer)) { if (sw.elapsed() > MAX_ALLOWED_TIME) { // Stop if MAX_ALLOWED_TIME is reached break; } - const tokenizedLineNumber = this._tokens.tokenizeOneInvalidLine(this._buffer, eventBuilder); + const tokenizedLineNumber = this._tokenization.tokenizeOneInvalidLine(this._tokens, this._buffer, eventBuilder); if (tokenizedLineNumber >= toLineNumber) { break; } } - if (this._tokens.hasLinesToTokenize(this._buffer)) { + if (this._tokenization.hasLinesToTokenize(this._tokens, this._buffer)) { this._beginBackgroundTokenization(); } diff --git a/src/vs/editor/common/model/textModelTokens.ts b/src/vs/editor/common/model/textModelTokens.ts index eaa45a33d4b..7c2a0b2cc19 100644 --- a/src/vs/editor/common/model/textModelTokens.ts +++ b/src/vs/editor/common/model/textModelTokens.ts @@ -26,6 +26,10 @@ function getDefaultMetadata(topLevelLanguageId: LanguageId): number { const EMPTY_LINE_TOKENS = (new Uint32Array(0)).buffer; +const enum Constants { + CHEAP_TOKENIZATION_LENGTH_LIMIT = 2048 +} + class ModelLineTokens { _state: IState | null; _lineTokens: ArrayBuffer | null; @@ -165,12 +169,20 @@ class ModelLineTokens { } } -class TokensStore { +export class TokensStore { private _tokens: ModelLineTokens[]; _invalidLineStartIndex: number; _lastState: IState | null; constructor(initialState: IState | null) { + this._reset(initialState); + } + + public reset(): void { + this._reset(this.getState(0)); + } + + private _reset(initialState: IState | null): void { this._tokens = []; this._invalidLineStartIndex = 0; this._lastState = null; @@ -386,73 +398,83 @@ class TokensStore { } //#endregion + + _getAllStates(linesLength: number): (IState | null)[] { + const r: (IState | null)[] = []; + for (let i = 0; i < linesLength; i++) { + r[i] = this.getState(i); + } + r[linesLength] = this._lastState; + return r; + } + + _getAllInvalid(linesLength: number): number[] { + const r: number[] = []; + for (let i = 0; i < linesLength; i++) { + if (this.isInvalid(i)) { + r.push(i); + } + } + return r; + } } export interface IModelLinesTokens { readonly tokenizationSupport: ITokenizationSupport | null; - readonly store: TokensStore; - readonly invalidLineStartIndex: number; - isCheapToTokenize(lineNumber: number): boolean; - hasLinesToTokenize(buffer: ITextBuffer): boolean; + isCheapToTokenize(store: TokensStore, buffer: ITextBuffer, lineNumber: number): boolean; + hasLinesToTokenize(store: TokensStore, buffer: ITextBuffer): boolean; - tokenizeOneInvalidLine(buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder): number; - updateTokensUntilLine(buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, lineNumber: number): void; - tokenizeViewport(buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, startLineNumber: number, endLineNumber: number): void; - - _getAllStates(linesLength: number): (IState | null)[]; - _getAllInvalid(linesLength: number): number[]; + tokenizeOneInvalidLine(store: TokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder): number; + updateTokensUntilLine(store: TokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, lineNumber: number): void; + tokenizeViewport(store: TokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, startLineNumber: number, endLineNumber: number): void; } export class ModelLinesTokens implements IModelLinesTokens { private readonly _languageIdentifier: LanguageIdentifier; public readonly tokenizationSupport: ITokenizationSupport | null; - public readonly store: TokensStore; - - public get invalidLineStartIndex() { - return this.store.invalidLineStartIndex; - } constructor(languageIdentifier: LanguageIdentifier, tokenizationSupport: ITokenizationSupport | null) { this._languageIdentifier = languageIdentifier; this.tokenizationSupport = tokenizationSupport; + } - let initialState: IState | null = null; - if (this.tokenizationSupport) { - try { - initialState = this.tokenizationSupport.getInitialState(); - } catch (e) { - onUnexpectedError(e); - this.tokenizationSupport = null; - } + public isCheapToTokenize(store: TokensStore, buffer: ITextBuffer, lineNumber: number): boolean { + const firstInvalidLineNumber = store.invalidLineStartIndex + 1; + if (lineNumber > firstInvalidLineNumber) { + return false; } - this.store = new TokensStore(initialState); + + if (lineNumber < firstInvalidLineNumber) { + return true; + } + + if (buffer.getLineLength(lineNumber) < Constants.CHEAP_TOKENIZATION_LENGTH_LIMIT) { + return true; + } + + return false; } - public isCheapToTokenize(lineNumber: number): boolean { - const firstInvalidLineNumber = this.store.invalidLineStartIndex + 1; - return (firstInvalidLineNumber >= lineNumber); - } - - public hasLinesToTokenize(buffer: ITextBuffer): boolean { - return (this.store.invalidLineStartIndex < buffer.getLineCount()); + public hasLinesToTokenize(store: TokensStore, buffer: ITextBuffer): boolean { + return (store.invalidLineStartIndex < buffer.getLineCount()); } //#region Tokenization - public tokenizeOneInvalidLine(buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder): number { - if (!this.hasLinesToTokenize(buffer)) { + public tokenizeOneInvalidLine(store: TokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder): number { + if (!this.hasLinesToTokenize(store, buffer)) { return buffer.getLineCount() + 1; } - const lineNumber = this.store.invalidLineStartIndex + 1; - this.updateTokensUntilLine(buffer, eventBuilder, lineNumber); + const lineNumber = store.invalidLineStartIndex + 1; + this.updateTokensUntilLine(store, buffer, eventBuilder, lineNumber); return lineNumber; } - public updateTokensUntilLine(buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, lineNumber: number): void { + public updateTokensUntilLine(store: TokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, lineNumber: number): void { if (!this.tokenizationSupport) { - this.store._invalidLineStartIndex = buffer.getLineCount(); + store._invalidLineStartIndex = buffer.getLineCount(); return; } @@ -460,31 +482,31 @@ export class ModelLinesTokens implements IModelLinesTokens { const endLineIndex = lineNumber - 1; // Validate all states up to and including endLineIndex - for (let lineIndex = this.store.invalidLineStartIndex; lineIndex <= endLineIndex; lineIndex++) { + for (let lineIndex = store.invalidLineStartIndex; lineIndex <= endLineIndex; lineIndex++) { const text = buffer.getLineContent(lineIndex + 1); - const lineStartState = this.store.getState(lineIndex); + const lineStartState = store.getState(lineIndex); const r = safeTokenize(this._languageIdentifier, this.tokenizationSupport, text, lineStartState!); - this.store.setGoodTokens(this._languageIdentifier.id, linesLength, lineIndex, text, r); + store.setGoodTokens(this._languageIdentifier.id, linesLength, lineIndex, text, r); eventBuilder.registerChangedTokens(lineIndex + 1); - lineIndex = this.store.invalidLineStartIndex - 1; // -1 because the outer loop increments it + lineIndex = store.invalidLineStartIndex - 1; // -1 because the outer loop increments it } } - public tokenizeViewport(buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, startLineNumber: number, endLineNumber: number): void { + public tokenizeViewport(store: TokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, startLineNumber: number, endLineNumber: number): void { if (!this.tokenizationSupport) { // nothing to do return; } - if (endLineNumber <= this.invalidLineStartIndex) { + if (endLineNumber <= store.invalidLineStartIndex) { // nothing to do return; } - if (startLineNumber <= this.invalidLineStartIndex) { + if (startLineNumber <= store.invalidLineStartIndex) { // tokenization has reached the viewport start... - this.updateTokensUntilLine(buffer, eventBuilder, endLineNumber); + this.updateTokensUntilLine(store, buffer, eventBuilder, endLineNumber); return; } @@ -499,7 +521,7 @@ export class ModelLinesTokens implements IModelLinesTokens { } if (newNonWhitespaceIndex < nonWhitespaceColumn) { - initialState = this.store.getState(i - 1); + initialState = store.getState(i - 1); if (initialState) { break; } @@ -522,10 +544,10 @@ export class ModelLinesTokens implements IModelLinesTokens { } } - this._fakeTokenizeLines(buffer, eventBuilder, state, startLineNumber, endLineNumber); + this._fakeTokenizeLines(store, buffer, eventBuilder, state, startLineNumber, endLineNumber); } - private _fakeTokenizeLines(buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, initialState: IState, startLineNumber: number, endLineNumber: number): void { + private _fakeTokenizeLines(store: TokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, initialState: IState, startLineNumber: number, endLineNumber: number): void { if (!this.tokenizationSupport) { return; } @@ -535,12 +557,12 @@ export class ModelLinesTokens implements IModelLinesTokens { let text = buffer.getLineContent(i); let r = safeTokenize(this._languageIdentifier, this.tokenizationSupport, text, state); if (r) { - this.store.setTokens(this._languageIdentifier.id, i - 1, text.length, r.tokens); + store.setTokens(this._languageIdentifier.id, i - 1, text.length, r.tokens); // We cannot trust these states/tokens to be valid! // (see https://github.com/Microsoft/vscode/issues/67607) - this.store.invalidateLine(i - 1); - this.store.setState(i - 1, state); + store.invalidateLine(i - 1); + store.setState(i - 1, state); state = r.endState; eventBuilder.registerChangedTokens(i); } else { @@ -550,25 +572,6 @@ export class ModelLinesTokens implements IModelLinesTokens { } // #endregion - - _getAllStates(linesLength: number): (IState | null)[] { - const r: (IState | null)[] = []; - for (let i = 0; i < linesLength; i++) { - r[i] = this.store.getState(i); - } - r[linesLength] = this.store._lastState; - return r; - } - - _getAllInvalid(linesLength: number): number[] { - const r: number[] = []; - for (let i = 0; i < linesLength; i++) { - if (this.store.isInvalid(i)) { - r.push(i); - } - } - return r; - } } function safeTokenize(languageIdentifier: LanguageIdentifier, tokenizationSupport: ITokenizationSupport | null, text: string, state: IState): TokenizationResult2 { diff --git a/src/vs/editor/test/common/model/model.line.test.ts b/src/vs/editor/test/common/model/model.line.test.ts index 4c65dc30d48..3c00d5a72b3 100644 --- a/src/vs/editor/test/common/model/model.line.test.ts +++ b/src/vs/editor/test/common/model/model.line.test.ts @@ -110,7 +110,7 @@ suite('ModelLinesTokens', () => { for (let lineIndex = 0; lineIndex < initial.length; lineIndex++) { const lineTokens = initial[lineIndex].tokens; const lineTextLength = model.getLineMaxColumn(lineIndex + 1) - 1; - model._tokens.store.setTokens(0, lineIndex, lineTextLength, TestToken.toTokens(lineTokens)); + model._tokens.setTokens(0, lineIndex, lineTextLength, TestToken.toTokens(lineTokens)); } model.applyEdits(edits.map((ed) => ({ @@ -441,14 +441,14 @@ suite('ModelLinesTokens', () => { test('insertion on empty line', () => { const model = new TextModel('some text', TextModel.DEFAULT_CREATION_OPTIONS, new LanguageIdentifier('test', 0)); - model._tokens.store.setTokens(0, 0, model.getLineMaxColumn(1) - 1, TestToken.toTokens([new TestToken(0, 1)])); + model._tokens.setTokens(0, 0, model.getLineMaxColumn(1) - 1, TestToken.toTokens([new TestToken(0, 1)])); model.applyEdits([{ range: new Range(1, 1, 1, 10), text: '' }]); - model._tokens.store.setTokens(0, 0, model.getLineMaxColumn(1) - 1, new Uint32Array(0)); + model._tokens.setTokens(0, 0, model.getLineMaxColumn(1) - 1, new Uint32Array(0)); model.applyEdits([{ range: new Range(1, 1, 1, 1), From 7129a531b71231e21318934ddd4b30c7bc59979b Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 3 Jul 2019 19:45:07 +0200 Subject: [PATCH 1019/1449] Introduce ITokensStore --- src/vs/editor/common/model/textModel.ts | 11 +-- src/vs/editor/common/model/textModelTokens.ts | 67 ++++++++++++------- 2 files changed, 45 insertions(+), 33 deletions(-) diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index 4ccc4db9c7c..1fc21244598 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -23,7 +23,7 @@ import { IntervalNode, IntervalTree, getNodeIsInOverviewRuler, recomputeMaxEnd } import { PieceTreeTextBufferBuilder } from 'vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder'; import { IModelContentChangedEvent, IModelDecorationsChangedEvent, IModelLanguageChangedEvent, IModelLanguageConfigurationChangedEvent, IModelOptionsChangedEvent, IModelTokensChangedEvent, InternalModelContentChangeEvent, ModelRawChange, ModelRawContentChangedEvent, ModelRawEOLChanged, ModelRawFlush, ModelRawLineChanged, ModelRawLinesDeleted, ModelRawLinesInserted } from 'vs/editor/common/model/textModelEvents'; import { SearchData, SearchParams, TextModelSearch } from 'vs/editor/common/model/textModelSearch'; -import { ModelLinesTokens, ModelTokensChangedEventBuilder, IModelLinesTokens, TokensStore } from 'vs/editor/common/model/textModelTokens'; +import { ModelLinesTokens, ModelTokensChangedEventBuilder, IModelLinesTokens, TokensStore, ITokensStore } from 'vs/editor/common/model/textModelTokens'; import { getWordAtText } from 'vs/editor/common/model/wordHelper'; import { LanguageId, LanguageIdentifier, TokenizationRegistry, FormattingOptions, IState } from 'vs/editor/common/modes'; import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; @@ -286,7 +286,7 @@ export class TextModel extends Disposable implements model.ITextModel { private readonly _languageRegistryListener: IDisposable; private _revalidateTokensTimeout: any; private _tokenization: IModelLinesTokens; - /*private*/_tokens: TokensStore; + /*private*/_tokens: ITokensStore; //#endregion constructor(source: string | model.ITextBufferFactory, creationOptions: model.ITextModelCreationOptions, languageIdentifier: LanguageIdentifier | null, associatedResource: URI | null = null) { @@ -1350,12 +1350,7 @@ export class TextModel extends Disposable implements model.ITextModel { for (let i = 0, len = contentChanges.length; i < len; i++) { const change = contentChanges[i]; const [eolCount, firstLineLength] = TextModel._eolCount(change.text); - try { - this._tokens.applyEdits(change.range, eolCount, firstLineLength); - } catch (err) { - // emergency recovery => reset tokens - this._tokens.reset(); - } + this._tokens.applyEdits(change.range, eolCount, firstLineLength); this._onDidChangeDecorations.fire(); this._decorationsTree.acceptReplace(change.rangeOffset, change.rangeLength, change.text.length, change.forceMoveMarkers); diff --git a/src/vs/editor/common/model/textModelTokens.ts b/src/vs/editor/common/model/textModelTokens.ts index 7c2a0b2cc19..e9b6624cbc9 100644 --- a/src/vs/editor/common/model/textModelTokens.ts +++ b/src/vs/editor/common/model/textModelTokens.ts @@ -169,19 +169,32 @@ class ModelLineTokens { } } -export class TokensStore { +export interface ITokensStore { + _invalidLineStartIndex: number; + readonly invalidLineStartIndex: number; + + getTokens(topLevelLanguageId: LanguageId, lineIndex: number, lineText: string): LineTokens; + invalidateLine(lineIndex: number): void; + isInvalid(lineIndex: number): boolean; + getState(lineIndex: number): IState | null; + setTokens(topLevelLanguageId: LanguageId, lineIndex: number, lineTextLength: number, tokens: Uint32Array): void; + setGoodTokens(topLevelLanguageId: LanguageId, linesLength: number, lineIndex: number, text: string, r: TokenizationResult2): void; + setState(lineIndex: number, state: IState): void; + applyEdits(range: Range, eolCount: number, firstLineLength: number): void; + + _getAllStates(linesLength: number): (IState | null)[]; + _getAllInvalid(linesLength: number): number[]; +} + +export class TokensStore implements ITokensStore { private _tokens: ModelLineTokens[]; _invalidLineStartIndex: number; - _lastState: IState | null; + private _lastState: IState | null; constructor(initialState: IState | null) { this._reset(initialState); } - public reset(): void { - this._reset(this.getState(0)); - } - private _reset(initialState: IState | null): void { this._tokens = []; this._invalidLineStartIndex = 0; @@ -320,17 +333,21 @@ export class TokensStore { //#region Editing public applyEdits(range: Range, eolCount: number, firstLineLength: number): void { + try { + const deletingLinesCnt = range.endLineNumber - range.startLineNumber; + const insertingLinesCnt = eolCount; + const editingLinesCnt = Math.min(deletingLinesCnt, insertingLinesCnt); - const deletingLinesCnt = range.endLineNumber - range.startLineNumber; - const insertingLinesCnt = eolCount; - const editingLinesCnt = Math.min(deletingLinesCnt, insertingLinesCnt); + for (let j = editingLinesCnt; j >= 0; j--) { + this.invalidateLine(range.startLineNumber + j - 1); + } - for (let j = editingLinesCnt; j >= 0; j--) { - this.invalidateLine(range.startLineNumber + j - 1); + this._acceptDeleteRange(range); + this._acceptInsertText(new Position(range.startLineNumber, range.startColumn), eolCount, firstLineLength); + } catch (err) { + // emergency recovery => reset tokens + this._reset(this.getState(0)); } - - this._acceptDeleteRange(range); - this._acceptInsertText(new Position(range.startLineNumber, range.startColumn), eolCount, firstLineLength); } private _acceptDeleteRange(range: Range): void { @@ -422,12 +439,12 @@ export class TokensStore { export interface IModelLinesTokens { readonly tokenizationSupport: ITokenizationSupport | null; - isCheapToTokenize(store: TokensStore, buffer: ITextBuffer, lineNumber: number): boolean; - hasLinesToTokenize(store: TokensStore, buffer: ITextBuffer): boolean; + isCheapToTokenize(store: ITokensStore, buffer: ITextBuffer, lineNumber: number): boolean; + hasLinesToTokenize(store: ITokensStore, buffer: ITextBuffer): boolean; - tokenizeOneInvalidLine(store: TokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder): number; - updateTokensUntilLine(store: TokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, lineNumber: number): void; - tokenizeViewport(store: TokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, startLineNumber: number, endLineNumber: number): void; + tokenizeOneInvalidLine(store: ITokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder): number; + updateTokensUntilLine(store: ITokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, lineNumber: number): void; + tokenizeViewport(store: ITokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, startLineNumber: number, endLineNumber: number): void; } export class ModelLinesTokens implements IModelLinesTokens { @@ -440,7 +457,7 @@ export class ModelLinesTokens implements IModelLinesTokens { this.tokenizationSupport = tokenizationSupport; } - public isCheapToTokenize(store: TokensStore, buffer: ITextBuffer, lineNumber: number): boolean { + public isCheapToTokenize(store: ITokensStore, buffer: ITextBuffer, lineNumber: number): boolean { const firstInvalidLineNumber = store.invalidLineStartIndex + 1; if (lineNumber > firstInvalidLineNumber) { return false; @@ -457,13 +474,13 @@ export class ModelLinesTokens implements IModelLinesTokens { return false; } - public hasLinesToTokenize(store: TokensStore, buffer: ITextBuffer): boolean { + public hasLinesToTokenize(store: ITokensStore, buffer: ITextBuffer): boolean { return (store.invalidLineStartIndex < buffer.getLineCount()); } //#region Tokenization - public tokenizeOneInvalidLine(store: TokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder): number { + public tokenizeOneInvalidLine(store: ITokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder): number { if (!this.hasLinesToTokenize(store, buffer)) { return buffer.getLineCount() + 1; } @@ -472,7 +489,7 @@ export class ModelLinesTokens implements IModelLinesTokens { return lineNumber; } - public updateTokensUntilLine(store: TokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, lineNumber: number): void { + public updateTokensUntilLine(store: ITokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, lineNumber: number): void { if (!this.tokenizationSupport) { store._invalidLineStartIndex = buffer.getLineCount(); return; @@ -493,7 +510,7 @@ export class ModelLinesTokens implements IModelLinesTokens { } } - public tokenizeViewport(store: TokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, startLineNumber: number, endLineNumber: number): void { + public tokenizeViewport(store: ITokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, startLineNumber: number, endLineNumber: number): void { if (!this.tokenizationSupport) { // nothing to do return; @@ -547,7 +564,7 @@ export class ModelLinesTokens implements IModelLinesTokens { this._fakeTokenizeLines(store, buffer, eventBuilder, state, startLineNumber, endLineNumber); } - private _fakeTokenizeLines(store: TokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, initialState: IState, startLineNumber: number, endLineNumber: number): void { + private _fakeTokenizeLines(store: ITokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, initialState: IState, startLineNumber: number, endLineNumber: number): void { if (!this.tokenizationSupport) { return; } From ab430685dbff4905038d1a6dc5ccf13113c4cb29 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 3 Jul 2019 20:04:18 +0200 Subject: [PATCH 1020/1449] Refactor invalid to valid --- src/vs/editor/common/model/textModelTokens.ts | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/vs/editor/common/model/textModelTokens.ts b/src/vs/editor/common/model/textModelTokens.ts index e9b6624cbc9..7190c5e63b5 100644 --- a/src/vs/editor/common/model/textModelTokens.ts +++ b/src/vs/editor/common/model/textModelTokens.ts @@ -33,12 +33,12 @@ const enum Constants { class ModelLineTokens { _state: IState | null; _lineTokens: ArrayBuffer | null; - _invalid: boolean; + _valid: boolean; constructor(state: IState | null) { this._state = state; this._lineTokens = null; - this._invalid = true; + this._valid = false; } public deleteBeginning(toChIndex: number): void { @@ -175,7 +175,6 @@ export interface ITokensStore { getTokens(topLevelLanguageId: LanguageId, lineIndex: number, lineText: string): LineTokens; invalidateLine(lineIndex: number): void; - isInvalid(lineIndex: number): boolean; getState(lineIndex: number): IState | null; setTokens(topLevelLanguageId: LanguageId, lineIndex: number, lineTextLength: number, tokens: Uint32Array): void; setGoodTokens(topLevelLanguageId: LanguageId, linesLength: number, lineIndex: number, text: string, r: TokenizationResult2): void; @@ -226,24 +225,24 @@ export class TokensStore implements ITokensStore { } public invalidateLine(lineIndex: number): void { - this._setIsInvalid(lineIndex, true); + this._setIsValid(lineIndex, false); if (lineIndex < this._invalidLineStartIndex) { - this._setIsInvalid(this._invalidLineStartIndex, true); + this._setIsValid(this._invalidLineStartIndex, false); this._invalidLineStartIndex = lineIndex; } } - private _setIsInvalid(lineIndex: number, invalid: boolean): void { + private _setIsValid(lineIndex: number, valid: boolean): void { if (lineIndex < this._tokens.length && this._tokens[lineIndex]) { - this._tokens[lineIndex]._invalid = invalid; + this._tokens[lineIndex]._valid = valid; } } - public isInvalid(lineIndex: number): boolean { + private _isValid(lineIndex: number): boolean { if (lineIndex < this._tokens.length && this._tokens[lineIndex]) { - return this._tokens[lineIndex]._invalid; + return this._tokens[lineIndex]._valid; } - return true; + return false; } public getState(lineIndex: number): IState | null { @@ -288,7 +287,7 @@ export class TokensStore implements ITokensStore { public setGoodTokens(topLevelLanguageId: LanguageId, linesLength: number, lineIndex: number, text: string, r: TokenizationResult2): void { const endStateIndex = lineIndex + 1; this.setTokens(topLevelLanguageId, lineIndex, text.length, r.tokens); - this._setIsInvalid(lineIndex, false); + this._setIsValid(lineIndex, true); if (endStateIndex < linesLength) { const previousEndState = this.getState(endStateIndex); @@ -296,7 +295,7 @@ export class TokensStore implements ITokensStore { // The end state of this line remains the same let nextInvalidLineIndex = lineIndex + 1; while (nextInvalidLineIndex < linesLength) { - if (this.isInvalid(nextInvalidLineIndex)) { + if (!this._isValid(nextInvalidLineIndex)) { break; } if (nextInvalidLineIndex + 1 < linesLength) { @@ -428,7 +427,7 @@ export class TokensStore implements ITokensStore { _getAllInvalid(linesLength: number): number[] { const r: number[] = []; for (let i = 0; i < linesLength; i++) { - if (this.isInvalid(i)) { + if (!this._isValid(i)) { r.push(i); } } From 7e4200a0cf12f3c46f9a52fd0a565bf9161633d3 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Wed, 3 Jul 2019 11:14:27 -0700 Subject: [PATCH 1021/1449] Fix #76525, round out badges in search and panel --- src/vs/base/browser/ui/countBadge/countBadge.css | 11 ++++++----- .../workbench/browser/parts/panel/media/panelpart.css | 10 ++++++---- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/vs/base/browser/ui/countBadge/countBadge.css b/src/vs/base/browser/ui/countBadge/countBadge.css index 7429322f3e6..6660da0d461 100644 --- a/src/vs/base/browser/ui/countBadge/countBadge.css +++ b/src/vs/base/browser/ui/countBadge/countBadge.css @@ -4,11 +4,12 @@ *--------------------------------------------------------------------------------------------*/ .monaco-count-badge { - padding: 0.3em 0.5em; - border-radius: 1em; - font-size: 85%; - min-width: 1.6em; - line-height: 1em; + padding: 4px 5px; + border-radius: 11px; + font-size: 11px; + min-width: 19px; + min-height: 19px; + line-height: 11px; font-weight: normal; text-align: center; display: inline-block; diff --git a/src/vs/workbench/browser/parts/panel/media/panelpart.css b/src/vs/workbench/browser/parts/panel/media/panelpart.css index d73a1526f7f..388db443314 100644 --- a/src/vs/workbench/browser/parts/panel/media/panelpart.css +++ b/src/vs/workbench/browser/parts/panel/media/panelpart.css @@ -93,13 +93,15 @@ } .monaco-workbench .part.panel > .title > .panel-switcher-container > .monaco-action-bar .badge .badge-content { - padding: 0.3em 0.5em; - border-radius: 1em; + padding: 4px 5px; + border-radius: 11px; + font-size: 11px; + min-width: 19px; + min-height: 19px; + line-height: 11px; font-weight: normal; text-align: center; display: inline-block; - min-width: 1.6em; - line-height: 1em; box-sizing: border-box; } From 0722dc5c0ec67bf1c91519c36fb82d0164dce54d Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 2 Jul 2019 17:41:38 -0700 Subject: [PATCH 1022/1449] Error if we try to perform an operation on an unknown editor inset --- .../api/browser/mainThreadCodeInsets.ts | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadCodeInsets.ts b/src/vs/workbench/api/browser/mainThreadCodeInsets.ts index e06a5dc3ea9..2044af5567f 100644 --- a/src/vs/workbench/api/browser/mainThreadCodeInsets.ts +++ b/src/vs/workbench/api/browser/mainThreadCodeInsets.ts @@ -117,34 +117,35 @@ export class MainThreadEditorInsets implements MainThreadEditorInsetsShape { } $disposeEditorInset(handle: number): void { - const inset = this._insets.get(handle); - if (inset) { - this._insets.delete(handle); - inset.dispose(); - } + const inset = this.getInset(handle); + this._insets.delete(handle); + inset.dispose(); + } $setHtml(handle: number, value: string): void { - const inset = this._insets.get(handle); - if (inset) { - inset.webview.html = value; - } + const inset = this.getInset(handle); + inset.webview.html = value; + } $setOptions(handle: number, options: modes.IWebviewOptions): void { - const inset = this._insets.get(handle); - if (inset) { - inset.webview.options = options; - } + const inset = this.getInset(handle); + inset.webview.options = options; } - $postMessage(handle: number, value: any): Promise { + async $postMessage(handle: number, value: any): Promise { + const inset = this.getInset(handle); + inset.webview.sendMessage(value); + return true; + } + + private getInset(handle: number): EditorWebviewZone { const inset = this._insets.get(handle); - if (inset) { - inset.webview.sendMessage(value); - return Promise.resolve(true); + if (!inset) { + throw new Error('Unknown inset'); } - return Promise.resolve(false); + return inset; } async $getResourceRoot(_handle: number): Promise { From 5c105deba9abee70166f4e64290d5b4f7125fb4f Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Wed, 3 Jul 2019 11:29:15 -0700 Subject: [PATCH 1023/1449] Fix #76525, adjust padding and dimensions --- src/vs/base/browser/ui/countBadge/countBadge.css | 6 +++--- src/vs/workbench/browser/parts/panel/media/panelpart.css | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vs/base/browser/ui/countBadge/countBadge.css b/src/vs/base/browser/ui/countBadge/countBadge.css index 6660da0d461..909fa7c8e78 100644 --- a/src/vs/base/browser/ui/countBadge/countBadge.css +++ b/src/vs/base/browser/ui/countBadge/countBadge.css @@ -4,11 +4,11 @@ *--------------------------------------------------------------------------------------------*/ .monaco-count-badge { - padding: 4px 5px; + padding: 3px 5px; border-radius: 11px; font-size: 11px; - min-width: 19px; - min-height: 19px; + min-width: 18px; + min-height: 18px; line-height: 11px; font-weight: normal; text-align: center; diff --git a/src/vs/workbench/browser/parts/panel/media/panelpart.css b/src/vs/workbench/browser/parts/panel/media/panelpart.css index 388db443314..4839f8b0831 100644 --- a/src/vs/workbench/browser/parts/panel/media/panelpart.css +++ b/src/vs/workbench/browser/parts/panel/media/panelpart.css @@ -93,11 +93,11 @@ } .monaco-workbench .part.panel > .title > .panel-switcher-container > .monaco-action-bar .badge .badge-content { - padding: 4px 5px; + padding: 3px 5px; border-radius: 11px; font-size: 11px; - min-width: 19px; - min-height: 19px; + min-width: 18px; + min-height: 18px; line-height: 11px; font-weight: normal; text-align: center; From 8ba9778a2ed4fd581911cd7a94a7307b70ca0aad Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 3 Jul 2019 09:41:40 -0700 Subject: [PATCH 1024/1449] Bump distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 874ef709f92..d693271f2d3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "fa2bc559711db882ee1d8a13a035ec3273d25e96", + "distro": "4da75531dc397fa0fc57820ea9ab863eceab9a64", "author": { "name": "Microsoft Corporation" }, From 6af7cde5c09c4ed0100bcc253dce345bd50df877 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 3 Jul 2019 09:51:06 -0700 Subject: [PATCH 1025/1449] For #76442 --- src/vs/workbench/contrib/search/common/searchModel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/search/common/searchModel.ts b/src/vs/workbench/contrib/search/common/searchModel.ts index 8ef400154d6..b843faa1662 100644 --- a/src/vs/workbench/contrib/search/common/searchModel.ts +++ b/src/vs/workbench/contrib/search/common/searchModel.ts @@ -1118,7 +1118,7 @@ function textSearchResultToMatches(rawMatch: ITextSearchMatch, fileMatch: FileMa const previewLines = rawMatch.preview.text.split('\n'); if (Array.isArray(rawMatch.ranges)) { return rawMatch.ranges.map((r, i) => { - const previewRange: ISearchRange = rawMatch.preview.matches[i]; + const previewRange: ISearchRange = (rawMatch.preview.matches)[i]; return new Match(fileMatch, previewLines, previewRange, r); }); } else { From 33c32647a75c2ad96fdb5259711a784972bd0366 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 3 Jul 2019 10:54:50 -0700 Subject: [PATCH 1026/1449] Fix #66953 We shouldn't trim here because this chunk can be the middle of a result line. Saw this removing spaces from the result text, resulting in a miscount later on --- .../workbench/services/search/node/ripgrepTextSearchEngine.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts b/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts index 43542561f0e..ee39b55b8e8 100644 --- a/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts +++ b/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts @@ -210,7 +210,7 @@ export class RipgrepParser extends EventEmitter { newlineIdx = dataStr.indexOf('\n', prevIdx); } - this.remainder = dataStr.substring(prevIdx).trim(); + this.remainder = dataStr.substring(prevIdx); } private handleLine(outputLine: string): void { From e5feef0d727191d03f54cf3e741518457af0b5dc Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 3 Jul 2019 10:55:16 -0700 Subject: [PATCH 1027/1449] Test for #66953 --- .../test/node/ripgrepTextSearchEngine.test.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/services/search/test/node/ripgrepTextSearchEngine.test.ts b/src/vs/workbench/services/search/test/node/ripgrepTextSearchEngine.test.ts index 998f1e22e09..fb307c68bfd 100644 --- a/src/vs/workbench/services/search/test/node/ripgrepTextSearchEngine.test.ts +++ b/src/vs/workbench/services/search/test/node/ripgrepTextSearchEngine.test.ts @@ -159,15 +159,16 @@ suite('RipgrepTextSearchEngine', () => { test('chopped-up input chunks', () => { const dataStrs = [ - makeRgMatch('file1.js', 'foobar', 4, [{ start: 3, end: 6 }]), + makeRgMatch('file1.js', 'foo bar', 4, [{ start: 3, end: 7 }]), makeRgMatch('app/file2.js', 'foobar', 4, [{ start: 3, end: 6 }]), makeRgMatch('app2/file3.js', 'foobar', 4, [{ start: 3, end: 6 }]), ]; + const dataStr0Space = dataStrs[0].indexOf(' '); testParser( [ - dataStrs[0].substring(0, 5), - dataStrs[0].substring(5), + dataStrs[0].substring(0, dataStr0Space + 1), + dataStrs[0].substring(dataStr0Space + 1), '\n', dataStrs[1].trim(), '\n' + dataStrs[2].substring(0, 25), @@ -176,11 +177,11 @@ suite('RipgrepTextSearchEngine', () => { [ { preview: { - text: 'foobar', - matches: [new Range(0, 3, 0, 6)] + text: 'foo bar', + matches: [new Range(0, 3, 0, 7)] }, uri: joinPath(TEST_FOLDER, 'file1.js'), - ranges: [new Range(3, 3, 3, 6)] + ranges: [new Range(3, 3, 3, 7)] }, { preview: { From cb555f0004720d09f8f0808c288db8291ae7b4e5 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 3 Jul 2019 12:02:40 -0700 Subject: [PATCH 1028/1449] Remove showing search result when the search viewlet visibility changes This is broken and I don't really like this behavior anyway --- .../contrib/search/browser/searchView.ts | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/src/vs/workbench/contrib/search/browser/searchView.ts b/src/vs/workbench/contrib/search/browser/searchView.ts index 35bc6bf882b..242447cfc92 100644 --- a/src/vs/workbench/contrib/search/browser/searchView.ts +++ b/src/vs/workbench/contrib/search/browser/searchView.ts @@ -320,14 +320,6 @@ export class SearchView extends ViewletPanel { if (this.viewModel) { this.viewModel.searchResult.toggleHighlights(visible); } - - // Open focused element from results in case the editor area is otherwise empty - if (visible && !this.editorService.activeEditor) { - const focus = this.tree.getFocus(); - if (focus) { - this.onFocus(focus, true); - } - } } get searchAndReplaceWidget(): SearchWidget { @@ -1548,12 +1540,7 @@ export class SearchView extends ViewletPanel { this.currentSelectedFileMatch = undefined; } - private onFocus(lineMatch: any, preserveFocus?: boolean, sideBySide?: boolean, pinned?: boolean): Promise { - if (!(lineMatch instanceof Match)) { - this.viewModel.searchResult.rangeHighlightDecorations.removeHighlightRange(); - return Promise.resolve(true); - } - + private onFocus(lineMatch: Match, preserveFocus?: boolean, sideBySide?: boolean, pinned?: boolean): Promise { const useReplacePreview = this.configurationService.getValue().search.useReplacePreview; return (useReplacePreview && this.viewModel.isReplaceActive() && !!this.viewModel.replaceString) ? this.replaceService.openReplacePreview(lineMatch, preserveFocus, sideBySide, pinned) : From 2d1aec3ccfffdbe29d57afa75950554fe409fc41 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 3 Jul 2019 12:05:05 -0700 Subject: [PATCH 1029/1449] Fix #74142 Get rid of the "current match" debouncer because now the selection and focus are synced by the navigator anyway, and that's fine. Now the only debounce is on the open event coming from the navigator. Also, change the navigator onFocus to respect the browserEvent's preserveFocus which should be ok --- src/vs/platform/list/browser/listService.ts | 6 +++++- .../contrib/search/browser/searchView.ts | 15 +-------------- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/src/vs/platform/list/browser/listService.ts b/src/vs/platform/list/browser/listService.ts index c885cca5e51..3847287678b 100644 --- a/src/vs/platform/list/browser/listService.ts +++ b/src/vs/platform/list/browser/listService.ts @@ -719,7 +719,11 @@ export class TreeResourceNavigator2 extends Disposable { const isMouseEvent = e.browserEvent && e.browserEvent instanceof MouseEvent; if (!isMouseEvent) { - this.open(true, false, false, e.browserEvent); + const preserveFocus = (e.browserEvent instanceof KeyboardEvent && typeof (e.browserEvent).preserveFocus === 'boolean') ? + !!(e.browserEvent).preserveFocus : + true; + + this.open(preserveFocus, false, false, e.browserEvent); } } diff --git a/src/vs/workbench/contrib/search/browser/searchView.ts b/src/vs/workbench/contrib/search/browser/searchView.ts index 242447cfc92..77335ea480e 100644 --- a/src/vs/workbench/contrib/search/browser/searchView.ts +++ b/src/vs/workbench/contrib/search/browser/searchView.ts @@ -12,7 +12,7 @@ import { ITreeContextMenuEvent, ITreeElement } from 'vs/base/browser/ui/tree/tre import { IAction } from 'vs/base/common/actions'; import { Delayer } from 'vs/base/common/async'; import * as errors from 'vs/base/common/errors'; -import { Emitter, Event } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { Iterator } from 'vs/base/common/iterator'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; @@ -117,7 +117,6 @@ export class SearchView extends ViewletPanel { private currentSelectedFileMatch: FileMatch | undefined; - private readonly selectCurrentMatchEmitter: Emitter; private delayedRefresh: Delayer; private changedWhileHidden: boolean; @@ -175,10 +174,6 @@ export class SearchView extends ViewletPanel { this._register(this.contextService.onDidChangeWorkbenchState(() => this.onDidChangeWorkbenchState())); this._register(this.searchHistoryService.onDidClearHistory(() => this.clearHistory())); - this.selectCurrentMatchEmitter = this._register(new Emitter()); - this._register(Event.debounce(this.selectCurrentMatchEmitter.event, (l, e) => e, 100, /*leading=*/true) - (() => this.selectCurrentMatch())); - this.delayedRefresh = this._register(new Delayer(250)); this.actions = [ @@ -702,12 +697,6 @@ export class SearchView extends ViewletPanel { }); } - selectCurrentMatch(): void { - const focused = this.tree.getFocus()[0]; - const fakeKeyboardEvent = getSelectionKeyboardEvent(undefined, false); - this.tree.setSelection([focused], fakeKeyboardEvent); - } - selectNextMatch(): void { const [selected] = this.tree.getSelection(); @@ -741,7 +730,6 @@ export class SearchView extends ViewletPanel { if (next) { this.tree.setFocus([next], getSelectionKeyboardEvent(undefined, false)); this.tree.reveal(next); - this.selectCurrentMatchEmitter.fire(undefined); } } @@ -781,7 +769,6 @@ export class SearchView extends ViewletPanel { if (prev) { this.tree.setFocus([prev], getSelectionKeyboardEvent(undefined, false)); this.tree.reveal(prev); - this.selectCurrentMatchEmitter.fire(undefined); } } From 0897d37e88a90307c6d6f22df26296fb6590ea0d Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 3 Jul 2019 21:51:09 +0200 Subject: [PATCH 1030/1449] fix reading directories --- .../userData/common/fileUserDataProvider.ts | 23 +++++++++++-------- .../common/userDataFileSystemProvider.ts | 2 +- .../fileUserDataProvider.test.ts | 4 ++-- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/vs/workbench/services/userData/common/fileUserDataProvider.ts b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts index d599aa0c2e9..79c75f15091 100644 --- a/src/vs/workbench/services/userData/common/fileUserDataProvider.ts +++ b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts @@ -55,8 +55,9 @@ export class FileUserDataProvider extends Disposable implements IUserDataProvide } async listFiles(path: string): Promise { - const result = await this.fileService.resolve(this.toResource(path)); - return result.children ? result.children.map(c => this.toPath(c.resource)!) : []; + const resource = this.toResource(path); + const result = await this.fileService.resolve(resource); + return result.children ? result.children.map(c => this.toRelativePath(c.resource, resource)!) : []; } deleteFile(path: string): Promise { @@ -71,14 +72,18 @@ export class FileUserDataProvider extends Disposable implements IUserDataProvide } private toPath(resource: URI): string | undefined { - const resourcePath = resource.toString(); - const userDataHomePath = this.userDataHome.toString(); - const backupHomePath = resources.joinPath(resources.dirname(this.userDataHome), BACKUPS).toString(); - if (startsWith(resourcePath, userDataHomePath)) { - return resourcePath.substr(userDataHomePath.length + 1); + let result = this.toRelativePath(resource, this.userDataHome); + if (result === undefined) { + result = this.toRelativePath(resource, resources.joinPath(resources.dirname(this.userDataHome), BACKUPS)); } - if (startsWith(resourcePath, backupHomePath)) { - return resourcePath.substr(backupHomePath.length + 1); + return result; + } + + private toRelativePath(fromResource: URI, toResource: URI): string | undefined { + const fromPath = fromResource.toString(); + const toPath = toResource.toString(); + if (startsWith(fromPath, toPath)) { + return fromPath.substr(toPath.length + 1); } return undefined; } diff --git a/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts b/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts index bf6f7029a99..8db1719ed90 100644 --- a/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts +++ b/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts @@ -88,7 +88,7 @@ export class UserDataFileSystemProvider extends Disposable implements IFileSyste throw new Error(`Invalid user data container ${resource}`); } const children = await this.userDataProvider.listFiles(path); - return children.map(c => [c, FileType.Unknown]); + return children.map(c => [c, FileType.File]); } writeFile(resource: URI, content: Uint8Array, opts: FileWriteOptions): Promise { diff --git a/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts b/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts index b8e3ee65f10..c0817b219ab 100644 --- a/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts +++ b/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts @@ -335,7 +335,7 @@ suite('FileUserDataProvider', () => { assert.ok(result.isDirectory); assert.ok(result.children !== undefined); assert.equal(result.children!.length, 1); - assert.equal(result.children![0].name, 'settings.json'); + assert.equal(result.children![0].resource.toString(), joinPath(userDataResource, 'testContainer/settings.json').toString()); }); test('watch file under container - event is triggerred when file is created', async (done) => { @@ -515,6 +515,6 @@ suite('FileUserDataProvider', () => { assert.ok(result.isDirectory); assert.ok(result.children !== undefined); assert.equal(result.children!.length, 1); - assert.equal(result.children![0].name, 'backup.json'); + assert.equal(result.children![0].resource.toString(), joinPath(userDataResource, `${BACKUPS}/backup.json`).toString()); }); }); \ No newline at end of file From a2841278372e41202af1a238eb8d91d65565c19f Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 3 Jul 2019 21:55:13 +0200 Subject: [PATCH 1031/1449] introduce user roaming data home --- .../environment/common/environment.ts | 3 ++ .../environment/node/environmentService.ts | 9 ++-- src/vs/workbench/browser/web.main.ts | 19 +++++--- src/vs/workbench/electron-browser/main.ts | 3 +- .../configurationEditingService.test.ts | 16 ++----- .../configurationService.test.ts | 44 +++++++------------ .../environment/browser/environmentService.ts | 19 +++----- .../environment/node/environmentService.ts | 6 +-- .../keybindingEditing.test.ts | 17 ++----- .../services/textfile/node/textFileService.ts | 2 +- 10 files changed, 54 insertions(+), 84 deletions(-) diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index 5229a389269..43693f6c062 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -101,6 +101,9 @@ export interface IEnvironmentService { appNameLong: string; appQuality?: string; appSettingsHome: URI; + + // user roaming data + userRoamingDataHome: URI; settingsResource: URI; keybindingsResource: URI; keyboardLayoutResource: URI; diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts index 9de4c60783b..4574a54ea6c 100644 --- a/src/vs/platform/environment/node/environmentService.ts +++ b/src/vs/platform/environment/node/environmentService.ts @@ -115,7 +115,10 @@ export class EnvironmentService implements IEnvironmentService { get appSettingsHome(): URI { return URI.file(path.join(this.userDataPath, 'User')); } @memoize - get settingsResource(): URI { return resources.joinPath(this.appSettingsHome, 'settings.json'); } + get userRoamingDataHome(): URI { return this.appSettingsHome; } + + @memoize + get settingsResource(): URI { return resources.joinPath(this.userRoamingDataHome, 'settings.json'); } @memoize get machineSettingsHome(): URI { return URI.file(path.join(this.userDataPath, 'Machine')); } @@ -136,10 +139,10 @@ export class EnvironmentService implements IEnvironmentService { get settingsSearchUrl(): string | undefined { return product.settingsSearchUrl; } @memoize - get keybindingsResource(): URI { return resources.joinPath(this.appSettingsHome, 'keybindings.json'); } + get keybindingsResource(): URI { return resources.joinPath(this.userRoamingDataHome, 'keybindings.json'); } @memoize - get keyboardLayoutResource(): URI { return resources.joinPath(this.appSettingsHome, 'keyboardLayout.json'); } + get keyboardLayoutResource(): URI { return resources.joinPath(this.userRoamingDataHome, 'keyboardLayout.json'); } @memoize get isExtensionDevelopment(): boolean { return !!this._args.extensionDevelopmentPath; } diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index f87f57f07dc..34a4599dd10 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -37,7 +37,7 @@ import { IWorkbenchConstructionOptions } from 'vs/workbench/workbench.web.api'; import { ProductService } from 'vs/platform/product/browser/productService'; import { FileUserDataProvider } from 'vs/workbench/services/userData/common/fileUserDataProvider'; import { UserDataFileSystemProvider } from 'vs/workbench/services/userData/common/userDataFileSystemProvider'; -import { joinPath, dirname } from 'vs/base/common/resources'; +import { joinPath } from 'vs/base/common/resources'; import { InMemoryUserDataProvider } from 'vs/workbench/services/userData/common/inMemoryUserDataProvider'; import { IUserDataProvider } from 'vs/workbench/services/userData/common/userData'; @@ -91,8 +91,7 @@ class CodeRendererMain extends Disposable { serviceCollection.set(ILogService, logService); // Environment - const remoteUserDataUri = this.getRemoteUserDataUri(); - const environmentService = new BrowserWorkbenchEnvironmentService(this.configuration, remoteUserDataUri); + const environmentService = new BrowserWorkbenchEnvironmentService(this.configuration); serviceCollection.set(IWorkbenchEnvironmentService, environmentService); // Product @@ -124,7 +123,7 @@ class CodeRendererMain extends Disposable { } // User Data Provider - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(dirname(environmentService.settingsResource), this.getUserDataPovider(fileService, remoteUserDataUri))); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.userRoamingDataHome, this.getUserDataPovider(fileService))); const payload = await this.resolveWorkspaceInitializationPayload(); @@ -174,12 +173,18 @@ class CodeRendererMain extends Disposable { return { id: 'empty-window' }; } - private getUserDataPovider(fileService: IFileService, remoteUserDataUri: URI | null): IUserDataProvider { + private getUserDataPovider(fileService: IFileService): IUserDataProvider { if (this.configuration.userDataProvider) { return this.configuration.userDataProvider; - } else if (this.configuration.remoteAuthority && remoteUserDataUri) { - return this._register(new FileUserDataProvider(remoteUserDataUri, fileService)); } + + if (this.configuration.remoteAuthority) { + const remoteUserDataUri = this.getRemoteUserDataUri(); + if (remoteUserDataUri) { + return this._register(new FileUserDataProvider(remoteUserDataUri, fileService)); + } + } + return this._register(new InMemoryUserDataProvider()); } diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index 014ac74121d..9394c30bb0f 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -52,7 +52,6 @@ import { SignService } from 'vs/platform/sign/node/signService'; import { ISignService } from 'vs/platform/sign/common/sign'; import { FileUserDataProvider } from 'vs/workbench/services/userData/common/fileUserDataProvider'; import { UserDataFileSystemProvider } from 'vs/workbench/services/userData/common/userDataFileSystemProvider'; -import { dirname } from 'vs/base/common/resources'; class CodeRendererMain extends Disposable { @@ -209,7 +208,7 @@ class CodeRendererMain extends Disposable { } // User Data Provider - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(dirname(environmentService.settingsResource), new FileUserDataProvider(environmentService.appSettingsHome, fileService))); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.userRoamingDataHome, new FileUserDataProvider(environmentService.appSettingsHome, fileService))); const payload = await this.resolveWorkspaceInitializationPayload(environmentService); 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 6f187eaaa36..9dd12eca435 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 @@ -10,7 +10,7 @@ import * as path from 'vs/base/common/path'; import * as fs from 'fs'; import * as json from 'vs/base/common/json'; import { Registry } from 'vs/platform/registry/common/platform'; -import { ParsedArgs, IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { parseArgs } from 'vs/platform/environment/node/argv'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { TestTextFileService, workbenchInstantiationService } from 'vs/workbench/test/workbenchTestServices'; @@ -38,22 +38,12 @@ import { Schemas } from 'vs/base/common/network'; import { DiskFileSystemProvider } from 'vs/workbench/services/files/node/diskFileSystemProvider'; import { IFileService } from 'vs/platform/files/common/files'; import { ConfigurationCache } from 'vs/workbench/services/configuration/node/configurationCache'; -import { dirname } from 'vs/base/common/resources'; import { KeybindingsEditingService, IKeybindingEditingService } from 'vs/workbench/services/keybinding/common/keybindingEditing'; import { UserDataFileSystemProvider } from 'vs/workbench/services/userData/common/userDataFileSystemProvider'; import { WorkbenchEnvironmentService } from 'vs/workbench/services/environment/node/environmentService'; import { IWindowConfiguration } from 'vs/platform/windows/common/windows'; import { FileUserDataProvider } from 'vs/workbench/services/userData/common/fileUserDataProvider'; -class SettingsTestEnvironmentService extends WorkbenchEnvironmentService { - - constructor(args: ParsedArgs, _execPath: string, private _settingsPath: string) { - super(args, _execPath); - } - - get appSettingsHome(): URI { return dirname(URI.file(this._settingsPath)); } -} - suite('ConfigurationEditingService', () => { let instantiationService: TestInstantiationService; @@ -105,14 +95,14 @@ suite('ConfigurationEditingService', () => { clearServices(); instantiationService = workbenchInstantiationService(); - const environmentService = new SettingsTestEnvironmentService(parseArgs(process.argv), process.execPath, globalSettingsFile); + const environmentService = new WorkbenchEnvironmentService(parseArgs(process.argv), process.execPath); instantiationService.stub(IEnvironmentService, environmentService); const remoteAgentService = instantiationService.createInstance(RemoteAgentService, {}); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); instantiationService.stub(IFileService, fileService); instantiationService.stub(IRemoteAgentService, remoteAgentService); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.appSettingsHome.with({ scheme: Schemas.userData }), new FileUserDataProvider(environmentService.appSettingsHome, fileService))); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(URI.file('/User').with({ scheme: Schemas.userData }), new FileUserDataProvider(URI.file(workspaceDir), fileService))); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); return workspaceService.initialize(noWorkspace ? { id: '' } : { folder: URI.file(workspaceDir), id: createHash('md5').update(URI.file(workspaceDir).toString()).digest('hex') }).then(() => { 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 4554c25471e..97e1408578c 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 @@ -10,7 +10,7 @@ import * as path from 'vs/base/common/path'; import * as os from 'os'; import { URI } from 'vs/base/common/uri'; import { Registry } from 'vs/platform/registry/common/platform'; -import { ParsedArgs, IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { parseArgs } from 'vs/platform/environment/node/argv'; import * as pfs from 'vs/base/node/pfs'; import * as uuid from 'vs/base/common/uuid'; @@ -30,7 +30,7 @@ import { IJSONEditingService } from 'vs/workbench/services/configuration/common/ import { JSONEditingService } from 'vs/workbench/services/configuration/common/jsonEditingService'; import { createHash } from 'crypto'; import { Schemas } from 'vs/base/common/network'; -import { originalFSPath, dirname } from 'vs/base/common/resources'; +import { originalFSPath } from 'vs/base/common/resources'; import { isLinux } from 'vs/base/common/platform'; import { IWindowConfiguration } from 'vs/platform/windows/common/windows'; import { RemoteAgentService } from 'vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl'; @@ -50,15 +50,6 @@ import { WorkbenchEnvironmentService } from 'vs/workbench/services/environment/n import { UserDataFileSystemProvider } from 'vs/workbench/services/userData/common/userDataFileSystemProvider'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -class SettingsTestEnvironmentService extends WorkbenchEnvironmentService { - - constructor(args: ParsedArgs, _execPath: string, private _settingsPath: string) { - super(args, _execPath); - } - - get appSettingsHome(): URI { return dirname(URI.file(this._settingsPath)); } -} - function setUpFolderWorkspace(folderName: string): Promise<{ parentDir: string, folderDir: string }> { const id = uuid.generateUuid(); const parentDir = path.join(os.tmpdir(), 'vsctests', id); @@ -105,10 +96,9 @@ suite('WorkspaceContextService - Folder', () => { .then(({ parentDir, folderDir }) => { parentResource = parentDir; workspaceResource = folderDir; - const globalSettingsFile = path.join(parentDir, 'settings.json'); - const environmentService = new SettingsTestEnvironmentService(parseArgs(process.argv), process.execPath, globalSettingsFile); + const environmentService = new WorkbenchEnvironmentService(parseArgs(process.argv), process.execPath); const fileService = new FileService(new NullLogService()); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.appSettingsHome.with({ scheme: Schemas.userData }), new FileUserDataProvider(environmentService.appSettingsHome, fileService))); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(URI.file('/User').with({ scheme: Schemas.userData }), new FileUserDataProvider(URI.file(parentDir), fileService))); workspaceContextService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, new RemoteAgentService({}, environmentService, new RemoteAuthorityResolverService(), new SignService())); return (workspaceContextService).initialize(convertToWorkspacePayload(URI.file(folderDir))); }); @@ -168,12 +158,12 @@ suite('WorkspaceContextService - Workspace', () => { parentResource = parentDir; instantiationService = workbenchInstantiationService(); - const environmentService = new SettingsTestEnvironmentService(parseArgs(process.argv), process.execPath, path.join(parentDir, 'settings.json')); + const environmentService = new WorkbenchEnvironmentService(parseArgs(process.argv), process.execPath); const remoteAgentService = instantiationService.createInstance(RemoteAgentService, {}); instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.appSettingsHome.with({ scheme: Schemas.userData }), new FileUserDataProvider(environmentService.appSettingsHome, fileService))); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(URI.file('/User').with({ scheme: Schemas.userData }), new FileUserDataProvider(URI.file(parentDir), fileService))); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); @@ -227,12 +217,12 @@ suite('WorkspaceContextService - Workspace Editing', () => { parentResource = parentDir; instantiationService = workbenchInstantiationService(); - const environmentService = new SettingsTestEnvironmentService(parseArgs(process.argv), process.execPath, path.join(parentDir, 'settings.json')); + const environmentService = new WorkbenchEnvironmentService(parseArgs(process.argv), process.execPath); const remoteAgentService = instantiationService.createInstance(RemoteAgentService, {}); instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.appSettingsHome.with({ scheme: Schemas.userData }), new FileUserDataProvider(environmentService.appSettingsHome, fileService))); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(URI.file('/User').with({ scheme: Schemas.userData }), new FileUserDataProvider(URI.file(parentDir), fileService))); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); @@ -487,12 +477,12 @@ suite('WorkspaceService - Initialization', () => { globalSettingsFile = path.join(parentDir, 'settings.json'); const instantiationService = workbenchInstantiationService(); - const environmentService = new SettingsTestEnvironmentService(parseArgs(process.argv), process.execPath, globalSettingsFile); + const environmentService = new WorkbenchEnvironmentService(parseArgs(process.argv), process.execPath); const remoteAgentService = instantiationService.createInstance(RemoteAgentService, {}); instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.appSettingsHome.with({ scheme: Schemas.userData }), new FileUserDataProvider(environmentService.appSettingsHome, fileService))); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(URI.file('/User').with({ scheme: Schemas.userData }), new FileUserDataProvider(URI.file(parentDir), fileService))); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); @@ -750,12 +740,12 @@ suite('WorkspaceConfigurationService - Folder', () => { globalSettingsFile = path.join(parentDir, 'settings.json'); const instantiationService = workbenchInstantiationService(); - const environmentService = new SettingsTestEnvironmentService(parseArgs(process.argv), process.execPath, globalSettingsFile); + const environmentService = new WorkbenchEnvironmentService(parseArgs(process.argv), process.execPath); const remoteAgentService = instantiationService.createInstance(RemoteAgentService, {}); instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.appSettingsHome.with({ scheme: Schemas.userData }), new FileUserDataProvider(environmentService.appSettingsHome, fileService))); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(URI.file('/User').with({ scheme: Schemas.userData }), new FileUserDataProvider(URI.file(parentDir), fileService))); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); @@ -1040,7 +1030,7 @@ suite('WorkspaceConfigurationService - Folder', () => { suite('WorkspaceConfigurationService-Multiroot', () => { - let parentResource: string, workspaceContextService: IWorkspaceContextService, environmentService: IWorkbenchEnvironmentService, jsonEditingServce: IJSONEditingService, testObject: IConfigurationService, globalSettingsFile: string; + let parentResource: string, workspaceContextService: IWorkspaceContextService, jsonEditingServce: IJSONEditingService, testObject: IConfigurationService, globalSettingsFile: string; const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); suiteSetup(() => { @@ -1079,12 +1069,12 @@ suite('WorkspaceConfigurationService-Multiroot', () => { globalSettingsFile = path.join(parentDir, 'settings.json'); const instantiationService = workbenchInstantiationService(); - environmentService = new SettingsTestEnvironmentService(parseArgs(process.argv), process.execPath, globalSettingsFile); + const environmentService = new WorkbenchEnvironmentService(parseArgs(process.argv), process.execPath); const remoteAgentService = instantiationService.createInstance(RemoteAgentService, {}); instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.appSettingsHome.with({ scheme: Schemas.userData }), new FileUserDataProvider(environmentService.appSettingsHome, fileService))); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(URI.file('/User').with({ scheme: Schemas.userData }), new FileUserDataProvider(URI.file(parentDir), fileService))); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); @@ -1481,12 +1471,12 @@ suite('WorkspaceConfigurationService - Remote Folder', () => { remoteSettingsFile = path.join(parentDir, 'remote-settings.json'); instantiationService = workbenchInstantiationService(); - const environmentService = new SettingsTestEnvironmentService(parseArgs(process.argv), process.execPath, globalSettingsFile); + const environmentService = new WorkbenchEnvironmentService(parseArgs(process.argv), process.execPath); const remoteEnvironmentPromise = new Promise>(c => resolveRemoteEnvironment = () => c({ settingsPath: URI.file(remoteSettingsFile).with({ scheme: Schemas.vscodeRemote, authority: remoteAuthority }) })); const remoteAgentService = instantiationService.stub(IRemoteAgentService, >{ getEnvironment: () => remoteEnvironmentPromise }); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, diskFileSystemProvider); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.appSettingsHome.with({ scheme: Schemas.userData }), new FileUserDataProvider(environmentService.appSettingsHome, fileService))); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(URI.file('/User').with({ scheme: Schemas.userData }), new FileUserDataProvider(URI.file(parentDir), fileService))); const configurationCache: IConfigurationCache = { read: () => Promise.resolve(''), write: () => Promise.resolve(), remove: () => Promise.resolve() }; testObject = new WorkspaceService({ configurationCache, remoteAuthority }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, testObject); diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts index 97213c6b7dc..8964e52e5e7 100644 --- a/src/vs/workbench/services/environment/browser/environmentService.ts +++ b/src/vs/workbench/services/environment/browser/environmentService.ts @@ -63,24 +63,16 @@ export class BrowserWorkbenchEnvironmentService implements IEnvironmentService { readonly configuration: IWindowConfiguration = new BrowserWindowConfiguration(); - constructor(configuration: IWorkbenchConstructionOptions, remoteUserDataUri: URI | null) { + constructor(configuration: IWorkbenchConstructionOptions) { this.args = { _: [] }; this.appRoot = '/web/'; this.appNameLong = 'Visual Studio Code - Web'; this.configuration.remoteAuthority = configuration.remoteAuthority; - - if (remoteUserDataUri) { - this.appSettingsHome = remoteUserDataUri; - this.settingsResource = joinPath(this.appSettingsHome, 'settings.json').with({ scheme: Schemas.userData }); - this.keybindingsResource = joinPath(this.appSettingsHome, 'keybindings.json').with({ scheme: Schemas.userData }); - } else { - const appSettingsHome = URI.file('/User').with({ scheme: Schemas.userData }); - this.settingsResource = joinPath(appSettingsHome, 'settings.json'); - this.keybindingsResource = joinPath(appSettingsHome, 'keybindings.json'); - } - - this.keyboardLayoutResource = joinPath(this.appSettingsHome, 'keyboardLayout.json'); + this.userRoamingDataHome = URI.file('/User').with({ scheme: Schemas.userData }); + this.settingsResource = joinPath(this.userRoamingDataHome, 'settings.json'); + this.keybindingsResource = joinPath(this.userRoamingDataHome, 'keybindings.json'); + this.keyboardLayoutResource = joinPath(this.userRoamingDataHome, 'keyboardLayout.json'); this.logsPath = '/web/logs'; @@ -104,6 +96,7 @@ export class BrowserWorkbenchEnvironmentService implements IEnvironmentService { appNameLong: string; appQuality?: string; appSettingsHome: URI; + userRoamingDataHome: URI; settingsResource: URI; keybindingsResource: URI; keyboardLayoutResource: URI; diff --git a/src/vs/workbench/services/environment/node/environmentService.ts b/src/vs/workbench/services/environment/node/environmentService.ts index bb72c8785b8..48be78c71f7 100644 --- a/src/vs/workbench/services/environment/node/environmentService.ts +++ b/src/vs/workbench/services/environment/node/environmentService.ts @@ -8,7 +8,6 @@ import { IWindowConfiguration } from 'vs/platform/windows/common/windows'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { memoize } from 'vs/base/common/decorators'; import { URI } from 'vs/base/common/uri'; -import { joinPath } from 'vs/base/common/resources'; import { Schemas } from 'vs/base/common/network'; export class WorkbenchEnvironmentService extends EnvironmentService implements IWorkbenchEnvironmentService { @@ -27,8 +26,5 @@ export class WorkbenchEnvironmentService extends EnvironmentService implements I } @memoize - get settingsResource(): URI { return joinPath(this.appSettingsHome, 'settings.json').with({ scheme: Schemas.userData }); } - - @memoize - get keybindingsResource(): URI { return joinPath(this.appSettingsHome, 'keybindings.json').with({ scheme: Schemas.userData }); } + get userRoamingDataHome(): URI { return this.appSettingsHome.with({ scheme: Schemas.userData }); } } 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 d3fecf7080d..c5480533d13 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 @@ -21,7 +21,7 @@ import { ITextResourcePropertiesService } from 'vs/editor/common/services/resour import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ConfigurationService } from 'vs/platform/configuration/node/configurationService'; import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { IEnvironmentService, ParsedArgs } from 'vs/platform/environment/common/environment'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IFileService } from 'vs/platform/files/common/files'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { IUserFriendlyKeybinding } from 'vs/platform/keybinding/common/keybinding'; @@ -47,10 +47,9 @@ import { DiskFileSystemProvider } from 'vs/workbench/services/files/node/diskFil import { URI } from 'vs/base/common/uri'; import { UserDataFileSystemProvider } from 'vs/workbench/services/userData/common/userDataFileSystemProvider'; import { FileUserDataProvider } from 'vs/workbench/services/userData/common/fileUserDataProvider'; +import { parseArgs } from 'vs/platform/environment/node/argv'; import { WorkbenchEnvironmentService } from 'vs/workbench/services/environment/node/environmentService'; import { IWindowConfiguration } from 'vs/platform/windows/common/windows'; -import { parseArgs } from 'vs/platform/environment/node/argv'; -import { dirname } from 'vs/base/common/resources'; interface Modifiers { metaKey?: boolean; @@ -59,14 +58,6 @@ interface Modifiers { shiftKey?: boolean; } -class SettingsTestEnvironmentService extends WorkbenchEnvironmentService { - constructor(args: ParsedArgs, _execPath: string, private _appSettingsHome: URI) { - super(args, _execPath); - } - - get appSettingsHome(): URI { return this._appSettingsHome; } -} - suite('KeybindingsEditing', () => { let instantiationService: TestInstantiationService; @@ -80,7 +71,7 @@ suite('KeybindingsEditing', () => { instantiationService = new TestInstantiationService(); - const environmentService = new SettingsTestEnvironmentService(parseArgs(process.argv), process.execPath, URI.file(testDir)); + const environmentService = new WorkbenchEnvironmentService(parseArgs(process.argv), process.execPath); instantiationService.stub(IEnvironmentService, environmentService); instantiationService.stub(IConfigurationService, ConfigurationService); instantiationService.stub(IConfigurationService, 'getValue', { 'eol': '\n' }); @@ -99,7 +90,7 @@ suite('KeybindingsEditing', () => { instantiationService.stub(IModelService, instantiationService.createInstance(ModelServiceImpl)); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(dirname(environmentService.keybindingsResource), new FileUserDataProvider(environmentService.appSettingsHome, fileService))); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(URI.file('/User').with({ scheme: Schemas.userData }), new FileUserDataProvider(URI.file(testDir), fileService))); instantiationService.stub(IFileService, fileService); instantiationService.stub(IUntitledEditorService, instantiationService.createInstance(UntitledEditorService)); instantiationService.stub(ITextFileService, instantiationService.createInstance(TestTextFileService)); diff --git a/src/vs/workbench/services/textfile/node/textFileService.ts b/src/vs/workbench/services/textfile/node/textFileService.ts index 242aadab987..91fbdc6232e 100644 --- a/src/vs/workbench/services/textfile/node/textFileService.ts +++ b/src/vs/workbench/services/textfile/node/textFileService.ts @@ -390,7 +390,7 @@ export class EncodingOracle extends Disposable implements IResourceEncodings { const defaultEncodingOverrides: IEncodingOverride[] = []; // Global settings - defaultEncodingOverrides.push({ parent: this.environmentService.appSettingsHome, encoding: UTF8 }); + defaultEncodingOverrides.push({ parent: this.environmentService.userRoamingDataHome, encoding: UTF8 }); // Workspace files defaultEncodingOverrides.push({ extension: WORKSPACE_EXTENSION, encoding: UTF8 }); From c3fd7555638f7cdb798f0b1370e30506c40f6bf6 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 21:59:41 +0200 Subject: [PATCH 1032/1449] bring back all agents --- .../darwin/product-build-darwin.yml | 37 ++-- .../linux/product-build-linux-alpine.yml | 22 ++- .../linux/product-build-linux-arm.yml | 22 ++- build/azure-pipelines/product-build.yml | 164 +++++++++--------- .../win32/product-build-win32.yml | 39 ++--- 5 files changed, 134 insertions(+), 150 deletions(-) diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index 4b747443cc1..ebbf9f58a28 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -1,4 +1,17 @@ steps: +- script: | + mkdir -p .build + echo $BUILD_SOURCEVERSION > .build/commit + displayName: Prepare cache flag + +- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + inputs: + keyfile: '.build/commit' + targetfolder: '.build, **/out-build' + vstsFeed: 'npm-vscode' + platformIndependent: true + alias: 'Compilation' + - task: NodeTool@0 inputs: versionSpec: "10.15.1" @@ -65,13 +78,6 @@ steps: yarn gulp mixin displayName: Mix in quality -- script: | - set -e - yarn gulp hygiene - yarn monaco-compile-check - displayName: Run hygiene checks - condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - - script: | set -e node build/azure-pipelines/common/installDistroDependencies.js @@ -81,23 +87,6 @@ steps: - script: | set -e - cd $BUILD_STAGINGDIRECTORY - git clone https://github.com/microsoft/vscode-telemetry-extractor.git - cd vscode-telemetry-extractor - git checkout 3b04aba5bfdfcca1a5426cd2c51a90d18740d0bc - npm i - npm run setup-extension-repos - node ./out/cli-extract.js --sourceDir $BUILD_SOURCESDIRECTORY --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents - node ./out/cli-extract-extensions.js --sourceDir ./src/telemetry-sources --outputDir . --applyEndpoints --includeIsMeasurement - mkdir -p $BUILD_SOURCESDIRECTORY/.build/telemetry - mv declarations-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-core.json - mv declarations-extensions-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-extensions.json - displayName: Extract Telemetry - -- script: | - set -e - yarn gulp compile-build - yarn gulp compile-extensions-build VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ yarn gulp vscode-darwin-ci VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ diff --git a/build/azure-pipelines/linux/product-build-linux-alpine.yml b/build/azure-pipelines/linux/product-build-linux-alpine.yml index d3da7c4d952..a77735fd7dd 100644 --- a/build/azure-pipelines/linux/product-build-linux-alpine.yml +++ b/build/azure-pipelines/linux/product-build-linux-alpine.yml @@ -1,4 +1,17 @@ steps: +- script: | + mkdir -p .build + echo $BUILD_SOURCEVERSION > .build/commit + displayName: Prepare cache flag + +- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + inputs: + keyfile: '.build/commit' + targetfolder: '.build, **/out-build' + vstsFeed: 'npm-vscode' + platformIndependent: true + alias: 'Compilation' + - task: NodeTool@0 inputs: versionSpec: "10.15.1" @@ -74,13 +87,6 @@ steps: yarn gulp mixin displayName: Mix in quality -- script: | - set -e - yarn gulp hygiene - yarn monaco-compile-check - displayName: Run hygiene checks - condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - - script: | set -e ./build/azure-pipelines/linux/prebuild-alpine.sh @@ -88,8 +94,6 @@ steps: - script: | set -e - yarn gulp compile-build - yarn gulp compile-extensions-build ./build/azure-pipelines/linux/build-alpine.sh displayName: Build diff --git a/build/azure-pipelines/linux/product-build-linux-arm.yml b/build/azure-pipelines/linux/product-build-linux-arm.yml index 708fd1bf66f..ccdaa72599d 100644 --- a/build/azure-pipelines/linux/product-build-linux-arm.yml +++ b/build/azure-pipelines/linux/product-build-linux-arm.yml @@ -1,4 +1,17 @@ steps: +- script: | + mkdir -p .build + echo $BUILD_SOURCEVERSION > .build/commit + displayName: Prepare cache flag + +- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + inputs: + keyfile: '.build/commit' + targetfolder: '.build, **/out-build' + vstsFeed: 'npm-vscode' + platformIndependent: true + alias: 'Compilation' + - task: NodeTool@0 inputs: versionSpec: "10.15.1" @@ -74,13 +87,6 @@ steps: yarn gulp mixin displayName: Mix in quality -- script: | - set -e - yarn gulp hygiene - yarn monaco-compile-check - displayName: Run hygiene checks - condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - - script: | set -e ./build/azure-pipelines/linux/prebuild-arm.sh @@ -88,8 +94,6 @@ steps: - script: | set -e - yarn gulp compile-build - yarn gulp compile-extensions-build ./build/azure-pipelines/linux/build-arm.sh displayName: Build diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 11ed339a420..13c477da9a1 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -16,25 +16,25 @@ jobs: steps: - template: product-compile.yml -# - job: Windows -# condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32'], 'true')) -# timeoutInMinutes: 120 -# pool: -# vmImage: VS2017-Win2016 -# variables: -# VSCODE_ARCH: x64 -# steps: -# - template: win32/product-build-win32.yml +- job: Windows + condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32'], 'true')) + timeoutInMinutes: 120 + pool: + vmImage: VS2017-Win2016 + variables: + VSCODE_ARCH: x64 + steps: + - template: win32/product-build-win32.yml -# - job: Windows32 -# condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true')) -# timeoutInMinutes: 120 -# pool: -# vmImage: VS2017-Win2016 -# variables: -# VSCODE_ARCH: ia32 -# steps: -# - template: win32/product-build-win32.yml +- job: Windows32 + condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true')) + timeoutInMinutes: 120 + pool: + vmImage: VS2017-Win2016 + variables: + VSCODE_ARCH: ia32 + steps: + - template: win32/product-build-win32.yml - job: Linux condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) @@ -49,75 +49,75 @@ jobs: steps: - template: linux/product-build-linux.yml -# - job: LinuxSnap -# condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) -# timeoutInMinutes: 120 -# pool: -# vmImage: 'Ubuntu-16.04' -# variables: -# VSCODE_ARCH: x64 -# container: snapcraft -# dependsOn: Linux -# steps: -# - template: linux/snap-build-linux.yml +- job: LinuxSnap + condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) + timeoutInMinutes: 120 + pool: + vmImage: 'Ubuntu-16.04' + variables: + VSCODE_ARCH: x64 + container: snapcraft + dependsOn: Linux + steps: + - template: linux/snap-build-linux.yml -# - job: LinuxArmhf -# condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) -# timeoutInMinutes: 120 -# pool: -# vmImage: 'Ubuntu-16.04' -# variables: -# VSCODE_ARCH: armhf -# steps: -# - template: linux/product-build-linux-arm.yml +- job: LinuxArmhf + condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) + timeoutInMinutes: 120 + pool: + vmImage: 'Ubuntu-16.04' + variables: + VSCODE_ARCH: armhf + steps: + - template: linux/product-build-linux-arm.yml -# - job: LinuxAlpine -# condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) -# timeoutInMinutes: 120 -# pool: -# vmImage: 'Ubuntu-16.04' -# variables: -# VSCODE_ARCH: alpine -# steps: -# - template: linux/product-build-linux-alpine.yml +- job: LinuxAlpine + condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) + timeoutInMinutes: 120 + pool: + vmImage: 'Ubuntu-16.04' + variables: + VSCODE_ARCH: alpine + steps: + - template: linux/product-build-linux-alpine.yml -# - job: macOS -# condition: and(succeeded(), eq(variables['VSCODE_BUILD_MACOS'], 'true')) -# timeoutInMinutes: 120 -# pool: -# vmImage: macOS 10.13 -# steps: -# - template: darwin/product-build-darwin.yml +- job: macOS + condition: and(succeeded(), eq(variables['VSCODE_BUILD_MACOS'], 'true')) + timeoutInMinutes: 120 + pool: + vmImage: macOS 10.13 + steps: + - template: darwin/product-build-darwin.yml -# - job: Release -# condition: and(succeeded(), or(eq(variables['VSCODE_RELEASE'], 'true'), and(or(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['VSCODE_QUALITY'], 'exploration')), eq(variables['Build.Reason'], 'Schedule')))) -# pool: -# vmImage: 'Ubuntu-16.04' -# dependsOn: -# - Windows -# - Windows32 -# - Linux -# - LinuxSnap -# - LinuxArmhf -# - LinuxAlpine -# - macOS -# steps: -# - template: release.yml +- job: Release + condition: and(succeeded(), or(eq(variables['VSCODE_RELEASE'], 'true'), and(or(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['VSCODE_QUALITY'], 'exploration')), eq(variables['Build.Reason'], 'Schedule')))) + pool: + vmImage: 'Ubuntu-16.04' + dependsOn: + - Windows + - Windows32 + - Linux + - LinuxSnap + - LinuxArmhf + - LinuxAlpine + - macOS + steps: + - template: release.yml -# - job: Mooncake -# pool: -# vmImage: 'Ubuntu-16.04' -# condition: true -# dependsOn: -# - Windows -# - Windows32 -# - Linux -# - LinuxSnap -# - LinuxArmhf -# - LinuxAlpine -# - macOS -# steps: -# - template: sync-mooncake.yml +- job: Mooncake + pool: + vmImage: 'Ubuntu-16.04' + condition: true + dependsOn: + - Windows + - Windows32 + - Linux + - LinuxSnap + - LinuxArmhf + - LinuxAlpine + - macOS + steps: + - template: sync-mooncake.yml # schedules: # - cron: "0 6 * * Mon-Fri" diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 799599251a8..adaf578be48 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -1,4 +1,17 @@ steps: +- script: | + mkdir .build -ea 0 + echo $env:BUILD_SOURCEVERSION > .build\commit + displayName: Prepare cache flag + +- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + inputs: + keyfile: '.build/commit' + targetfolder: '.build, **/out-build' + vstsFeed: 'npm-vscode' + platformIndependent: true + alias: 'Compilation' + - task: NodeTool@0 inputs: versionSpec: "10.15.1" @@ -73,14 +86,6 @@ steps: exec { yarn gulp mixin } displayName: Mix in quality -- powershell: | - . build/azure-pipelines/win32/exec.ps1 - $ErrorActionPreference = "Stop" - exec { yarn gulp hygiene } - exec { yarn monaco-compile-check } - displayName: Run hygiene checks - condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - - powershell: | . build/azure-pipelines/win32/exec.ps1 $ErrorActionPreference = "Stop" @@ -89,28 +94,10 @@ steps: exec { node build/lib/builtInExtensions.js } displayName: Install distro dependencies and extensions -- powershell: | - . build/azure-pipelines/win32/exec.ps1 - $ErrorActionPreference = "Stop" - cd $env:BUILD_STAGINGDIRECTORY - git clone https://github.com/microsoft/vscode-telemetry-extractor.git - cd vscode-telemetry-extractor - git checkout 3b04aba5bfdfcca1a5426cd2c51a90d18740d0bc - npm i - npm run setup-extension-repos - node .\out\cli-extract.js --sourceDir $env:BUILD_SOURCESDIRECTORY --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents - node .\out\cli-extract-extensions.js --sourceDir .\src\telemetry-sources --outputDir . --applyEndpoints --includeIsMeasurement - mkdir $env:BUILD_SOURCESDIRECTORY\.build\telemetry -ea 0 - mv declarations-resolved.json $env:BUILD_SOURCESDIRECTORY\.build\telemetry\telemetry-core.json - mv declarations-extensions-resolved.json $env:BUILD_SOURCESDIRECTORY\.build\telemetry\telemetry-extensions.json - displayName: Extract Telemetry - - powershell: | . build/azure-pipelines/win32/exec.ps1 $ErrorActionPreference = "Stop" $env:VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" - exec { yarn gulp compile-build } - exec { yarn gulp compile-extensions-build } exec { yarn gulp "vscode-win32-$env:VSCODE_ARCH-min-ci" } exec { yarn gulp "vscode-reh-win32-$env:VSCODE_ARCH-min-ci" } exec { yarn gulp "vscode-web-win32-$env:VSCODE_ARCH-min-ci" } From fd006698322753cdfa8605659ecd668f4cdc084c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 22:01:07 +0200 Subject: [PATCH 1033/1449] remove unnecessary step --- build/azure-pipelines/darwin/product-build-darwin.yml | 3 +-- build/azure-pipelines/linux/product-build-linux.yml | 3 +-- build/azure-pipelines/win32/product-build-win32.yml | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index ebbf9f58a28..28155d5dee4 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -82,8 +82,7 @@ steps: set -e node build/azure-pipelines/common/installDistroDependencies.js node build/azure-pipelines/common/installDistroDependencies.js remote - node build/lib/builtInExtensions.js - displayName: Install distro dependencies and extensions + displayName: Install distro dependencies - script: | set -e diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index d01a6fee819..9cabd785583 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -83,8 +83,7 @@ steps: set -e node build/azure-pipelines/common/installDistroDependencies.js node build/azure-pipelines/common/installDistroDependencies.js remote - node build/lib/builtInExtensions.js - displayName: Install distro dependencies and extensions + displayName: Install distro dependencies - script: | set -e diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index adaf578be48..8f4438df139 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -91,8 +91,7 @@ steps: $ErrorActionPreference = "Stop" exec { node build/azure-pipelines/common/installDistroDependencies.js } exec { node build/azure-pipelines/common/installDistroDependencies.js remote } - exec { node build/lib/builtInExtensions.js } - displayName: Install distro dependencies and extensions + displayName: Install distro dependencies - powershell: | . build/azure-pipelines/win32/exec.ps1 From f31569c730728923bb8413950ebc1492048320ed Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 22:03:08 +0200 Subject: [PATCH 1034/1449] fix build dependencies --- build/azure-pipelines/product-build.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 13c477da9a1..22cb82c06ef 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -23,6 +23,8 @@ jobs: vmImage: VS2017-Win2016 variables: VSCODE_ARCH: x64 + dependsOn: + - Compile steps: - template: win32/product-build-win32.yml @@ -33,6 +35,8 @@ jobs: vmImage: VS2017-Win2016 variables: VSCODE_ARCH: ia32 + dependsOn: + - Compile steps: - template: win32/product-build-win32.yml @@ -68,6 +72,8 @@ jobs: vmImage: 'Ubuntu-16.04' variables: VSCODE_ARCH: armhf + dependsOn: + - Compile steps: - template: linux/product-build-linux-arm.yml @@ -78,6 +84,8 @@ jobs: vmImage: 'Ubuntu-16.04' variables: VSCODE_ARCH: alpine + dependsOn: + - Compile steps: - template: linux/product-build-linux-alpine.yml @@ -86,6 +94,8 @@ jobs: timeoutInMinutes: 120 pool: vmImage: macOS 10.13 + dependsOn: + - Compile steps: - template: darwin/product-build-darwin.yml From 82fd1cf2602351489b1bc2fe0fcc124d8f7fa8c3 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 22:04:25 +0200 Subject: [PATCH 1035/1449] fix mooncake condition --- build/azure-pipelines/product-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 22cb82c06ef..359cc1e7faa 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -117,7 +117,7 @@ jobs: - job: Mooncake pool: vmImage: 'Ubuntu-16.04' - condition: true + condition: succeededOrFailed() dependsOn: - Windows - Windows32 From 2053c252812424803f4bac5e3ed415befac27e37 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 22:44:13 +0200 Subject: [PATCH 1036/1449] fail build if compilation cache is not restored --- build/azure-pipelines/darwin/product-build-darwin.yml | 6 ++++++ build/azure-pipelines/linux/product-build-linux-alpine.yml | 6 ++++++ build/azure-pipelines/linux/product-build-linux-arm.yml | 6 ++++++ build/azure-pipelines/linux/product-build-linux.yml | 6 ++++++ build/azure-pipelines/win32/product-build-win32.yml | 6 ++++++ 5 files changed, 30 insertions(+) diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index 28155d5dee4..97de15d0fd6 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -12,6 +12,12 @@ steps: platformIndependent: true alias: 'Compilation' +- script: | + set -e + exit 1 + displayName: Check RestoreCache + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + - task: NodeTool@0 inputs: versionSpec: "10.15.1" diff --git a/build/azure-pipelines/linux/product-build-linux-alpine.yml b/build/azure-pipelines/linux/product-build-linux-alpine.yml index a77735fd7dd..e9efbfa847c 100644 --- a/build/azure-pipelines/linux/product-build-linux-alpine.yml +++ b/build/azure-pipelines/linux/product-build-linux-alpine.yml @@ -12,6 +12,12 @@ steps: platformIndependent: true alias: 'Compilation' +- script: | + set -e + exit 1 + displayName: Check RestoreCache + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + - task: NodeTool@0 inputs: versionSpec: "10.15.1" diff --git a/build/azure-pipelines/linux/product-build-linux-arm.yml b/build/azure-pipelines/linux/product-build-linux-arm.yml index ccdaa72599d..61d3213a200 100644 --- a/build/azure-pipelines/linux/product-build-linux-arm.yml +++ b/build/azure-pipelines/linux/product-build-linux-arm.yml @@ -12,6 +12,12 @@ steps: platformIndependent: true alias: 'Compilation' +- script: | + set -e + exit 1 + displayName: Check RestoreCache + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + - task: NodeTool@0 inputs: versionSpec: "10.15.1" diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 9cabd785583..5156429dbd4 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -12,6 +12,12 @@ steps: platformIndependent: true alias: 'Compilation' +- script: | + set -e + exit 1 + displayName: Check RestoreCache + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + - task: NodeTool@0 inputs: versionSpec: "10.15.1" diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 8f4438df139..b16186ed584 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -12,6 +12,12 @@ steps: platformIndependent: true alias: 'Compilation' +- powershell: | + $ErrorActionPreference = "Stop" + exit 1 + displayName: Check RestoreCache + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + - task: NodeTool@0 inputs: versionSpec: "10.15.1" From 17b15afc0e2f8a15b01b50fe650a1b2be65bdf1d Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 22:47:27 +0200 Subject: [PATCH 1037/1449] fix windows cache key --- build/azure-pipelines/win32/product-build-win32.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index b16186ed584..5983f19da6a 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -1,7 +1,7 @@ steps: - script: | mkdir .build -ea 0 - echo $env:BUILD_SOURCEVERSION > .build\commit + "$env:BUILD_SOURCEVERSION`n" | Out-File -NoNewLine .build\commit displayName: Prepare cache flag - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 From 67a68265168c47fb5acae31a6007a6a7679a42d0 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 3 Jul 2019 23:04:54 +0200 Subject: [PATCH 1038/1449] use powershell --- build/azure-pipelines/win32/product-build-win32.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 5983f19da6a..a26696659a5 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -1,5 +1,5 @@ steps: -- script: | +- powershell: | mkdir .build -ea 0 "$env:BUILD_SOURCEVERSION`n" | Out-File -NoNewLine .build\commit displayName: Prepare cache flag From 631e22aa7680a29004650720f44dfac37aca2ec4 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 3 Jul 2019 20:07:28 +0200 Subject: [PATCH 1039/1449] renames --- src/vs/editor/common/model/textModelTokens.ts | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/src/vs/editor/common/model/textModelTokens.ts b/src/vs/editor/common/model/textModelTokens.ts index 7190c5e63b5..c2ae3fbbbfe 100644 --- a/src/vs/editor/common/model/textModelTokens.ts +++ b/src/vs/editor/common/model/textModelTokens.ts @@ -31,44 +31,44 @@ const enum Constants { } class ModelLineTokens { - _state: IState | null; - _lineTokens: ArrayBuffer | null; - _valid: boolean; + public state: IState | null; + public lineTokens: ArrayBuffer | null; + public valid: boolean; constructor(state: IState | null) { - this._state = state; - this._lineTokens = null; - this._valid = false; + this.state = state; + this.lineTokens = null; + this.valid = false; } public deleteBeginning(toChIndex: number): void { - if (this._lineTokens === null || this._lineTokens === EMPTY_LINE_TOKENS) { + if (this.lineTokens === null || this.lineTokens === EMPTY_LINE_TOKENS) { return; } this.delete(0, toChIndex); } public deleteEnding(fromChIndex: number): void { - if (this._lineTokens === null || this._lineTokens === EMPTY_LINE_TOKENS) { + if (this.lineTokens === null || this.lineTokens === EMPTY_LINE_TOKENS) { return; } - const tokens = new Uint32Array(this._lineTokens); + const tokens = new Uint32Array(this.lineTokens); const lineTextLength = tokens[tokens.length - 2]; this.delete(fromChIndex, lineTextLength); } public delete(fromChIndex: number, toChIndex: number): void { - if (this._lineTokens === null || this._lineTokens === EMPTY_LINE_TOKENS || fromChIndex === toChIndex) { + if (this.lineTokens === null || this.lineTokens === EMPTY_LINE_TOKENS || fromChIndex === toChIndex) { return; } - const tokens = new Uint32Array(this._lineTokens); + const tokens = new Uint32Array(this.lineTokens); const tokensCount = (tokens.length >>> 1); // special case: deleting everything if (fromChIndex === 0 && tokens[tokens.length - 2] === toChIndex) { - this._lineTokens = EMPTY_LINE_TOKENS; + this.lineTokens = EMPTY_LINE_TOKENS; return; } @@ -113,26 +113,26 @@ class ModelLineTokens { let tmp = new Uint32Array(dest); tmp.set(tokens.subarray(0, dest), 0); - this._lineTokens = tmp.buffer; + this.lineTokens = tmp.buffer; } public append(_otherTokens: ArrayBuffer | null): void { if (_otherTokens === EMPTY_LINE_TOKENS) { return; } - if (this._lineTokens === EMPTY_LINE_TOKENS) { - this._lineTokens = _otherTokens; + if (this.lineTokens === EMPTY_LINE_TOKENS) { + this.lineTokens = _otherTokens; return; } - if (this._lineTokens === null) { + if (this.lineTokens === null) { return; } if (_otherTokens === null) { // cannot determine combined line length... - this._lineTokens = null; + this.lineTokens = null; return; } - const myTokens = new Uint32Array(this._lineTokens); + const myTokens = new Uint32Array(this.lineTokens); const otherTokens = new Uint32Array(_otherTokens); const otherTokensCount = (otherTokens.length >>> 1); @@ -144,16 +144,16 @@ class ModelLineTokens { result[dest++] = otherTokens[(i << 1)] + delta; result[dest++] = otherTokens[(i << 1) + 1]; } - this._lineTokens = result.buffer; + this.lineTokens = result.buffer; } public insert(chIndex: number, textLength: number): void { - if (!this._lineTokens) { + if (!this.lineTokens) { // nothing to do return; } - const tokens = new Uint32Array(this._lineTokens); + const tokens = new Uint32Array(this.lineTokens); const tokensCount = (tokens.length >>> 1); let fromTokenIndex = LineTokens.findIndexInTokensArray(tokens, chIndex); @@ -211,7 +211,7 @@ export class TokensStore implements ITokensStore { public getTokens(topLevelLanguageId: LanguageId, lineIndex: number, lineText: string): LineTokens { let rawLineTokens: ArrayBuffer | null = null; if (lineIndex < this._tokens.length && this._tokens[lineIndex]) { - rawLineTokens = this._tokens[lineIndex]._lineTokens; + rawLineTokens = this._tokens[lineIndex].lineTokens; } if (rawLineTokens !== null && rawLineTokens !== EMPTY_LINE_TOKENS) { @@ -234,20 +234,20 @@ export class TokensStore implements ITokensStore { private _setIsValid(lineIndex: number, valid: boolean): void { if (lineIndex < this._tokens.length && this._tokens[lineIndex]) { - this._tokens[lineIndex]._valid = valid; + this._tokens[lineIndex].valid = valid; } } private _isValid(lineIndex: number): boolean { if (lineIndex < this._tokens.length && this._tokens[lineIndex]) { - return this._tokens[lineIndex]._valid; + return this._tokens[lineIndex].valid; } return false; } public getState(lineIndex: number): IState | null { if (lineIndex < this._tokens.length && this._tokens[lineIndex]) { - return this._tokens[lineIndex]._state; + return this._tokens[lineIndex].state; } return null; } @@ -268,7 +268,7 @@ export class TokensStore implements ITokensStore { } if (!hasDifferentLanguageId) { - target._lineTokens = EMPTY_LINE_TOKENS; + target.lineTokens = EMPTY_LINE_TOKENS; return; } } @@ -281,7 +281,7 @@ export class TokensStore implements ITokensStore { LineTokens.convertToEndOffset(tokens, lineTextLength); - target._lineTokens = tokens.buffer; + target.lineTokens = tokens.buffer; } public setGoodTokens(topLevelLanguageId: LanguageId, linesLength: number, lineIndex: number, text: string, r: TokenizationResult2): void { @@ -322,7 +322,7 @@ export class TokensStore implements ITokensStore { public setState(lineIndex: number, state: IState): void { if (lineIndex < this._tokens.length && this._tokens[lineIndex]) { - this._tokens[lineIndex]._state = state; + this._tokens[lineIndex].state = state; } else { const tmp = new ModelLineTokens(state); this._tokens[lineIndex] = tmp; @@ -374,7 +374,7 @@ export class TokensStore implements ITokensStore { if (lastLineIndex < this._tokens.length) { const lastLine = this._tokens[lastLineIndex]; lastLine.deleteBeginning(range.endColumn - 1); - lastLineTokens = lastLine._lineTokens; + lastLineTokens = lastLine.lineTokens; } // Take remaining text on last line and append it to remaining text on first line From 7f833a9163326739600ccfa0cbad76af59080b43 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 3 Jul 2019 23:19:58 +0200 Subject: [PATCH 1040/1449] More cleanup in tokens code --- src/vs/editor/common/model/textModelTokens.ts | 218 +++++++++--------- .../test/common/model/model.line.test.ts | 12 +- 2 files changed, 115 insertions(+), 115 deletions(-) diff --git a/src/vs/editor/common/model/textModelTokens.ts b/src/vs/editor/common/model/textModelTokens.ts index c2ae3fbbbfe..3c02042e7bf 100644 --- a/src/vs/editor/common/model/textModelTokens.ts +++ b/src/vs/editor/common/model/textModelTokens.ts @@ -31,12 +31,12 @@ const enum Constants { } class ModelLineTokens { - public state: IState | null; + public beginState: IState | null; public lineTokens: ArrayBuffer | null; public valid: boolean; - constructor(state: IState | null) { - this.state = state; + constructor() { + this.beginState = null; this.lineTokens = null; this.valid = false; } @@ -167,18 +167,30 @@ class ModelLineTokens { tokens[tokenIndex << 1] += textLength; } } + + public setTokens(lineTokens: ArrayBuffer | null, valid: boolean): void { + this.lineTokens = lineTokens; + this.valid = valid; + } + + public setBeginState(beginState: IState | null): void { + this.beginState = beginState; + } + + public invalidate(): void { + this.valid = false; + } } export interface ITokensStore { - _invalidLineStartIndex: number; readonly invalidLineStartIndex: number; + setGoodTokens(topLevelLanguageId: LanguageId, linesLength: number, lineIndex: number, lineTextLength: number, r: TokenizationResult2): void; + setFakeTokens(topLevelLanguageId: LanguageId, lineIndex: number, lineTextLength: number, r: TokenizationResult2): void; + getTokens(topLevelLanguageId: LanguageId, lineIndex: number, lineText: string): LineTokens; - invalidateLine(lineIndex: number): void; - getState(lineIndex: number): IState | null; - setTokens(topLevelLanguageId: LanguageId, lineIndex: number, lineTextLength: number, tokens: Uint32Array): void; - setGoodTokens(topLevelLanguageId: LanguageId, linesLength: number, lineIndex: number, text: string, r: TokenizationResult2): void; - setState(lineIndex: number, state: IState): void; + getBeginState(lineIndex: number): IState | null; + applyEdits(range: Range, eolCount: number, firstLineLength: number): void; _getAllStates(linesLength: number): (IState | null)[]; @@ -187,7 +199,7 @@ export interface ITokensStore { export class TokensStore implements ITokensStore { private _tokens: ModelLineTokens[]; - _invalidLineStartIndex: number; + private _invalidLineStartIndex: number; private _lastState: IState | null; constructor(initialState: IState | null) { @@ -200,7 +212,7 @@ export class TokensStore implements ITokensStore { this._lastState = null; if (initialState) { - this._tokens[0] = new ModelLineTokens(initialState); + this._setBeginState(0, initialState); } } @@ -210,7 +222,7 @@ export class TokensStore implements ITokensStore { public getTokens(topLevelLanguageId: LanguageId, lineIndex: number, lineText: string): LineTokens { let rawLineTokens: ArrayBuffer | null = null; - if (lineIndex < this._tokens.length && this._tokens[lineIndex]) { + if (lineIndex < this._tokens.length) { rawLineTokens = this._tokens[lineIndex].lineTokens; } @@ -224,43 +236,31 @@ export class TokensStore implements ITokensStore { return new LineTokens(lineTokens, lineText); } - public invalidateLine(lineIndex: number): void { - this._setIsValid(lineIndex, false); + private _invalidateLine(lineIndex: number): void { + if (lineIndex < this._tokens.length) { + this._tokens[lineIndex].invalidate(); + } + if (lineIndex < this._invalidLineStartIndex) { - this._setIsValid(this._invalidLineStartIndex, false); this._invalidLineStartIndex = lineIndex; } } - private _setIsValid(lineIndex: number, valid: boolean): void { - if (lineIndex < this._tokens.length && this._tokens[lineIndex]) { - this._tokens[lineIndex].valid = valid; - } - } - private _isValid(lineIndex: number): boolean { - if (lineIndex < this._tokens.length && this._tokens[lineIndex]) { + if (lineIndex < this._tokens.length) { return this._tokens[lineIndex].valid; } return false; } - public getState(lineIndex: number): IState | null { - if (lineIndex < this._tokens.length && this._tokens[lineIndex]) { - return this._tokens[lineIndex].state; + public getBeginState(lineIndex: number): IState | null { + if (lineIndex < this._tokens.length) { + return this._tokens[lineIndex].beginState; } return null; } - public setTokens(topLevelLanguageId: LanguageId, lineIndex: number, lineTextLength: number, tokens: Uint32Array): void { - let target: ModelLineTokens; - if (lineIndex < this._tokens.length && this._tokens[lineIndex]) { - target = this._tokens[lineIndex]; - } else { - target = new ModelLineTokens(null); - this._tokens[lineIndex] = target; - } - + private static _massageTokens(topLevelLanguageId: LanguageId, lineTextLength: number, tokens: Uint32Array): ArrayBuffer { if (lineTextLength === 0) { let hasDifferentLanguageId = false; if (tokens && tokens.length > 1) { @@ -268,8 +268,7 @@ export class TokensStore implements ITokensStore { } if (!hasDifferentLanguageId) { - target.lineTokens = EMPTY_LINE_TOKENS; - return; + return EMPTY_LINE_TOKENS; } } @@ -281,52 +280,62 @@ export class TokensStore implements ITokensStore { LineTokens.convertToEndOffset(tokens, lineTextLength); - target.lineTokens = tokens.buffer; + return tokens.buffer; } - public setGoodTokens(topLevelLanguageId: LanguageId, linesLength: number, lineIndex: number, text: string, r: TokenizationResult2): void { - const endStateIndex = lineIndex + 1; - this.setTokens(topLevelLanguageId, lineIndex, text.length, r.tokens); - this._setIsValid(lineIndex, true); + private _getOrCreate(lineIndex: number): ModelLineTokens { + if (lineIndex < this._tokens.length) { + return this._tokens[lineIndex]; + } + while (lineIndex > this._tokens.length) { + this._tokens[this._tokens.length] = new ModelLineTokens(); + } + const result = new ModelLineTokens(); + this._tokens[lineIndex] = result; + return result; + } - if (endStateIndex < linesLength) { - const previousEndState = this.getState(endStateIndex); - if (previousEndState !== null && r.endState.equals(previousEndState)) { - // The end state of this line remains the same - let nextInvalidLineIndex = lineIndex + 1; - while (nextInvalidLineIndex < linesLength) { - if (!this._isValid(nextInvalidLineIndex)) { - break; - } - if (nextInvalidLineIndex + 1 < linesLength) { - if (this.getState(nextInvalidLineIndex + 1) === null) { - break; - } - } else { - if (this._lastState === null) { - break; - } - } - nextInvalidLineIndex++; - } - this._invalidLineStartIndex = nextInvalidLineIndex; - } else { - this._invalidLineStartIndex = lineIndex + 1; - this.setState(endStateIndex, r.endState); - } - } else { + private _setTokens(lineIndex: number, tokens: ArrayBuffer | null, valid: boolean): void { + this._getOrCreate(lineIndex).setTokens(tokens, valid); + } + + private _setBeginState(lineIndex: number, beginState: IState | null): void { + this._getOrCreate(lineIndex).setBeginState(beginState); + } + + public setGoodTokens(topLevelLanguageId: LanguageId, linesLength: number, lineIndex: number, lineTextLength: number, r: TokenizationResult2): void { + const tokens = TokensStore._massageTokens(topLevelLanguageId, lineTextLength, r.tokens); + this._setTokens(lineIndex, tokens, true); + this._invalidLineStartIndex = lineIndex + 1; + + // Check if this was the last line + if (lineIndex === linesLength - 1) { this._lastState = r.endState; - this._invalidLineStartIndex = linesLength; + return; } + + // Check if the end state has changed + const previousEndState = this.getBeginState(lineIndex + 1); + if (previousEndState === null || !r.endState.equals(previousEndState)) { + this._setBeginState(lineIndex + 1, r.endState); + this._invalidateLine(lineIndex + 1); + return; + } + + // Perhaps we can skip tokenizing some lines... + let i = lineIndex + 1; + while (i < linesLength) { + if (!this._isValid(i)) { + break; + } + i++; + } + this._invalidLineStartIndex = i; } - public setState(lineIndex: number, state: IState): void { - if (lineIndex < this._tokens.length && this._tokens[lineIndex]) { - this._tokens[lineIndex].state = state; - } else { - const tmp = new ModelLineTokens(state); - this._tokens[lineIndex] = tmp; - } + setFakeTokens(topLevelLanguageId: LanguageId, lineIndex: number, lineTextLength: number, r: TokenizationResult2): void { + const tokens = TokensStore._massageTokens(topLevelLanguageId, lineTextLength, r.tokens); + this._setTokens(lineIndex, tokens, false); } //#region Editing @@ -338,14 +347,14 @@ export class TokensStore implements ITokensStore { const editingLinesCnt = Math.min(deletingLinesCnt, insertingLinesCnt); for (let j = editingLinesCnt; j >= 0; j--) { - this.invalidateLine(range.startLineNumber + j - 1); + this._invalidateLine(range.startLineNumber + j - 1); } this._acceptDeleteRange(range); this._acceptInsertText(new Position(range.startLineNumber, range.startColumn), eolCount, firstLineLength); } catch (err) { // emergency recovery => reset tokens - this._reset(this.getState(0)); + this._reset(this.getBeginState(0)); } } @@ -407,8 +416,8 @@ export class TokensStore implements ITokensStore { line.insert(position.column - 1, firstLineLength); let insert: ModelLineTokens[] = new Array(eolCount); - for (let i = eolCount - 1; i >= 0; i--) { - insert[i] = new ModelLineTokens(null); + for (let i = 0; i < eolCount; i++) { + insert[i] = new ModelLineTokens(); } this._tokens = arrays.arrayInsert(this._tokens, position.lineNumber, insert); } @@ -418,7 +427,7 @@ export class TokensStore implements ITokensStore { _getAllStates(linesLength: number): (IState | null)[] { const r: (IState | null)[] = []; for (let i = 0; i < linesLength; i++) { - r[i] = this.getState(i); + r[i] = this.getBeginState(i); } r[linesLength] = this._lastState; return r; @@ -457,6 +466,10 @@ export class ModelLinesTokens implements IModelLinesTokens { } public isCheapToTokenize(store: ITokensStore, buffer: ITextBuffer, lineNumber: number): boolean { + if (!this.tokenizationSupport) { + return true; + } + const firstInvalidLineNumber = store.invalidLineStartIndex + 1; if (lineNumber > firstInvalidLineNumber) { return false; @@ -474,6 +487,10 @@ export class ModelLinesTokens implements IModelLinesTokens { } public hasLinesToTokenize(store: ITokensStore, buffer: ITextBuffer): boolean { + if (!this.tokenizationSupport) { + return false; + } + return (store.invalidLineStartIndex < buffer.getLineCount()); } @@ -490,7 +507,6 @@ export class ModelLinesTokens implements IModelLinesTokens { public updateTokensUntilLine(store: ITokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, lineNumber: number): void { if (!this.tokenizationSupport) { - store._invalidLineStartIndex = buffer.getLineCount(); return; } @@ -500,10 +516,10 @@ export class ModelLinesTokens implements IModelLinesTokens { // Validate all states up to and including endLineIndex for (let lineIndex = store.invalidLineStartIndex; lineIndex <= endLineIndex; lineIndex++) { const text = buffer.getLineContent(lineIndex + 1); - const lineStartState = store.getState(lineIndex); + const lineStartState = store.getBeginState(lineIndex); const r = safeTokenize(this._languageIdentifier, this.tokenizationSupport, text, lineStartState!); - store.setGoodTokens(this._languageIdentifier.id, linesLength, lineIndex, text, r); + store.setGoodTokens(this._languageIdentifier.id, linesLength, lineIndex, text.length, r); eventBuilder.registerChangedTokens(lineIndex + 1); lineIndex = store.invalidLineStartIndex - 1; // -1 because the outer loop increments it } @@ -537,7 +553,7 @@ export class ModelLinesTokens implements IModelLinesTokens { } if (newNonWhitespaceIndex < nonWhitespaceColumn) { - initialState = store.getState(i - 1); + initialState = store.getBeginState(i - 1); if (initialState) { break; } @@ -553,37 +569,15 @@ export class ModelLinesTokens implements IModelLinesTokens { let state = initialState; for (let i = fakeLines.length - 1; i >= 0; i--) { let r = safeTokenize(this._languageIdentifier, this.tokenizationSupport, fakeLines[i], state); - if (r) { - state = r.endState; - } else { - state = initialState; - } + state = r.endState; } - this._fakeTokenizeLines(store, buffer, eventBuilder, state, startLineNumber, endLineNumber); - } - - private _fakeTokenizeLines(store: ITokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, initialState: IState, startLineNumber: number, endLineNumber: number): void { - if (!this.tokenizationSupport) { - return; - } - - let state = initialState; - for (let i = startLineNumber; i <= endLineNumber; i++) { - let text = buffer.getLineContent(i); + for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) { + let text = buffer.getLineContent(lineNumber); let r = safeTokenize(this._languageIdentifier, this.tokenizationSupport, text, state); - if (r) { - store.setTokens(this._languageIdentifier.id, i - 1, text.length, r.tokens); - - // We cannot trust these states/tokens to be valid! - // (see https://github.com/Microsoft/vscode/issues/67607) - store.invalidateLine(i - 1); - store.setState(i - 1, state); - state = r.endState; - eventBuilder.registerChangedTokens(i); - } else { - state = initialState; - } + store.setFakeTokens(this._languageIdentifier.id, lineNumber - 1, text.length, r); + state = r.endState; + eventBuilder.registerChangedTokens(lineNumber); } } diff --git a/src/vs/editor/test/common/model/model.line.test.ts b/src/vs/editor/test/common/model/model.line.test.ts index 3c00d5a72b3..8abea9a595f 100644 --- a/src/vs/editor/test/common/model/model.line.test.ts +++ b/src/vs/editor/test/common/model/model.line.test.ts @@ -9,6 +9,8 @@ import { Range } from 'vs/editor/common/core/range'; import { TextModel } from 'vs/editor/common/model/textModel'; import { LanguageIdentifier, MetadataConsts } from 'vs/editor/common/modes'; import { ViewLineToken, ViewLineTokenFactory } from 'vs/editor/test/common/core/viewLineToken'; +import { TokenizationResult2 } from 'vs/editor/common/core/token'; +import { NULL_STATE } from 'vs/editor/common/modes/nullMode'; interface ILineEdit { startColumn: number; @@ -92,6 +94,10 @@ class TestToken { } } +function toTokenizationResult2(tokens: Uint32Array): TokenizationResult2 { + return new TokenizationResult2(tokens, NULL_STATE); +} + suite('ModelLinesTokens', () => { interface IBufferLineState { @@ -110,7 +116,7 @@ suite('ModelLinesTokens', () => { for (let lineIndex = 0; lineIndex < initial.length; lineIndex++) { const lineTokens = initial[lineIndex].tokens; const lineTextLength = model.getLineMaxColumn(lineIndex + 1) - 1; - model._tokens.setTokens(0, lineIndex, lineTextLength, TestToken.toTokens(lineTokens)); + model._tokens.setFakeTokens(0, lineIndex, lineTextLength, toTokenizationResult2(TestToken.toTokens(lineTokens))); } model.applyEdits(edits.map((ed) => ({ @@ -441,14 +447,14 @@ suite('ModelLinesTokens', () => { test('insertion on empty line', () => { const model = new TextModel('some text', TextModel.DEFAULT_CREATION_OPTIONS, new LanguageIdentifier('test', 0)); - model._tokens.setTokens(0, 0, model.getLineMaxColumn(1) - 1, TestToken.toTokens([new TestToken(0, 1)])); + model._tokens.setFakeTokens(0, 0, model.getLineMaxColumn(1) - 1, toTokenizationResult2(TestToken.toTokens([new TestToken(0, 1)]))); model.applyEdits([{ range: new Range(1, 1, 1, 10), text: '' }]); - model._tokens.setTokens(0, 0, model.getLineMaxColumn(1) - 1, new Uint32Array(0)); + model._tokens.setFakeTokens(0, 0, model.getLineMaxColumn(1) - 1, toTokenizationResult2(new Uint32Array(0))); model.applyEdits([{ range: new Range(1, 1, 1, 1), From 8fb951328d0cece4ac6871f0329e2f3510e3e4bf Mon Sep 17 00:00:00 2001 From: Haneef Mohammed Date: Wed, 3 Jul 2019 14:34:42 -0700 Subject: [PATCH 1041/1449] Revert "Dummy change in comment to restart checks" This reverts commit 9f86032f9124d714558cf8af794a4ba2c393f67d. --- src/vs/workbench/contrib/debug/browser/variablesView.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/debug/browser/variablesView.ts b/src/vs/workbench/contrib/debug/browser/variablesView.ts index c6ae5025f41..b12ac70119b 100644 --- a/src/vs/workbench/contrib/debug/browser/variablesView.ts +++ b/src/vs/workbench/contrib/debug/browser/variablesView.ts @@ -63,7 +63,7 @@ export class VariablesView extends ViewletPanel { this.savedViewState = undefined; } else { if (!stackFrame) { - // We have no stackFrame; save tree state before it is cleared + // We have no stackFrame, save tree state before it is cleared this.savedViewState = this.tree.getViewState(); } this.tree.updateChildren().then(() => { From 80b5a43c7d629fb7c506f796117df026d74e061f Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 3 Jul 2019 23:56:56 +0200 Subject: [PATCH 1042/1449] watch containers --- .../userData/common/fileUserDataProvider.ts | 57 +- .../common/inMemoryUserDataProvider.ts | 29 +- .../services/userData/common/userData.ts | 54 +- .../common/userDataFileSystemProvider.ts | 67 +-- .../fileUserDataProvider.test.ts | 511 +++++++++--------- 5 files changed, 406 insertions(+), 312 deletions(-) diff --git a/src/vs/workbench/services/userData/common/fileUserDataProvider.ts b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts index 79c75f15091..f8540b74506 100644 --- a/src/vs/workbench/services/userData/common/fileUserDataProvider.ts +++ b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts @@ -5,18 +5,19 @@ import { Event, Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; -import { IUserDataProvider } from 'vs/workbench/services/userData/common/userData'; -import { IFileService, FileChangesEvent } from 'vs/platform/files/common/files'; +import { IUserDataProvider, FileChangeEvent, IUserDataContainerRegistry, Extensions } from 'vs/workbench/services/userData/common/userData'; +import { IFileService, FileChangesEvent, FileChangeType } from 'vs/platform/files/common/files'; import { URI } from 'vs/base/common/uri'; import * as resources from 'vs/base/common/resources'; import { VSBuffer } from 'vs/base/common/buffer'; import { startsWith } from 'vs/base/common/strings'; import { BACKUPS } from 'vs/platform/environment/common/environment'; +import { Registry } from 'vs/platform/registry/common/platform'; export class FileUserDataProvider extends Disposable implements IUserDataProvider { - private _onDidChangeFile: Emitter = this._register(new Emitter()); - readonly onDidChangeFile: Event = this._onDidChangeFile.event; + private _onDidChangeFile: Emitter = this._register(new Emitter()); + readonly onDidChangeFile: Event = this._onDidChangeFile.event; constructor( private readonly userDataHome: URI, @@ -25,17 +26,29 @@ export class FileUserDataProvider extends Disposable implements IUserDataProvide super(); // Assumption: This path always exists this._register(this.fileService.watch(this.userDataHome)); - this._register(this.fileService.onFileChanges(e => this.handleFileChanges(e))); + + const userDataContainersRegistry = Registry.as(Extensions.UserDataContainers); + userDataContainersRegistry.containers.forEach(c => this.watchContainer(c)); + this._register(userDataContainersRegistry.onDidRegisterContainer(c => this.watchContainer(c))); } private handleFileChanges(event: FileChangesEvent): void { - const changedPaths: string[] = []; + const changedPaths: FileChangeEvent[] = []; + const userDataContainersRegistry = Registry.as(Extensions.UserDataContainers); for (const change of event.changes) { if (change.resource.scheme === this.userDataHome.scheme) { const path = this.toPath(change.resource); if (path) { - changedPaths.push(path); + changedPaths.push({ + path, + type: change.type + }); + if (userDataContainersRegistry.isContainer(path)) { + if (change.type === FileChangeType.ADDED) { + this.watchContainer(path); + } + } } } } @@ -44,6 +57,17 @@ export class FileUserDataProvider extends Disposable implements IUserDataProvide } } + private async watchContainer(container: string): Promise { + if (this.isBackUpsPath(container)) { + return; + } + const resource = this.toResource(container); + const exists = await this.fileService.exists(resource); + if (exists) { + this._register(this.fileService.watch(resource)); + } + } + async readFile(path: string): Promise { const resource = this.toResource(path); const content = await this.fileService.readFile(resource); @@ -56,8 +80,12 @@ export class FileUserDataProvider extends Disposable implements IUserDataProvide async listFiles(path: string): Promise { const resource = this.toResource(path); - const result = await this.fileService.resolve(resource); - return result.children ? result.children.map(c => this.toRelativePath(c.resource, resource)!) : []; + try { + const result = await this.fileService.resolve(resource); + return result.children ? result.children.map(c => this.toRelativePath(c.resource, resource)!) : []; + } catch (error) { + } + return []; } deleteFile(path: string): Promise { @@ -65,12 +93,16 @@ export class FileUserDataProvider extends Disposable implements IUserDataProvide } private toResource(path: string): URI { - if (path === BACKUPS || startsWith(path, `${BACKUPS}/`)) { + if (this.isBackUpsPath(path)) { return resources.joinPath(resources.dirname(this.userDataHome), path); } return resources.joinPath(this.userDataHome, path); } + private isBackUpsPath(path: string): boolean { + return path === BACKUPS || startsWith(path, `${BACKUPS}/`); + } + private toPath(resource: URI): string | undefined { let result = this.toRelativePath(resource, this.userDataHome); if (result === undefined) { @@ -82,9 +114,6 @@ export class FileUserDataProvider extends Disposable implements IUserDataProvide private toRelativePath(fromResource: URI, toResource: URI): string | undefined { const fromPath = fromResource.toString(); const toPath = toResource.toString(); - if (startsWith(fromPath, toPath)) { - return fromPath.substr(toPath.length + 1); - } - return undefined; + return startsWith(fromPath, toPath) ? fromPath.substr(toPath.length + 1) : undefined; } } \ No newline at end of file diff --git a/src/vs/workbench/services/userData/common/inMemoryUserDataProvider.ts b/src/vs/workbench/services/userData/common/inMemoryUserDataProvider.ts index 3e477e0a0f4..9693eaa5e00 100644 --- a/src/vs/workbench/services/userData/common/inMemoryUserDataProvider.ts +++ b/src/vs/workbench/services/userData/common/inMemoryUserDataProvider.ts @@ -5,14 +5,15 @@ import { Event, Emitter } from 'vs/base/common/event'; import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; -import { IUserDataProvider } from 'vs/workbench/services/userData/common/userData'; +import { IUserDataProvider, FileChangeEvent } from 'vs/workbench/services/userData/common/userData'; import { VSBuffer } from 'vs/base/common/buffer'; +import { FileChangeType } from 'vs/platform/files/common/files'; export class InMemoryUserDataProvider extends Disposable implements IUserDataProvider { _serviceBrand: any; - private _onDidChangeFile: Emitter = this._register(new Emitter()); - readonly onDidChangeFile: Event = this._onDidChangeFile.event; + private _onDidChangeFile: Emitter = this._register(new Emitter()); + readonly onDidChangeFile: Event = this._onDidChangeFile.event; private readonly store: Map = new Map(); @@ -26,29 +27,25 @@ export class InMemoryUserDataProvider extends Disposable implements IUserDataPro } async readFile(path: string): Promise { - return VSBuffer.fromString(this.getValue(path)).buffer; + if (this.store.has(path)) { + return VSBuffer.fromString(this.store.get(path)!).buffer; + } + throw new Error(`Not Found: ${path}`); } async writeFile(path: string, value: Uint8Array): Promise { + const exists = this.store.has(path); const content = VSBuffer.wrap(value).toString(); - if (content !== this.getValue(path)) { - if (content) { - this.store.set(path, content); - this._onDidChangeFile.fire([path]); - } else { - this.deleteFile(path); - } + if (!exists || content !== this.store.get(path)) { + this.store.set(path, content); + this._onDidChangeFile.fire([{ path, type: exists ? FileChangeType.UPDATED : FileChangeType.ADDED }]); } } async deleteFile(path: string): Promise { if (this.store.has(path)) { this.store.delete(path); - this._onDidChangeFile.fire([path]); + this._onDidChangeFile.fire([{ path, type: FileChangeType.DELETED }]); } } - - private getValue(key: string): string { - return this.store.get(key) || ''; - } } \ No newline at end of file diff --git a/src/vs/workbench/services/userData/common/userData.ts b/src/vs/workbench/services/userData/common/userData.ts index ae21a5c8bd3..438d6339e30 100644 --- a/src/vs/workbench/services/userData/common/userData.ts +++ b/src/vs/workbench/services/userData/common/userData.ts @@ -3,9 +3,26 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Event } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { TernarySearchTree } from 'vs/base/common/map'; import { Registry } from 'vs/platform/registry/common/platform'; +import { FileChangeType } from 'vs/platform/files/common/files'; + +/** + * The event user data providers must use to signal a file change. + */ +export interface FileChangeEvent { + + /** + * The type of change. + */ + readonly type: FileChangeType; + + /** + * The path of the file that has changed. + */ + readonly path: string; +} /** * The userDataProvider is used to handle user specific application @@ -29,10 +46,9 @@ import { Registry } from 'vs/platform/registry/common/platform'; export interface IUserDataProvider { /** - * Emitted when one ore more files are added, changed or deleted. The event provides - * an array of paths of these files. + * An event to signal that a file has been created, changed, or deleted. */ - readonly onDidChangeFile: Event; + readonly onDidChangeFile: Event; /** * Read the file contents of the given path. @@ -67,6 +83,16 @@ export interface IUserDataProvider { export interface IUserDataContainerRegistry { + /** + * An event to signal that a container has been registered. + */ + readonly onDidRegisterContainer: Event; + + /** + * Registered containers + */ + readonly containers: string[]; + /** * Register the given path as an user data container if user data files are stored under this path. * @@ -75,21 +101,33 @@ export interface IUserDataContainerRegistry { registerContainer(path: string): void; /** - * Returns true if the given path is an user data container. + * Returns true if the given path is an user data container or sub container of user data container */ isContainer(path: string): boolean; } class UserDataContainerRegistry implements IUserDataContainerRegistry { - private containers: TernarySearchTree = TernarySearchTree.forStrings(); + private _containers: TernarySearchTree = TernarySearchTree.forStrings(); + + private _onDidRegisterContainer: Emitter = new Emitter(); + readonly onDidRegisterContainer: Event = this._onDidRegisterContainer.event; + + get containers(): string[] { + const containers: string[] = []; + this._containers.forEach(c => containers.push(c)); + return containers; + } public registerContainer(path: string): void { - this.containers.set(path, path); + if (!this._containers.get(path)) { + this._containers.set(path, path); + this._onDidRegisterContainer.fire(path); + } } isContainer(path: string): boolean { - return !!this.containers.get(path) || !!this.containers.findSuperstr(path); + return !!this._containers.get(path) || !!this._containers.findSuperstr(path); } } diff --git a/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts b/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts index 8db1719ed90..cda54263b2c 100644 --- a/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts +++ b/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts @@ -4,13 +4,13 @@ *--------------------------------------------------------------------------------------------*/ import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; -import { FileSystemProviderCapabilities, FileWriteOptions, IStat, FileType, FileDeleteOptions, IWatchOptions, FileOverwriteOptions, IFileSystemProviderWithFileReadWriteCapability, IFileChange, FileChangesEvent, FileChangeType } from 'vs/platform/files/common/files'; -import { IUserDataProvider, IUserDataContainerRegistry, Extensions } from 'vs/workbench/services/userData/common/userData'; +import { FileSystemProviderCapabilities, FileWriteOptions, IStat, FileType, FileDeleteOptions, IWatchOptions, FileOverwriteOptions, IFileSystemProviderWithFileReadWriteCapability, IFileChange, FileChangeType, FileChangesEvent } from 'vs/platform/files/common/files'; +import { IUserDataProvider, IUserDataContainerRegistry, Extensions, FileChangeEvent } from 'vs/workbench/services/userData/common/userData'; import { URI } from 'vs/base/common/uri'; import { Event, Emitter } from 'vs/base/common/event'; -import { TernarySearchTree } from 'vs/base/common/map'; import { startsWith } from 'vs/base/common/strings'; import { Registry } from 'vs/platform/registry/common/platform'; +import { joinPath, isEqual } from 'vs/base/common/resources'; export class UserDataFileSystemProvider extends Disposable implements IFileSystemProviderWithFileReadWriteCapability { @@ -22,12 +22,22 @@ export class UserDataFileSystemProvider extends Disposable implements IFileSyste private readonly _onDidChangeFile: Emitter = this._register(new Emitter()); readonly onDidChangeFile: Event = this._onDidChangeFile.event; - constructor( private readonly userDataHome: URI, private readonly userDataProvider: IUserDataProvider ) { super(); + this._register(this.userDataProvider.onDidChangeFile(changes => this.onDidChangeUserData(changes))); + } + + private onDidChangeUserData(changes: FileChangeEvent[]): void { + for (const { path, type } of changes) { + if (type === FileChangeType.DELETED) { + this.versions.delete(path); + } else { + this.versions.set(path, this.getOrSetVersion(path) + 1); + } + } } watch(resource: URI, opts: IWatchOptions): IDisposable { @@ -35,10 +45,19 @@ export class UserDataFileSystemProvider extends Disposable implements IFileSyste if (!path) { throw new Error(`Invalid user data resource ${resource}`); } - return this.userDataProvider.onDidChangeFile(e => { - if (new UserDataChangesEvent(e).contains(path)) { - this.versions.set(path, this.getOrSetVersion(path) + 1); - this._onDidChangeFile.fire(new FileChangesEvent([{ resource, type: FileChangeType.UPDATED }]).changes); + return this.userDataProvider.onDidChangeFile(changes => { + const fileChanges: IFileChange[] = []; + for (const { path, type } of changes) { + const changedResource = this.toResource(path); + if (isEqual(changedResource, resource) || this.toRelativePath(changedResource, resource)) { + fileChanges.push({ + resource: changedResource, + type + }); + } + } + if (fileChanges.length) { + this._onDidChangeFile.fire(new FileChangesEvent(fileChanges).changes); } }); } @@ -127,31 +146,17 @@ export class UserDataFileSystemProvider extends Disposable implements IFileSyste return Registry.as(Extensions.UserDataContainers).isContainer(path); } + private toResource(path: string): URI { + return joinPath(this.userDataHome, path); + } + private toPath(resource: URI): string | undefined { - const resourcePath = resource.toString(); - const userDataHomePath = this.userDataHome.toString(); - return startsWith(resourcePath, userDataHomePath) ? resourcePath.substr(userDataHomePath.length + 1) : undefined; - } -} - -class UserDataChangesEvent { - - private _pathsTree: TernarySearchTree | undefined = undefined; - - constructor(readonly paths: string[]) { } - - private get pathsTree(): TernarySearchTree { - if (!this._pathsTree) { - this._pathsTree = TernarySearchTree.forPaths(); - for (const path of this.paths) { - this._pathsTree.set(path, path); - } - } - return this._pathsTree; + return this.toRelativePath(resource, this.userDataHome); } - contains(pathOrSegment: string): boolean { - return this.pathsTree.findSubstr(pathOrSegment) !== undefined; + private toRelativePath(fromResource: URI, toResource: URI): string | undefined { + const fromPath = fromResource.toString(); + const toPath = toResource.toString(); + return startsWith(fromPath, toPath) ? fromPath.substr(toPath.length + 1) : undefined; } - } \ No newline at end of file diff --git a/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts b/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts index c0817b219ab..807e4c40423 100644 --- a/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts +++ b/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts @@ -8,7 +8,7 @@ import * as os from 'os'; import * as path from 'vs/base/common/path'; import * as uuid from 'vs/base/common/uuid'; import * as pfs from 'vs/base/node/pfs'; -import { IFileService } from 'vs/platform/files/common/files'; +import { IFileService, FileChangeType } from 'vs/platform/files/common/files'; import { FileService } from 'vs/workbench/services/files/common/fileService'; import { NullLogService } from 'vs/platform/log/common/log'; import { Schemas } from 'vs/base/common/network'; @@ -22,7 +22,6 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IUserDataContainerRegistry, Extensions } from 'vs/workbench/services/userData/common/userData'; import { BACKUPS } from 'vs/platform/environment/common/environment'; import { DisposableStore } from 'vs/base/common/lifecycle'; -import { isLinux } from 'vs/base/common/platform'; suite('FileUserDataProvider', () => { @@ -102,94 +101,6 @@ suite('FileUserDataProvider', () => { assert.equal(result, '{a:1}'); }); - test('watch file - event is triggerred when file is created', async (done) => { - if (!isLinux) { - return done(); // watch tests are flaky on other platforms - } - const resource = joinPath(userDataResource, 'settings.json'); - disposables.add(testObject.watch(resource)); - testObject.onFileChanges(e => { - if (e.contains(resource)) { - done(); - } - }); - await testObject.writeFile(resource, VSBuffer.fromString('{a:1}')); - }); - - test('watch file - event is triggerred when file is created externally', async (done) => { - if (!isLinux) { - return done(); // watch tests are flaky on other platforms - } - const resource = joinPath(userDataResource, 'settings.json'); - disposables.add(testObject.watch(resource)); - testObject.onFileChanges(e => { - if (e.contains(resource)) { - done(); - } - }); - await pfs.writeFile(path.join(userDataPath, 'settings.json'), '{}'); - }); - - test('watch file - event is triggerred when file is updated', async (done) => { - if (!isLinux) { - return done(); // watch tests are flaky on other platforms - } - const resource = joinPath(userDataResource, 'settings.json'); - await testObject.writeFile(resource, VSBuffer.fromString('{}')); - disposables.add(testObject.watch(resource)); - testObject.onFileChanges(e => { - if (e.contains(resource)) { - done(); - } - }); - await testObject.writeFile(resource, VSBuffer.fromString('{a:1}')); - }); - - test('watch file - event is triggerred when file is update externally', async (done) => { - if (!isLinux) { - return done(); // watch tests are flaky on other platforms - } - const resource = joinPath(userDataResource, 'settings.json'); - await testObject.writeFile(resource, VSBuffer.fromString('{}')); - disposables.add(testObject.watch(resource)); - testObject.onFileChanges(e => { - if (e.contains(resource)) { - done(); - } - }); - await pfs.writeFile(path.join(userDataPath, 'settings.json'), '{a:1}'); - }); - - test('watch file - event is triggerred when file is deleted', async (done) => { - if (!isLinux) { - return done(); // watch tests are flaky on other platforms - } - const resource = joinPath(userDataResource, 'settings.json'); - await testObject.writeFile(resource, VSBuffer.fromString('{}')); - disposables.add(testObject.watch(resource)); - testObject.onFileChanges(e => { - if (e.contains(resource)) { - done(); - } - }); - await testObject.del(resource); - }); - - test('watch file - event is triggerred when file is deleted externally', async (done) => { - if (!isLinux) { - return done(); // watch tests are flaky on other platforms - } - const resource = joinPath(userDataResource, 'settings.json'); - await testObject.writeFile(resource, VSBuffer.fromString('{}')); - disposables.add(testObject.watch(resource)); - testObject.onFileChanges(e => { - if (e.contains(resource)) { - done(); - } - }); - await pfs.unlink(path.join(userDataPath, 'settings.json')); - }); - test('delete file', async () => { await pfs.writeFile(path.join(userDataPath, 'settings.json'), ''); await testObject.del(joinPath(userDataResource, 'settings.json')); @@ -338,158 +249,6 @@ suite('FileUserDataProvider', () => { assert.equal(result.children![0].resource.toString(), joinPath(userDataResource, 'testContainer/settings.json').toString()); }); - test('watch file under container - event is triggerred when file is created', async (done) => { - if (!isLinux) { - return done(); // watch tests are flaky on other platforms - } - const resource = joinPath(userDataResource, 'testContainer/settings.json'); - disposables.add(testObject.watch(resource)); - testObject.onFileChanges(e => { - if (e.contains(resource)) { - done(); - } - }); - await testObject.writeFile(joinPath(userDataResource, 'testContainer/settings.json'), VSBuffer.fromString('{a:1}')); - }); - - test('watch file under container - event is triggerred when file is created externally', async (done) => { - if (!isLinux) { - return done(); // watch tests are flaky on other platforms - } - const resource = joinPath(userDataResource, 'testContainer/settings.json'); - disposables.add(testObject.watch(resource)); - testObject.onFileChanges(e => { - if (e.contains(resource)) { - done(); - } - }); - await pfs.mkdirp(path.join(userDataPath, 'testContainer')); - await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); - }); - - test('watch file under container - event is triggerred when file is updated', async (done) => { - if (!isLinux) { - return done(); // watch tests are flaky on other platforms - } - const resource = joinPath(userDataResource, 'testContainer/settings.json'); - await pfs.mkdirp(path.join(userDataPath, 'testContainer')); - await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); - disposables.add(testObject.watch(resource)); - testObject.onFileChanges(e => { - if (e.contains(resource)) { - done(); - } - }); - await testObject.writeFile(resource, VSBuffer.fromString('{a:1}')); - }); - - test('watch file under container - event is triggerred when file is updated externally', async (done) => { - if (!isLinux) { - return done(); // watch tests are flaky on other platforms - } - const resource = joinPath(userDataResource, 'testContainer/settings.json'); - await pfs.mkdirp(path.join(userDataPath, 'testContainer')); - await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); - disposables.add(testObject.watch(resource)); - testObject.onFileChanges(e => { - if (e.contains(resource)) { - done(); - } - }); - await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{a:1}'); - }); - - test('watch file under container - event is triggerred when file is deleted', async (done) => { - if (!isLinux) { - return done(); // watch tests are flaky on other platforms - } - const resource = joinPath(userDataResource, 'testContainer/settings.json'); - await testObject.writeFile(resource, VSBuffer.fromString('{}')); - disposables.add(testObject.watch(resource)); - testObject.onFileChanges(e => { - if (e.contains(resource)) { - done(); - } - }); - await testObject.del(resource); - }); - - test('watch file under container - event is triggerred when file is deleted externally', async (done) => { - if (!isLinux) { - return done(); // watch tests are flaky on other platforms - } - const resource = joinPath(userDataResource, 'testContainer/settings.json'); - await testObject.writeFile(resource, VSBuffer.fromString('{}')); - disposables.add(testObject.watch(resource)); - testObject.onFileChanges(e => { - if (e.contains(resource)) { - done(); - } - }); - await pfs.unlink(path.join(userDataPath, 'testContainer', 'settings.json')); - }); - - test('watch container - event is triggerred when file under container is created', async (done) => { - if (!isLinux) { - return done(); // watch tests are flaky on other platforms - } - const container = joinPath(userDataResource, 'testContainer'); - disposables.add(testObject.watch(container)); - testObject.onFileChanges(e => { - if (e.contains(container)) { - done(); - } - }); - await testObject.writeFile(joinPath(userDataResource, 'testContainer/settings.json'), VSBuffer.fromString('{a:1}')); - }); - - test('watch container - event is triggerred when file under container is created externally', async (done) => { - if (!isLinux) { - return done(); // watch tests are flaky on other platforms - } - await pfs.mkdirp(path.join(userDataPath, 'testContainer')); - const container = joinPath(userDataResource, 'testContainer'); - disposables.add(testObject.watch(container)); - testObject.onFileChanges(e => { - if (e.contains(container)) { - done(); - } - }); - await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); - }); - - test('watch container - event is triggerred when file under container is deleted', async (done) => { - if (!isLinux) { - return done(); // watch tests are flaky on other platforms - } - const container = joinPath(userDataResource, 'testContainer'); - const resource = joinPath(userDataResource, 'testContainer/settings.json'); - await testObject.writeFile(resource, VSBuffer.fromString('{}')); - disposables.add(testObject.watch(container)); - testObject.onFileChanges(e => { - if (e.contains(container)) { - done(); - } - }); - await testObject.del(resource); - }); - - test('watch container - event is triggerred when file under container is deleted externally ', async (done) => { - if (!isLinux) { - return done(); // watch tests are flaky on other platforms - } - const container = joinPath(userDataResource, 'testContainer'); - const resource = joinPath(userDataResource, 'testContainer/settings.json'); - await testObject.writeFile(resource, VSBuffer.fromString('{}')); - disposables.add(testObject.watch(container)); - testObject.onFileChanges(e => { - if (e.contains(container)) { - done(); - } - }); - await pfs.unlink(path.join(userDataPath, 'testContainer', 'settings.json')); - }); - test('read backup file', async () => { await pfs.writeFile(path.join(backupsPath, 'backup.json'), '{}'); const result = await testObject.readFile(joinPath(userDataResource, `${BACKUPS}/backup.json`)); @@ -517,4 +276,270 @@ suite('FileUserDataProvider', () => { assert.equal(result.children!.length, 1); assert.equal(result.children![0].resource.toString(), joinPath(userDataResource, `${BACKUPS}/backup.json`).toString()); }); -}); \ No newline at end of file +}); + +// Watch tests are flaky +if (false) { + + suite('FileUserDataProvider - Watching', () => { + + let testObject: IFileService; + let rootPath: string; + let userDataPath: string; + let backupsPath: string; + let userDataResource: URI; + const userDataContainersRegistry = Registry.as(Extensions.UserDataContainers); + const disposables = new DisposableStore(); + + setup(async () => { + const logService = new NullLogService(); + testObject = new FileService(logService); + disposables.add(testObject); + + const diskFileSystemProvider = new DiskFileSystemProvider(logService); + disposables.add(diskFileSystemProvider); + disposables.add(testObject.registerProvider(Schemas.file, diskFileSystemProvider)); + + rootPath = path.join(os.tmpdir(), 'vsctests', uuid.generateUuid()); + userDataPath = path.join(rootPath, 'user'); + backupsPath = path.join(rootPath, BACKUPS); + userDataResource = URI.from({ scheme: Schemas.userData, path: '/user' }); + await Promise.all([pfs.mkdirp(userDataPath), pfs.mkdirp(backupsPath)]); + + const fileUserDataProvider = new FileUserDataProvider(URI.file(userDataPath), testObject); + disposables.add(fileUserDataProvider); + const userDataFileSystemProvider = new UserDataFileSystemProvider(userDataResource, fileUserDataProvider); + disposables.add(userDataFileSystemProvider); + disposables.add(testObject.registerProvider(Schemas.userData, userDataFileSystemProvider)); + + userDataContainersRegistry.registerContainer('testContainer'); + userDataContainersRegistry.registerContainer('testContainer/subContainer'); + userDataContainersRegistry.registerContainer(BACKUPS); + }); + + teardown(async () => { + disposables.clear(); + await pfs.rimraf(rootPath, pfs.RimRafMode.MOVE); + }); + + test('watch file - event is triggerred when file is created', async (done) => { + const resource = joinPath(userDataResource, 'settings.json'); + disposables.add(testObject.watch(resource)); + testObject.onFileChanges(e => { + if (e.contains(resource, FileChangeType.ADDED)) { + done(); + } + }); + await testObject.writeFile(resource, VSBuffer.fromString('{a:1}')); + }); + + test('watch file - event is triggerred when file is created externally', async (done) => { + const resource = joinPath(userDataResource, 'settings.json'); + disposables.add(testObject.watch(resource)); + testObject.onFileChanges(e => { + if (e.contains(resource, FileChangeType.ADDED)) { + done(); + } + }); + await pfs.writeFile(path.join(userDataPath, 'settings.json'), '{}'); + }); + + test('watch file - event is triggerred when file is updated', async (done) => { + const resource = joinPath(userDataResource, 'settings.json'); + await testObject.writeFile(resource, VSBuffer.fromString('{}')); + disposables.add(testObject.watch(resource)); + testObject.onFileChanges(e => { + if (e.contains(resource, FileChangeType.UPDATED)) { + done(); + } + }); + await testObject.writeFile(resource, VSBuffer.fromString('{a:1}')); + }); + + test('watch file - event is triggerred when file is update externally', async (done) => { + const resource = joinPath(userDataResource, 'settings.json'); + await testObject.writeFile(resource, VSBuffer.fromString('{}')); + disposables.add(testObject.watch(resource)); + testObject.onFileChanges(e => { + if (e.contains(resource, FileChangeType.UPDATED)) { + done(); + } + }); + await pfs.writeFile(path.join(userDataPath, 'settings.json'), '{a:1}'); + }); + + test('watch file - event is triggerred when file is deleted', async (done) => { + const resource = joinPath(userDataResource, 'settings.json'); + await testObject.writeFile(resource, VSBuffer.fromString('{}')); + disposables.add(testObject.watch(resource)); + testObject.onFileChanges(e => { + if (e.contains(resource, FileChangeType.DELETED)) { + done(); + } + }); + await testObject.del(resource); + }); + + test('watch file - event is triggerred when file is deleted externally', async (done) => { + const resource = joinPath(userDataResource, 'settings.json'); + await testObject.writeFile(resource, VSBuffer.fromString('{}')); + disposables.add(testObject.watch(resource)); + testObject.onFileChanges(e => { + if (e.contains(resource, FileChangeType.DELETED)) { + done(); + } + }); + await pfs.unlink(path.join(userDataPath, 'settings.json')); + }); + + test('watch file under container - event is triggerred when file is created', async (done) => { + const resource = joinPath(userDataResource, 'testContainer/settings.json'); + disposables.add(testObject.watch(resource)); + testObject.onFileChanges(e => { + if (e.contains(resource, FileChangeType.ADDED)) { + done(); + } + }); + await testObject.writeFile(joinPath(userDataResource, 'testContainer/settings.json'), VSBuffer.fromString('{a:1}')); + }); + + test('watch file under container - event is triggerred when file is created externally', async (done) => { + const resource = joinPath(userDataResource, 'testContainer/settings.json'); + disposables.add(testObject.watch(resource)); + testObject.onFileChanges(e => { + if (e.contains(resource, FileChangeType.ADDED)) { + done(); + } + }); + await pfs.mkdirp(path.join(userDataPath, 'testContainer')); + await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); + }); + + test('watch file under container - event is triggerred when file is updated', async (done) => { + const resource = joinPath(userDataResource, 'testContainer/settings.json'); + await pfs.mkdirp(path.join(userDataPath, 'testContainer')); + await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); + disposables.add(testObject.watch(resource)); + testObject.onFileChanges(e => { + if (e.contains(resource, FileChangeType.UPDATED)) { + done(); + } + }); + await testObject.writeFile(resource, VSBuffer.fromString('{a:1}')); + }); + + test('watch file under container - event is triggerred when file is updated externally', async (done) => { + const resource = joinPath(userDataResource, 'testContainer/settings.json'); + await pfs.mkdirp(path.join(userDataPath, 'testContainer')); + await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); + disposables.add(testObject.watch(resource)); + testObject.onFileChanges(e => { + if (e.contains(resource, FileChangeType.UPDATED)) { + done(); + } + }); + await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{a:1}'); + }); + + test('watch file under container - event is triggerred when file is deleted', async (done) => { + const resource = joinPath(userDataResource, 'testContainer/settings.json'); + await testObject.writeFile(resource, VSBuffer.fromString('{}')); + disposables.add(testObject.watch(resource)); + testObject.onFileChanges(e => { + if (e.contains(resource, FileChangeType.DELETED)) { + done(); + } + }); + await testObject.del(resource); + }); + + test('watch file under container - event is triggerred when file is deleted externally', async (done) => { + const resource = joinPath(userDataResource, 'testContainer/settings.json'); + await testObject.writeFile(resource, VSBuffer.fromString('{}')); + disposables.add(testObject.watch(resource)); + testObject.onFileChanges(e => { + if (e.contains(resource, FileChangeType.DELETED)) { + done(); + } + }); + await pfs.unlink(path.join(userDataPath, 'testContainer', 'settings.json')); + }); + + test('watch container - event is triggerred when file under container is created', async (done) => { + const container = joinPath(userDataResource, 'testContainer'); + const resource = joinPath(userDataResource, 'testContainer/settings.json'); + disposables.add(testObject.watch(container)); + testObject.onFileChanges(e => { + if (e.contains(resource, FileChangeType.ADDED)) { + done(); + } + }); + await testObject.writeFile(resource, VSBuffer.fromString('{a:1}')); + }); + + test('watch container - event is triggerred when file under container is created externally', async (done) => { + await pfs.mkdirp(path.join(userDataPath, 'testContainer')); + const container = joinPath(userDataResource, 'testContainer'); + const resource = joinPath(userDataResource, 'testContainer/settings.json'); + disposables.add(testObject.watch(container)); + testObject.onFileChanges(e => { + if (e.contains(resource, FileChangeType.ADDED)) { + done(); + } + }); + await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); + }); + + test('watch container - event is triggerred when file under container is updated', async (done) => { + const container = joinPath(userDataResource, 'testContainer'); + const resource = joinPath(userDataResource, 'testContainer/settings.json'); + await testObject.writeFile(resource, VSBuffer.fromString('{}')); + disposables.add(testObject.watch(container)); + testObject.onFileChanges(e => { + if (e.contains(resource, FileChangeType.UPDATED)) { + done(); + } + }); + await testObject.writeFile(resource, VSBuffer.fromString('{a:1}')); + }); + + test('watch container - event is triggerred when file under container is updated externally ', async (done) => { + const container = joinPath(userDataResource, 'testContainer'); + const resource = joinPath(userDataResource, 'testContainer/settings.json'); + await testObject.writeFile(resource, VSBuffer.fromString('{}')); + disposables.add(testObject.watch(container)); + testObject.onFileChanges(e => { + if (e.contains(resource, FileChangeType.UPDATED)) { + done(); + } + }); + await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{a:1}'); + }); + + test('watch container - event is triggerred when file under container is deleted', async (done) => { + const container = joinPath(userDataResource, 'testContainer'); + const resource = joinPath(userDataResource, 'testContainer/settings.json'); + await testObject.writeFile(resource, VSBuffer.fromString('{}')); + disposables.add(testObject.watch(container)); + testObject.onFileChanges(e => { + if (e.contains(resource, FileChangeType.DELETED)) { + done(); + } + }); + await testObject.del(resource); + }); + + test('watch container - event is triggerred when file under container is deleted externally ', async (done) => { + const container = joinPath(userDataResource, 'testContainer'); + const resource = joinPath(userDataResource, 'testContainer/settings.json'); + await testObject.writeFile(resource, VSBuffer.fromString('{}')); + disposables.add(testObject.watch(container)); + testObject.onFileChanges(e => { + if (e.contains(resource, FileChangeType.DELETED)) { + done(); + } + }); + await pfs.unlink(path.join(userDataPath, 'testContainer', 'settings.json')); + }); + }); +} \ No newline at end of file From 0f295fd07bc597b8e34244e15e015f3590d35ecb Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Wed, 3 Jul 2019 15:05:45 -0700 Subject: [PATCH 1043/1449] Update markdown preview icon to have bevel edges --- .../markdown-language-features/media/preview-right-dark.svg | 2 +- .../markdown-language-features/media/preview-right-light.svg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/markdown-language-features/media/preview-right-dark.svg b/extensions/markdown-language-features/media/preview-right-dark.svg index 569cecf9d5a..1d59877196b 100644 --- a/extensions/markdown-language-features/media/preview-right-dark.svg +++ b/extensions/markdown-language-features/media/preview-right-dark.svg @@ -1,4 +1,4 @@ - + diff --git a/extensions/markdown-language-features/media/preview-right-light.svg b/extensions/markdown-language-features/media/preview-right-light.svg index f6c3f035a88..3f1152fc3cd 100644 --- a/extensions/markdown-language-features/media/preview-right-light.svg +++ b/extensions/markdown-language-features/media/preview-right-light.svg @@ -1,4 +1,4 @@ - + From f90c76d70176829b3d23af193884e48ddad33169 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 4 Jul 2019 00:17:00 +0200 Subject: [PATCH 1044/1449] trigger user data events always --- .../common/userDataFileSystemProvider.ts | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts b/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts index cda54263b2c..3eb3e76ea3e 100644 --- a/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts +++ b/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts @@ -10,7 +10,7 @@ import { URI } from 'vs/base/common/uri'; import { Event, Emitter } from 'vs/base/common/event'; import { startsWith } from 'vs/base/common/strings'; import { Registry } from 'vs/platform/registry/common/platform'; -import { joinPath, isEqual } from 'vs/base/common/resources'; +import { joinPath } from 'vs/base/common/resources'; export class UserDataFileSystemProvider extends Disposable implements IFileSystemProviderWithFileReadWriteCapability { @@ -31,12 +31,20 @@ export class UserDataFileSystemProvider extends Disposable implements IFileSyste } private onDidChangeUserData(changes: FileChangeEvent[]): void { + const fileChanges: IFileChange[] = []; for (const { path, type } of changes) { if (type === FileChangeType.DELETED) { this.versions.delete(path); } else { this.versions.set(path, this.getOrSetVersion(path) + 1); } + fileChanges.push({ + resource: this.toResource(path), + type + }); + } + if (fileChanges.length) { + this._onDidChangeFile.fire(new FileChangesEvent(fileChanges).changes); } } @@ -45,21 +53,7 @@ export class UserDataFileSystemProvider extends Disposable implements IFileSyste if (!path) { throw new Error(`Invalid user data resource ${resource}`); } - return this.userDataProvider.onDidChangeFile(changes => { - const fileChanges: IFileChange[] = []; - for (const { path, type } of changes) { - const changedResource = this.toResource(path); - if (isEqual(changedResource, resource) || this.toRelativePath(changedResource, resource)) { - fileChanges.push({ - resource: changedResource, - type - }); - } - } - if (fileChanges.length) { - this._onDidChangeFile.fire(new FileChangesEvent(fileChanges).changes); - } - }); + return Disposable.None; } async stat(resource: URI): Promise { From 6e9733a8688c7c565031fbceabd635aaaca92947 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 4 Jul 2019 00:20:51 +0200 Subject: [PATCH 1045/1449] adopt user roaming data for snippets, locale and keyboard mapper --- .../browser/localizations.contribution.ts | 4 +- .../browser/localizationsActions.ts | 4 +- .../snippets/browser/configureSnippets.ts | 14 ++-- .../snippets/browser/snippets.contribution.ts | 3 + .../snippets/browser/snippetsService.ts | 2 +- .../keybinding/browser/keymapService.ts | 69 ++----------------- .../textfile/common/textFileEditorModel.ts | 4 +- 7 files changed, 22 insertions(+), 78 deletions(-) diff --git a/src/vs/workbench/contrib/localizations/browser/localizations.contribution.ts b/src/vs/workbench/contrib/localizations/browser/localizations.contribution.ts index 4ae502390f8..16782ec97ab 100644 --- a/src/vs/workbench/contrib/localizations/browser/localizations.contribution.ts +++ b/src/vs/workbench/contrib/localizations/browser/localizations.contribution.ts @@ -81,8 +81,8 @@ export class LocalizationWorkbenchContribution extends Disposable implements IWo [{ label: updateAndRestart ? localize('yes', "Yes") : localize('restart now', "Restart Now"), run: () => { - const file = joinPath(this.environmentService.appSettingsHome, 'locale.json'); - const updatePromise = updateAndRestart ? this.jsonEditingService.write(file, { key: 'locale', value: locale }, true) : Promise.resolve(undefined); + const localeResource = joinPath(this.environmentService.userRoamingDataHome, 'locale.json'); + const updatePromise = updateAndRestart ? this.jsonEditingService.write(localeResource, { key: 'locale', value: locale }, true) : Promise.resolve(undefined); updatePromise.then(() => this.windowsService.relaunch({}), e => this.notificationService.error(e)); } }, { diff --git a/src/vs/workbench/contrib/localizations/browser/localizationsActions.ts b/src/vs/workbench/contrib/localizations/browser/localizationsActions.ts index 14487ed363b..78482e99314 100644 --- a/src/vs/workbench/contrib/localizations/browser/localizationsActions.ts +++ b/src/vs/workbench/contrib/localizations/browser/localizationsActions.ts @@ -66,8 +66,8 @@ export class ConfigureLocaleAction extends Action { } if (selectedLanguage) { - const file = joinPath(this.environmentService.appSettingsHome, 'locale.json'); - await this.jsonEditingService.write(file, { key: 'locale', value: selectedLanguage.label }, true); + const localeFile = joinPath(this.environmentService.userRoamingDataHome, 'locale.json'); + await this.jsonEditingService.write(localeFile, { key: 'locale', value: selectedLanguage.label }, true); const restart = await this.dialogService.confirm({ type: 'info', message: localize('relaunchDisplayLanguageMessage', "A restart is required for the change in display language to take effect."), diff --git a/src/vs/workbench/contrib/snippets/browser/configureSnippets.ts b/src/vs/workbench/contrib/snippets/browser/configureSnippets.ts index fe901ee2d71..e2073066f37 100644 --- a/src/vs/workbench/contrib/snippets/browser/configureSnippets.ts +++ b/src/vs/workbench/contrib/snippets/browser/configureSnippets.ts @@ -7,7 +7,7 @@ import * as nls from 'vs/nls'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IModeService } from 'vs/editor/common/services/modeService'; -import { basename, extname } from 'vs/base/common/path'; +import { extname } from 'vs/base/common/path'; import { MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { URI } from 'vs/base/common/uri'; @@ -19,7 +19,7 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace import { IFileService } from 'vs/platform/files/common/files'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { isValidBasename } from 'vs/base/common/extpath'; -import { joinPath } from 'vs/base/common/resources'; +import { joinPath, basename } from 'vs/base/common/resources'; const id = 'workbench.action.openSnippets'; @@ -69,7 +69,7 @@ async function computePicks(snippetService: ISnippetsService, envService: IEnvir } existing.push({ - label: basename(file.location.fsPath), + label: basename(file.location), filepath: file.location, description: names.size === 0 ? nls.localize('global.scope', "(global)") @@ -78,9 +78,9 @@ async function computePicks(snippetService: ISnippetsService, envService: IEnvir } else { // language snippet - const mode = basename(file.location.fsPath).replace(/\.json$/, ''); + const mode = basename(file.location).replace(/\.json$/, ''); existing.push({ - label: basename(file.location.fsPath), + label: basename(file.location), description: `(${modeService.getLanguageName(mode)})`, filepath: file.location }); @@ -88,7 +88,7 @@ async function computePicks(snippetService: ISnippetsService, envService: IEnvir } } - const dir = joinPath(envService.appSettingsHome, 'snippets'); + const dir = joinPath(envService.userRoamingDataHome, 'snippets'); for (const mode of modeService.getRegisteredModes()) { const label = modeService.getLanguageName(mode); if (label && !seen.has(mode)) { @@ -220,7 +220,7 @@ CommandsRegistry.registerCommand(id, async (accessor): Promise => { const globalSnippetPicks: SnippetPick[] = [{ scope: nls.localize('new.global_scope', 'global'), label: nls.localize('new.global', "New Global Snippets file..."), - uri: joinPath(envService.appSettingsHome, 'snippets') + uri: joinPath(envService.userRoamingDataHome, 'snippets') }]; const workspaceSnippetPicks: SnippetPick[] = []; diff --git a/src/vs/workbench/contrib/snippets/browser/snippets.contribution.ts b/src/vs/workbench/contrib/snippets/browser/snippets.contribution.ts index ee158fb00bf..6ee3f0b24f8 100644 --- a/src/vs/workbench/contrib/snippets/browser/snippets.contribution.ts +++ b/src/vs/workbench/contrib/snippets/browser/snippets.contribution.ts @@ -10,9 +10,12 @@ import * as nls from 'vs/nls'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { LanguageId } from 'vs/editor/common/modes'; import { SnippetFile, Snippet } from 'vs/workbench/contrib/snippets/browser/snippetsFile'; +import { IUserDataContainerRegistry, Extensions } from 'vs/workbench/services/userData/common/userData'; export const ISnippetsService = createDecorator('snippetService'); +Registry.as(Extensions.UserDataContainers).registerContainer('snippets'); + export interface ISnippetsService { _serviceBrand: any; diff --git a/src/vs/workbench/contrib/snippets/browser/snippetsService.ts b/src/vs/workbench/contrib/snippets/browser/snippetsService.ts index 32e0cbbe862..11cbeea9c87 100644 --- a/src/vs/workbench/contrib/snippets/browser/snippetsService.ts +++ b/src/vs/workbench/contrib/snippets/browser/snippetsService.ts @@ -287,7 +287,7 @@ class SnippetsService implements ISnippetsService { } private _initUserSnippets(): Promise { - const userSnippetsFolder = resources.joinPath(this._environmentService.appSettingsHome, 'snippets'); + const userSnippetsFolder = resources.joinPath(this._environmentService.userRoamingDataHome, 'snippets'); return this._fileService.createFolder(userSnippetsFolder).then(() => this._initFolderSnippets(SnippetSource.User, userSnippetsFolder, this._disposables)); } diff --git a/src/vs/workbench/services/keybinding/browser/keymapService.ts b/src/vs/workbench/services/keybinding/browser/keymapService.ts index 590dab59664..76f092efc22 100644 --- a/src/vs/workbench/services/keybinding/browser/keymapService.ts +++ b/src/vs/workbench/services/keybinding/browser/keymapService.ts @@ -5,7 +5,7 @@ import * as nls from 'vs/nls'; import { Emitter, Event } from 'vs/base/common/event'; -import { Disposable, toDisposable, IDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { IKeymapService, IKeyboardLayoutInfo, IKeyboardMapping, IWindowsKeyboardMapping, KeymapInfo, IRawMixedKeyboardMapping, getKeyboardLayoutId, IKeymapInfo } from 'vs/workbench/services/keybinding/common/keymapInfo'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { DispatchConfig } from 'vs/workbench/services/keybinding/common/dispatchConfig'; @@ -17,9 +17,8 @@ import { IKeyboardEvent } from 'vs/platform/keybinding/common/keybinding'; import { IMacLinuxKeyboardMapping, MacLinuxKeyboardMapper } from 'vs/workbench/services/keybinding/common/macLinuxKeyboardMapper'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { URI } from 'vs/base/common/uri'; -import { IFileService, FileChangesEvent, FileChangeType } from 'vs/platform/files/common/files'; +import { IFileService } from 'vs/platform/files/common/files'; import { RunOnceScheduler } from 'vs/base/common/async'; -import { dirname, isEqual } from 'vs/base/common/resources'; import { parse } from 'vs/base/common/json'; import * as objects from 'vs/base/common/objects'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -429,13 +428,11 @@ export class BrowserKeyboardMapperFactory extends BrowserKeyboardMapperFactoryBa } class UserKeyboardLayout extends Disposable { + private readonly reloadConfigurationScheduler: RunOnceScheduler; protected readonly _onDidChange: Emitter = this._register(new Emitter()); readonly onDidChange: Event = this._onDidChange.event; - private fileWatcherDisposable: IDisposable = Disposable.None; - private directoryWatcherDisposable: IDisposable = Disposable.None; - private _keyboardLayout: KeymapInfo | null; get keyboardLayout(): KeymapInfo | null { return this._keyboardLayout; } @@ -447,22 +444,17 @@ class UserKeyboardLayout extends Disposable { this._keyboardLayout = null; - this._register(fileService.onFileChanges(e => this.handleFileEvents(e))); this.reloadConfigurationScheduler = this._register(new RunOnceScheduler(() => this.reload().then(changed => { if (changed) { this._onDidChange.fire(); } }), 50)); - this._register(toDisposable(() => { - this.stopWatchingResource(); - this.stopWatchingDirectory(); - })); + this._register(this.fileService.watch(this.keyboardLayoutResource)); + this._register(Event.filter(this.fileService.onFileChanges, e => e.contains(this.keyboardLayoutResource))(() => this.reloadConfigurationScheduler.schedule())); } async initialize(): Promise { - const exists = await this.fileService.exists(this.keyboardLayoutResource); - this.onResourceExists(exists); await this.reload(); } @@ -481,57 +473,6 @@ class UserKeyboardLayout extends Disposable { return existing ? !objects.equals(existing, this._keyboardLayout) : true; } - private watchResource(): void { - this.fileWatcherDisposable = this.fileService.watch(this.keyboardLayoutResource); - } - - private watchDirectory(): void { - const directory = dirname(this.keyboardLayoutResource); - this.directoryWatcherDisposable = this.fileService.watch(directory); - } - - private stopWatchingResource(): void { - this.fileWatcherDisposable.dispose(); - this.fileWatcherDisposable = Disposable.None; - } - - private stopWatchingDirectory(): void { - this.directoryWatcherDisposable.dispose(); - this.directoryWatcherDisposable = Disposable.None; - } - - private async handleFileEvents(event: FileChangesEvent): Promise { - const events = event.changes; - - let affectedByChanges = false; - - // Find changes that affect the resource - for (const event of events) { - affectedByChanges = isEqual(this.keyboardLayoutResource, event.resource); - if (affectedByChanges) { - if (event.type === FileChangeType.ADDED) { - this.onResourceExists(true); - } else if (event.type === FileChangeType.DELETED) { - this.onResourceExists(false); - } - break; - } - } - - if (affectedByChanges) { - this.reloadConfigurationScheduler.schedule(); - } - } - - private onResourceExists(exists: boolean): void { - if (exists) { - this.stopWatchingDirectory(); - this.watchResource(); - } else { - this.stopWatchingResource(); - this.watchDirectory(); - } - } } class BrowserKeymapService extends Disposable implements IKeymapService { diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts index 0640812db20..511daf8d218 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts @@ -785,12 +785,12 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil } // Check for locale file - if (isEqual(this.resource, joinPath(this.environmentService.appSettingsHome, 'locale.json'), !isLinux)) { + if (isEqual(this.resource, joinPath(this.environmentService.userRoamingDataHome, 'locale.json'), !isLinux)) { return 'locale'; } // Check for snippets - if (isEqualOrParent(this.resource, joinPath(this.environmentService.appSettingsHome, 'snippets'))) { + if (isEqualOrParent(this.resource, joinPath(this.environmentService.userRoamingDataHome, 'snippets'))) { return 'snippets'; } From ee02563061f2792f4ccb82b526c8d3644d0dfdd1 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 4 Jul 2019 00:36:30 +0200 Subject: [PATCH 1046/1449] fix tests --- .../configurationEditingService.test.ts | 2 +- .../electron-browser/configurationService.test.ts | 14 +++++++------- .../electron-browser/keybindingEditing.test.ts | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) 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 9dd12eca435..12704b9a215 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 @@ -102,7 +102,7 @@ suite('ConfigurationEditingService', () => { fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); instantiationService.stub(IFileService, fileService); instantiationService.stub(IRemoteAgentService, remoteAgentService); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(URI.file('/User').with({ scheme: Schemas.userData }), new FileUserDataProvider(URI.file(workspaceDir), fileService))); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.userRoamingDataHome, new FileUserDataProvider(URI.file(workspaceDir), fileService))); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); return workspaceService.initialize(noWorkspace ? { id: '' } : { folder: URI.file(workspaceDir), id: createHash('md5').update(URI.file(workspaceDir).toString()).digest('hex') }).then(() => { 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 97e1408578c..75945ef6e1b 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 @@ -98,7 +98,7 @@ suite('WorkspaceContextService - Folder', () => { workspaceResource = folderDir; const environmentService = new WorkbenchEnvironmentService(parseArgs(process.argv), process.execPath); const fileService = new FileService(new NullLogService()); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(URI.file('/User').with({ scheme: Schemas.userData }), new FileUserDataProvider(URI.file(parentDir), fileService))); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.userRoamingDataHome, new FileUserDataProvider(URI.file(parentDir), fileService))); workspaceContextService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, new RemoteAgentService({}, environmentService, new RemoteAuthorityResolverService(), new SignService())); return (workspaceContextService).initialize(convertToWorkspacePayload(URI.file(folderDir))); }); @@ -163,7 +163,7 @@ suite('WorkspaceContextService - Workspace', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(URI.file('/User').with({ scheme: Schemas.userData }), new FileUserDataProvider(URI.file(parentDir), fileService))); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.userRoamingDataHome, new FileUserDataProvider(URI.file(parentDir), fileService))); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); @@ -222,7 +222,7 @@ suite('WorkspaceContextService - Workspace Editing', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(URI.file('/User').with({ scheme: Schemas.userData }), new FileUserDataProvider(URI.file(parentDir), fileService))); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.userRoamingDataHome, new FileUserDataProvider(URI.file(parentDir), fileService))); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); @@ -482,7 +482,7 @@ suite('WorkspaceService - Initialization', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(URI.file('/User').with({ scheme: Schemas.userData }), new FileUserDataProvider(URI.file(parentDir), fileService))); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.userRoamingDataHome, new FileUserDataProvider(URI.file(parentDir), fileService))); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); @@ -745,7 +745,7 @@ suite('WorkspaceConfigurationService - Folder', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(URI.file('/User').with({ scheme: Schemas.userData }), new FileUserDataProvider(URI.file(parentDir), fileService))); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.userRoamingDataHome, new FileUserDataProvider(URI.file(parentDir), fileService))); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); @@ -1074,7 +1074,7 @@ suite('WorkspaceConfigurationService-Multiroot', () => { instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(URI.file('/User').with({ scheme: Schemas.userData }), new FileUserDataProvider(URI.file(parentDir), fileService))); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.userRoamingDataHome, new FileUserDataProvider(URI.file(parentDir), fileService))); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); @@ -1476,7 +1476,7 @@ suite('WorkspaceConfigurationService - Remote Folder', () => { const remoteAgentService = instantiationService.stub(IRemoteAgentService, >{ getEnvironment: () => remoteEnvironmentPromise }); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, diskFileSystemProvider); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(URI.file('/User').with({ scheme: Schemas.userData }), new FileUserDataProvider(URI.file(parentDir), fileService))); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.userRoamingDataHome, new FileUserDataProvider(URI.file(parentDir), fileService))); const configurationCache: IConfigurationCache = { read: () => Promise.resolve(''), write: () => Promise.resolve(), remove: () => Promise.resolve() }; testObject = new WorkspaceService({ configurationCache, remoteAuthority }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, testObject); 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 c5480533d13..8e0c6f8d0db 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 @@ -90,7 +90,7 @@ suite('KeybindingsEditing', () => { instantiationService.stub(IModelService, instantiationService.createInstance(ModelServiceImpl)); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(URI.file('/User').with({ scheme: Schemas.userData }), new FileUserDataProvider(URI.file(testDir), fileService))); + fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.userRoamingDataHome, new FileUserDataProvider(URI.file(testDir), fileService))); instantiationService.stub(IFileService, fileService); instantiationService.stub(IUntitledEditorService, instantiationService.createInstance(UntitledEditorService)); instantiationService.stub(ITextFileService, instantiationService.createInstance(TestTextFileService)); From 40915fb441d3fdae3ab268aa9d03874b0dd78040 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 4 Jul 2019 00:52:01 +0200 Subject: [PATCH 1047/1449] no need to watch user data --- src/vs/workbench/services/configuration/browser/configuration.ts | 1 - .../workbench/services/keybinding/browser/keybindingService.ts | 1 - src/vs/workbench/services/keybinding/browser/keymapService.ts | 1 - 3 files changed, 3 deletions(-) diff --git a/src/vs/workbench/services/configuration/browser/configuration.ts b/src/vs/workbench/services/configuration/browser/configuration.ts index 6c125ff67f6..515c6df2fe3 100644 --- a/src/vs/workbench/services/configuration/browser/configuration.ts +++ b/src/vs/workbench/services/configuration/browser/configuration.ts @@ -40,7 +40,6 @@ export class UserConfiguration extends Disposable { this.parser = new ConfigurationModelParser(this.userSettingsResource.toString(), this.scopes); this.reloadConfigurationScheduler = this._register(new RunOnceScheduler(() => this.reload().then(configurationModel => this._onDidChangeConfiguration.fire(configurationModel)), 50)); - this._register(this.fileService.watch(this.userSettingsResource)); this._register(Event.filter(this.fileService.onFileChanges, e => e.contains(this.userSettingsResource))(() => this.reloadConfigurationScheduler.schedule())); } diff --git a/src/vs/workbench/services/keybinding/browser/keybindingService.ts b/src/vs/workbench/services/keybinding/browser/keybindingService.ts index 37ead9db496..5afb5d13cfc 100644 --- a/src/vs/workbench/services/keybinding/browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/browser/keybindingService.ts @@ -576,7 +576,6 @@ class UserKeybindings extends Disposable { this._onDidChange.fire(); } }), 50)); - this._register(this.fileService.watch(this.keybindingsResource)); this._register(Event.filter(this.fileService.onFileChanges, e => e.contains(this.keybindingsResource))(() => this.reloadConfigurationScheduler.schedule())); } diff --git a/src/vs/workbench/services/keybinding/browser/keymapService.ts b/src/vs/workbench/services/keybinding/browser/keymapService.ts index a0a8f68755f..401dede8db9 100644 --- a/src/vs/workbench/services/keybinding/browser/keymapService.ts +++ b/src/vs/workbench/services/keybinding/browser/keymapService.ts @@ -461,7 +461,6 @@ class UserKeyboardLayout extends Disposable { } }), 50)); - this._register(this.fileService.watch(this.keyboardLayoutResource)); this._register(Event.filter(this.fileService.onFileChanges, e => e.contains(this.keyboardLayoutResource))(() => this.reloadConfigurationScheduler.schedule())); } From d61af16df21433505a7044071eaf035b23df527e Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 4 Jul 2019 00:59:05 +0200 Subject: [PATCH 1048/1449] fix show item in folder in windows --- src/vs/platform/windows/electron-main/windowsService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/platform/windows/electron-main/windowsService.ts b/src/vs/platform/windows/electron-main/windowsService.ts index 8e93c0d144f..29368ea1003 100644 --- a/src/vs/platform/windows/electron-main/windowsService.ts +++ b/src/vs/platform/windows/electron-main/windowsService.ts @@ -343,7 +343,7 @@ export class WindowsService extends Disposable implements IWindowsService, IURLH if (resource.scheme === Schemas.file) { shell.showItemInFolder(resource.fsPath); } else if (resource.scheme === Schemas.userData) { - shell.showItemInFolder(resource.path); + shell.showItemInFolder(resource.with({ scheme: Schemas.file }).fsPath); } } From e717f7e51ccf5a4d03d2e668ef80d8252052595e Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 4 Jul 2019 01:04:07 +0200 Subject: [PATCH 1049/1449] handle reveal user data resources on renderer --- src/vs/platform/windows/electron-main/windowsService.ts | 2 -- src/vs/workbench/contrib/files/browser/fileCommands.ts | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/vs/platform/windows/electron-main/windowsService.ts b/src/vs/platform/windows/electron-main/windowsService.ts index 29368ea1003..b4851c55d0c 100644 --- a/src/vs/platform/windows/electron-main/windowsService.ts +++ b/src/vs/platform/windows/electron-main/windowsService.ts @@ -342,8 +342,6 @@ export class WindowsService extends Disposable implements IWindowsService, IURLH if (resource.scheme === Schemas.file) { shell.showItemInFolder(resource.fsPath); - } else if (resource.scheme === Schemas.userData) { - shell.showItemInFolder(resource.with({ scheme: Schemas.file }).fsPath); } } diff --git a/src/vs/workbench/contrib/files/browser/fileCommands.ts b/src/vs/workbench/contrib/files/browser/fileCommands.ts index be91bc74ffe..7155fc4dbbe 100644 --- a/src/vs/workbench/contrib/files/browser/fileCommands.ts +++ b/src/vs/workbench/contrib/files/browser/fileCommands.ts @@ -400,7 +400,7 @@ CommandsRegistry.registerCommand({ function revealResourcesInOS(resources: URI[], windowsService: IWindowsService, notificationService: INotificationService, workspaceContextService: IWorkspaceContextService): void { if (resources.length) { - sequence(resources.map(r => () => windowsService.showItemInFolder(r))); + sequence(resources.map(r => () => windowsService.showItemInFolder(r.scheme === Schemas.userData ? r.with({ scheme: Schemas.file }) : r))); } else if (workspaceContextService.getWorkspace().folders.length) { windowsService.showItemInFolder(workspaceContextService.getWorkspace().folders[0].uri); } else { From 052f74b6c689d77fbfd770b6e8242fadf7e85b8d Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 3 Jul 2019 16:23:53 -0700 Subject: [PATCH 1050/1449] Fix exception throwing in terminal integration tests Part of #76515 --- .../workbench/contrib/terminal/browser/terminalInstance.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index 8aac6afa72f..d2b165d0415 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -1287,11 +1287,15 @@ export class TerminalInstance implements ITerminalInstance { this._safeSetOption('drawBoldTextInBrightColors', config.drawBoldTextInBrightColors); } + if (isNaN(cols) || isNaN(rows)) { + return; + } + if (cols !== this._xterm.cols || rows !== this._xterm.rows) { this._onDimensionsChanged.fire(); } - this._xterm.resize(cols, rows); + if (this._isVisible) { // HACK: Force the renderer to unpause by simulating an IntersectionObserver event. // This is to fix an issue where dragging the window to the top of the screen to From 112a60d637fc7df10c0bf8b5b3a74bb9aeb6f203 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 3 Jul 2019 17:22:13 -0700 Subject: [PATCH 1051/1449] Ensure terminal tests don't leak terminals Part of #76515 --- .../src/singlefolder-tests/terminal.test.ts | 82 +++++++++++++++---- 1 file changed, 64 insertions(+), 18 deletions(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts index 4be1d9deeb5..b37480ac9bc 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts @@ -8,35 +8,61 @@ import { doesNotThrow, equal, ok } from 'assert'; suite('window namespace tests', () => { (process.platform === 'win32' ? suite.skip /* https://github.com/microsoft/vscode/issues/75689 */ : suite)('Terminal', () => { - test('sendText immediately after createTerminal should not throw', () => { + test('sendText immediately after createTerminal should not throw', (done) => { + const reg1 = window.onDidOpenTerminal(term => { + equal(terminal, term); + terminal.dispose(); + reg1.dispose(); + const reg2 = window.onDidCloseTerminal(() => { + reg2.dispose(); + done(); + }); + }); const terminal = window.createTerminal(); doesNotThrow(terminal.sendText.bind(terminal, 'echo "foo"')); - terminal.dispose(); }); test('onDidCloseTerminal event fires when terminal is disposed', (done) => { - const terminal = window.createTerminal(); - const reg = window.onDidCloseTerminal((eventTerminal) => { - equal(terminal, eventTerminal); - reg.dispose(); - done(); + const reg1 = window.onDidOpenTerminal(term => { + equal(terminal, term); + terminal.dispose(); + reg1.dispose(); + const reg2 = window.onDidCloseTerminal(() => { + reg2.dispose(); + done(); + }); }); - terminal.dispose(); + const terminal = window.createTerminal(); }); test('processId immediately after createTerminal should fetch the pid', (done) => { - const terminal = window.createTerminal(); - terminal.processId.then(id => { - ok(id > 0); - terminal.dispose(); - done(); + const reg1 = window.onDidOpenTerminal(term => { + equal(terminal, term); + reg1.dispose(); + terminal.processId.then(id => { + ok(id > 0); + terminal.dispose(); + const reg2 = window.onDidCloseTerminal(() => { + reg2.dispose(); + done(); + }); + }); }); + const terminal = window.createTerminal(); }); - test('name in constructor should set terminal.name', () => { + test('name in constructor should set terminal.name', (done) => { + const reg1 = window.onDidOpenTerminal(term => { + equal(terminal, term); + terminal.dispose(); + reg1.dispose(); + const reg2 = window.onDidCloseTerminal(() => { + reg2.dispose(); + done(); + }); + }); const terminal = window.createTerminal('a'); equal(terminal.name, 'a'); - terminal.dispose(); }); test('onDidOpenTerminal should fire when a terminal is created', (done) => { @@ -113,10 +139,23 @@ suite('window namespace tests', () => { secondCalled = true; } if (firstCalled && secondCalled) { + let firstDisposed = false; + let secondDisposed = false; + const reg4 = window.onDidCloseTerminal(term => { + if (term === terminal1) { + firstDisposed = true; + } + if (term === terminal2) { + secondDisposed = true; + } + if (firstDisposed && secondDisposed) { + reg4.dispose(); + done(); + } + }); terminal1.dispose(); terminal2.dispose(); reg3.dispose(); - done(); } }); await timeout(500); @@ -133,8 +172,11 @@ suite('window namespace tests', () => { terminal.onDidWriteData(e => { data += e; if (data.indexOf('foo') !== -1) { + const reg3 = window.onDidCloseTerminal(() => { + reg3.dispose(); + done(); + }); terminal.dispose(); - done(); } }); terminal.sendText('foo'); @@ -146,7 +188,11 @@ suite('window namespace tests', () => { equal(t, terminal); equal(t.name, 'bg'); ok(window.terminals.indexOf(terminal) !== -1); - done(); + const reg3 = window.onDidCloseTerminal(() => { + reg3.dispose(); + done(); + }); + terminal.dispose(); }); }); }); From e52805a9457b6aae5d7f38c4ccb148f0b893963f Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 3 Jul 2019 17:28:43 -0700 Subject: [PATCH 1052/1449] Add missing semicolons --- .../vscode-api-tests/src/singlefolder-tests/terminal.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts index b37480ac9bc..49c5834a3e4 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts @@ -247,7 +247,7 @@ suite('window namespace tests', () => { }); const renderer = window.createTerminalRenderer('foo'); }); - }) + }); suite('Virtual process terminals', () => { test('should fire onDidOpenTerminal and onDidCloseTerminal', (done) => { @@ -317,7 +317,7 @@ suite('window namespace tests', () => { const reg2 = window.onDidChangeTerminalDimensions(e => { equal(e.dimensions.columns, 10); equal(e.dimensions.rows, 5); - equal(e.terminal, terminal) + equal(e.terminal, terminal); reg2.dispose(); const reg3 = window.onDidCloseTerminal(() => { reg3.dispose(); From 6bb0ffb66e81fcf9fae577fe783220639f8cd69f Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 3 Jul 2019 15:42:09 -0700 Subject: [PATCH 1053/1449] Use Mutable disposable --- src/vs/base/browser/ui/toolbar/toolbar.ts | 30 ++++++----------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/src/vs/base/browser/ui/toolbar/toolbar.ts b/src/vs/base/browser/ui/toolbar/toolbar.ts index b77753855ab..4aa201e1a68 100644 --- a/src/vs/base/browser/ui/toolbar/toolbar.ts +++ b/src/vs/base/browser/ui/toolbar/toolbar.ts @@ -9,7 +9,7 @@ import { Action, IActionRunner, IAction } from 'vs/base/common/actions'; import { ActionBar, ActionsOrientation, IActionViewItemProvider } from 'vs/base/browser/ui/actionbar/actionbar'; import { IContextMenuProvider, DropdownMenuActionViewItem } from 'vs/base/browser/ui/dropdown/dropdown'; import { ResolvedKeybinding } from 'vs/base/common/keyCodes'; -import { Disposable } from 'vs/base/common/lifecycle'; +import { Disposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { AnchorAlignment } from 'vs/base/browser/ui/contextview/contextview'; import { withNullAsUndefined } from 'vs/base/common/types'; @@ -32,7 +32,7 @@ export class ToolBar extends Disposable { private options: IToolBarOptions; private actionBar: ActionBar; private toggleMenuAction: ToggleMenuAction; - private toggleMenuActionViewItem?: DropdownMenuActionViewItem; + private toggleMenuActionViewItem = this._register(new MutableDisposable()); private hasSecondaryActions: boolean; private lookupKeybindings: boolean; @@ -42,7 +42,7 @@ export class ToolBar extends Disposable { this.options = options; this.lookupKeybindings = typeof this.options.getKeyBinding === 'function'; - this.toggleMenuAction = this._register(new ToggleMenuAction(() => this.toggleMenuActionViewItem && this.toggleMenuActionViewItem.show(), options.toggleMenuTitle)); + this.toggleMenuAction = this._register(new ToggleMenuAction(() => this.toggleMenuActionViewItem.value && this.toggleMenuActionViewItem.value.show(), options.toggleMenuTitle)); let element = document.createElement('div'); element.className = 'monaco-toolbar'; @@ -57,13 +57,8 @@ export class ToolBar extends Disposable { // Return special action item for the toggle menu action if (action.id === ToggleMenuAction.ID) { - // Dispose old - if (this.toggleMenuActionViewItem) { - this.toggleMenuActionViewItem.dispose(); - } - // Create new - this.toggleMenuActionViewItem = new DropdownMenuActionViewItem( + this.toggleMenuActionViewItem.value = new DropdownMenuActionViewItem( action, (action).menuActions, contextMenuProvider, @@ -73,9 +68,9 @@ export class ToolBar extends Disposable { 'toolbar-toggle-more', this.options.anchorAlignmentProvider ); - this.toggleMenuActionViewItem!.setActionContext(this.actionBar.context); + this.toggleMenuActionViewItem.value.setActionContext(this.actionBar.context); - return this.toggleMenuActionViewItem; + return this.toggleMenuActionViewItem.value; } return options.actionViewItemProvider ? options.actionViewItemProvider(action) : undefined; @@ -93,8 +88,8 @@ export class ToolBar extends Disposable { set context(context: any) { this.actionBar.context = context; - if (this.toggleMenuActionViewItem) { - this.toggleMenuActionViewItem.setActionContext(context); + if (this.toggleMenuActionViewItem.value) { + this.toggleMenuActionViewItem.value.setActionContext(context); } } @@ -154,15 +149,6 @@ export class ToolBar extends Disposable { } }; } - - dispose(): void { - if (this.toggleMenuActionViewItem) { - this.toggleMenuActionViewItem.dispose(); - this.toggleMenuActionViewItem = undefined; - } - - super.dispose(); - } } class ToggleMenuAction extends Action { From 79eb7d841e038a5ba04dd6514fb3785405b9ad94 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 3 Jul 2019 15:52:58 -0700 Subject: [PATCH 1054/1449] Add message for Potential leak stack --- src/vs/base/common/lifecycle.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/base/common/lifecycle.ts b/src/vs/base/common/lifecycle.ts index e82f147d322..a0f2b7e79ca 100644 --- a/src/vs/base/common/lifecycle.ts +++ b/src/vs/base/common/lifecycle.ts @@ -35,7 +35,7 @@ function trackDisposable(x: T): T { return x; } - const stack = new Error().stack!; + const stack = new Error('Potentially leaked disposable').stack!; setTimeout(() => { if (!(x as any)[__is_disposable_tracked__]) { console.log(stack); From 32134adfaae28ebdb6c7279340ed81c6e28f7da1 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 3 Jul 2019 15:53:24 -0700 Subject: [PATCH 1055/1449] Use DisposableStore instead of IDisposable[] --- .../common/services/editorWorkerServiceImpl.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vs/editor/common/services/editorWorkerServiceImpl.ts b/src/vs/editor/common/services/editorWorkerServiceImpl.ts index 6cefce59c2c..592258cffe2 100644 --- a/src/vs/editor/common/services/editorWorkerServiceImpl.ts +++ b/src/vs/editor/common/services/editorWorkerServiceImpl.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IntervalTimer } from 'vs/base/common/async'; -import { Disposable, IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, IDisposable, dispose, toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { SimpleWorkerClient, logOnceWebWorkerWarning } from 'vs/base/common/worker/simpleWorker'; import { DefaultWorkerFactory } from 'vs/base/worker/defaultWorkerFactory'; @@ -226,7 +226,7 @@ class EditorModelManager extends Disposable { private readonly _proxy: EditorSimpleWorkerImpl; private readonly _modelService: IModelService; - private _syncedModels: { [modelUrl: string]: IDisposable[]; } = Object.create(null); + private _syncedModels: { [modelUrl: string]: IDisposable; } = Object.create(null); private _syncedModelsLastUsedTime: { [modelUrl: string]: number; } = Object.create(null); constructor(proxy: EditorSimpleWorkerImpl, modelService: IModelService, keepIdleModels: boolean) { @@ -297,14 +297,14 @@ class EditorModelManager extends Disposable { versionId: model.getVersionId() }); - let toDispose: IDisposable[] = []; - toDispose.push(model.onDidChangeContent((e) => { + const toDispose = new DisposableStore(); + toDispose.add(model.onDidChangeContent((e) => { this._proxy.acceptModelChanged(modelUrl.toString(), e); })); - toDispose.push(model.onWillDispose(() => { + toDispose.add(model.onWillDispose(() => { this._stopModelSync(modelUrl); })); - toDispose.push(toDisposable(() => { + toDispose.add(toDisposable(() => { this._proxy.acceptRemovedModel(modelUrl); })); From 2ae83d61234835e6b2e7728c19f6176786b5b661 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 3 Jul 2019 15:53:53 -0700 Subject: [PATCH 1056/1449] Use DisposableStore instead of IDisposable[] --- .../parts/editor/breadcrumbsControl.ts | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts index bf2117c79cc..85bb27482fc 100644 --- a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts +++ b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts @@ -10,7 +10,7 @@ import { IconLabel } from 'vs/base/browser/ui/iconLabel/iconLabel'; import { tail } from 'vs/base/common/arrays'; import { timeout } from 'vs/base/common/async'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; -import { combinedDisposable, dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { combinedDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { isEqual } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import 'vs/css!./media/breadcrumbscontrol'; @@ -50,7 +50,7 @@ import { ILabelService } from 'vs/platform/label/common/label'; class Item extends BreadcrumbsItem { - private readonly _disposables: IDisposable[] = []; + private readonly _disposables = new DisposableStore(); constructor( readonly element: BreadcrumbElement, @@ -61,7 +61,7 @@ class Item extends BreadcrumbsItem { } dispose(): void { - dispose(this._disposables); + this._disposables.dispose(); } equals(other: BreadcrumbsItem): boolean { @@ -88,7 +88,7 @@ class Item extends BreadcrumbsItem { fileDecorations: { colors: this.options.showDecorationColors, badges: false }, }); dom.addClass(container, FileKind[this.element.kind].toLowerCase()); - this._disposables.push(label); + this._disposables.add(label); } else if (this.element instanceof OutlineModel) { // has outline element but not in one @@ -101,7 +101,7 @@ class Item extends BreadcrumbsItem { // provider let label = new IconLabel(container); label.setLabel(this.element.provider.displayName); - this._disposables.push(label); + this._disposables.add(label); } else if (this.element instanceof OutlineElement) { // symbol @@ -114,7 +114,7 @@ class Item extends BreadcrumbsItem { let label = new IconLabel(container); let title = this.element.symbol.name.replace(/\r|\n|\r\n/g, '\u23CE'); label.setLabel(title); - this._disposables.push(label); + this._disposables.add(label); } } } @@ -147,8 +147,8 @@ export class BreadcrumbsControl { readonly domNode: HTMLDivElement; private readonly _widget: BreadcrumbsWidget; - private _disposables = new Array(); - private _breadcrumbsDisposables = new Array(); + private readonly _disposables = new DisposableStore(); + private readonly _breadcrumbsDisposables = new DisposableStore(); private _breadcrumbsPickerShowing = false; private _breadcrumbsPickerIgnoreOnceItem: BreadcrumbsItem | undefined; @@ -178,7 +178,7 @@ export class BreadcrumbsControl { this._widget.onDidSelectItem(this._onSelectEvent, this, this._disposables); this._widget.onDidFocusItem(this._onFocusEvent, this, this._disposables); this._widget.onDidChangeFocus(this._updateCkBreadcrumbsActive, this, this._disposables); - this._disposables.push(attachBreadcrumbsStyler(this._widget, this._themeService, { breadcrumbsBackground: _options.breadcrumbsBackground })); + this._disposables.add(attachBreadcrumbsStyler(this._widget, this._themeService, { breadcrumbsBackground: _options.breadcrumbsBackground })); this._ckBreadcrumbsPossible = BreadcrumbsControl.CK_BreadcrumbsPossible.bindTo(this._contextKeyService); this._ckBreadcrumbsVisible = BreadcrumbsControl.CK_BreadcrumbsVisible.bindTo(this._contextKeyService); @@ -186,12 +186,12 @@ export class BreadcrumbsControl { this._cfUseQuickPick = BreadcrumbsConfig.UseQuickPick.bindTo(_configurationService); - this._disposables.push(breadcrumbsService.register(this._editorGroup.id, this._widget)); + this._disposables.add(breadcrumbsService.register(this._editorGroup.id, this._widget)); } dispose(): void { - this._disposables = dispose(this._disposables); - this._breadcrumbsDisposables = dispose(this._breadcrumbsDisposables); + this._disposables.dispose(); + this._breadcrumbsDisposables.dispose(); this._ckBreadcrumbsPossible.reset(); this._ckBreadcrumbsVisible.reset(); this._ckBreadcrumbsActive.reset(); @@ -209,13 +209,13 @@ export class BreadcrumbsControl { } hide(): void { - this._breadcrumbsDisposables = dispose(this._breadcrumbsDisposables); + this._breadcrumbsDisposables.clear(); this._ckBreadcrumbsVisible.set(false); dom.toggleClass(this.domNode, 'hidden', true); } update(): boolean { - this._breadcrumbsDisposables = dispose(this._breadcrumbsDisposables); + this._breadcrumbsDisposables.clear(); // honor diff editors and such let input = this._editorGroup.activeEditor; @@ -252,10 +252,12 @@ export class BreadcrumbsControl { }; const listener = model.onDidUpdate(updateBreadcrumbs); updateBreadcrumbs(); - this._breadcrumbsDisposables = [model, listener]; + this._breadcrumbsDisposables.clear(); + this._breadcrumbsDisposables.add(model); + this._breadcrumbsDisposables.add(listener); // close picker on hide/update - this._breadcrumbsDisposables.push({ + this._breadcrumbsDisposables.add({ dispose: () => { if (this._breadcrumbsPickerShowing) { this._contextViewService.hideContextView(this); From 1da98a12da337983b48cd49dc6e28a2320c8159e Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 3 Jul 2019 16:02:59 -0700 Subject: [PATCH 1057/1449] Use DisposableStore in listWidget --- src/vs/base/browser/ui/list/listWidget.ts | 43 ++++++++++++----------- src/vs/base/common/event.ts | 4 +-- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/vs/base/browser/ui/list/listWidget.ts b/src/vs/base/browser/ui/list/listWidget.ts index 4c005afeea7..55ac74bc01c 100644 --- a/src/vs/base/browser/ui/list/listWidget.ts +++ b/src/vs/base/browser/ui/list/listWidget.ts @@ -5,7 +5,7 @@ import 'vs/css!./list'; import { localize } from 'vs/nls'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose, DisposableStore } from 'vs/base/common/lifecycle'; import { isNumber } from 'vs/base/common/types'; import { range, firstIndex, binarySearch } from 'vs/base/common/arrays'; import { memoize } from 'vs/base/common/decorators'; @@ -228,7 +228,7 @@ function isInputElement(e: HTMLElement): boolean { class KeyboardController implements IDisposable { - private disposables: IDisposable[]; + private readonly disposables = new DisposableStore(); private openController: IOpenController; constructor( @@ -237,7 +237,6 @@ class KeyboardController implements IDisposable { options: IListOptions ) { const multipleSelectionSupport = !(options.multipleSelectionSupport === false); - this.disposables = []; this.openController = options.openController || DefaultOpenController; @@ -314,7 +313,7 @@ class KeyboardController implements IDisposable { } dispose() { - this.disposables = dispose(this.disposables); + this.disposables.dispose(); } } @@ -341,8 +340,8 @@ class TypeLabelController implements IDisposable { private automaticKeyboardNavigation = true; private triggered = false; - private enabledDisposables: IDisposable[] = []; - private disposables: IDisposable[] = []; + private readonly enabledDisposables = new DisposableStore(); + private readonly disposables = new DisposableStore(); constructor( private list: List, @@ -398,7 +397,7 @@ class TypeLabelController implements IDisposable { return; } - this.enabledDisposables = dispose(this.enabledDisposables); + this.enabledDisposables.clear(); this.enabled = false; this.triggered = false; } @@ -430,20 +429,19 @@ class TypeLabelController implements IDisposable { dispose() { this.disable(); - this.disposables = dispose(this.disposables); + this.enabledDisposables.dispose(); + this.disposables.dispose(); } } class DOMFocusController implements IDisposable { - private disposables: IDisposable[] = []; + private readonly disposables = new DisposableStore(); constructor( private list: List, private view: ListView ) { - this.disposables = []; - const onKeyDown = Event.chain(domEvent(view.domNode, 'keydown')) .filter(e => !isInputElement(e.target as HTMLElement)) .map(e => new StandardKeyboardEvent(e)); @@ -486,7 +484,7 @@ class DOMFocusController implements IDisposable { } dispose() { - this.disposables = dispose(this.disposables); + this.disposables.dispose(); } } @@ -523,7 +521,7 @@ export class MouseController implements IDisposable { readonly multipleSelectionController: IMultipleSelectionController; private openController: IOpenController; private mouseSupport: boolean; - private disposables: IDisposable[] = []; + private readonly disposables = new DisposableStore(); constructor(protected list: List) { this.multipleSelectionSupport = !(list.options.multipleSelectionSupport === false); @@ -663,7 +661,7 @@ export class MouseController implements IDisposable { } dispose() { - this.disposables = dispose(this.disposables); + this.disposables.dispose(); } } @@ -1096,7 +1094,7 @@ export class List implements ISpliceable, IDisposable { private styleController: IStyleController; private typeLabelController?: TypeLabelController; - protected disposables: IDisposable[]; + protected readonly disposables = new DisposableStore(); @memoize get onFocusChange(): Event> { return Event.map(this.eventBufferer.wrapEvent(this.focus.onChange), e => this.toListEvent(e)); @@ -1210,24 +1208,27 @@ export class List implements ISpliceable, IDisposable { this.view ]); - this.disposables = [this.focus, this.selection, this.view, this._onDidDispose]; + this.disposables.add(this.focus); + this.disposables.add(this.selection); + this.disposables.add(this.view); + this.disposables.add(this._onDidDispose); this.onDidFocus = Event.map(domEvent(this.view.domNode, 'focus', true), () => null!); this.onDidBlur = Event.map(domEvent(this.view.domNode, 'blur', true), () => null!); - this.disposables.push(new DOMFocusController(this, this.view)); + this.disposables.add(new DOMFocusController(this, this.view)); if (typeof _options.keyboardSupport !== 'boolean' || _options.keyboardSupport) { const controller = new KeyboardController(this, this.view, _options); - this.disposables.push(controller); + this.disposables.add(controller); } if (_options.keyboardNavigationLabelProvider) { this.typeLabelController = new TypeLabelController(this, this.view, _options.keyboardNavigationLabelProvider); - this.disposables.push(this.typeLabelController); + this.disposables.add(this.typeLabelController); } - this.disposables.push(this.createMouseController(_options)); + this.disposables.add(this.createMouseController(_options)); this.onFocusChange(this._onFocusChange, this, this.disposables); this.onSelectionChange(this._onSelectionChange, this, this.disposables); @@ -1610,7 +1611,7 @@ export class List implements ISpliceable, IDisposable { dispose(): void { this._onDidDispose.fire(); - this.disposables = dispose(this.disposables); + this.disposables.dispose(); this._onDidOpen.dispose(); this._onPin.dispose(); diff --git a/src/vs/base/common/event.ts b/src/vs/base/common/event.ts index d708931ec78..8b89e002422 100644 --- a/src/vs/base/common/event.ts +++ b/src/vs/base/common/event.ts @@ -271,7 +271,7 @@ export namespace Event { filter(fn: (e: T) => boolean): IChainableEvent; reduce(merge: (last: R | undefined, event: T) => R, initial?: R): IChainableEvent; latch(): IChainableEvent; - on(listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[]): IDisposable; + on(listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore): IDisposable; once(listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[]): IDisposable; } @@ -299,7 +299,7 @@ export namespace Event { return new ChainableEvent(latch(this.event)); } - on(listener: (e: T) => any, thisArgs: any, disposables: IDisposable[]) { + on(listener: (e: T) => any, thisArgs: any, disposables: IDisposable[] | DisposableStore) { return this.event(listener, thisArgs, disposables); } From e6b698b4fd59f3f6f3713529a52e5d68d1155972 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 3 Jul 2019 18:14:55 -0700 Subject: [PATCH 1058/1449] Using DisposableStore in place of disposable arrays in a few more files --- src/vs/editor/contrib/gotoError/gotoError.ts | 23 ++++++------ src/vs/platform/list/browser/listService.ts | 36 +++++++++---------- .../browser/parts/editor/rangeDecorations.ts | 18 ++++------ .../markers/browser/markersTreeViewer.ts | 17 ++++----- .../contrib/search/common/searchModel.ts | 21 ++++++----- .../partsSplash.contribution.ts | 6 ++-- .../contrib/tasks/common/problemCollectors.ts | 7 ++-- 7 files changed, 59 insertions(+), 69 deletions(-) diff --git a/src/vs/editor/contrib/gotoError/gotoError.ts b/src/vs/editor/contrib/gotoError/gotoError.ts index 4e46bd7e2b1..8f1231cbfb8 100644 --- a/src/vs/editor/contrib/gotoError/gotoError.ts +++ b/src/vs/editor/contrib/gotoError/gotoError.ts @@ -6,7 +6,7 @@ import * as nls from 'vs/nls'; import { Emitter } from 'vs/base/common/event'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose, DisposableStore } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { RawContextKey, IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IMarker, IMarkerService, MarkerSeverity } from 'vs/platform/markers/common/markers'; @@ -206,7 +206,7 @@ export class MarkerController implements editorCommon.IEditorContribution { private _model: MarkerModel | null = null; private _widget: MarkerNavigationWidget | null = null; private readonly _widgetVisible: IContextKey; - private _disposeOnClose: IDisposable[] = []; + private readonly _disposeOnClose = new DisposableStore(); constructor( editor: ICodeEditor, @@ -226,11 +226,12 @@ export class MarkerController implements editorCommon.IEditorContribution { public dispose(): void { this._cleanUp(); + this._disposeOnClose.dispose(); } private _cleanUp(): void { this._widgetVisible.reset(); - this._disposeOnClose = dispose(this._disposeOnClose); + this._disposeOnClose.clear(); this._widget = null; this._model = null; } @@ -255,19 +256,21 @@ export class MarkerController implements editorCommon.IEditorContribution { this._widgetVisible.set(true); this._widget.onDidClose(() => this._cleanUp(), this, this._disposeOnClose); - this._disposeOnClose.push(this._model); - this._disposeOnClose.push(this._widget); - this._disposeOnClose.push(...actions); - this._disposeOnClose.push(this._widget.onDidSelectRelatedInformation(related => { + this._disposeOnClose.add(this._model); + this._disposeOnClose.add(this._widget); + for (const action of actions) { + this._disposeOnClose.add(action); + } + this._disposeOnClose.add(this._widget.onDidSelectRelatedInformation(related => { this._editorService.openCodeEditor({ resource: related.resource, options: { pinned: true, revealIfOpened: true, selection: Range.lift(related).collapseToStart() } }, this._editor).then(undefined, onUnexpectedError); this.closeMarkersNavigation(false); })); - this._disposeOnClose.push(this._editor.onDidChangeModel(() => this._cleanUp())); + this._disposeOnClose.add(this._editor.onDidChangeModel(() => this._cleanUp())); - this._disposeOnClose.push(this._model.onCurrentMarkerChanged(marker => { + this._disposeOnClose.add(this._model.onCurrentMarkerChanged(marker => { if (!marker || !this._model) { this._cleanUp(); } else { @@ -279,7 +282,7 @@ export class MarkerController implements editorCommon.IEditorContribution { }); } })); - this._disposeOnClose.push(this._model.onMarkerSetChanged(() => { + this._disposeOnClose.add(this._model.onMarkerSetChanged(() => { if (!this._widget || !this._widget.position || !this._model) { return; } diff --git a/src/vs/platform/list/browser/listService.ts b/src/vs/platform/list/browser/listService.ts index 3847287678b..383cff04a94 100644 --- a/src/vs/platform/list/browser/listService.ts +++ b/src/vs/platform/list/browser/listService.ts @@ -268,7 +268,7 @@ export class WorkbenchList extends List { } ); - this.disposables.push(workbenchListOptionsDisposable); + this.disposables.add(workbenchListOptionsDisposable); this.contextKeyService = createScopedContextKeyService(contextKeyService, this); this.configurationService = configurationService; @@ -282,31 +282,29 @@ export class WorkbenchList extends List { this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService); - this.disposables.push( - this.contextKeyService, - (listService as ListService).register(this), - attachListStyler(this, themeService), - this.onSelectionChange(() => { - const selection = this.getSelection(); - const focus = this.getFocus(); + this.disposables.add(this.contextKeyService); + this.disposables.add((listService as ListService).register(this)); + this.disposables.add(attachListStyler(this, themeService)); + this.disposables.add(this.onSelectionChange(() => { + const selection = this.getSelection(); + const focus = this.getFocus(); - this.listHasSelectionOrFocus.set(selection.length > 0 || focus.length > 0); - this.listMultiSelection.set(selection.length > 1); - this.listDoubleSelection.set(selection.length === 2); - }), - this.onFocusChange(() => { - const selection = this.getSelection(); - const focus = this.getFocus(); + this.listHasSelectionOrFocus.set(selection.length > 0 || focus.length > 0); + this.listMultiSelection.set(selection.length > 1); + this.listDoubleSelection.set(selection.length === 2); + })); + this.disposables.add(this.onFocusChange(() => { + const selection = this.getSelection(); + const focus = this.getFocus(); - this.listHasSelectionOrFocus.set(selection.length > 0 || focus.length > 0); - }) - ); + this.listHasSelectionOrFocus.set(selection.length > 0 || focus.length > 0); + })); this.registerListeners(); } private registerListeners(): void { - this.disposables.push(this.configurationService.onDidChangeConfiguration(e => { + this.disposables.add(this.configurationService.onDidChangeConfiguration(e => { if (e.affectsConfiguration(multiSelectModifierSettingKey)) { this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(this.configurationService); } diff --git a/src/vs/workbench/browser/parts/editor/rangeDecorations.ts b/src/vs/workbench/browser/parts/editor/rangeDecorations.ts index b22a8290edd..0e994f72c34 100644 --- a/src/vs/workbench/browser/parts/editor/rangeDecorations.ts +++ b/src/vs/workbench/browser/parts/editor/rangeDecorations.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { Event, Emitter } from 'vs/base/common/event'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; @@ -23,7 +23,7 @@ export class RangeHighlightDecorations extends Disposable { private rangeHighlightDecorationId: string | null = null; private editor: ICodeEditor | null = null; - private editorDisposables: IDisposable[] = []; + private readonly editorDisposables = this._register(new DisposableStore()); private readonly _onHighlightRemoved: Emitter = this._register(new Emitter()); get onHighlightRemoved(): Event { return this._onHighlightRemoved.event; } @@ -72,9 +72,9 @@ export class RangeHighlightDecorations extends Disposable { private setEditor(editor: ICodeEditor) { if (this.editor !== editor) { - this.disposeEditorListeners(); + this.editorDisposables.clear(); this.editor = editor; - this.editorDisposables.push(this.editor.onDidChangeCursorPosition((e: ICursorPositionChangedEvent) => { + this.editorDisposables.add(this.editor.onDidChangeCursorPosition((e: ICursorPositionChangedEvent) => { if ( e.reason === CursorChangeReason.NotSet || e.reason === CursorChangeReason.Explicit @@ -84,19 +84,14 @@ export class RangeHighlightDecorations extends Disposable { this.removeHighlightRange(); } })); - this.editorDisposables.push(this.editor.onDidChangeModel(() => { this.removeHighlightRange(); })); - this.editorDisposables.push(this.editor.onDidDispose(() => { + this.editorDisposables.add(this.editor.onDidChangeModel(() => { this.removeHighlightRange(); })); + this.editorDisposables.add(this.editor.onDidDispose(() => { this.removeHighlightRange(); this.editor = null; })); } } - private disposeEditorListeners() { - this.editorDisposables.forEach(disposable => disposable.dispose()); - this.editorDisposables = []; - } - private static readonly _WHOLE_LINE_RANGE_HIGHLIGHT = ModelDecorationOptions.register({ stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, className: 'rangeHighlight', @@ -117,7 +112,6 @@ export class RangeHighlightDecorations extends Disposable { if (this.editor && this.editor.getModel()) { this.removeHighlightRange(); - this.disposeEditorListeners(); this.editor = null; } } diff --git a/src/vs/workbench/contrib/markers/browser/markersTreeViewer.ts b/src/vs/workbench/contrib/markers/browser/markersTreeViewer.ts index dac61a035c0..ed087ccf8c0 100644 --- a/src/vs/workbench/contrib/markers/browser/markersTreeViewer.ts +++ b/src/vs/workbench/contrib/markers/browser/markersTreeViewer.ts @@ -15,7 +15,7 @@ import Messages from 'vs/workbench/contrib/markers/browser/messages'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { attachBadgeStyler } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { IDisposable, dispose, Disposable, toDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose, Disposable, toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { QuickFixAction, QuickFixActionViewItem } from 'vs/workbench/contrib/markers/browser/markersPanelActions'; import { ILabelService } from 'vs/platform/label/common/label'; @@ -143,7 +143,7 @@ export type FilterData = ResourceMarkersFilterData | MarkerFilterData | RelatedI export class ResourceMarkersRenderer implements ITreeRenderer { private renderedNodes = new Map, IResourceMarkersTemplateData>(); - private disposables: IDisposable[] = []; + private readonly disposables = new DisposableStore(); constructor( private labels: ResourceLabels, @@ -207,7 +207,7 @@ export class ResourceMarkersRenderer implements ITreeRenderer this.disposables = dispose(this.disposables))); } render(element: Marker, filterData: MarkerFilterData | undefined): void { this.actionBar.clear(); this.multilineActionbar.clear(); - if (this.disposables.length) { - this.disposables = dispose(this.disposables); - } + this.disposables.clear(); dom.clearNode(this.messageAndDetailsContainer); this.icon.className = `marker-icon ${SeverityIcon.className(MarkerSeverity.toSeverity(element.marker.severity))}`; @@ -275,8 +272,8 @@ class MarkerWidget extends Disposable { this.renderMultilineActionbar(element); this.renderMessageAndDetails(element, filterData); - this.disposables.push(dom.addDisposableListener(this.parent, dom.EventType.MOUSE_OVER, () => this.markersViewModel.onMarkerMouseHover(element))); - this.disposables.push(dom.addDisposableListener(this.parent, dom.EventType.MOUSE_LEAVE, () => this.markersViewModel.onMarkerMouseLeave(element))); + this.disposables.add(dom.addDisposableListener(this.parent, dom.EventType.MOUSE_OVER, () => this.markersViewModel.onMarkerMouseHover(element))); + this.disposables.add(dom.addDisposableListener(this.parent, dom.EventType.MOUSE_LEAVE, () => this.markersViewModel.onMarkerMouseLeave(element))); } private renderQuickfixActionbar(marker: Marker): void { diff --git a/src/vs/workbench/contrib/search/common/searchModel.ts b/src/vs/workbench/contrib/search/common/searchModel.ts index b843faa1662..5f8ba902bd9 100644 --- a/src/vs/workbench/contrib/search/common/searchModel.ts +++ b/src/vs/workbench/contrib/search/common/searchModel.ts @@ -8,7 +8,7 @@ import { CancellationTokenSource } from 'vs/base/common/cancellation'; import * as errors from 'vs/base/common/errors'; import { Emitter, Event } from 'vs/base/common/event'; import { getBaseLabel } from 'vs/base/common/labels'; -import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { ResourceMap, TernarySearchTree, values } from 'vs/base/common/map'; import * as objects from 'vs/base/common/objects'; import { lcut } from 'vs/base/common/strings'; @@ -1044,7 +1044,7 @@ export class RangeHighlightDecorations implements IDisposable { private _decorationId: string | null = null; private _model: ITextModel | null = null; - private _modelDisposables: IDisposable[] = []; + private readonly _modelDisposables = new DisposableStore(); constructor( @IModelService private readonly _modelService: IModelService @@ -1079,30 +1079,29 @@ export class RangeHighlightDecorations implements IDisposable { private setModel(model: ITextModel) { if (this._model !== model) { - this.disposeModelListeners(); + this.clearModelListeners(); this._model = model; - this._modelDisposables.push(this._model.onDidChangeDecorations((e) => { - this.disposeModelListeners(); + this._modelDisposables.add(this._model.onDidChangeDecorations((e) => { + this.clearModelListeners(); this.removeHighlightRange(); this._model = null; })); - this._modelDisposables.push(this._model.onWillDispose(() => { - this.disposeModelListeners(); + this._modelDisposables.add(this._model.onWillDispose(() => { + this.clearModelListeners(); this.removeHighlightRange(); this._model = null; })); } } - private disposeModelListeners() { - this._modelDisposables.forEach(disposable => disposable.dispose()); - this._modelDisposables = []; + private clearModelListeners() { + this._modelDisposables.clear(); } dispose() { if (this._model) { this.removeHighlightRange(); - this.disposeModelListeners(); + this._modelDisposables.dispose(); this._model = null; } } diff --git a/src/vs/workbench/contrib/splash/electron-browser/partsSplash.contribution.ts b/src/vs/workbench/contrib/splash/electron-browser/partsSplash.contribution.ts index 8fc47ec3f77..31de07b29b1 100644 --- a/src/vs/workbench/contrib/splash/electron-browser/partsSplash.contribution.ts +++ b/src/vs/workbench/contrib/splash/electron-browser/partsSplash.contribution.ts @@ -9,7 +9,7 @@ import { onDidChangeFullscreen, isFullscreen } from 'vs/base/browser/browser'; import { getTotalHeight, getTotalWidth } from 'vs/base/browser/dom'; import { Color } from 'vs/base/common/color'; import { Event } from 'vs/base/common/event'; -import { dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { DisposableStore } from 'vs/base/common/lifecycle'; import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { Registry } from 'vs/platform/registry/common/platform'; import { ColorIdentifier, editorBackground, foreground } from 'vs/platform/theme/common/colorRegistry'; @@ -30,7 +30,7 @@ class PartsSplash { private static readonly _splashElementId = 'monaco-parts-splash'; - private readonly _disposables: IDisposable[] = []; + private readonly _disposables = new DisposableStore(); private _didChangeTitleBarStyle: boolean; private _lastBaseTheme: string; @@ -64,7 +64,7 @@ class PartsSplash { } dispose(): void { - dispose(this._disposables); + this._disposables.dispose(); } private _savePartsSplash() { diff --git a/src/vs/workbench/contrib/tasks/common/problemCollectors.ts b/src/vs/workbench/contrib/tasks/common/problemCollectors.ts index b4d430db6c9..eac610b4d4a 100644 --- a/src/vs/workbench/contrib/tasks/common/problemCollectors.ts +++ b/src/vs/workbench/contrib/tasks/common/problemCollectors.ts @@ -6,7 +6,7 @@ import { IStringDictionary, INumberDictionary } from 'vs/base/common/collections'; import { URI } from 'vs/base/common/uri'; import { Event, Emitter } from 'vs/base/common/event'; -import { IDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { IModelService } from 'vs/editor/common/services/modelService'; @@ -43,7 +43,7 @@ export abstract class AbstractProblemCollector implements IDisposable { private buffer: string[]; private bufferLength: number; private openModels: IStringDictionary; - private modelListeners: IDisposable[]; + private readonly modelListeners = new DisposableStore(); private tail: Promise; // [owner] -> ApplyToKind @@ -77,7 +77,6 @@ export abstract class AbstractProblemCollector implements IDisposable { this._numberOfMatches = 0; this._maxMarkerSeverity = undefined; this.openModels = Object.create(null); - this.modelListeners = []; this.applyToByOwner = new Map(); for (let problemMatcher of problemMatchers) { let current = this.applyToByOwner.get(problemMatcher.owner); @@ -119,7 +118,7 @@ export abstract class AbstractProblemCollector implements IDisposable { protected abstract async processLineInternal(line: string): Promise; public dispose() { - this.modelListeners.forEach(disposable => disposable.dispose()); + this.modelListeners.dispose(); } public get numberOfMatches(): number { From 0964952bcd2f65be8877dc91f38965efca6d564c Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 3 Jul 2019 18:34:04 -0700 Subject: [PATCH 1059/1449] Marking almost all product fields as readonly --- .../product/browser/productService.ts | 4 +- src/vs/platform/product/common/product.ts | 158 +++++++++--------- .../platform/product/node/productService.ts | 4 +- 3 files changed, 83 insertions(+), 83 deletions(-) diff --git a/src/vs/platform/product/browser/productService.ts b/src/vs/platform/product/browser/productService.ts index 084144d009f..972e6aad642 100644 --- a/src/vs/platform/product/browser/productService.ts +++ b/src/vs/platform/product/browser/productService.ts @@ -25,9 +25,9 @@ export class ProductService implements IProductService { get urlProtocol(): string { return ''; } - get extensionAllowedProposedApi(): string[] { return this.productConfiguration ? this.productConfiguration.extensionAllowedProposedApi : []; } + get extensionAllowedProposedApi(): readonly string[] { return this.productConfiguration ? this.productConfiguration.extensionAllowedProposedApi : []; } - get uiExtensions(): string[] | undefined { return this.productConfiguration ? this.productConfiguration.uiExtensions : undefined; } + get uiExtensions(): readonly string[] | undefined { return this.productConfiguration ? this.productConfiguration.uiExtensions : undefined; } get enableTelemetry(): boolean { return false; } diff --git a/src/vs/platform/product/common/product.ts b/src/vs/platform/product/common/product.ts index 97f3fe3e5a4..90952c63254 100644 --- a/src/vs/platform/product/common/product.ts +++ b/src/vs/platform/product/common/product.ts @@ -10,103 +10,103 @@ export const IProductService = createDecorator('productService' export interface IProductService { _serviceBrand: any; - version: string; - commit?: string; + readonly version: string; + readonly commit?: string; - nameLong: string; - urlProtocol: string; - extensionAllowedProposedApi: string[]; - uiExtensions?: string[]; + readonly nameLong: string; + readonly urlProtocol: string; + readonly extensionAllowedProposedApi: readonly string[]; + readonly uiExtensions?: readonly string[]; - enableTelemetry: boolean; - extensionsGallery?: { - serviceUrl: string; - itemUrl: string; - controlUrl: string; - recommendationsUrl: string; + readonly enableTelemetry: boolean; + readonly extensionsGallery?: { + readonly serviceUrl: string; + readonly itemUrl: string; + readonly controlUrl: string; + readonly recommendationsUrl: string; }; - sendASmile?: { - reportIssueUrl: string; - requestFeatureUrl: string; + readonly sendASmile?: { + readonly reportIssueUrl: string; + readonly requestFeatureUrl: string; }; } export interface IProductConfiguration { nameShort: string; nameLong: string; - applicationName: string; - win32AppId: string; - win32x64AppId: string; - win32UserAppId: string; - win32x64UserAppId: string; - win32AppUserModelId: string; - win32MutexName: string; - darwinBundleIdentifier: string; - urlProtocol: string; + readonly applicationName: string; + readonly win32AppId: string; + readonly win32x64AppId: string; + readonly win32UserAppId: string; + readonly win32x64UserAppId: string; + readonly win32AppUserModelId: string; + readonly win32MutexName: string; + readonly darwinBundleIdentifier: string; + readonly urlProtocol: string; dataFolderName: string; - downloadUrl: string; - updateUrl?: string; - quality?: string; - target?: string; - commit?: string; - settingsSearchBuildId?: number; - settingsSearchUrl?: string; - experimentsUrl?: string; - date: string; - extensionsGallery?: { - serviceUrl: string; - itemUrl: string; - controlUrl: string; - recommendationsUrl: string; + readonly downloadUrl: string; + readonly updateUrl?: string; + readonly quality?: string; + readonly target?: string; + readonly commit?: string; + readonly settingsSearchBuildId?: number; + readonly settingsSearchUrl?: string; + readonly experimentsUrl?: string; + readonly date: string; + readonly extensionsGallery?: { + readonly serviceUrl: string; + readonly itemUrl: string; + readonly controlUrl: string; + readonly recommendationsUrl: string; }; extensionTips: { [id: string]: string; }; extensionImportantTips: { [id: string]: { name: string; pattern: string; }; }; - exeBasedExtensionTips: { [id: string]: { friendlyName: string, windowsPath?: string, recommendations: string[] }; }; - extensionKeywords: { [extension: string]: string[]; }; - extensionAllowedBadgeProviders: string[]; - extensionAllowedProposedApi: string[]; - keymapExtensionTips: string[]; - crashReporter: { - companyName: string; - productName: string; + readonly exeBasedExtensionTips: { [id: string]: { friendlyName: string, windowsPath?: string, recommendations: readonly string[] }; }; + readonly extensionKeywords: { [extension: string]: readonly string[]; }; + readonly extensionAllowedBadgeProviders: readonly string[]; + readonly extensionAllowedProposedApi: readonly string[]; + readonly keymapExtensionTips: readonly string[]; + readonly crashReporter: { + readonly companyName: string; + readonly productName: string; }; - welcomePage: string; - enableTelemetry: boolean; - aiConfig: { - asimovKey: string; + readonly welcomePage: string; + readonly enableTelemetry: boolean; + readonly aiConfig: { + readonly asimovKey: string; }; - sendASmile: { - reportIssueUrl: string, - requestFeatureUrl: string + readonly sendASmile: { + readonly reportIssueUrl: string, + readonly requestFeatureUrl: string }; - documentationUrl: string; - releaseNotesUrl: string; - keyboardShortcutsUrlMac: string; - keyboardShortcutsUrlLinux: string; - keyboardShortcutsUrlWin: string; - introductoryVideosUrl: string; - tipsAndTricksUrl: string; - newsletterSignupUrl: string; - twitterUrl: string; - requestFeatureUrl: string; - reportIssueUrl: string; - licenseUrl: string; - privacyStatementUrl: string; - telemetryOptOutUrl: string; - npsSurveyUrl: string; - surveys: ISurveyData[]; - checksums: { [path: string]: string; }; - checksumFailMoreInfoUrl: string; - hockeyApp: { - 'win32-ia32': string; - 'win32-x64': string; - 'linux-x64': string; - 'darwin': string; + readonly documentationUrl: string; + readonly releaseNotesUrl: string; + readonly keyboardShortcutsUrlMac: string; + readonly keyboardShortcutsUrlLinux: string; + readonly keyboardShortcutsUrlWin: string; + readonly introductoryVideosUrl: string; + readonly tipsAndTricksUrl: string; + readonly newsletterSignupUrl: string; + readonly twitterUrl: string; + readonly requestFeatureUrl: string; + readonly reportIssueUrl: string; + readonly licenseUrl: string; + readonly privacyStatementUrl: string; + readonly telemetryOptOutUrl: string; + readonly npsSurveyUrl: string; + readonly surveys: readonly ISurveyData[]; + readonly checksums: { [path: string]: string; }; + readonly checksumFailMoreInfoUrl: string; + readonly hockeyApp: { + readonly 'win32-ia32': string; + readonly 'win32-x64': string; + readonly 'linux-x64': string; + readonly 'darwin': string; }; - logUploaderUrl: string; - portable?: string; - uiExtensions?: string[]; + readonly logUploaderUrl: string; + readonly portable?: string; + readonly uiExtensions?: readonly string[]; } export interface ISurveyData { diff --git a/src/vs/platform/product/node/productService.ts b/src/vs/platform/product/node/productService.ts index b30475440d2..925b15e1d9a 100644 --- a/src/vs/platform/product/node/productService.ts +++ b/src/vs/platform/product/node/productService.ts @@ -20,9 +20,9 @@ export class ProductService implements IProductService { get urlProtocol(): string { return product.urlProtocol; } - get extensionAllowedProposedApi(): string[] { return product.extensionAllowedProposedApi; } + get extensionAllowedProposedApi(): readonly string[] { return product.extensionAllowedProposedApi; } - get uiExtensions(): string[] | undefined { return product.uiExtensions; } + get uiExtensions(): readonly string[] | undefined { return product.uiExtensions; } get enableTelemetry(): boolean { return product.enableTelemetry; } From 8cc05770c029c92dfd649b4ee11b3fbe20ad4fed Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 3 Jul 2019 20:38:03 -0700 Subject: [PATCH 1060/1449] Disable terminal tests failing on macOS Part of #76515 --- .../src/singlefolder-tests/terminal.test.ts | 166 +++++++++--------- 1 file changed, 83 insertions(+), 83 deletions(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts index 49c5834a3e4..9944d02fa92 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts @@ -95,92 +95,92 @@ suite('window namespace tests', () => { const renderer = window.createTerminalRenderer('foo'); }); - test('onDidChangeActiveTerminal should fire when new terminals are created', (done) => { - const reg1 = window.onDidChangeActiveTerminal((active: Terminal | undefined) => { - equal(active, terminal); - equal(active, window.activeTerminal); - reg1.dispose(); - const reg2 = window.onDidChangeActiveTerminal((active: Terminal | undefined) => { - equal(active, undefined); - equal(active, window.activeTerminal); - reg2.dispose(); - done(); - }); - terminal.dispose(); - }); - const terminal = window.createTerminal(); - terminal.show(); - }); + // test('onDidChangeActiveTerminal should fire when new terminals are created', (done) => { + // const reg1 = window.onDidChangeActiveTerminal((active: Terminal | undefined) => { + // equal(active, terminal); + // equal(active, window.activeTerminal); + // reg1.dispose(); + // const reg2 = window.onDidChangeActiveTerminal((active: Terminal | undefined) => { + // equal(active, undefined); + // equal(active, window.activeTerminal); + // reg2.dispose(); + // done(); + // }); + // terminal.dispose(); + // }); + // const terminal = window.createTerminal(); + // terminal.show(); + // }); - test('onDidChangeTerminalDimensions should fire when new terminals are created', (done) => { - const reg1 = window.onDidChangeTerminalDimensions(async (event: TerminalDimensionsChangeEvent) => { - equal(event.terminal, terminal1); - equal(typeof event.dimensions.columns, 'number'); - equal(typeof event.dimensions.rows, 'number'); - ok(event.dimensions.columns > 0); - ok(event.dimensions.rows > 0); - reg1.dispose(); - let terminal2: Terminal; - const reg2 = window.onDidOpenTerminal((newTerminal) => { - // This is guarantees to fire before dimensions change event - if (newTerminal !== terminal1) { - terminal2 = newTerminal; - reg2.dispose(); - } - }); - let firstCalled = false; - let secondCalled = false; - const reg3 = window.onDidChangeTerminalDimensions((event: TerminalDimensionsChangeEvent) => { - if (event.terminal === terminal1) { - // The original terminal should fire dimension change after a split - firstCalled = true; - } else if (event.terminal !== terminal1) { - // The new split terminal should fire dimension change - secondCalled = true; - } - if (firstCalled && secondCalled) { - let firstDisposed = false; - let secondDisposed = false; - const reg4 = window.onDidCloseTerminal(term => { - if (term === terminal1) { - firstDisposed = true; - } - if (term === terminal2) { - secondDisposed = true; - } - if (firstDisposed && secondDisposed) { - reg4.dispose(); - done(); - } - }); - terminal1.dispose(); - terminal2.dispose(); - reg3.dispose(); - } - }); - await timeout(500); - commands.executeCommand('workbench.action.terminal.split'); - }); - const terminal1 = window.createTerminal({ name: 'test' }); - terminal1.show(); - }); + // test('onDidChangeTerminalDimensions should fire when new terminals are created', (done) => { + // const reg1 = window.onDidChangeTerminalDimensions(async (event: TerminalDimensionsChangeEvent) => { + // equal(event.terminal, terminal1); + // equal(typeof event.dimensions.columns, 'number'); + // equal(typeof event.dimensions.rows, 'number'); + // ok(event.dimensions.columns > 0); + // ok(event.dimensions.rows > 0); + // reg1.dispose(); + // let terminal2: Terminal; + // const reg2 = window.onDidOpenTerminal((newTerminal) => { + // // This is guarantees to fire before dimensions change event + // if (newTerminal !== terminal1) { + // terminal2 = newTerminal; + // reg2.dispose(); + // } + // }); + // let firstCalled = false; + // let secondCalled = false; + // const reg3 = window.onDidChangeTerminalDimensions((event: TerminalDimensionsChangeEvent) => { + // if (event.terminal === terminal1) { + // // The original terminal should fire dimension change after a split + // firstCalled = true; + // } else if (event.terminal !== terminal1) { + // // The new split terminal should fire dimension change + // secondCalled = true; + // } + // if (firstCalled && secondCalled) { + // let firstDisposed = false; + // let secondDisposed = false; + // const reg4 = window.onDidCloseTerminal(term => { + // if (term === terminal1) { + // firstDisposed = true; + // } + // if (term === terminal2) { + // secondDisposed = true; + // } + // if (firstDisposed && secondDisposed) { + // reg4.dispose(); + // done(); + // } + // }); + // terminal1.dispose(); + // terminal2.dispose(); + // reg3.dispose(); + // } + // }); + // await timeout(500); + // commands.executeCommand('workbench.action.terminal.split'); + // }); + // const terminal1 = window.createTerminal({ name: 'test' }); + // terminal1.show(); + // }); suite('hideFromUser', () => { - test('should fire onDidWriteData correctly', done => { - const terminal = window.createTerminal({ name: 'bg', hideFromUser: true }); - let data = ''; - terminal.onDidWriteData(e => { - data += e; - if (data.indexOf('foo') !== -1) { - const reg3 = window.onDidCloseTerminal(() => { - reg3.dispose(); - done(); - }); - terminal.dispose(); - } - }); - terminal.sendText('foo'); - }); + // test('should fire onDidWriteData correctly', done => { + // const terminal = window.createTerminal({ name: 'bg', hideFromUser: true }); + // let data = ''; + // terminal.onDidWriteData(e => { + // data += e; + // if (data.indexOf('foo') !== -1) { + // const reg3 = window.onDidCloseTerminal(() => { + // reg3.dispose(); + // done(); + // }); + // terminal.dispose(); + // } + // }); + // terminal.sendText('foo'); + // }); test('should be available to terminals API', done => { const terminal = window.createTerminal({ name: 'bg', hideFromUser: true }); From 6e676ca49546f0d9935d2d8d534f789aa4d8c2a3 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 3 Jul 2019 20:43:52 -0700 Subject: [PATCH 1061/1449] Remove unused imports --- .../vscode-api-tests/src/singlefolder-tests/terminal.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts index 9944d02fa92..08329fcbc69 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { window, commands, Terminal, TerminalDimensionsChangeEvent, TerminalVirtualProcess, EventEmitter, TerminalDimensions } from 'vscode'; +import { window, Terminal, TerminalVirtualProcess, EventEmitter, TerminalDimensions } from 'vscode'; import { doesNotThrow, equal, ok } from 'assert'; suite('window namespace tests', () => { From 6a7d02f2f44446a7eda01abeb1c25122e148d264 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 3 Jul 2019 20:44:29 -0700 Subject: [PATCH 1062/1449] Remove unused function --- .../vscode-api-tests/src/singlefolder-tests/terminal.test.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts index 08329fcbc69..26b478b184a 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts @@ -338,7 +338,3 @@ suite('window namespace tests', () => { }); }); }); - -async function timeout(ms = 0): Promise { - return new Promise(resolve => setTimeout(() => resolve(), ms)); -} From 58ef8c63d191b5d4de96a9f198019114ea1391ed Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 07:28:16 +0200 Subject: [PATCH 1063/1449] try fix win32 build --- build/azure-pipelines/darwin/product-build-darwin.yml | 2 +- build/azure-pipelines/linux/product-build-linux-alpine.yml | 2 +- build/azure-pipelines/linux/product-build-linux-arm.yml | 2 +- build/azure-pipelines/linux/product-build-linux.yml | 2 +- build/azure-pipelines/product-compile.yml | 2 +- build/azure-pipelines/win32/product-build-win32.yml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index 97de15d0fd6..196ee25127d 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -1,7 +1,7 @@ steps: - script: | mkdir -p .build - echo $BUILD_SOURCEVERSION > .build/commit + echo -n $BUILD_SOURCEVERSION > .build/commit displayName: Prepare cache flag - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 diff --git a/build/azure-pipelines/linux/product-build-linux-alpine.yml b/build/azure-pipelines/linux/product-build-linux-alpine.yml index e9efbfa847c..5217877d733 100644 --- a/build/azure-pipelines/linux/product-build-linux-alpine.yml +++ b/build/azure-pipelines/linux/product-build-linux-alpine.yml @@ -1,7 +1,7 @@ steps: - script: | mkdir -p .build - echo $BUILD_SOURCEVERSION > .build/commit + echo -n $BUILD_SOURCEVERSION > .build/commit displayName: Prepare cache flag - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 diff --git a/build/azure-pipelines/linux/product-build-linux-arm.yml b/build/azure-pipelines/linux/product-build-linux-arm.yml index 61d3213a200..d5de8517abc 100644 --- a/build/azure-pipelines/linux/product-build-linux-arm.yml +++ b/build/azure-pipelines/linux/product-build-linux-arm.yml @@ -1,7 +1,7 @@ steps: - script: | mkdir -p .build - echo $BUILD_SOURCEVERSION > .build/commit + echo -n $BUILD_SOURCEVERSION > .build/commit displayName: Prepare cache flag - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 5156429dbd4..d56ee2d3c65 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -1,7 +1,7 @@ steps: - script: | mkdir -p .build - echo $BUILD_SOURCEVERSION > .build/commit + echo -n $BUILD_SOURCEVERSION > .build/commit displayName: Prepare cache flag - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 diff --git a/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml index a78c9ed8eea..9ac2225c569 100644 --- a/build/azure-pipelines/product-compile.yml +++ b/build/azure-pipelines/product-compile.yml @@ -1,7 +1,7 @@ steps: - script: | mkdir -p .build - echo $BUILD_SOURCEVERSION > .build/commit + echo -n $BUILD_SOURCEVERSION > .build/commit displayName: Prepare cache flag - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index a26696659a5..bd6d6d6a1f6 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -1,7 +1,7 @@ steps: - powershell: | mkdir .build -ea 0 - "$env:BUILD_SOURCEVERSION`n" | Out-File -NoNewLine .build\commit + "$env:BUILD_SOURCEVERSION" | Out-File -Encoding ascii -NoNewLine .build\commit displayName: Prepare cache flag - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 From fcad5db651cfe49e1c3f21b406fa944d3f7e2f83 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 07:58:12 +0200 Subject: [PATCH 1064/1449] use CHILD_CONCURRENCY --- build/azure-pipelines/win32/product-build-win32.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index bd6d6d6a1f6..244dd98809f 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -95,6 +95,7 @@ steps: - powershell: | . build/azure-pipelines/win32/exec.ps1 $ErrorActionPreference = "Stop" + $env:CHILD_CONCURRENCY="1" exec { node build/azure-pipelines/common/installDistroDependencies.js } exec { node build/azure-pipelines/common/installDistroDependencies.js remote } displayName: Install distro dependencies From 7471bf71c12d668e6b3e9ddaeb96d761bcc0d7cf Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 08:11:03 +0200 Subject: [PATCH 1065/1449] bring distro dependencies into cache too --- .../linux/product-build-linux.yml | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index d56ee2d3c65..5b689548c04 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -57,7 +57,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' @@ -67,9 +67,16 @@ steps: displayName: Install dependencies condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) +- script: | + set -e + node build/azure-pipelines/common/installDistroDependencies.js + node build/azure-pipelines/common/installDistroDependencies.js remote + displayName: Install distro dependencies + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) + - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) @@ -85,12 +92,6 @@ steps: yarn gulp mixin displayName: Mix in quality -- script: | - set -e - node build/azure-pipelines/common/installDistroDependencies.js - node build/azure-pipelines/common/installDistroDependencies.js remote - displayName: Install distro dependencies - - script: | set -e VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ From d8eb7c83d0b5b63a2d812726557d908d5c313059 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 08:14:16 +0200 Subject: [PATCH 1066/1449] more distro into cache --- build/azure-pipelines/linux/product-build-linux.yml | 7 +------ build/azure-pipelines/product-compile.yml | 6 ++++-- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 5b689548c04..58c74e2f486 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -64,14 +64,9 @@ steps: - script: | set -e yarn --frozen-lockfile - displayName: Install dependencies - condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - -- script: | - set -e node build/azure-pipelines/common/installDistroDependencies.js node build/azure-pipelines/common/installDistroDependencies.js remote - displayName: Install distro dependencies + displayName: Install dependencies condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 diff --git a/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml index 9ac2225c569..7120ca7fb31 100644 --- a/build/azure-pipelines/product-compile.yml +++ b/build/azure-pipelines/product-compile.yml @@ -56,7 +56,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) @@ -64,12 +64,14 @@ steps: - script: | set -e yarn --frozen-lockfile + node build/azure-pipelines/common/installDistroDependencies.js + node build/azure-pipelines/common/installDistroDependencies.js remote displayName: Install dependencies condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), ne(variables['CacheRestored'], 'true')) - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), ne(variables['CacheRestored'], 'true')) From 57e9f3e2db2a91bceb76627f0a4e241482b8d3ef Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 08:18:14 +0200 Subject: [PATCH 1067/1449] fix windows tests --- .../services/textfile/test/textFileService.io.test.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/services/textfile/test/textFileService.io.test.ts b/src/vs/workbench/services/textfile/test/textFileService.io.test.ts index 3337c56b2a2..8d4e1a407d1 100644 --- a/src/vs/workbench/services/textfile/test/textFileService.io.test.ts +++ b/src/vs/workbench/services/textfile/test/textFileService.io.test.ts @@ -247,7 +247,10 @@ suite('Files - TextFileService i/o', () => { } test('write - use encoding (cp1252)', async () => { - await testEncodingKeepsData(URI.file(join(testDir, 'some_cp1252.txt')), 'cp1252', ['ObjectCount = LoadObjects("Öffentlicher Ordner");', '', 'Private = "Persönliche Information"', ''].join(isWindows ? '\r\n' : '\n')); + const filePath = join(testDir, 'some_cp1252.txt'); + const contents = await readFile(filePath, 'utf8'); + const eol = /\r\n/.test(contents) ? '\r\n' : '\n'; + await testEncodingKeepsData(URI.file(filePath), 'cp1252', ['ObjectCount = LoadObjects("Öffentlicher Ordner");', '', 'Private = "Persönliche Information"', ''].join(eol)); }); test('write - use encoding (shiftjis)', async () => { From 796ce6b04a8370777fa94de340c42019a6bd883e Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 08:26:44 +0200 Subject: [PATCH 1068/1449] all platforms: move distro into cache --- .../darwin/product-build-darwin.yml | 12 ++++-------- .../linux/product-build-linux-alpine.yml | 6 ++++-- .../linux/product-build-linux-arm.yml | 6 ++++-- .../azure-pipelines/win32/product-build-win32.yml | 14 ++++---------- 4 files changed, 16 insertions(+), 22 deletions(-) diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index 196ee25127d..fab5872599d 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -56,19 +56,21 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' - script: | set -e yarn --frozen-lockfile + node build/azure-pipelines/common/installDistroDependencies.js + node build/azure-pipelines/common/installDistroDependencies.js remote displayName: Install dependencies condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) @@ -84,12 +86,6 @@ steps: yarn gulp mixin displayName: Mix in quality -- script: | - set -e - node build/azure-pipelines/common/installDistroDependencies.js - node build/azure-pipelines/common/installDistroDependencies.js remote - displayName: Install distro dependencies - - script: | set -e VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ diff --git a/build/azure-pipelines/linux/product-build-linux-alpine.yml b/build/azure-pipelines/linux/product-build-linux-alpine.yml index 5217877d733..c89d096e450 100644 --- a/build/azure-pipelines/linux/product-build-linux-alpine.yml +++ b/build/azure-pipelines/linux/product-build-linux-alpine.yml @@ -65,19 +65,21 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' - script: | set -e yarn --frozen-lockfile + node build/azure-pipelines/common/installDistroDependencies.js + node build/azure-pipelines/common/installDistroDependencies.js remote displayName: Install dependencies condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) diff --git a/build/azure-pipelines/linux/product-build-linux-arm.yml b/build/azure-pipelines/linux/product-build-linux-arm.yml index d5de8517abc..169331ef5cd 100644 --- a/build/azure-pipelines/linux/product-build-linux-arm.yml +++ b/build/azure-pipelines/linux/product-build-linux-arm.yml @@ -65,19 +65,21 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' - script: | set -e yarn --frozen-lockfile + node build/azure-pipelines/common/installDistroDependencies.js + node build/azure-pipelines/common/installDistroDependencies.js remote displayName: Install dependencies condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 244dd98809f..27c436da1cb 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -59,7 +59,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: '.build/arch, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' @@ -69,12 +69,14 @@ steps: $env:npm_config_arch="$(VSCODE_ARCH)" $env:CHILD_CONCURRENCY="1" exec { yarn --frozen-lockfile } + exec { node build/azure-pipelines/common/installDistroDependencies.js } + exec { node build/azure-pipelines/common/installDistroDependencies.js remote } displayName: Install dependencies condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: '.build/arch, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) @@ -92,14 +94,6 @@ steps: exec { yarn gulp mixin } displayName: Mix in quality -- powershell: | - . build/azure-pipelines/win32/exec.ps1 - $ErrorActionPreference = "Stop" - $env:CHILD_CONCURRENCY="1" - exec { node build/azure-pipelines/common/installDistroDependencies.js } - exec { node build/azure-pipelines/common/installDistroDependencies.js remote } - displayName: Install distro dependencies - - powershell: | . build/azure-pipelines/win32/exec.ps1 $ErrorActionPreference = "Stop" From 18d7ce89b727d6162fe7e16e5da9c6d554f8fde3 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 08:58:37 +0200 Subject: [PATCH 1069/1449] fixes #76556 --- extensions/git/src/commands.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 8b4a0923532..a9b53103702 100755 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -673,7 +673,6 @@ export class CommandCenter { if (!(resource instanceof Resource)) { // can happen when called from a keybinding - console.log('WHAT'); resource = this.getSCMResource(); } From 651fd1b4bd6fd9b595461a79deda7c4b7676393e Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 09:16:05 +0200 Subject: [PATCH 1070/1449] introduce VSCODE_COMPILE_ONLY --- build/azure-pipelines/product-build.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 359cc1e7faa..f8cb33c7354 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -17,7 +17,7 @@ jobs: - template: product-compile.yml - job: Windows - condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32'], 'true')) + condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_WIN32'], 'true')) timeoutInMinutes: 120 pool: vmImage: VS2017-Win2016 @@ -29,7 +29,7 @@ jobs: - template: win32/product-build-win32.yml - job: Windows32 - condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true')) + condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true')) timeoutInMinutes: 120 pool: vmImage: VS2017-Win2016 @@ -41,7 +41,7 @@ jobs: - template: win32/product-build-win32.yml - job: Linux - condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) + condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_LINUX'], 'true')) timeoutInMinutes: 120 pool: vmImage: 'Ubuntu-16.04' @@ -54,7 +54,7 @@ jobs: - template: linux/product-build-linux.yml - job: LinuxSnap - condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) + condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_LINUX'], 'true')) timeoutInMinutes: 120 pool: vmImage: 'Ubuntu-16.04' @@ -66,7 +66,7 @@ jobs: - template: linux/snap-build-linux.yml - job: LinuxArmhf - condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) + condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) timeoutInMinutes: 120 pool: vmImage: 'Ubuntu-16.04' @@ -78,7 +78,7 @@ jobs: - template: linux/product-build-linux-arm.yml - job: LinuxAlpine - condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) + condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) timeoutInMinutes: 120 pool: vmImage: 'Ubuntu-16.04' @@ -90,7 +90,7 @@ jobs: - template: linux/product-build-linux-alpine.yml - job: macOS - condition: and(succeeded(), eq(variables['VSCODE_BUILD_MACOS'], 'true')) + condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_MACOS'], 'true')) timeoutInMinutes: 120 pool: vmImage: macOS 10.13 @@ -100,7 +100,7 @@ jobs: - template: darwin/product-build-darwin.yml - job: Release - condition: and(succeeded(), or(eq(variables['VSCODE_RELEASE'], 'true'), and(or(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['VSCODE_QUALITY'], 'exploration')), eq(variables['Build.Reason'], 'Schedule')))) + condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), or(eq(variables['VSCODE_RELEASE'], 'true'), and(or(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['VSCODE_QUALITY'], 'exploration')), eq(variables['Build.Reason'], 'Schedule')))) pool: vmImage: 'Ubuntu-16.04' dependsOn: @@ -117,7 +117,7 @@ jobs: - job: Mooncake pool: vmImage: 'Ubuntu-16.04' - condition: succeededOrFailed() + condition: and(succeededOrFailed(), eq(variables['VSCODE_COMPILE_ONLY'], 'false')) dependsOn: - Windows - Windows32 From c509b0c5baa16ab6699c0547fd221c4a6090d027 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 09:21:51 +0200 Subject: [PATCH 1071/1449] cleanup multiarch --- .../alpine/build.sh} | 0 .../alpine/prebuild.sh} | 0 .../alpine/publish.sh} | 0 .../armhf/build.sh} | 0 .../armhf/prebuild.sh} | 0 .../armhf/publish.sh} | 0 .../linux/product-build-linux-alpine.yml | 119 ------------------ ....yml => product-build-linux-multiarch.yml} | 8 +- build/azure-pipelines/product-build.yml | 4 +- 9 files changed, 6 insertions(+), 125 deletions(-) rename build/azure-pipelines/linux/{build-alpine.sh => multiarch/alpine/build.sh} (100%) rename build/azure-pipelines/linux/{build-arm.sh => multiarch/alpine/prebuild.sh} (100%) rename build/azure-pipelines/linux/{prebuild-alpine.sh => multiarch/alpine/publish.sh} (100%) rename build/azure-pipelines/linux/{prebuild-arm.sh => multiarch/armhf/build.sh} (100%) rename build/azure-pipelines/linux/{publish-alpine.sh => multiarch/armhf/prebuild.sh} (100%) rename build/azure-pipelines/linux/{publish-arm.sh => multiarch/armhf/publish.sh} (100%) delete mode 100644 build/azure-pipelines/linux/product-build-linux-alpine.yml rename build/azure-pipelines/linux/{product-build-linux-arm.yml => product-build-linux-multiarch.yml} (92%) diff --git a/build/azure-pipelines/linux/build-alpine.sh b/build/azure-pipelines/linux/multiarch/alpine/build.sh similarity index 100% rename from build/azure-pipelines/linux/build-alpine.sh rename to build/azure-pipelines/linux/multiarch/alpine/build.sh diff --git a/build/azure-pipelines/linux/build-arm.sh b/build/azure-pipelines/linux/multiarch/alpine/prebuild.sh similarity index 100% rename from build/azure-pipelines/linux/build-arm.sh rename to build/azure-pipelines/linux/multiarch/alpine/prebuild.sh diff --git a/build/azure-pipelines/linux/prebuild-alpine.sh b/build/azure-pipelines/linux/multiarch/alpine/publish.sh similarity index 100% rename from build/azure-pipelines/linux/prebuild-alpine.sh rename to build/azure-pipelines/linux/multiarch/alpine/publish.sh diff --git a/build/azure-pipelines/linux/prebuild-arm.sh b/build/azure-pipelines/linux/multiarch/armhf/build.sh similarity index 100% rename from build/azure-pipelines/linux/prebuild-arm.sh rename to build/azure-pipelines/linux/multiarch/armhf/build.sh diff --git a/build/azure-pipelines/linux/publish-alpine.sh b/build/azure-pipelines/linux/multiarch/armhf/prebuild.sh similarity index 100% rename from build/azure-pipelines/linux/publish-alpine.sh rename to build/azure-pipelines/linux/multiarch/armhf/prebuild.sh diff --git a/build/azure-pipelines/linux/publish-arm.sh b/build/azure-pipelines/linux/multiarch/armhf/publish.sh similarity index 100% rename from build/azure-pipelines/linux/publish-arm.sh rename to build/azure-pipelines/linux/multiarch/armhf/publish.sh diff --git a/build/azure-pipelines/linux/product-build-linux-alpine.yml b/build/azure-pipelines/linux/product-build-linux-alpine.yml deleted file mode 100644 index c89d096e450..00000000000 --- a/build/azure-pipelines/linux/product-build-linux-alpine.yml +++ /dev/null @@ -1,119 +0,0 @@ -steps: -- script: | - mkdir -p .build - echo -n $BUILD_SOURCEVERSION > .build/commit - displayName: Prepare cache flag - -- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 - inputs: - keyfile: '.build/commit' - targetfolder: '.build, **/out-build' - vstsFeed: 'npm-vscode' - platformIndependent: true - alias: 'Compilation' - -- script: | - set -e - exit 1 - displayName: Check RestoreCache - condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) - -- task: NodeTool@0 - inputs: - versionSpec: "10.15.1" - -- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 - inputs: - versionSpec: "1.10.1" - -- task: AzureKeyVault@1 - displayName: 'Azure Key Vault: Get Secrets' - inputs: - azureSubscription: 'vscode-builds-subscription' - KeyVaultName: vscode - -- task: Docker@1 - displayName: 'Pull image' - inputs: - azureSubscriptionEndpoint: 'vscode-builds-subscription' - azureContainerRegistry: vscodehub.azurecr.io - command: 'Run an image' - imageName: 'vscode-linux-build-agent:alpine' - containerCommand: uname - -- script: | - set -e - - cat << EOF > ~/.netrc - machine monacotools.visualstudio.com - password $(devops-pat) - machine github.com - login vscode - password $(github-distro-mixin-password) - EOF - - git config user.email "vscode@microsoft.com" - git config user.name "VSCode" - displayName: Prepare tooling - -- script: | - set -e - git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git" - git fetch distro - git merge $(node -p "require('./package.json').distro") - displayName: Merge distro - -- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 - inputs: - keyfile: '.yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' - targetfolder: '**/node_modules, !**/node_modules/**/node_modules' - vstsFeed: 'npm-vscode' - -- script: | - set -e - yarn --frozen-lockfile - node build/azure-pipelines/common/installDistroDependencies.js - node build/azure-pipelines/common/installDistroDependencies.js remote - displayName: Install dependencies - condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - -- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 - inputs: - keyfile: '.yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' - targetfolder: '**/node_modules, !**/node_modules/**/node_modules' - vstsFeed: 'npm-vscode' - condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - -- script: | - set -e - yarn postinstall - displayName: Run postinstall scripts - condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) - -- script: | - set -e - yarn gulp mixin - displayName: Mix in quality - -- script: | - set -e - ./build/azure-pipelines/linux/prebuild-alpine.sh - displayName: Prepare build - -- script: | - set -e - ./build/azure-pipelines/linux/build-alpine.sh - displayName: Build - -- script: | - set -e - AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ - AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ - VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ - ./build/azure-pipelines/linux/publish-alpine.sh - displayName: Publish - -- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 - displayName: 'Component Detection' - continueOnError: true \ No newline at end of file diff --git a/build/azure-pipelines/linux/product-build-linux-arm.yml b/build/azure-pipelines/linux/product-build-linux-multiarch.yml similarity index 92% rename from build/azure-pipelines/linux/product-build-linux-arm.yml rename to build/azure-pipelines/linux/product-build-linux-multiarch.yml index 169331ef5cd..8365b09a404 100644 --- a/build/azure-pipelines/linux/product-build-linux-arm.yml +++ b/build/azure-pipelines/linux/product-build-linux-multiarch.yml @@ -38,7 +38,7 @@ steps: azureSubscriptionEndpoint: 'vscode-builds-subscription' azureContainerRegistry: vscodehub.azurecr.io command: 'Run an image' - imageName: 'vscode-linux-build-agent:armhf' + imageName: 'vscode-linux-build-agent:$(VSCODE_ARCH)' containerCommand: uname - script: | @@ -97,12 +97,12 @@ steps: - script: | set -e - ./build/azure-pipelines/linux/prebuild-arm.sh + ./build/azure-pipelines/linux/multiarch/$(VSCODE_ARCH)/prebuild.sh displayName: Prebuild - script: | set -e - ./build/azure-pipelines/linux/build-arm.sh + ./build/azure-pipelines/linux/multiarch/$(VSCODE_ARCH)/build.sh displayName: Build - script: | @@ -111,7 +111,7 @@ steps: AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ - ./build/azure-pipelines/linux/publish-arm.sh + ./build/azure-pipelines/linux/multiarch/$(VSCODE_ARCH)/publish.sh displayName: Publish - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index f8cb33c7354..ddaabdcdc72 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -75,7 +75,7 @@ jobs: dependsOn: - Compile steps: - - template: linux/product-build-linux-arm.yml + - template: linux/product-build-linux-multiarch.yml - job: LinuxAlpine condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) @@ -87,7 +87,7 @@ jobs: dependsOn: - Compile steps: - - template: linux/product-build-linux-alpine.yml + - template: linux/product-build-linux-multiarch.yml - job: macOS condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_MACOS'], 'true')) From 0d4bac8bbe0b1b3cfcd0bf637ab1548b4808a079 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 09:32:52 +0200 Subject: [PATCH 1072/1449] distro --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index d693271f2d3..f8746a0bc51 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "4da75531dc397fa0fc57820ea9ab863eceab9a64", + "distro": "989f7a3afc8ef2f0154a8affdf3bebf7d966f10f", "author": { "name": "Microsoft Corporation" }, @@ -156,4 +156,4 @@ "windows-mutex": "0.2.1", "windows-process-tree": "0.2.3" } -} +} \ No newline at end of file From 7c88e07cc69633729be10d25e8408707fce48bf4 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Thu, 4 Jul 2019 09:42:11 +0200 Subject: [PATCH 1073/1449] Update C++ grammar to get template fix --- extensions/cpp/cgmanifest.json | 2 +- extensions/cpp/syntaxes/cpp.tmLanguage.json | 717 +++++++++++++++++- .../cpp/test/colorize-results/test_cpp.json | 12 +- 3 files changed, 712 insertions(+), 19 deletions(-) diff --git a/extensions/cpp/cgmanifest.json b/extensions/cpp/cgmanifest.json index 71093e3ac0c..b6a12aa3af2 100644 --- a/extensions/cpp/cgmanifest.json +++ b/extensions/cpp/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "jeff-hykin/cpp-textmate-grammar", "repositoryUrl": "https://github.com/jeff-hykin/cpp-textmate-grammar", - "commitHash": "9c4f4b3291538d9f5144f02d3b6af877b84f2cb2" + "commitHash": "59f0673f04d6e5c8a4d1b3ccc5235ed8a4ccb6c0" } }, "license": "MIT", diff --git a/extensions/cpp/syntaxes/cpp.tmLanguage.json b/extensions/cpp/syntaxes/cpp.tmLanguage.json index 1b9cf4b3a77..9c0ca7e8464 100644 --- a/extensions/cpp/syntaxes/cpp.tmLanguage.json +++ b/extensions/cpp/syntaxes/cpp.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/jeff-hykin/cpp-textmate-grammar/commit/19ef66475b6bb21b5ed466cbcf8cef4e1b1fa212", + "version": "https://github.com/jeff-hykin/cpp-textmate-grammar/commit/59f0673f04d6e5c8a4d1b3ccc5235ed8a4ccb6c0", "name": "C++", "scopeName": "source.cpp", "patterns": [ @@ -299,6 +299,9 @@ }, "template_call_context": { "patterns": [ + { + "include": "#ever_present_context" + }, { "include": "#template_call_range" }, @@ -311,9 +314,6 @@ { "include": "#scope_resolution_template_call_inner_generated" }, - { - "include": "#user_defined_template_type" - }, { "include": "#operators" }, @@ -1370,10 +1370,6 @@ } ] }, - "user_defined_template_type": { - "match": "(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\()", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "5": { + "name": "storage.type.primitive.cpp storage.type.built-in.primitive.cpp" + }, + "6": { + "name": "storage.type.cpp storage.type.built-in.cpp" + }, + "7": { + "name": "support.type.posix-reserved.pthread.cpp support.type.built-in.posix-reserved.pthread.cpp" + }, + "8": { + "name": "support.type.posix-reserved.cpp support.type.built-in.posix-reserved.cpp" + }, + "9": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "10": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "11": { + "name": "comment.block.cpp" + }, + "12": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "13": { + "name": "punctuation.section.arguments.begin.bracket.round.initializer.cpp" + } + }, + "end": "(\\))", + "endCaptures": { + "1": { + "name": "punctuation.section.arguments.end.bracket.round.initializer.cpp" + } + }, + "patterns": [ + { + "include": "#evaluation_context" + } + ] + }, + { + "include": "#curly_initializer" + }, + { + "include": "#parameter_or_maybe_value" + }, + { + "include": "#comma" }, { "include": "#evaluation_context" @@ -4087,6 +4176,200 @@ } ] }, + "curly_initializer": { + "name": "meta.initialization.cpp", + "begin": "(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\{)", + "beginCaptures": { + "1": { + "name": "meta.qualified_type.cpp", + "patterns": [ + { + "match": "(?:class|struct|union|enum)", + "name": "storage.type.$0.cpp" + }, + { + "include": "#attributes_context" + }, + { + "include": "#function_type" + }, + { + "include": "#storage_types" + }, + { + "include": "#number_literal" + }, + { + "include": "#string_context_c" + }, + { + "include": "#comma" + }, + { + "include": "#scope_resolution_inner_generated" + }, + { + "include": "#template_call_range" + }, + { + "match": "(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*", + "name": "entity.name.type.cpp" + } + ] + }, + "2": { + "patterns": [ + { + "include": "#attributes_context" + }, + { + "include": "#number_literal" + } + ] + }, + "3": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "4": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "5": { + "name": "comment.block.cpp" + }, + "6": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "7": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "8": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "9": { + "name": "comment.block.cpp" + }, + "10": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "12": { + "patterns": [ + { + "include": "#scope_resolution_inner_generated" + } + ] + }, + "13": { + "name": "entity.name.scope-resolution.cpp" + }, + "14": { + "name": "meta.template.call.cpp", + "patterns": [ + { + "include": "#template_call_range" + } + ] + }, + "15": { + "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.cpp" + }, + "16": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "17": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "18": { + "name": "comment.block.cpp" + }, + "19": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "20": { + "name": "entity.name.type.cpp" + }, + "21": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "22": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "23": { + "name": "comment.block.cpp" + }, + "24": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "25": { + "name": "punctuation.section.arguments.begin.bracket.curly.initializer.cpp" + } + }, + "end": "(\\})", + "endCaptures": { + "1": { + "name": "punctuation.section.arguments.end.bracket.curly.initializer.cpp" + } + }, + "patterns": [ + { + "include": "#evaluation_context" + }, + { + "include": "#comma" + } + ] + }, "operator_overload": { "name": "meta.function.definition.special.operator-overload.cpp", "begin": "((?:(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))((?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?))?\\s*+((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*)(operator)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*)(?:(?:((?:\\+\\+|\\-\\-|\\(\\)|\\[\\]|\\->|\\+\\+|\\-\\-|\\+|\\-|!|~|\\*|&|new|new\\[\\]|delete|delete\\[\\]|\\->\\*|\\*|\\/|%|\\+|\\-|<<|>>|<=>|<|<=|>|>=|==|!=|&|\\^|\\||&&|\\|\\||=|\\+=|\\-=|\\*=|\\/=|%=|<<=|>>=|&=|\\^=|\\|=|,))|((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\[\\])?)))|(\"\")((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\<|\\())", @@ -6951,6 +7234,416 @@ } ] }, + "parameter_or_maybe_value": { + "name": "meta.parameter.cpp", + "begin": "((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\w)", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "end": "(?:(?=\\))|(,))", + "endCaptures": { + "1": { + "name": "comma.cpp punctuation.separator.delimiter.cpp" + } + }, + "patterns": [ + { + "include": "#function_pointer_parameter" + }, + { + "include": "#decltype" + }, + { + "include": "#vararg_ellipses" + }, + { + "match": "((?:((?:const|static|volatile|register|restrict|extern))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))|((?:short|signed|unsigned|long))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\w))+)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=,|\\)|=)", + "captures": { + "1": { + "patterns": [ + { + "include": "#storage_types" + } + ] + }, + "2": { + "name": "storage.modifier.specifier.parameter.cpp" + }, + "3": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "4": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "5": { + "name": "comment.block.cpp" + }, + "6": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "7": { + "name": "storage.modifier.specifier.parameter.cpp" + }, + "8": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "9": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "10": { + "name": "comment.block.cpp" + }, + "11": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "12": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "13": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "14": { + "name": "comment.block.cpp" + }, + "15": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "16": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "17": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "18": { + "name": "comment.block.cpp" + }, + "19": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "20": { + "name": "storage.type.primitive.cpp storage.type.built-in.primitive.cpp" + }, + "21": { + "name": "storage.type.cpp storage.type.built-in.cpp" + }, + "22": { + "name": "support.type.posix-reserved.pthread.cpp support.type.built-in.posix-reserved.pthread.cpp" + }, + "23": { + "name": "support.type.posix-reserved.cpp support.type.built-in.posix-reserved.cpp" + }, + "24": { + "name": "entity.name.type.parameter.cpp" + }, + "25": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "26": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "27": { + "name": "comment.block.cpp" + }, + "28": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + } + }, + { + "include": "#storage_types" + }, + { + "include": "#function_call" + }, + { + "include": "#scope_resolution_parameter_inner_generated" + }, + { + "match": "(?:class|struct|union|enum)", + "name": "storage.type.$0.cpp" + }, + { + "begin": "(?<==)", + "end": "(?:(?=\\))|(,))", + "endCaptures": { + "1": { + "name": "comma.cpp punctuation.separator.delimiter.cpp" + } + }, + "patterns": [ + { + "include": "#evaluation_context" + } + ] + }, + { + "include": "#assignment_operator" + }, + { + "match": "(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\)|,|\\[|=)", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "5": { + "name": "variable.parameter.cpp" + }, + "6": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "7": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "8": { + "name": "comment.block.cpp" + }, + "9": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + } + }, + { + "include": "#attributes_context" + }, + { + "name": "meta.bracket.square.array.cpp", + "begin": "(\\[)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.begin.bracket.square.array.type.cpp" + } + }, + "end": "(\\])", + "endCaptures": { + "1": { + "name": "punctuation.definition.end.bracket.square.array.type.cpp" + } + }, + "patterns": [ + { + "include": "#evaluation_context" + } + ] + }, + { + "match": "(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "5": { + "name": "storage.modifier.pointer.cpp" + }, + "6": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "7": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "8": { + "name": "comment.block.cpp" + }, + "9": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "10": { + "name": "storage.modifier.reference.cpp" + }, + "11": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "12": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "13": { + "name": "comment.block.cpp" + }, + "14": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + } + } + ] + }, "parameter": { "name": "meta.parameter.cpp", "begin": "((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\w)", @@ -7183,7 +7876,7 @@ "include": "#assignment_operator" }, { - "match": "(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\)|,|\\[|=)", + "match": "(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\)|,|\\[|=|\\n)", "captures": { "1": { "patterns": [ @@ -7643,7 +8336,7 @@ "name": "variable.other.macro.argument.cpp" }, "lambdas": { - "begin": "((?:(?<=[^\\s]|^)(?])|(?<=\\Wreturn|^return))\\s*(\\[(?!\\[))((?:.*\\[.*?\\].*?)*.*?)(\\]))", + "begin": "((?:(?<=[^\\s]|^)(?])|(?<=\\Wreturn|^return))\\s*(\\[(?!\\[))((?:[^\\]\\[]*\\[.*?\\](?!\\s*\\[)[^\\]\\[]*?)*[^\\]\\[]*?)(\\](?!\\[)))", "beginCaptures": { "2": { "name": "punctuation.definition.capture.begin.lambda.cpp" @@ -7762,7 +8455,7 @@ ] }, "enumerator_list": { - "match": "((? Date: Thu, 4 Jul 2019 09:52:47 +0200 Subject: [PATCH 1074/1449] define locale resource in env --- src/vs/platform/environment/common/environment.ts | 1 + src/vs/platform/environment/node/environmentService.ts | 3 +++ .../localizations/browser/localizations.contribution.ts | 4 +--- .../contrib/localizations/browser/localizationsActions.ts | 4 +--- .../services/environment/browser/environmentService.ts | 2 ++ 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index 3215343d2a3..422ec4493a6 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -113,6 +113,7 @@ export interface IEnvironmentService { settingsResource: URI; keybindingsResource: URI; keyboardLayoutResource: URI; + localeResource: URI; machineSettingsHome: URI; machineSettingsResource: URI; diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts index 4574a54ea6c..744c9b936fe 100644 --- a/src/vs/platform/environment/node/environmentService.ts +++ b/src/vs/platform/environment/node/environmentService.ts @@ -144,6 +144,9 @@ export class EnvironmentService implements IEnvironmentService { @memoize get keyboardLayoutResource(): URI { return resources.joinPath(this.userRoamingDataHome, 'keyboardLayout.json'); } + @memoize + get localeResource(): URI { return resources.joinPath(this.userRoamingDataHome, 'locale.json'); } + @memoize get isExtensionDevelopment(): boolean { return !!this._args.extensionDevelopmentPath; } diff --git a/src/vs/workbench/contrib/localizations/browser/localizations.contribution.ts b/src/vs/workbench/contrib/localizations/browser/localizations.contribution.ts index 16782ec97ab..14d37470b81 100644 --- a/src/vs/workbench/contrib/localizations/browser/localizations.contribution.ts +++ b/src/vs/workbench/contrib/localizations/browser/localizations.contribution.ts @@ -28,7 +28,6 @@ import { minimumTranslatedStrings } from 'vs/workbench/contrib/localizations/bro import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { CancellationToken } from 'vs/base/common/cancellation'; import { ExtensionType } from 'vs/platform/extensions/common/extensions'; -import { joinPath } from 'vs/base/common/resources'; // Register action to configure locale and related settings const registry = Registry.as(Extensions.WorkbenchActions); @@ -81,8 +80,7 @@ export class LocalizationWorkbenchContribution extends Disposable implements IWo [{ label: updateAndRestart ? localize('yes', "Yes") : localize('restart now', "Restart Now"), run: () => { - const localeResource = joinPath(this.environmentService.userRoamingDataHome, 'locale.json'); - const updatePromise = updateAndRestart ? this.jsonEditingService.write(localeResource, { key: 'locale', value: locale }, true) : Promise.resolve(undefined); + const updatePromise = updateAndRestart ? this.jsonEditingService.write(this.environmentService.localeResource, { key: 'locale', value: locale }, true) : Promise.resolve(undefined); updatePromise.then(() => this.windowsService.relaunch({}), e => this.notificationService.error(e)); } }, { diff --git a/src/vs/workbench/contrib/localizations/browser/localizationsActions.ts b/src/vs/workbench/contrib/localizations/browser/localizationsActions.ts index 78482e99314..b09ecb92ba9 100644 --- a/src/vs/workbench/contrib/localizations/browser/localizationsActions.ts +++ b/src/vs/workbench/contrib/localizations/browser/localizationsActions.ts @@ -16,7 +16,6 @@ import { firstIndex } from 'vs/base/common/arrays'; import { IExtensionsViewlet, VIEWLET_ID as EXTENSIONS_VIEWLET_ID } from 'vs/workbench/contrib/extensions/common/extensions'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; -import { joinPath } from 'vs/base/common/resources'; export class ConfigureLocaleAction extends Action { public static readonly ID = 'workbench.action.configureLocale'; @@ -66,8 +65,7 @@ export class ConfigureLocaleAction extends Action { } if (selectedLanguage) { - const localeFile = joinPath(this.environmentService.userRoamingDataHome, 'locale.json'); - await this.jsonEditingService.write(localeFile, { key: 'locale', value: selectedLanguage.label }, true); + await this.jsonEditingService.write(this.environmentService.localeResource, { key: 'locale', value: selectedLanguage.label }, true); const restart = await this.dialogService.confirm({ type: 'info', message: localize('relaunchDisplayLanguageMessage', "A restart is required for the change in display language to take effect."), diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts index 8964e52e5e7..f6945be12a3 100644 --- a/src/vs/workbench/services/environment/browser/environmentService.ts +++ b/src/vs/workbench/services/environment/browser/environmentService.ts @@ -73,6 +73,7 @@ export class BrowserWorkbenchEnvironmentService implements IEnvironmentService { this.settingsResource = joinPath(this.userRoamingDataHome, 'settings.json'); this.keybindingsResource = joinPath(this.userRoamingDataHome, 'keybindings.json'); this.keyboardLayoutResource = joinPath(this.userRoamingDataHome, 'keyboardLayout.json'); + this.localeResource = joinPath(this.userRoamingDataHome, 'locale.json'); this.logsPath = '/web/logs'; @@ -100,6 +101,7 @@ export class BrowserWorkbenchEnvironmentService implements IEnvironmentService { settingsResource: URI; keybindingsResource: URI; keyboardLayoutResource: URI; + localeResource: URI; machineSettingsHome: URI; machineSettingsResource: URI; settingsSearchBuildId?: number; From e1128437ff78242b269e03aad52164431cf224d9 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 09:53:15 +0200 Subject: [PATCH 1075/1449] bring back CHILD_CONCURRENCY=1 --- build/azure-pipelines/darwin/product-build-darwin.yml | 2 +- build/azure-pipelines/linux/product-build-linux-multiarch.yml | 2 +- build/azure-pipelines/linux/product-build-linux.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index fab5872599d..067fd0331c0 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -62,7 +62,7 @@ steps: - script: | set -e - yarn --frozen-lockfile + CHILD_CONCURRENCY=1 yarn --frozen-lockfile node build/azure-pipelines/common/installDistroDependencies.js node build/azure-pipelines/common/installDistroDependencies.js remote displayName: Install dependencies diff --git a/build/azure-pipelines/linux/product-build-linux-multiarch.yml b/build/azure-pipelines/linux/product-build-linux-multiarch.yml index 8365b09a404..68c988bdc31 100644 --- a/build/azure-pipelines/linux/product-build-linux-multiarch.yml +++ b/build/azure-pipelines/linux/product-build-linux-multiarch.yml @@ -71,7 +71,7 @@ steps: - script: | set -e - yarn --frozen-lockfile + CHILD_CONCURRENCY=1 yarn --frozen-lockfile node build/azure-pipelines/common/installDistroDependencies.js node build/azure-pipelines/common/installDistroDependencies.js remote displayName: Install dependencies diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 58c74e2f486..a30e74adea4 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -63,7 +63,7 @@ steps: - script: | set -e - yarn --frozen-lockfile + CHILD_CONCURRENCY=1 yarn --frozen-lockfile node build/azure-pipelines/common/installDistroDependencies.js node build/azure-pipelines/common/installDistroDependencies.js remote displayName: Install dependencies From c9579851c81e158970bd7734b2b26fa9c6c470da Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 10:17:08 +0200 Subject: [PATCH 1076/1449] move optimization & minification to shared agent --- build/azure-pipelines/darwin/product-build-darwin.yml | 2 +- .../azure-pipelines/linux/product-build-linux-multiarch.yml | 2 +- build/azure-pipelines/linux/product-build-linux.yml | 2 +- build/azure-pipelines/product-compile.yml | 5 +++-- build/azure-pipelines/win32/product-build-win32.yml | 2 +- build/gulpfile.vscode.js | 3 ++- 6 files changed, 9 insertions(+), 7 deletions(-) diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index 067fd0331c0..6a50f82662d 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -7,7 +7,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: keyfile: '.build/commit' - targetfolder: '.build, **/out-build' + targetfolder: '.build, **/out-vscode-min' vstsFeed: 'npm-vscode' platformIndependent: true alias: 'Compilation' diff --git a/build/azure-pipelines/linux/product-build-linux-multiarch.yml b/build/azure-pipelines/linux/product-build-linux-multiarch.yml index 68c988bdc31..b1ebcc02e62 100644 --- a/build/azure-pipelines/linux/product-build-linux-multiarch.yml +++ b/build/azure-pipelines/linux/product-build-linux-multiarch.yml @@ -7,7 +7,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: keyfile: '.build/commit' - targetfolder: '.build, **/out-build' + targetfolder: '.build, **/out-vscode-min' vstsFeed: 'npm-vscode' platformIndependent: true alias: 'Compilation' diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index a30e74adea4..c70cdb6d530 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -7,7 +7,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: keyfile: '.build/commit' - targetfolder: '.build, **/out-build' + targetfolder: '.build, **/out-vscode-min' vstsFeed: 'npm-vscode' platformIndependent: true alias: 'Compilation' diff --git a/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml index ddd2baf5e45..8f2189fed12 100644 --- a/build/azure-pipelines/product-compile.yml +++ b/build/azure-pipelines/product-compile.yml @@ -7,7 +7,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: keyfile: '.build/commit' - targetfolder: '.build, **/out-build' + targetfolder: '.build, **/out-vscode-min' vstsFeed: 'npm-vscode' platformIndependent: true alias: 'Compilation' @@ -99,13 +99,14 @@ steps: set -e yarn gulp compile-build yarn gulp compile-extensions-build + yarn gulp minify-vscode displayName: Compile condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: keyfile: '.build/commit' - targetfolder: '.build, **/out-build' + targetfolder: '.build, **/out-vscode-min' vstsFeed: 'npm-vscode' platformIndependent: true alias: 'Compilation' diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 27c436da1cb..a7e097fed36 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -7,7 +7,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: keyfile: '.build/commit' - targetfolder: '.build, **/out-build' + targetfolder: '.build, **/out-vscode-min' vstsFeed: 'npm-vscode' platformIndependent: true alias: 'Compilation' diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 90082925121..bdb49e71c7e 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -116,6 +116,7 @@ const minifyVSCodeTask = task.define('minify-vscode', task.series( }, common.minifyTask('out-vscode', `${sourceMappingURLBase}/core`) )); +gulp.task(minifyVSCodeTask); // Package @@ -437,7 +438,6 @@ BUILD_TARGETS.forEach(buildTarget => { const destinationFolderName = `VSCode${dashed(platform)}${dashed(arch)}`; const vscodeTaskCI = task.define(`vscode${dashed(platform)}${dashed(arch)}${dashed(minified)}-ci`, task.series( - minified ? minifyVSCodeTask : optimizeVSCodeTask, util.rimraf(path.join(buildRoot, destinationFolderName)), packageTask(platform, arch, sourceFolderName, destinationFolderName, opts) )); @@ -446,6 +446,7 @@ BUILD_TARGETS.forEach(buildTarget => { const vscodeTask = task.define(`vscode${dashed(platform)}${dashed(arch)}${dashed(minified)}`, task.series( compileBuildTask, compileExtensionsBuildTask, + minified ? minifyVSCodeTask : optimizeVSCodeTask, vscodeTaskCI )); gulp.task(vscodeTask); From 7980cd2697482e14a1f2ea9a8a36c064aebc180b Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 4 Jul 2019 10:19:40 +0200 Subject: [PATCH 1077/1449] replace mutation observer with dom#asDomUri, #75061 --- src/vs/base/browser/dom.ts | 22 +++++ src/vs/base/browser/htmlContentRenderer.ts | 9 +- .../browser/services/codeEditorServiceImpl.ts | 4 +- .../browser/menuEntryActionViewItem.ts | 6 +- .../api/browser/viewsExtensionPoint.ts | 6 +- .../parts/activitybar/activitybarActions.ts | 2 +- .../parts/quickinput/quickInputUtils.ts | 4 +- .../browser/parts/views/customView.ts | 2 +- .../browser/resourceServiceWorkerClient.ts | 83 ------------------- .../webview/browser/webviewEditorInput.ts | 6 +- .../{common => browser}/fileIconThemeData.ts | 5 +- .../{common => browser}/fileIconThemeStore.ts | 2 +- .../themes/browser/workbenchThemeService.ts | 6 +- 13 files changed, 50 insertions(+), 107 deletions(-) rename src/vs/workbench/services/themes/{common => browser}/fileIconThemeData.ts (98%) rename src/vs/workbench/services/themes/{common => browser}/fileIconThemeStore.ts (99%) diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index e201902ae24..2ea764a81e1 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -14,6 +14,8 @@ import { Emitter, Event } from 'vs/base/common/event'; import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import * as platform from 'vs/base/common/platform'; import { coalesce } from 'vs/base/common/arrays'; +import { URI } from 'vs/base/common/uri'; +import { Schemas } from 'vs/base/common/network'; export function clearNode(node: HTMLElement): void { while (node.firstChild) { @@ -1181,3 +1183,23 @@ export function animate(fn: () => void): IDisposable { let stepDisposable = scheduleAtNextAnimationFrame(step); return toDisposable(() => stepDisposable.dispose()); } + + + +const _location = URI.parse(window.location.href); + +export function asDomUri(uri: URI): URI { + if (!uri) { + return uri; + } + if (!platform.isWeb) { + //todo@joh remove this once we have sw in electron going + return uri; + } + if (Schemas.vscodeRemote === uri.scheme) { + // rewrite vscode-remote-uris to uris of the window location + // so that they can be intercepted by the service worker + return _location.with({ path: '/vscode-resources/fetch', query: uri.toString() }); + } + return uri; +} diff --git a/src/vs/base/browser/htmlContentRenderer.ts b/src/vs/base/browser/htmlContentRenderer.ts index a5c2821936d..68fe5d89e22 100644 --- a/src/vs/base/browser/htmlContentRenderer.ts +++ b/src/vs/base/browser/htmlContentRenderer.ts @@ -75,12 +75,15 @@ export function renderMarkdown(markdown: IMarkdownString, options: RenderOptions return encodeURIComponent(JSON.stringify(data)); }; - const _href = function (href: string): string { + const _href = function (href: string, isDomUri: boolean): string { const data = markdown.uris && markdown.uris[href]; if (!data) { return href; } let uri = URI.revive(data); + if (isDomUri) { + uri = DOM.asDomUri(uri); + } if (uri.query) { uri = uri.with({ query: _uriMassage(uri.query) }); } @@ -97,7 +100,7 @@ export function renderMarkdown(markdown: IMarkdownString, options: RenderOptions const renderer = new marked.Renderer(); renderer.image = (href: string, title: string, text: string) => { - href = _href(href); + href = _href(href, true); let dimensions: string[] = []; if (href) { const splitted = href.split('|').map(s => s.trim()); @@ -138,7 +141,7 @@ export function renderMarkdown(markdown: IMarkdownString, options: RenderOptions if (href === text) { // raw link case text = removeMarkdownEscapes(text); } - href = _href(href); + href = _href(href, false); title = removeMarkdownEscapes(title); href = removeMarkdownEscapes(href); if ( diff --git a/src/vs/editor/browser/services/codeEditorServiceImpl.ts b/src/vs/editor/browser/services/codeEditorServiceImpl.ts index 0779fe452a4..f439007c476 100644 --- a/src/vs/editor/browser/services/codeEditorServiceImpl.ts +++ b/src/vs/editor/browser/services/codeEditorServiceImpl.ts @@ -399,7 +399,7 @@ class DecorationCSSRules { if (typeof opts !== 'undefined') { this.collectBorderSettingsCSSText(opts, cssTextArr); if (typeof opts.contentIconPath !== 'undefined') { - cssTextArr.push(strings.format(_CSS_MAP.contentIconPath, URI.revive(opts.contentIconPath).toString(true).replace(/'/g, '%27'))); + cssTextArr.push(strings.format(_CSS_MAP.contentIconPath, dom.asDomUri(URI.revive(opts.contentIconPath)).toString(true).replace(/'/g, '%27'))); } if (typeof opts.contentText === 'string') { const truncated = opts.contentText.match(/^.*$/m)![0]; // only take first line @@ -426,7 +426,7 @@ class DecorationCSSRules { const cssTextArr: string[] = []; if (typeof opts.gutterIconPath !== 'undefined') { - cssTextArr.push(strings.format(_CSS_MAP.gutterIconPath, URI.revive(opts.gutterIconPath).toString(true).replace(/'/g, '%27'))); + cssTextArr.push(strings.format(_CSS_MAP.gutterIconPath, dom.asDomUri(URI.revive(opts.gutterIconPath)).toString(true).replace(/'/g, '%27'))); if (typeof opts.gutterIconSize !== 'undefined') { cssTextArr.push(strings.format(_CSS_MAP.gutterIconSize, opts.gutterIconSize)); } diff --git a/src/vs/platform/actions/browser/menuEntryActionViewItem.ts b/src/vs/platform/actions/browser/menuEntryActionViewItem.ts index 2ec3d2e5d78..76729934062 100644 --- a/src/vs/platform/actions/browser/menuEntryActionViewItem.ts +++ b/src/vs/platform/actions/browser/menuEntryActionViewItem.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { addClasses, createCSSRule, removeClasses } from 'vs/base/browser/dom'; +import { addClasses, createCSSRule, removeClasses, asDomUri } from 'vs/base/browser/dom'; import { domEvent } from 'vs/base/browser/event'; import { ActionViewItem, Separator } from 'vs/base/browser/ui/actionbar/actionbar'; import { IAction } from 'vs/base/common/actions'; @@ -244,8 +244,8 @@ export class MenuEntryActionViewItem extends ActionViewItem { iconClass = MenuEntryActionViewItem.ICON_PATH_TO_CSS_RULES.get(iconPathMapKey)!; } else { iconClass = ids.nextId(); - createCSSRule(`.icon.${iconClass}`, `background-image: url("${(item.iconLocation.light || item.iconLocation.dark).toString()}")`); - createCSSRule(`.vs-dark .icon.${iconClass}, .hc-black .icon.${iconClass}`, `background-image: url("${item.iconLocation.dark.toString()}")`); + createCSSRule(`.icon.${iconClass}`, `background-image: url("${asDomUri(item.iconLocation.light || item.iconLocation.dark).toString()}")`); + createCSSRule(`.vs-dark .icon.${iconClass}, .hc-black .icon.${iconClass}`, `background-image: url("${asDomUri(item.iconLocation.dark).toString()}")`); MenuEntryActionViewItem.ICON_PATH_TO_CSS_RULES.set(iconPathMapKey, iconClass); } diff --git a/src/vs/workbench/api/browser/viewsExtensionPoint.ts b/src/vs/workbench/api/browser/viewsExtensionPoint.ts index 7a2b3b679e5..687ce57cd78 100644 --- a/src/vs/workbench/api/browser/viewsExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsExtensionPoint.ts @@ -36,7 +36,7 @@ import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; -import { createCSSRule } from 'vs/base/browser/dom'; +import { createCSSRule, asDomUri } from 'vs/base/browser/dom'; export interface IUserFriendlyViewsContainerDescriptor { id: string; @@ -327,7 +327,7 @@ class ViewsExtensionHandler implements IWorkbenchContribution { // Generate CSS to show the icon in the activity bar const iconClass = `.monaco-workbench .activitybar .monaco-action-bar .action-label.${cssClass}`; - createCSSRule(iconClass, `-webkit-mask: url('${icon}') no-repeat 50% 50%; -webkit-mask-size: 24px;`); + createCSSRule(iconClass, `-webkit-mask: url('${asDomUri(icon)}') no-repeat 50% 50%; -webkit-mask-size: 24px;`); } return viewContainer; @@ -456,4 +456,4 @@ class ViewsExtensionHandler implements IWorkbenchContribution { } const workbenchRegistry = Registry.as(WorkbenchExtensions.Workbench); -workbenchRegistry.registerWorkbenchContribution(ViewsExtensionHandler, LifecyclePhase.Starting); \ No newline at end of file +workbenchRegistry.registerWorkbenchContribution(ViewsExtensionHandler, LifecyclePhase.Starting); diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts index 1138e9db748..873dc45aadf 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts @@ -173,7 +173,7 @@ export class PlaceHolderViewletActivityAction extends ViewletActivityAction { super({ id, name: id, cssClass: `extensionViewlet-placeholder-${id.replace(/\./g, '-')}` }, viewletService, layoutService, telemetryService); const iconClass = `.monaco-workbench .activitybar .monaco-action-bar .action-label.${this.class}`; // Generate Placeholder CSS to show the icon in the activity bar - DOM.createCSSRule(iconClass, `-webkit-mask: url('${iconUrl || ''}') no-repeat 50% 50%; -webkit-mask-size: 24px;`); + DOM.createCSSRule(iconClass, `-webkit-mask: url('${DOM.asDomUri(iconUrl) || ''}') no-repeat 50% 50%; -webkit-mask-size: 24px;`); } setActivity(activity: IActivity): void { diff --git a/src/vs/workbench/browser/parts/quickinput/quickInputUtils.ts b/src/vs/workbench/browser/parts/quickinput/quickInputUtils.ts index 3ea185f4750..209fbe1cff4 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInputUtils.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInputUtils.ts @@ -22,8 +22,8 @@ export function getIconClass(iconPath: { dark: URI; light?: URI; } | undefined): iconClass = iconPathToClass[key]; } else { iconClass = iconClassGenerator.nextId(); - dom.createCSSRule(`.${iconClass}`, `background-image: url("${(iconPath.light || iconPath.dark).toString()}")`); - dom.createCSSRule(`.vs-dark .${iconClass}, .hc-black .${iconClass}`, `background-image: url("${iconPath.dark.toString()}")`); + dom.createCSSRule(`.${iconClass}`, `background-image: url("${dom.asDomUri(iconPath.light || iconPath.dark).toString()}")`); + dom.createCSSRule(`.vs-dark .${iconClass}, .hc-black .${iconClass}`, `background-image: url("${dom.asDomUri(iconPath.dark).toString()}")`); iconPathToClass[key] = iconClass; } diff --git a/src/vs/workbench/browser/parts/views/customView.ts b/src/vs/workbench/browser/parts/views/customView.ts index 5a758eb786f..11812612e5d 100644 --- a/src/vs/workbench/browser/parts/views/customView.ts +++ b/src/vs/workbench/browser/parts/views/customView.ts @@ -674,7 +674,7 @@ class TreeRenderer implements IRenderer { templateData.resourceLabel.setResource({ name: label, description }, { title, hideIcon: true, extraClasses: ['custom-view-tree-node-item-resourceLabel'], matches }); } - templateData.icon.style.backgroundImage = iconUrl ? `url('${iconUrl.toString(true)}')` : ''; + templateData.icon.style.backgroundImage = iconUrl ? `url('${DOM.asDomUri(iconUrl).toString(true)}')` : ''; DOM.toggleClass(templateData.icon, 'custom-view-tree-node-item-icon', !!iconUrl); templateData.actionBar.context = ({ $treeViewId: this.treeViewId, $treeItemHandle: node.handle }); templateData.actionBar.push(this.menus.getResourceActions(node), { icon: true, label: false }); diff --git a/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerClient.ts b/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerClient.ts index bed5775bf1e..a8d6c9ee756 100644 --- a/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerClient.ts +++ b/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerClient.ts @@ -10,88 +10,6 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IWorkbenchContributionsRegistry, Extensions } from 'vs/workbench/common/contributions'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; -// todo@joh explore alternative, explicit approach -class ResourcesMutationObserver { - - private readonly _urlCache = new Map(); - private readonly _observer: MutationObserver; - - private readonly _regexp = /url\(('|")?(vscode-remote:\/\/(.*?))\1\)/ig; - - constructor() { - this._observer = new MutationObserver(r => this._handleMutation(r)); - this._observer.observe(document, { - subtree: true, - childList: true, - attributes: true, - attributeFilter: ['style'] - }); - this.scan(); - } - - scan(): void { - document.querySelectorAll('style').forEach(value => this._handleStyleNode(value)); - // todo@joh more! - } - - dispose(): void { - this._observer.disconnect(); - this._urlCache.forEach(value => URL.revokeObjectURL(value)); - } - - private _handleMutation(records: MutationRecord[]): void { - for (const record of records) { - if (record.target.nodeName === 'STYLE') { - // style-element directly modified - this._handleStyleNode(record.target); - - } else if (record.target.nodeName === 'HEAD' && record.type === 'childList') { - // style-element added to head - record.addedNodes.forEach(node => { - if (node.nodeName === 'STYLE') { - this._handleStyleNode(node); - } - }); - } else if (record.type === 'attributes') { - // style-attribute - this._handleAttrMutation(record.target); - } - } - } - - private _handleStyleNode(target: Node): void { - if (target.textContent && target.textContent.indexOf('vscode-remote://') >= 0) { - const content = target.textContent; - this._rewriteUrls(content).then(value => { - if (content === target.textContent) { - target.textContent = value; - } - }).catch(e => { - console.error(e); - }); - } - } - - private _handleAttrMutation(target: Node): void { - const styleValue = (target).getAttribute('style'); - if (styleValue && styleValue.indexOf('vscode-remote://') >= 0) { - this._rewriteUrls(styleValue).then(value => { - if (value !== styleValue) { - (target).setAttribute('style', value); - } - }).catch(e => { - console.error(e); - }); - } - } - - private async _rewriteUrls(textContent: string): Promise { - return textContent.replace(this._regexp, function (_m, quote = '', url) { - return `url(${quote}${location.href}vscode-resources/fetch?${encodeURIComponent(url)}${quote})`; - }); - } -} - class ResourceServiceWorker { private readonly _disposables = new DisposableStore(); @@ -114,7 +32,6 @@ class ResourceServiceWorker { return navigator.serviceWorker.ready; }).then(() => { // console.log('ready'); - this._disposables.add(new ResourcesMutationObserver()); }).catch(err => { console.error(err); }); diff --git a/src/vs/workbench/contrib/webview/browser/webviewEditorInput.ts b/src/vs/workbench/contrib/webview/browser/webviewEditorInput.ts index 6d4d096a9c7..d0619038471 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewEditorInput.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewEditorInput.ts @@ -39,10 +39,10 @@ export class WebviewEditorInput extends EditorInput { this._icons.forEach((value, key) => { const webviewSelector = `.show-file-icons .webview-${key}-name-file-icon::before`; if (URI.isUri(value)) { - cssRules.push(`${webviewSelector} { content: ""; background-image: url(${value.toString()}); }`); + cssRules.push(`${webviewSelector} { content: ""; background-image: url(${dom.asDomUri(value).toString()}); }`); } else { - cssRules.push(`.vs ${webviewSelector} { content: ""; background-image: url(${value.light.toString()}); }`); - cssRules.push(`.vs-dark ${webviewSelector} { content: ""; background-image: url(${value.dark.toString()}); }`); + cssRules.push(`.vs ${webviewSelector} { content: ""; background-image: url(${dom.asDomUri(value.light).toString()}); }`); + cssRules.push(`.vs-dark ${webviewSelector} { content: ""; background-image: url(${dom.asDomUri(value.dark).toString()}); }`); } }); this._styleElement.innerHTML = cssRules.join('\n'); diff --git a/src/vs/workbench/services/themes/common/fileIconThemeData.ts b/src/vs/workbench/services/themes/browser/fileIconThemeData.ts similarity index 98% rename from src/vs/workbench/services/themes/common/fileIconThemeData.ts rename to src/vs/workbench/services/themes/browser/fileIconThemeData.ts index efdaaaef68c..3059579a649 100644 --- a/src/vs/workbench/services/themes/common/fileIconThemeData.ts +++ b/src/vs/workbench/services/themes/browser/fileIconThemeData.ts @@ -11,6 +11,7 @@ import * as Json from 'vs/base/common/json'; import { ExtensionData, IThemeExtensionPoint, IFileIconTheme } from 'vs/workbench/services/themes/common/workbenchThemeService'; import { IFileService } from 'vs/platform/files/common/files'; import { getParseErrorMessage } from 'vs/base/common/jsonErrorMessages'; +import { asDomUri } from 'vs/base/browser/dom'; export class FileIconThemeData implements IFileIconTheme { id: string; @@ -331,7 +332,7 @@ function _processIconThemeDocument(id: string, iconThemeDocumentLocation: URI, i let fonts = iconThemeDocument.fonts; if (Array.isArray(fonts)) { fonts.forEach(font => { - let src = font.src.map(l => `url('${resolvePath(l.path)}') format('${l.format}')`).join(', '); + let src = font.src.map(l => `url('${asDomUri(resolvePath(l.path))}') format('${l.format}')`).join(', '); cssRules.push(`@font-face { src: ${src}; font-family: '${font.id}'; font-weight: ${font.weight}; font-style: ${font.style}; }`); }); cssRules.push(`.show-file-icons .file-icon::before, .show-file-icons .folder-icon::before, .show-file-icons .rootfolder-icon::before { font-family: '${fonts[0].id}'; font-size: ${fonts[0].size || '150%'}}`); @@ -342,7 +343,7 @@ function _processIconThemeDocument(id: string, iconThemeDocumentLocation: URI, i let definition = iconThemeDocument.iconDefinitions[defId]; if (definition) { if (definition.iconPath) { - cssRules.push(`${selectors.join(', ')} { content: ' '; background-image: url("${resolvePath(definition.iconPath)}"); }`); + cssRules.push(`${selectors.join(', ')} { content: ' '; background-image: url("${asDomUri(resolvePath(definition.iconPath))}"); }`); } if (definition.fontCharacter || definition.fontColor) { let body = ''; diff --git a/src/vs/workbench/services/themes/common/fileIconThemeStore.ts b/src/vs/workbench/services/themes/browser/fileIconThemeStore.ts similarity index 99% rename from src/vs/workbench/services/themes/common/fileIconThemeStore.ts rename to src/vs/workbench/services/themes/browser/fileIconThemeStore.ts index dfc2b180f4e..e4eb557f54c 100644 --- a/src/vs/workbench/services/themes/common/fileIconThemeStore.ts +++ b/src/vs/workbench/services/themes/browser/fileIconThemeStore.ts @@ -11,7 +11,7 @@ import { ExtensionsRegistry, ExtensionMessageCollector } from 'vs/workbench/serv import { ExtensionData, IThemeExtensionPoint } from 'vs/workbench/services/themes/common/workbenchThemeService'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { Event, Emitter } from 'vs/base/common/event'; -import { FileIconThemeData } from 'vs/workbench/services/themes/common/fileIconThemeData'; +import { FileIconThemeData } from 'vs/workbench/services/themes/browser/fileIconThemeData'; import { URI } from 'vs/base/common/uri'; import { Disposable } from 'vs/base/common/lifecycle'; diff --git a/src/vs/workbench/services/themes/browser/workbenchThemeService.ts b/src/vs/workbench/services/themes/browser/workbenchThemeService.ts index d17412a1930..84cf2bb355b 100644 --- a/src/vs/workbench/services/themes/browser/workbenchThemeService.ts +++ b/src/vs/workbench/services/themes/browser/workbenchThemeService.ts @@ -19,8 +19,8 @@ import { Event, Emitter } from 'vs/base/common/event'; import { registerFileIconThemeSchemas } from 'vs/workbench/services/themes/common/fileIconThemeSchema'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { ColorThemeStore } from 'vs/workbench/services/themes/common/colorThemeStore'; -import { FileIconThemeStore } from 'vs/workbench/services/themes/common/fileIconThemeStore'; -import { FileIconThemeData } from 'vs/workbench/services/themes/common/fileIconThemeData'; +import { FileIconThemeStore } from 'vs/workbench/services/themes/browser/fileIconThemeStore'; +import { FileIconThemeData } from 'vs/workbench/services/themes/browser/fileIconThemeData'; import { removeClasses, addClasses } from 'vs/base/browser/dom'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IFileService, FileChangeType } from 'vs/platform/files/common/files'; @@ -696,4 +696,4 @@ const tokenColorCustomizationConfiguration: IConfigurationNode = { }; configurationRegistry.registerConfiguration(tokenColorCustomizationConfiguration); -registerSingleton(IWorkbenchThemeService, WorkbenchThemeService); \ No newline at end of file +registerSingleton(IWorkbenchThemeService, WorkbenchThemeService); From d1f35d42412968b606f9d4e87c0b6c3429368e48 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 10:21:36 +0200 Subject: [PATCH 1078/1449] minify darwin --- build/azure-pipelines/darwin/product-build-darwin.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index 6a50f82662d..f38f3841fb2 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -89,11 +89,11 @@ steps: - script: | set -e VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-darwin-ci + yarn gulp vscode-darwin-min-ci VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-reh-darwin-ci + yarn gulp vscode-reh-darwin-min-ci VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-web-darwin-ci + yarn gulp vscode-web-darwin-min-ci AZURE_STORAGE_ACCESS_KEY="$(ticino-storage-key)" \ yarn gulp upload-vscode-sourcemaps displayName: Build From 3e025bdd3fa12bef8bbe42a5adc231fde2f70181 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 10:33:04 +0200 Subject: [PATCH 1079/1449] bring back arch dependent yarn cache --- build/azure-pipelines/win32/product-build-win32.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index a7e097fed36..aa53410c54c 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -59,7 +59,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: '.yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.build/arch, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' @@ -76,7 +76,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: '.yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.build/arch, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) From befa9e6f429de4c94b949d19152314ff81d37f87 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Thu, 4 Jul 2019 10:44:41 +0200 Subject: [PATCH 1080/1449] Add ID check for resolvedTasks --- src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts index e235b3821cc..159adeadfa4 100644 --- a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts +++ b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts @@ -1238,7 +1238,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer if (configuringTask.type === this._providerTypes.get(handle)) { try { const resolvedTask = await provider.resolveTask(configuringTask); - if (resolvedTask) { + if (resolvedTask && (resolvedTask._id === configuringTask._id)) { result.add(key, TaskConfig.createCustomTask(resolvedTask, configuringTask)); return; } From 6c61f43084d7d659665b460d85ccd18897e4088c Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 4 Jul 2019 10:49:39 +0200 Subject: [PATCH 1081/1449] history - allow to navigate with mouse buttons 3/4 --- src/vs/code/electron-main/window.ts | 17 ++++----- .../browser/workbench.contribution.ts | 8 ++++- src/vs/workbench/common/editor.ts | 1 + .../services/history/browser/history.ts | 36 ++++++++++++++++++- 4 files changed, 50 insertions(+), 12 deletions(-) diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index bbfe1bd21a0..3889550305b 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -373,9 +373,6 @@ export class CodeWindow extends Disposable implements ICodeWindow { } }); - // App commands support - this.registerNavigationListenerOn('app-command', 'browser-backward', 'browser-forward', false); - // Window Focus this._win.on('focus', () => { this._lastFocusTime = Date.now(); @@ -466,23 +463,23 @@ export class CodeWindow extends Disposable implements ICodeWindow { if (isMacintosh) { const config = this.configurationService.getValue(); if (config && config.workbench && config.workbench.editor && config.workbench.editor.swipeToNavigate) { - this.registerNavigationListenerOn('swipe', 'left', 'right', true); + this.registerSwipeListener(); } else { this._win.removeAllListeners('swipe'); } } } - private registerNavigationListenerOn(command: 'swipe' | 'app-command', back: 'left' | 'browser-backward', forward: 'right' | 'browser-forward', acrossEditors: boolean) { - this._win.on(command as 'swipe' /* | 'app-command' */, (e: Electron.Event, cmd: string) => { + private registerSwipeListener() { + this._win.on('swipe', (event: Electron.Event, cmd: string) => { if (!this.isReady) { return; // window must be ready } - if (cmd === back) { - this.send('vscode:runAction', { id: acrossEditors ? 'workbench.action.openPreviousRecentlyUsedEditor' : 'workbench.action.navigateBack', from: 'mouse' } as IRunActionInWindowRequest); - } else if (cmd === forward) { - this.send('vscode:runAction', { id: acrossEditors ? 'workbench.action.openNextRecentlyUsedEditor' : 'workbench.action.navigateForward', from: 'mouse' } as IRunActionInWindowRequest); + if (cmd === 'left') { + this.send('vscode:runAction', { id: 'workbench.action.openPreviousRecentlyUsedEditor', from: 'mouse' } as IRunActionInWindowRequest); + } else if (cmd === 'right') { + this.send('vscode:runAction', { id: 'workbench.action.openNextRecentlyUsedEditor', from: 'mouse' } as IRunActionInWindowRequest); } }); } diff --git a/src/vs/workbench/browser/workbench.contribution.ts b/src/vs/workbench/browser/workbench.contribution.ts index e13b2539b22..dc449eb18c5 100644 --- a/src/vs/workbench/browser/workbench.contribution.ts +++ b/src/vs/workbench/browser/workbench.contribution.ts @@ -111,7 +111,13 @@ import { isMacintosh, isWindows, isLinux, isWeb } from 'vs/base/common/platform' 'type': 'boolean', 'description': nls.localize('swipeToNavigate', "Navigate between open files using three-finger swipe horizontally."), 'default': false, - 'included': isMacintosh + 'included': isMacintosh && !isWeb + }, + 'workbench.editor.mouseBackForwardToNavigate': { + 'type': 'boolean', + 'description': nls.localize('mouseBackForwardToNavigate', "Navigate between open files using mouse buttons four and five if provided."), + 'default': true, + 'included': !isMacintosh }, 'workbench.editor.restoreViewState': { 'type': 'boolean', diff --git a/src/vs/workbench/common/editor.ts b/src/vs/workbench/common/editor.ts index 3515bc8d82d..3286b47068e 100644 --- a/src/vs/workbench/common/editor.ts +++ b/src/vs/workbench/common/editor.ts @@ -987,6 +987,7 @@ interface IEditorPartConfiguration { closeEmptyGroups?: boolean; revealIfOpen?: boolean; swipeToNavigate?: boolean; + mouseBackForwardToNavigate?: boolean; labelFormat?: 'default' | 'short' | 'medium' | 'long'; restoreViewState?: boolean; } diff --git a/src/vs/workbench/services/history/browser/history.ts b/src/vs/workbench/services/history/browser/history.ts index c276acb6f6a..91e3136b50e 100644 --- a/src/vs/workbench/services/history/browser/history.ts +++ b/src/vs/workbench/services/history/browser/history.ts @@ -32,6 +32,7 @@ import { IContextKeyService, RawContextKey, IContextKey } from 'vs/platform/cont import { coalesce } from 'vs/base/common/arrays'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { withNullAsUndefined } from 'vs/base/common/types'; +import { addDisposableListener, EventType, EventHelper } from 'vs/base/browser/dom'; /** * Stores the selection & view state of an editor and allows to compare it to other selection states. @@ -140,7 +141,7 @@ export class HistoryService extends Disposable implements IHistoryService { @IWindowService private readonly windowService: IWindowService, @IInstantiationService private readonly instantiationService: IInstantiationService, @IWorkbenchLayoutService private readonly layoutService: IWorkbenchLayoutService, - @IContextKeyService private readonly contextKeyService: IContextKeyService + @IContextKeyService private readonly contextKeyService: IContextKeyService, ) { super(); @@ -184,6 +185,39 @@ export class HistoryService extends Disposable implements IHistoryService { if (this.editorService.activeControl) { this.onActiveEditorChanged(); } + + // Mouse back/forward support + const mouseBackForwardSupportListener = this._register(new DisposableStore()); + const handleMouseBackForwardSupport = () => { + mouseBackForwardSupportListener.clear(); + + if (this.configurationService.getValue('workbench.editor.mouseBackForwardToNavigate')) { + mouseBackForwardSupportListener.add(addDisposableListener(this.layoutService.getWorkbenchElement(), EventType.MOUSE_DOWN, e => this.onMouseDown(e))); + } + }; + + this._register(this.configurationService.onDidChangeConfiguration(event => { + if (event.affectsConfiguration('workbench.editor.mouseBackForwardToNavigate')) { + handleMouseBackForwardSupport(); + } + })); + + handleMouseBackForwardSupport(); + } + + private onMouseDown(e: MouseEvent): void { + + // Support to navigate in history when mouse buttons 4/5 are pressed + switch (e.button) { + case 3: + EventHelper.stop(e); + this.back(); + break; + case 4: + EventHelper.stop(e); + this.forward(); + break; + } } private onActiveEditorChanged(): void { From e684bf532db0137cc5e380f0b2e8d2dbd512b4e5 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 10:51:54 +0200 Subject: [PATCH 1082/1449] also minify reh, web --- build/azure-pipelines/darwin/product-build-darwin.yml | 2 +- .../azure-pipelines/linux/product-build-linux-multiarch.yml | 2 +- build/azure-pipelines/linux/product-build-linux.yml | 2 +- build/azure-pipelines/product-compile.yml | 6 ++++-- build/azure-pipelines/win32/product-build-win32.yml | 2 +- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index f38f3841fb2..3d1d017505f 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -7,7 +7,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: keyfile: '.build/commit' - targetfolder: '.build, **/out-vscode-min' + targetfolder: '.build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' vstsFeed: 'npm-vscode' platformIndependent: true alias: 'Compilation' diff --git a/build/azure-pipelines/linux/product-build-linux-multiarch.yml b/build/azure-pipelines/linux/product-build-linux-multiarch.yml index b1ebcc02e62..46eb0775e77 100644 --- a/build/azure-pipelines/linux/product-build-linux-multiarch.yml +++ b/build/azure-pipelines/linux/product-build-linux-multiarch.yml @@ -7,7 +7,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: keyfile: '.build/commit' - targetfolder: '.build, **/out-vscode-min' + targetfolder: '.build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' vstsFeed: 'npm-vscode' platformIndependent: true alias: 'Compilation' diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index c70cdb6d530..104ae18c348 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -7,7 +7,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: keyfile: '.build/commit' - targetfolder: '.build, **/out-vscode-min' + targetfolder: '.build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' vstsFeed: 'npm-vscode' platformIndependent: true alias: 'Compilation' diff --git a/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml index 8f2189fed12..983cb37e7bc 100644 --- a/build/azure-pipelines/product-compile.yml +++ b/build/azure-pipelines/product-compile.yml @@ -7,7 +7,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: keyfile: '.build/commit' - targetfolder: '.build, **/out-vscode-min' + targetfolder: '.build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' vstsFeed: 'npm-vscode' platformIndependent: true alias: 'Compilation' @@ -100,13 +100,15 @@ steps: yarn gulp compile-build yarn gulp compile-extensions-build yarn gulp minify-vscode + yarn gulp minify-vscode-reh + yarn gulp minify-vscode-server displayName: Compile condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: keyfile: '.build/commit' - targetfolder: '.build, **/out-vscode-min' + targetfolder: '.build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' vstsFeed: 'npm-vscode' platformIndependent: true alias: 'Compilation' diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index aa53410c54c..1eefe48c59e 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -7,7 +7,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: keyfile: '.build/commit' - targetfolder: '.build, **/out-vscode-min' + targetfolder: '.build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' vstsFeed: 'npm-vscode' platformIndependent: true alias: 'Compilation' From 576ef867251054d909efdbb7d085e1714c527634 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 10:52:35 +0200 Subject: [PATCH 1083/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f8746a0bc51..3a1b3924462 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "989f7a3afc8ef2f0154a8affdf3bebf7d966f10f", + "distro": "dacd8b27bee0359d7f3e95bff093755ac17c7496", "author": { "name": "Microsoft Corporation" }, From a9de23d3215e436bcc713fe6763d6185f0a7b774 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 11:01:25 +0200 Subject: [PATCH 1084/1449] fix master build --- build/azure-pipelines/win32/product-build-win32.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index e6f663f0e31..d7d1ebee867 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -27,7 +27,7 @@ steps: exec { git config user.name "VSCode" } mkdir .build -ea 0 - echo $(VSCODE_ARCH) > .build\arch + "$(VSCODE_ARCH)" | Out-File -Encoding ascii -NoNewLine .build\arch displayName: Prepare tooling - powershell: | From 0be0a4d30426d3a30233bf974f5d79a8776469f0 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 11:11:04 +0200 Subject: [PATCH 1085/1449] fix build --- build/azure-pipelines/product-compile.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml index 983cb37e7bc..9d3ede095b1 100644 --- a/build/azure-pipelines/product-compile.yml +++ b/build/azure-pipelines/product-compile.yml @@ -101,7 +101,7 @@ steps: yarn gulp compile-extensions-build yarn gulp minify-vscode yarn gulp minify-vscode-reh - yarn gulp minify-vscode-server + yarn gulp minify-vscode-web displayName: Compile condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) From 60dcb1acd01fcd7631aa02d9538a0bd974e257a3 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 4 Jul 2019 11:26:54 +0200 Subject: [PATCH 1086/1449] list files return only files --- .../services/userData/common/fileUserDataProvider.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/services/userData/common/fileUserDataProvider.ts b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts index f8540b74506..3b8ad172fe3 100644 --- a/src/vs/workbench/services/userData/common/fileUserDataProvider.ts +++ b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts @@ -82,7 +82,11 @@ export class FileUserDataProvider extends Disposable implements IUserDataProvide const resource = this.toResource(path); try { const result = await this.fileService.resolve(resource); - return result.children ? result.children.map(c => this.toRelativePath(c.resource, resource)!) : []; + if (result.children) { + return result.children + .filter(c => !c.isDirectory) + .map(c => this.toRelativePath(c.resource, resource)!); + } } catch (error) { } return []; From 3a87cea73dfaf923bf5baa3318f971d854785d1d Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 4 Jul 2019 11:44:50 +0200 Subject: [PATCH 1087/1449] Improve tests --- src/vs/editor/common/model/textModelTokens.ts | 25 -------- .../test/common/model/model.modes.test.ts | 57 +++++++------------ 2 files changed, 20 insertions(+), 62 deletions(-) diff --git a/src/vs/editor/common/model/textModelTokens.ts b/src/vs/editor/common/model/textModelTokens.ts index 3c02042e7bf..2e7dab70df9 100644 --- a/src/vs/editor/common/model/textModelTokens.ts +++ b/src/vs/editor/common/model/textModelTokens.ts @@ -192,15 +192,11 @@ export interface ITokensStore { getBeginState(lineIndex: number): IState | null; applyEdits(range: Range, eolCount: number, firstLineLength: number): void; - - _getAllStates(linesLength: number): (IState | null)[]; - _getAllInvalid(linesLength: number): number[]; } export class TokensStore implements ITokensStore { private _tokens: ModelLineTokens[]; private _invalidLineStartIndex: number; - private _lastState: IState | null; constructor(initialState: IState | null) { this._reset(initialState); @@ -209,7 +205,6 @@ export class TokensStore implements ITokensStore { private _reset(initialState: IState | null): void { this._tokens = []; this._invalidLineStartIndex = 0; - this._lastState = null; if (initialState) { this._setBeginState(0, initialState); @@ -310,7 +305,6 @@ export class TokensStore implements ITokensStore { // Check if this was the last line if (lineIndex === linesLength - 1) { - this._lastState = r.endState; return; } @@ -423,25 +417,6 @@ export class TokensStore implements ITokensStore { } //#endregion - - _getAllStates(linesLength: number): (IState | null)[] { - const r: (IState | null)[] = []; - for (let i = 0; i < linesLength; i++) { - r[i] = this.getBeginState(i); - } - r[linesLength] = this._lastState; - return r; - } - - _getAllInvalid(linesLength: number): number[] { - const r: number[] = []; - for (let i = 0; i < linesLength; i++) { - if (!this._isValid(i)) { - r.push(i); - } - } - return r; - } } export interface IModelLinesTokens { diff --git a/src/vs/editor/test/common/model/model.modes.test.ts b/src/vs/editor/test/common/model/model.modes.test.ts index 4252f69541e..f0408ea58aa 100644 --- a/src/vs/editor/test/common/model/model.modes.test.ts +++ b/src/vs/editor/test/common/model/model.modes.test.ts @@ -170,30 +170,23 @@ suite('Editor Model - Model Modes 2', () => { } } + let calledFor: string[] = []; + + function checkAndClear(arr: string[]): void { + assert.deepEqual(calledFor, arr); + calledFor = []; + } + const tokenizationSupport: modes.ITokenizationSupport = { getInitialState: () => new ModelState2(''), tokenize: undefined!, tokenize2: (line: string, state: modes.IState): TokenizationResult2 => { + calledFor.push(line); (state).prevLineContent = line; return new TokenizationResult2(null!, state); } }; - function invalidEqual(model: TextModel, expected: number[]): void { - assert.deepEqual(model._tokens._getAllInvalid(model.getLineCount()), expected); - } - - function stateEqual(state: modes.IState, content: string): void { - assert.equal((state).prevLineContent, content); - } - - function statesEqual(model: TextModel, expectedStates: string[]): void { - const actualStates = model._tokens._getAllStates(model.getLineCount()); - for (let i = 0, len = expectedStates.length; i < len; i++) { - stateEqual(actualStates[i]!, expectedStates[i]); - } - } - let thisModel: TextModel; let languageRegistration: IDisposable; @@ -216,64 +209,54 @@ suite('Editor Model - Model Modes 2', () => { test('getTokensForInvalidLines one text insert', () => { thisModel.forceTokenization(5); - statesEqual(thisModel, ['', 'Line1', 'Line2', 'Line3', 'Line4', 'Line5']); + checkAndClear(['Line1', 'Line2', 'Line3', 'Line4', 'Line5']); thisModel.applyEdits([EditOperation.insert(new Position(1, 6), '-')]); - invalidEqual(thisModel, [0]); - statesEqual(thisModel, ['', 'Line1', 'Line2', 'Line3', 'Line4', 'Line5']); thisModel.forceTokenization(5); - statesEqual(thisModel, ['', 'Line1-', 'Line2', 'Line3', 'Line4', 'Line5']); + checkAndClear(['Line1-', 'Line2']); }); test('getTokensForInvalidLines two text insert', () => { thisModel.forceTokenization(5); - statesEqual(thisModel, ['', 'Line1', 'Line2', 'Line3', 'Line4', 'Line5']); + checkAndClear(['Line1', 'Line2', 'Line3', 'Line4', 'Line5']); thisModel.applyEdits([ EditOperation.insert(new Position(1, 6), '-'), EditOperation.insert(new Position(3, 6), '-') ]); - invalidEqual(thisModel, [0, 2]); thisModel.forceTokenization(5); - statesEqual(thisModel, ['', 'Line1-', 'Line2', 'Line3-', 'Line4', 'Line5']); + checkAndClear(['Line1-', 'Line2', 'Line3-', 'Line4']); }); test('getTokensForInvalidLines one multi-line text insert, one small text insert', () => { thisModel.forceTokenization(5); - statesEqual(thisModel, ['', 'Line1', 'Line2', 'Line3', 'Line4', 'Line5']); + checkAndClear(['Line1', 'Line2', 'Line3', 'Line4', 'Line5']); thisModel.applyEdits([EditOperation.insert(new Position(1, 6), '\nNew line\nAnother new line')]); - invalidEqual(thisModel, [0, 1, 2]); thisModel.applyEdits([EditOperation.insert(new Position(5, 6), '-')]); - invalidEqual(thisModel, [0, 1, 2, 4]); thisModel.forceTokenization(7); - statesEqual(thisModel, ['', 'Line1', 'New line', 'Another new line', 'Line2', 'Line3-', 'Line4', 'Line5']); + checkAndClear(['Line1', 'New line', 'Another new line', 'Line2', 'Line3-', 'Line4']); }); test('getTokensForInvalidLines one delete text', () => { thisModel.forceTokenization(5); - statesEqual(thisModel, ['', 'Line1', 'Line2', 'Line3', 'Line4', 'Line5']); + checkAndClear(['Line1', 'Line2', 'Line3', 'Line4', 'Line5']); thisModel.applyEdits([EditOperation.delete(new Range(1, 1, 1, 5))]); - invalidEqual(thisModel, [0]); thisModel.forceTokenization(5); - statesEqual(thisModel, ['', '1', 'Line2', 'Line3', 'Line4', 'Line5']); + checkAndClear(['1', 'Line2']); }); test('getTokensForInvalidLines one line delete text', () => { thisModel.forceTokenization(5); - statesEqual(thisModel, ['', 'Line1', 'Line2', 'Line3', 'Line4', 'Line5']); + checkAndClear(['Line1', 'Line2', 'Line3', 'Line4', 'Line5']); thisModel.applyEdits([EditOperation.delete(new Range(1, 1, 2, 1))]); - invalidEqual(thisModel, [0]); - statesEqual(thisModel, ['', 'Line2', 'Line3', 'Line4', 'Line5']); thisModel.forceTokenization(4); - statesEqual(thisModel, ['', 'Line2', 'Line3', 'Line4', 'Line5']); + checkAndClear(['Line2']); }); test('getTokensForInvalidLines multiple lines delete text', () => { thisModel.forceTokenization(5); - statesEqual(thisModel, ['', 'Line1', 'Line2', 'Line3', 'Line4', 'Line5']); + checkAndClear(['Line1', 'Line2', 'Line3', 'Line4', 'Line5']); thisModel.applyEdits([EditOperation.delete(new Range(1, 1, 3, 3))]); - invalidEqual(thisModel, [0]); - statesEqual(thisModel, ['', 'Line3', 'Line4', 'Line5']); thisModel.forceTokenization(3); - statesEqual(thisModel, ['', 'ne3', 'Line4', 'Line5']); + checkAndClear(['ne3', 'Line4']); }); }); From 9eec01eff3ec7864ba4aca768b3e629e6db4b1f6 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 11:54:02 +0200 Subject: [PATCH 1088/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3a1b3924462..0c8c1eac971 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "dacd8b27bee0359d7f3e95bff093755ac17c7496", + "distro": "ba0f1cb2d22623ddd8e12f5a4da1bf2f54957b40", "author": { "name": "Microsoft Corporation" }, From 05f8ca5b40f1254857d6ea142c39a0f261c9366a Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 4 Jul 2019 12:36:15 +0200 Subject: [PATCH 1089/1449] resources.relativePath needs a `ignoreCase` argument. Fixes #76421 --- src/vs/base/common/resources.ts | 17 +++++++++++++++-- src/vs/base/test/common/resources.test.ts | 9 +++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/vs/base/common/resources.ts b/src/vs/base/common/resources.ts index 521a02a4b57..8ccc9567737 100644 --- a/src/vs/base/common/resources.ts +++ b/src/vs/base/common/resources.ts @@ -221,7 +221,7 @@ export function addTrailingPathSeparator(resource: URI, sep: string = paths.sep) * Returns a relative path between two URIs. If the URIs don't have the same schema or authority, `undefined` is returned. * The returned relative path always uses forward slashes. */ -export function relativePath(from: URI, to: URI): string | undefined { +export function relativePath(from: URI, to: URI, ignoreCase = hasToIgnoreCase(from)): string | undefined { if (from.scheme !== to.scheme || !isEqualAuthority(from.authority, to.authority)) { return undefined; } @@ -229,7 +229,20 @@ export function relativePath(from: URI, to: URI): string | undefined { const relativePath = paths.relative(from.path, to.path); return isWindows ? extpath.toSlashes(relativePath) : relativePath; } - return paths.posix.relative(from.path || '/', to.path || '/'); + let fromPath = from.path || '/', toPath = to.path || '/'; + if (ignoreCase) { + // make casing of fromPath match toPath + let i = 0; + for (const len = Math.min(fromPath.length, toPath.length); i < len; i++) { + if (fromPath.charCodeAt(i) !== toPath.charCodeAt(i)) { + if (fromPath.charAt(i).toLowerCase() !== toPath.charAt(i).toLowerCase()) { + break; + } + } + } + fromPath = toPath.substr(0, i) + fromPath.substr(i); + } + return paths.posix.relative(fromPath, toPath); } /** diff --git a/src/vs/base/test/common/resources.test.ts b/src/vs/base/test/common/resources.test.ts index b9d1a99d539..cb535362222 100644 --- a/src/vs/base/test/common/resources.test.ts +++ b/src/vs/base/test/common/resources.test.ts @@ -237,8 +237,8 @@ suite('Resources', () => { } } - function assertRelativePath(u1: URI, u2: URI, expectedPath: string | undefined, ignoreJoin?: boolean) { - assert.equal(relativePath(u1, u2), expectedPath, `from ${u1.toString()} to ${u2.toString()}`); + function assertRelativePath(u1: URI, u2: URI, expectedPath: string | undefined, ignoreJoin?: boolean, ignoreCase?: boolean) { + assert.equal(relativePath(u1, u2, ignoreCase), expectedPath, `from ${u1.toString()} to ${u2.toString()}`); if (expectedPath !== undefined && !ignoreJoin) { assertEqualURI(removeTrailingPathSeparator(joinPath(u1, expectedPath)), removeTrailingPathSeparator(u2), 'joinPath on relativePath should be equal'); } @@ -263,6 +263,11 @@ suite('Resources', () => { assertRelativePath(URI.parse('foo://a2/b'), URI.parse('foo://a/b'), undefined); assertRelativePath(URI.parse('goo://a/b'), URI.parse('foo://a/b'), undefined); + assertRelativePath(URI.parse('foo://a/foo'), URI.parse('foo://A/FOO/bar/goo'), 'bar/goo', false, true); + assertRelativePath(URI.parse('foo://a/foo'), URI.parse('foo://A/FOO/BAR/GOO'), 'BAR/GOO', false, true); + assertRelativePath(URI.parse('foo://a/foo/xoo'), URI.parse('foo://A/FOO/BAR/GOO'), '../BAR/GOO', false, true); + assertRelativePath(URI.parse('foo:///c:/a/foo'), URI.parse('foo:///C:/a/foo/xoo/'), 'xoo', false, true); + if (isWindows) { assertRelativePath(URI.file('c:\\foo\\bar'), URI.file('c:\\foo\\bar'), ''); assertRelativePath(URI.file('c:\\foo\\bar\\huu'), URI.file('c:\\foo\\bar'), '..'); From f2f5a6c3e1c3979e5e96335ad5f320711e086943 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 4 Jul 2019 13:56:49 +0200 Subject: [PATCH 1090/1449] fix #76561 --- .../parts/notifications/notificationsStatus.ts | 2 +- .../browser/parts/statusbar/statusbarPart.ts | 13 ++++++++++--- .../contrib/tasks/browser/task.contribution.ts | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/browser/parts/notifications/notificationsStatus.ts b/src/vs/workbench/browser/parts/notifications/notificationsStatus.ts index 372f1f09ec4..acb18855f3b 100644 --- a/src/vs/workbench/browser/parts/notifications/notificationsStatus.ts +++ b/src/vs/workbench/browser/parts/notifications/notificationsStatus.ts @@ -65,7 +65,7 @@ export class NotificationsStatus extends Disposable { }; if (!this.notificationsCenterStatusItem) { - this.notificationsCenterStatusItem = this.statusbarService.addEntry(statusProperties, 'status.notifications', localize('status.notifications', "Notifications"), StatusbarAlignment.RIGHT, -1000 /* towards the far end of the right hand side */); + this.notificationsCenterStatusItem = this.statusbarService.addEntry(statusProperties, 'status.notifications', localize('status.notifications', "Notifications"), StatusbarAlignment.RIGHT, -Number.MAX_VALUE /* towards the far end of the right hand side */); } else { this.notificationsCenterStatusItem.update(statusProperties); } diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts index 7ae3a2a1d76..00fe6c45bc4 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts @@ -229,9 +229,16 @@ class StatusbarViewModel extends Disposable { } private sort(): void { + const mapEntryToIndex = new Map(); + this._entries.forEach((entry, index) => mapEntryToIndex.set(entry, index)); + this._entries.sort((entryA, entryB) => { if (entryA.alignment === entryB.alignment) { - return entryB.priority - entryA.priority; // higher priority towards the left + if (entryA.priority !== entryB.priority) { + return entryB.priority - entryA.priority; // higher priority towards the left + } + + return mapEntryToIndex.get(entryA)! - mapEntryToIndex.get(entryB)!; // otherwise maintain stable order } if (entryA.alignment === StatusbarAlignment.LEFT) { @@ -395,7 +402,7 @@ export class StatusbarPart extends Part implements IStatusbarService { private doAddEntry(entry: IStatusbarEntry, id: string, name: string, alignment: StatusbarAlignment, priority: number): IStatusbarEntryAccessor { // Create item - const itemContainer = this.doCreateStatusItem(id, name, alignment, priority, ...coalesce([entry.showBeak ? 'has-beak' : undefined])); + const itemContainer = this.doCreateStatusItem(id, alignment, ...coalesce([entry.showBeak ? 'has-beak' : undefined])); const item = this.instantiationService.createInstance(StatusbarEntryItem, itemContainer, entry); // Append to parent @@ -585,7 +592,7 @@ export class StatusbarPart extends Part implements IStatusbarService { this.styleElement.innerHTML = `.monaco-workbench .part.statusbar > .items-container > .statusbar-item.has-beak:before { border-bottom-color: ${backgroundColor}; }`; } - private doCreateStatusItem(id: string, name: string, alignment: StatusbarAlignment, priority: number = 0, ...extraClasses: string[]): HTMLElement { + private doCreateStatusItem(id: string, alignment: StatusbarAlignment, ...extraClasses: string[]): HTMLElement { const itemContainer = document.createElement('div'); itemContainer.id = id; diff --git a/src/vs/workbench/contrib/tasks/browser/task.contribution.ts b/src/vs/workbench/contrib/tasks/browser/task.contribution.ts index 0488015562e..de6fbc81085 100644 --- a/src/vs/workbench/contrib/tasks/browser/task.contribution.ts +++ b/src/vs/workbench/contrib/tasks/browser/task.contribution.ts @@ -125,7 +125,7 @@ export class TaskStatusBarContributions extends Disposable implements IWorkbench }; if (!this.runningTasksStatusItem) { - this.runningTasksStatusItem = this.statusbarService.addEntry(itemProps, 'status.runningTasks', nls.localize('status.runningTasks', "Running Tasks"), StatusbarAlignment.LEFT, 50 /* Medium Priority */); + this.runningTasksStatusItem = this.statusbarService.addEntry(itemProps, 'status.runningTasks', nls.localize('status.runningTasks', "Running Tasks"), StatusbarAlignment.LEFT, 49 /* Medium Priority, next to Markers */); } else { this.runningTasksStatusItem.update(itemProps); } From f39128663392e2e594468837f58e9975eb44b4e9 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 14:32:46 +0200 Subject: [PATCH 1091/1449] fix build --- build/azure-pipelines/darwin/product-build-darwin.yml | 2 +- build/azure-pipelines/linux/product-build-linux-multiarch.yml | 2 +- build/azure-pipelines/linux/product-build-linux.yml | 2 +- build/azure-pipelines/product-compile.yml | 4 ++-- build/azure-pipelines/win32/product-build-win32.yml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index 3d1d017505f..b43d9248c9e 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -7,7 +7,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: keyfile: '.build/commit' - targetfolder: '.build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' + targetfolder: '.build, **/out-build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' vstsFeed: 'npm-vscode' platformIndependent: true alias: 'Compilation' diff --git a/build/azure-pipelines/linux/product-build-linux-multiarch.yml b/build/azure-pipelines/linux/product-build-linux-multiarch.yml index 46eb0775e77..e72e63d498f 100644 --- a/build/azure-pipelines/linux/product-build-linux-multiarch.yml +++ b/build/azure-pipelines/linux/product-build-linux-multiarch.yml @@ -7,7 +7,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: keyfile: '.build/commit' - targetfolder: '.build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' + targetfolder: '.build, **/out-build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' vstsFeed: 'npm-vscode' platformIndependent: true alias: 'Compilation' diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 104ae18c348..8e59f250bb8 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -7,7 +7,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: keyfile: '.build/commit' - targetfolder: '.build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' + targetfolder: '.build, **/out-build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' vstsFeed: 'npm-vscode' platformIndependent: true alias: 'Compilation' diff --git a/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml index 9d3ede095b1..b7e55e625e6 100644 --- a/build/azure-pipelines/product-compile.yml +++ b/build/azure-pipelines/product-compile.yml @@ -7,7 +7,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: keyfile: '.build/commit' - targetfolder: '.build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' + targetfolder: '.build, **/out-build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' vstsFeed: 'npm-vscode' platformIndependent: true alias: 'Compilation' @@ -108,7 +108,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: keyfile: '.build/commit' - targetfolder: '.build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' + targetfolder: '.build, **/out-build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' vstsFeed: 'npm-vscode' platformIndependent: true alias: 'Compilation' diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 1eefe48c59e..f9da8ddad6e 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -7,7 +7,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: keyfile: '.build/commit' - targetfolder: '.build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' + targetfolder: '.build, **/out-build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' vstsFeed: 'npm-vscode' platformIndependent: true alias: 'Compilation' From d75caf044efcda3b8de8698d535bb2ad16699981 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 4 Jul 2019 14:50:28 +0200 Subject: [PATCH 1092/1449] include service worker in build --- build/gulpfile.vscode.js | 1 + src/buildfile.js | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 90082925121..2846595f605 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -49,6 +49,7 @@ const nodeModules = ['electron', 'original-fs'] const vscodeEntryPoints = _.flatten([ buildfile.entrypoint('vs/workbench/workbench.main'), buildfile.base, + buildfile.serviceWorker, buildfile.workbench, buildfile.code ]); diff --git a/src/buildfile.js b/src/buildfile.js index 62b2f30c0e4..0c77f1ae5fa 100644 --- a/src/buildfile.js +++ b/src/buildfile.js @@ -11,6 +11,14 @@ exports.base = [{ dest: 'vs/base/worker/workerMain.js' }]; +exports.serviceWorker = [{ + name: 'vs/workbench/contrib/resources/browser/resourceServiceWorker', + // include: ['vs/editor/common/services/editorSimpleWorker'], + prepend: ['vs/loader.js'], + append: ['vs/workbench/contrib/resources/browser/resourceServiceWorkerMain'], + dest: 'vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.js' +}]; + exports.workbench = require('./vs/workbench/buildfile').collectModules(['vs/workbench/workbench.main']); exports.workbenchWeb = require('./vs/workbench/buildfile').collectModules(['vs/workbench/workbench.web.api']); From b361214c70767d5387e2bcbbe57fc6e527a3e812 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 4 Jul 2019 14:52:46 +0200 Subject: [PATCH 1093/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d693271f2d3..28e438e4d6d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "4da75531dc397fa0fc57820ea9ab863eceab9a64", + "distro": "232f54dd8c50f5bdf086c2c557a42954a41170bd", "author": { "name": "Microsoft Corporation" }, From 1478853bd8d7fc520525772e00bd181c4f95c737 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 15:51:45 +0200 Subject: [PATCH 1094/1449] bring back legacy extensions compilation --- .../darwin/product-build-darwin.yml | 1 + .../linux/product-build-linux-alpine.yml | 1 + .../linux/product-build-linux-arm.yml | 1 + .../azure-pipelines/linux/product-build-linux.yml | 1 + .../azure-pipelines/win32/product-build-win32.yml | 1 + build/gulpfile.extensions.js | 14 +++++++++++++- 6 files changed, 18 insertions(+), 1 deletion(-) diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index 13691851e5b..14d3acdf422 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -87,6 +87,7 @@ steps: - script: | set -e yarn gulp compile-build + yarn gulp compile-extensions-build-legacy yarn gulp compile-extensions-build VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ yarn gulp vscode-darwin-ci diff --git a/build/azure-pipelines/linux/product-build-linux-alpine.yml b/build/azure-pipelines/linux/product-build-linux-alpine.yml index d3da7c4d952..76eb8a660da 100644 --- a/build/azure-pipelines/linux/product-build-linux-alpine.yml +++ b/build/azure-pipelines/linux/product-build-linux-alpine.yml @@ -89,6 +89,7 @@ steps: - script: | set -e yarn gulp compile-build + yarn gulp compile-extensions-build-legacy yarn gulp compile-extensions-build ./build/azure-pipelines/linux/build-alpine.sh displayName: Build diff --git a/build/azure-pipelines/linux/product-build-linux-arm.yml b/build/azure-pipelines/linux/product-build-linux-arm.yml index 708fd1bf66f..a77751644d0 100644 --- a/build/azure-pipelines/linux/product-build-linux-arm.yml +++ b/build/azure-pipelines/linux/product-build-linux-arm.yml @@ -89,6 +89,7 @@ steps: - script: | set -e yarn gulp compile-build + yarn gulp compile-extensions-build-legacy yarn gulp compile-extensions-build ./build/azure-pipelines/linux/build-arm.sh displayName: Build diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 9322cd15a45..0ccfcc6e852 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -88,6 +88,7 @@ steps: - script: | set -e yarn gulp compile-build + yarn gulp compile-extensions-build-legacy yarn gulp compile-extensions-build VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ yarn gulp vscode-linux-$VSCODE_ARCH-min-ci diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index d7d1ebee867..27d2e8ba15d 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -110,6 +110,7 @@ steps: $ErrorActionPreference = "Stop" $env:VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" exec { yarn gulp compile-build } + exec { yarn gulp compile-extensions-build-legacy } exec { yarn gulp compile-extensions-build } exec { yarn gulp "vscode-win32-$env:VSCODE_ARCH-min-ci" } exec { yarn gulp "vscode-reh-win32-$env:VSCODE_ARCH-min-ci" } diff --git a/build/gulpfile.extensions.js b/build/gulpfile.extensions.js index 26f47841b87..14e0a99af65 100644 --- a/build/gulpfile.extensions.js +++ b/build/gulpfile.extensions.js @@ -123,11 +123,20 @@ const tasks = compilations.map(function (tsconfigFile) { .pipe(gulp.dest(out)); })); + const compileBuildTask = task.define(`compile-build-extension-${name}`, task.series(cleanTask, () => { + const pipeline = createPipeline(true, true); + const input = gulp.src(src, srcOpts); + + return input + .pipe(pipeline()) + .pipe(gulp.dest(out)); + })); + // Tasks gulp.task(compileTask); gulp.task(watchTask); - return { compileTask, watchTask }; + return { compileTask, watchTask, compileBuildTask }; }); const compileExtensionsTask = task.define('compile-extensions', task.parallel(...tasks.map(t => t.compileTask))); @@ -138,6 +147,9 @@ const watchExtensionsTask = task.define('watch-extensions', task.parallel(...tas gulp.task(watchExtensionsTask); exports.watchExtensionsTask = watchExtensionsTask; +const compileExtensionsBuildLegacyTask = task.define('compile-extensions-build-legacy', task.parallel(...tasks.map(t => t.compileBuildTask))); +gulp.task(compileExtensionsBuildLegacyTask); + // Azure Pipelines const cleanExtensionsBuildTask = task.define('clean-extensions-build', util.rimraf('.build/extensions')); From 8e2bf317d16587a6b081de05ae85cf02696cac4f Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 4 Jul 2019 16:07:39 +0200 Subject: [PATCH 1095/1449] explorer: empty do not show connecting for web --- src/vs/workbench/contrib/files/browser/views/emptyView.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/files/browser/views/emptyView.ts b/src/vs/workbench/contrib/files/browser/views/emptyView.ts index cad0e825ff0..66b56e6c22a 100644 --- a/src/vs/workbench/contrib/files/browser/views/emptyView.ts +++ b/src/vs/workbench/contrib/files/browser/views/emptyView.ts @@ -24,6 +24,7 @@ import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { ILabelService } from 'vs/platform/label/common/label'; import { Schemas } from 'vs/base/common/network'; +import { isWeb } from 'vs/base/common/platform'; export class EmptyView extends ViewletPanel { @@ -123,7 +124,7 @@ export class EmptyView extends ViewletPanel { } this.titleElement.textContent = EmptyView.NAME; } else { - if (this.environmentService.configuration.remoteAuthority) { + if (this.environmentService.configuration.remoteAuthority && !isWeb) { const hostLabel = this.labelService.getHostLabel(Schemas.vscodeRemote, this.environmentService.configuration.remoteAuthority); this.messageElement.textContent = hostLabel ? nls.localize('remoteNoFolderHelp', "Connected to {0}", hostLabel) : nls.localize('connecting', "Connecting..."); } else { From 64162b6781da107ad999473554d9b0d2c5190d46 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 16:26:15 +0200 Subject: [PATCH 1096/1449] fixes #76514 --- .../services/keybinding/browser/keybindingService.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/services/keybinding/browser/keybindingService.ts b/src/vs/workbench/services/keybinding/browser/keybindingService.ts index 37ead9db496..0ea58b44e08 100644 --- a/src/vs/workbench/services/keybinding/browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/browser/keybindingService.ts @@ -46,6 +46,7 @@ import { IKeymapService } from 'vs/workbench/services/keybinding/common/keymapIn import { getDispatchConfig } from 'vs/workbench/services/keybinding/common/dispatchConfig'; import { isArray } from 'vs/base/common/types'; import { INavigatorWithKeyboard } from 'vs/workbench/services/keybinding/common/navigatorKeyboard'; +import { ScanCodeUtils, IMMUTABLE_CODE_TO_KEY_CODE } from 'vs/base/common/scanCode'; interface ContributedKeyBinding { command: string; @@ -534,7 +535,9 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { // ignore ctrl/cmd-combination but not shift/alt-combinatios return false; } - if (event.keyCode === KeyCode.Escape) { + const code = ScanCodeUtils.toEnum(event.code); + const keycode = IMMUTABLE_CODE_TO_KEY_CODE[code]; + if (keycode !== -1) { // https://github.com/microsoft/vscode/issues/74934 return false; } From 4fee26255a3fb9676ca13a211ab2d1796e6c4243 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 16:26:22 +0200 Subject: [PATCH 1097/1449] fixes #76369 --- .../workbench/services/keybinding/browser/keybindingService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/services/keybinding/browser/keybindingService.ts b/src/vs/workbench/services/keybinding/browser/keybindingService.ts index 0ea58b44e08..25570e1556c 100644 --- a/src/vs/workbench/services/keybinding/browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/browser/keybindingService.ts @@ -531,7 +531,7 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { } mightProducePrintableCharacter(event: IKeyboardEvent): boolean { - if (event.ctrlKey || event.metaKey) { + if (event.ctrlKey || event.metaKey || event.altKey) { // ignore ctrl/cmd-combination but not shift/alt-combinatios return false; } From 8347ffbc33c67e106d1bc2f05f661f9b9d74f256 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 4 Jul 2019 16:37:34 +0200 Subject: [PATCH 1098/1449] :lipstick: --- src/vs/workbench/workbench.web.main.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index bb96b82c27c..93d826e1a9d 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -28,11 +28,6 @@ import 'vs/workbench/browser/parts/quickinput/quickInputActions'; //#endregion -//#region --- Remote Resource loading - -import 'vs/workbench/contrib/resources/browser/resourceServiceWorkerClient'; - -//#endregion //#region --- API Extension Points @@ -192,6 +187,9 @@ import 'vs/workbench/browser/parts/statusbar/statusbarPart'; //#region --- workbench contributions +// Resource Service Worker +import 'vs/workbench/contrib/resources/browser/resourceServiceWorkerClient'; + // Workspace File Watching import 'vs/workbench/services/files/common/workspaceWatcher'; From a57a43de01dabb4baa750b02a76cc01e0f371a23 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 4 Jul 2019 07:45:43 -0700 Subject: [PATCH 1099/1449] Disable conpty in integration tests and re-enable Fixes #75689 --- .../src/singlefolder-tests/terminal.test.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts index 26b478b184a..ad07fc997ad 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts @@ -3,11 +3,15 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { window, Terminal, TerminalVirtualProcess, EventEmitter, TerminalDimensions } from 'vscode'; +import { window, Terminal, TerminalVirtualProcess, EventEmitter, TerminalDimensions, workspace, ConfigurationTarget } from 'vscode'; import { doesNotThrow, equal, ok } from 'assert'; suite('window namespace tests', () => { - (process.platform === 'win32' ? suite.skip /* https://github.com/microsoft/vscode/issues/75689 */ : suite)('Terminal', () => { + suiteSetup(async () => { + // Disable conpty in integration tests because of https://github.com/microsoft/vscode/issues/76548 + await workspace.getConfiguration('terminal.integrated').update('windowsEnableConpty', false, ConfigurationTarget.Global); + }); + suite('Terminal', () => { test('sendText immediately after createTerminal should not throw', (done) => { const reg1 = window.onDidOpenTerminal(term => { equal(terminal, term); From 13940e60ecfeebda4affc73196915fb742074e45 Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Thu, 4 Jul 2019 17:03:14 +0200 Subject: [PATCH 1100/1449] more ExternalTerminalService cleanup --- .../node/externalTerminalService.ts | 150 +++++++----------- .../externalTerminalService.test.ts | 6 +- 2 files changed, 64 insertions(+), 92 deletions(-) diff --git a/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts b/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts index d894850a728..950e790eb44 100644 --- a/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts +++ b/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts @@ -17,42 +17,32 @@ import { IConfigurationRegistry, Extensions, ConfigurationScope } from 'vs/platf import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { Registry } from 'vs/platform/registry/common/platform'; import { ITerminalSettings } from 'vs/workbench/contrib/debug/common/debug'; +import { optional } from 'vs/platform/instantiation/common/instantiation'; const TERMINAL_TITLE = nls.localize('console.title', "VS Code Console"); export const DEFAULT_TERMINAL_OSX = 'Terminal.app'; -enum WinSpawnType { - CMD, - CMDER -} - export class WindowsExternalTerminalService implements IExternalTerminalService { public _serviceBrand: any; private static readonly CMD = 'cmd.exe'; constructor( - @IConfigurationService private readonly _configurationService: IConfigurationService + @optional(IConfigurationService) private readonly _configurationService: IConfigurationService ) { } public openTerminal(cwd?: string): void { - const configuration = this._configurationService.getValue(); - - this.spawnTerminal(cp, configuration, processes.getWindowsShell(), cwd); + if (this._configurationService) { + const configuration = this._configurationService.getValue(); + this.spawnTerminal(cp, configuration, processes.getWindowsShell(), cwd); + } } - /* - public runInTerminal(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment): Promise { - const configuration = this._configurationService.getValue(); - return this.runInTerminal0(title, dir, args, envVars, configuration.terminal); - } - */ - public runInTerminal(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment, configuration: ITerminalSettings): Promise { - const exec = configuration.external.windowsExec || getDefaultTerminalWindows(); + const exec = configuration.external.windowsExec || WindowsExternalTerminalService.getDefaultTerminalWindows(); return new Promise((resolve, reject) => { @@ -86,8 +76,7 @@ export class WindowsExternalTerminalService implements IExternalTerminalService private spawnTerminal(spawner: typeof cp, configuration: IExternalTerminalConfiguration, command: string, cwd?: string): Promise { const terminalConfig = configuration.terminal.external; - const exec = terminalConfig.windowsExec || getDefaultTerminalWindows(); - const spawnType = this.getSpawnType(exec); + const exec = terminalConfig.windowsExec || WindowsExternalTerminalService.getDefaultTerminalWindows(); // Make the drive letter uppercase on Windows (see #9448) if (cwd && cwd[1] === ':') { @@ -96,7 +85,8 @@ export class WindowsExternalTerminalService implements IExternalTerminalService // cmder ignores the environment cwd and instead opts to always open in %USERPROFILE% // unless otherwise specified - if (spawnType === WinSpawnType.CMDER) { + const basename = path.basename(exec).toLowerCase(); + if (basename === 'cmder' || basename === 'cmder.exe') { spawner.spawn(exec, cwd ? [cwd] : undefined); return Promise.resolve(undefined); } @@ -117,12 +107,14 @@ export class WindowsExternalTerminalService implements IExternalTerminalService }); } - private getSpawnType(exec: string): WinSpawnType { - const basename = path.basename(exec).toLowerCase(); - if (basename === 'cmder' || basename === 'cmder.exe') { - return WinSpawnType.CMDER; + private static _DEFAULT_TERMINAL_WINDOWS: string; + + public static getDefaultTerminalWindows(): string { + if (!WindowsExternalTerminalService._DEFAULT_TERMINAL_WINDOWS) { + const isWoW64 = !!process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432'); + WindowsExternalTerminalService._DEFAULT_TERMINAL_WINDOWS = `${process.env.windir ? process.env.windir : 'C:\\Windows'}\\${isWoW64 ? 'Sysnative' : 'System32'}\\cmd.exe`; } - return WinSpawnType.CMD; + return WindowsExternalTerminalService._DEFAULT_TERMINAL_WINDOWS; } } @@ -132,22 +124,16 @@ export class MacExternalTerminalService implements IExternalTerminalService { private static readonly OSASCRIPT = '/usr/bin/osascript'; // osascript is the AppleScript interpreter on OS X constructor( - @IConfigurationService private readonly _configurationService: IConfigurationService + @optional(IConfigurationService) private readonly _configurationService: IConfigurationService ) { } public openTerminal(cwd?: string): void { - const configuration = this._configurationService.getValue(); - - this.spawnTerminal(cp, configuration, cwd); + if (this._configurationService) { + const configuration = this._configurationService.getValue(); + this.spawnTerminal(cp, configuration, cwd); + } } - /* - public runInTerminal(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment): Promise { - const configuration = this._configurationService.getValue(); - return this.runInTerminal0(title, dir, args, envVars, configuration.terminal); - } - */ - public runInTerminal(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment, configuration: ITerminalSettings): Promise { const terminalApp = configuration.external.osxExec || DEFAULT_TERMINAL_OSX; @@ -234,26 +220,20 @@ export class LinuxExternalTerminalService implements IExternalTerminalService { private static readonly WAIT_MESSAGE = nls.localize('press.any.key', "Press any key to continue..."); constructor( - @IConfigurationService private readonly _configurationService: IConfigurationService + @optional(IConfigurationService) private readonly _configurationService: IConfigurationService ) { } public openTerminal(cwd?: string): void { - const configuration = this._configurationService.getValue(); - - this.spawnTerminal(cp, configuration, cwd); + if (this._configurationService) { + const configuration = this._configurationService.getValue(); + this.spawnTerminal(cp, configuration, cwd); + } } - /* - public runInTerminal(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment): Promise { - const configuration = this._configurationService.getValue(); - return this.runInTerminal0(title, dir, args, envVars, configuration.terminal); - } - */ - public runInTerminal(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment, configuration: ITerminalSettings): Promise { const terminalConfig = configuration.external; - const execPromise = terminalConfig.linuxExec ? Promise.resolve(terminalConfig.linuxExec) : getDefaultTerminalLinuxReady(); + const execPromise = terminalConfig.linuxExec ? Promise.resolve(terminalConfig.linuxExec) : LinuxExternalTerminalService.getDefaultTerminalLinuxReady(); return new Promise((resolve, reject) => { @@ -309,7 +289,7 @@ export class LinuxExternalTerminalService implements IExternalTerminalService { private spawnTerminal(spawner: typeof cp, configuration: IExternalTerminalConfiguration, cwd?: string): Promise { const terminalConfig = configuration.terminal.external; - const execPromise = terminalConfig.linuxExec ? Promise.resolve(terminalConfig.linuxExec) : getDefaultTerminalLinuxReady(); + const execPromise = terminalConfig.linuxExec ? Promise.resolve(terminalConfig.linuxExec) : LinuxExternalTerminalService.getDefaultTerminalLinuxReady(); return new Promise((c, e) => { execPromise.then(exec => { @@ -320,6 +300,36 @@ export class LinuxExternalTerminalService implements IExternalTerminalService { }); }); } + + private static _DEFAULT_TERMINAL_LINUX_READY: Promise; + + public static getDefaultTerminalLinuxReady(): Promise { + if (!LinuxExternalTerminalService._DEFAULT_TERMINAL_LINUX_READY) { + LinuxExternalTerminalService._DEFAULT_TERMINAL_LINUX_READY = new Promise(c => { + if (env.isLinux) { + Promise.all([pfs.exists('/etc/debian_version'), process.lazyEnv || Promise.resolve(undefined)]).then(([isDebian]) => { + if (isDebian) { + c('x-terminal-emulator'); + } else if (process.env.DESKTOP_SESSION === 'gnome' || process.env.DESKTOP_SESSION === 'gnome-classic') { + c('gnome-terminal'); + } else if (process.env.DESKTOP_SESSION === 'kde-plasma') { + c('konsole'); + } else if (process.env.COLORTERM) { + c(process.env.COLORTERM); + } else if (process.env.TERM) { + c(process.env.TERM); + } else { + c('xterm'); + } + }); + return; + } + + c('xterm'); + }); + } + return LinuxExternalTerminalService._DEFAULT_TERMINAL_LINUX_READY; + } } /** @@ -348,44 +358,6 @@ function quote(args: string[]): string { return r; } -let _DEFAULT_TERMINAL_WINDOWS: string | null = null; -export function getDefaultTerminalWindows(): string { - if (!_DEFAULT_TERMINAL_WINDOWS) { - const isWoW64 = !!process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432'); - _DEFAULT_TERMINAL_WINDOWS = `${process.env.windir ? process.env.windir : 'C:\\Windows'}\\${isWoW64 ? 'Sysnative' : 'System32'}\\cmd.exe`; - } - return _DEFAULT_TERMINAL_WINDOWS; -} - -let _DEFAULT_TERMINAL_LINUX_READY: Promise | null = null; -export function getDefaultTerminalLinuxReady(): Promise { - if (!_DEFAULT_TERMINAL_LINUX_READY) { - _DEFAULT_TERMINAL_LINUX_READY = new Promise(c => { - if (env.isLinux) { - Promise.all([pfs.exists('/etc/debian_version'), process.lazyEnv || Promise.resolve(undefined)]).then(([isDebian]) => { - if (isDebian) { - c('x-terminal-emulator'); - } else if (process.env.DESKTOP_SESSION === 'gnome' || process.env.DESKTOP_SESSION === 'gnome-classic') { - c('gnome-terminal'); - } else if (process.env.DESKTOP_SESSION === 'kde-plasma') { - c('konsole'); - } else if (process.env.COLORTERM) { - c(process.env.COLORTERM); - } else if (process.env.TERM) { - c(process.env.TERM); - } else { - c('xterm'); - } - }); - return; - } - - c('xterm'); - }); - } - return _DEFAULT_TERMINAL_LINUX_READY; -} - if (env.isWindows) { registerSingleton(IExternalTerminalService, WindowsExternalTerminalService, true); } else if (env.isMacintosh) { @@ -394,7 +366,7 @@ if (env.isWindows) { registerSingleton(IExternalTerminalService, LinuxExternalTerminalService, true); } -getDefaultTerminalLinuxReady().then(defaultTerminalLinux => { +LinuxExternalTerminalService.getDefaultTerminalLinuxReady().then(defaultTerminalLinux => { let configurationRegistry = Registry.as(Extensions.Configuration); configurationRegistry.registerConfiguration({ id: 'externalTerminal', @@ -418,7 +390,7 @@ getDefaultTerminalLinuxReady().then(defaultTerminalLinux => { 'terminal.external.windowsExec': { type: 'string', description: nls.localize('terminal.external.windowsExec', "Customizes which terminal to run on Windows."), - default: getDefaultTerminalWindows(), + default: WindowsExternalTerminalService.getDefaultTerminalWindows(), scope: ConfigurationScope.APPLICATION }, 'terminal.external.osxExec': { diff --git a/src/vs/workbench/contrib/externalTerminal/test/electron-browser/externalTerminalService.test.ts b/src/vs/workbench/contrib/externalTerminal/test/electron-browser/externalTerminalService.test.ts index 1ba20ae542a..821460d6eb7 100644 --- a/src/vs/workbench/contrib/externalTerminal/test/electron-browser/externalTerminalService.test.ts +++ b/src/vs/workbench/contrib/externalTerminal/test/electron-browser/externalTerminalService.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { deepEqual, equal } from 'assert'; -import { WindowsExternalTerminalService, LinuxExternalTerminalService, MacExternalTerminalService, DEFAULT_TERMINAL_OSX, getDefaultTerminalWindows, getDefaultTerminalLinuxReady } from 'vs/workbench/contrib/externalTerminal/node/externalTerminalService'; +import { WindowsExternalTerminalService, LinuxExternalTerminalService, MacExternalTerminalService, DEFAULT_TERMINAL_OSX } from 'vs/workbench/contrib/externalTerminal/node/externalTerminalService'; suite('ExternalTerminalService', () => { let mockOnExit: Function; @@ -58,7 +58,7 @@ suite('ExternalTerminalService', () => { let mockSpawner = { spawn: (command: any, args: any, opts: any) => { // assert - equal(args[args.length - 1], getDefaultTerminalWindows(), 'terminal should equal expected'); + equal(args[args.length - 1], WindowsExternalTerminalService.getDefaultTerminalWindows(), 'terminal should equal expected'); done(); return { on: (evt: any) => evt @@ -194,7 +194,7 @@ suite('ExternalTerminalService', () => { }); test(`LinuxTerminalService - uses default terminal when configuration.terminal.external.linuxExec is undefined`, done => { - getDefaultTerminalLinuxReady().then(defaultTerminalLinux => { + LinuxExternalTerminalService.getDefaultTerminalLinuxReady().then(defaultTerminalLinux => { let testCwd = 'path/to/workspace'; let mockSpawner = { spawn: (command: any, args: any, opts: any) => { From 923d121ff5e1fbb9fdf1d99fe4fba772902f65ef Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 17:16:27 +0200 Subject: [PATCH 1101/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0c8c1eac971..7057a9e6300 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "ba0f1cb2d22623ddd8e12f5a4da1bf2f54957b40", + "distro": "5607c27cc8a1ce1e87f1d01cccf9b9d82b7aab0c", "author": { "name": "Microsoft Corporation" }, From 35983b9962ff3a30b7e2aa28ca651e5fe487f09c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 17:17:28 +0200 Subject: [PATCH 1102/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7057a9e6300..1ac5b902f3e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "5607c27cc8a1ce1e87f1d01cccf9b9d82b7aab0c", + "distro": "6d9eb305cab814b6dbc4cd2b4b8cda17dae5fc09", "author": { "name": "Microsoft Corporation" }, From c620463ae0e749aa89e2eee51b67a95a28654a5c Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Thu, 4 Jul 2019 17:43:27 +0200 Subject: [PATCH 1103/1449] protect against missing config --- src/vs/workbench/contrib/debug/common/debug.ts | 7 ++----- src/vs/workbench/contrib/debug/node/terminals.ts | 2 +- .../externalTerminal/common/externalTerminal.ts | 15 ++++++++------- .../node/externalTerminalService.ts | 16 +++++++--------- 4 files changed, 18 insertions(+), 22 deletions(-) diff --git a/src/vs/workbench/contrib/debug/common/debug.ts b/src/vs/workbench/contrib/debug/common/debug.ts index ab30e1ce3d0..98ca7fc8d37 100644 --- a/src/vs/workbench/contrib/debug/common/debug.ts +++ b/src/vs/workbench/contrib/debug/common/debug.ts @@ -26,6 +26,7 @@ import { TaskIdentifier } from 'vs/workbench/contrib/tasks/common/tasks'; import { TelemetryService } from 'vs/platform/telemetry/common/telemetryService'; import { ITerminalConfiguration } from 'vs/workbench/contrib/terminal/common/terminal'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IExternalTerminalSettings } from 'vs/workbench/contrib/externalTerminal/common/externalTerminal'; export const VIEWLET_ID = 'workbench.view.debug'; export const VIEW_CONTAINER: ViewContainer = Registry.as(ViewContainerExtensions.ViewContainersRegistry).registerViewContainer(VIEWLET_ID); @@ -576,11 +577,7 @@ export interface ITerminalLauncher { } export interface ITerminalSettings { - external: { - windowsExec: string, - osxExec: string, - linuxExec: string - }; + external: IExternalTerminalSettings; integrated: ITerminalConfiguration; } diff --git a/src/vs/workbench/contrib/debug/node/terminals.ts b/src/vs/workbench/contrib/debug/node/terminals.ts index 1c74432574d..6f173a4864f 100644 --- a/src/vs/workbench/contrib/debug/node/terminals.ts +++ b/src/vs/workbench/contrib/debug/node/terminals.ts @@ -24,7 +24,7 @@ export function runInExternalTerminal(args: DebugProtocol.RunInTerminalRequestAr } } if (externalTerminalService) { - externalTerminalService.runInTerminal(args.title!, args.cwd, args.args, args.env || {}, config); + externalTerminalService.runInTerminal(args.title!, args.cwd, args.args, args.env || {}, config.external || {}); } } diff --git a/src/vs/workbench/contrib/externalTerminal/common/externalTerminal.ts b/src/vs/workbench/contrib/externalTerminal/common/externalTerminal.ts index 54980485f49..6d4dfc04f46 100644 --- a/src/vs/workbench/contrib/externalTerminal/common/externalTerminal.ts +++ b/src/vs/workbench/contrib/externalTerminal/common/externalTerminal.ts @@ -4,23 +4,24 @@ *--------------------------------------------------------------------------------------------*/ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { ITerminalSettings } from 'vs/workbench/contrib/debug/common/debug'; export const IExternalTerminalService = createDecorator('nativeTerminalService'); +export interface IExternalTerminalSettings { + linuxExec?: string; + osxExec?: string; + windowsExec?: string; +} + export interface IExternalTerminalService { _serviceBrand: any; openTerminal(path: string): void; - runInTerminal(title: string, cwd: string, args: string[], env: { [key: string]: string | null; }, configuration: ITerminalSettings): Promise; + runInTerminal(title: string, cwd: string, args: string[], env: { [key: string]: string | null; }, settings: IExternalTerminalSettings): Promise; } export interface IExternalTerminalConfiguration { terminal: { explorerKind: 'integrated' | 'external', - external: { - linuxExec: string, - osxExec: string, - windowsExec: string - } + external: IExternalTerminalSettings; }; } \ No newline at end of file diff --git a/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts b/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts index 950e790eb44..474e2727d73 100644 --- a/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts +++ b/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts @@ -10,13 +10,12 @@ import * as nls from 'vs/nls'; import * as pfs from 'vs/base/node/pfs'; import * as env from 'vs/base/common/platform'; import { assign } from 'vs/base/common/objects'; -import { IExternalTerminalService, IExternalTerminalConfiguration } from 'vs/workbench/contrib/externalTerminal/common/externalTerminal'; +import { IExternalTerminalService, IExternalTerminalConfiguration, IExternalTerminalSettings } from 'vs/workbench/contrib/externalTerminal/common/externalTerminal'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { getPathFromAmdModule } from 'vs/base/common/amd'; import { IConfigurationRegistry, Extensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { Registry } from 'vs/platform/registry/common/platform'; -import { ITerminalSettings } from 'vs/workbench/contrib/debug/common/debug'; import { optional } from 'vs/platform/instantiation/common/instantiation'; @@ -40,9 +39,9 @@ export class WindowsExternalTerminalService implements IExternalTerminalService } } - public runInTerminal(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment, configuration: ITerminalSettings): Promise { + public runInTerminal(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment, settings: IExternalTerminalSettings): Promise { - const exec = configuration.external.windowsExec || WindowsExternalTerminalService.getDefaultTerminalWindows(); + const exec = settings.windowsExec || WindowsExternalTerminalService.getDefaultTerminalWindows(); return new Promise((resolve, reject) => { @@ -134,9 +133,9 @@ export class MacExternalTerminalService implements IExternalTerminalService { } } - public runInTerminal(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment, configuration: ITerminalSettings): Promise { + public runInTerminal(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment, settings: IExternalTerminalSettings): Promise { - const terminalApp = configuration.external.osxExec || DEFAULT_TERMINAL_OSX; + const terminalApp = settings.osxExec || DEFAULT_TERMINAL_OSX; return new Promise((resolve, reject) => { @@ -230,10 +229,9 @@ export class LinuxExternalTerminalService implements IExternalTerminalService { } } - public runInTerminal(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment, configuration: ITerminalSettings): Promise { + public runInTerminal(title: string, dir: string, args: string[], envVars: env.IProcessEnvironment, settings: IExternalTerminalSettings): Promise { - const terminalConfig = configuration.external; - const execPromise = terminalConfig.linuxExec ? Promise.resolve(terminalConfig.linuxExec) : LinuxExternalTerminalService.getDefaultTerminalLinuxReady(); + const execPromise = settings.linuxExec ? Promise.resolve(settings.linuxExec) : LinuxExternalTerminalService.getDefaultTerminalLinuxReady(); return new Promise((resolve, reject) => { From 498521311cab45ab3f3c1aea851599ec4afb8c63 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 4 Jul 2019 17:59:11 +0200 Subject: [PATCH 1104/1449] make user data provider a full fledged filesystem provider --- src/vs/workbench/browser/web.main.ts | 34 +- .../snippets/browser/snippets.contribution.ts | 3 - src/vs/workbench/electron-browser/main.ts | 6 +- .../configurationEditingService.test.ts | 19 +- .../configurationService.test.ts | 56 +- .../keybindingEditing.test.ts | 19 +- .../userData/common/fileUserDataProvider.ts | 198 ++++--- .../services/userData/common/userData.ts | 60 +- .../common/userDataFileSystemProvider.ts | 156 ----- .../fileUserDataProvider.test.ts | 545 ------------------ src/vs/workbench/workbench.web.api.ts | 4 +- 11 files changed, 190 insertions(+), 910 deletions(-) delete mode 100644 src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts delete mode 100644 src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index f1961c05b50..35d76e44b47 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -19,7 +19,7 @@ import { RemoteAgentService } from 'vs/workbench/services/remote/browser/remoteA import { RemoteAuthorityResolverService } from 'vs/platform/remote/browser/remoteAuthorityResolverService'; import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; -import { IFileService } from 'vs/platform/files/common/files'; +import { IFileService, IFileSystemProvider } from 'vs/platform/files/common/files'; import { FileService } from 'vs/workbench/services/files/common/fileService'; import { Schemas } from 'vs/base/common/network'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; @@ -35,10 +35,7 @@ import { hash } from 'vs/base/common/hash'; import { IWorkbenchConstructionOptions } from 'vs/workbench/workbench.web.api'; import { ProductService } from 'vs/platform/product/browser/productService'; import { FileUserDataProvider } from 'vs/workbench/services/userData/common/fileUserDataProvider'; -import { UserDataFileSystemProvider } from 'vs/workbench/services/userData/common/userDataFileSystemProvider'; -import { joinPath } from 'vs/base/common/resources'; -import { InMemoryUserDataProvider } from 'vs/workbench/services/userData/common/inMemoryUserDataProvider'; -import { IUserDataProvider } from 'vs/workbench/services/userData/common/userData'; +import { joinPath, dirname } from 'vs/base/common/resources'; class CodeRendererMain extends Disposable { @@ -110,16 +107,26 @@ class CodeRendererMain extends Disposable { const fileService = this._register(new FileService(logService)); serviceCollection.set(IFileService, fileService); + let userDataProvider: IFileSystemProvider | undefined = this.configuration.userDataProvider; const connection = remoteAgentService.getConnection(); if (connection) { const channel = connection.getChannel(REMOTE_FILE_SYSTEM_CHANNEL_NAME); const remoteFileSystemProvider = this._register(new RemoteExtensionsFileSystemProvider(channel, remoteAgentService.getEnvironment())); fileService.registerProvider(Schemas.vscodeRemote, remoteFileSystemProvider); + + if (!userDataProvider) { + const remoteUserDataUri = this.getRemoteUserDataUri(); + if (remoteUserDataUri) { + userDataProvider = this._register(new FileUserDataProvider(remoteUserDataUri, dirname(remoteUserDataUri), remoteFileSystemProvider)); + } + } } // User Data Provider - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.userRoamingDataHome, this.getUserDataPovider(fileService))); + if (userDataProvider) { + fileService.registerProvider(Schemas.userData, userDataProvider); + } const payload = await this.resolveWorkspaceInitializationPayload(); @@ -169,21 +176,6 @@ class CodeRendererMain extends Disposable { return { id: 'empty-window' }; } - private getUserDataPovider(fileService: IFileService): IUserDataProvider { - if (this.configuration.userDataProvider) { - return this.configuration.userDataProvider; - } - - if (this.configuration.remoteAuthority) { - const remoteUserDataUri = this.getRemoteUserDataUri(); - if (remoteUserDataUri) { - return this._register(new FileUserDataProvider(remoteUserDataUri, fileService)); - } - } - - return this._register(new InMemoryUserDataProvider()); - } - private getRemoteUserDataUri(): URI | null { const element = document.getElementById('vscode-remote-user-data-uri'); if (element) { diff --git a/src/vs/workbench/contrib/snippets/browser/snippets.contribution.ts b/src/vs/workbench/contrib/snippets/browser/snippets.contribution.ts index 6ee3f0b24f8..ee158fb00bf 100644 --- a/src/vs/workbench/contrib/snippets/browser/snippets.contribution.ts +++ b/src/vs/workbench/contrib/snippets/browser/snippets.contribution.ts @@ -10,12 +10,9 @@ import * as nls from 'vs/nls'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { LanguageId } from 'vs/editor/common/modes'; import { SnippetFile, Snippet } from 'vs/workbench/contrib/snippets/browser/snippetsFile'; -import { IUserDataContainerRegistry, Extensions } from 'vs/workbench/services/userData/common/userData'; export const ISnippetsService = createDecorator('snippetService'); -Registry.as(Extensions.UserDataContainers).registerContainer('snippets'); - export interface ISnippetsService { _serviceBrand: any; diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index 9394c30bb0f..c7542c63abe 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -51,7 +51,6 @@ import { SpdLogService } from 'vs/platform/log/node/spdlogService'; import { SignService } from 'vs/platform/sign/node/signService'; import { ISignService } from 'vs/platform/sign/common/sign'; import { FileUserDataProvider } from 'vs/workbench/services/userData/common/fileUserDataProvider'; -import { UserDataFileSystemProvider } from 'vs/workbench/services/userData/common/userDataFileSystemProvider'; class CodeRendererMain extends Disposable { @@ -200,6 +199,9 @@ class CodeRendererMain extends Disposable { const diskFileSystemProvider = this._register(new DiskFileSystemProvider(logService)); fileService.registerProvider(Schemas.file, diskFileSystemProvider); + // User Data Provider + fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, URI.file(environmentService.backupHome), diskFileSystemProvider)); + const connection = remoteAgentService.getConnection(); if (connection) { const channel = connection.getChannel(REMOTE_FILE_SYSTEM_CHANNEL_NAME); @@ -207,8 +209,6 @@ class CodeRendererMain extends Disposable { fileService.registerProvider(Schemas.vscodeRemote, remoteFileSystemProvider); } - // User Data Provider - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.userRoamingDataHome, new FileUserDataProvider(environmentService.appSettingsHome, fileService))); const payload = await this.resolveWorkspaceInitializationPayload(environmentService); 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 12704b9a215..be0cfec3420 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 @@ -39,10 +39,20 @@ import { DiskFileSystemProvider } from 'vs/workbench/services/files/node/diskFil import { IFileService } from 'vs/platform/files/common/files'; import { ConfigurationCache } from 'vs/workbench/services/configuration/node/configurationCache'; import { KeybindingsEditingService, IKeybindingEditingService } from 'vs/workbench/services/keybinding/common/keybindingEditing'; -import { UserDataFileSystemProvider } from 'vs/workbench/services/userData/common/userDataFileSystemProvider'; import { WorkbenchEnvironmentService } from 'vs/workbench/services/environment/node/environmentService'; import { IWindowConfiguration } from 'vs/platform/windows/common/windows'; import { FileUserDataProvider } from 'vs/workbench/services/userData/common/fileUserDataProvider'; +import { dirname } from 'vs/base/common/resources'; + +class TestBackupEnvironmentService extends WorkbenchEnvironmentService { + + constructor(private _appSettingsHome: URI) { + super(parseArgs(process.argv) as IWindowConfiguration, process.execPath); + } + + get appSettingsHome() { return this._appSettingsHome; } + +} suite('ConfigurationEditingService', () => { @@ -95,14 +105,15 @@ suite('ConfigurationEditingService', () => { clearServices(); instantiationService = workbenchInstantiationService(); - const environmentService = new WorkbenchEnvironmentService(parseArgs(process.argv), process.execPath); + const environmentService = new TestBackupEnvironmentService(URI.file(workspaceDir)); instantiationService.stub(IEnvironmentService, environmentService); const remoteAgentService = instantiationService.createInstance(RemoteAgentService, {}); const fileService = new FileService(new NullLogService()); - fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); + const diskFileSystemProvider = new DiskFileSystemProvider(new NullLogService()); + fileService.registerProvider(Schemas.file, diskFileSystemProvider); + fileService.registerProvider(Schemas.userData, new FileUserDataProvider(URI.file(workspaceDir), dirname(URI.file(workspaceDir)), diskFileSystemProvider)); instantiationService.stub(IFileService, fileService); instantiationService.stub(IRemoteAgentService, remoteAgentService); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.userRoamingDataHome, new FileUserDataProvider(URI.file(workspaceDir), fileService))); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); return workspaceService.initialize(noWorkspace ? { id: '' } : { folder: URI.file(workspaceDir), id: createHash('md5').update(URI.file(workspaceDir).toString()).digest('hex') }).then(() => { 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 75945ef6e1b..308b976db11 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 @@ -30,7 +30,7 @@ import { IJSONEditingService } from 'vs/workbench/services/configuration/common/ import { JSONEditingService } from 'vs/workbench/services/configuration/common/jsonEditingService'; import { createHash } from 'crypto'; import { Schemas } from 'vs/base/common/network'; -import { originalFSPath } from 'vs/base/common/resources'; +import { originalFSPath, dirname } from 'vs/base/common/resources'; import { isLinux } from 'vs/base/common/platform'; import { IWindowConfiguration } from 'vs/platform/windows/common/windows'; import { RemoteAgentService } from 'vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl'; @@ -47,9 +47,18 @@ import { SignService } from 'vs/platform/sign/browser/signService'; import { FileUserDataProvider } from 'vs/workbench/services/userData/common/fileUserDataProvider'; import { IKeybindingEditingService, KeybindingsEditingService } from 'vs/workbench/services/keybinding/common/keybindingEditing'; import { WorkbenchEnvironmentService } from 'vs/workbench/services/environment/node/environmentService'; -import { UserDataFileSystemProvider } from 'vs/workbench/services/userData/common/userDataFileSystemProvider'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +class TestEnvironmentService extends WorkbenchEnvironmentService { + + constructor(private _appSettingsHome: URI) { + super(parseArgs(process.argv) as IWindowConfiguration, process.execPath); + } + + get appSettingsHome() { return this._appSettingsHome; } + +} + function setUpFolderWorkspace(folderName: string): Promise<{ parentDir: string, folderDir: string }> { const id = uuid.generateUuid(); const parentDir = path.join(os.tmpdir(), 'vsctests', id); @@ -96,9 +105,9 @@ suite('WorkspaceContextService - Folder', () => { .then(({ parentDir, folderDir }) => { parentResource = parentDir; workspaceResource = folderDir; - const environmentService = new WorkbenchEnvironmentService(parseArgs(process.argv), process.execPath); + const environmentService = new TestEnvironmentService(URI.file(parentDir)); const fileService = new FileService(new NullLogService()); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.userRoamingDataHome, new FileUserDataProvider(URI.file(parentDir), fileService))); + fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, dirname(environmentService.appSettingsHome), new DiskFileSystemProvider(new NullLogService()))); workspaceContextService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, new RemoteAgentService({}, environmentService, new RemoteAuthorityResolverService(), new SignService())); return (workspaceContextService).initialize(convertToWorkspacePayload(URI.file(folderDir))); }); @@ -158,12 +167,13 @@ suite('WorkspaceContextService - Workspace', () => { parentResource = parentDir; instantiationService = workbenchInstantiationService(); - const environmentService = new WorkbenchEnvironmentService(parseArgs(process.argv), process.execPath); + const environmentService = new TestEnvironmentService(URI.file(parentDir)); const remoteAgentService = instantiationService.createInstance(RemoteAgentService, {}); instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); - fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.userRoamingDataHome, new FileUserDataProvider(URI.file(parentDir), fileService))); + const diskFileSystemProvider = new DiskFileSystemProvider(new NullLogService()); + fileService.registerProvider(Schemas.file, diskFileSystemProvider); + fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, dirname(environmentService.appSettingsHome), diskFileSystemProvider)); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); @@ -217,12 +227,13 @@ suite('WorkspaceContextService - Workspace Editing', () => { parentResource = parentDir; instantiationService = workbenchInstantiationService(); - const environmentService = new WorkbenchEnvironmentService(parseArgs(process.argv), process.execPath); + const environmentService = new TestEnvironmentService(URI.file(parentDir)); const remoteAgentService = instantiationService.createInstance(RemoteAgentService, {}); instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); - fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.userRoamingDataHome, new FileUserDataProvider(URI.file(parentDir), fileService))); + const diskFileSystemProvider = new DiskFileSystemProvider(new NullLogService()); + fileService.registerProvider(Schemas.file, diskFileSystemProvider); + fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, dirname(environmentService.appSettingsHome), diskFileSystemProvider)); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); @@ -477,12 +488,13 @@ suite('WorkspaceService - Initialization', () => { globalSettingsFile = path.join(parentDir, 'settings.json'); const instantiationService = workbenchInstantiationService(); - const environmentService = new WorkbenchEnvironmentService(parseArgs(process.argv), process.execPath); + const environmentService = new TestEnvironmentService(URI.file(parentDir)); const remoteAgentService = instantiationService.createInstance(RemoteAgentService, {}); instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); - fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.userRoamingDataHome, new FileUserDataProvider(URI.file(parentDir), fileService))); + const diskFileSystemProvider = new DiskFileSystemProvider(new NullLogService()); + fileService.registerProvider(Schemas.file, diskFileSystemProvider); + fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, dirname(environmentService.appSettingsHome), diskFileSystemProvider)); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); @@ -740,12 +752,13 @@ suite('WorkspaceConfigurationService - Folder', () => { globalSettingsFile = path.join(parentDir, 'settings.json'); const instantiationService = workbenchInstantiationService(); - const environmentService = new WorkbenchEnvironmentService(parseArgs(process.argv), process.execPath); + const environmentService = new TestEnvironmentService(URI.file(parentDir)); const remoteAgentService = instantiationService.createInstance(RemoteAgentService, {}); instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); - fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.userRoamingDataHome, new FileUserDataProvider(URI.file(parentDir), fileService))); + const diskFileSystemProvider = new DiskFileSystemProvider(new NullLogService()); + fileService.registerProvider(Schemas.file, diskFileSystemProvider); + fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, dirname(environmentService.appSettingsHome), diskFileSystemProvider)); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); @@ -1069,12 +1082,13 @@ suite('WorkspaceConfigurationService-Multiroot', () => { globalSettingsFile = path.join(parentDir, 'settings.json'); const instantiationService = workbenchInstantiationService(); - const environmentService = new WorkbenchEnvironmentService(parseArgs(process.argv), process.execPath); + const environmentService = new TestEnvironmentService(URI.file(parentDir)); const remoteAgentService = instantiationService.createInstance(RemoteAgentService, {}); instantiationService.stub(IRemoteAgentService, remoteAgentService); const fileService = new FileService(new NullLogService()); - fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.userRoamingDataHome, new FileUserDataProvider(URI.file(parentDir), fileService))); + const diskFileSystemProvider = new DiskFileSystemProvider(new NullLogService()); + fileService.registerProvider(Schemas.file, diskFileSystemProvider); + fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, dirname(environmentService.appSettingsHome), diskFileSystemProvider)); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); @@ -1471,12 +1485,12 @@ suite('WorkspaceConfigurationService - Remote Folder', () => { remoteSettingsFile = path.join(parentDir, 'remote-settings.json'); instantiationService = workbenchInstantiationService(); - const environmentService = new WorkbenchEnvironmentService(parseArgs(process.argv), process.execPath); + const environmentService = new TestEnvironmentService(URI.file(parentDir)); const remoteEnvironmentPromise = new Promise>(c => resolveRemoteEnvironment = () => c({ settingsPath: URI.file(remoteSettingsFile).with({ scheme: Schemas.vscodeRemote, authority: remoteAuthority }) })); const remoteAgentService = instantiationService.stub(IRemoteAgentService, >{ getEnvironment: () => remoteEnvironmentPromise }); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, diskFileSystemProvider); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.userRoamingDataHome, new FileUserDataProvider(URI.file(parentDir), fileService))); + fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, dirname(environmentService.appSettingsHome), diskFileSystemProvider)); const configurationCache: IConfigurationCache = { read: () => Promise.resolve(''), write: () => Promise.resolve(), remove: () => Promise.resolve() }; testObject = new WorkspaceService({ configurationCache, remoteAuthority }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, testObject); 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 8e0c6f8d0db..dc8b05ca6f8 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 @@ -45,11 +45,21 @@ import { FileService } from 'vs/workbench/services/files/common/fileService'; import { Schemas } from 'vs/base/common/network'; import { DiskFileSystemProvider } from 'vs/workbench/services/files/node/diskFileSystemProvider'; import { URI } from 'vs/base/common/uri'; -import { UserDataFileSystemProvider } from 'vs/workbench/services/userData/common/userDataFileSystemProvider'; import { FileUserDataProvider } from 'vs/workbench/services/userData/common/fileUserDataProvider'; import { parseArgs } from 'vs/platform/environment/node/argv'; import { WorkbenchEnvironmentService } from 'vs/workbench/services/environment/node/environmentService'; import { IWindowConfiguration } from 'vs/platform/windows/common/windows'; +import { dirname } from 'vs/base/common/resources'; + +class TestBackupEnvironmentService extends WorkbenchEnvironmentService { + + constructor(private _appSettingsHome: URI) { + super(parseArgs(process.argv) as IWindowConfiguration, process.execPath); + } + + get appSettingsHome() { return this._appSettingsHome; } + +} interface Modifiers { metaKey?: boolean; @@ -71,7 +81,7 @@ suite('KeybindingsEditing', () => { instantiationService = new TestInstantiationService(); - const environmentService = new WorkbenchEnvironmentService(parseArgs(process.argv), process.execPath); + const environmentService = new TestBackupEnvironmentService(URI.file(testDir)); instantiationService.stub(IEnvironmentService, environmentService); instantiationService.stub(IConfigurationService, ConfigurationService); instantiationService.stub(IConfigurationService, 'getValue', { 'eol': '\n' }); @@ -89,8 +99,9 @@ suite('KeybindingsEditing', () => { instantiationService.stub(ITextResourcePropertiesService, new TestTextResourcePropertiesService(instantiationService.get(IConfigurationService))); instantiationService.stub(IModelService, instantiationService.createInstance(ModelServiceImpl)); const fileService = new FileService(new NullLogService()); - fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); - fileService.registerProvider(Schemas.userData, new UserDataFileSystemProvider(environmentService.userRoamingDataHome, new FileUserDataProvider(URI.file(testDir), fileService))); + const diskFileSystemProvider = new DiskFileSystemProvider(new NullLogService()); + fileService.registerProvider(Schemas.file, diskFileSystemProvider); + fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, dirname(environmentService.appSettingsHome), diskFileSystemProvider)); instantiationService.stub(IFileService, fileService); instantiationService.stub(IUntitledEditorService, instantiationService.createInstance(UntitledEditorService)); instantiationService.stub(ITextFileService, instantiationService.createInstance(TestTextFileService)); diff --git a/src/vs/workbench/services/userData/common/fileUserDataProvider.ts b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts index 3b8ad172fe3..d4dd8d7abb7 100644 --- a/src/vs/workbench/services/userData/common/fileUserDataProvider.ts +++ b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts @@ -4,120 +4,134 @@ *--------------------------------------------------------------------------------------------*/ import { Event, Emitter } from 'vs/base/common/event'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { IUserDataProvider, FileChangeEvent, IUserDataContainerRegistry, Extensions } from 'vs/workbench/services/userData/common/userData'; -import { IFileService, FileChangesEvent, FileChangeType } from 'vs/platform/files/common/files'; +import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; +import { IFileSystemProviderWithFileReadWriteCapability, IFileChange, IWatchOptions, IStat, FileOverwriteOptions, FileType, FileWriteOptions, FileDeleteOptions, FileSystemProviderCapabilities, IFileSystemProviderWithOpenReadWriteCloseCapability, FileOpenOptions, hasReadWriteCapability, hasOpenReadWriteCloseCapability } from 'vs/platform/files/common/files'; import { URI } from 'vs/base/common/uri'; import * as resources from 'vs/base/common/resources'; -import { VSBuffer } from 'vs/base/common/buffer'; import { startsWith } from 'vs/base/common/strings'; import { BACKUPS } from 'vs/platform/environment/common/environment'; -import { Registry } from 'vs/platform/registry/common/platform'; +import { Schemas } from 'vs/base/common/network'; -export class FileUserDataProvider extends Disposable implements IUserDataProvider { +export class FileUserDataProvider extends Disposable implements IFileSystemProviderWithFileReadWriteCapability, IFileSystemProviderWithOpenReadWriteCloseCapability { - private _onDidChangeFile: Emitter = this._register(new Emitter()); - readonly onDidChangeFile: Event = this._onDidChangeFile.event; + readonly capabilities: FileSystemProviderCapabilities = this.fileSystemProvider.capabilities; + readonly onDidChangeCapabilities: Event = Event.None; + + private readonly _onDidChangeFile: Emitter = this._register(new Emitter()); + readonly onDidChangeFile: Event = this._onDidChangeFile.event; constructor( private readonly userDataHome: URI, - @IFileService private readonly fileService: IFileService + private readonly backupsHome: URI, + private readonly fileSystemProvider: IFileSystemProviderWithFileReadWriteCapability | IFileSystemProviderWithOpenReadWriteCloseCapability, ) { super(); + // Assumption: This path always exists - this._register(this.fileService.watch(this.userDataHome)); - this._register(this.fileService.onFileChanges(e => this.handleFileChanges(e))); - - const userDataContainersRegistry = Registry.as(Extensions.UserDataContainers); - userDataContainersRegistry.containers.forEach(c => this.watchContainer(c)); - this._register(userDataContainersRegistry.onDidRegisterContainer(c => this.watchContainer(c))); + this._register(this.fileSystemProvider.watch(this.userDataHome, { recursive: false, excludes: [] })); + this._register(this.fileSystemProvider.onDidChangeFile(e => this.handleFileChanges(e))); } - private handleFileChanges(event: FileChangesEvent): void { - const changedPaths: FileChangeEvent[] = []; - const userDataContainersRegistry = Registry.as(Extensions.UserDataContainers); - for (const change of event.changes) { - if (change.resource.scheme === this.userDataHome.scheme) { - const path = this.toPath(change.resource); - if (path) { - changedPaths.push({ - path, - type: change.type - }); - if (userDataContainersRegistry.isContainer(path)) { - if (change.type === FileChangeType.ADDED) { - this.watchContainer(path); - } - } - } + watch(resource: URI, opts: IWatchOptions): IDisposable { + return this.fileSystemProvider.watch(this.toFileSystemResource(resource), opts); + } + + stat(resource: URI): Promise { + return this.fileSystemProvider.stat(this.toFileSystemResource(resource)); + } + + mkdir(resource: URI): Promise { + return this.fileSystemProvider.mkdir(this.toFileSystemResource(resource)); + } + + rename(from: URI, to: URI, opts: FileOverwriteOptions): Promise { + return this.fileSystemProvider.rename(this.toFileSystemResource(from), this.toFileSystemResource(to), opts); + } + + readFile(resource: URI): Promise { + if (hasReadWriteCapability(this.fileSystemProvider)) { + return this.fileSystemProvider.readFile(this.toFileSystemResource(resource)); + } + throw new Error('not supported'); + } + + readdir(resource: URI): Promise<[string, FileType][]> { + return this.fileSystemProvider.readdir(this.toFileSystemResource(resource)); + } + + writeFile(resource: URI, content: Uint8Array, opts: FileWriteOptions): Promise { + if (hasReadWriteCapability(this.fileSystemProvider)) { + return this.fileSystemProvider.writeFile(this.toFileSystemResource(resource), content, opts); + } + throw new Error('not supported'); + } + + open(resource: URI, opts: FileOpenOptions): Promise { + if (hasOpenReadWriteCloseCapability(this.fileSystemProvider)) { + return this.fileSystemProvider.open(this.toFileSystemResource(resource), opts); + } + throw new Error('not supported'); + } + + close(fd: number): Promise { + if (hasOpenReadWriteCloseCapability(this.fileSystemProvider)) { + return this.fileSystemProvider.close(fd); + } + throw new Error('not supported'); + } + + read(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise { + if (hasOpenReadWriteCloseCapability(this.fileSystemProvider)) { + return this.fileSystemProvider.read(fd, pos, data, offset, length); + } + throw new Error('not supported'); + } + + write(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise { + if (hasOpenReadWriteCloseCapability(this.fileSystemProvider)) { + return this.fileSystemProvider.write(fd, pos, data, offset, length); + } + throw new Error('not supported'); + } + + delete(resource: URI, opts: FileDeleteOptions): Promise { + return this.fileSystemProvider.delete(this.toFileSystemResource(resource), opts); + } + + private handleFileChanges(changes: IFileChange[]): void { + const userDataChanges: IFileChange[] = []; + for (const change of changes) { + const userDataResource = this.toUserDataResource(change.resource); + if (userDataResource) { + userDataChanges.push({ + resource: userDataResource, + type: change.type + }); } } - if (changedPaths.length) { - this._onDidChangeFile.fire(changedPaths); + if (userDataChanges.length) { + this._onDidChangeFile.fire(userDataChanges); } } - private async watchContainer(container: string): Promise { - if (this.isBackUpsPath(container)) { - return; + private toFileSystemResource(userDataResource: URI): URI { + const fileSystemResource = userDataResource.with({ scheme: this.userDataHome.scheme }); + const relativePath = resources.relativePath(this.userDataHome, fileSystemResource); + if (relativePath && startsWith(relativePath, BACKUPS)) { + return resources.joinPath(resources.dirname(this.backupsHome), relativePath); } - const resource = this.toResource(container); - const exists = await this.fileService.exists(resource); - if (exists) { - this._register(this.fileService.watch(resource)); + return fileSystemResource; + } + + private toUserDataResource(fileSystemResource: URI): URI | null { + if (resources.relativePath(this.userDataHome, fileSystemResource)) { + return fileSystemResource.with({ scheme: Schemas.userData }); } - } - - async readFile(path: string): Promise { - const resource = this.toResource(path); - const content = await this.fileService.readFile(resource); - return content.value.buffer; - } - - writeFile(path: string, value: Uint8Array): Promise { - return this.fileService.writeFile(this.toResource(path), VSBuffer.wrap(value)).then(() => undefined); - } - - async listFiles(path: string): Promise { - const resource = this.toResource(path); - try { - const result = await this.fileService.resolve(resource); - if (result.children) { - return result.children - .filter(c => !c.isDirectory) - .map(c => this.toRelativePath(c.resource, resource)!); - } - } catch (error) { + const relativePath = resources.relativePath(this.backupsHome, fileSystemResource); + if (relativePath) { + return resources.joinPath(this.userDataHome, BACKUPS, relativePath).with({ scheme: Schemas.userData }); } - return []; + return null; } - deleteFile(path: string): Promise { - return this.fileService.del(this.toResource(path)); - } - - private toResource(path: string): URI { - if (this.isBackUpsPath(path)) { - return resources.joinPath(resources.dirname(this.userDataHome), path); - } - return resources.joinPath(this.userDataHome, path); - } - - private isBackUpsPath(path: string): boolean { - return path === BACKUPS || startsWith(path, `${BACKUPS}/`); - } - - private toPath(resource: URI): string | undefined { - let result = this.toRelativePath(resource, this.userDataHome); - if (result === undefined) { - result = this.toRelativePath(resource, resources.joinPath(resources.dirname(this.userDataHome), BACKUPS)); - } - return result; - } - - private toRelativePath(fromResource: URI, toResource: URI): string | undefined { - const fromPath = fromResource.toString(); - const toPath = toResource.toString(); - return startsWith(fromPath, toPath) ? fromPath.substr(toPath.length + 1) : undefined; - } } \ No newline at end of file diff --git a/src/vs/workbench/services/userData/common/userData.ts b/src/vs/workbench/services/userData/common/userData.ts index 438d6339e30..6ce93879fc3 100644 --- a/src/vs/workbench/services/userData/common/userData.ts +++ b/src/vs/workbench/services/userData/common/userData.ts @@ -3,9 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Event, Emitter } from 'vs/base/common/event'; -import { TernarySearchTree } from 'vs/base/common/map'; -import { Registry } from 'vs/platform/registry/common/platform'; +import { Event } from 'vs/base/common/event'; import { FileChangeType } from 'vs/platform/files/common/files'; /** @@ -80,59 +78,3 @@ export interface IUserDataProvider { */ listFiles(path: string): Promise; } - -export interface IUserDataContainerRegistry { - - /** - * An event to signal that a container has been registered. - */ - readonly onDidRegisterContainer: Event; - - /** - * Registered containers - */ - readonly containers: string[]; - - /** - * Register the given path as an user data container if user data files are stored under this path. - * - * It is required to register the container to access the user data files under the container. - */ - registerContainer(path: string): void; - - /** - * Returns true if the given path is an user data container or sub container of user data container - */ - isContainer(path: string): boolean; -} - -class UserDataContainerRegistry implements IUserDataContainerRegistry { - - private _containers: TernarySearchTree = TernarySearchTree.forStrings(); - - private _onDidRegisterContainer: Emitter = new Emitter(); - readonly onDidRegisterContainer: Event = this._onDidRegisterContainer.event; - - get containers(): string[] { - const containers: string[] = []; - this._containers.forEach(c => containers.push(c)); - return containers; - } - - public registerContainer(path: string): void { - if (!this._containers.get(path)) { - this._containers.set(path, path); - this._onDidRegisterContainer.fire(path); - } - } - - isContainer(path: string): boolean { - return !!this._containers.get(path) || !!this._containers.findSuperstr(path); - } -} - -export const Extensions = { - UserDataContainers: 'workbench.contributions.userDataContainers' -}; - -Registry.add(Extensions.UserDataContainers, new UserDataContainerRegistry()); \ No newline at end of file diff --git a/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts b/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts deleted file mode 100644 index 3eb3e76ea3e..00000000000 --- a/src/vs/workbench/services/userData/common/userDataFileSystemProvider.ts +++ /dev/null @@ -1,156 +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 { IDisposable, Disposable } from 'vs/base/common/lifecycle'; -import { FileSystemProviderCapabilities, FileWriteOptions, IStat, FileType, FileDeleteOptions, IWatchOptions, FileOverwriteOptions, IFileSystemProviderWithFileReadWriteCapability, IFileChange, FileChangeType, FileChangesEvent } from 'vs/platform/files/common/files'; -import { IUserDataProvider, IUserDataContainerRegistry, Extensions, FileChangeEvent } from 'vs/workbench/services/userData/common/userData'; -import { URI } from 'vs/base/common/uri'; -import { Event, Emitter } from 'vs/base/common/event'; -import { startsWith } from 'vs/base/common/strings'; -import { Registry } from 'vs/platform/registry/common/platform'; -import { joinPath } from 'vs/base/common/resources'; - -export class UserDataFileSystemProvider extends Disposable implements IFileSystemProviderWithFileReadWriteCapability { - - private readonly versions: Map = new Map(); - - readonly capabilities: FileSystemProviderCapabilities = FileSystemProviderCapabilities.FileReadWrite; - readonly onDidChangeCapabilities: Event = Event.None; - - private readonly _onDidChangeFile: Emitter = this._register(new Emitter()); - readonly onDidChangeFile: Event = this._onDidChangeFile.event; - - constructor( - private readonly userDataHome: URI, - private readonly userDataProvider: IUserDataProvider - ) { - super(); - this._register(this.userDataProvider.onDidChangeFile(changes => this.onDidChangeUserData(changes))); - } - - private onDidChangeUserData(changes: FileChangeEvent[]): void { - const fileChanges: IFileChange[] = []; - for (const { path, type } of changes) { - if (type === FileChangeType.DELETED) { - this.versions.delete(path); - } else { - this.versions.set(path, this.getOrSetVersion(path) + 1); - } - fileChanges.push({ - resource: this.toResource(path), - type - }); - } - if (fileChanges.length) { - this._onDidChangeFile.fire(new FileChangesEvent(fileChanges).changes); - } - } - - watch(resource: URI, opts: IWatchOptions): IDisposable { - const path = this.toPath(resource); - if (!path) { - throw new Error(`Invalid user data resource ${resource}`); - } - return Disposable.None; - } - - async stat(resource: URI): Promise { - const path = this.toPath(resource); - if (path === undefined) { - throw new Error(`Invalid user data resource ${resource}`); - } - if (this.isContainer(path)) { - return { - type: FileType.Directory, - ctime: 0, - mtime: this.getOrSetVersion(path), - size: 0 - }; - } - const result = await this.readFile(resource); - return { - type: FileType.File, - ctime: 0, - mtime: this.getOrSetVersion(path), - size: result.byteLength - }; - } - - mkdir(resource: URI): Promise { throw new Error('not supported'); } - rename(from: URI, to: URI, opts: FileOverwriteOptions): Promise { throw new Error('not supported'); } - - async readFile(resource: URI): Promise { - const path = this.toPath(resource); - if (!path) { - throw new Error(`Invalid user data resource ${resource}`); - } - if (this.isContainer(path)) { - throw new Error(`Invalid user data file ${resource}`); - } - return this.userDataProvider.readFile(path); - } - - async readdir(resource: URI): Promise<[string, FileType][]> { - const path = this.toPath(resource); - if (!path) { - throw new Error(`Invalid user data resource ${resource}`); - } - if (!this.isContainer(path)) { - throw new Error(`Invalid user data container ${resource}`); - } - const children = await this.userDataProvider.listFiles(path); - return children.map(c => [c, FileType.File]); - } - - writeFile(resource: URI, content: Uint8Array, opts: FileWriteOptions): Promise { - const path = this.toPath(resource); - if (!path) { - throw new Error(`Invalid user data resource ${resource}`); - } - if (this.isContainer(path)) { - throw new Error(`Invalid user data file ${resource}`); - } - return this.userDataProvider.writeFile(path, content); - } - - delete(resource: URI, opts: FileDeleteOptions): Promise { - const path = this.toPath(resource); - if (!path) { - throw new Error(`Invalid user data resource ${resource}`); - } - if (this.isContainer(path)) { - throw new Error(`Invalid user data file ${resource}`); - } - return this.userDataProvider.deleteFile(path); - } - - private getOrSetVersion(path: string): number { - if (!this.versions.has(path)) { - this.versions.set(path, 1); - } - return this.versions.get(path)!; - } - - private isContainer(path: string): boolean { - if (path === '') { - return true; // Root - } - return Registry.as(Extensions.UserDataContainers).isContainer(path); - } - - private toResource(path: string): URI { - return joinPath(this.userDataHome, path); - } - - private toPath(resource: URI): string | undefined { - return this.toRelativePath(resource, this.userDataHome); - } - - private toRelativePath(fromResource: URI, toResource: URI): string | undefined { - const fromPath = fromResource.toString(); - const toPath = toResource.toString(); - return startsWith(fromPath, toPath) ? fromPath.substr(toPath.length + 1) : undefined; - } -} \ No newline at end of file diff --git a/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts b/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts deleted file mode 100644 index 807e4c40423..00000000000 --- a/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts +++ /dev/null @@ -1,545 +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 os from 'os'; -import * as path from 'vs/base/common/path'; -import * as uuid from 'vs/base/common/uuid'; -import * as pfs from 'vs/base/node/pfs'; -import { IFileService, FileChangeType } from 'vs/platform/files/common/files'; -import { FileService } from 'vs/workbench/services/files/common/fileService'; -import { NullLogService } from 'vs/platform/log/common/log'; -import { Schemas } from 'vs/base/common/network'; -import { UserDataFileSystemProvider } from 'vs/workbench/services/userData/common/userDataFileSystemProvider'; -import { URI } from 'vs/base/common/uri'; -import { FileUserDataProvider } from 'vs/workbench/services/userData/common/fileUserDataProvider'; -import { joinPath } from 'vs/base/common/resources'; -import { VSBuffer } from 'vs/base/common/buffer'; -import { DiskFileSystemProvider } from 'vs/workbench/services/files/electron-browser/diskFileSystemProvider'; -import { Registry } from 'vs/platform/registry/common/platform'; -import { IUserDataContainerRegistry, Extensions } from 'vs/workbench/services/userData/common/userData'; -import { BACKUPS } from 'vs/platform/environment/common/environment'; -import { DisposableStore } from 'vs/base/common/lifecycle'; - -suite('FileUserDataProvider', () => { - - let testObject: IFileService; - let rootPath: string; - let userDataPath: string; - let backupsPath: string; - let userDataResource: URI; - const userDataContainersRegistry = Registry.as(Extensions.UserDataContainers); - const disposables = new DisposableStore(); - - setup(async () => { - const logService = new NullLogService(); - testObject = new FileService(logService); - disposables.add(testObject); - - const diskFileSystemProvider = new DiskFileSystemProvider(logService); - disposables.add(diskFileSystemProvider); - disposables.add(testObject.registerProvider(Schemas.file, diskFileSystemProvider)); - - rootPath = path.join(os.tmpdir(), 'vsctests', uuid.generateUuid()); - userDataPath = path.join(rootPath, 'user'); - backupsPath = path.join(rootPath, BACKUPS); - userDataResource = URI.from({ scheme: Schemas.userData, path: '/user' }); - await Promise.all([pfs.mkdirp(userDataPath), pfs.mkdirp(backupsPath)]); - - const fileUserDataProvider = new FileUserDataProvider(URI.file(userDataPath), testObject); - disposables.add(fileUserDataProvider); - const userDataFileSystemProvider = new UserDataFileSystemProvider(userDataResource, fileUserDataProvider); - disposables.add(userDataFileSystemProvider); - disposables.add(testObject.registerProvider(Schemas.userData, userDataFileSystemProvider)); - - userDataContainersRegistry.registerContainer('testContainer'); - userDataContainersRegistry.registerContainer('testContainer/subContainer'); - userDataContainersRegistry.registerContainer(BACKUPS); - }); - - teardown(async () => { - disposables.clear(); - await pfs.rimraf(rootPath, pfs.RimRafMode.MOVE); - }); - - test('exists return false when file does not exist', async () => { - const exists = await testObject.exists(joinPath(userDataResource, 'settings.json')); - assert.equal(exists, false); - }); - - test('read file throws error if not exist', async () => { - try { - await testObject.readFile(joinPath(userDataResource, 'settings.json')); - assert.fail('Should fail since file does not exist'); - } catch (e) { } - }); - - test('read existing file', async () => { - await pfs.writeFile(path.join(userDataPath, 'settings.json'), '{}'); - const result = await testObject.readFile(joinPath(userDataResource, 'settings.json')); - assert.equal(result.value, '{}'); - }); - - test('create file', async () => { - await testObject.createFile(joinPath(userDataResource, 'settings.json'), VSBuffer.fromString('{}')); - const result = await pfs.readFile(path.join(userDataPath, 'settings.json')); - assert.equal(result, '{}'); - }); - - test('write file creates the file if not exist', async () => { - await testObject.writeFile(joinPath(userDataResource, 'settings.json'), VSBuffer.fromString('{}')); - const result = await pfs.readFile(path.join(userDataPath, 'settings.json')); - assert.equal(result, '{}'); - }); - - test('write to existing file', async () => { - await pfs.writeFile(path.join(userDataPath, 'settings.json'), '{}'); - await testObject.writeFile(joinPath(userDataResource, 'settings.json'), VSBuffer.fromString('{a:1}')); - const result = await pfs.readFile(path.join(userDataPath, 'settings.json')); - assert.equal(result, '{a:1}'); - }); - - test('delete file', async () => { - await pfs.writeFile(path.join(userDataPath, 'settings.json'), ''); - await testObject.del(joinPath(userDataResource, 'settings.json')); - const result = await pfs.exists(path.join(userDataPath, 'settings.json')); - assert.equal(false, result); - }); - - test('resolve file', async () => { - await pfs.writeFile(path.join(userDataPath, 'settings.json'), ''); - const result = await testObject.resolve(joinPath(userDataResource, 'settings.json')); - assert.ok(!result.isDirectory); - assert.ok(result.children === undefined); - }); - - test('exists return true for container', async () => { - const exists = await testObject.exists(joinPath(userDataResource, 'testContainer')); - assert.equal(exists, true); - }); - - test('exists return false for non registered container', async () => { - await pfs.mkdirp(path.join(userDataPath, 'container')); - const exists = await testObject.exists(joinPath(userDataResource, 'container')); - assert.equal(exists, false); - }); - - test('read file throws error for container', async () => { - try { - await testObject.readFile(joinPath(userDataResource, 'testContainer')); - assert.fail('Should fail since read file is not supported for container'); - } catch (e) { } - }); - - test('read file under container', async () => { - await pfs.mkdirp(path.join(userDataPath, 'testContainer')); - await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); - const actual = await testObject.readFile(joinPath(userDataResource, 'testContainer/settings.json')); - assert.equal(actual.value, '{}'); - }); - - test('read file under sub container', async () => { - await pfs.mkdirp(path.join(userDataPath, 'testContainer', 'subContainer')); - await pfs.writeFile(path.join(userDataPath, 'testContainer', 'subContainer', 'settings.json'), '{}'); - const actual = await testObject.readFile(joinPath(userDataResource, 'testContainer/subContainer/settings.json')); - assert.equal(actual.value, '{}'); - }); - - test('create file throws error for container', async () => { - try { - await testObject.createFile(joinPath(userDataResource, 'testContainer'), VSBuffer.fromString('{}')); - assert.fail('Should fail since create file is not supported for container'); - } catch (e) { } - }); - - test('create file under container that exists', async () => { - await pfs.mkdirp(path.join(userDataPath, 'testContainer')); - await testObject.createFile(joinPath(userDataResource, 'testContainer/settings.json'), VSBuffer.fromString('{}')); - const actual = await pfs.readFile(path.join(userDataPath, 'testContainer', 'settings.json')); - assert.equal(actual, '{}'); - }); - - test('create file under container that does not exist', async () => { - await testObject.createFile(joinPath(userDataResource, 'testContainer/settings.json'), VSBuffer.fromString('{}')); - const actual = await pfs.readFile(path.join(userDataPath, 'testContainer', 'settings.json')); - assert.equal(actual, '{}'); - }); - - test('write file throws error for container', async () => { - try { - await testObject.writeFile(joinPath(userDataResource, 'testContainer'), VSBuffer.fromString('{}')); - assert.fail('Should fail since write file is not supported for container'); - } catch (e) { } - }); - - test('write to not existing file under container that exists', async () => { - await pfs.mkdirp(path.join(userDataPath, 'testContainer')); - await testObject.writeFile(joinPath(userDataResource, 'testContainer/settings.json'), VSBuffer.fromString('{}')); - const actual = await pfs.readFile(path.join(userDataPath, 'testContainer', 'settings.json')); - assert.equal(actual, '{}'); - }); - - test('write to not existing file under container that does not exists', async () => { - await testObject.writeFile(joinPath(userDataResource, 'testContainer/settings.json'), VSBuffer.fromString('{}')); - const actual = await pfs.readFile(path.join(userDataPath, 'testContainer', 'settings.json')); - assert.equal(actual, '{}'); - }); - - test('write to existing file under container', async () => { - await pfs.mkdirp(path.join(userDataPath, 'testContainer')); - await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); - await testObject.writeFile(joinPath(userDataResource, 'testContainer/settings.json'), VSBuffer.fromString('{a:1}')); - const actual = await pfs.readFile(path.join(userDataPath, 'testContainer', 'settings.json')); - assert.equal(actual.toString(), '{a:1}'); - }); - - test('write file under sub container', async () => { - await testObject.writeFile(joinPath(userDataResource, 'testContainer/subContainer/settings.json'), VSBuffer.fromString('{}')); - const actual = await pfs.readFile(path.join(userDataPath, 'testContainer', 'subContainer', 'settings.json')); - assert.equal(actual, '{}'); - }); - - test('delete file throws error for container that does not exist', async () => { - try { - await testObject.del(joinPath(userDataResource, 'testContainer')); - assert.fail('Should fail since delete file is not supported for container'); - } catch (e) { } - }); - - test('delete file throws error for container that exist', async () => { - await pfs.mkdirp(path.join(userDataPath, 'testContainer')); - try { - await testObject.del(joinPath(userDataResource, 'testContainer')); - assert.fail('Should fail since delete file is not supported for container'); - } catch (e) { } - }); - - test('delete not existing file under container that exists', async () => { - await pfs.mkdirp(path.join(userDataPath, 'testContainer')); - try { - await testObject.del(joinPath(userDataResource, 'testContainer')); - assert.fail('Should fail since file does not exist'); - } catch (e) { } - }); - - test('delete not existing file under container that does not exists', async () => { - try { - await testObject.del(joinPath(userDataResource, 'testContainer/settings.json')); - assert.fail('Should fail since file does not exist'); - } catch (e) { } - }); - - test('delete existing file under container', async () => { - await pfs.mkdirp(path.join(userDataPath, 'testContainer')); - pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); - await testObject.del(joinPath(userDataResource, 'testContainer/settings.json')); - const exists = await pfs.exists(path.join(userDataPath, 'testContainer', 'settings.json')); - assert.equal(exists, false); - }); - - test('resolve container', async () => { - await pfs.mkdirp(path.join(userDataPath, 'testContainer')); - pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); - const result = await testObject.resolve(joinPath(userDataResource, 'testContainer')); - assert.ok(result.isDirectory); - assert.ok(result.children !== undefined); - assert.equal(result.children!.length, 1); - assert.equal(result.children![0].resource.toString(), joinPath(userDataResource, 'testContainer/settings.json').toString()); - }); - - test('read backup file', async () => { - await pfs.writeFile(path.join(backupsPath, 'backup.json'), '{}'); - const result = await testObject.readFile(joinPath(userDataResource, `${BACKUPS}/backup.json`)); - assert.equal(result.value, '{}'); - }); - - test('create backup file', async () => { - await testObject.createFile(joinPath(userDataResource, `${BACKUPS}/backup.json`), VSBuffer.fromString('{}')); - const result = await pfs.readFile(path.join(backupsPath, 'backup.json')); - assert.equal(result, '{}'); - }); - - test('write backup file', async () => { - await pfs.writeFile(path.join(backupsPath, 'backup.json'), '{}'); - await testObject.writeFile(joinPath(userDataResource, `${BACKUPS}/backup.json`), VSBuffer.fromString('{a:1}')); - const result = await pfs.readFile(path.join(backupsPath, 'backup.json')); - assert.equal(result, '{a:1}'); - }); - - test('resolve backups container', async () => { - pfs.writeFile(path.join(backupsPath, 'backup.json'), '{}'); - const result = await testObject.resolve(joinPath(userDataResource, BACKUPS)); - assert.ok(result.isDirectory); - assert.ok(result.children !== undefined); - assert.equal(result.children!.length, 1); - assert.equal(result.children![0].resource.toString(), joinPath(userDataResource, `${BACKUPS}/backup.json`).toString()); - }); -}); - -// Watch tests are flaky -if (false) { - - suite('FileUserDataProvider - Watching', () => { - - let testObject: IFileService; - let rootPath: string; - let userDataPath: string; - let backupsPath: string; - let userDataResource: URI; - const userDataContainersRegistry = Registry.as(Extensions.UserDataContainers); - const disposables = new DisposableStore(); - - setup(async () => { - const logService = new NullLogService(); - testObject = new FileService(logService); - disposables.add(testObject); - - const diskFileSystemProvider = new DiskFileSystemProvider(logService); - disposables.add(diskFileSystemProvider); - disposables.add(testObject.registerProvider(Schemas.file, diskFileSystemProvider)); - - rootPath = path.join(os.tmpdir(), 'vsctests', uuid.generateUuid()); - userDataPath = path.join(rootPath, 'user'); - backupsPath = path.join(rootPath, BACKUPS); - userDataResource = URI.from({ scheme: Schemas.userData, path: '/user' }); - await Promise.all([pfs.mkdirp(userDataPath), pfs.mkdirp(backupsPath)]); - - const fileUserDataProvider = new FileUserDataProvider(URI.file(userDataPath), testObject); - disposables.add(fileUserDataProvider); - const userDataFileSystemProvider = new UserDataFileSystemProvider(userDataResource, fileUserDataProvider); - disposables.add(userDataFileSystemProvider); - disposables.add(testObject.registerProvider(Schemas.userData, userDataFileSystemProvider)); - - userDataContainersRegistry.registerContainer('testContainer'); - userDataContainersRegistry.registerContainer('testContainer/subContainer'); - userDataContainersRegistry.registerContainer(BACKUPS); - }); - - teardown(async () => { - disposables.clear(); - await pfs.rimraf(rootPath, pfs.RimRafMode.MOVE); - }); - - test('watch file - event is triggerred when file is created', async (done) => { - const resource = joinPath(userDataResource, 'settings.json'); - disposables.add(testObject.watch(resource)); - testObject.onFileChanges(e => { - if (e.contains(resource, FileChangeType.ADDED)) { - done(); - } - }); - await testObject.writeFile(resource, VSBuffer.fromString('{a:1}')); - }); - - test('watch file - event is triggerred when file is created externally', async (done) => { - const resource = joinPath(userDataResource, 'settings.json'); - disposables.add(testObject.watch(resource)); - testObject.onFileChanges(e => { - if (e.contains(resource, FileChangeType.ADDED)) { - done(); - } - }); - await pfs.writeFile(path.join(userDataPath, 'settings.json'), '{}'); - }); - - test('watch file - event is triggerred when file is updated', async (done) => { - const resource = joinPath(userDataResource, 'settings.json'); - await testObject.writeFile(resource, VSBuffer.fromString('{}')); - disposables.add(testObject.watch(resource)); - testObject.onFileChanges(e => { - if (e.contains(resource, FileChangeType.UPDATED)) { - done(); - } - }); - await testObject.writeFile(resource, VSBuffer.fromString('{a:1}')); - }); - - test('watch file - event is triggerred when file is update externally', async (done) => { - const resource = joinPath(userDataResource, 'settings.json'); - await testObject.writeFile(resource, VSBuffer.fromString('{}')); - disposables.add(testObject.watch(resource)); - testObject.onFileChanges(e => { - if (e.contains(resource, FileChangeType.UPDATED)) { - done(); - } - }); - await pfs.writeFile(path.join(userDataPath, 'settings.json'), '{a:1}'); - }); - - test('watch file - event is triggerred when file is deleted', async (done) => { - const resource = joinPath(userDataResource, 'settings.json'); - await testObject.writeFile(resource, VSBuffer.fromString('{}')); - disposables.add(testObject.watch(resource)); - testObject.onFileChanges(e => { - if (e.contains(resource, FileChangeType.DELETED)) { - done(); - } - }); - await testObject.del(resource); - }); - - test('watch file - event is triggerred when file is deleted externally', async (done) => { - const resource = joinPath(userDataResource, 'settings.json'); - await testObject.writeFile(resource, VSBuffer.fromString('{}')); - disposables.add(testObject.watch(resource)); - testObject.onFileChanges(e => { - if (e.contains(resource, FileChangeType.DELETED)) { - done(); - } - }); - await pfs.unlink(path.join(userDataPath, 'settings.json')); - }); - - test('watch file under container - event is triggerred when file is created', async (done) => { - const resource = joinPath(userDataResource, 'testContainer/settings.json'); - disposables.add(testObject.watch(resource)); - testObject.onFileChanges(e => { - if (e.contains(resource, FileChangeType.ADDED)) { - done(); - } - }); - await testObject.writeFile(joinPath(userDataResource, 'testContainer/settings.json'), VSBuffer.fromString('{a:1}')); - }); - - test('watch file under container - event is triggerred when file is created externally', async (done) => { - const resource = joinPath(userDataResource, 'testContainer/settings.json'); - disposables.add(testObject.watch(resource)); - testObject.onFileChanges(e => { - if (e.contains(resource, FileChangeType.ADDED)) { - done(); - } - }); - await pfs.mkdirp(path.join(userDataPath, 'testContainer')); - await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); - }); - - test('watch file under container - event is triggerred when file is updated', async (done) => { - const resource = joinPath(userDataResource, 'testContainer/settings.json'); - await pfs.mkdirp(path.join(userDataPath, 'testContainer')); - await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); - disposables.add(testObject.watch(resource)); - testObject.onFileChanges(e => { - if (e.contains(resource, FileChangeType.UPDATED)) { - done(); - } - }); - await testObject.writeFile(resource, VSBuffer.fromString('{a:1}')); - }); - - test('watch file under container - event is triggerred when file is updated externally', async (done) => { - const resource = joinPath(userDataResource, 'testContainer/settings.json'); - await pfs.mkdirp(path.join(userDataPath, 'testContainer')); - await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); - disposables.add(testObject.watch(resource)); - testObject.onFileChanges(e => { - if (e.contains(resource, FileChangeType.UPDATED)) { - done(); - } - }); - await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{a:1}'); - }); - - test('watch file under container - event is triggerred when file is deleted', async (done) => { - const resource = joinPath(userDataResource, 'testContainer/settings.json'); - await testObject.writeFile(resource, VSBuffer.fromString('{}')); - disposables.add(testObject.watch(resource)); - testObject.onFileChanges(e => { - if (e.contains(resource, FileChangeType.DELETED)) { - done(); - } - }); - await testObject.del(resource); - }); - - test('watch file under container - event is triggerred when file is deleted externally', async (done) => { - const resource = joinPath(userDataResource, 'testContainer/settings.json'); - await testObject.writeFile(resource, VSBuffer.fromString('{}')); - disposables.add(testObject.watch(resource)); - testObject.onFileChanges(e => { - if (e.contains(resource, FileChangeType.DELETED)) { - done(); - } - }); - await pfs.unlink(path.join(userDataPath, 'testContainer', 'settings.json')); - }); - - test('watch container - event is triggerred when file under container is created', async (done) => { - const container = joinPath(userDataResource, 'testContainer'); - const resource = joinPath(userDataResource, 'testContainer/settings.json'); - disposables.add(testObject.watch(container)); - testObject.onFileChanges(e => { - if (e.contains(resource, FileChangeType.ADDED)) { - done(); - } - }); - await testObject.writeFile(resource, VSBuffer.fromString('{a:1}')); - }); - - test('watch container - event is triggerred when file under container is created externally', async (done) => { - await pfs.mkdirp(path.join(userDataPath, 'testContainer')); - const container = joinPath(userDataResource, 'testContainer'); - const resource = joinPath(userDataResource, 'testContainer/settings.json'); - disposables.add(testObject.watch(container)); - testObject.onFileChanges(e => { - if (e.contains(resource, FileChangeType.ADDED)) { - done(); - } - }); - await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{}'); - }); - - test('watch container - event is triggerred when file under container is updated', async (done) => { - const container = joinPath(userDataResource, 'testContainer'); - const resource = joinPath(userDataResource, 'testContainer/settings.json'); - await testObject.writeFile(resource, VSBuffer.fromString('{}')); - disposables.add(testObject.watch(container)); - testObject.onFileChanges(e => { - if (e.contains(resource, FileChangeType.UPDATED)) { - done(); - } - }); - await testObject.writeFile(resource, VSBuffer.fromString('{a:1}')); - }); - - test('watch container - event is triggerred when file under container is updated externally ', async (done) => { - const container = joinPath(userDataResource, 'testContainer'); - const resource = joinPath(userDataResource, 'testContainer/settings.json'); - await testObject.writeFile(resource, VSBuffer.fromString('{}')); - disposables.add(testObject.watch(container)); - testObject.onFileChanges(e => { - if (e.contains(resource, FileChangeType.UPDATED)) { - done(); - } - }); - await pfs.writeFile(path.join(userDataPath, 'testContainer', 'settings.json'), '{a:1}'); - }); - - test('watch container - event is triggerred when file under container is deleted', async (done) => { - const container = joinPath(userDataResource, 'testContainer'); - const resource = joinPath(userDataResource, 'testContainer/settings.json'); - await testObject.writeFile(resource, VSBuffer.fromString('{}')); - disposables.add(testObject.watch(container)); - testObject.onFileChanges(e => { - if (e.contains(resource, FileChangeType.DELETED)) { - done(); - } - }); - await testObject.del(resource); - }); - - test('watch container - event is triggerred when file under container is deleted externally ', async (done) => { - const container = joinPath(userDataResource, 'testContainer'); - const resource = joinPath(userDataResource, 'testContainer/settings.json'); - await testObject.writeFile(resource, VSBuffer.fromString('{}')); - disposables.add(testObject.watch(container)); - testObject.onFileChanges(e => { - if (e.contains(resource, FileChangeType.DELETED)) { - done(); - } - }); - await pfs.unlink(path.join(userDataPath, 'testContainer', 'settings.json')); - }); - }); -} \ No newline at end of file diff --git a/src/vs/workbench/workbench.web.api.ts b/src/vs/workbench/workbench.web.api.ts index a0615457e0a..e0b3b1ed9ad 100644 --- a/src/vs/workbench/workbench.web.api.ts +++ b/src/vs/workbench/workbench.web.api.ts @@ -6,7 +6,7 @@ import 'vs/workbench/workbench.web.main'; import { main } from 'vs/workbench/browser/web.main'; import { UriComponents } from 'vs/base/common/uri'; -import { IUserDataProvider } from 'vs/workbench/services/userData/common/userData'; +import { IFileSystemProviderWithFileReadWriteCapability, IFileSystemProviderWithOpenReadWriteCloseCapability } from 'vs/platform/files/common/files'; export interface IWorkbenchConstructionOptions { @@ -36,7 +36,7 @@ export interface IWorkbenchConstructionOptions { * Experimental: The userDataProvider is used to handle user specific application * state like settings, keybindings, UI state (e.g. opened editors) and snippets. */ - userDataProvider?: IUserDataProvider; + userDataProvider?: IFileSystemProviderWithFileReadWriteCapability | IFileSystemProviderWithOpenReadWriteCloseCapability; } /** From 119f19e791f7ab3cb3c054810712abac6be9fc60 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 4 Jul 2019 18:08:45 +0200 Subject: [PATCH 1105/1449] debt - remove jsFlags() from node cached data --- src/main.js | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/main.js b/src/main.js index 6d499413c7d..c1d198ca5ff 100644 --- a/src/main.js +++ b/src/main.js @@ -51,9 +51,11 @@ userDefinedLocale.then(locale => { } }); -// Configure command line switches +// Cached data const nodeCachedDataDir = getNodeCachedDir(); -configureCommandlineSwitches(args, nodeCachedDataDir); + +// Configure command line switches +configureCommandlineSwitches(args); // Load our code once ready app.once('ready', function () { @@ -134,15 +136,14 @@ function onReady() { * @typedef {import('minimist').ParsedArgs} ParsedArgs * * @param {ParsedArgs} cliArgs - * @param {{ jsFlags: () => string }} nodeCachedDataDir */ -function configureCommandlineSwitches(cliArgs, nodeCachedDataDir) { +function configureCommandlineSwitches(cliArgs) { // Force pre-Chrome-60 color profile handling (for https://github.com/Microsoft/vscode/issues/51791) app.commandLine.appendSwitch('disable-color-correct-rendering'); // Support JS Flags - const jsFlags = resolveJSFlags(cliArgs, nodeCachedDataDir.jsFlags()); + const jsFlags = getJSFlags(cliArgs); if (jsFlags) { app.commandLine.appendSwitch('--js-flags', jsFlags); } @@ -155,10 +156,10 @@ function configureCommandlineSwitches(cliArgs, nodeCachedDataDir) { /** * @param {ParsedArgs} cliArgs - * @param {string[]} jsFlags * @returns {string} */ -function resolveJSFlags(cliArgs, ...jsFlags) { +function getJSFlags(cliArgs) { + const jsFlags = []; // Add any existing JS flags we already got from the command line if (cliArgs['js-flags']) { @@ -253,7 +254,7 @@ function registerListeners() { } /** - * @returns {{ jsFlags: () => string; ensureExists: () => Promise, _compute: () => string; }} + * @returns {{ ensureExists: () => Promise }} */ function getNodeCachedDir() { return new class { @@ -262,11 +263,6 @@ function getNodeCachedDir() { this.value = this._compute(); } - jsFlags() { - // return this.value ? '--nolazy' : undefined; - return undefined; - } - ensureExists() { return bootstrap.mkdirp(this.value).then(() => this.value, () => { /*ignore*/ }); } From 8627d1e311d1cc1c8fcd1df5688c145a8bf3a6c9 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 18:34:01 +0200 Subject: [PATCH 1106/1449] fix darwin server missing node --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1ac5b902f3e..25174618bcb 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "6d9eb305cab814b6dbc4cd2b4b8cda17dae5fc09", + "distro": "b6901c42f09ceda6f6a60d85ba378cea67601542", "author": { "name": "Microsoft Corporation" }, From 3900d3c2a796788ac755de9aee33ee2f10a609ae Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Thu, 4 Jul 2019 11:16:11 -0700 Subject: [PATCH 1107/1449] Fix search cancel/refresh actions, simplify search ui state Fix #76151 --- .../contrib/search/browser/searchActions.ts | 8 ++-- .../contrib/search/browser/searchView.ts | 48 ++++++++++--------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/vs/workbench/contrib/search/browser/searchActions.ts b/src/vs/workbench/contrib/search/browser/searchActions.ts index 0f1f25e7601..68dc2624f5a 100644 --- a/src/vs/workbench/contrib/search/browser/searchActions.ts +++ b/src/vs/workbench/contrib/search/browser/searchActions.ts @@ -259,18 +259,16 @@ export class RefreshAction extends Action { static readonly ID: string = 'search.action.refreshSearchResults'; static LABEL: string = nls.localize('RefreshAction.label', "Refresh"); - private searchView: SearchView | undefined; - constructor(id: string, label: string, @IViewletService private readonly viewletService: IViewletService, @IPanelService private readonly panelService: IPanelService ) { super(id, label, 'search-action refresh'); - this.searchView = getSearchView(this.viewletService, this.panelService); } get enabled(): boolean { - return !!this.searchView && this.searchView.isSearchSubmitted(); + const searchView = getSearchView(this.viewletService, this.panelService); + return !!searchView && searchView.hasSearchResults(); } update(): void { @@ -386,7 +384,7 @@ export class CancelSearchAction extends Action { update(): void { const searchView = getSearchView(this.viewletService, this.panelService); - this.enabled = !!searchView && searchView.isSearching(); + this.enabled = !!searchView && searchView.isSlowSearch(); } run(): Promise { diff --git a/src/vs/workbench/contrib/search/browser/searchView.ts b/src/vs/workbench/contrib/search/browser/searchView.ts index 77335ea480e..268bffe415e 100644 --- a/src/vs/workbench/contrib/search/browser/searchView.ts +++ b/src/vs/workbench/contrib/search/browser/searchView.ts @@ -64,6 +64,12 @@ import { IStorageService, StorageScope } from 'vs/platform/storage/common/storag const $ = dom.$; +enum SearchUIState { + Idle, + Searching, + SlowSearch +} + export class SearchView extends ViewletPanel { private static readonly MAX_TEXT_RESULTS = 10000; @@ -92,8 +98,7 @@ export class SearchView extends ViewletPanel { private matchFocused: IContextKey; private hasSearchResultsKey: IContextKey; - private searchSubmitted: boolean; - private searching: boolean; + private state: SearchUIState; private actions: Array = []; private cancelAction: CancelSearchAction; @@ -335,9 +340,11 @@ export class SearchView extends ViewletPanel { protected updateActions(): void { for (const action of this.actions) { action.update(); - this.refreshAction.update(); - this.cancelAction.update(); } + + this.refreshAction.update(); + this.cancelAction.update(); + super.updateActions(); } @@ -907,12 +914,8 @@ export class SearchView extends ViewletPanel { return this.tree; } - isSearchSubmitted(): boolean { - return this.searchSubmitted; - } - - isSearching(): boolean { - return this.searching; + isSlowSearch(): boolean { + return this.state === SearchUIState.SlowSearch; } allSearchFieldsClear(): boolean { @@ -1256,16 +1259,17 @@ export class SearchView extends ViewletPanel { }); this.searchWidget.searchInput.clearMessage(); - this.searching = true; - setTimeout(() => { - if (this.searching) { - this.updateActions(); - } - }, 2000); + this.state = SearchUIState.Searching; this.showEmptyStage(); + const slowTimer = setTimeout(() => { + this.state = SearchUIState.SlowSearch; + this.updateActions(); + }, 2000); + const onComplete = (completed?: ISearchComplete) => { - this.searching = false; + clearTimeout(slowTimer); + this.state = SearchUIState.Idle; // Complete up to 100% as needed progressComplete(); @@ -1283,7 +1287,6 @@ export class SearchView extends ViewletPanel { this.viewModel.replaceString = this.searchWidget.getReplaceValue(); - this.searchSubmitted = true; this.updateActions(); const hasResults = !this.viewModel.searchResult.isEmpty(); @@ -1358,10 +1361,11 @@ export class SearchView extends ViewletPanel { }; const onError = (e: any) => { + clearTimeout(slowTimer); + this.state = SearchUIState.Idle; if (errors.isPromiseCanceledError(e)) { return onComplete(undefined); } else { - this.searching = false; this.updateActions(); progressComplete(); this.searchWidget.searchInput.showMessage({ content: e.message, type: MessageType.ERROR }); @@ -1381,7 +1385,7 @@ export class SearchView extends ViewletPanel { // Handle UI updates in an interval to show frequent progress and results const uiRefreshHandle: any = setInterval(() => { - if (!this.searching) { + if (this.state === SearchUIState.Idle) { window.clearInterval(uiRefreshHandle); return; } @@ -1515,9 +1519,7 @@ export class SearchView extends ViewletPanel { } private showEmptyStage(): void { - // disable 'result'-actions - this.searchSubmitted = false; this.updateActions(); // clean up ui @@ -1617,7 +1619,7 @@ export class SearchView extends ViewletPanel { getActions(): IAction[] { return [ - this.searching ? + this.state === SearchUIState.SlowSearch ? this.cancelAction : this.refreshAction, ...this.actions From e063b7a3ca5db9c6850f922066b7a6e483ba693c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 22:29:27 +0200 Subject: [PATCH 1108/1449] collect distro dependencies in build --- build/gulpfile.vscode.js | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 1b3e4aa84bb..2475b3b6c45 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -104,6 +104,7 @@ const optimizeVSCodeTask = task.define('optimize-vscode', task.series( bundleInfo: undefined }) )); +gulp.task(optimizeVSCodeTask); const sourceMappingURLBase = `https://ticino.blob.core.windows.net/sourcemaps/${commit}`; const minifyVSCodeTask = task.define('minify-vscode', task.series( @@ -308,13 +309,22 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op const telemetry = gulp.src('.build/telemetry/**', { base: '.build/telemetry', dot: true }); - const depsSrc = [ - ..._.flatten(productionDependencies.map(d => path.relative(root, d.path)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`])), - // @ts-ignore JSON checking: dependencies is optional - ..._.flatten(Object.keys(product.dependencies || {}).map(d => [`node_modules/${d}/**`, `!node_modules/${d}/**/{test,tests}/**`])) - ]; + const dependenciesSrc = _.flatten(productionDependencies.map(d => path.relative(root, d.path)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`])); - const deps = gulp.src(depsSrc, { base: '.', dot: true }) + // Collect distro dependencies, if any + if (quality) { + const qualityPackagePath = path.join(root, 'quality', quality, 'package.json'); + + if (fs.existsSync(qualityPackagePath)) { + const pkg = JSON.parse(fs.readFileSync(qualityPackagePath, 'utf8')); + + // @ts-ignore JSON checking: dependencies is optional + const distroDependencies = _.flatten(Object.keys(pkg.dependencies || {}).map(d => [`node_modules/${d}/**`, `!node_modules/${d}/**/{test,tests}/**`])); + dependenciesSrc.push(...distroDependencies); + } + } + + const deps = gulp.src(dependenciesSrc, { base: '.', dot: true }) .pipe(filter(['**', '!**/package-lock.json'])) .pipe(util.cleanNodeModules(path.join(__dirname, '.nativeignore'))) .pipe(createAsar(path.join(process.cwd(), 'node_modules'), ['**/*.node', '**/vscode-ripgrep/bin/*', '**/node-pty/build/Release/*'], 'app/node_modules.asar')); From 3239e7756d3fa31e172cabac504d065a4c3fdcf7 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 22:30:02 +0200 Subject: [PATCH 1109/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 25174618bcb..e96f361e3b2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "b6901c42f09ceda6f6a60d85ba378cea67601542", + "distro": "f0fdb332138d95f3090b97c6219e5558dedba17e", "author": { "name": "Microsoft Corporation" }, From 28988230cd15af27b2da8fa895315eacb1243e79 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 Jul 2019 23:17:39 +0200 Subject: [PATCH 1110/1449] build --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e96f361e3b2..7dfb5c5056e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "f0fdb332138d95f3090b97c6219e5558dedba17e", + "distro": "65898cd4327756aaf3f5e65f02d0e1edee2db1a9", "author": { "name": "Microsoft Corporation" }, From a67d4ae113cf29e7440942103a0a4d3d2b08b5e3 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 5 Jul 2019 08:44:51 +0200 Subject: [PATCH 1111/1449] fix #76620 --- .../base/test/node/stream/fixtures/empty.txt | 0 .../base/test/node/stream/fixtures/file.css | 40 ------------------- src/vs/base/test/node/stream/stream.test.ts | 27 ------------- .../services/backup/node/backupFileService.ts | 14 ++++++- 4 files changed, 12 insertions(+), 69 deletions(-) delete mode 100644 src/vs/base/test/node/stream/fixtures/empty.txt delete mode 100644 src/vs/base/test/node/stream/fixtures/file.css delete mode 100644 src/vs/base/test/node/stream/stream.test.ts diff --git a/src/vs/base/test/node/stream/fixtures/empty.txt b/src/vs/base/test/node/stream/fixtures/empty.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/vs/base/test/node/stream/fixtures/file.css b/src/vs/base/test/node/stream/fixtures/file.css deleted file mode 100644 index f7b51e752bb..00000000000 --- a/src/vs/base/test/node/stream/fixtures/file.css +++ /dev/null @@ -1,40 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -/*---------------------------------------------------------- -The base color for this template is #5c87b2. If you'd like -to use a different color start by replacing all instances of -#5c87b2 with your new color. -----------------------------------------------------------*/ -body -{ - background-color: #5c87b2; - font-size: .75em; - font-family: Segoe UI, Verdana, Helvetica, Sans-Serif; - margin: 8px; - padding: 0; - color: #696969; -} - -h1, h2, h3, h4, h5, h6 -{ - color: #000; - font-size: 40px; - margin: 0px; -} - -textarea -{ - font-family: Consolas -} - -#results -{ - margin-top: 2em; - margin-left: 2em; - color: black; - font-size: medium; -} - diff --git a/src/vs/base/test/node/stream/stream.test.ts b/src/vs/base/test/node/stream/stream.test.ts deleted file mode 100644 index cf30ca2c7d5..00000000000 --- a/src/vs/base/test/node/stream/stream.test.ts +++ /dev/null @@ -1,27 +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 stream from 'vs/base/node/stream'; -import { getPathFromAmdModule } from 'vs/base/common/amd'; - -suite('Stream', () => { - test('readToMatchingString - ANSI', async () => { - const file = getPathFromAmdModule(require, './fixtures/file.css'); - - const result = await stream.readToMatchingString(file, '\n', 10, 100); - - // \r may be present on Windows - assert.equal(result!.replace('\r', ''), '/*---------------------------------------------------------------------------------------------'); - }); - - test('readToMatchingString - empty', async () => { - const file = getPathFromAmdModule(require, './fixtures/empty.txt'); - - const result = await stream.readToMatchingString(file, '\n', 10, 100); - assert.equal(result, null); - }); -}); diff --git a/src/vs/workbench/services/backup/node/backupFileService.ts b/src/vs/workbench/services/backup/node/backupFileService.ts index 624ec71cad0..e8197ba4343 100644 --- a/src/vs/workbench/services/backup/node/backupFileService.ts +++ b/src/vs/workbench/services/backup/node/backupFileService.ts @@ -12,7 +12,6 @@ import { equals, deepClone } from 'vs/base/common/objects'; import { ResourceQueue } from 'vs/base/common/async'; import { IBackupFileService, IResolvedBackup } from 'vs/workbench/services/backup/common/backup'; import { IFileService } from 'vs/platform/files/common/files'; -import { readToMatchingString } from 'vs/base/node/stream'; import { ITextSnapshot } from 'vs/editor/common/model'; import { createTextBufferFactoryFromStream, createTextBufferFactoryFromSnapshot } from 'vs/editor/common/model/textModel'; import { keys, ResourceMap } from 'vs/base/common/map'; @@ -278,7 +277,7 @@ class BackupFileServiceImpl implements IBackupFileService { const model = await this.ready; const backups = await Promise.all(model.get().map(async fileBackup => { - const backupPreamble = await readToMatchingString(fileBackup.fsPath, BackupFileServiceImpl.PREAMBLE_END_MARKER, BackupFileServiceImpl.PREAMBLE_MAX_LENGTH / 5, BackupFileServiceImpl.PREAMBLE_MAX_LENGTH); + const backupPreamble = await this.readToMatchingString(fileBackup, BackupFileServiceImpl.PREAMBLE_END_MARKER, BackupFileServiceImpl.PREAMBLE_MAX_LENGTH); if (!backupPreamble) { return undefined; } @@ -298,6 +297,17 @@ class BackupFileServiceImpl implements IBackupFileService { return coalesce(backups); } + private async readToMatchingString(file: URI, matchingString: string, maximumBytesToRead: number): Promise { + const contents = (await this.fileService.readFile(file, { length: maximumBytesToRead })).value.toString(); + + const newLineIndex = contents.indexOf(matchingString); + if (newLineIndex >= 0) { + return contents.substr(0, newLineIndex); + } + + throw new Error(`Could not find ${matchingString} in first ${maximumBytesToRead} bytes of ${file}`); + } + async resolveBackupContent(backup: URI): Promise> { // Metadata extraction From 23dfbabf3b9f3d29df6f893d4f925a361a76773e Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 5 Jul 2019 09:00:49 +0200 Subject: [PATCH 1112/1449] web - lift backupfileservice to common --- .../workbench/browser/web.simpleservices.ts | 66 ------------------- .../{node => common}/backupFileService.ts | 9 ++- .../test/node/backupFileService.test.ts | 2 +- .../workspaceEditingService.ts | 2 +- src/vs/workbench/workbench.main.ts | 2 +- src/vs/workbench/workbench.web.main.ts | 4 +- 6 files changed, 12 insertions(+), 73 deletions(-) rename src/vs/workbench/services/backup/{node => common}/backupFileService.ts (98%) diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index fd4463dfe2a..86c6bbf52d0 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -5,10 +5,6 @@ import { URI } from 'vs/base/common/uri'; import * as browser from 'vs/base/browser/browser'; -import { IBackupFileService, IResolvedBackup } from 'vs/workbench/services/backup/common/backup'; -import { ITextSnapshot } from 'vs/editor/common/model'; -import { createTextBufferFactoryFromSnapshot } from 'vs/editor/common/model/textModel'; -import { keys } from 'vs/base/common/map'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { Emitter, Event } from 'vs/base/common/event'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; @@ -55,68 +51,6 @@ import { ClassifiedEvent, StrictPropertyCheck, GDPRClassification } from 'vs/pla import { IProcessEnvironment } from 'vs/base/common/platform'; import { toStoreData, restoreRecentlyOpened } from 'vs/platform/history/common/historyStorage'; -//#region Backup File - -export class SimpleBackupFileService implements IBackupFileService { - - _serviceBrand: any; - - private backups: Map = new Map(); - - hasBackups(): Promise { - return Promise.resolve(this.backups.size > 0); - } - - loadBackupResource(resource: URI): Promise { - const backupResource = this.toBackupResource(resource); - if (this.backups.has(backupResource.toString())) { - return Promise.resolve(backupResource); - } - - return Promise.resolve(undefined); - } - - backupResource(resource: URI, content: ITextSnapshot, versionId?: number, meta?: T): Promise { - const backupResource = this.toBackupResource(resource); - this.backups.set(backupResource.toString(), content); - - return Promise.resolve(); - } - - resolveBackupContent(backupResource: URI): Promise> { - const snapshot = this.backups.get(backupResource.toString()); - if (snapshot) { - return Promise.resolve({ value: createTextBufferFactoryFromSnapshot(snapshot) }); - } - - return Promise.reject('Unexpected backup resource to resolve'); - } - - getWorkspaceFileBackups(): Promise { - return Promise.resolve(keys(this.backups).map(key => URI.parse(key))); - } - - discardResourceBackup(resource: URI): Promise { - this.backups.delete(this.toBackupResource(resource).toString()); - - return Promise.resolve(); - } - - discardAllWorkspaceBackups(): Promise { - this.backups.clear(); - - return Promise.resolve(); - } - - toBackupResource(resource: URI): URI { - return resource; - } -} - -registerSingleton(IBackupFileService, SimpleBackupFileService, true); - -//#endregion - //#region Clipboard export class SimpleClipboardService implements IClipboardService { diff --git a/src/vs/workbench/services/backup/node/backupFileService.ts b/src/vs/workbench/services/backup/common/backupFileService.ts similarity index 98% rename from src/vs/workbench/services/backup/node/backupFileService.ts rename to src/vs/workbench/services/backup/common/backupFileService.ts index e8197ba4343..2a743a97c7a 100644 --- a/src/vs/workbench/services/backup/node/backupFileService.ts +++ b/src/vs/workbench/services/backup/common/backupFileService.ts @@ -5,8 +5,8 @@ import { join } from 'vs/base/common/path'; import { joinPath } from 'vs/base/common/resources'; -import { createHash } from 'crypto'; import { URI } from 'vs/base/common/uri'; +import { hash } from 'vs/base/common/hash'; import { coalesce } from 'vs/base/common/arrays'; import { equals, deepClone } from 'vs/base/common/objects'; import { ResourceQueue } from 'vs/base/common/async'; @@ -421,7 +421,12 @@ export class InMemoryBackupFileService implements IBackupFileService { */ export function hashPath(resource: URI): string { const str = resource.scheme === Schemas.file || resource.scheme === Schemas.untitled ? resource.fsPath : resource.toString(); - return createHash('md5').update(str).digest('hex'); + if (typeof require !== 'undefined') { + const _crypto: typeof crypto = require.__$__nodeRequire('crypto'); + return _crypto['createHash']('md5').update(str).digest('hex'); + } + + return hash(str).toString(16); } registerSingleton(IBackupFileService, BackupFileService); \ No newline at end of file diff --git a/src/vs/workbench/services/backup/test/node/backupFileService.test.ts b/src/vs/workbench/services/backup/test/node/backupFileService.test.ts index 52a5bc95d1c..9e71343b81a 100644 --- a/src/vs/workbench/services/backup/test/node/backupFileService.test.ts +++ b/src/vs/workbench/services/backup/test/node/backupFileService.test.ts @@ -11,7 +11,7 @@ import * as fs from 'fs'; import * as path from 'vs/base/common/path'; import * as pfs from 'vs/base/node/pfs'; import { URI } from 'vs/base/common/uri'; -import { BackupFileService, BackupFilesModel, hashPath } from 'vs/workbench/services/backup/node/backupFileService'; +import { BackupFileService, BackupFilesModel, hashPath } from 'vs/workbench/services/backup/common/backupFileService'; import { TextModel, createTextBufferFactory } from 'vs/editor/common/model/textModel'; import { getRandomTestPath } from 'vs/base/test/node/testUtils'; import { DefaultEndOfLine } from 'vs/editor/common/model'; diff --git a/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts b/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts index 4f2433419a1..8d8bacc2b13 100644 --- a/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts +++ b/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts @@ -17,7 +17,7 @@ import { ConfigurationScope, IConfigurationRegistry, Extensions as Configuration import { Registry } from 'vs/platform/registry/common/platform'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { IBackupFileService } from 'vs/workbench/services/backup/common/backup'; -import { BackupFileService } from 'vs/workbench/services/backup/node/backupFileService'; +import { BackupFileService } from 'vs/workbench/services/backup/common/backupFileService'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { distinct } from 'vs/base/common/arrays'; import { isLinux, isWindows, isMacintosh } from 'vs/base/common/platform'; diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index b9c655b8f03..b8b7485cb71 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -112,7 +112,7 @@ import 'vs/workbench/services/textmodelResolver/common/textModelResolverService' import 'vs/workbench/services/textfile/node/textFileService'; import 'vs/workbench/services/dialogs/browser/fileDialogService'; import 'vs/workbench/services/dialogs/electron-browser/dialogService'; -import 'vs/workbench/services/backup/node/backupFileService'; +import 'vs/workbench/services/backup/common/backupFileService'; import 'vs/workbench/services/editor/browser/editorService'; import 'vs/workbench/services/history/browser/history'; import 'vs/workbench/services/activity/browser/activityService'; diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index 93d826e1a9d..a05b80bf985 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -111,7 +111,7 @@ import 'vs/workbench/services/textmodelResolver/common/textModelResolverService' import 'vs/workbench/services/textfile/browser/textFileService'; import 'vs/workbench/services/dialogs/browser/fileDialogService'; // import 'vs/workbench/services/dialogs/electron-browser/dialogService'; -// import 'vs/workbench/services/backup/node/backupFileService'; +import 'vs/workbench/services/backup/common/backupFileService'; import 'vs/workbench/services/editor/browser/editorService'; import 'vs/workbench/services/history/browser/history'; import 'vs/workbench/services/activity/browser/activityService'; @@ -222,7 +222,7 @@ import 'vs/workbench/contrib/files/browser/files.contribution'; import 'vs/workbench/contrib/backup/common/backup.contribution'; // Stats -// import 'vs/workbench/contrib/stats/node/stats.contribution'; +// import 'vs/workbench/contrib/stats/electron-browser/stats.contribution'; // Rapid Render Splash // import 'vs/workbench/contrib/splash/electron-browser/partsSplash.contribution'; From 6b721dbc8b019bd00471bb7f3e810d4d594a7571 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 5 Jul 2019 09:05:08 +0200 Subject: [PATCH 1113/1449] fix web --- src/vs/workbench/services/backup/common/backupFileService.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/services/backup/common/backupFileService.ts b/src/vs/workbench/services/backup/common/backupFileService.ts index 2a743a97c7a..aa94226ea14 100644 --- a/src/vs/workbench/services/backup/common/backupFileService.ts +++ b/src/vs/workbench/services/backup/common/backupFileService.ts @@ -21,6 +21,7 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { VSBuffer } from 'vs/base/common/buffer'; import { TextSnapshotReadable } from 'vs/workbench/services/textfile/common/textfiles'; import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; +import { isNative } from 'vs/base/common/platform'; export interface IBackupFilesModel { resolve(backupRoot: URI): Promise; @@ -421,7 +422,7 @@ export class InMemoryBackupFileService implements IBackupFileService { */ export function hashPath(resource: URI): string { const str = resource.scheme === Schemas.file || resource.scheme === Schemas.untitled ? resource.fsPath : resource.toString(); - if (typeof require !== 'undefined') { + if (isNative) { const _crypto: typeof crypto = require.__$__nodeRequire('crypto'); return _crypto['createHash']('md5').update(str).digest('hex'); } From 339b142a06376c393bc418a8ff6383cf77c08e1e Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 5 Jul 2019 09:25:35 +0200 Subject: [PATCH 1114/1449] fix broken remote agent --- build/.cachesalt | 1 + .../darwin/product-build-darwin.yml | 12 ++++++++---- .../linux/product-build-linux-multiarch.yml | 6 ++---- .../azure-pipelines/linux/product-build-linux.yml | 12 ++++++++---- build/azure-pipelines/product-compile.yml | 14 +++++++++----- .../azure-pipelines/win32/product-build-win32.yml | 13 +++++++++---- 6 files changed, 37 insertions(+), 21 deletions(-) create mode 100644 build/.cachesalt diff --git a/build/.cachesalt b/build/.cachesalt new file mode 100644 index 00000000000..56a6051ca2b --- /dev/null +++ b/build/.cachesalt @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index b43d9248c9e..2fcc73f632d 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -56,21 +56,19 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: '.yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' - script: | set -e CHILD_CONCURRENCY=1 yarn --frozen-lockfile - node build/azure-pipelines/common/installDistroDependencies.js - node build/azure-pipelines/common/installDistroDependencies.js remote displayName: Install dependencies condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: '.yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) @@ -81,6 +79,12 @@ steps: displayName: Run postinstall scripts condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) +- script: | + set -e + node build/azure-pipelines/common/installDistroDependencies.js + node build/azure-pipelines/common/installDistroDependencies.js remote + displayName: Install distro dependencies + - script: | set -e yarn gulp mixin diff --git a/build/azure-pipelines/linux/product-build-linux-multiarch.yml b/build/azure-pipelines/linux/product-build-linux-multiarch.yml index e72e63d498f..fb255944c04 100644 --- a/build/azure-pipelines/linux/product-build-linux-multiarch.yml +++ b/build/azure-pipelines/linux/product-build-linux-multiarch.yml @@ -65,21 +65,19 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: '.yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' - script: | set -e CHILD_CONCURRENCY=1 yarn --frozen-lockfile - node build/azure-pipelines/common/installDistroDependencies.js - node build/azure-pipelines/common/installDistroDependencies.js remote displayName: Install dependencies condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: '.yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 8e59f250bb8..369c8abc7d0 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -57,21 +57,19 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: '.yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' - script: | set -e CHILD_CONCURRENCY=1 yarn --frozen-lockfile - node build/azure-pipelines/common/installDistroDependencies.js - node build/azure-pipelines/common/installDistroDependencies.js remote displayName: Install dependencies condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: '.yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) @@ -82,6 +80,12 @@ steps: displayName: Run postinstall scripts condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) +- script: | + set -e + node build/azure-pipelines/common/installDistroDependencies.js + node build/azure-pipelines/common/installDistroDependencies.js remote + displayName: Install distro dependencies + - script: | set -e yarn gulp mixin diff --git a/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml index ea16b67f41c..d379915f3ae 100644 --- a/build/azure-pipelines/product-compile.yml +++ b/build/azure-pipelines/product-compile.yml @@ -56,22 +56,20 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: '.yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) - script: | set -e - yarn --frozen-lockfile - node build/azure-pipelines/common/installDistroDependencies.js - node build/azure-pipelines/common/installDistroDependencies.js remote + CHILD_CONCURRENCY=1 yarn --frozen-lockfile displayName: Install dependencies condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), ne(variables['CacheRestored'], 'true')) - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: '.yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), ne(variables['CacheRestored'], 'true')) @@ -82,6 +80,12 @@ steps: displayName: Run postinstall scripts condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), eq(variables['CacheRestored'], 'true')) +- script: | + set -e + node build/azure-pipelines/common/installDistroDependencies.js + node build/azure-pipelines/common/installDistroDependencies.js remote + displayName: Install distro dependencies + - script: | set -e yarn gulp hygiene diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 98f3465d84c..0aba8e8c3ce 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -59,7 +59,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: '.build/arch, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: 'build/.cachesalt, .build/arch, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' @@ -69,14 +69,12 @@ steps: $env:npm_config_arch="$(VSCODE_ARCH)" $env:CHILD_CONCURRENCY="1" exec { yarn --frozen-lockfile } - exec { node build/azure-pipelines/common/installDistroDependencies.js } - exec { node build/azure-pipelines/common/installDistroDependencies.js remote } displayName: Install dependencies condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: '.build/arch, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: 'build/.cachesalt, .build/arch, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) @@ -88,6 +86,13 @@ steps: displayName: Run postinstall scripts condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) +- powershell: | + . build/azure-pipelines/win32/exec.ps1 + $ErrorActionPreference = "Stop" + exec { node build/azure-pipelines/common/installDistroDependencies.js } + exec { node build/azure-pipelines/common/installDistroDependencies.js remote } + displayName: Install distro dependencies + - powershell: | . build/azure-pipelines/win32/exec.ps1 $ErrorActionPreference = "Stop" From 85415d00936e5dc637d75a041253db94a0538d40 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 5 Jul 2019 09:54:45 +0200 Subject: [PATCH 1115/1449] fix comment --- .../workbench/services/keybinding/browser/keybindingService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/services/keybinding/browser/keybindingService.ts b/src/vs/workbench/services/keybinding/browser/keybindingService.ts index 1a165e03627..ed247dae97a 100644 --- a/src/vs/workbench/services/keybinding/browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/browser/keybindingService.ts @@ -532,7 +532,7 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { mightProducePrintableCharacter(event: IKeyboardEvent): boolean { if (event.ctrlKey || event.metaKey || event.altKey) { - // ignore ctrl/cmd-combination but not shift/alt-combinatios + // ignore ctrl/cmd/alt-combination but not shift-combinatios return false; } const code = ScanCodeUtils.toEnum(event.code); From 34e0ed575230b5c8168289995d59edf274539631 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 5 Jul 2019 10:21:43 +0200 Subject: [PATCH 1116/1449] fix compile step --- build/azure-pipelines/product-compile.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml index d379915f3ae..a894140f52d 100644 --- a/build/azure-pipelines/product-compile.yml +++ b/build/azure-pipelines/product-compile.yml @@ -85,6 +85,7 @@ steps: node build/azure-pipelines/common/installDistroDependencies.js node build/azure-pipelines/common/installDistroDependencies.js remote displayName: Install distro dependencies + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) - script: | set -e From 2d4617876bdc311be516156c7c24d592095abedb Mon Sep 17 00:00:00 2001 From: Hung-Wei Hung Date: Fri, 5 Jul 2019 16:37:50 +0800 Subject: [PATCH 1117/1449] Implmented resolveTask for jake (#76616) Fixes #76519 --- extensions/jake/src/main.ts | 97 ++++++++++++++++++++++++++----------- 1 file changed, 69 insertions(+), 28 deletions(-) diff --git a/extensions/jake/src/main.ts b/extensions/jake/src/main.ts index c1fcc6b1d36..5752db7dd20 100644 --- a/extensions/jake/src/main.ts +++ b/extensions/jake/src/main.ts @@ -66,6 +66,19 @@ function showError() { }); } +async function findJakeCommand(rootPath: string): Promise { + let jakeCommand: string; + let platform = process.platform; + if (platform === 'win32' && await exists(path.join(rootPath!, 'node_modules', '.bin', 'jake.cmd'))) { + jakeCommand = path.join('.', 'node_modules', '.bin', 'jake.cmd'); + } else if ((platform === 'linux' || platform === 'darwin') && await exists(path.join(rootPath!, 'node_modules', '.bin', 'jake'))) { + jakeCommand = path.join('.', 'node_modules', '.bin', 'jake'); + } else { + jakeCommand = 'jake'; + } + return jakeCommand; +} + interface JakeTaskDefinition extends vscode.TaskDefinition { task: string; file?: string; @@ -76,7 +89,9 @@ class FolderDetector { private fileWatcher: vscode.FileSystemWatcher | undefined; private promise: Thenable | undefined; - constructor(private _workspaceFolder: vscode.WorkspaceFolder) { + constructor( + private _workspaceFolder: vscode.WorkspaceFolder, + private _jakeCommand: Promise) { } public get workspaceFolder(): vscode.WorkspaceFolder { @@ -96,10 +111,28 @@ class FolderDetector { } public async getTasks(): Promise { - if (!this.promise) { - this.promise = this.computeTasks(); + if (this.isEnabled()) { + if (!this.promise) { + this.promise = this.computeTasks(); + } + return this.promise; + } else { + return []; } - return this.promise; + } + + public async getTask(_task: vscode.Task): Promise { + const jakeTask = (_task.definition).task; + if (jakeTask) { + let kind: JakeTaskDefinition = { + type: 'jake', + task: jakeTask + }; + let options: vscode.ShellExecutionOptions = { cwd: this.workspaceFolder.uri.fsPath }; + let task = new vscode.Task(kind, this.workspaceFolder, jakeTask, 'jake', new vscode.ShellExecution(await this._jakeCommand, [jakeTask], options)); + return task; + } + return undefined; } private async computeTasks(): Promise { @@ -116,17 +149,7 @@ class FolderDetector { } } - let jakeCommand: string; - let platform = process.platform; - if (platform === 'win32' && await exists(path.join(rootPath!, 'node_modules', '.bin', 'jake.cmd'))) { - jakeCommand = path.join('.', 'node_modules', '.bin', 'jake.cmd'); - } else if ((platform === 'linux' || platform === 'darwin') && await exists(path.join(rootPath!, 'node_modules', '.bin', 'jake'))) { - jakeCommand = path.join('.', 'node_modules', '.bin', 'jake'); - } else { - jakeCommand = 'jake'; - } - - let commandLine = `${jakeCommand} --tasks`; + let commandLine = `${await this._jakeCommand} --tasks`; try { let { stdout, stderr } = await exec(commandLine, { cwd: rootPath }); if (stderr) { @@ -149,7 +172,7 @@ class FolderDetector { task: taskName }; let options: vscode.ShellExecutionOptions = { cwd: this.workspaceFolder.uri.fsPath }; - let task = new vscode.Task(kind, taskName, 'jake', new vscode.ShellExecution(`${jakeCommand} ${taskName}`, options)); + let task = new vscode.Task(kind, taskName, 'jake', new vscode.ShellExecution(`${await this._jakeCommand} ${taskName}`, options)); result.push(task); let lowerCaseLine = line.toLowerCase(); if (isBuildTask(lowerCaseLine)) { @@ -217,9 +240,9 @@ class TaskDetector { } } for (let add of added) { - let detector = new FolderDetector(add); + let detector = new FolderDetector(add, findJakeCommand(add.uri.fsPath)); + this.detectors.set(add.uri.toString(), detector); if (detector.isEnabled()) { - this.detectors.set(add.uri.toString(), detector); detector.start(); } } @@ -228,18 +251,16 @@ class TaskDetector { private updateConfiguration(): void { for (let detector of this.detectors.values()) { - if (!detector.isEnabled()) { - detector.dispose(); - this.detectors.delete(detector.workspaceFolder.uri.toString()); - } + detector.dispose(); + this.detectors.delete(detector.workspaceFolder.uri.toString()); } let folders = vscode.workspace.workspaceFolders; if (folders) { for (let folder of folders) { if (!this.detectors.has(folder.uri.toString())) { - let detector = new FolderDetector(folder); + let detector = new FolderDetector(folder, findJakeCommand(folder.uri.fsPath)); + this.detectors.set(folder.uri.toString(), detector); if (detector.isEnabled()) { - this.detectors.set(folder.uri.toString(), detector); detector.start(); } } @@ -250,12 +271,13 @@ class TaskDetector { private updateProvider(): void { if (!this.taskProvider && this.detectors.size > 0) { + const thisCapture = this; this.taskProvider = vscode.workspace.registerTaskProvider('gulp', { - provideTasks: () => { - return this.getTasks(); + provideTasks(): Promise { + return thisCapture.getTasks(); }, - resolveTask(_task: vscode.Task): vscode.Task | undefined { - return undefined; + resolveTask(_task: vscode.Task): Promise { + return thisCapture.getTask(_task); } }); } @@ -290,6 +312,25 @@ class TaskDetector { }); } } + + public async getTask(task: vscode.Task): Promise { + if (this.detectors.size === 0) { + return undefined; + } else if (this.detectors.size === 1) { + return this.detectors.values().next().value.getTask(task); + } else { + if ((task.scope === vscode.TaskScope.Workspace) || (task.scope === vscode.TaskScope.Global)) { + // Not supported, we don't have enough info to create the task. + return undefined; + } else if (task.scope) { + const detector = this.detectors.get(task.scope.uri.toString()); + if (detector) { + return detector.getTask(task); + } + } + return undefined; + } + } } let detector: TaskDetector; From e4434279937c21caa60f1cf3e24997c35cef44eb Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 5 Jul 2019 10:39:47 +0200 Subject: [PATCH 1118/1449] Update to native-keymap@2.0.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 7dfb5c5056e..df3df6ff757 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "keytar": "4.2.1", "minimist": "1.2.0", "native-is-elevated": "^0.2.1", - "native-keymap": "1.2.6", + "native-keymap": "2.0.0", "native-watchdog": "1.0.0", "node-pty": "0.9.0-beta17", "nsfw": "1.2.5", diff --git a/yarn.lock b/yarn.lock index 494e9ff51ca..ec6484d334d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5958,10 +5958,10 @@ native-is-elevated@^0.2.1: resolved "https://registry.yarnpkg.com/native-is-elevated/-/native-is-elevated-0.2.1.tgz#70a2123a8575b9f624a3ef465d98cb74ae017385" integrity sha1-cKISOoV1ufYko+9GXZjLdK4Bc4U= -native-keymap@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/native-keymap/-/native-keymap-1.2.6.tgz#93d1b4c4ae0e9136bc14538cafe02c0bbe95bebf" - integrity sha512-8hEr6wNkb7OmGPFLFk1cAsnOt2Y3F4mtBffr8uOyX0kKOjr2JVetSt9TKjk0xyJw/B/HcEgMhXmjFKzGN+9JjA== +native-keymap@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/native-keymap/-/native-keymap-2.0.0.tgz#7491ba8f9cc75bd6ada7e754dadb7716c793a3e3" + integrity sha512-KIlDZp0yKaHaGIkEVdlYN3QIaZICXwG1qh/oeBeQdM8TwAi90IAZlAD57qsNDkEvIJIzerCzb5jYYQAdHGBgYg== native-watchdog@1.0.0: version "1.0.0" From 80b87e2ed0eeff6da73887af989474039ee945ed Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 5 Jul 2019 10:30:39 +0200 Subject: [PATCH 1119/1449] split backup file service and pass hash --- .../backup/common/backupFileService.ts | 30 ++++++++----------- .../services/backup/node/backupFileService.ts | 25 ++++++++++++++++ .../test/node/backupFileService.test.ts | 3 +- src/vs/workbench/workbench.main.ts | 2 +- 4 files changed, 40 insertions(+), 20 deletions(-) create mode 100644 src/vs/workbench/services/backup/node/backupFileService.ts diff --git a/src/vs/workbench/services/backup/common/backupFileService.ts b/src/vs/workbench/services/backup/common/backupFileService.ts index aa94226ea14..313b2202914 100644 --- a/src/vs/workbench/services/backup/common/backupFileService.ts +++ b/src/vs/workbench/services/backup/common/backupFileService.ts @@ -21,7 +21,6 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { VSBuffer } from 'vs/base/common/buffer'; import { TextSnapshotReadable } from 'vs/workbench/services/textfile/common/textfiles'; import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; -import { isNative } from 'vs/base/common/platform'; export interface IBackupFilesModel { resolve(backupRoot: URI): Promise; @@ -118,12 +117,17 @@ export class BackupFileService implements IBackupFileService { ) { const backupWorkspacePath = environmentService.configuration.backupPath; if (backupWorkspacePath) { - this.impl = new BackupFileServiceImpl(backupWorkspacePath, fileService); + this.impl = new BackupFileServiceImpl(backupWorkspacePath, this.hashPath, fileService); } else { - this.impl = new InMemoryBackupFileService(); + this.impl = new InMemoryBackupFileService(this.hashPath); } } + protected hashPath(resource: URI): string { + const str = resource.scheme === Schemas.file || resource.scheme === Schemas.untitled ? resource.fsPath : resource.toString(); + return hash(str).toString(16); + } + initialize(backupWorkspacePath: string): void { if (this.impl instanceof BackupFileServiceImpl) { this.impl.initialize(backupWorkspacePath); @@ -179,6 +183,7 @@ class BackupFileServiceImpl implements IBackupFileService { constructor( backupWorkspacePath: string, + private readonly hashPath: (resource: URI) => string, @IFileService private readonly fileService: IFileService ) { this.isShuttingDown = false; @@ -357,7 +362,7 @@ class BackupFileServiceImpl implements IBackupFileService { } toBackupResource(resource: URI): URI { - return joinPath(this.backupWorkspacePath, resource.scheme, hashPath(resource)); + return joinPath(this.backupWorkspacePath, resource.scheme, this.hashPath(resource)); } } @@ -367,6 +372,8 @@ export class InMemoryBackupFileService implements IBackupFileService { private backups: Map = new Map(); + constructor(private readonly hashPath: (resource: URI) => string) { } + hasBackups(): Promise { return Promise.resolve(this.backups.size > 0); } @@ -413,21 +420,8 @@ export class InMemoryBackupFileService implements IBackupFileService { } toBackupResource(resource: URI): URI { - return URI.file(join(resource.scheme, hashPath(resource))); + return URI.file(join(resource.scheme, this.hashPath(resource))); } } -/* - * Exported only for testing - */ -export function hashPath(resource: URI): string { - const str = resource.scheme === Schemas.file || resource.scheme === Schemas.untitled ? resource.fsPath : resource.toString(); - if (isNative) { - const _crypto: typeof crypto = require.__$__nodeRequire('crypto'); - return _crypto['createHash']('md5').update(str).digest('hex'); - } - - return hash(str).toString(16); -} - registerSingleton(IBackupFileService, BackupFileService); \ No newline at end of file diff --git a/src/vs/workbench/services/backup/node/backupFileService.ts b/src/vs/workbench/services/backup/node/backupFileService.ts new file mode 100644 index 00000000000..30b5c5acf51 --- /dev/null +++ b/src/vs/workbench/services/backup/node/backupFileService.ts @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { BackupFileService as CommonBackupFileService } from 'vs/workbench/services/backup/common/backupFileService'; +import { URI } from 'vs/base/common/uri'; +import { Schemas } from 'vs/base/common/network'; +import * as crypto from 'crypto'; + +export class BackupFileService extends CommonBackupFileService { + + protected hashPath(resource: URI): string { + return hashPath(resource); + } + +} + +/* + * Exported only for testing + */ +export function hashPath(resource: URI): string { + const str = resource.scheme === Schemas.file || resource.scheme === Schemas.untitled ? resource.fsPath : resource.toString(); + return crypto.createHash('md5').update(str).digest('hex'); +} \ No newline at end of file diff --git a/src/vs/workbench/services/backup/test/node/backupFileService.test.ts b/src/vs/workbench/services/backup/test/node/backupFileService.test.ts index 9e71343b81a..542dbc92291 100644 --- a/src/vs/workbench/services/backup/test/node/backupFileService.test.ts +++ b/src/vs/workbench/services/backup/test/node/backupFileService.test.ts @@ -11,7 +11,7 @@ import * as fs from 'fs'; import * as path from 'vs/base/common/path'; import * as pfs from 'vs/base/node/pfs'; import { URI } from 'vs/base/common/uri'; -import { BackupFileService, BackupFilesModel, hashPath } from 'vs/workbench/services/backup/common/backupFileService'; +import { BackupFilesModel } from 'vs/workbench/services/backup/common/backupFileService'; import { TextModel, createTextBufferFactory } from 'vs/editor/common/model/textModel'; import { getRandomTestPath } from 'vs/base/test/node/testUtils'; import { DefaultEndOfLine } from 'vs/editor/common/model'; @@ -24,6 +24,7 @@ import { WorkbenchEnvironmentService } from 'vs/workbench/services/environment/n import { parseArgs } from 'vs/platform/environment/node/argv'; import { snapshotToString } from 'vs/workbench/services/textfile/common/textfiles'; import { IFileService } from 'vs/platform/files/common/files'; +import { hashPath, BackupFileService } from 'vs/workbench/services/backup/node/backupFileService'; const parentDir = getRandomTestPath(os.tmpdir(), 'vsctests', 'backupfileservice'); const backupHome = path.join(parentDir, 'Backups'); diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index b8b7485cb71..b9c655b8f03 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -112,7 +112,7 @@ import 'vs/workbench/services/textmodelResolver/common/textModelResolverService' import 'vs/workbench/services/textfile/node/textFileService'; import 'vs/workbench/services/dialogs/browser/fileDialogService'; import 'vs/workbench/services/dialogs/electron-browser/dialogService'; -import 'vs/workbench/services/backup/common/backupFileService'; +import 'vs/workbench/services/backup/node/backupFileService'; import 'vs/workbench/services/editor/browser/editorService'; import 'vs/workbench/services/history/browser/history'; import 'vs/workbench/services/activity/browser/activityService'; From a2b2d3171fa08066b5d96a9560408f666fae3357 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 5 Jul 2019 10:40:39 +0200 Subject: [PATCH 1120/1449] fix user data home on web --- src/vs/workbench/browser/web.main.ts | 10 ++++------ .../services/environment/browser/environmentService.ts | 4 ++-- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index 35d76e44b47..dadc532e49f 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -84,7 +84,8 @@ class CodeRendererMain extends Disposable { serviceCollection.set(ILogService, logService); // Environment - const environmentService = new BrowserWorkbenchEnvironmentService(this.configuration); + const remoteUserDataUri = this.getRemoteUserDataUri(); + const environmentService = new BrowserWorkbenchEnvironmentService(this.configuration, remoteUserDataUri); serviceCollection.set(IWorkbenchEnvironmentService, environmentService); // Product @@ -115,11 +116,8 @@ class CodeRendererMain extends Disposable { fileService.registerProvider(Schemas.vscodeRemote, remoteFileSystemProvider); - if (!userDataProvider) { - const remoteUserDataUri = this.getRemoteUserDataUri(); - if (remoteUserDataUri) { - userDataProvider = this._register(new FileUserDataProvider(remoteUserDataUri, dirname(remoteUserDataUri), remoteFileSystemProvider)); - } + if (!userDataProvider && remoteUserDataUri) { + userDataProvider = this._register(new FileUserDataProvider(remoteUserDataUri, dirname(remoteUserDataUri), remoteFileSystemProvider)); } } diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts index f6945be12a3..e1e86e4a937 100644 --- a/src/vs/workbench/services/environment/browser/environmentService.ts +++ b/src/vs/workbench/services/environment/browser/environmentService.ts @@ -63,13 +63,13 @@ export class BrowserWorkbenchEnvironmentService implements IEnvironmentService { readonly configuration: IWindowConfiguration = new BrowserWindowConfiguration(); - constructor(configuration: IWorkbenchConstructionOptions) { + constructor(configuration: IWorkbenchConstructionOptions, remoteUserDataUri: URI | null) { this.args = { _: [] }; this.appRoot = '/web/'; this.appNameLong = 'Visual Studio Code - Web'; this.configuration.remoteAuthority = configuration.remoteAuthority; - this.userRoamingDataHome = URI.file('/User').with({ scheme: Schemas.userData }); + this.userRoamingDataHome = remoteUserDataUri ? remoteUserDataUri.with({ scheme: Schemas.userData }) : URI.file('/User').with({ scheme: Schemas.userData }); this.settingsResource = joinPath(this.userRoamingDataHome, 'settings.json'); this.keybindingsResource = joinPath(this.userRoamingDataHome, 'keybindings.json'); this.keyboardLayoutResource = joinPath(this.userRoamingDataHome, 'keyboardLayout.json'); From cbc6c7ff275cc1d5eb67dbfc94e01d5a11cfb4b0 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Fri, 5 Jul 2019 10:43:53 +0200 Subject: [PATCH 1121/1449] Jake task detection has been called gulp for a long time --- extensions/jake/src/main.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/jake/src/main.ts b/extensions/jake/src/main.ts index 5752db7dd20..5a68447f94b 100644 --- a/extensions/jake/src/main.ts +++ b/extensions/jake/src/main.ts @@ -60,7 +60,7 @@ function getOutputChannel(): vscode.OutputChannel { } function showError() { - vscode.window.showWarningMessage(localize('gulpTaskDetectError', 'Problem finding jake tasks. See the output for more information.'), + vscode.window.showWarningMessage(localize('jakeTaskDetectError', 'Problem finding jake tasks. See the output for more information.'), localize('jakeShowOutput', 'Go to output')).then(() => { getOutputChannel().show(true); }); @@ -272,7 +272,7 @@ class TaskDetector { private updateProvider(): void { if (!this.taskProvider && this.detectors.size > 0) { const thisCapture = this; - this.taskProvider = vscode.workspace.registerTaskProvider('gulp', { + this.taskProvider = vscode.workspace.registerTaskProvider('jake', { provideTasks(): Promise { return thisCapture.getTasks(); }, From 84e4f3f53ddd767eb571467afb0bc69a9a938314 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Fri, 5 Jul 2019 10:45:35 +0200 Subject: [PATCH 1122/1449] Grunt task detection has been called gulp and jake for a long time --- extensions/grunt/src/main.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/grunt/src/main.ts b/extensions/grunt/src/main.ts index 60dd60839a9..deec1587cc2 100644 --- a/extensions/grunt/src/main.ts +++ b/extensions/grunt/src/main.ts @@ -54,14 +54,14 @@ function isTestTask(name: string): boolean { let _channel: vscode.OutputChannel; function getOutputChannel(): vscode.OutputChannel { if (!_channel) { - _channel = vscode.window.createOutputChannel('Gulp Auto Detection'); + _channel = vscode.window.createOutputChannel('Grunt Auto Detection'); } return _channel; } function showError() { - vscode.window.showWarningMessage(localize('gulpTaskDetectError', 'Problem finding jake tasks. See the output for more information.'), - localize('jakeShowOutput', 'Go to output')).then(() => { + vscode.window.showWarningMessage(localize('gruntTaskDetectError', 'Problem finding grunt tasks. See the output for more information.'), + localize('gruntShowOutput', 'Go to output')).then(() => { getOutputChannel().show(true); }); } @@ -272,7 +272,7 @@ class TaskDetector { private updateProvider(): void { if (!this.taskProvider && this.detectors.size > 0) { - this.taskProvider = vscode.workspace.registerTaskProvider('gulp', { + this.taskProvider = vscode.workspace.registerTaskProvider('grunt', { provideTasks: () => { return this.getTasks(); }, From 77910c99cf9e1707799af496e90138719f9cec0d Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 5 Jul 2019 10:59:54 +0200 Subject: [PATCH 1123/1449] Extract TMScopeRegistry to its own file --- .../browser/abstractTextMateService.ts | 192 ++++++------------ .../textMate/common/TMScopeRegistry.ts | 105 ++++++++++ 2 files changed, 166 insertions(+), 131 deletions(-) create mode 100644 src/vs/workbench/services/textMate/common/TMScopeRegistry.ts diff --git a/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts b/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts index e25b10d9696..065ece1282e 100644 --- a/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts +++ b/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts @@ -20,115 +20,13 @@ import { IFileService } from 'vs/platform/files/common/files'; import { ILogService } from 'vs/platform/log/common/log'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { ExtensionMessageCollector } from 'vs/workbench/services/extensions/common/extensionsRegistry'; -import { IEmbeddedLanguagesMap, ITMSyntaxExtensionPoint, TokenTypesContribution, grammarsExtPoint } from 'vs/workbench/services/textMate/common/TMGrammars'; +import { IEmbeddedLanguagesMap, ITMSyntaxExtensionPoint, grammarsExtPoint } from 'vs/workbench/services/textMate/common/TMGrammars'; import { ITextMateService } from 'vs/workbench/services/textMate/common/textMateService'; import { ITokenColorizationRule, IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; -import { IEmbeddedLanguagesMap as IEmbeddedLanguagesMap2, IGrammar, ITokenTypeMap, Registry, StackElement, StandardTokenType, RegistryOptions, IRawGrammar } from 'vscode-textmate'; +import { IEmbeddedLanguagesMap as IEmbeddedLanguagesMap2, IGrammar, Registry, StackElement, RegistryOptions, IRawGrammar } from 'vscode-textmate'; import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; - -export class TMScopeRegistry extends Disposable { - - private _scopeNameToLanguageRegistration: { [scopeName: string]: TMLanguageRegistration; }; - private _encounteredLanguages: boolean[]; - - private readonly _onDidEncounterLanguage = this._register(new Emitter()); - public readonly onDidEncounterLanguage: Event = this._onDidEncounterLanguage.event; - - constructor() { - super(); - this.reset(); - } - - public reset(): void { - this._scopeNameToLanguageRegistration = Object.create(null); - this._encounteredLanguages = []; - } - - public register(scopeName: string, grammarLocation: URI, embeddedLanguages?: IEmbeddedLanguagesMap, tokenTypes?: TokenTypesContribution): void { - if (this._scopeNameToLanguageRegistration[scopeName]) { - const existingRegistration = this._scopeNameToLanguageRegistration[scopeName]; - if (!resources.isEqual(existingRegistration.grammarLocation, grammarLocation)) { - console.warn( - `Overwriting grammar scope name to file mapping for scope ${scopeName}.\n` + - `Old grammar file: ${existingRegistration.grammarLocation.toString()}.\n` + - `New grammar file: ${grammarLocation.toString()}` - ); - } - } - this._scopeNameToLanguageRegistration[scopeName] = new TMLanguageRegistration(scopeName, grammarLocation, embeddedLanguages, tokenTypes); - } - - public getLanguageRegistration(scopeName: string): TMLanguageRegistration { - return this._scopeNameToLanguageRegistration[scopeName] || null; - } - - public getGrammarLocation(scopeName: string): URI | null { - let data = this.getLanguageRegistration(scopeName); - return data ? data.grammarLocation : null; - } - - /** - * To be called when tokenization found/hit an embedded language. - */ - public onEncounteredLanguage(languageId: LanguageId): void { - if (!this._encounteredLanguages[languageId]) { - this._encounteredLanguages[languageId] = true; - this._onDidEncounterLanguage.fire(languageId); - } - } -} - -export class TMLanguageRegistration { - _topLevelScopeNameDataBrand: void; - - readonly scopeName: string; - readonly grammarLocation: URI; - readonly embeddedLanguages: IEmbeddedLanguagesMap; - readonly tokenTypes: ITokenTypeMap; - - constructor(scopeName: string, grammarLocation: URI, embeddedLanguages: IEmbeddedLanguagesMap | undefined, tokenTypes: TokenTypesContribution | undefined) { - this.scopeName = scopeName; - this.grammarLocation = grammarLocation; - - // embeddedLanguages handling - this.embeddedLanguages = Object.create(null); - - if (embeddedLanguages) { - // If embeddedLanguages are configured, fill in `this._embeddedLanguages` - let scopes = Object.keys(embeddedLanguages); - for (let i = 0, len = scopes.length; i < len; i++) { - let scope = scopes[i]; - let language = embeddedLanguages[scope]; - if (typeof language !== 'string') { - // never hurts to be too careful - continue; - } - this.embeddedLanguages[scope] = language; - } - } - - this.tokenTypes = Object.create(null); - if (tokenTypes) { - // If tokenTypes is configured, fill in `this._tokenTypes` - const scopes = Object.keys(tokenTypes); - for (const scope of scopes) { - const tokenType = tokenTypes[scope]; - switch (tokenType) { - case 'string': - this.tokenTypes[scope] = StandardTokenType.String; - break; - case 'other': - this.tokenTypes[scope] = StandardTokenType.Other; - break; - case 'comment': - this.tokenTypes[scope] = StandardTokenType.Comment; - break; - } - } - } - } -} +import { TMScopeRegistry } from 'vs/workbench/services/textMate/common/TMScopeRegistry'; interface ICreateGrammarResult { languageId: LanguageId; @@ -147,6 +45,7 @@ export abstract class AbstractTextMateService extends Disposable implements ITex private readonly _createdModes: string[]; protected _scopeRegistry: TMScopeRegistry; + private _encounteredLanguages: boolean[]; private _injections: { [scopeName: string]: string[]; }; private _injectedEmbeddedLanguages: { [scopeName: string]: IEmbeddedLanguagesMap[]; }; protected _languageToScope: Map; @@ -168,7 +67,7 @@ export abstract class AbstractTextMateService extends Disposable implements ITex this._styleElement.className = 'vscode-tokens-styles'; this._createdModes = []; this._scopeRegistry = new TMScopeRegistry(); - this._scopeRegistry.onDidEncounterLanguage((language) => this._onDidEncounterLanguage.fire(language)); + this._encounteredLanguages = []; this._injections = {}; this._injectedEmbeddedLanguages = {}; this._languageToScope = new Map(); @@ -229,7 +128,14 @@ export abstract class AbstractTextMateService extends Disposable implements ITex private _registerDefinitionIfAvailable(modeId: string): void { if (this._languageToScope.has(modeId)) { const promise = this._createGrammar(modeId).then((r) => { - return new TMTokenization(this._scopeRegistry, r.languageId, r.grammar, r.initialState, r.containsEmbeddedLanguages, this._notificationService, this._configurationService); + const tokenization = new TMTokenization(r.grammar, r.initialState, r.containsEmbeddedLanguages); + tokenization.onDidEncounterLanguage((languageId) => { + if (!this._encounteredLanguages[languageId]) { + this._encounteredLanguages[languageId] = true; + this._onDidEncounterLanguage.fire(languageId); + } + }); + return new TMTokenizationSupport(r.languageId, tokenization, this._notificationService, this._configurationService); }, e => { onUnexpectedError(e); return null; @@ -431,7 +337,7 @@ export abstract class AbstractTextMateService extends Disposable implements ITex let containsEmbeddedLanguages = (Object.keys(embeddedLanguages).length > 0); const [grammarRegistry, initialState] = await this._getOrCreateGrammarRegistry(); - const grammar = await grammarRegistry.loadGrammarWithConfiguration(scopeName, languageId, { embeddedLanguages, tokenTypes: languageRegistration.tokenTypes }); + const grammar = await grammarRegistry.loadGrammarWithConfiguration(scopeName, languageId, { embeddedLanguages, tokenTypes: languageRegistration.tokenTypes }); return { languageId: languageId, grammar: grammar, @@ -443,41 +349,38 @@ export abstract class AbstractTextMateService extends Disposable implements ITex protected abstract _loadVSCodeTextmate(): Promise; } -class TMTokenization implements ITokenizationSupport { - - private readonly _scopeRegistry: TMScopeRegistry; +class TMTokenizationSupport implements ITokenizationSupport { private readonly _languageId: LanguageId; - private readonly _grammar: IGrammar; - private readonly _containsEmbeddedLanguages: boolean; - private readonly _seenLanguages: boolean[]; - private readonly _initialState: StackElement; - private _maxTokenizationLineLength: number; + private readonly _actual: TMTokenization; private _tokenizationWarningAlreadyShown: boolean; + private _maxTokenizationLineLength: number; - constructor(scopeRegistry: TMScopeRegistry, languageId: LanguageId, grammar: IGrammar, initialState: StackElement, containsEmbeddedLanguages: boolean, @INotificationService private readonly notificationService: INotificationService, @IConfigurationService readonly configurationService: IConfigurationService) { - this._scopeRegistry = scopeRegistry; + constructor( + languageId: LanguageId, + actual: TMTokenization, + @INotificationService private readonly _notificationService: INotificationService, + @IConfigurationService private readonly _configurationService: IConfigurationService + ) { this._languageId = languageId; - this._grammar = grammar; - this._initialState = initialState; - this._containsEmbeddedLanguages = containsEmbeddedLanguages; - this._seenLanguages = []; - this._maxTokenizationLineLength = configurationService.getValue('editor.maxTokenizationLineLength'); - configurationService.onDidChangeConfiguration(e => { + this._actual = actual; + this._tokenizationWarningAlreadyShown = false; + this._maxTokenizationLineLength = this._configurationService.getValue('editor.maxTokenizationLineLength'); + this._configurationService.onDidChangeConfiguration(e => { if (e.affectsConfiguration('editor.maxTokenizationLineLength')) { - this._maxTokenizationLineLength = configurationService.getValue('editor.maxTokenizationLineLength'); + this._maxTokenizationLineLength = this._configurationService.getValue('editor.maxTokenizationLineLength'); } }); } - public getInitialState(): IState { - return this._initialState; + getInitialState(): IState { + return this._actual.getInitialState(); } - public tokenize(line: string, state: IState, offsetDelta: number): TokenizationResult { + tokenize(line: string, state: IState, offsetDelta: number): TokenizationResult { throw new Error('Not supported!'); } - public tokenize2(line: string, state: StackElement, offsetDelta: number): TokenizationResult2 { + tokenize2(line: string, state: StackElement, offsetDelta: number): TokenizationResult2 { if (offsetDelta !== 0) { throw new Error('Unexpected: offsetDelta should be 0.'); } @@ -486,12 +389,39 @@ class TMTokenization implements ITokenizationSupport { if (line.length >= this._maxTokenizationLineLength) { if (!this._tokenizationWarningAlreadyShown) { this._tokenizationWarningAlreadyShown = true; - this.notificationService.warn(nls.localize('too many characters', "Tokenization is skipped for long lines for performance reasons. The length of a long line can be configured via `editor.maxTokenizationLineLength`.")); + this._notificationService.warn(nls.localize('too many characters', "Tokenization is skipped for long lines for performance reasons. The length of a long line can be configured via `editor.maxTokenizationLineLength`.")); } console.log(`Line (${line.substr(0, 15)}...): longer than ${this._maxTokenizationLineLength} characters, tokenization skipped.`); return nullTokenize2(this._languageId, line, state, offsetDelta); } + return this._actual.tokenize2(line, state); + } +} + +class TMTokenization extends Disposable { + + private readonly _grammar: IGrammar; + private readonly _containsEmbeddedLanguages: boolean; + private readonly _seenLanguages: boolean[]; + private readonly _initialState: StackElement; + + private readonly _onDidEncounterLanguage: Emitter = this._register(new Emitter()); + public readonly onDidEncounterLanguage: Event = this._onDidEncounterLanguage.event; + + constructor(grammar: IGrammar, initialState: StackElement, containsEmbeddedLanguages: boolean) { + super(); + this._grammar = grammar; + this._initialState = initialState; + this._containsEmbeddedLanguages = containsEmbeddedLanguages; + this._seenLanguages = []; + } + + public getInitialState(): IState { + return this._initialState; + } + + public tokenize2(line: string, state: StackElement): TokenizationResult2 { let textMateResult = this._grammar.tokenizeLine2(line, state); if (this._containsEmbeddedLanguages) { @@ -505,7 +435,7 @@ class TMTokenization implements ITokenizationSupport { if (!seenLanguages[languageId]) { seenLanguages[languageId] = true; - this._scopeRegistry.onEncounteredLanguage(languageId); + this._onDidEncounterLanguage.fire(languageId); } } } diff --git a/src/vs/workbench/services/textMate/common/TMScopeRegistry.ts b/src/vs/workbench/services/textMate/common/TMScopeRegistry.ts new file mode 100644 index 00000000000..c9e1ee58a1a --- /dev/null +++ b/src/vs/workbench/services/textMate/common/TMScopeRegistry.ts @@ -0,0 +1,105 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as resources from 'vs/base/common/resources'; +import { URI } from 'vs/base/common/uri'; +import { IEmbeddedLanguagesMap, TokenTypesContribution } from 'vs/workbench/services/textMate/common/TMGrammars'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { StandardTokenType } from 'vs/editor/common/modes'; + +/** + * A map from selectors to token types. + */ +export interface ITokenTypeMap { + [selector: string]: StandardTokenType; +} + +export class TMScopeRegistry extends Disposable { + + private _scopeNameToLanguageRegistration: { [scopeName: string]: TMLanguageRegistration; }; + + constructor() { + super(); + this.reset(); + } + + public reset(): void { + this._scopeNameToLanguageRegistration = Object.create(null); + } + + public register(scopeName: string, grammarLocation: URI, embeddedLanguages?: IEmbeddedLanguagesMap, tokenTypes?: TokenTypesContribution): void { + if (this._scopeNameToLanguageRegistration[scopeName]) { + const existingRegistration = this._scopeNameToLanguageRegistration[scopeName]; + if (!resources.isEqual(existingRegistration.grammarLocation, grammarLocation)) { + console.warn( + `Overwriting grammar scope name to file mapping for scope ${scopeName}.\n` + + `Old grammar file: ${existingRegistration.grammarLocation.toString()}.\n` + + `New grammar file: ${grammarLocation.toString()}` + ); + } + } + this._scopeNameToLanguageRegistration[scopeName] = new TMLanguageRegistration(scopeName, grammarLocation, embeddedLanguages, tokenTypes); + } + + public getLanguageRegistration(scopeName: string): TMLanguageRegistration { + return this._scopeNameToLanguageRegistration[scopeName] || null; + } + + public getGrammarLocation(scopeName: string): URI | null { + let data = this.getLanguageRegistration(scopeName); + return data ? data.grammarLocation : null; + } +} + +export class TMLanguageRegistration { + _topLevelScopeNameDataBrand: void; + + readonly scopeName: string; + readonly grammarLocation: URI; + readonly embeddedLanguages: IEmbeddedLanguagesMap; + readonly tokenTypes: ITokenTypeMap; + + constructor(scopeName: string, grammarLocation: URI, embeddedLanguages: IEmbeddedLanguagesMap | undefined, tokenTypes: TokenTypesContribution | undefined) { + this.scopeName = scopeName; + this.grammarLocation = grammarLocation; + + // embeddedLanguages handling + this.embeddedLanguages = Object.create(null); + + if (embeddedLanguages) { + // If embeddedLanguages are configured, fill in `this._embeddedLanguages` + let scopes = Object.keys(embeddedLanguages); + for (let i = 0, len = scopes.length; i < len; i++) { + let scope = scopes[i]; + let language = embeddedLanguages[scope]; + if (typeof language !== 'string') { + // never hurts to be too careful + continue; + } + this.embeddedLanguages[scope] = language; + } + } + + this.tokenTypes = Object.create(null); + if (tokenTypes) { + // If tokenTypes is configured, fill in `this._tokenTypes` + const scopes = Object.keys(tokenTypes); + for (const scope of scopes) { + const tokenType = tokenTypes[scope]; + switch (tokenType) { + case 'string': + this.tokenTypes[scope] = StandardTokenType.String; + break; + case 'other': + this.tokenTypes[scope] = StandardTokenType.Other; + break; + case 'comment': + this.tokenTypes[scope] = StandardTokenType.Comment; + break; + } + } + } + } +} From 4f0d79d116421d526a467ce839b6a6920a3b77f3 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Fri, 5 Jul 2019 11:16:08 +0200 Subject: [PATCH 1124/1449] Fix quick terminal splitting for tasks Part of #76611 --- src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts index c6e1d3fbaa7..bbee56887c4 100644 --- a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts @@ -986,6 +986,7 @@ export class TerminalTaskSystem implements ITaskSystem { for (const terminal of values(this.terminals)) { if (terminal.group === group) { const originalInstance = terminal.terminal; + await originalInstance.waitForTitle(); const config = this.currentTask.shellLaunchConfig; result = this.terminalService.splitInstance(originalInstance, config); if (result) { From 9686a63255f9d612a1146a38386c07f86726cbf8 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Fri, 5 Jul 2019 11:39:47 +0200 Subject: [PATCH 1125/1449] Fix commandless tasks Part of #76611 --- src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts index bbee56887c4..e58c47c4174 100644 --- a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts @@ -471,7 +471,7 @@ export class TerminalTaskSystem implements ITaskSystem { const resolvedVariables = this.resolveVariablesFromSet(this.currentTask.systemInfo, this.currentTask.workspaceFolder!, task, variables); return resolvedVariables.then((resolvedVariables) => { - if (resolvedVariables && task.command && task.command.runtime) { + if (resolvedVariables && task.command && task.command.name && task.command.runtime) { this.currentTask.resolvedVariables = resolvedVariables; return this.executeInTerminal(task, trigger, new VariableResolver(this.currentTask.workspaceFolder!, this.currentTask.systemInfo, resolvedVariables.variables, this.configurationResolverService)); } else { From 0c75d75e23ec98c516c607daa752a22e374404c5 Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 5 Jul 2019 11:41:33 +0200 Subject: [PATCH 1126/1449] debug: fix word-wrap --- src/vs/workbench/contrib/debug/browser/media/repl.css | 3 +++ src/vs/workbench/contrib/debug/browser/repl.ts | 1 + 2 files changed, 4 insertions(+) diff --git a/src/vs/workbench/contrib/debug/browser/media/repl.css b/src/vs/workbench/contrib/debug/browser/media/repl.css index cc91935610c..7268724a281 100644 --- a/src/vs/workbench/contrib/debug/browser/media/repl.css +++ b/src/vs/workbench/contrib/debug/browser/media/repl.css @@ -13,6 +13,9 @@ .repl .repl-tree .monaco-tl-contents { user-select: text; +} + +.repl .repl-tree.word-wrap .monaco-tl-contents { /* Wrap words but also do not trim whitespace #6275 */ word-wrap: break-word; white-space: pre-wrap; diff --git a/src/vs/workbench/contrib/debug/browser/repl.ts b/src/vs/workbench/contrib/debug/browser/repl.ts index a2c6a6859ba..5f7d93cdea0 100644 --- a/src/vs/workbench/contrib/debug/browser/repl.ts +++ b/src/vs/workbench/contrib/debug/browser/repl.ts @@ -377,6 +377,7 @@ export class Repl extends Panel implements IPrivateReplService, IHistoryNavigati this.replDelegate = new ReplDelegate(this.configurationService); const wordWrap = this.configurationService.getValue('debug').console.wordWrap; + dom.toggleClass(treeContainer, 'word-wrap', wordWrap); this.tree = this.instantiationService.createInstance(WorkbenchAsyncDataTree, treeContainer, this.replDelegate, [ this.instantiationService.createInstance(VariablesRenderer), this.instantiationService.createInstance(ReplSimpleElementsRenderer), From 5dd6ccde48aeba45887acd43c6f0108f62ce58c0 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 5 Jul 2019 11:48:55 +0200 Subject: [PATCH 1127/1449] register correct backup file service --- src/vs/workbench/services/backup/common/backupFileService.ts | 5 +---- src/vs/workbench/workbench.main.ts | 5 ++++- src/vs/workbench/workbench.web.main.ts | 4 +++- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/services/backup/common/backupFileService.ts b/src/vs/workbench/services/backup/common/backupFileService.ts index 313b2202914..f301373b3cf 100644 --- a/src/vs/workbench/services/backup/common/backupFileService.ts +++ b/src/vs/workbench/services/backup/common/backupFileService.ts @@ -17,7 +17,6 @@ import { createTextBufferFactoryFromStream, createTextBufferFactoryFromSnapshot import { keys, ResourceMap } from 'vs/base/common/map'; import { Schemas } from 'vs/base/common/network'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { VSBuffer } from 'vs/base/common/buffer'; import { TextSnapshotReadable } from 'vs/workbench/services/textfile/common/textfiles'; import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; @@ -422,6 +421,4 @@ export class InMemoryBackupFileService implements IBackupFileService { toBackupResource(resource: URI): URI { return URI.file(join(resource.scheme, this.hashPath(resource))); } -} - -registerSingleton(IBackupFileService, BackupFileService); \ No newline at end of file +} \ No newline at end of file diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index b9c655b8f03..dc3e95c613d 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -112,7 +112,6 @@ import 'vs/workbench/services/textmodelResolver/common/textModelResolverService' import 'vs/workbench/services/textfile/node/textFileService'; import 'vs/workbench/services/dialogs/browser/fileDialogService'; import 'vs/workbench/services/dialogs/electron-browser/dialogService'; -import 'vs/workbench/services/backup/node/backupFileService'; import 'vs/workbench/services/editor/browser/editorService'; import 'vs/workbench/services/history/browser/history'; import 'vs/workbench/services/activity/browser/activityService'; @@ -136,7 +135,11 @@ import 'vs/workbench/services/notification/common/notificationService'; import 'vs/workbench/services/window/electron-browser/windowService'; import 'vs/workbench/services/telemetry/electron-browser/telemetryService'; import 'vs/workbench/services/configurationResolver/electron-browser/configurationResolverService'; +import { IBackupFileService } from 'vs/workbench/services/backup/common/backup'; +import { BackupFileService } from 'vs/workbench/services/backup/node/backupFileService'; + +registerSingleton(IBackupFileService, BackupFileService); registerSingleton(IMenuService, MenuService, true); registerSingleton(IListService, ListService, true); registerSingleton(IOpenerService, OpenerService, true); diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index a05b80bf985..bba70ef3eab 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -111,7 +111,6 @@ import 'vs/workbench/services/textmodelResolver/common/textModelResolverService' import 'vs/workbench/services/textfile/browser/textFileService'; import 'vs/workbench/services/dialogs/browser/fileDialogService'; // import 'vs/workbench/services/dialogs/electron-browser/dialogService'; -import 'vs/workbench/services/backup/common/backupFileService'; import 'vs/workbench/services/editor/browser/editorService'; import 'vs/workbench/services/history/browser/history'; import 'vs/workbench/services/activity/browser/activityService'; @@ -136,9 +135,12 @@ import 'vs/workbench/services/notification/common/notificationService'; import 'vs/workbench/services/configurationResolver/browser/configurationResolverService'; import { IContextViewService, IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { ContextMenuService } from 'vs/platform/contextview/browser/contextMenuService'; +import { IBackupFileService } from 'vs/workbench/services/backup/common/backup'; +import { BackupFileService } from 'vs/workbench/services/backup/common/backupFileService'; import 'vs/workbench/browser/web.simpleservices'; +registerSingleton(IBackupFileService, BackupFileService); registerSingleton(IDialogService, DialogService, true); registerSingleton(IMenuService, MenuService, true); registerSingleton(IListService, ListService, true); From 5632214eda68e29351b31be8ec5e4a0848313480 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 5 Jul 2019 11:52:10 +0200 Subject: [PATCH 1128/1449] adopt backup file service to use userdata provider --- .../backup/common/backupFileService.ts | 7 ++-- .../test/node/backupFileService.test.ts | 33 +++++++++---------- 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/src/vs/workbench/services/backup/common/backupFileService.ts b/src/vs/workbench/services/backup/common/backupFileService.ts index f301373b3cf..bb3cba3455f 100644 --- a/src/vs/workbench/services/backup/common/backupFileService.ts +++ b/src/vs/workbench/services/backup/common/backupFileService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { join } from 'vs/base/common/path'; -import { joinPath } from 'vs/base/common/resources'; +import { joinPath, relativePath } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { hash } from 'vs/base/common/hash'; import { coalesce } from 'vs/base/common/arrays'; @@ -116,7 +116,7 @@ export class BackupFileService implements IBackupFileService { ) { const backupWorkspacePath = environmentService.configuration.backupPath; if (backupWorkspacePath) { - this.impl = new BackupFileServiceImpl(backupWorkspacePath, this.hashPath, fileService); + this.impl = new BackupFileServiceImpl(backupWorkspacePath, this.hashPath, environmentService, fileService); } else { this.impl = new InMemoryBackupFileService(this.hashPath); } @@ -183,6 +183,7 @@ class BackupFileServiceImpl implements IBackupFileService { constructor( backupWorkspacePath: string, private readonly hashPath: (resource: URI) => string, + @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, @IFileService private readonly fileService: IFileService ) { this.isShuttingDown = false; @@ -192,7 +193,7 @@ class BackupFileServiceImpl implements IBackupFileService { } initialize(backupWorkspacePath: string): void { - this.backupWorkspacePath = URI.file(backupWorkspacePath); + this.backupWorkspacePath = joinPath(this.environmentService.userRoamingDataHome, relativePath(URI.file(this.environmentService.userDataPath), URI.file(backupWorkspacePath))!); this.ready = this.init(); } diff --git a/src/vs/workbench/services/backup/test/node/backupFileService.test.ts b/src/vs/workbench/services/backup/test/node/backupFileService.test.ts index 542dbc92291..3b44c4f67b2 100644 --- a/src/vs/workbench/services/backup/test/node/backupFileService.test.ts +++ b/src/vs/workbench/services/backup/test/node/backupFileService.test.ts @@ -25,9 +25,12 @@ import { parseArgs } from 'vs/platform/environment/node/argv'; import { snapshotToString } from 'vs/workbench/services/textfile/common/textfiles'; import { IFileService } from 'vs/platform/files/common/files'; import { hashPath, BackupFileService } from 'vs/workbench/services/backup/node/backupFileService'; +import { BACKUPS } from 'vs/platform/environment/common/environment'; +import { FileUserDataProvider } from 'vs/workbench/services/userData/common/fileUserDataProvider'; -const parentDir = getRandomTestPath(os.tmpdir(), 'vsctests', 'backupfileservice'); -const backupHome = path.join(parentDir, 'Backups'); +const userdataDir = getRandomTestPath(os.tmpdir(), 'vsctests', 'backupfileservice'); +const appSettingsHome = path.join(userdataDir, 'User'); +const backupHome = path.join(userdataDir, 'Backups'); const workspacesJsonPath = path.join(backupHome, 'workspaces.json'); const workspaceResource = URI.file(platform.isWindows ? 'c:\\workspace' : '/workspace'); @@ -44,18 +47,10 @@ const untitledBackupPath = path.join(workspaceBackupPath, 'untitled', hashPath(u class TestBackupEnvironmentService extends WorkbenchEnvironmentService { - private config: IWindowConfiguration; - - constructor(workspaceBackupPath: string) { - super(parseArgs(process.argv) as IWindowConfiguration, process.execPath); - - this.config = Object.create(null); - this.config.backupPath = workspaceBackupPath; + constructor(backupPath: string) { + super({ ...parseArgs(process.argv), ...{ backupPath, 'user-data-dir': userdataDir } } as IWindowConfiguration, process.execPath); } - get configuration(): IWindowConfiguration { - return this.config; - } } class TestBackupFileService extends BackupFileService { @@ -63,9 +58,11 @@ class TestBackupFileService extends BackupFileService { readonly fileService: IFileService; constructor(workspace: URI, backupHome: string, workspacesJsonPath: string) { - const fileService = new FileService(new NullLogService()); - fileService.registerProvider(Schemas.file, new DiskFileSystemProvider(new NullLogService())); const environmentService = new TestBackupEnvironmentService(workspaceBackupPath); + const fileService = new FileService(new NullLogService()); + const diskFileSystemProvider = new DiskFileSystemProvider(new NullLogService()); + fileService.registerProvider(Schemas.file, diskFileSystemProvider); + fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, URI.file(environmentService.backupHome), diskFileSystemProvider)); super(environmentService, fileService); @@ -125,8 +122,8 @@ suite('BackupFileService', () => { const backupResource = fooFile; const workspaceHash = hashPath(workspaceResource); const filePathHash = hashPath(backupResource); - const expectedPath = URI.file(path.join(backupHome, workspaceHash, 'file', filePathHash)).fsPath; - assert.equal(service.toBackupResource(backupResource).fsPath, expectedPath); + const expectedPath = URI.file(path.join(appSettingsHome, BACKUPS, workspaceHash, Schemas.file, filePathHash)).with({ scheme: Schemas.userData }).toString(); + assert.equal(service.toBackupResource(backupResource).toString(), expectedPath); }); test('should get the correct backup path for untitled files', () => { @@ -134,8 +131,8 @@ suite('BackupFileService', () => { const backupResource = URI.from({ scheme: Schemas.untitled, path: 'Untitled-1' }); const workspaceHash = hashPath(workspaceResource); const filePathHash = hashPath(backupResource); - const expectedPath = URI.file(path.join(backupHome, workspaceHash, 'untitled', filePathHash)).fsPath; - assert.equal(service.toBackupResource(backupResource).fsPath, expectedPath); + const expectedPath = URI.file(path.join(appSettingsHome, BACKUPS, workspaceHash, Schemas.untitled, filePathHash)).with({ scheme: Schemas.userData }).toString(); + assert.equal(service.toBackupResource(backupResource).toString(), expectedPath); }); }); From b199a317a3adffa1dde22442ddc95f64e051c820 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 5 Jul 2019 12:03:03 +0200 Subject: [PATCH 1129/1449] Attempt to avoid deopt (#64546) --- src/vs/editor/browser/viewParts/lines/rangeUtil.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/browser/viewParts/lines/rangeUtil.ts b/src/vs/editor/browser/viewParts/lines/rangeUtil.ts index 1561687a35e..5344effa706 100644 --- a/src/vs/editor/browser/viewParts/lines/rangeUtil.ts +++ b/src/vs/editor/browser/viewParts/lines/rangeUtil.ts @@ -126,7 +126,7 @@ export class RangeUtil { if (startChildIndex !== endChildIndex) { if (endChildIndex > 0 && endOffset === 0) { endChildIndex--; - endOffset = Number.MAX_VALUE; + endOffset = Constants.MAX_SAFE_SMALL_INTEGER; } } From bf376d5223b6e86687991b2ef91cb697a707bef1 Mon Sep 17 00:00:00 2001 From: Prabhanjan S Koushik Date: Fri, 5 Jul 2019 16:21:07 +0530 Subject: [PATCH 1130/1449] Added hpp.in and h.in to file associations for cpp (#76680) Fixes #76662 --- extensions/cpp/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/cpp/package.json b/extensions/cpp/package.json index b4285b3b8c3..c300ebe326c 100644 --- a/extensions/cpp/package.json +++ b/extensions/cpp/package.json @@ -18,7 +18,7 @@ }, { "id": "cpp", - "extensions": [ ".cpp", ".cc", ".cxx", ".hpp", ".hh", ".hxx", ".h", ".ino", ".inl", ".ipp" ], + "extensions": [ ".cpp", ".cc", ".cxx", ".hpp", ".hh", ".hxx", ".h", ".ino", ".inl", ".ipp", ".hpp.in", ".h.in" ], "aliases": [ "C++", "Cpp", "cpp"], "configuration": "./language-configuration.json" }], From 6fcabcdc249a6940f36136e0056f8f5a7a03efeb Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 5 Jul 2019 12:55:35 +0200 Subject: [PATCH 1131/1449] make backup path URI clean up user data provider --- src/vs/code/electron-main/main.ts | 2 +- src/vs/code/electron-main/windows.ts | 2 +- .../backup/electron-main/backupMainService.ts | 2 +- .../environment/common/environment.ts | 2 +- .../environment/node/environmentService.ts | 4 +-- src/vs/workbench/browser/web.main.ts | 10 +++--- src/vs/workbench/electron-browser/main.ts | 2 +- .../test/node/backupFileService.test.ts | 2 +- .../configurationEditingService.test.ts | 7 ++-- .../configurationService.test.ts | 16 ++++----- .../environment/browser/environmentService.ts | 6 ++-- .../keybindingEditing.test.ts | 7 ++-- .../userData/common/fileUserDataProvider.ts | 33 +++++++++++-------- 13 files changed, 50 insertions(+), 45 deletions(-) diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index 97578e19252..e71b758a7f7 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -161,7 +161,7 @@ class CodeMain { environmentService.logsPath, environmentService.globalStorageHome, environmentService.workspaceStorageHome, - environmentService.backupHome + environmentService.backupHome.fsPath ].map((path): undefined | Promise => path ? mkdirp(path) : undefined)); // Configuration service diff --git a/src/vs/code/electron-main/windows.ts b/src/vs/code/electron-main/windows.ts index 377ca33281c..ad3025e5c3c 100644 --- a/src/vs/code/electron-main/windows.ts +++ b/src/vs/code/electron-main/windows.ts @@ -1331,7 +1331,7 @@ export class WindowsManager extends Disposable implements IWindowsMainService { // For all other cases we first call into registerEmptyWindowBackupSync() to set it before // loading the window. if (options.emptyWindowBackupInfo) { - configuration.backupPath = join(this.environmentService.backupHome, options.emptyWindowBackupInfo.backupFolder); + configuration.backupPath = join(this.environmentService.backupHome.fsPath, options.emptyWindowBackupInfo.backupFolder); } let window: ICodeWindow | undefined; diff --git a/src/vs/platform/backup/electron-main/backupMainService.ts b/src/vs/platform/backup/electron-main/backupMainService.ts index 011164d869e..9e2875d928a 100644 --- a/src/vs/platform/backup/electron-main/backupMainService.ts +++ b/src/vs/platform/backup/electron-main/backupMainService.ts @@ -36,7 +36,7 @@ export class BackupMainService implements IBackupMainService { @IConfigurationService private readonly configurationService: IConfigurationService, @ILogService private readonly logService: ILogService ) { - this.backupHome = environmentService.backupHome; + this.backupHome = environmentService.backupHome.fsPath; this.workspacesJsonPath = environmentService.backupWorkspacesPath; } diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index 422ec4493a6..189d930f7b7 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -124,7 +124,7 @@ export interface IEnvironmentService { globalStorageHome: string; workspaceStorageHome: string; - backupHome: string; + backupHome: URI; backupWorkspacesPath: string; untitledWorkspacesHome: URI; diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts index 744c9b936fe..0b2fd7547db 100644 --- a/src/vs/platform/environment/node/environmentService.ts +++ b/src/vs/platform/environment/node/environmentService.ts @@ -151,10 +151,10 @@ export class EnvironmentService implements IEnvironmentService { get isExtensionDevelopment(): boolean { return !!this._args.extensionDevelopmentPath; } @memoize - get backupHome(): string { return path.join(this.userDataPath, BACKUPS); } + get backupHome(): URI { return URI.file(path.join(this.userDataPath, BACKUPS)); } @memoize - get backupWorkspacesPath(): string { return path.join(this.backupHome, 'workspaces.json'); } + get backupWorkspacesPath(): string { return path.join(this.backupHome.fsPath, 'workspaces.json'); } @memoize get untitledWorkspacesHome(): URI { return URI.file(path.join(this.userDataPath, 'Workspaces')); } diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index dadc532e49f..f653479fb9b 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -84,8 +84,7 @@ class CodeRendererMain extends Disposable { serviceCollection.set(ILogService, logService); // Environment - const remoteUserDataUri = this.getRemoteUserDataUri(); - const environmentService = new BrowserWorkbenchEnvironmentService(this.configuration, remoteUserDataUri); + const environmentService = new BrowserWorkbenchEnvironmentService(this.configuration); serviceCollection.set(IWorkbenchEnvironmentService, environmentService); // Product @@ -116,8 +115,11 @@ class CodeRendererMain extends Disposable { fileService.registerProvider(Schemas.vscodeRemote, remoteFileSystemProvider); - if (!userDataProvider && remoteUserDataUri) { - userDataProvider = this._register(new FileUserDataProvider(remoteUserDataUri, dirname(remoteUserDataUri), remoteFileSystemProvider)); + if (!userDataProvider) { + const remoteUserDataUri = this.getRemoteUserDataUri(); + if (remoteUserDataUri) { + userDataProvider = this._register(new FileUserDataProvider(remoteUserDataUri, dirname(remoteUserDataUri), remoteFileSystemProvider, environmentService)); + } } } diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index c7542c63abe..7ba3089f538 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -200,7 +200,7 @@ class CodeRendererMain extends Disposable { fileService.registerProvider(Schemas.file, diskFileSystemProvider); // User Data Provider - fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, URI.file(environmentService.backupHome), diskFileSystemProvider)); + fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, environmentService.backupHome, diskFileSystemProvider, environmentService)); const connection = remoteAgentService.getConnection(); if (connection) { diff --git a/src/vs/workbench/services/backup/test/node/backupFileService.test.ts b/src/vs/workbench/services/backup/test/node/backupFileService.test.ts index 3b44c4f67b2..2407186c794 100644 --- a/src/vs/workbench/services/backup/test/node/backupFileService.test.ts +++ b/src/vs/workbench/services/backup/test/node/backupFileService.test.ts @@ -62,7 +62,7 @@ class TestBackupFileService extends BackupFileService { const fileService = new FileService(new NullLogService()); const diskFileSystemProvider = new DiskFileSystemProvider(new NullLogService()); fileService.registerProvider(Schemas.file, diskFileSystemProvider); - fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, URI.file(environmentService.backupHome), diskFileSystemProvider)); + fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, environmentService.backupHome, diskFileSystemProvider, environmentService)); super(environmentService, fileService); 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 be0cfec3420..1b604be8ba7 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 @@ -42,9 +42,8 @@ import { KeybindingsEditingService, IKeybindingEditingService } from 'vs/workben import { WorkbenchEnvironmentService } from 'vs/workbench/services/environment/node/environmentService'; import { IWindowConfiguration } from 'vs/platform/windows/common/windows'; import { FileUserDataProvider } from 'vs/workbench/services/userData/common/fileUserDataProvider'; -import { dirname } from 'vs/base/common/resources'; -class TestBackupEnvironmentService extends WorkbenchEnvironmentService { +class TestEnvironmentService extends WorkbenchEnvironmentService { constructor(private _appSettingsHome: URI) { super(parseArgs(process.argv) as IWindowConfiguration, process.execPath); @@ -105,13 +104,13 @@ suite('ConfigurationEditingService', () => { clearServices(); instantiationService = workbenchInstantiationService(); - const environmentService = new TestBackupEnvironmentService(URI.file(workspaceDir)); + const environmentService = new TestEnvironmentService(URI.file(workspaceDir)); instantiationService.stub(IEnvironmentService, environmentService); const remoteAgentService = instantiationService.createInstance(RemoteAgentService, {}); const fileService = new FileService(new NullLogService()); const diskFileSystemProvider = new DiskFileSystemProvider(new NullLogService()); fileService.registerProvider(Schemas.file, diskFileSystemProvider); - fileService.registerProvider(Schemas.userData, new FileUserDataProvider(URI.file(workspaceDir), dirname(URI.file(workspaceDir)), diskFileSystemProvider)); + fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, environmentService.backupHome, diskFileSystemProvider, environmentService)); instantiationService.stub(IFileService, fileService); instantiationService.stub(IRemoteAgentService, remoteAgentService); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); 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 308b976db11..a477c2a1f4f 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 @@ -30,7 +30,7 @@ import { IJSONEditingService } from 'vs/workbench/services/configuration/common/ import { JSONEditingService } from 'vs/workbench/services/configuration/common/jsonEditingService'; import { createHash } from 'crypto'; import { Schemas } from 'vs/base/common/network'; -import { originalFSPath, dirname } from 'vs/base/common/resources'; +import { originalFSPath } from 'vs/base/common/resources'; import { isLinux } from 'vs/base/common/platform'; import { IWindowConfiguration } from 'vs/platform/windows/common/windows'; import { RemoteAgentService } from 'vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl'; @@ -107,7 +107,7 @@ suite('WorkspaceContextService - Folder', () => { workspaceResource = folderDir; const environmentService = new TestEnvironmentService(URI.file(parentDir)); const fileService = new FileService(new NullLogService()); - fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, dirname(environmentService.appSettingsHome), new DiskFileSystemProvider(new NullLogService()))); + fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, environmentService.backupHome, new DiskFileSystemProvider(new NullLogService()), environmentService)); workspaceContextService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, new RemoteAgentService({}, environmentService, new RemoteAuthorityResolverService(), new SignService())); return (workspaceContextService).initialize(convertToWorkspacePayload(URI.file(folderDir))); }); @@ -173,7 +173,7 @@ suite('WorkspaceContextService - Workspace', () => { const fileService = new FileService(new NullLogService()); const diskFileSystemProvider = new DiskFileSystemProvider(new NullLogService()); fileService.registerProvider(Schemas.file, diskFileSystemProvider); - fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, dirname(environmentService.appSettingsHome), diskFileSystemProvider)); + fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, environmentService.backupHome, diskFileSystemProvider, environmentService)); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); @@ -233,7 +233,7 @@ suite('WorkspaceContextService - Workspace Editing', () => { const fileService = new FileService(new NullLogService()); const diskFileSystemProvider = new DiskFileSystemProvider(new NullLogService()); fileService.registerProvider(Schemas.file, diskFileSystemProvider); - fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, dirname(environmentService.appSettingsHome), diskFileSystemProvider)); + fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, environmentService.backupHome, diskFileSystemProvider, environmentService)); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); @@ -494,7 +494,7 @@ suite('WorkspaceService - Initialization', () => { const fileService = new FileService(new NullLogService()); const diskFileSystemProvider = new DiskFileSystemProvider(new NullLogService()); fileService.registerProvider(Schemas.file, diskFileSystemProvider); - fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, dirname(environmentService.appSettingsHome), diskFileSystemProvider)); + fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, environmentService.backupHome, diskFileSystemProvider, environmentService)); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); @@ -758,7 +758,7 @@ suite('WorkspaceConfigurationService - Folder', () => { const fileService = new FileService(new NullLogService()); const diskFileSystemProvider = new DiskFileSystemProvider(new NullLogService()); fileService.registerProvider(Schemas.file, diskFileSystemProvider); - fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, dirname(environmentService.appSettingsHome), diskFileSystemProvider)); + fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, environmentService.backupHome, diskFileSystemProvider, environmentService)); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); instantiationService.stub(IConfigurationService, workspaceService); @@ -1088,7 +1088,7 @@ suite('WorkspaceConfigurationService-Multiroot', () => { const fileService = new FileService(new NullLogService()); const diskFileSystemProvider = new DiskFileSystemProvider(new NullLogService()); fileService.registerProvider(Schemas.file, diskFileSystemProvider); - fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, dirname(environmentService.appSettingsHome), diskFileSystemProvider)); + fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, environmentService.backupHome, diskFileSystemProvider, environmentService)); const workspaceService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, workspaceService); @@ -1490,7 +1490,7 @@ suite('WorkspaceConfigurationService - Remote Folder', () => { const remoteAgentService = instantiationService.stub(IRemoteAgentService, >{ getEnvironment: () => remoteEnvironmentPromise }); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, diskFileSystemProvider); - fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, dirname(environmentService.appSettingsHome), diskFileSystemProvider)); + fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, environmentService.backupHome, diskFileSystemProvider, environmentService)); const configurationCache: IConfigurationCache = { read: () => Promise.resolve(''), write: () => Promise.resolve(), remove: () => Promise.resolve() }; testObject = new WorkspaceService({ configurationCache, remoteAuthority }, environmentService, fileService, remoteAgentService); instantiationService.stub(IWorkspaceContextService, testObject); diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts index e1e86e4a937..74cb8d155d8 100644 --- a/src/vs/workbench/services/environment/browser/environmentService.ts +++ b/src/vs/workbench/services/environment/browser/environmentService.ts @@ -63,13 +63,13 @@ export class BrowserWorkbenchEnvironmentService implements IEnvironmentService { readonly configuration: IWindowConfiguration = new BrowserWindowConfiguration(); - constructor(configuration: IWorkbenchConstructionOptions, remoteUserDataUri: URI | null) { + constructor(configuration: IWorkbenchConstructionOptions) { this.args = { _: [] }; this.appRoot = '/web/'; this.appNameLong = 'Visual Studio Code - Web'; this.configuration.remoteAuthority = configuration.remoteAuthority; - this.userRoamingDataHome = remoteUserDataUri ? remoteUserDataUri.with({ scheme: Schemas.userData }) : URI.file('/User').with({ scheme: Schemas.userData }); + this.userRoamingDataHome = URI.file('/User').with({ scheme: Schemas.userData }); this.settingsResource = joinPath(this.userRoamingDataHome, 'settings.json'); this.keybindingsResource = joinPath(this.userRoamingDataHome, 'keybindings.json'); this.keyboardLayoutResource = joinPath(this.userRoamingDataHome, 'keyboardLayout.json'); @@ -108,7 +108,7 @@ export class BrowserWorkbenchEnvironmentService implements IEnvironmentService { settingsSearchUrl?: string; globalStorageHome: string; workspaceStorageHome: string; - backupHome: string; + backupHome: URI; backupWorkspacesPath: string; workspacesHome: string; isExtensionDevelopment: boolean; 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 dc8b05ca6f8..c6599181ee5 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 @@ -49,9 +49,8 @@ import { FileUserDataProvider } from 'vs/workbench/services/userData/common/file import { parseArgs } from 'vs/platform/environment/node/argv'; import { WorkbenchEnvironmentService } from 'vs/workbench/services/environment/node/environmentService'; import { IWindowConfiguration } from 'vs/platform/windows/common/windows'; -import { dirname } from 'vs/base/common/resources'; -class TestBackupEnvironmentService extends WorkbenchEnvironmentService { +class TestEnvironmentService extends WorkbenchEnvironmentService { constructor(private _appSettingsHome: URI) { super(parseArgs(process.argv) as IWindowConfiguration, process.execPath); @@ -81,7 +80,7 @@ suite('KeybindingsEditing', () => { instantiationService = new TestInstantiationService(); - const environmentService = new TestBackupEnvironmentService(URI.file(testDir)); + const environmentService = new TestEnvironmentService(URI.file(testDir)); instantiationService.stub(IEnvironmentService, environmentService); instantiationService.stub(IConfigurationService, ConfigurationService); instantiationService.stub(IConfigurationService, 'getValue', { 'eol': '\n' }); @@ -101,7 +100,7 @@ suite('KeybindingsEditing', () => { const fileService = new FileService(new NullLogService()); const diskFileSystemProvider = new DiskFileSystemProvider(new NullLogService()); fileService.registerProvider(Schemas.file, diskFileSystemProvider); - fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, dirname(environmentService.appSettingsHome), diskFileSystemProvider)); + fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, environmentService.backupHome, diskFileSystemProvider, environmentService)); instantiationService.stub(IFileService, fileService); instantiationService.stub(IUntitledEditorService, instantiationService.createInstance(UntitledEditorService)); instantiationService.stub(ITextFileService, instantiationService.createInstance(TestTextFileService)); diff --git a/src/vs/workbench/services/userData/common/fileUserDataProvider.ts b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts index d4dd8d7abb7..008fc7d2b98 100644 --- a/src/vs/workbench/services/userData/common/fileUserDataProvider.ts +++ b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts @@ -10,7 +10,7 @@ import { URI } from 'vs/base/common/uri'; import * as resources from 'vs/base/common/resources'; import { startsWith } from 'vs/base/common/strings'; import { BACKUPS } from 'vs/platform/environment/common/environment'; -import { Schemas } from 'vs/base/common/network'; +import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; export class FileUserDataProvider extends Disposable implements IFileSystemProviderWithFileReadWriteCapability, IFileSystemProviderWithOpenReadWriteCloseCapability { @@ -20,15 +20,20 @@ export class FileUserDataProvider extends Disposable implements IFileSystemProvi private readonly _onDidChangeFile: Emitter = this._register(new Emitter()); readonly onDidChangeFile: Event = this._onDidChangeFile.event; + private readonly userDataHome: URI; + constructor( - private readonly userDataHome: URI, - private readonly backupsHome: URI, + private readonly fileSystemUserDataHome: URI, + private readonly fileSystemBackupsHome: URI, private readonly fileSystemProvider: IFileSystemProviderWithFileReadWriteCapability | IFileSystemProviderWithOpenReadWriteCloseCapability, + environmentService: IWorkbenchEnvironmentService ) { super(); + this.userDataHome = environmentService.userRoamingDataHome; + // Assumption: This path always exists - this._register(this.fileSystemProvider.watch(this.userDataHome, { recursive: false, excludes: [] })); + this._register(this.fileSystemProvider.watch(this.fileSystemUserDataHome, { recursive: false, excludes: [] })); this._register(this.fileSystemProvider.onDidChangeFile(e => this.handleFileChanges(e))); } @@ -115,21 +120,21 @@ export class FileUserDataProvider extends Disposable implements IFileSystemProvi } private toFileSystemResource(userDataResource: URI): URI { - const fileSystemResource = userDataResource.with({ scheme: this.userDataHome.scheme }); - const relativePath = resources.relativePath(this.userDataHome, fileSystemResource); - if (relativePath && startsWith(relativePath, BACKUPS)) { - return resources.joinPath(resources.dirname(this.backupsHome), relativePath); + const relativePath = resources.relativePath(this.userDataHome, userDataResource)!; + if (startsWith(relativePath, BACKUPS)) { + return resources.joinPath(resources.dirname(this.fileSystemBackupsHome), relativePath); } - return fileSystemResource; + return resources.joinPath(this.fileSystemUserDataHome, relativePath); } private toUserDataResource(fileSystemResource: URI): URI | null { - if (resources.relativePath(this.userDataHome, fileSystemResource)) { - return fileSystemResource.with({ scheme: Schemas.userData }); + const userDataRelativePath = resources.relativePath(this.fileSystemUserDataHome, fileSystemResource); + if (userDataRelativePath) { + return resources.joinPath(this.userDataHome, userDataRelativePath); } - const relativePath = resources.relativePath(this.backupsHome, fileSystemResource); - if (relativePath) { - return resources.joinPath(this.userDataHome, BACKUPS, relativePath).with({ scheme: Schemas.userData }); + const backupRelativePath = resources.relativePath(this.fileSystemBackupsHome, fileSystemResource); + if (backupRelativePath) { + return resources.joinPath(this.userDataHome, BACKUPS, backupRelativePath); } return null; } From 9ab8300e4a42e9244d86c63e1e52927e2a4b1684 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 5 Jul 2019 12:51:46 +0200 Subject: [PATCH 1132/1449] insta :lipstick: --- .../common/instantiationService.ts | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/vs/platform/instantiation/common/instantiationService.ts b/src/vs/platform/instantiation/common/instantiationService.ts index 6b3e8d76c17..7b330d9a35d 100644 --- a/src/vs/platform/instantiation/common/instantiationService.ts +++ b/src/vs/platform/instantiation/common/instantiationService.ts @@ -19,13 +19,20 @@ const _enableTracing = false; declare var Proxy: any; const _canUseProxy = typeof Proxy === 'function'; +class CyclicDependencyError extends Error { + constructor(graph: Graph) { + super('cyclic dependency between services'); + this.message = graph.toString(); + } +} + export class InstantiationService implements IInstantiationService { _serviceBrand: any; - protected readonly _services: ServiceCollection; - protected readonly _strict: boolean; - protected readonly _parent?: InstantiationService; + private readonly _services: ServiceCollection; + private readonly _strict: boolean; + private readonly _parent?: InstantiationService; constructor(services: ServiceCollection = new ServiceCollection(), strict: boolean = false, parent?: InstantiationService) { this._services = services; @@ -143,27 +150,19 @@ export class InstantiationService implements IInstantiationService { type Triple = { id: ServiceIdentifier, desc: SyncDescriptor, _trace: Trace }; const graph = new Graph(data => data.id.toString()); - function throwCycleError() { - const err = new Error('[createInstance] cyclic dependency between services'); - err.message = graph.toString(); - throw err; - } - - let count = 0; + let cycleCount = 0; const stack = [{ id, desc, _trace }]; while (stack.length) { const item = stack.pop()!; graph.lookupOrInsertNode(item); - // TODO@joh use the graph to find a cycle - // a weak heuristic for cycle checks - if (count++ > 100) { - throwCycleError(); + // a weak but working heuristic for cycle checks + if (cycleCount++ > 100) { + throw new CyclicDependencyError(graph); } // check all dependencies for existence and if they need to be created first - let dependencies = _util.getServiceDependencies(item.desc.ctor); - for (let dependency of dependencies) { + for (let dependency of _util.getServiceDependencies(item.desc.ctor)) { let instanceOrDesc = this._getServiceInstanceOrDescriptor(dependency.id); if (!instanceOrDesc && !dependency.optional) { @@ -179,18 +178,18 @@ export class InstantiationService implements IInstantiationService { } while (true) { - let roots = graph.roots(); + const roots = graph.roots(); // if there is no more roots but still // nodes in the graph we have a cycle if (roots.length === 0) { if (!graph.isEmpty()) { - throwCycleError(); + throw new CyclicDependencyError(graph); } break; } - for (let { data } of roots) { + for (const { data } of roots) { // create instance and overwrite the service collections const instance = this._createServiceInstanceWithOwner(data.id, data.desc.ctor, data.desc.staticArguments, data.desc.supportsDelayedInstantiation, data._trace); this._setServiceInstance(data.id, instance); From 6b519e5bc20a3e063bee49ec0e719735a527542d Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 5 Jul 2019 12:53:39 +0200 Subject: [PATCH 1133/1449] remove unused dispose --- .../workbench/api/common/extHostDocumentContentProviders.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/vs/workbench/api/common/extHostDocumentContentProviders.ts b/src/vs/workbench/api/common/extHostDocumentContentProviders.ts index 2c2984a42d3..196b5d2bfe3 100644 --- a/src/vs/workbench/api/common/extHostDocumentContentProviders.ts +++ b/src/vs/workbench/api/common/extHostDocumentContentProviders.ts @@ -29,10 +29,6 @@ export class ExtHostDocumentContentProvider implements ExtHostDocumentContentPro this._proxy = mainContext.getProxy(MainContext.MainThreadDocumentContentProviders); } - dispose(): void { - // todo@joh - } - registerTextDocumentContentProvider(scheme: string, provider: vscode.TextDocumentContentProvider): vscode.Disposable { // todo@remote // check with scheme from fs-providers! From 118e3517522060ec45ccbba606ec908cffd175a3 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 5 Jul 2019 13:04:45 +0200 Subject: [PATCH 1134/1449] debt - use DisposableStore in more places --- .../goToDefinition/goToDefinitionMouse.ts | 15 +++--- .../contrib/snippet/snippetController2.ts | 15 +++--- .../suggest/suggestCommitCharacters.ts | 14 +++--- .../contrib/suggest/suggestController.ts | 46 ++++++++----------- 4 files changed, 41 insertions(+), 49 deletions(-) diff --git a/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.ts b/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.ts index 5c81fdeae57..717c7ba4d13 100644 --- a/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.ts +++ b/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.ts @@ -16,7 +16,7 @@ import { DefinitionProviderRegistry, LocationLink } from 'vs/editor/common/modes import { ICodeEditor, IMouseTarget, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { registerEditorContribution } from 'vs/editor/browser/editorExtensions'; import { getDefinitionsAtPosition } from './goToDefinition'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { DisposableStore } from 'vs/base/common/lifecycle'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { editorActiveLinkForeground } from 'vs/platform/theme/common/colorRegistry'; @@ -33,7 +33,7 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC static MAX_SOURCE_PREVIEW_LINES = 8; private readonly editor: ICodeEditor; - private toUnhook: IDisposable[]; + private readonly toUnhook = new DisposableStore(); private decorations: string[]; private currentWordUnderMouse: IWordAtPosition | null; private previousPromise: CancelablePromise | null; @@ -43,19 +43,18 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC @ITextModelService private readonly textModelResolverService: ITextModelService, @IModeService private readonly modeService: IModeService ) { - this.toUnhook = []; this.decorations = []; this.editor = editor; this.previousPromise = null; let linkGesture = new ClickLinkGesture(editor); - this.toUnhook.push(linkGesture); + this.toUnhook.add(linkGesture); - this.toUnhook.push(linkGesture.onMouseMoveOrRelevantKeyDown(([mouseEvent, keyboardEvent]) => { + this.toUnhook.add(linkGesture.onMouseMoveOrRelevantKeyDown(([mouseEvent, keyboardEvent]) => { this.startFindDefinition(mouseEvent, withNullAsUndefined(keyboardEvent)); })); - this.toUnhook.push(linkGesture.onExecute((mouseEvent: ClickLinkMouseEvent) => { + this.toUnhook.add(linkGesture.onExecute((mouseEvent: ClickLinkMouseEvent) => { if (this.isEnabled(mouseEvent)) { this.gotoDefinition(mouseEvent.target, mouseEvent.hasSideBySideModifier).then(() => { this.removeDecorations(); @@ -66,7 +65,7 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC } })); - this.toUnhook.push(linkGesture.onCancel(() => { + this.toUnhook.add(linkGesture.onCancel(() => { this.removeDecorations(); this.currentWordUnderMouse = null; })); @@ -303,7 +302,7 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC } public dispose(): void { - this.toUnhook = dispose(this.toUnhook); + this.toUnhook.dispose(); } } diff --git a/src/vs/editor/contrib/snippet/snippetController2.ts b/src/vs/editor/contrib/snippet/snippetController2.ts index daccfa9eec8..214b0f390eb 100644 --- a/src/vs/editor/contrib/snippet/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/snippetController2.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; -import { dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { dispose, DisposableStore } from 'vs/base/common/lifecycle'; import { repeat } from 'vs/base/common/strings'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorCommand, registerEditorCommand, registerEditorContribution } from 'vs/editor/browser/editorExtensions'; @@ -35,7 +35,7 @@ export class SnippetController2 implements IEditorContribution { private readonly _hasPrevTabstop: IContextKey; private _session?: SnippetSession; - private _snippetListener: IDisposable[] = []; + private _snippetListener = new DisposableStore(); private _modelVersionId: number; private _currentChoice?: Choice; @@ -54,6 +54,7 @@ export class SnippetController2 implements IEditorContribution { this._hasPrevTabstop.reset(); this._hasNextTabstop.reset(); dispose(this._session); + this._snippetListener.dispose(); } getId(): string { @@ -93,7 +94,7 @@ export class SnippetController2 implements IEditorContribution { // don't listen while inserting the snippet // as that is the inflight state causing cancelation - this._snippetListener = dispose(this._snippetListener); + this._snippetListener.clear(); if (undoStopBefore) { this._editor.getModel().pushStackElement(); @@ -113,11 +114,9 @@ export class SnippetController2 implements IEditorContribution { this._updateState(); - this._snippetListener = [ - this._editor.onDidChangeModelContent(e => e.isFlush && this.cancel()), - this._editor.onDidChangeModel(() => this.cancel()), - this._editor.onDidChangeCursorSelection(() => this._updateState()) - ]; + this._snippetListener.add(this._editor.onDidChangeModelContent(e => e.isFlush && this.cancel())); + this._snippetListener.add(this._editor.onDidChangeModel(() => this.cancel())); + this._snippetListener.add(this._editor.onDidChangeCursorSelection(() => this._updateState())); } private _updateState(): void { diff --git a/src/vs/editor/contrib/suggest/suggestCommitCharacters.ts b/src/vs/editor/contrib/suggest/suggestCommitCharacters.ts index ba0789bf893..8a6fca72612 100644 --- a/src/vs/editor/contrib/suggest/suggestCommitCharacters.ts +++ b/src/vs/editor/contrib/suggest/suggestCommitCharacters.ts @@ -4,14 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import { isNonEmptyArray } from 'vs/base/common/arrays'; -import { dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { DisposableStore } from 'vs/base/common/lifecycle'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { ISelectedSuggestion, SuggestWidget } from './suggestWidget'; import { CharacterSet } from 'vs/editor/common/core/characterClassifier'; export class CommitCharacterController { - private _disposables: IDisposable[] = []; + private readonly _disposables = new DisposableStore(); private _active?: { readonly acceptCharacters: CharacterSet; @@ -20,11 +20,11 @@ export class CommitCharacterController { constructor(editor: ICodeEditor, widget: SuggestWidget, accept: (selected: ISelectedSuggestion) => any) { - this._disposables.push(widget.onDidShow(() => this._onItem(widget.getFocusedItem()))); - this._disposables.push(widget.onDidFocus(this._onItem, this)); - this._disposables.push(widget.onDidHide(this.reset, this)); + this._disposables.add(widget.onDidShow(() => this._onItem(widget.getFocusedItem()))); + this._disposables.add(widget.onDidFocus(this._onItem, this)); + this._disposables.add(widget.onDidHide(this.reset, this)); - this._disposables.push(editor.onWillType(text => { + this._disposables.add(editor.onWillType(text => { if (this._active) { const ch = text.charCodeAt(text.length - 1); if (this._active.acceptCharacters.has(ch) && editor.getConfiguration().contribInfo.acceptSuggestionOnCommitCharacter) { @@ -54,6 +54,6 @@ export class CommitCharacterController { } dispose() { - dispose(this._disposables); + this._disposables.dispose(); } } diff --git a/src/vs/editor/contrib/suggest/suggestController.ts b/src/vs/editor/contrib/suggest/suggestController.ts index 0e56a54c170..32c77163d8b 100644 --- a/src/vs/editor/contrib/suggest/suggestController.ts +++ b/src/vs/editor/contrib/suggest/suggestController.ts @@ -7,7 +7,7 @@ import { alert } from 'vs/base/browser/ui/aria/aria'; import { isNonEmptyArray } from 'vs/base/common/arrays'; import { onUnexpectedError } from 'vs/base/common/errors'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; -import { dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { dispose, IDisposable, DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorAction, EditorCommand, registerEditorAction, registerEditorCommand, registerEditorContribution, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { EditOperation } from 'vs/editor/common/core/editOperation'; @@ -45,7 +45,7 @@ export class SuggestController implements IEditorContribution { private readonly _model: SuggestModel; private readonly _widget: IdleValue; private readonly _alternatives: IdleValue; - private _toDispose: IDisposable[] = []; + private readonly _toDispose = new DisposableStore(); private readonly _sticky = false; // for development purposes only @@ -63,23 +63,21 @@ export class SuggestController implements IEditorContribution { const widget = this._instantiationService.createInstance(SuggestWidget, this._editor); - this._toDispose.push(widget); - this._toDispose.push(widget.onDidSelect(item => this._insertSuggestion(item, false, true), this)); + this._toDispose.add(widget); + this._toDispose.add(widget.onDidSelect(item => this._insertSuggestion(item, false, true), this)); // Wire up logic to accept a suggestion on certain characters const commitCharacterController = new CommitCharacterController(this._editor, widget, item => this._insertSuggestion(item, false, true)); - this._toDispose.push( - commitCharacterController, - this._model.onDidSuggest(e => { - if (e.completionModel.items.length === 0) { - commitCharacterController.reset(); - } - }) - ); + this._toDispose.add(commitCharacterController); + this._toDispose.add(this._model.onDidSuggest(e => { + if (e.completionModel.items.length === 0) { + commitCharacterController.reset(); + } + })); // Wire up makes text edit context key let makesTextEdit = SuggestContext.MakesTextEdit.bindTo(this._contextKeyService); - this._toDispose.push(widget.onDidFocus(({ item }) => { + this._toDispose.add(widget.onDidFocus(({ item }) => { const position = this._editor.getPosition()!; const startColumn = item.completion.range.startColumn; @@ -103,36 +101,32 @@ export class SuggestController implements IEditorContribution { } makesTextEdit.set(value); })); - this._toDispose.push({ - dispose() { makesTextEdit.reset(); } - }); + this._toDispose.add(toDisposable(() => makesTextEdit.reset())); return widget; }); this._alternatives = new IdleValue(() => { - let res = new SuggestAlternatives(this._editor, this._contextKeyService); - this._toDispose.push(res); - return res; + return this._toDispose.add(new SuggestAlternatives(this._editor, this._contextKeyService)); }); - this._toDispose.push(_instantiationService.createInstance(WordContextKey, _editor)); + this._toDispose.add(_instantiationService.createInstance(WordContextKey, _editor)); - this._toDispose.push(this._model.onDidTrigger(e => { + this._toDispose.add(this._model.onDidTrigger(e => { this._widget.getValue().showTriggered(e.auto, e.shy ? 250 : 50); })); - this._toDispose.push(this._model.onDidSuggest(e => { + this._toDispose.add(this._model.onDidSuggest(e => { if (!e.shy) { let index = this._memoryService.select(this._editor.getModel()!, this._editor.getPosition()!, e.completionModel.items); this._widget.getValue().showSuggestions(e.completionModel, index, e.isFrozen, e.auto); } })); - this._toDispose.push(this._model.onDidCancel(e => { + this._toDispose.add(this._model.onDidCancel(e => { if (this._widget && !e.retrigger) { this._widget.getValue().hideWidget(); } })); - this._toDispose.push(this._editor.onDidBlurEditorWidget(() => { + this._toDispose.add(this._editor.onDidBlurEditorWidget(() => { if (!this._sticky) { this._model.cancel(); this._model.clear(); @@ -145,7 +139,7 @@ export class SuggestController implements IEditorContribution { const { acceptSuggestionOnEnter } = this._editor.getConfiguration().contribInfo; acceptSuggestionsOnEnter.set(acceptSuggestionOnEnter === 'on' || acceptSuggestionOnEnter === 'smart'); }; - this._toDispose.push(this._editor.onDidChangeConfiguration((e) => updateFromConfig())); + this._toDispose.add(this._editor.onDidChangeConfiguration((e) => updateFromConfig())); updateFromConfig(); } @@ -155,7 +149,7 @@ export class SuggestController implements IEditorContribution { } dispose(): void { - this._toDispose = dispose(this._toDispose); + this._toDispose.dispose(); this._widget.dispose(); if (this._model) { this._model.dispose(); From 8cbdf09ab0841d9efbb771671501e5bb40d53389 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 5 Jul 2019 13:12:09 +0200 Subject: [PATCH 1135/1449] make back up workspace path URI --- src/vs/platform/windows/common/windows.ts | 1 + .../backup/common/backupFileService.ts | 18 +++++++++--------- .../environment/node/environmentService.ts | 1 + .../workspaceEditingService.ts | 2 +- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index 1f64adccc5b..d9e25ebfa2c 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -419,6 +419,7 @@ export interface IWindowConfiguration extends ParsedArgs { nodeCachedDataDir?: string; backupPath?: string; + backupWorkspaceResource?: URI; workspace?: IWorkspaceIdentifier; folderUri?: ISingleFolderWorkspaceIdentifier; diff --git a/src/vs/workbench/services/backup/common/backupFileService.ts b/src/vs/workbench/services/backup/common/backupFileService.ts index bb3cba3455f..7571d65ba6a 100644 --- a/src/vs/workbench/services/backup/common/backupFileService.ts +++ b/src/vs/workbench/services/backup/common/backupFileService.ts @@ -114,9 +114,9 @@ export class BackupFileService implements IBackupFileService { @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, @IFileService fileService: IFileService ) { - const backupWorkspacePath = environmentService.configuration.backupPath; - if (backupWorkspacePath) { - this.impl = new BackupFileServiceImpl(backupWorkspacePath, this.hashPath, environmentService, fileService); + const backupWorkspaceResource = environmentService.configuration.backupWorkspaceResource; + if (backupWorkspaceResource) { + this.impl = new BackupFileServiceImpl(backupWorkspaceResource, this.hashPath, environmentService, fileService); } else { this.impl = new InMemoryBackupFileService(this.hashPath); } @@ -127,9 +127,9 @@ export class BackupFileService implements IBackupFileService { return hash(str).toString(16); } - initialize(backupWorkspacePath: string): void { + initialize(backupWorkspaceResource: URI): void { if (this.impl instanceof BackupFileServiceImpl) { - this.impl.initialize(backupWorkspacePath); + this.impl.initialize(backupWorkspaceResource); } } @@ -181,7 +181,7 @@ class BackupFileServiceImpl implements IBackupFileService { private ioOperationQueues: ResourceQueue; // queue IO operations to ensure write order constructor( - backupWorkspacePath: string, + backupWorkspaceResource: URI, private readonly hashPath: (resource: URI) => string, @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, @IFileService private readonly fileService: IFileService @@ -189,11 +189,11 @@ class BackupFileServiceImpl implements IBackupFileService { this.isShuttingDown = false; this.ioOperationQueues = new ResourceQueue(); - this.initialize(backupWorkspacePath); + this.initialize(backupWorkspaceResource); } - initialize(backupWorkspacePath: string): void { - this.backupWorkspacePath = joinPath(this.environmentService.userRoamingDataHome, relativePath(URI.file(this.environmentService.userDataPath), URI.file(backupWorkspacePath))!); + initialize(backupWorkspaceResource: URI): void { + this.backupWorkspacePath = joinPath(this.environmentService.userRoamingDataHome, relativePath(URI.file(this.environmentService.userDataPath), backupWorkspaceResource)!); this.ready = this.init(); } diff --git a/src/vs/workbench/services/environment/node/environmentService.ts b/src/vs/workbench/services/environment/node/environmentService.ts index 48be78c71f7..666d4f42506 100644 --- a/src/vs/workbench/services/environment/node/environmentService.ts +++ b/src/vs/workbench/services/environment/node/environmentService.ts @@ -19,6 +19,7 @@ export class WorkbenchEnvironmentService extends EnvironmentService implements I execPath: string ) { super(_configuration, execPath); + this._configuration.backupWorkspaceResource = this._configuration.backupPath ? URI.file(this._configuration.backupPath) : undefined; } get configuration(): IWindowConfiguration { diff --git a/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts b/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts index 8d8bacc2b13..7bd45172d26 100644 --- a/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts +++ b/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts @@ -397,7 +397,7 @@ export class WorkspaceEditingService implements IWorkspaceEditingService { await this.migrateStorage(result.workspace); // Reinitialize backup service if (this.backupFileService instanceof BackupFileService) { - this.backupFileService.initialize(result.backupPath!); + this.backupFileService.initialize(URI.file(result.backupPath!)); } } From ef893f0cfe7d80bd695005cfea24d481a4722bb3 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 5 Jul 2019 14:05:49 +0200 Subject: [PATCH 1136/1449] Revert build perf --- build/.cachesalt | 1 - build/azure-pipelines/compile.yml | 78 +++++++++++ .../darwin/product-build-darwin.yml | 59 ++++----- .../alpine/build.sh => build-alpine.sh} | 0 .../alpine/prebuild.sh => build-arm.sh} | 0 .../alpine/publish.sh => prebuild-alpine.sh} | 0 .../armhf/build.sh => prebuild-arm.sh} | 0 .../linux/product-build-linux-alpine.yml | 108 ++++++++++++++++ ...tiarch.yml => product-build-linux-arm.yml} | 43 +++---- .../linux/product-build-linux.yml | 61 +++++---- .../armhf/prebuild.sh => publish-alpine.sh} | 0 .../armhf/publish.sh => publish-arm.sh} | 0 build/azure-pipelines/product-build.yml | 47 +++---- build/azure-pipelines/product-compile.yml | 121 ------------------ .../win32/product-build-win32.yml | 65 ++++++---- build/gulpfile.compile.js | 2 - build/gulpfile.vscode.js | 25 +--- package.json | 4 +- .../keybinding/browser/keybindingService.ts | 2 +- .../textfile/test/textFileService.io.test.ts | 5 +- 20 files changed, 324 insertions(+), 297 deletions(-) delete mode 100644 build/.cachesalt create mode 100644 build/azure-pipelines/compile.yml rename build/azure-pipelines/linux/{multiarch/alpine/build.sh => build-alpine.sh} (100%) rename build/azure-pipelines/linux/{multiarch/alpine/prebuild.sh => build-arm.sh} (100%) rename build/azure-pipelines/linux/{multiarch/alpine/publish.sh => prebuild-alpine.sh} (100%) rename build/azure-pipelines/linux/{multiarch/armhf/build.sh => prebuild-arm.sh} (100%) create mode 100644 build/azure-pipelines/linux/product-build-linux-alpine.yml rename build/azure-pipelines/linux/{product-build-linux-multiarch.yml => product-build-linux-arm.yml} (68%) rename build/azure-pipelines/linux/{multiarch/armhf/prebuild.sh => publish-alpine.sh} (100%) rename build/azure-pipelines/linux/{multiarch/armhf/publish.sh => publish-arm.sh} (100%) delete mode 100644 build/azure-pipelines/product-compile.yml diff --git a/build/.cachesalt b/build/.cachesalt deleted file mode 100644 index 56a6051ca2b..00000000000 --- a/build/.cachesalt +++ /dev/null @@ -1 +0,0 @@ -1 \ No newline at end of file diff --git a/build/azure-pipelines/compile.yml b/build/azure-pipelines/compile.yml new file mode 100644 index 00000000000..a6b7f79a8a5 --- /dev/null +++ b/build/azure-pipelines/compile.yml @@ -0,0 +1,78 @@ +steps: +- task: AzureKeyVault@1 + displayName: 'Azure Key Vault: Get Secrets' + inputs: + azureSubscription: 'vscode-builds-subscription' + KeyVaultName: vscode + +- task: NodeTool@0 + inputs: + versionSpec: "10.15.1" + +- script: | + set -e + cat << EOF > ~/.netrc + machine monacotools.visualstudio.com + password $(devops-pat) + machine github.com + login vscode + password $(github-distro-mixin-password) + EOF + git config user.email "vscode@microsoft.com" + git config user.name "VSCode" + displayName: Prepare tooling + +- script: | + set -e + git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git" + git fetch distro + git merge $(node -p "require('./package.json').distro") + displayName: Merge distro + +# - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 +# inputs: +# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' +# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' +# vstsFeed: '$(ArtifactFeed)' + +- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 + inputs: + versionSpec: "1.10.1" + +- script: 'yarn --frozen-lockfile' + displayName: Install Dependencies + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) + +# - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 +# inputs: +# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' +# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' +# vstsFeed: '$(ArtifactFeed)' +# condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) + +- script: 'yarn gulp mixin' + displayName: Mix in quality + +- script: 'yarn gulp hygiene' + displayName: Run hygiene checks + +- script: 'yarn monaco-compile-check' + displayName: Run Monaco compilation checks + +- script: | + set -e + cd $BUILD_STAGINGDIRECTORY + git clone https://github.com/microsoft/vscode-telemetry-extractor.git + cd vscode-telemetry-extractor + git checkout 3b04aba5bfdfcca1a5426cd2c51a90d18740d0bc + npm i + npm run setup-extension-repos + node ./out/cli-extract.js --sourceDir $BUILD_SOURCESDIRECTORY --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents + node ./out/cli-extract-extensions.js --sourceDir ./src/telemetry-sources --outputDir . --applyEndpoints --includeIsMeasurement + mkdir -p $BUILD_SOURCESDIRECTORY/.build/telemetry + mv declarations-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-core.json + mv declarations-extensions-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-extensions.json + displayName: Extract Telemetry + +- script: 'VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" ./build/azure-pipelines/linux/build.sh' + displayName: Build \ No newline at end of file diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index 2fcc73f632d..14d3acdf422 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -1,23 +1,4 @@ steps: -- script: | - mkdir -p .build - echo -n $BUILD_SOURCEVERSION > .build/commit - displayName: Prepare cache flag - -- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 - inputs: - keyfile: '.build/commit' - targetfolder: '.build, **/out-build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' - vstsFeed: 'npm-vscode' - platformIndependent: true - alias: 'Compilation' - -- script: | - set -e - exit 1 - displayName: Check RestoreCache - condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) - - task: NodeTool@0 inputs: versionSpec: "10.15.1" @@ -56,19 +37,19 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' - script: | set -e - CHILD_CONCURRENCY=1 yarn --frozen-lockfile + yarn --frozen-lockfile displayName: Install dependencies condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) @@ -79,12 +60,6 @@ steps: displayName: Run postinstall scripts condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) -- script: | - set -e - node build/azure-pipelines/common/installDistroDependencies.js - node build/azure-pipelines/common/installDistroDependencies.js remote - displayName: Install distro dependencies - - script: | set -e yarn gulp mixin @@ -92,12 +67,34 @@ steps: - script: | set -e + yarn gulp hygiene + yarn monaco-compile-check + displayName: Run hygiene checks + condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) + +- script: | + set -e + node build/azure-pipelines/common/installDistroDependencies.js + node build/azure-pipelines/common/installDistroDependencies.js remote + node build/lib/builtInExtensions.js + displayName: Install distro dependencies and extensions + +- script: | + set -e + ./build/azure-pipelines/common/extract-telemetry.sh + displayName: Extract Telemetry + +- script: | + set -e + yarn gulp compile-build + yarn gulp compile-extensions-build-legacy + yarn gulp compile-extensions-build VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-darwin-min-ci + yarn gulp vscode-darwin-ci VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-reh-darwin-min-ci + yarn gulp vscode-reh-darwin-ci VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-web-darwin-min-ci + yarn gulp vscode-web-darwin-ci AZURE_STORAGE_ACCESS_KEY="$(ticino-storage-key)" \ yarn gulp upload-vscode-sourcemaps displayName: Build diff --git a/build/azure-pipelines/linux/multiarch/alpine/build.sh b/build/azure-pipelines/linux/build-alpine.sh similarity index 100% rename from build/azure-pipelines/linux/multiarch/alpine/build.sh rename to build/azure-pipelines/linux/build-alpine.sh diff --git a/build/azure-pipelines/linux/multiarch/alpine/prebuild.sh b/build/azure-pipelines/linux/build-arm.sh similarity index 100% rename from build/azure-pipelines/linux/multiarch/alpine/prebuild.sh rename to build/azure-pipelines/linux/build-arm.sh diff --git a/build/azure-pipelines/linux/multiarch/alpine/publish.sh b/build/azure-pipelines/linux/prebuild-alpine.sh similarity index 100% rename from build/azure-pipelines/linux/multiarch/alpine/publish.sh rename to build/azure-pipelines/linux/prebuild-alpine.sh diff --git a/build/azure-pipelines/linux/multiarch/armhf/build.sh b/build/azure-pipelines/linux/prebuild-arm.sh similarity index 100% rename from build/azure-pipelines/linux/multiarch/armhf/build.sh rename to build/azure-pipelines/linux/prebuild-arm.sh diff --git a/build/azure-pipelines/linux/product-build-linux-alpine.yml b/build/azure-pipelines/linux/product-build-linux-alpine.yml new file mode 100644 index 00000000000..76eb8a660da --- /dev/null +++ b/build/azure-pipelines/linux/product-build-linux-alpine.yml @@ -0,0 +1,108 @@ +steps: +- task: NodeTool@0 + inputs: + versionSpec: "10.15.1" + +- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 + inputs: + versionSpec: "1.10.1" + +- task: AzureKeyVault@1 + displayName: 'Azure Key Vault: Get Secrets' + inputs: + azureSubscription: 'vscode-builds-subscription' + KeyVaultName: vscode + +- task: Docker@1 + displayName: 'Pull image' + inputs: + azureSubscriptionEndpoint: 'vscode-builds-subscription' + azureContainerRegistry: vscodehub.azurecr.io + command: 'Run an image' + imageName: 'vscode-linux-build-agent:alpine' + containerCommand: uname + +- script: | + set -e + + cat << EOF > ~/.netrc + machine monacotools.visualstudio.com + password $(devops-pat) + machine github.com + login vscode + password $(github-distro-mixin-password) + EOF + + git config user.email "vscode@microsoft.com" + git config user.name "VSCode" + displayName: Prepare tooling + +- script: | + set -e + git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git" + git fetch distro + git merge $(node -p "require('./package.json').distro") + displayName: Merge distro + +- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + inputs: + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'npm-vscode' + +- script: | + set -e + yarn --frozen-lockfile + displayName: Install dependencies + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) + +- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 + inputs: + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'npm-vscode' + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) + +- script: | + set -e + yarn postinstall + displayName: Run postinstall scripts + condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) + +- script: | + set -e + yarn gulp mixin + displayName: Mix in quality + +- script: | + set -e + yarn gulp hygiene + yarn monaco-compile-check + displayName: Run hygiene checks + condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) + +- script: | + set -e + ./build/azure-pipelines/linux/prebuild-alpine.sh + displayName: Prepare build + +- script: | + set -e + yarn gulp compile-build + yarn gulp compile-extensions-build-legacy + yarn gulp compile-extensions-build + ./build/azure-pipelines/linux/build-alpine.sh + displayName: Build + +- script: | + set -e + AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ + AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ + VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ + VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ + ./build/azure-pipelines/linux/publish-alpine.sh + displayName: Publish + +- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 + displayName: 'Component Detection' + continueOnError: true \ No newline at end of file diff --git a/build/azure-pipelines/linux/product-build-linux-multiarch.yml b/build/azure-pipelines/linux/product-build-linux-arm.yml similarity index 68% rename from build/azure-pipelines/linux/product-build-linux-multiarch.yml rename to build/azure-pipelines/linux/product-build-linux-arm.yml index fb255944c04..a77751644d0 100644 --- a/build/azure-pipelines/linux/product-build-linux-multiarch.yml +++ b/build/azure-pipelines/linux/product-build-linux-arm.yml @@ -1,23 +1,4 @@ steps: -- script: | - mkdir -p .build - echo -n $BUILD_SOURCEVERSION > .build/commit - displayName: Prepare cache flag - -- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 - inputs: - keyfile: '.build/commit' - targetfolder: '.build, **/out-build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' - vstsFeed: 'npm-vscode' - platformIndependent: true - alias: 'Compilation' - -- script: | - set -e - exit 1 - displayName: Check RestoreCache - condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) - - task: NodeTool@0 inputs: versionSpec: "10.15.1" @@ -38,7 +19,7 @@ steps: azureSubscriptionEndpoint: 'vscode-builds-subscription' azureContainerRegistry: vscodehub.azurecr.io command: 'Run an image' - imageName: 'vscode-linux-build-agent:$(VSCODE_ARCH)' + imageName: 'vscode-linux-build-agent:armhf' containerCommand: uname - script: | @@ -65,19 +46,19 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' - script: | set -e - CHILD_CONCURRENCY=1 yarn --frozen-lockfile + yarn --frozen-lockfile displayName: Install dependencies condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) @@ -95,12 +76,22 @@ steps: - script: | set -e - ./build/azure-pipelines/linux/multiarch/$(VSCODE_ARCH)/prebuild.sh + yarn gulp hygiene + yarn monaco-compile-check + displayName: Run hygiene checks + condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) + +- script: | + set -e + ./build/azure-pipelines/linux/prebuild-arm.sh displayName: Prebuild - script: | set -e - ./build/azure-pipelines/linux/multiarch/$(VSCODE_ARCH)/build.sh + yarn gulp compile-build + yarn gulp compile-extensions-build-legacy + yarn gulp compile-extensions-build + ./build/azure-pipelines/linux/build-arm.sh displayName: Build - script: | @@ -109,7 +100,7 @@ steps: AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ - ./build/azure-pipelines/linux/multiarch/$(VSCODE_ARCH)/publish.sh + ./build/azure-pipelines/linux/publish-arm.sh displayName: Publish - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 369c8abc7d0..0ccfcc6e852 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -1,23 +1,4 @@ steps: -- script: | - mkdir -p .build - echo -n $BUILD_SOURCEVERSION > .build/commit - displayName: Prepare cache flag - -- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 - inputs: - keyfile: '.build/commit' - targetfolder: '.build, **/out-build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' - vstsFeed: 'npm-vscode' - platformIndependent: true - alias: 'Compilation' - -- script: | - set -e - exit 1 - displayName: Check RestoreCache - condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) - - task: NodeTool@0 inputs: versionSpec: "10.15.1" @@ -57,19 +38,19 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' - script: | set -e - CHILD_CONCURRENCY=1 yarn --frozen-lockfile + yarn --frozen-lockfile displayName: Install dependencies condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) @@ -80,12 +61,6 @@ steps: displayName: Run postinstall scripts condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) -- script: | - set -e - node build/azure-pipelines/common/installDistroDependencies.js - node build/azure-pipelines/common/installDistroDependencies.js remote - displayName: Install distro dependencies - - script: | set -e yarn gulp mixin @@ -93,6 +68,28 @@ steps: - script: | set -e + yarn gulp hygiene + yarn monaco-compile-check + displayName: Run hygiene checks + condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) + +- script: | + set -e + node build/azure-pipelines/common/installDistroDependencies.js + node build/azure-pipelines/common/installDistroDependencies.js remote + node build/lib/builtInExtensions.js + displayName: Install distro dependencies and extensions + +- script: | + set -e + ./build/azure-pipelines/common/extract-telemetry.sh + displayName: Extract Telemetry + +- script: | + set -e + yarn gulp compile-build + yarn gulp compile-extensions-build-legacy + yarn gulp compile-extensions-build VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ yarn gulp vscode-linux-$VSCODE_ARCH-min-ci VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ @@ -122,12 +119,12 @@ steps: ./build/azure-pipelines/linux/publish.sh displayName: Publish +- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 + displayName: 'Component Detection' + continueOnError: true + - task: PublishPipelineArtifact@0 displayName: 'Publish Pipeline Artifact' inputs: artifactName: snap-$(VSCODE_ARCH) targetPath: .build/linux/snap-tarball - -- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 - displayName: 'Component Detection' - continueOnError: true diff --git a/build/azure-pipelines/linux/multiarch/armhf/prebuild.sh b/build/azure-pipelines/linux/publish-alpine.sh similarity index 100% rename from build/azure-pipelines/linux/multiarch/armhf/prebuild.sh rename to build/azure-pipelines/linux/publish-alpine.sh diff --git a/build/azure-pipelines/linux/multiarch/armhf/publish.sh b/build/azure-pipelines/linux/publish-arm.sh similarity index 100% rename from build/azure-pipelines/linux/multiarch/armhf/publish.sh rename to build/azure-pipelines/linux/publish-arm.sh diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index ddaabdcdc72..aca968c646d 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -7,54 +7,45 @@ resources: image: snapcore/snapcraft:stable jobs: -- job: Compile - pool: - vmImage: 'Ubuntu-16.04' - variables: - VSCODE_ARCH: x64 - container: vscode-x64 - steps: - - template: product-compile.yml +# - job: Compile +# pool: +# vmImage: 'Ubuntu-16.04' +# steps: +# - template: compile.yml - job: Windows - condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_WIN32'], 'true')) + condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32'], 'true')) timeoutInMinutes: 120 pool: vmImage: VS2017-Win2016 variables: VSCODE_ARCH: x64 - dependsOn: - - Compile steps: - template: win32/product-build-win32.yml - job: Windows32 - condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true')) + condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true')) timeoutInMinutes: 120 pool: vmImage: VS2017-Win2016 variables: VSCODE_ARCH: ia32 - dependsOn: - - Compile steps: - template: win32/product-build-win32.yml - job: Linux - condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_LINUX'], 'true')) + condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) timeoutInMinutes: 120 pool: vmImage: 'Ubuntu-16.04' variables: VSCODE_ARCH: x64 container: vscode-x64 - dependsOn: - - Compile steps: - template: linux/product-build-linux.yml - job: LinuxSnap - condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_LINUX'], 'true')) + condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) timeoutInMinutes: 120 pool: vmImage: 'Ubuntu-16.04' @@ -66,41 +57,35 @@ jobs: - template: linux/snap-build-linux.yml - job: LinuxArmhf - condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) + condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) timeoutInMinutes: 120 pool: vmImage: 'Ubuntu-16.04' variables: VSCODE_ARCH: armhf - dependsOn: - - Compile steps: - - template: linux/product-build-linux-multiarch.yml + - template: linux/product-build-linux-arm.yml - job: LinuxAlpine - condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) + condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) timeoutInMinutes: 120 pool: vmImage: 'Ubuntu-16.04' variables: VSCODE_ARCH: alpine - dependsOn: - - Compile steps: - - template: linux/product-build-linux-multiarch.yml + - template: linux/product-build-linux-alpine.yml - job: macOS - condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_MACOS'], 'true')) + condition: and(succeeded(), eq(variables['VSCODE_BUILD_MACOS'], 'true')) timeoutInMinutes: 120 pool: vmImage: macOS 10.13 - dependsOn: - - Compile steps: - template: darwin/product-build-darwin.yml - job: Release - condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), or(eq(variables['VSCODE_RELEASE'], 'true'), and(or(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['VSCODE_QUALITY'], 'exploration')), eq(variables['Build.Reason'], 'Schedule')))) + condition: and(succeeded(), or(eq(variables['VSCODE_RELEASE'], 'true'), and(or(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['VSCODE_QUALITY'], 'exploration')), eq(variables['Build.Reason'], 'Schedule')))) pool: vmImage: 'Ubuntu-16.04' dependsOn: @@ -117,7 +102,7 @@ jobs: - job: Mooncake pool: vmImage: 'Ubuntu-16.04' - condition: and(succeededOrFailed(), eq(variables['VSCODE_COMPILE_ONLY'], 'false')) + condition: true dependsOn: - Windows - Windows32 diff --git a/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml deleted file mode 100644 index a894140f52d..00000000000 --- a/build/azure-pipelines/product-compile.yml +++ /dev/null @@ -1,121 +0,0 @@ -steps: -- script: | - mkdir -p .build - echo -n $BUILD_SOURCEVERSION > .build/commit - displayName: Prepare cache flag - -- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 - inputs: - keyfile: '.build/commit' - targetfolder: '.build, **/out-build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' - vstsFeed: 'npm-vscode' - platformIndependent: true - alias: 'Compilation' - -- task: NodeTool@0 - inputs: - versionSpec: "10.15.1" - condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) - -- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 - inputs: - versionSpec: "1.10.1" - condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) - -- task: AzureKeyVault@1 - displayName: 'Azure Key Vault: Get Secrets' - inputs: - azureSubscription: 'vscode-builds-subscription' - KeyVaultName: vscode - condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) - -- script: | - set -e - export npm_config_arch="$(VSCODE_ARCH)" - - cat << EOF > ~/.netrc - machine monacotools.visualstudio.com - password $(devops-pat) - machine github.com - login vscode - password $(github-distro-mixin-password) - EOF - - git config user.email "vscode@microsoft.com" - git config user.name "VSCode" - displayName: Prepare tooling - condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) - -- script: | - set -e - git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git" - git fetch distro - git merge $(node -p "require('./package.json').distro") - displayName: Merge distro - condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) - -- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 - inputs: - keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' - targetfolder: '**/node_modules, !**/node_modules/**/node_modules' - vstsFeed: 'npm-vscode' - condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) - -- script: | - set -e - CHILD_CONCURRENCY=1 yarn --frozen-lockfile - displayName: Install dependencies - condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), ne(variables['CacheRestored'], 'true')) - -- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 - inputs: - keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' - targetfolder: '**/node_modules, !**/node_modules/**/node_modules' - vstsFeed: 'npm-vscode' - condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), ne(variables['CacheRestored'], 'true')) - -- script: | - set -e - yarn postinstall - displayName: Run postinstall scripts - condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), eq(variables['CacheRestored'], 'true')) - -- script: | - set -e - node build/azure-pipelines/common/installDistroDependencies.js - node build/azure-pipelines/common/installDistroDependencies.js remote - displayName: Install distro dependencies - condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) - -- script: | - set -e - yarn gulp hygiene - yarn monaco-compile-check - displayName: Run hygiene checks - condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - -- script: | - set - - ./build/azure-pipelines/common/extract-telemetry.sh - displayName: Extract Telemetry - condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) - -- script: | - set -e - yarn gulp compile-build - yarn gulp compile-extensions-build-legacy - yarn gulp compile-extensions-build - yarn gulp minify-vscode - yarn gulp minify-vscode-reh - yarn gulp minify-vscode-web - displayName: Compile - condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) - -- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 - inputs: - keyfile: '.build/commit' - targetfolder: '.build, **/out-build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' - vstsFeed: 'npm-vscode' - platformIndependent: true - alias: 'Compilation' - condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) \ No newline at end of file diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 0aba8e8c3ce..27d2e8ba15d 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -1,23 +1,4 @@ steps: -- powershell: | - mkdir .build -ea 0 - "$env:BUILD_SOURCEVERSION" | Out-File -Encoding ascii -NoNewLine .build\commit - displayName: Prepare cache flag - -- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 - inputs: - keyfile: '.build/commit' - targetfolder: '.build, **/out-build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' - vstsFeed: 'npm-vscode' - platformIndependent: true - alias: 'Compilation' - -- powershell: | - $ErrorActionPreference = "Stop" - exit 1 - displayName: Check RestoreCache - condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) - - task: NodeTool@0 inputs: versionSpec: "10.15.1" @@ -59,7 +40,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: 'build/.cachesalt, .build/arch, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.build/arch, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' @@ -74,7 +55,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: 'build/.cachesalt, .build/arch, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: '.build/arch, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) @@ -86,23 +67,51 @@ steps: displayName: Run postinstall scripts condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) -- powershell: | - . build/azure-pipelines/win32/exec.ps1 - $ErrorActionPreference = "Stop" - exec { node build/azure-pipelines/common/installDistroDependencies.js } - exec { node build/azure-pipelines/common/installDistroDependencies.js remote } - displayName: Install distro dependencies - - powershell: | . build/azure-pipelines/win32/exec.ps1 $ErrorActionPreference = "Stop" exec { yarn gulp mixin } displayName: Mix in quality +- powershell: | + . build/azure-pipelines/win32/exec.ps1 + $ErrorActionPreference = "Stop" + exec { yarn gulp hygiene } + exec { yarn monaco-compile-check } + displayName: Run hygiene checks + condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) + +- powershell: | + . build/azure-pipelines/win32/exec.ps1 + $ErrorActionPreference = "Stop" + exec { node build/azure-pipelines/common/installDistroDependencies.js } + exec { node build/azure-pipelines/common/installDistroDependencies.js remote } + exec { node build/lib/builtInExtensions.js } + displayName: Install distro dependencies and extensions + +- powershell: | + . build/azure-pipelines/win32/exec.ps1 + $ErrorActionPreference = "Stop" + cd $env:BUILD_STAGINGDIRECTORY + exec { git clone https://github.com/microsoft/vscode-telemetry-extractor.git } + cd vscode-telemetry-extractor + exec { git checkout f538e3157c84d1bd0b239dfc5ebccac226006d58 } + exec { npm i } + exec { npm run setup-extension-repos } + exec { node .\out\cli-extract.js --sourceDir $env:BUILD_SOURCESDIRECTORY --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents } + exec { node .\out\cli-extract-extensions.js --sourceDir .\src\telemetry-sources --outputDir . --applyEndpoints --includeIsMeasurement } + mkdir $env:BUILD_SOURCESDIRECTORY\.build\telemetry -ea 0 + mv declarations-resolved.json $env:BUILD_SOURCESDIRECTORY\.build\telemetry\telemetry-core.json + mv declarations-extensions-resolved.json $env:BUILD_SOURCESDIRECTORY\.build\telemetry\telemetry-extensions.json + displayName: Extract Telemetry + - powershell: | . build/azure-pipelines/win32/exec.ps1 $ErrorActionPreference = "Stop" $env:VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" + exec { yarn gulp compile-build } + exec { yarn gulp compile-extensions-build-legacy } + exec { yarn gulp compile-extensions-build } exec { yarn gulp "vscode-win32-$env:VSCODE_ARCH-min-ci" } exec { yarn gulp "vscode-reh-win32-$env:VSCODE_ARCH-min-ci" } exec { yarn gulp "vscode-web-win32-$env:VSCODE_ARCH-min-ci" } diff --git a/build/gulpfile.compile.js b/build/gulpfile.compile.js index 21aa7896558..a32936ef4b2 100644 --- a/build/gulpfile.compile.js +++ b/build/gulpfile.compile.js @@ -5,12 +5,10 @@ 'use strict'; -const gulp = require('gulp'); const util = require('./lib/util'); const task = require('./lib/task'); const compilation = require('./lib/compilation'); // Full compile, including nls and inline sources in sourcemaps, for build const compileBuildTask = task.define('compile-build', task.series(util.rimraf('out-build'), compilation.compileTask('src', 'out-build', true))); -gulp.task(compileBuildTask); exports.compileBuildTask = compileBuildTask; \ No newline at end of file diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 2475b3b6c45..2846595f605 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -104,7 +104,6 @@ const optimizeVSCodeTask = task.define('optimize-vscode', task.series( bundleInfo: undefined }) )); -gulp.task(optimizeVSCodeTask); const sourceMappingURLBase = `https://ticino.blob.core.windows.net/sourcemaps/${commit}`; const minifyVSCodeTask = task.define('minify-vscode', task.series( @@ -118,7 +117,6 @@ const minifyVSCodeTask = task.define('minify-vscode', task.series( }, common.minifyTask('out-vscode', `${sourceMappingURLBase}/core`) )); -gulp.task(minifyVSCodeTask); // Package @@ -309,22 +307,13 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op const telemetry = gulp.src('.build/telemetry/**', { base: '.build/telemetry', dot: true }); - const dependenciesSrc = _.flatten(productionDependencies.map(d => path.relative(root, d.path)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`])); + const depsSrc = [ + ..._.flatten(productionDependencies.map(d => path.relative(root, d.path)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`])), + // @ts-ignore JSON checking: dependencies is optional + ..._.flatten(Object.keys(product.dependencies || {}).map(d => [`node_modules/${d}/**`, `!node_modules/${d}/**/{test,tests}/**`])) + ]; - // Collect distro dependencies, if any - if (quality) { - const qualityPackagePath = path.join(root, 'quality', quality, 'package.json'); - - if (fs.existsSync(qualityPackagePath)) { - const pkg = JSON.parse(fs.readFileSync(qualityPackagePath, 'utf8')); - - // @ts-ignore JSON checking: dependencies is optional - const distroDependencies = _.flatten(Object.keys(pkg.dependencies || {}).map(d => [`node_modules/${d}/**`, `!node_modules/${d}/**/{test,tests}/**`])); - dependenciesSrc.push(...distroDependencies); - } - } - - const deps = gulp.src(dependenciesSrc, { base: '.', dot: true }) + const deps = gulp.src(depsSrc, { base: '.', dot: true }) .pipe(filter(['**', '!**/package-lock.json'])) .pipe(util.cleanNodeModules(path.join(__dirname, '.nativeignore'))) .pipe(createAsar(path.join(process.cwd(), 'node_modules'), ['**/*.node', '**/vscode-ripgrep/bin/*', '**/node-pty/build/Release/*'], 'app/node_modules.asar')); @@ -449,6 +438,7 @@ BUILD_TARGETS.forEach(buildTarget => { const destinationFolderName = `VSCode${dashed(platform)}${dashed(arch)}`; const vscodeTaskCI = task.define(`vscode${dashed(platform)}${dashed(arch)}${dashed(minified)}-ci`, task.series( + minified ? minifyVSCodeTask : optimizeVSCodeTask, util.rimraf(path.join(buildRoot, destinationFolderName)), packageTask(platform, arch, sourceFolderName, destinationFolderName, opts) )); @@ -457,7 +447,6 @@ BUILD_TARGETS.forEach(buildTarget => { const vscodeTask = task.define(`vscode${dashed(platform)}${dashed(arch)}${dashed(minified)}`, task.series( compileBuildTask, compileExtensionsBuildTask, - minified ? minifyVSCodeTask : optimizeVSCodeTask, vscodeTaskCI )); gulp.task(vscodeTask); diff --git a/package.json b/package.json index df3df6ff757..38463fe255f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "65898cd4327756aaf3f5e65f02d0e1edee2db1a9", + "distro": "232f54dd8c50f5bdf086c2c557a42954a41170bd", "author": { "name": "Microsoft Corporation" }, @@ -156,4 +156,4 @@ "windows-mutex": "0.2.1", "windows-process-tree": "0.2.3" } -} \ No newline at end of file +} diff --git a/src/vs/workbench/services/keybinding/browser/keybindingService.ts b/src/vs/workbench/services/keybinding/browser/keybindingService.ts index ed247dae97a..1a165e03627 100644 --- a/src/vs/workbench/services/keybinding/browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/browser/keybindingService.ts @@ -532,7 +532,7 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { mightProducePrintableCharacter(event: IKeyboardEvent): boolean { if (event.ctrlKey || event.metaKey || event.altKey) { - // ignore ctrl/cmd/alt-combination but not shift-combinatios + // ignore ctrl/cmd-combination but not shift/alt-combinatios return false; } const code = ScanCodeUtils.toEnum(event.code); diff --git a/src/vs/workbench/services/textfile/test/textFileService.io.test.ts b/src/vs/workbench/services/textfile/test/textFileService.io.test.ts index 8d4e1a407d1..3337c56b2a2 100644 --- a/src/vs/workbench/services/textfile/test/textFileService.io.test.ts +++ b/src/vs/workbench/services/textfile/test/textFileService.io.test.ts @@ -247,10 +247,7 @@ suite('Files - TextFileService i/o', () => { } test('write - use encoding (cp1252)', async () => { - const filePath = join(testDir, 'some_cp1252.txt'); - const contents = await readFile(filePath, 'utf8'); - const eol = /\r\n/.test(contents) ? '\r\n' : '\n'; - await testEncodingKeepsData(URI.file(filePath), 'cp1252', ['ObjectCount = LoadObjects("Öffentlicher Ordner");', '', 'Private = "Persönliche Information"', ''].join(eol)); + await testEncodingKeepsData(URI.file(join(testDir, 'some_cp1252.txt')), 'cp1252', ['ObjectCount = LoadObjects("Öffentlicher Ordner");', '', 'Private = "Persönliche Information"', ''].join(isWindows ? '\r\n' : '\n')); }); test('write - use encoding (shiftjis)', async () => { From 19d674f412d53f458da81a5c4290fa7eb2d0ee53 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 5 Jul 2019 14:10:18 +0200 Subject: [PATCH 1137/1449] remove yarn cache --- .../darwin/product-build-darwin.yml | 36 +++++++++---------- .../linux/product-build-linux-alpine.yml | 36 +++++++++---------- .../linux/product-build-linux-arm.yml | 36 +++++++++---------- .../linux/product-build-linux.yml | 36 +++++++++---------- .../win32/product-build-win32.yml | 36 +++++++++---------- 5 files changed, 90 insertions(+), 90 deletions(-) diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index 14d3acdf422..fda58607660 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -35,30 +35,30 @@ steps: git merge $(node -p "require('./package.json').distro") displayName: Merge distro -- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 - inputs: - keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' - targetfolder: '**/node_modules, !**/node_modules/**/node_modules' - vstsFeed: 'npm-vscode' +# - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 +# inputs: +# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' +# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' +# vstsFeed: 'npm-vscode' - script: | set -e - yarn --frozen-lockfile + CHILD_CONCURRENCY=1 yarn --frozen-lockfile displayName: Install dependencies - condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) + # condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) -- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 - inputs: - keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' - targetfolder: '**/node_modules, !**/node_modules/**/node_modules' - vstsFeed: 'npm-vscode' - condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) +# - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 +# inputs: +# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' +# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' +# vstsFeed: 'npm-vscode' +# condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) -- script: | - set -e - yarn postinstall - displayName: Run postinstall scripts - condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) +# - script: | +# set -e +# yarn postinstall +# displayName: Run postinstall scripts + # condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) - script: | set -e diff --git a/build/azure-pipelines/linux/product-build-linux-alpine.yml b/build/azure-pipelines/linux/product-build-linux-alpine.yml index 76eb8a660da..50f490b46a7 100644 --- a/build/azure-pipelines/linux/product-build-linux-alpine.yml +++ b/build/azure-pipelines/linux/product-build-linux-alpine.yml @@ -44,30 +44,30 @@ steps: git merge $(node -p "require('./package.json').distro") displayName: Merge distro -- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 - inputs: - keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' - targetfolder: '**/node_modules, !**/node_modules/**/node_modules' - vstsFeed: 'npm-vscode' +# - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 +# inputs: +# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' +# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' +# vstsFeed: 'npm-vscode' - script: | set -e - yarn --frozen-lockfile + CHILD_CONCURRENCY=1 yarn --frozen-lockfile displayName: Install dependencies - condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) + # condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) -- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 - inputs: - keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' - targetfolder: '**/node_modules, !**/node_modules/**/node_modules' - vstsFeed: 'npm-vscode' - condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) +# - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 +# inputs: +# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' +# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' +# vstsFeed: 'npm-vscode' +# condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) -- script: | - set -e - yarn postinstall - displayName: Run postinstall scripts - condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) +# - script: | +# set -e +# yarn postinstall +# displayName: Run postinstall scripts +# condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) - script: | set -e diff --git a/build/azure-pipelines/linux/product-build-linux-arm.yml b/build/azure-pipelines/linux/product-build-linux-arm.yml index a77751644d0..9c79d33a93e 100644 --- a/build/azure-pipelines/linux/product-build-linux-arm.yml +++ b/build/azure-pipelines/linux/product-build-linux-arm.yml @@ -44,30 +44,30 @@ steps: git merge $(node -p "require('./package.json').distro") displayName: Merge distro -- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 - inputs: - keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' - targetfolder: '**/node_modules, !**/node_modules/**/node_modules' - vstsFeed: 'npm-vscode' +# - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 +# inputs: +# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' +# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' +# vstsFeed: 'npm-vscode' - script: | set -e - yarn --frozen-lockfile + CHILD_CONCURRENCY=1 yarn --frozen-lockfile displayName: Install dependencies - condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) + # condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) -- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 - inputs: - keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' - targetfolder: '**/node_modules, !**/node_modules/**/node_modules' - vstsFeed: 'npm-vscode' - condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) +# - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 +# inputs: +# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' +# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' +# vstsFeed: 'npm-vscode' +# condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) -- script: | - set -e - yarn postinstall - displayName: Run postinstall scripts - condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) +# - script: | +# set -e +# yarn postinstall +# displayName: Run postinstall scripts +# condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) - script: | set -e diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 0ccfcc6e852..0960b70e59d 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -36,30 +36,30 @@ steps: git merge $(node -p "require('./package.json').distro") displayName: Merge distro -- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 - inputs: - keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' - targetfolder: '**/node_modules, !**/node_modules/**/node_modules' - vstsFeed: 'npm-vscode' +# - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 +# inputs: +# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' +# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' +# vstsFeed: 'npm-vscode' - script: | set -e - yarn --frozen-lockfile + CHILD_CONCURRENCY=1 yarn --frozen-lockfile displayName: Install dependencies - condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) +# condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) -- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 - inputs: - keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' - targetfolder: '**/node_modules, !**/node_modules/**/node_modules' - vstsFeed: 'npm-vscode' - condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) +# - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 +# inputs: +# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' +# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' +# vstsFeed: 'npm-vscode' +# condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) -- script: | - set -e - yarn postinstall - displayName: Run postinstall scripts - condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) +# - script: | +# set -e +# yarn postinstall +# displayName: Run postinstall scripts +# condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) - script: | set -e diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 27d2e8ba15d..0ccaab54a22 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -38,11 +38,11 @@ steps: exec { git merge $(node -p "require('./package.json').distro") } displayName: Merge distro -- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 - inputs: - keyfile: '.build/arch, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' - targetfolder: '**/node_modules, !**/node_modules/**/node_modules' - vstsFeed: 'npm-vscode' +# - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 +# inputs: +# keyfile: '.build/arch, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' +# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' +# vstsFeed: 'npm-vscode' - powershell: | . build/azure-pipelines/win32/exec.ps1 @@ -51,21 +51,21 @@ steps: $env:CHILD_CONCURRENCY="1" exec { yarn --frozen-lockfile } displayName: Install dependencies - condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) + # condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) -- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 - inputs: - keyfile: '.build/arch, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' - targetfolder: '**/node_modules, !**/node_modules/**/node_modules' - vstsFeed: 'npm-vscode' - condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) +# - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 +# inputs: +# keyfile: '.build/arch, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' +# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' +# vstsFeed: 'npm-vscode' +# condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) -- powershell: | - . build/azure-pipelines/win32/exec.ps1 - $ErrorActionPreference = "Stop" - exec { yarn postinstall } - displayName: Run postinstall scripts - condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) +# - powershell: | +# . build/azure-pipelines/win32/exec.ps1 +# $ErrorActionPreference = "Stop" +# exec { yarn postinstall } +# displayName: Run postinstall scripts +# condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) - powershell: | . build/azure-pipelines/win32/exec.ps1 From 2a88776f07d7d8bebca2e78491b204c6eaf45169 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 5 Jul 2019 14:25:05 +0200 Subject: [PATCH 1138/1449] make backupWorkspaceResource an user data resource --- src/vs/workbench/services/backup/common/backup.ts | 6 ++++++ .../workbench/services/backup/common/backupFileService.ts | 7 +++---- .../services/environment/node/environmentService.ts | 3 ++- .../workspace/electron-browser/workspaceEditingService.ts | 4 ++-- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/services/backup/common/backup.ts b/src/vs/workbench/services/backup/common/backup.ts index 9d1b0208434..9042a44dbdf 100644 --- a/src/vs/workbench/services/backup/common/backup.ts +++ b/src/vs/workbench/services/backup/common/backup.ts @@ -6,6 +6,8 @@ import { URI } from 'vs/base/common/uri'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { ITextBufferFactory, ITextSnapshot } from 'vs/editor/common/model'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { joinPath, relativePath } from 'vs/base/common/resources'; export const IBackupFileService = createDecorator('backupFileService'); @@ -80,3 +82,7 @@ export interface IBackupFileService { */ discardAllWorkspaceBackups(): Promise; } + +export function toBackupWorkspaceResource(backupWorkspacePath: string, environmentService: IEnvironmentService): URI { + return joinPath(environmentService.userRoamingDataHome, relativePath(URI.file(environmentService.userDataPath), URI.file(backupWorkspacePath))!); +} \ No newline at end of file diff --git a/src/vs/workbench/services/backup/common/backupFileService.ts b/src/vs/workbench/services/backup/common/backupFileService.ts index 7571d65ba6a..1e00c93c669 100644 --- a/src/vs/workbench/services/backup/common/backupFileService.ts +++ b/src/vs/workbench/services/backup/common/backupFileService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { join } from 'vs/base/common/path'; -import { joinPath, relativePath } from 'vs/base/common/resources'; +import { joinPath } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { hash } from 'vs/base/common/hash'; import { coalesce } from 'vs/base/common/arrays'; @@ -116,7 +116,7 @@ export class BackupFileService implements IBackupFileService { ) { const backupWorkspaceResource = environmentService.configuration.backupWorkspaceResource; if (backupWorkspaceResource) { - this.impl = new BackupFileServiceImpl(backupWorkspaceResource, this.hashPath, environmentService, fileService); + this.impl = new BackupFileServiceImpl(backupWorkspaceResource, this.hashPath, fileService); } else { this.impl = new InMemoryBackupFileService(this.hashPath); } @@ -183,7 +183,6 @@ class BackupFileServiceImpl implements IBackupFileService { constructor( backupWorkspaceResource: URI, private readonly hashPath: (resource: URI) => string, - @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, @IFileService private readonly fileService: IFileService ) { this.isShuttingDown = false; @@ -193,7 +192,7 @@ class BackupFileServiceImpl implements IBackupFileService { } initialize(backupWorkspaceResource: URI): void { - this.backupWorkspacePath = joinPath(this.environmentService.userRoamingDataHome, relativePath(URI.file(this.environmentService.userDataPath), backupWorkspaceResource)!); + this.backupWorkspacePath = backupWorkspaceResource; this.ready = this.init(); } diff --git a/src/vs/workbench/services/environment/node/environmentService.ts b/src/vs/workbench/services/environment/node/environmentService.ts index 666d4f42506..8b8b9354b63 100644 --- a/src/vs/workbench/services/environment/node/environmentService.ts +++ b/src/vs/workbench/services/environment/node/environmentService.ts @@ -9,6 +9,7 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/ import { memoize } from 'vs/base/common/decorators'; import { URI } from 'vs/base/common/uri'; import { Schemas } from 'vs/base/common/network'; +import { toBackupWorkspaceResource } from 'vs/workbench/services/backup/common/backup'; export class WorkbenchEnvironmentService extends EnvironmentService implements IWorkbenchEnvironmentService { @@ -19,7 +20,7 @@ export class WorkbenchEnvironmentService extends EnvironmentService implements I execPath: string ) { super(_configuration, execPath); - this._configuration.backupWorkspaceResource = this._configuration.backupPath ? URI.file(this._configuration.backupPath) : undefined; + this._configuration.backupWorkspaceResource = this._configuration.backupPath ? toBackupWorkspaceResource(this._configuration.backupPath, this) : undefined; } get configuration(): IWindowConfiguration { diff --git a/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts b/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts index 7bd45172d26..870101c355d 100644 --- a/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts +++ b/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts @@ -16,7 +16,7 @@ import { StorageService } from 'vs/platform/storage/node/storageService'; import { ConfigurationScope, IConfigurationRegistry, Extensions as ConfigurationExtensions, IConfigurationPropertySchema } from 'vs/platform/configuration/common/configurationRegistry'; import { Registry } from 'vs/platform/registry/common/platform'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; -import { IBackupFileService } from 'vs/workbench/services/backup/common/backup'; +import { IBackupFileService, toBackupWorkspaceResource } from 'vs/workbench/services/backup/common/backup'; import { BackupFileService } from 'vs/workbench/services/backup/common/backupFileService'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { distinct } from 'vs/base/common/arrays'; @@ -397,7 +397,7 @@ export class WorkspaceEditingService implements IWorkspaceEditingService { await this.migrateStorage(result.workspace); // Reinitialize backup service if (this.backupFileService instanceof BackupFileService) { - this.backupFileService.initialize(URI.file(result.backupPath!)); + this.backupFileService.initialize(toBackupWorkspaceResource(result.backupPath!, this.environmentService)); } } From ebff1e6beae6e71e0066260ac269d494f7956bdd Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 5 Jul 2019 15:14:40 +0200 Subject: [PATCH 1139/1449] use configuration from environment service --- src/vs/workbench/electron-browser/main.ts | 73 ++++++++++++----------- 1 file changed, 37 insertions(+), 36 deletions(-) diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index 7ba3089f538..82f0dc8930b 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -28,7 +28,6 @@ import { StorageService } from 'vs/platform/storage/node/storageService'; import { LogLevelSetterChannelClient, FollowerLogService } from 'vs/platform/log/common/logIpc'; import { Schemas } from 'vs/base/common/network'; import { sanitizeFilePath } from 'vs/base/common/extpath'; -import { basename } from 'vs/base/common/path'; import { GlobalStorageDatabaseChannelClient } from 'vs/platform/storage/node/storageIpc'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -51,13 +50,16 @@ import { SpdLogService } from 'vs/platform/log/node/spdlogService'; import { SignService } from 'vs/platform/sign/node/signService'; import { ISignService } from 'vs/platform/sign/common/sign'; import { FileUserDataProvider } from 'vs/workbench/services/userData/common/fileUserDataProvider'; +import { basename } from 'vs/base/common/resources'; class CodeRendererMain extends Disposable { private workbench: Workbench; + private readonly environmentService: WorkbenchEnvironmentService; - constructor(private readonly configuration: IWindowConfiguration) { + constructor(configuration: IWindowConfiguration) { super(); + this.environmentService = new WorkbenchEnvironmentService(configuration, configuration.execPath); this.init(); } @@ -71,29 +73,29 @@ class CodeRendererMain extends Disposable { this.reviveUris(); // Setup perf - importEntries(this.configuration.perfEntries); + importEntries(this.environmentService.configuration.perfEntries); // Browser config setZoomFactor(webFrame.getZoomFactor()); // Ensure others can listen to zoom level changes setZoomLevel(webFrame.getZoomLevel(), true /* isTrusted */); // Can be trusted because we are not setting it ourselves (https://github.com/Microsoft/vscode/issues/26151) - setFullscreen(!!this.configuration.fullscreen); + setFullscreen(!!this.environmentService.configuration.fullscreen); // Keyboard support KeyboardMapperFactory.INSTANCE._onKeyboardLayoutChanged(); } private reviveUris() { - if (this.configuration.folderUri) { - this.configuration.folderUri = URI.revive(this.configuration.folderUri); + if (this.environmentService.configuration.folderUri) { + this.environmentService.configuration.folderUri = URI.revive(this.environmentService.configuration.folderUri); } - if (this.configuration.workspace) { - this.configuration.workspace = reviveWorkspaceIdentifier(this.configuration.workspace); + if (this.environmentService.configuration.workspace) { + this.environmentService.configuration.workspace = reviveWorkspaceIdentifier(this.environmentService.configuration.workspace); } - const filesToWait = this.configuration.filesToWait; + const filesToWait = this.environmentService.configuration.filesToWait; const filesToWaitPaths = filesToWait && filesToWait.paths; - [filesToWaitPaths, this.configuration.filesToOpenOrCreate, this.configuration.filesToDiff].forEach(paths => { + [filesToWaitPaths, this.environmentService.configuration.filesToOpenOrCreate, this.environmentService.configuration.filesToDiff].forEach(paths => { if (Array.isArray(paths)) { paths.forEach(path => { if (path.fileUri) { @@ -130,17 +132,17 @@ class CodeRendererMain extends Disposable { this._register(instantiationService.createInstance(ElectronWindow)); // Driver - if (this.configuration.driver) { + if (this.environmentService.configuration.driver) { instantiationService.invokeFunction(async accessor => this._register(await registerWindowDriver(accessor))); } // Config Exporter - if (this.configuration['export-default-configuration']) { + if (this.environmentService.configuration['export-default-configuration']) { instantiationService.createInstance(DefaultConfigurationExportHelper); } // Logging - services.logService.trace('workbench configuration', JSON.stringify(this.configuration)); + services.logService.trace('workbench configuration', JSON.stringify(this.environmentService.configuration)); } private onWindowResize(e: Event, retry: boolean): void { @@ -170,15 +172,14 @@ class CodeRendererMain extends Disposable { // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // Main Process - const mainProcessService = this._register(new MainProcessService(this.configuration.windowId)); + const mainProcessService = this._register(new MainProcessService(this.environmentService.configuration.windowId)); serviceCollection.set(IMainProcessService, mainProcessService); // Environment - const environmentService = new WorkbenchEnvironmentService(this.configuration, this.configuration.execPath); - serviceCollection.set(IWorkbenchEnvironmentService, environmentService); + serviceCollection.set(IWorkbenchEnvironmentService, this.environmentService); // Log - const logService = this._register(this.createLogService(mainProcessService, environmentService)); + const logService = this._register(this.createLogService(mainProcessService, this.environmentService)); serviceCollection.set(ILogService, logService); // Remote @@ -189,7 +190,7 @@ class CodeRendererMain extends Disposable { const signService = new SignService(); serviceCollection.set(ISignService, signService); - const remoteAgentService = this._register(new RemoteAgentService(this.configuration, environmentService, remoteAuthorityResolverService, signService)); + const remoteAgentService = this._register(new RemoteAgentService(this.environmentService.configuration, this.environmentService, remoteAuthorityResolverService, signService)); serviceCollection.set(IRemoteAgentService, remoteAgentService); // Files @@ -200,7 +201,7 @@ class CodeRendererMain extends Disposable { fileService.registerProvider(Schemas.file, diskFileSystemProvider); // User Data Provider - fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, environmentService.backupHome, diskFileSystemProvider, environmentService)); + fileService.registerProvider(Schemas.userData, new FileUserDataProvider(this.environmentService.appSettingsHome, this.environmentService.backupHome, diskFileSystemProvider, this.environmentService)); const connection = remoteAgentService.getConnection(); if (connection) { @@ -210,10 +211,10 @@ class CodeRendererMain extends Disposable { } - const payload = await this.resolveWorkspaceInitializationPayload(environmentService); + const payload = await this.resolveWorkspaceInitializationPayload(); const services = await Promise.all([ - this.createWorkspaceService(payload, environmentService, fileService, remoteAgentService, logService).then(service => { + this.createWorkspaceService(payload, fileService, remoteAgentService, logService).then(service => { // Workspace serviceCollection.set(IWorkspaceContextService, service); @@ -224,7 +225,7 @@ class CodeRendererMain extends Disposable { return service; }), - this.createStorageService(payload, environmentService, logService, mainProcessService).then(service => { + this.createStorageService(payload, logService, mainProcessService).then(service => { // Storage serviceCollection.set(IStorageService, service); @@ -236,25 +237,25 @@ class CodeRendererMain extends Disposable { return { serviceCollection, logService, storageService: services[1] }; } - private async resolveWorkspaceInitializationPayload(environmentService: IWorkbenchEnvironmentService): Promise { + private async resolveWorkspaceInitializationPayload(): Promise { // Multi-root workspace - if (this.configuration.workspace) { - return this.configuration.workspace; + if (this.environmentService.configuration.workspace) { + return this.environmentService.configuration.workspace; } // Single-folder workspace let workspaceInitializationPayload: IWorkspaceInitializationPayload | undefined; - if (this.configuration.folderUri) { - workspaceInitializationPayload = await this.resolveSingleFolderWorkspaceInitializationPayload(this.configuration.folderUri); + if (this.environmentService.configuration.folderUri) { + workspaceInitializationPayload = await this.resolveSingleFolderWorkspaceInitializationPayload(this.environmentService.configuration.folderUri); } // Fallback to empty workspace if we have no payload yet. if (!workspaceInitializationPayload) { let id: string; - if (this.configuration.backupPath) { - id = basename(this.configuration.backupPath); // we know the backupPath must be a unique path so we leverage its name as workspace ID - } else if (environmentService.isExtensionDevelopment) { + if (this.environmentService.configuration.backupWorkspaceResource) { + id = basename(this.environmentService.configuration.backupWorkspaceResource); // we know the backupPath must be a unique path so we leverage its name as workspace ID + } else if (this.environmentService.isExtensionDevelopment) { id = 'ext-dev'; // extension development window never stores backups and is a singleton } else { throw new Error('Unexpected window configuration without backupPath'); @@ -309,8 +310,8 @@ class CodeRendererMain extends Disposable { return; } - private async createWorkspaceService(payload: IWorkspaceInitializationPayload, environmentService: IWorkbenchEnvironmentService, fileService: FileService, remoteAgentService: IRemoteAgentService, logService: ILogService): Promise { - const workspaceService = new WorkspaceService({ remoteAuthority: this.configuration.remoteAuthority, configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, remoteAgentService); + private async createWorkspaceService(payload: IWorkspaceInitializationPayload, fileService: FileService, remoteAgentService: IRemoteAgentService, logService: ILogService): Promise { + const workspaceService = new WorkspaceService({ remoteAuthority: this.environmentService.configuration.remoteAuthority, configurationCache: new ConfigurationCache(this.environmentService) }, this.environmentService, fileService, remoteAgentService); try { await workspaceService.initialize(payload); @@ -324,9 +325,9 @@ class CodeRendererMain extends Disposable { } } - private async createStorageService(payload: IWorkspaceInitializationPayload, environmentService: IWorkbenchEnvironmentService, logService: ILogService, mainProcessService: IMainProcessService): Promise { + private async createStorageService(payload: IWorkspaceInitializationPayload, logService: ILogService, mainProcessService: IMainProcessService): Promise { const globalStorageDatabase = new GlobalStorageDatabaseChannelClient(mainProcessService.getChannel('storage')); - const storageService = new StorageService(globalStorageDatabase, logService, environmentService); + const storageService = new StorageService(globalStorageDatabase, logService, this.environmentService); try { await storageService.initialize(payload); @@ -341,8 +342,8 @@ class CodeRendererMain extends Disposable { } private createLogService(mainProcessService: IMainProcessService, environmentService: IWorkbenchEnvironmentService): ILogService { - const spdlogService = new SpdLogService(`renderer${this.configuration.windowId}`, environmentService.logsPath, this.configuration.logLevel); - const consoleLogService = new ConsoleLogService(this.configuration.logLevel); + const spdlogService = new SpdLogService(`renderer${this.environmentService.configuration.windowId}`, environmentService.logsPath, this.environmentService.configuration.logLevel); + const consoleLogService = new ConsoleLogService(this.environmentService.configuration.logLevel); const logService = new MultiplexLogService([consoleLogService, spdlogService]); const logLevelClient = new LogLevelSetterChannelClient(mainProcessService.getChannel('loglevel')); From 43cb2d68d09819ba736a01fad07d6ae29cf197e0 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Fri, 5 Jul 2019 15:24:45 +0200 Subject: [PATCH 1140/1449] Fix custom tasks (no command) --- src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts index e58c47c4174..87d6820117c 100644 --- a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts @@ -471,7 +471,8 @@ export class TerminalTaskSystem implements ITaskSystem { const resolvedVariables = this.resolveVariablesFromSet(this.currentTask.systemInfo, this.currentTask.workspaceFolder!, task, variables); return resolvedVariables.then((resolvedVariables) => { - if (resolvedVariables && task.command && task.command.name && task.command.runtime) { + const isCustomExecution = task.command.runtime === RuntimeType.CustomExecution; + if (resolvedVariables && task.command && task.command.runtime && (isCustomExecution || task.command.name)) { this.currentTask.resolvedVariables = resolvedVariables; return this.executeInTerminal(task, trigger, new VariableResolver(this.currentTask.workspaceFolder!, this.currentTask.systemInfo, resolvedVariables.variables, this.configurationResolverService)); } else { From fd01fec60d406fa504ab5414bda5a47ac73e08a2 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 5 Jul 2019 15:33:39 +0200 Subject: [PATCH 1141/1449] debug build --- build/azure-pipelines/product-compile.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml index a894140f52d..239fc3b1c90 100644 --- a/build/azure-pipelines/product-compile.yml +++ b/build/azure-pipelines/product-compile.yml @@ -105,12 +105,29 @@ steps: yarn gulp compile-build yarn gulp compile-extensions-build-legacy yarn gulp compile-extensions-build + displayName: Compile + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + +- script: | + set -e + ls -la .build/extensions/ms-vscode.node-debug2/node_modules + displayName: Debug + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + +- script: | + set -e yarn gulp minify-vscode yarn gulp minify-vscode-reh yarn gulp minify-vscode-web displayName: Compile condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) +- script: | + set -e + ls -la .build/extensions/ms-vscode.node-debug2/node_modules + displayName: Debug + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: keyfile: '.build/commit' From c212dda010c1e4ebc9fd297d040df457144ca02a Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 5 Jul 2019 15:49:13 +0200 Subject: [PATCH 1142/1449] enable hot exit on web --- src/vs/workbench/browser/web.main.ts | 15 ++++++++++----- .../environment/browser/environmentService.ts | 13 ++++++++++--- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index f653479fb9b..489f71399a1 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -35,7 +35,8 @@ import { hash } from 'vs/base/common/hash'; import { IWorkbenchConstructionOptions } from 'vs/workbench/workbench.web.api'; import { ProductService } from 'vs/platform/product/browser/productService'; import { FileUserDataProvider } from 'vs/workbench/services/userData/common/fileUserDataProvider'; -import { joinPath, dirname } from 'vs/base/common/resources'; +import { joinPath } from 'vs/base/common/resources'; +import { BACKUPS } from 'vs/platform/environment/common/environment'; class CodeRendererMain extends Disposable { @@ -83,8 +84,14 @@ class CodeRendererMain extends Disposable { const logService = new SimpleLogService(); serviceCollection.set(ILogService, logService); + const payload = await this.resolveWorkspaceInitializationPayload(); + // Environment - const environmentService = new BrowserWorkbenchEnvironmentService(this.configuration); + const environmentService = new BrowserWorkbenchEnvironmentService({ + workspaceId: payload.id, + remoteAuthority: this.configuration.remoteAuthority, + webviewEndpoint: this.configuration.webviewEndpoint + }); serviceCollection.set(IWorkbenchEnvironmentService, environmentService); // Product @@ -118,7 +125,7 @@ class CodeRendererMain extends Disposable { if (!userDataProvider) { const remoteUserDataUri = this.getRemoteUserDataUri(); if (remoteUserDataUri) { - userDataProvider = this._register(new FileUserDataProvider(remoteUserDataUri, dirname(remoteUserDataUri), remoteFileSystemProvider, environmentService)); + userDataProvider = this._register(new FileUserDataProvider(remoteUserDataUri, joinPath(remoteUserDataUri, BACKUPS), remoteFileSystemProvider, environmentService)); } } } @@ -128,8 +135,6 @@ class CodeRendererMain extends Disposable { fileService.registerProvider(Schemas.userData, userDataProvider); } - const payload = await this.resolveWorkspaceInitializationPayload(); - await Promise.all([ this.createWorkspaceService(payload, environmentService, fileService, remoteAgentService, logService).then(service => { diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts index 74cb8d155d8..34b57e9fd73 100644 --- a/src/vs/workbench/services/environment/browser/environmentService.ts +++ b/src/vs/workbench/services/environment/browser/environmentService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IWindowConfiguration, IPath, IPathsToWaitFor } from 'vs/platform/windows/common/windows'; -import { IEnvironmentService, IExtensionHostDebugParams, IDebugParams } from 'vs/platform/environment/common/environment'; +import { IEnvironmentService, IExtensionHostDebugParams, IDebugParams, BACKUPS } from 'vs/platform/environment/common/environment'; import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; import { URI } from 'vs/base/common/uri'; import { IProcessEnvironment } from 'vs/base/common/platform'; @@ -12,7 +12,6 @@ import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier } from 'vs/platf import { ExportData } from 'vs/base/common/performance'; import { LogLevel } from 'vs/platform/log/common/log'; import { joinPath } from 'vs/base/common/resources'; -import { IWorkbenchConstructionOptions } from 'vs/workbench/workbench.web.api'; import { Schemas } from 'vs/base/common/network'; export class BrowserWindowConfiguration implements IWindowConfiguration { @@ -58,12 +57,18 @@ export class BrowserWindowConfiguration implements IWindowConfiguration { termProgram?: string; } +export interface IBrowserWindowConfiguration { + workspaceId: string; + remoteAuthority?: string; + webviewEndpoint?: string; +} + export class BrowserWorkbenchEnvironmentService implements IEnvironmentService { _serviceBrand: ServiceIdentifier; readonly configuration: IWindowConfiguration = new BrowserWindowConfiguration(); - constructor(configuration: IWorkbenchConstructionOptions) { + constructor(configuration: IBrowserWindowConfiguration) { this.args = { _: [] }; this.appRoot = '/web/'; this.appNameLong = 'Visual Studio Code - Web'; @@ -74,6 +79,8 @@ export class BrowserWorkbenchEnvironmentService implements IEnvironmentService { this.keybindingsResource = joinPath(this.userRoamingDataHome, 'keybindings.json'); this.keyboardLayoutResource = joinPath(this.userRoamingDataHome, 'keyboardLayout.json'); this.localeResource = joinPath(this.userRoamingDataHome, 'locale.json'); + this.backupHome = joinPath(this.userRoamingDataHome, BACKUPS); + this.configuration.backupWorkspaceResource = joinPath(this.backupHome, configuration.workspaceId); this.logsPath = '/web/logs'; From c3aaa7ed2780caebcf9b493fce8a01765d378efb Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 5 Jul 2019 15:52:41 +0200 Subject: [PATCH 1143/1449] fix app icon --- build/azure-pipelines/product-compile.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml index 239fc3b1c90..f7170dfa979 100644 --- a/build/azure-pipelines/product-compile.yml +++ b/build/azure-pipelines/product-compile.yml @@ -87,6 +87,14 @@ steps: displayName: Install distro dependencies condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) +# Mixin must run before optimize, because the CSS loader will +# inline small SVGs +- powershell: | + . build/azure-pipelines/win32/exec.ps1 + $ErrorActionPreference = "Stop" + exec { yarn gulp mixin } + displayName: Mix in quality + - script: | set -e yarn gulp hygiene From b4add9fcaacbcb1f91c75e0f1864bc5dab3dd9a5 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 5 Jul 2019 16:11:50 +0200 Subject: [PATCH 1144/1449] remove gulp sequence --- build/gulpfile.extensions.js | 9 +++--- build/lib/extensions.js | 52 ++++++++++-------------------- build/lib/extensions.ts | 62 +++++++++++------------------------- 3 files changed, 40 insertions(+), 83 deletions(-) diff --git a/build/gulpfile.extensions.js b/build/gulpfile.extensions.js index 14e0a99af65..e4f7b58d50a 100644 --- a/build/gulpfile.extensions.js +++ b/build/gulpfile.extensions.js @@ -153,10 +153,11 @@ gulp.task(compileExtensionsBuildLegacyTask); // Azure Pipelines const cleanExtensionsBuildTask = task.define('clean-extensions-build', util.rimraf('.build/extensions')); -const compileExtensionsBuildTask = task.define('compile-extensions-build', task.series(cleanExtensionsBuildTask, () => { - return ext.packageExtensionsStream() - .pipe(gulp.dest('.build')); -})); +const compileExtensionsBuildTask = task.define('compile-extensions-build', task.series( + cleanExtensionsBuildTask, + task.define('bundle-extensions-build', () => ext.packageLocalExtensionsStream().pipe(gulp.dest('.build'))), + task.define('bundle-marketplace-extensions-build', () => ext.packageMarketplaceExtensionsStream().pipe(gulp.dest('.build'))), +)); gulp.task(compileExtensionsBuildTask); exports.compileExtensionsBuildTask = compileExtensionsBuildTask; \ No newline at end of file diff --git a/build/lib/extensions.js b/build/lib/extensions.js index 3d062c0d273..e12f8f14568 100644 --- a/build/lib/extensions.js +++ b/build/lib/extensions.js @@ -81,7 +81,7 @@ function fromLocalWebpack(extensionPath) { return data; })) .pipe(packageJsonFilter.restore); - const webpackStreams = webpackConfigLocations.map(webpackConfigPath => () => { + const webpackStreams = webpackConfigLocations.map(webpackConfigPath => { const webpackDone = (err, stats) => { fancyLog(`Bundled extension: ${ansiColors.yellow(path.join(path.basename(extensionPath), path.relative(extensionPath, webpackConfigPath)))}...`); if (err) { @@ -120,7 +120,7 @@ function fromLocalWebpack(extensionPath) { this.emit('data', data); })); }); - es.merge(sequence(webpackStreams), patchFilesStream) + es.merge(...webpackStreams, patchFilesStream) // .pipe(es.through(function (data) { // // debug // console.log('out', data.path, data.contents.length); @@ -186,29 +186,7 @@ const excludedExtensions = [ 'ms-vscode.node-debug2', ]; const builtInExtensions = require('../builtInExtensions.json'); -/** - * We're doing way too much stuff at once, with webpack et al. So much stuff - * that while downloading extensions from the marketplace, node js doesn't get enough - * stack frames to complete the download in under 2 minutes, at which point the - * marketplace server cuts off the http request. So, we sequentialize the extensino tasks. - */ -function sequence(streamProviders) { - const result = es.through(); - function pop() { - if (streamProviders.length === 0) { - result.emit('end'); - } - else { - const fn = streamProviders.shift(); - fn() - .on('end', function () { setTimeout(pop, 0); }) - .pipe(result, { end: false }); - } - } - pop(); - return result; -} -function packageExtensionsStream() { +function packageLocalExtensionsStream() { const localExtensionDescriptions = glob.sync('extensions/*/package.json') .map(manifestPath => { const extensionPath = path.dirname(path.join(root, manifestPath)); @@ -217,18 +195,20 @@ function packageExtensionsStream() { }) .filter(({ name }) => excludedExtensions.indexOf(name) === -1) .filter(({ name }) => builtInExtensions.every(b => b.name !== name)); - const localExtensions = () => sequence([...localExtensionDescriptions.map(extension => () => { - return fromLocal(extension.path) - .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`)); - })]); - const localExtensionDependencies = () => gulp.src('extensions/node_modules/**', { base: '.' }); - const marketplaceExtensions = () => es.merge(...builtInExtensions - .map(extension => { - return fromMarketplace(extension.name, extension.version, extension.metadata) + return es.merge(gulp.src('extensions/node_modules/**', { base: '.' }), ...localExtensionDescriptions.map(extension => { + return fromLocal(extension.path) .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`)); - })); - return sequence([localExtensions, localExtensionDependencies, marketplaceExtensions]) + })) .pipe(util2.setExecutableBit(['**/*.sh'])) .pipe(filter(['**', '!**/*.js.map'])); } -exports.packageExtensionsStream = packageExtensionsStream; +exports.packageLocalExtensionsStream = packageLocalExtensionsStream; +function packageMarketplaceExtensionsStream() { + return es.merge(builtInExtensions.map(extension => { + return fromMarketplace(extension.name, extension.version, extension.metadata) + .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`)); + })) + .pipe(util2.setExecutableBit(['**/*.sh'])) + .pipe(filter(['**', '!**/*.js.map'])); +} +exports.packageMarketplaceExtensionsStream = packageMarketplaceExtensionsStream; diff --git a/build/lib/extensions.ts b/build/lib/extensions.ts index 014946523df..381d56e2abb 100644 --- a/build/lib/extensions.ts +++ b/build/lib/extensions.ts @@ -93,7 +93,7 @@ function fromLocalWebpack(extensionPath: string): Stream { .pipe(packageJsonFilter.restore); - const webpackStreams = webpackConfigLocations.map(webpackConfigPath => () => { + const webpackStreams = webpackConfigLocations.map(webpackConfigPath => { const webpackDone = (err: any, stats: any) => { fancyLog(`Bundled extension: ${ansiColors.yellow(path.join(path.basename(extensionPath), path.relative(extensionPath, webpackConfigPath)))}...`); @@ -140,7 +140,7 @@ function fromLocalWebpack(extensionPath: string): Stream { })); }); - es.merge(sequence(webpackStreams), patchFilesStream) + es.merge(...webpackStreams, patchFilesStream) // .pipe(es.through(function (data) { // // debug // console.log('out', data.path, data.contents.length); @@ -227,31 +227,7 @@ interface IBuiltInExtension { const builtInExtensions: IBuiltInExtension[] = require('../builtInExtensions.json'); -/** - * We're doing way too much stuff at once, with webpack et al. So much stuff - * that while downloading extensions from the marketplace, node js doesn't get enough - * stack frames to complete the download in under 2 minutes, at which point the - * marketplace server cuts off the http request. So, we sequentialize the extensino tasks. - */ -function sequence(streamProviders: { (): Stream }[]): Stream { - const result = es.through(); - - function pop() { - if (streamProviders.length === 0) { - result.emit('end'); - } else { - const fn = streamProviders.shift()!; - fn() - .on('end', function () { setTimeout(pop, 0); }) - .pipe(result, { end: false }); - } - } - - pop(); - return result; -} - -export function packageExtensionsStream(): NodeJS.ReadWriteStream { +export function packageLocalExtensionsStream(): NodeJS.ReadWriteStream { const localExtensionDescriptions = (glob.sync('extensions/*/package.json')) .map(manifestPath => { const extensionPath = path.dirname(path.join(root, manifestPath)); @@ -261,22 +237,22 @@ export function packageExtensionsStream(): NodeJS.ReadWriteStream { .filter(({ name }) => excludedExtensions.indexOf(name) === -1) .filter(({ name }) => builtInExtensions.every(b => b.name !== name)); - const localExtensions = () => sequence([...localExtensionDescriptions.map(extension => () => { - return fromLocal(extension.path) - .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`)); - })]); - - const localExtensionDependencies = () => gulp.src('extensions/node_modules/**', { base: '.' }); - - const marketplaceExtensions = () => es.merge( - ...builtInExtensions - .map(extension => { - return fromMarketplace(extension.name, extension.version, extension.metadata) - .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`)); - }) - ); - - return sequence([localExtensions, localExtensionDependencies, marketplaceExtensions]) + return es.merge( + gulp.src('extensions/node_modules/**', { base: '.' }), + ...localExtensionDescriptions.map(extension => { + return fromLocal(extension.path) + .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`)); + }) + ) + .pipe(util2.setExecutableBit(['**/*.sh'])) + .pipe(filter(['**', '!**/*.js.map'])); +} + +export function packageMarketplaceExtensionsStream(): NodeJS.ReadWriteStream { + return es.merge(builtInExtensions.map(extension => { + return fromMarketplace(extension.name, extension.version, extension.metadata) + .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`)); + })) .pipe(util2.setExecutableBit(['**/*.sh'])) .pipe(filter(['**', '!**/*.js.map'])); } From a65e9ca4207e173a4bb754d6cb06fe19ff6e31f4 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 5 Jul 2019 16:26:32 +0200 Subject: [PATCH 1145/1449] web - first cut user data provider storage service --- src/vs/base/parts/storage/common/storage.ts | 318 +++++++++++++++++ .../base/{ => parts/storage}/node/storage.ts | 329 +----------------- .../storage/test/node}/storage.test.ts | 3 +- .../multicursor/test/multicursor.test.ts | 3 +- .../storage/browser/storageService.ts | 207 +++++++++++ src/vs/platform/storage/common/storage.ts | 54 +++ src/vs/platform/storage/node/storageIpc.ts | 10 +- .../storage/node/storageMainService.ts | 7 +- .../platform/storage/node/storageService.ts | 89 +---- .../storage/test/node/storageService.test.ts | 2 +- .../browser/actions/developerActions.ts | 23 ++ src/vs/workbench/browser/web.main.ts | 27 +- .../workbench/browser/web.simpleservices.ts | 119 +------ .../electron-browser/main.contribution.ts | 2 - 14 files changed, 650 insertions(+), 543 deletions(-) create mode 100644 src/vs/base/parts/storage/common/storage.ts rename src/vs/base/{ => parts/storage}/node/storage.ts (62%) rename src/vs/base/{test/node/storage => parts/storage/test/node}/storage.test.ts (99%) create mode 100644 src/vs/platform/storage/browser/storageService.ts diff --git a/src/vs/base/parts/storage/common/storage.ts b/src/vs/base/parts/storage/common/storage.ts new file mode 100644 index 00000000000..3f3892a8e19 --- /dev/null +++ b/src/vs/base/parts/storage/common/storage.ts @@ -0,0 +1,318 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; +import { Emitter, Event } from 'vs/base/common/event'; +import { ThrottledDelayer } from 'vs/base/common/async'; +import { isUndefinedOrNull } from 'vs/base/common/types'; + +export enum StorageHint { + + // A hint to the storage that the storage + // does not exist on disk yet. This allows + // the storage library to improve startup + // time by not checking the storage for data. + STORAGE_DOES_NOT_EXIST +} + +export interface IStorageOptions { + hint?: StorageHint; +} + +export interface IUpdateRequest { + insert?: Map; + delete?: Set; +} + +export interface IStorageItemsChangeEvent { + items: Map; +} + +export interface IStorageDatabase { + + readonly onDidChangeItemsExternal: Event; + + getItems(): Promise>; + updateItems(request: IUpdateRequest): Promise; + + close(recovery?: () => Map): Promise; +} + +export interface IStorage extends IDisposable { + + readonly items: Map; + readonly size: number; + readonly onDidChangeStorage: Event; + + init(): Promise; + + get(key: string, fallbackValue: string): string; + get(key: string, fallbackValue?: string): string | undefined; + + getBoolean(key: string, fallbackValue: boolean): boolean; + getBoolean(key: string, fallbackValue?: boolean): boolean | undefined; + + getNumber(key: string, fallbackValue: number): number; + getNumber(key: string, fallbackValue?: number): number | undefined; + + set(key: string, value: string | boolean | number | undefined | null): Promise; + delete(key: string): Promise; + + close(): Promise; +} + +enum StorageState { + None, + Initialized, + Closed +} + +export class Storage extends Disposable implements IStorage { + + private static readonly DEFAULT_FLUSH_DELAY = 100; + + private readonly _onDidChangeStorage: Emitter = this._register(new Emitter()); + get onDidChangeStorage(): Event { return this._onDidChangeStorage.event; } + + private state = StorageState.None; + + private cache: Map = new Map(); + + private flushDelayer: ThrottledDelayer; + + private pendingDeletes: Set = new Set(); + private pendingInserts: Map = new Map(); + + constructor( + protected database: IStorageDatabase, + private options: IStorageOptions = Object.create(null) + ) { + super(); + + this.flushDelayer = this._register(new ThrottledDelayer(Storage.DEFAULT_FLUSH_DELAY)); + + this.registerListeners(); + } + + private registerListeners(): void { + this._register(this.database.onDidChangeItemsExternal(e => this.onDidChangeItemsExternal(e))); + } + + private onDidChangeItemsExternal(e: IStorageItemsChangeEvent): void { + // items that change external require us to update our + // caches with the values. we just accept the value and + // emit an event if there is a change. + e.items.forEach((value, key) => this.accept(key, value)); + } + + private accept(key: string, value: string): void { + if (this.state === StorageState.Closed) { + return; // Return early if we are already closed + } + + let changed = false; + + // Item got removed, check for deletion + if (isUndefinedOrNull(value)) { + changed = this.cache.delete(key); + } + + // Item got updated, check for change + else { + const currentValue = this.cache.get(key); + if (currentValue !== value) { + this.cache.set(key, value); + changed = true; + } + } + + // Signal to outside listeners + if (changed) { + this._onDidChangeStorage.fire(key); + } + } + + get items(): Map { + return this.cache; + } + + get size(): number { + return this.cache.size; + } + + async init(): Promise { + if (this.state !== StorageState.None) { + return Promise.resolve(); // either closed or already initialized + } + + this.state = StorageState.Initialized; + + if (this.options.hint === StorageHint.STORAGE_DOES_NOT_EXIST) { + // return early if we know the storage file does not exist. this is a performance + // optimization to not load all items of the underlying storage if we know that + // there can be no items because the storage does not exist. + return Promise.resolve(); + } + + this.cache = await this.database.getItems(); + } + + get(key: string, fallbackValue: string): string; + get(key: string, fallbackValue?: string): string | undefined; + get(key: string, fallbackValue?: string): string | undefined { + const value = this.cache.get(key); + + if (isUndefinedOrNull(value)) { + return fallbackValue; + } + + return value; + } + + getBoolean(key: string, fallbackValue: boolean): boolean; + getBoolean(key: string, fallbackValue?: boolean): boolean | undefined; + getBoolean(key: string, fallbackValue?: boolean): boolean | undefined { + const value = this.get(key); + + if (isUndefinedOrNull(value)) { + return fallbackValue; + } + + return value === 'true'; + } + + getNumber(key: string, fallbackValue: number): number; + getNumber(key: string, fallbackValue?: number): number | undefined; + getNumber(key: string, fallbackValue?: number): number | undefined { + const value = this.get(key); + + if (isUndefinedOrNull(value)) { + return fallbackValue; + } + + return parseInt(value, 10); + } + + set(key: string, value: string | boolean | number | null | undefined): Promise { + if (this.state === StorageState.Closed) { + return Promise.resolve(); // Return early if we are already closed + } + + // We remove the key for undefined/null values + if (isUndefinedOrNull(value)) { + return this.delete(key); + } + + // Otherwise, convert to String and store + const valueStr = String(value); + + // Return early if value already set + const currentValue = this.cache.get(key); + if (currentValue === valueStr) { + return Promise.resolve(); + } + + // Update in cache and pending + this.cache.set(key, valueStr); + this.pendingInserts.set(key, valueStr); + this.pendingDeletes.delete(key); + + // Event + this._onDidChangeStorage.fire(key); + + // Accumulate work by scheduling after timeout + return this.flushDelayer.trigger(() => this.flushPending()); + } + + delete(key: string): Promise { + if (this.state === StorageState.Closed) { + return Promise.resolve(); // Return early if we are already closed + } + + // Remove from cache and add to pending + const wasDeleted = this.cache.delete(key); + if (!wasDeleted) { + return Promise.resolve(); // Return early if value already deleted + } + + if (!this.pendingDeletes.has(key)) { + this.pendingDeletes.add(key); + } + + this.pendingInserts.delete(key); + + // Event + this._onDidChangeStorage.fire(key); + + // Accumulate work by scheduling after timeout + return this.flushDelayer.trigger(() => this.flushPending()); + } + + async close(): Promise { + if (this.state === StorageState.Closed) { + return Promise.resolve(); // return if already closed + } + + // Update state + this.state = StorageState.Closed; + + // Trigger new flush to ensure data is persisted and then close + // even if there is an error flushing. We must always ensure + // the DB is closed to avoid corruption. + // + // Recovery: we pass our cache over as recovery option in case + // the DB is not healthy. + try { + await this.flushDelayer.trigger(() => this.flushPending(), 0 /* as soon as possible */); + } catch (error) { + // Ignore + } + + await this.database.close(() => this.cache); + } + + private flushPending(): Promise { + if (this.pendingInserts.size === 0 && this.pendingDeletes.size === 0) { + return Promise.resolve(); // return early if nothing to do + } + + // Get pending data + const updateRequest: IUpdateRequest = { insert: this.pendingInserts, delete: this.pendingDeletes }; + + // Reset pending data for next run + this.pendingDeletes = new Set(); + this.pendingInserts = new Map(); + + // Update in storage + return this.database.updateItems(updateRequest); + } +} + +export class InMemoryStorageDatabase implements IStorageDatabase { + + readonly onDidChangeItemsExternal = Event.None; + + private items = new Map(); + + getItems(): Promise> { + return Promise.resolve(this.items); + } + + updateItems(request: IUpdateRequest): Promise { + if (request.insert) { + request.insert.forEach((value, key) => this.items.set(key, value)); + } + + if (request.delete) { + request.delete.forEach(key => this.items.delete(key)); + } + + return Promise.resolve(); + } + + close(): Promise { + return Promise.resolve(); + } +} \ No newline at end of file diff --git a/src/vs/base/node/storage.ts b/src/vs/base/parts/storage/node/storage.ts similarity index 62% rename from src/vs/base/node/storage.ts rename to src/vs/base/parts/storage/node/storage.ts index a92705b9557..5f2e7c1d9b0 100644 --- a/src/vs/base/node/storage.ts +++ b/src/vs/base/parts/storage/node/storage.ts @@ -4,305 +4,13 @@ *--------------------------------------------------------------------------------------------*/ import { Database, Statement } from 'vscode-sqlite3'; -import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; -import { Emitter, Event } from 'vs/base/common/event'; -import { ThrottledDelayer, timeout } from 'vs/base/common/async'; -import { isUndefinedOrNull } from 'vs/base/common/types'; +import { Event } from 'vs/base/common/event'; +import { timeout } from 'vs/base/common/async'; import { mapToString, setToString } from 'vs/base/common/map'; import { basename } from 'vs/base/common/path'; import { copy, renameIgnoreError, unlink } from 'vs/base/node/pfs'; import { fill } from 'vs/base/common/arrays'; - -export enum StorageHint { - - // A hint to the storage that the storage - // does not exist on disk yet. This allows - // the storage library to improve startup - // time by not checking the storage for data. - STORAGE_DOES_NOT_EXIST -} - -export interface IStorageOptions { - hint?: StorageHint; -} - -export interface IUpdateRequest { - insert?: Map; - delete?: Set; -} - -export interface IStorageItemsChangeEvent { - items: Map; -} - -export interface IStorageDatabase { - - readonly onDidChangeItemsExternal: Event; - - getItems(): Promise>; - updateItems(request: IUpdateRequest): Promise; - - close(recovery?: () => Map): Promise; - - checkIntegrity(full: boolean): Promise; -} - -export interface IStorage extends IDisposable { - - readonly items: Map; - readonly size: number; - readonly onDidChangeStorage: Event; - - init(): Promise; - - get(key: string, fallbackValue: string): string; - get(key: string, fallbackValue?: string): string | undefined; - - getBoolean(key: string, fallbackValue: boolean): boolean; - getBoolean(key: string, fallbackValue?: boolean): boolean | undefined; - - getNumber(key: string, fallbackValue: number): number; - getNumber(key: string, fallbackValue?: number): number | undefined; - - set(key: string, value: string | boolean | number | undefined | null): Promise; - delete(key: string): Promise; - - close(): Promise; - - checkIntegrity(full: boolean): Promise; -} - -enum StorageState { - None, - Initialized, - Closed -} - -export class Storage extends Disposable implements IStorage { - _serviceBrand: any; - - private static readonly DEFAULT_FLUSH_DELAY = 100; - - private readonly _onDidChangeStorage: Emitter = this._register(new Emitter()); - get onDidChangeStorage(): Event { return this._onDidChangeStorage.event; } - - private state = StorageState.None; - - private cache: Map = new Map(); - - private flushDelayer: ThrottledDelayer; - - private pendingDeletes: Set = new Set(); - private pendingInserts: Map = new Map(); - - constructor( - protected database: IStorageDatabase, - private options: IStorageOptions = Object.create(null) - ) { - super(); - - this.flushDelayer = this._register(new ThrottledDelayer(Storage.DEFAULT_FLUSH_DELAY)); - - this.registerListeners(); - } - - private registerListeners(): void { - this._register(this.database.onDidChangeItemsExternal(e => this.onDidChangeItemsExternal(e))); - } - - private onDidChangeItemsExternal(e: IStorageItemsChangeEvent): void { - // items that change external require us to update our - // caches with the values. we just accept the value and - // emit an event if there is a change. - e.items.forEach((value, key) => this.accept(key, value)); - } - - private accept(key: string, value: string): void { - if (this.state === StorageState.Closed) { - return; // Return early if we are already closed - } - - let changed = false; - - // Item got removed, check for deletion - if (isUndefinedOrNull(value)) { - changed = this.cache.delete(key); - } - - // Item got updated, check for change - else { - const currentValue = this.cache.get(key); - if (currentValue !== value) { - this.cache.set(key, value); - changed = true; - } - } - - // Signal to outside listeners - if (changed) { - this._onDidChangeStorage.fire(key); - } - } - - get items(): Map { - return this.cache; - } - - get size(): number { - return this.cache.size; - } - - async init(): Promise { - if (this.state !== StorageState.None) { - return Promise.resolve(); // either closed or already initialized - } - - this.state = StorageState.Initialized; - - if (this.options.hint === StorageHint.STORAGE_DOES_NOT_EXIST) { - // return early if we know the storage file does not exist. this is a performance - // optimization to not load all items of the underlying storage if we know that - // there can be no items because the storage does not exist. - return Promise.resolve(); - } - - this.cache = await this.database.getItems(); - } - - get(key: string, fallbackValue: string): string; - get(key: string, fallbackValue?: string): string | undefined; - get(key: string, fallbackValue?: string): string | undefined { - const value = this.cache.get(key); - - if (isUndefinedOrNull(value)) { - return fallbackValue; - } - - return value; - } - - getBoolean(key: string, fallbackValue: boolean): boolean; - getBoolean(key: string, fallbackValue?: boolean): boolean | undefined; - getBoolean(key: string, fallbackValue?: boolean): boolean | undefined { - const value = this.get(key); - - if (isUndefinedOrNull(value)) { - return fallbackValue; - } - - return value === 'true'; - } - - getNumber(key: string, fallbackValue: number): number; - getNumber(key: string, fallbackValue?: number): number | undefined; - getNumber(key: string, fallbackValue?: number): number | undefined { - const value = this.get(key); - - if (isUndefinedOrNull(value)) { - return fallbackValue; - } - - return parseInt(value, 10); - } - - set(key: string, value: string | boolean | number | null | undefined): Promise { - if (this.state === StorageState.Closed) { - return Promise.resolve(); // Return early if we are already closed - } - - // We remove the key for undefined/null values - if (isUndefinedOrNull(value)) { - return this.delete(key); - } - - // Otherwise, convert to String and store - const valueStr = String(value); - - // Return early if value already set - const currentValue = this.cache.get(key); - if (currentValue === valueStr) { - return Promise.resolve(); - } - - // Update in cache and pending - this.cache.set(key, valueStr); - this.pendingInserts.set(key, valueStr); - this.pendingDeletes.delete(key); - - // Event - this._onDidChangeStorage.fire(key); - - // Accumulate work by scheduling after timeout - return this.flushDelayer.trigger(() => this.flushPending()); - } - - delete(key: string): Promise { - if (this.state === StorageState.Closed) { - return Promise.resolve(); // Return early if we are already closed - } - - // Remove from cache and add to pending - const wasDeleted = this.cache.delete(key); - if (!wasDeleted) { - return Promise.resolve(); // Return early if value already deleted - } - - if (!this.pendingDeletes.has(key)) { - this.pendingDeletes.add(key); - } - - this.pendingInserts.delete(key); - - // Event - this._onDidChangeStorage.fire(key); - - // Accumulate work by scheduling after timeout - return this.flushDelayer.trigger(() => this.flushPending()); - } - - async close(): Promise { - if (this.state === StorageState.Closed) { - return Promise.resolve(); // return if already closed - } - - // Update state - this.state = StorageState.Closed; - - // Trigger new flush to ensure data is persisted and then close - // even if there is an error flushing. We must always ensure - // the DB is closed to avoid corruption. - // - // Recovery: we pass our cache over as recovery option in case - // the DB is not healthy. - try { - await this.flushDelayer.trigger(() => this.flushPending(), 0 /* as soon as possible */); - } catch (error) { - // Ignore - } - - await this.database.close(() => this.cache); - } - - private flushPending(): Promise { - if (this.pendingInserts.size === 0 && this.pendingDeletes.size === 0) { - return Promise.resolve(); // return early if nothing to do - } - - // Get pending data - const updateRequest: IUpdateRequest = { insert: this.pendingInserts, delete: this.pendingDeletes }; - - // Reset pending data for next run - this.pendingDeletes = new Set(); - this.pendingInserts = new Map(); - - // Update in storage - return this.database.updateItems(updateRequest); - } - - checkIntegrity(full: boolean): Promise { - return this.database.checkIntegrity(full); - } -} +import { IStorageDatabase, IStorageItemsChangeEvent, IUpdateRequest } from 'vs/base/parts/storage/common/storage'; interface IDatabaseConnection { db: Database; @@ -753,34 +461,3 @@ class SQLiteStorageDatabaseLogger { } } } - -export class InMemoryStorageDatabase implements IStorageDatabase { - - readonly onDidChangeItemsExternal = Event.None; - - private items = new Map(); - - getItems(): Promise> { - return Promise.resolve(this.items); - } - - updateItems(request: IUpdateRequest): Promise { - if (request.insert) { - request.insert.forEach((value, key) => this.items.set(key, value)); - } - - if (request.delete) { - request.delete.forEach(key => this.items.delete(key)); - } - - return Promise.resolve(); - } - - close(): Promise { - return Promise.resolve(); - } - - checkIntegrity(full: boolean): Promise { - return Promise.resolve('ok'); - } -} \ No newline at end of file diff --git a/src/vs/base/test/node/storage/storage.test.ts b/src/vs/base/parts/storage/test/node/storage.test.ts similarity index 99% rename from src/vs/base/test/node/storage/storage.test.ts rename to src/vs/base/parts/storage/test/node/storage.test.ts index 784a797b895..4c915ef2ae7 100644 --- a/src/vs/base/test/node/storage/storage.test.ts +++ b/src/vs/base/parts/storage/test/node/storage.test.ts @@ -3,7 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Storage, SQLiteStorageDatabase, IStorageDatabase, ISQLiteStorageDatabaseOptions, IStorageItemsChangeEvent } from 'vs/base/node/storage'; +import { SQLiteStorageDatabase, ISQLiteStorageDatabaseOptions } from 'vs/base/parts/storage/node/storage'; +import { Storage, IStorageDatabase, IStorageItemsChangeEvent } from 'vs/base/parts/storage/common/storage'; import { generateUuid } from 'vs/base/common/uuid'; import { join } from 'vs/base/common/path'; import { tmpdir } from 'os'; diff --git a/src/vs/editor/contrib/multicursor/test/multicursor.test.ts b/src/vs/editor/contrib/multicursor/test/multicursor.test.ts index f2715cbe06a..4e3fb3beabe 100644 --- a/src/vs/editor/contrib/multicursor/test/multicursor.test.ts +++ b/src/vs/editor/contrib/multicursor/test/multicursor.test.ts @@ -67,7 +67,8 @@ suite('Multicursor selection', () => { getBoolean: (key: string) => !!queryState[key], getNumber: (key: string) => undefined!, store: (key: string, value: any) => { queryState[key] = value; return Promise.resolve(); }, - remove: (key) => undefined + remove: (key) => undefined, + logStorage: () => undefined } as IStorageService); test('issue #8817: Cursor position changes when you cancel multicursor', () => { diff --git a/src/vs/platform/storage/browser/storageService.ts b/src/vs/platform/storage/browser/storageService.ts new file mode 100644 index 00000000000..332ffa511b3 --- /dev/null +++ b/src/vs/platform/storage/browser/storageService.ts @@ -0,0 +1,207 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Disposable } from 'vs/base/common/lifecycle'; +import { Event, Emitter } from 'vs/base/common/event'; +import { IWorkspaceStorageChangeEvent, IStorageService, StorageScope, IWillSaveStateEvent, WillSaveStateReason, logStorage } from 'vs/platform/storage/common/storage'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { IWorkspaceInitializationPayload } from 'vs/platform/workspaces/common/workspaces'; +import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; +import { IFileService, FileChangesEvent } from 'vs/platform/files/common/files'; +import { IStorage, IStorageDatabase, IUpdateRequest, Storage } from 'vs/base/parts/storage/common/storage'; +import { URI } from 'vs/base/common/uri'; +import { VSBuffer } from 'vs/base/common/buffer'; +import { joinPath } from 'vs/base/common/resources'; + +export class BrowserStorageService extends Disposable implements IStorageService { + + _serviceBrand: ServiceIdentifier; + + private readonly _onDidChangeStorage: Emitter = this._register(new Emitter()); + get onDidChangeStorage(): Event { return this._onDidChangeStorage.event; } + + private readonly _onWillSaveState: Emitter = this._register(new Emitter()); + get onWillSaveState(): Event { return this._onWillSaveState.event; } + + private globalStorage: IStorage; + private workspaceStorage: IStorage; + + private globalStorageFile: URI; + private workspaceStorageFile: URI; + + private initializePromise: Promise; + + constructor( + @IEnvironmentService private readonly environmentService: IEnvironmentService, + @IFileService private readonly fileService: IFileService + ) { + super(); + } + + initialize(payload: IWorkspaceInitializationPayload): Promise { + if (!this.initializePromise) { + this.initializePromise = this.doInitialize(payload); + } + + return this.initializePromise; + } + + private async doInitialize(payload: IWorkspaceInitializationPayload): Promise { + + // Workspace Storage + this.workspaceStorageFile = joinPath(this.environmentService.userRoamingDataHome, 'workspaceStorage', `${payload.id}.json`); + this.workspaceStorage = new Storage(this._register(new FileStorageDatabase(this.workspaceStorageFile, this.fileService))); + this._register(this.workspaceStorage.onDidChangeStorage(key => this._onDidChangeStorage.fire({ key, scope: StorageScope.WORKSPACE }))); + + // Global Storage + this.globalStorageFile = joinPath(this.environmentService.userRoamingDataHome, 'globalStorage', 'global.json'); + this.globalStorage = new Storage(this._register(new FileStorageDatabase(this.globalStorageFile, this.fileService))); + this._register(this.globalStorage.onDidChangeStorage(key => this._onDidChangeStorage.fire({ key, scope: StorageScope.GLOBAL }))); + + // Init both + await Promise.all([ + this.workspaceStorage.init(), + this.globalStorage.init() + ]); + } + + //#region + + get(key: string, scope: StorageScope, fallbackValue: string): string; + get(key: string, scope: StorageScope): string | undefined; + get(key: string, scope: StorageScope, fallbackValue?: string): string | undefined { + return this.getStorage(scope).get(key, fallbackValue); + } + + getBoolean(key: string, scope: StorageScope, fallbackValue: boolean): boolean; + getBoolean(key: string, scope: StorageScope): boolean | undefined; + getBoolean(key: string, scope: StorageScope, fallbackValue?: boolean): boolean | undefined { + return this.getStorage(scope).getBoolean(key, fallbackValue); + } + + getNumber(key: string, scope: StorageScope, fallbackValue: number): number; + getNumber(key: string, scope: StorageScope): number | undefined; + getNumber(key: string, scope: StorageScope, fallbackValue?: number): number | undefined { + return this.getStorage(scope).getNumber(key, fallbackValue); + } + + store(key: string, value: string | boolean | number | undefined | null, scope: StorageScope): void { + this.getStorage(scope).set(key, value); + } + + remove(key: string, scope: StorageScope): void { + this.getStorage(scope).delete(key); + } + + async close(): Promise { + + // Signal as event so that clients can still store data + this._onWillSaveState.fire({ reason: WillSaveStateReason.SHUTDOWN }); + + // Do it + await Promise.all([ + this.globalStorage.close(), + this.workspaceStorage.close() + ]); + } + + private getStorage(scope: StorageScope): IStorage { + return scope === StorageScope.GLOBAL ? this.globalStorage : this.workspaceStorage; + } + + async logStorage(): Promise { + const result = await Promise.all([ + this.globalStorage.items, + this.workspaceStorage.items + ]); + + return logStorage(result[0], result[1], this.globalStorageFile.toString(), this.workspaceStorageFile.toString()); + } + + //#endregion +} + +export class FileStorageDatabase extends Disposable implements IStorageDatabase { + + readonly onDidChangeItemsExternal = Event.None; // TODO@Ben implement global UI storage events + + private cache: Map | undefined; + + private pendingUpdate: Promise = Promise.resolve(); + + constructor( + private readonly file: URI, + private readonly fileService: IFileService + ) { + super(); + + this.registerListeners(); + } + + private registerListeners(): void { + this._register(this.fileService.watch(this.file)); + this._register(this.fileService.onFileChanges(e => this.onFileChanges(e))); + } + + private onFileChanges(e: FileChangesEvent): void { + + } + + async getItems(): Promise> { + if (!this.cache) { + try { + this.cache = await this.doGetItemsFromFile(); + } catch (error) { + this.cache = new Map(); + } + } + + return this.cache; + } + + private async doGetItemsFromFile(): Promise> { + await this.pendingUpdate; + + const itemsRaw = await this.fileService.readFile(this.file); + + return new Map(JSON.parse(itemsRaw.value.toString())); + } + + async updateItems(request: IUpdateRequest): Promise { + let updateCount = 0; + if (request.insert) { + updateCount += request.insert.size; + } + if (request.delete) { + updateCount += request.delete.size; + } + + if (updateCount === 0) { + return Promise.resolve(); + } + + const items = await this.getItems(); + + if (request.insert) { + request.insert.forEach((value, key) => items.set(key, value)); + } + + if (request.delete) { + request.delete.forEach(key => items.delete(key)); + } + + const itemsRaw = JSON.stringify([...items]); + + await this.pendingUpdate; + + this.pendingUpdate = this.fileService.writeFile(this.file, VSBuffer.fromString(itemsRaw)).then(); + + return this.pendingUpdate; + } + + close(): Promise { + return this.pendingUpdate; + } +} \ No newline at end of file diff --git a/src/vs/platform/storage/common/storage.ts b/src/vs/platform/storage/common/storage.ts index 038fc6d7b9f..d2b42b22532 100644 --- a/src/vs/platform/storage/common/storage.ts +++ b/src/vs/platform/storage/common/storage.ts @@ -86,6 +86,11 @@ export interface IStorageService { * operation to either the current workspace only or all workspaces. */ remove(key: string, scope: StorageScope): void; + + /** + * Log the contents of the storage to the console. + */ + logStorage(): void; } export const enum StorageScope { @@ -107,6 +112,7 @@ export interface IWorkspaceStorageChangeEvent { } export class InMemoryStorageService extends Disposable implements IStorageService { + _serviceBrand = undefined; private readonly _onDidChangeStorage: Emitter = this._register(new Emitter()); @@ -190,4 +196,52 @@ export class InMemoryStorageService extends Disposable implements IStorageServic return Promise.resolve(); } + + logStorage(): void { + logStorage(this.globalCache, this.workspaceCache, 'inMemory', 'inMemory'); + } +} + +export async function logStorage(global: Map, workspace: Map, globalPath: string, workspacePath: string): Promise { + const safeParse = (value: string) => { + try { + return JSON.parse(value); + } catch (error) { + return value; + } + }; + + const globalItems = new Map(); + const globalItemsParsed = new Map(); + global.forEach((value, key) => { + globalItems.set(key, value); + globalItemsParsed.set(key, safeParse(value)); + }); + + const workspaceItems = new Map(); + const workspaceItemsParsed = new Map(); + workspace.forEach((value, key) => { + workspaceItems.set(key, value); + workspaceItemsParsed.set(key, safeParse(value)); + }); + + console.group(`Storage: Global (path: ${globalPath})`); + let globalValues: { key: string, value: string }[] = []; + globalItems.forEach((value, key) => { + globalValues.push({ key, value }); + }); + console.table(globalValues); + console.groupEnd(); + + console.log(globalItemsParsed); + + console.group(`Storage: Workspace (path: ${workspacePath})`); + let workspaceValues: { key: string, value: string }[] = []; + workspaceItems.forEach((value, key) => { + workspaceValues.push({ key, value }); + }); + console.table(workspaceValues); + console.groupEnd(); + + console.log(workspaceItemsParsed); } \ No newline at end of file diff --git a/src/vs/platform/storage/node/storageIpc.ts b/src/vs/platform/storage/node/storageIpc.ts index 0bf5c04a832..1b34ec90f27 100644 --- a/src/vs/platform/storage/node/storageIpc.ts +++ b/src/vs/platform/storage/node/storageIpc.ts @@ -6,7 +6,7 @@ import { IChannel, IServerChannel } from 'vs/base/parts/ipc/common/ipc'; import { Event, Emitter } from 'vs/base/common/event'; import { StorageMainService, IStorageChangeEvent } from 'vs/platform/storage/node/storageMainService'; -import { IUpdateRequest, IStorageDatabase, IStorageItemsChangeEvent } from 'vs/base/node/storage'; +import { IUpdateRequest, IStorageDatabase, IStorageItemsChangeEvent } from 'vs/base/parts/storage/common/storage'; import { mapToSerializable, serializableToMap, values } from 'vs/base/common/map'; import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; import { onUnexpectedError } from 'vs/base/common/errors'; @@ -139,10 +139,6 @@ export class GlobalStorageDatabaseChannel extends Disposable implements IServerC break; } - case 'checkIntegrity': { - return this.storageMainService.checkIntegrity(arg); - } - default: throw new Error(`Call not found: ${command}`); } @@ -201,10 +197,6 @@ export class GlobalStorageDatabaseChannelClient extends Disposable implements IS return this.channel.call('updateItems', serializableRequest); } - checkIntegrity(full: boolean): Promise { - return this.channel.call('checkIntegrity', full); - } - close(): Promise { // when we are about to close, we start to ignore main-side changes since we close anyway diff --git a/src/vs/platform/storage/node/storageMainService.ts b/src/vs/platform/storage/node/storageMainService.ts index f471d851982..c38b53890d6 100644 --- a/src/vs/platform/storage/node/storageMainService.ts +++ b/src/vs/platform/storage/node/storageMainService.ts @@ -8,7 +8,8 @@ import { Event, Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { ILogService, LogLevel } from 'vs/platform/log/common/log'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { IStorage, Storage, SQLiteStorageDatabase, ISQLiteStorageDatabaseLoggingOptions, InMemoryStorageDatabase } from 'vs/base/node/storage'; +import { SQLiteStorageDatabase, ISQLiteStorageDatabaseLoggingOptions } from 'vs/base/parts/storage/node/storage'; +import { Storage, IStorage, InMemoryStorageDatabase } from 'vs/base/parts/storage/common/storage'; import { join } from 'vs/base/common/path'; export const IStorageMainService = createDecorator('storageMainService'); @@ -164,8 +165,4 @@ export class StorageMainService extends Disposable implements IStorageMainServic // Do it return this.storage.close(); } - - checkIntegrity(full: boolean): Promise { - return this.storage.checkIntegrity(full); - } } diff --git a/src/vs/platform/storage/node/storageService.ts b/src/vs/platform/storage/node/storageService.ts index 4aa83ea6bcd..27d30af0527 100644 --- a/src/vs/platform/storage/node/storageService.ts +++ b/src/vs/platform/storage/node/storageService.ts @@ -6,20 +6,20 @@ import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; import { Event, Emitter } from 'vs/base/common/event'; import { ILogService, LogLevel } from 'vs/platform/log/common/log'; -import { IWorkspaceStorageChangeEvent, IStorageService, StorageScope, IWillSaveStateEvent, WillSaveStateReason } from 'vs/platform/storage/common/storage'; -import { Storage, ISQLiteStorageDatabaseLoggingOptions, IStorage, StorageHint, IStorageDatabase, SQLiteStorageDatabase } from 'vs/base/node/storage'; -import { Action } from 'vs/base/common/actions'; -import { IWindowService } from 'vs/platform/windows/common/windows'; -import { localize } from 'vs/nls'; -import { mark, getDuration } from 'vs/base/common/performance'; +import { IWorkspaceStorageChangeEvent, IStorageService, StorageScope, IWillSaveStateEvent, WillSaveStateReason, logStorage } from 'vs/platform/storage/common/storage'; +import { SQLiteStorageDatabase, ISQLiteStorageDatabaseLoggingOptions } from 'vs/base/parts/storage/node/storage'; +import { Storage, IStorageDatabase, IStorage, StorageHint } from 'vs/base/parts/storage/common/storage'; +import { mark } from 'vs/base/common/performance'; import { join } from 'vs/base/common/path'; import { copy, exists, mkdirp, writeFile } from 'vs/base/node/pfs'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IWorkspaceInitializationPayload, isWorkspaceIdentifier, isSingleFolderWorkspaceInitializationPayload } from 'vs/platform/workspaces/common/workspaces'; import { onUnexpectedError } from 'vs/base/common/errors'; +import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; export class StorageService extends Disposable implements IStorageService { - _serviceBrand: any; + + _serviceBrand: ServiceIdentifier; private static WORKSPACE_STORAGE_NAME = 'state.vscdb'; private static WORKSPACE_META_NAME = 'workspace.json'; @@ -201,63 +201,13 @@ export class StorageService extends Disposable implements IStorageService { return scope === StorageScope.GLOBAL ? this.globalStorage : this.workspaceStorage; } - getSize(scope: StorageScope): number { - return scope === StorageScope.GLOBAL ? this.globalStorage.size : this.workspaceStorage.size; - } - - checkIntegrity(scope: StorageScope, full: boolean): Promise { - return scope === StorageScope.GLOBAL ? this.globalStorage.checkIntegrity(full) : this.workspaceStorage.checkIntegrity(full); - } - async logStorage(): Promise { const result = await Promise.all([ this.globalStorage.items, - this.workspaceStorage.items, - this.globalStorage.checkIntegrity(true /* full */), - this.workspaceStorage.checkIntegrity(true /* full */) + this.workspaceStorage.items ]); - const safeParse = (value: string) => { - try { - return JSON.parse(value); - } catch (error) { - return value; - } - }; - - const globalItems = new Map(); - const globalItemsParsed = new Map(); - result[0].forEach((value, key) => { - globalItems.set(key, value); - globalItemsParsed.set(key, safeParse(value)); - }); - - const workspaceItems = new Map(); - const workspaceItemsParsed = new Map(); - result[1].forEach((value, key) => { - workspaceItems.set(key, value); - workspaceItemsParsed.set(key, safeParse(value)); - }); - - console.group(`Storage: Global (integrity: ${result[2]}, path: ${this.environmentService.globalStorageHome})`); - let globalValues: { key: string, value: string }[] = []; - globalItems.forEach((value, key) => { - globalValues.push({ key, value }); - }); - console.table(globalValues); - console.groupEnd(); - - console.log(globalItemsParsed); - - console.group(`Storage: Workspace (integrity: ${result[3]}, load: ${getDuration('willInitWorkspaceStorage', 'didInitWorkspaceStorage')}, path: ${this.workspaceStoragePath})`); - let workspaceValues: { key: string, value: string }[] = []; - workspaceItems.forEach((value, key) => { - workspaceValues.push({ key, value }); - }); - console.table(workspaceValues); - console.groupEnd(); - - console.log(workspaceItemsParsed); + logStorage(result[0], result[1], this.environmentService.globalStorageHome, this.workspaceStoragePath); } async migrate(toWorkspace: IWorkspaceInitializationPayload): Promise { @@ -280,24 +230,3 @@ export class StorageService extends Disposable implements IStorageService { return this.createWorkspaceStorage(newWorkspaceStoragePath).init(); } } - -export class LogStorageAction extends Action { - - static readonly ID = 'workbench.action.logStorage'; - static LABEL = localize({ key: 'logStorage', comment: ['A developer only action to log the contents of the storage for the current window.'] }, "Log Storage Database Contents"); - - constructor( - id: string, - label: string, - @IStorageService private readonly storageService: StorageService, - @IWindowService private readonly windowService: IWindowService - ) { - super(id, label); - } - - run(): Promise { - this.storageService.logStorage(); - - return this.windowService.openDevTools(); - } -} diff --git a/src/vs/platform/storage/test/node/storageService.test.ts b/src/vs/platform/storage/test/node/storageService.test.ts index 857d645b60d..6cb2f835d76 100644 --- a/src/vs/platform/storage/test/node/storageService.test.ts +++ b/src/vs/platform/storage/test/node/storageService.test.ts @@ -13,7 +13,7 @@ import { mkdirp, rimraf, RimRafMode } from 'vs/base/node/pfs'; import { NullLogService } from 'vs/platform/log/common/log'; import { EnvironmentService } from 'vs/platform/environment/node/environmentService'; import { parseArgs } from 'vs/platform/environment/node/argv'; -import { InMemoryStorageDatabase } from 'vs/base/node/storage'; +import { InMemoryStorageDatabase } from 'vs/base/parts/storage/common/storage'; suite('StorageService', () => { diff --git a/src/vs/workbench/browser/actions/developerActions.ts b/src/vs/workbench/browser/actions/developerActions.ts index 60c6f23f234..5fd57fadf7b 100644 --- a/src/vs/workbench/browser/actions/developerActions.ts +++ b/src/vs/workbench/browser/actions/developerActions.ts @@ -19,6 +19,7 @@ import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/la import { Registry } from 'vs/platform/registry/common/platform'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/actions'; +import { IStorageService } from 'vs/platform/storage/common/storage'; export class InspectContextKeysAction extends Action { @@ -193,7 +194,29 @@ export class ToggleScreencastModeAction extends Action { } } +export class LogStorageAction extends Action { + + static readonly ID = 'workbench.action.logStorage'; + static LABEL = nls.localize({ key: 'logStorage', comment: ['A developer only action to log the contents of the storage for the current window.'] }, "Log Storage Database Contents"); + + constructor( + id: string, + label: string, + @IStorageService private readonly storageService: IStorageService, + @IWindowService private readonly windowService: IWindowService + ) { + super(id, label); + } + + run(): Promise { + this.storageService.logStorage(); + + return this.windowService.openDevTools(); + } +} + const developerCategory = nls.localize('developer', "Developer"); const registry = Registry.as(Extensions.WorkbenchActions); registry.registerWorkbenchAction(new SyncActionDescriptor(InspectContextKeysAction, InspectContextKeysAction.ID, InspectContextKeysAction.LABEL), 'Developer: Inspect Context Keys', developerCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(ToggleScreencastModeAction, ToggleScreencastModeAction.ID, ToggleScreencastModeAction.LABEL), 'Developer: Toggle Screencast Mode', developerCategory); +registry.registerWorkbenchAction(new SyncActionDescriptor(LogStorageAction, LogStorageAction.ID, LogStorageAction.LABEL), 'Developer: Log Storage Database Contents', developerCategory); \ No newline at end of file diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index 489f71399a1..01c2222bc71 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -35,8 +35,10 @@ import { hash } from 'vs/base/common/hash'; import { IWorkbenchConstructionOptions } from 'vs/workbench/workbench.web.api'; import { ProductService } from 'vs/platform/product/browser/productService'; import { FileUserDataProvider } from 'vs/workbench/services/userData/common/fileUserDataProvider'; -import { joinPath } from 'vs/base/common/resources'; import { BACKUPS } from 'vs/platform/environment/common/environment'; +import { joinPath } from 'vs/base/common/resources'; +import { BrowserStorageService } from 'vs/platform/storage/browser/storageService'; +import { IStorageService } from 'vs/platform/storage/common/storage'; class CodeRendererMain extends Disposable { @@ -146,11 +148,34 @@ class CodeRendererMain extends Disposable { return service; }), + + this.createStorageService(payload, environmentService, fileService, logService).then(service => { + + // Storage + serviceCollection.set(IStorageService, service); + + return service; + }) ]); return { serviceCollection, logService }; } + private async createStorageService(payload: IWorkspaceInitializationPayload, environmentService: IWorkbenchEnvironmentService, fileService: IFileService, logService: ILogService): Promise { + const storageService = new BrowserStorageService(environmentService, fileService); + + try { + await storageService.initialize(payload); + + return storageService; + } catch (error) { + onUnexpectedError(error); + logService.error(error); + + return storageService; + } + } + private async createWorkspaceService(payload: IWorkspaceInitializationPayload, environmentService: IWorkbenchEnvironmentService, fileService: FileService, remoteAgentService: IRemoteAgentService, logService: ILogService): Promise { const workspaceService = new WorkspaceService({ remoteAuthority: this.configuration.remoteAuthority, configurationCache: new ConfigurationCache() }, environmentService, fileService, remoteAgentService); diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index 86c6bbf52d0..eb10b9dac72 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -6,7 +6,7 @@ import { URI } from 'vs/base/common/uri'; import * as browser from 'vs/base/browser/browser'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { Emitter, Event } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; // tslint:disable-next-line: import-patterns no-standalone-editor @@ -18,9 +18,8 @@ import { IExtensionManifest, ExtensionType, ExtensionIdentifier, IExtension } fr import { IURLHandler, IURLService } from 'vs/platform/url/common/url'; import { ITelemetryService, ITelemetryData, ITelemetryInfo } from 'vs/platform/telemetry/common/telemetry'; import { ConsoleLogService } from 'vs/platform/log/common/log'; -import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; -import { IStorageService, IWorkspaceStorageChangeEvent, StorageScope, IWillSaveStateEvent, WillSaveStateReason } from 'vs/platform/storage/common/storage'; +import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IUpdateService, State } from 'vs/platform/update/common/update'; import { IWindowService, INativeOpenDialogOptions, IEnterWorkspaceResult, IURIToOpen, IMessageBoxResult, IWindowsService, IOpenSettings, IWindowSettings } from 'vs/platform/windows/common/windows'; import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, IWorkspaceFolderCreationData, IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; @@ -39,7 +38,6 @@ import { ICommentService, IResourceCommentThreadEvent, IWorkspaceCommentThreadsE import { ICommentThreadChangedEvent } from 'vs/workbench/contrib/comments/common/commentModel'; import { CommentingRanges } from 'vs/editor/common/modes'; import { Range } from 'vs/editor/common/core/range'; -import { isUndefinedOrNull } from 'vs/base/common/types'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { addDisposableListener, EventType } from 'vs/base/browser/dom'; import { IEditorService, IResourceEditor } from 'vs/workbench/services/editor/common/editorService'; @@ -86,14 +84,6 @@ registerSingleton(IClipboardService, SimpleClipboardService, true); //#endregion -//#region Dialog - -// export class SimpleDialogService extends StandaloneEditorDialogService { } - -// registerSingleton(IDialogService, SimpleDialogService, true); - -//#endregion - //#region Download export class SimpleDownloadService implements IDownloadService { @@ -482,111 +472,6 @@ export class SimpleRequestService implements IRequestService { //#endregion -//#region Storage - -export class LocalStorageService extends Disposable implements IStorageService { - _serviceBrand = undefined; - - private readonly _onDidChangeStorage: Emitter = this._register(new Emitter()); - get onDidChangeStorage(): Event { return this._onDidChangeStorage.event; } - - private readonly _onWillSaveState: Emitter = this._register(new Emitter()); - get onWillSaveState(): Event { return this._onWillSaveState.event; } - - constructor( - @IWorkspaceContextService private workspaceContextService: IWorkspaceContextService, - @ILifecycleService lifecycleService: ILifecycleService - ) { - super(); - - this._register(lifecycleService.onBeforeShutdown(() => this._onWillSaveState.fire({ reason: WillSaveStateReason.SHUTDOWN }))); - } - - private toKey(key: string, scope: StorageScope): string { - if (scope === StorageScope.GLOBAL) { - return `global://${key}`; - } - - return `workspace://${this.workspaceContextService.getWorkspace().id}/${key}`; - } - - get(key: string, scope: StorageScope, fallbackValue: string): string; - get(key: string, scope: StorageScope, fallbackValue?: string): string | undefined { - const value = window.localStorage.getItem(this.toKey(key, scope)); - - if (isUndefinedOrNull(value)) { - return fallbackValue; - } - - return value; - } - - getBoolean(key: string, scope: StorageScope, fallbackValue: boolean): boolean; - getBoolean(key: string, scope: StorageScope, fallbackValue?: boolean): boolean | undefined { - const value = window.localStorage.getItem(this.toKey(key, scope)); - - if (isUndefinedOrNull(value)) { - return fallbackValue; - } - - return value === 'true'; - } - - getNumber(key: string, scope: StorageScope, fallbackValue: number): number; - getNumber(key: string, scope: StorageScope, fallbackValue?: number): number | undefined { - const value = window.localStorage.getItem(this.toKey(key, scope)); - - if (isUndefinedOrNull(value)) { - return fallbackValue; - } - - return parseInt(value, 10); - } - - store(key: string, value: string | boolean | number | undefined | null, scope: StorageScope): Promise { - - // We remove the key for undefined/null values - if (isUndefinedOrNull(value)) { - return this.remove(key, scope); - } - - // Otherwise, convert to String and store - const valueStr = String(value); - - // Return early if value already set - const currentValue = window.localStorage.getItem(this.toKey(key, scope)); - if (currentValue === valueStr) { - return Promise.resolve(); - } - - // Update in cache - window.localStorage.setItem(this.toKey(key, scope), valueStr); - - // Events - this._onDidChangeStorage.fire({ scope, key }); - - return Promise.resolve(); - } - - remove(key: string, scope: StorageScope): Promise { - const wasDeleted = window.localStorage.getItem(this.toKey(key, scope)); - window.localStorage.removeItem(this.toKey(key, scope)); - - if (!wasDeleted) { - return Promise.resolve(); // Return early if value already deleted - } - - // Events - this._onDidChangeStorage.fire({ scope, key }); - - return Promise.resolve(); - } -} - -registerSingleton(IStorageService, LocalStorageService); - -//#endregion - //#region Telemetry export class SimpleTelemetryService implements ITelemetryService { diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index 04680562078..10557fccab0 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -23,7 +23,6 @@ import { ADD_ROOT_FOLDER_COMMAND_ID } from 'vs/workbench/browser/actions/workspa import { SupportsWorkspacesContext, IsMacContext, HasMacNativeTabsContext, IsDevelopmentContext, WorkbenchStateContext, WorkspaceFolderCountContext } from 'vs/workbench/browser/contextkeys'; import { NoEditorsVisibleContext, SingleEditorGroupsContext } from 'vs/workbench/common/editor'; import { IWindowService, IWindowsService } from 'vs/platform/windows/common/windows'; -import { LogStorageAction } from 'vs/platform/storage/node/storageService'; import product from 'vs/platform/product/node/product'; // Actions @@ -125,7 +124,6 @@ import product from 'vs/platform/product/node/product'; const developerCategory = nls.localize('developer', "Developer"); registry.registerWorkbenchAction(new SyncActionDescriptor(ToggleSharedProcessAction, ToggleSharedProcessAction.ID, ToggleSharedProcessAction.LABEL), 'Developer: Toggle Shared Process', developerCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(ReloadWindowWithExtensionsDisabledAction, ReloadWindowWithExtensionsDisabledAction.ID, ReloadWindowWithExtensionsDisabledAction.LABEL), 'Developer: Reload Window With Extensions Disabled', developerCategory); - registry.registerWorkbenchAction(new SyncActionDescriptor(LogStorageAction, LogStorageAction.ID, LogStorageAction.LABEL), 'Developer: Log Storage Database Contents', developerCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(ToggleDevToolsAction, ToggleDevToolsAction.ID, ToggleDevToolsAction.LABEL), 'Developer: Toggle Developer Tools', developerCategory); KeybindingsRegistry.registerKeybindingRule({ From 9d023edb6b71095e677fa6b9195ca1aac3cf5960 Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 5 Jul 2019 16:30:07 +0200 Subject: [PATCH 1146/1449] list: add getRole and isChecked to ariaProvider --- src/vs/base/browser/ui/list/listView.ts | 21 +++++++++++++------- src/vs/base/browser/ui/list/listWidget.ts | 4 ++-- src/vs/base/browser/ui/tree/abstractTree.ts | 2 +- src/vs/base/browser/ui/tree/asyncDataTree.ts | 2 +- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/vs/base/browser/ui/list/listView.ts b/src/vs/base/browser/ui/list/listView.ts index 1a8ac09277c..d2678253ecd 100644 --- a/src/vs/base/browser/ui/list/listView.ts +++ b/src/vs/base/browser/ui/list/listView.ts @@ -41,9 +41,11 @@ export interface IListViewDragAndDrop extends IListDragAndDrop { getDragElements(element: T): T[]; } -export interface IAriaSetProvider { +export interface IAriaProvider { getSetSize(element: T, index: number, listLength: number): number; getPosInSet(element: T, index: number): number; + getRole?(element: T): string; + isChecked?(element: T): boolean; } export interface IListViewOptions { @@ -54,7 +56,7 @@ export interface IListViewOptions { readonly supportDynamicHeights?: boolean; readonly mouseSupport?: boolean; readonly horizontalScrolling?: boolean; - readonly ariaSetProvider?: IAriaSetProvider; + readonly ariaProvider?: IAriaProvider; } const DefaultOptions = { @@ -174,7 +176,7 @@ export class ListView implements ISpliceable, IDisposable { private setRowLineHeight: boolean; private supportDynamicHeights: boolean; private horizontalScrolling: boolean; - private ariaSetProvider: IAriaSetProvider; + private ariaProvider: IAriaProvider; private scrollWidth: number | undefined; private canUseTranslate3d: boolean | undefined = undefined; @@ -227,7 +229,7 @@ export class ListView implements ISpliceable, IDisposable { this.horizontalScrolling = getOrDefault(options, o => o.horizontalScrolling, DefaultOptions.horizontalScrolling); DOM.toggleClass(this.domNode, 'horizontal-scrolling', this.horizontalScrolling); - this.ariaSetProvider = options.ariaSetProvider || { getSetSize: (e, i, length) => length, getPosInSet: (_, index) => index + 1 }; + this.ariaProvider = options.ariaProvider || { getSetSize: (e, i, length) => length, getPosInSet: (_, index) => index + 1 }; this.rowsContainer = document.createElement('div'); this.rowsContainer.className = 'monaco-list-rows'; @@ -566,7 +568,12 @@ export class ListView implements ISpliceable, IDisposable { if (!item.row) { item.row = this.cache.alloc(item.templateId); - item.row!.domNode!.setAttribute('role', 'treeitem'); + const role = this.ariaProvider.getRole ? this.ariaProvider.getRole(item.element) : 'treeitem'; + item.row!.domNode!.setAttribute('role', role); + const checked = this.ariaProvider.isChecked ? this.ariaProvider.isChecked(item.element) : undefined; + if (checked !== undefined) { + item.row!.domNode!.setAttribute('aria-checked', String(checked)); + } } if (!item.row.domNode!.parentElement) { @@ -634,8 +641,8 @@ export class ListView implements ISpliceable, IDisposable { item.row!.domNode!.setAttribute('data-index', `${index}`); item.row!.domNode!.setAttribute('data-last-element', index === this.length - 1 ? 'true' : 'false'); - item.row!.domNode!.setAttribute('aria-setsize', String(this.ariaSetProvider.getSetSize(item.element, index, this.length))); - item.row!.domNode!.setAttribute('aria-posinset', String(this.ariaSetProvider.getPosInSet(item.element, index))); + item.row!.domNode!.setAttribute('aria-setsize', String(this.ariaProvider.getSetSize(item.element, index, this.length))); + item.row!.domNode!.setAttribute('aria-posinset', String(this.ariaProvider.getPosInSet(item.element, index))); item.row!.domNode!.setAttribute('id', this.getElementDomId(index)); DOM.toggleClass(item.row!.domNode!, 'drop-target', item.dropTarget); diff --git a/src/vs/base/browser/ui/list/listWidget.ts b/src/vs/base/browser/ui/list/listWidget.ts index 55ac74bc01c..0e0a4df34bc 100644 --- a/src/vs/base/browser/ui/list/listWidget.ts +++ b/src/vs/base/browser/ui/list/listWidget.ts @@ -17,7 +17,7 @@ import { StandardKeyboardEvent, IKeyboardEvent } from 'vs/base/browser/keyboardE import { Event, Emitter, EventBufferer } from 'vs/base/common/event'; import { domEvent } from 'vs/base/browser/event'; import { IListVirtualDelegate, IListRenderer, IListEvent, IListContextMenuEvent, IListMouseEvent, IListTouchEvent, IListGestureEvent, IIdentityProvider, IKeyboardNavigationLabelProvider, IListDragAndDrop, IListDragOverReaction, ListAriaRootRole } from './list'; -import { ListView, IListViewOptions, IListViewDragAndDrop, IAriaSetProvider } from './listView'; +import { ListView, IListViewOptions, IListViewDragAndDrop, IAriaProvider } from './listView'; import { Color } from 'vs/base/common/color'; import { mixin } from 'vs/base/common/objects'; import { ScrollbarVisibility, ScrollEvent } from 'vs/base/common/scrollable'; @@ -831,7 +831,7 @@ export interface IListOptions extends IListStyles { readonly supportDynamicHeights?: boolean; readonly mouseSupport?: boolean; readonly horizontalScrolling?: boolean; - readonly ariaSetProvider?: IAriaSetProvider; + readonly ariaProvider?: IAriaProvider; } export interface IListStyles { diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index dad7d26545a..a034736f2f5 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -153,7 +153,7 @@ function asListOptions(modelProvider: () => ITreeModel(options?: IAsyncDataTreeOpt e => (options.expandOnlyOnTwistieClick as ((e: T) => boolean))(e.element as T) ) ), - ariaSetProvider: undefined + ariaProvider: undefined }; } From 6b8667ad8824b18d4b85250361a15d6e9fb9c5bb Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 5 Jul 2019 16:30:38 +0200 Subject: [PATCH 1147/1449] breakpoints: contribute getRole and isChecked fixes #52390 --- src/vs/workbench/contrib/debug/browser/breakpointsView.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/debug/browser/breakpointsView.ts b/src/vs/workbench/contrib/debug/browser/breakpointsView.ts index 38fe05f0eb0..e0fa0e6c9f3 100644 --- a/src/vs/workbench/contrib/debug/browser/breakpointsView.ts +++ b/src/vs/workbench/contrib/debug/browser/breakpointsView.ts @@ -76,7 +76,13 @@ export class BreakpointsView extends ViewletPanel { ], { identityProvider: { getId: (element: IEnablement) => element.getId() }, multipleSelectionSupport: false, - keyboardNavigationLabelProvider: { getKeyboardNavigationLabel: (e: IEnablement) => e } + keyboardNavigationLabelProvider: { getKeyboardNavigationLabel: (e: IEnablement) => e }, + ariaProvider: { + getSetSize: (_: IEnablement, index: number, listLength: number) => listLength, + getPosInSet: (_: IEnablement, index: number) => index, + getRole: (breakpoint: IEnablement) => 'checkbox', + isChecked: (breakpoint: IEnablement) => breakpoint.enabled + } }) as WorkbenchList; CONTEXT_BREAKPOINTS_FOCUSED.bindTo(this.list.contextKeyService); From cbd7ee6bfb3d44ddca1c99d4e09a262cded7080c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 5 Jul 2019 16:31:16 +0200 Subject: [PATCH 1148/1449] use more CHILD_CONCURRENCY=1 --- build/azure-pipelines/product-compile.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml index f7170dfa979..57fa04b46d8 100644 --- a/build/azure-pipelines/product-compile.yml +++ b/build/azure-pipelines/product-compile.yml @@ -82,8 +82,8 @@ steps: - script: | set -e - node build/azure-pipelines/common/installDistroDependencies.js - node build/azure-pipelines/common/installDistroDependencies.js remote + CHILD_CONCURRENCY=1 node build/azure-pipelines/common/installDistroDependencies.js + CHILD_CONCURRENCY=1 node build/azure-pipelines/common/installDistroDependencies.js remote displayName: Install distro dependencies condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) From 0354f73f376b7eb67d276c173a708adf4e90385b Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 5 Jul 2019 16:39:56 +0200 Subject: [PATCH 1149/1449] fix build --- src/vs/platform/storage/browser/storageService.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/vs/platform/storage/browser/storageService.ts b/src/vs/platform/storage/browser/storageService.ts index 332ffa511b3..b8c6f80c956 100644 --- a/src/vs/platform/storage/browser/storageService.ts +++ b/src/vs/platform/storage/browser/storageService.ts @@ -14,6 +14,7 @@ import { IStorage, IStorageDatabase, IUpdateRequest, Storage } from 'vs/base/par import { URI } from 'vs/base/common/uri'; import { VSBuffer } from 'vs/base/common/buffer'; import { joinPath } from 'vs/base/common/resources'; +import { serializableToMap, mapToSerializable } from 'vs/base/common/map'; export class BrowserStorageService extends Disposable implements IStorageService { @@ -51,12 +52,12 @@ export class BrowserStorageService extends Disposable implements IStorageService private async doInitialize(payload: IWorkspaceInitializationPayload): Promise { // Workspace Storage - this.workspaceStorageFile = joinPath(this.environmentService.userRoamingDataHome, 'workspaceStorage', `${payload.id}.json`); + this.workspaceStorageFile = joinPath(this.environmentService.userRoamingDataHome, 'state', `${payload.id}.json`); this.workspaceStorage = new Storage(this._register(new FileStorageDatabase(this.workspaceStorageFile, this.fileService))); this._register(this.workspaceStorage.onDidChangeStorage(key => this._onDidChangeStorage.fire({ key, scope: StorageScope.WORKSPACE }))); // Global Storage - this.globalStorageFile = joinPath(this.environmentService.userRoamingDataHome, 'globalStorage', 'global.json'); + this.globalStorageFile = joinPath(this.environmentService.userRoamingDataHome, 'state', 'global.json'); this.globalStorage = new Storage(this._register(new FileStorageDatabase(this.globalStorageFile, this.fileService))); this._register(this.globalStorage.onDidChangeStorage(key => this._onDidChangeStorage.fire({ key, scope: StorageScope.GLOBAL }))); @@ -166,7 +167,7 @@ export class FileStorageDatabase extends Disposable implements IStorageDatabase const itemsRaw = await this.fileService.readFile(this.file); - return new Map(JSON.parse(itemsRaw.value.toString())); + return serializableToMap(JSON.parse(itemsRaw.value.toString())); } async updateItems(request: IUpdateRequest): Promise { @@ -192,11 +193,9 @@ export class FileStorageDatabase extends Disposable implements IStorageDatabase request.delete.forEach(key => items.delete(key)); } - const itemsRaw = JSON.stringify([...items]); - await this.pendingUpdate; - this.pendingUpdate = this.fileService.writeFile(this.file, VSBuffer.fromString(itemsRaw)).then(); + this.pendingUpdate = this.fileService.writeFile(this.file, VSBuffer.fromString(JSON.stringify(mapToSerializable(items)))).then(); return this.pendingUpdate; } From 7347fd69d0f1bef2d5026aacefde69417ed652d6 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 5 Jul 2019 16:42:20 +0200 Subject: [PATCH 1150/1449] :facepalm: --- build/azure-pipelines/product-compile.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml index 57fa04b46d8..9aaf54363dc 100644 --- a/build/azure-pipelines/product-compile.yml +++ b/build/azure-pipelines/product-compile.yml @@ -89,10 +89,9 @@ steps: # Mixin must run before optimize, because the CSS loader will # inline small SVGs -- powershell: | - . build/azure-pipelines/win32/exec.ps1 - $ErrorActionPreference = "Stop" - exec { yarn gulp mixin } +- script: | + set -e + yarn gulp mixin displayName: Mix in quality - script: | From b8478cd7f64586655192b14a9dd6b4f47ec0fb93 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 5 Jul 2019 17:00:31 +0200 Subject: [PATCH 1151/1449] remove build debug --- build/azure-pipelines/product-compile.yml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml index 9aaf54363dc..a60075132f5 100644 --- a/build/azure-pipelines/product-compile.yml +++ b/build/azure-pipelines/product-compile.yml @@ -115,12 +115,6 @@ steps: displayName: Compile condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) -- script: | - set -e - ls -la .build/extensions/ms-vscode.node-debug2/node_modules - displayName: Debug - condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) - - script: | set -e yarn gulp minify-vscode @@ -129,12 +123,6 @@ steps: displayName: Compile condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) -- script: | - set -e - ls -la .build/extensions/ms-vscode.node-debug2/node_modules - displayName: Debug - condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) - - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: keyfile: '.build/commit' From b342abd3051591b35078403b9b2636cf9dd6437a Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 5 Jul 2019 17:01:55 +0200 Subject: [PATCH 1152/1449] Revert "remove yarn cache" This reverts commit 19d674f412d53f458da81a5c4290fa7eb2d0ee53. Revert "Revert build perf" This reverts commit ef893f0cfe7d80bd695005cfea24d481a4722bb3. --- build/.cachesalt | 1 + build/azure-pipelines/compile.yml | 78 ----------- .../darwin/product-build-darwin.yml | 87 +++++++------ .../alpine/build.sh} | 0 .../alpine/prebuild.sh} | 0 .../alpine/publish.sh} | 0 .../armhf/build.sh} | 0 .../armhf/prebuild.sh} | 0 .../armhf/publish.sh} | 0 .../linux/product-build-linux-alpine.yml | 108 ---------------- ....yml => product-build-linux-multiarch.yml} | 71 +++++----- .../linux/product-build-linux.yml | 89 ++++++------- build/azure-pipelines/product-build.yml | 89 +++++++------ build/azure-pipelines/product-compile.yml | 121 ++++++++++++++++++ .../win32/product-build-win32.yml | 97 +++++++------- build/gulpfile.compile.js | 2 + build/gulpfile.vscode.js | 25 +++- package.json | 4 +- .../keybinding/browser/keybindingService.ts | 2 +- .../textfile/test/textFileService.io.test.ts | 5 +- 20 files changed, 376 insertions(+), 403 deletions(-) create mode 100644 build/.cachesalt delete mode 100644 build/azure-pipelines/compile.yml rename build/azure-pipelines/linux/{build-alpine.sh => multiarch/alpine/build.sh} (100%) rename build/azure-pipelines/linux/{build-arm.sh => multiarch/alpine/prebuild.sh} (100%) rename build/azure-pipelines/linux/{prebuild-alpine.sh => multiarch/alpine/publish.sh} (100%) rename build/azure-pipelines/linux/{prebuild-arm.sh => multiarch/armhf/build.sh} (100%) rename build/azure-pipelines/linux/{publish-alpine.sh => multiarch/armhf/prebuild.sh} (100%) rename build/azure-pipelines/linux/{publish-arm.sh => multiarch/armhf/publish.sh} (100%) delete mode 100644 build/azure-pipelines/linux/product-build-linux-alpine.yml rename build/azure-pipelines/linux/{product-build-linux-arm.yml => product-build-linux-multiarch.yml} (51%) create mode 100644 build/azure-pipelines/product-compile.yml diff --git a/build/.cachesalt b/build/.cachesalt new file mode 100644 index 00000000000..56a6051ca2b --- /dev/null +++ b/build/.cachesalt @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/build/azure-pipelines/compile.yml b/build/azure-pipelines/compile.yml deleted file mode 100644 index a6b7f79a8a5..00000000000 --- a/build/azure-pipelines/compile.yml +++ /dev/null @@ -1,78 +0,0 @@ -steps: -- task: AzureKeyVault@1 - displayName: 'Azure Key Vault: Get Secrets' - inputs: - azureSubscription: 'vscode-builds-subscription' - KeyVaultName: vscode - -- task: NodeTool@0 - inputs: - versionSpec: "10.15.1" - -- script: | - set -e - cat << EOF > ~/.netrc - machine monacotools.visualstudio.com - password $(devops-pat) - machine github.com - login vscode - password $(github-distro-mixin-password) - EOF - git config user.email "vscode@microsoft.com" - git config user.name "VSCode" - displayName: Prepare tooling - -- script: | - set -e - git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git" - git fetch distro - git merge $(node -p "require('./package.json').distro") - displayName: Merge distro - -# - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 -# inputs: -# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' -# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' -# vstsFeed: '$(ArtifactFeed)' - -- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 - inputs: - versionSpec: "1.10.1" - -- script: 'yarn --frozen-lockfile' - displayName: Install Dependencies - condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - -# - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 -# inputs: -# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' -# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' -# vstsFeed: '$(ArtifactFeed)' -# condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - -- script: 'yarn gulp mixin' - displayName: Mix in quality - -- script: 'yarn gulp hygiene' - displayName: Run hygiene checks - -- script: 'yarn monaco-compile-check' - displayName: Run Monaco compilation checks - -- script: | - set -e - cd $BUILD_STAGINGDIRECTORY - git clone https://github.com/microsoft/vscode-telemetry-extractor.git - cd vscode-telemetry-extractor - git checkout 3b04aba5bfdfcca1a5426cd2c51a90d18740d0bc - npm i - npm run setup-extension-repos - node ./out/cli-extract.js --sourceDir $BUILD_SOURCESDIRECTORY --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents - node ./out/cli-extract-extensions.js --sourceDir ./src/telemetry-sources --outputDir . --applyEndpoints --includeIsMeasurement - mkdir -p $BUILD_SOURCESDIRECTORY/.build/telemetry - mv declarations-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-core.json - mv declarations-extensions-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-extensions.json - displayName: Extract Telemetry - -- script: 'VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" ./build/azure-pipelines/linux/build.sh' - displayName: Build \ No newline at end of file diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index fda58607660..2fcc73f632d 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -1,4 +1,23 @@ steps: +- script: | + mkdir -p .build + echo -n $BUILD_SOURCEVERSION > .build/commit + displayName: Prepare cache flag + +- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + inputs: + keyfile: '.build/commit' + targetfolder: '.build, **/out-build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' + vstsFeed: 'npm-vscode' + platformIndependent: true + alias: 'Compilation' + +- script: | + set -e + exit 1 + displayName: Check RestoreCache + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + - task: NodeTool@0 inputs: versionSpec: "10.15.1" @@ -35,30 +54,36 @@ steps: git merge $(node -p "require('./package.json').distro") displayName: Merge distro -# - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 -# inputs: -# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' -# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' -# vstsFeed: 'npm-vscode' +- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + inputs: + keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'npm-vscode' - script: | set -e CHILD_CONCURRENCY=1 yarn --frozen-lockfile displayName: Install dependencies - # condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) -# - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 -# inputs: -# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' -# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' -# vstsFeed: 'npm-vscode' -# condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) +- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 + inputs: + keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'npm-vscode' + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) -# - script: | -# set -e -# yarn postinstall -# displayName: Run postinstall scripts - # condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) +- script: | + set -e + yarn postinstall + displayName: Run postinstall scripts + condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) + +- script: | + set -e + node build/azure-pipelines/common/installDistroDependencies.js + node build/azure-pipelines/common/installDistroDependencies.js remote + displayName: Install distro dependencies - script: | set -e @@ -67,34 +92,12 @@ steps: - script: | set -e - yarn gulp hygiene - yarn monaco-compile-check - displayName: Run hygiene checks - condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - -- script: | - set -e - node build/azure-pipelines/common/installDistroDependencies.js - node build/azure-pipelines/common/installDistroDependencies.js remote - node build/lib/builtInExtensions.js - displayName: Install distro dependencies and extensions - -- script: | - set -e - ./build/azure-pipelines/common/extract-telemetry.sh - displayName: Extract Telemetry - -- script: | - set -e - yarn gulp compile-build - yarn gulp compile-extensions-build-legacy - yarn gulp compile-extensions-build VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-darwin-ci + yarn gulp vscode-darwin-min-ci VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-reh-darwin-ci + yarn gulp vscode-reh-darwin-min-ci VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - yarn gulp vscode-web-darwin-ci + yarn gulp vscode-web-darwin-min-ci AZURE_STORAGE_ACCESS_KEY="$(ticino-storage-key)" \ yarn gulp upload-vscode-sourcemaps displayName: Build diff --git a/build/azure-pipelines/linux/build-alpine.sh b/build/azure-pipelines/linux/multiarch/alpine/build.sh similarity index 100% rename from build/azure-pipelines/linux/build-alpine.sh rename to build/azure-pipelines/linux/multiarch/alpine/build.sh diff --git a/build/azure-pipelines/linux/build-arm.sh b/build/azure-pipelines/linux/multiarch/alpine/prebuild.sh similarity index 100% rename from build/azure-pipelines/linux/build-arm.sh rename to build/azure-pipelines/linux/multiarch/alpine/prebuild.sh diff --git a/build/azure-pipelines/linux/prebuild-alpine.sh b/build/azure-pipelines/linux/multiarch/alpine/publish.sh similarity index 100% rename from build/azure-pipelines/linux/prebuild-alpine.sh rename to build/azure-pipelines/linux/multiarch/alpine/publish.sh diff --git a/build/azure-pipelines/linux/prebuild-arm.sh b/build/azure-pipelines/linux/multiarch/armhf/build.sh similarity index 100% rename from build/azure-pipelines/linux/prebuild-arm.sh rename to build/azure-pipelines/linux/multiarch/armhf/build.sh diff --git a/build/azure-pipelines/linux/publish-alpine.sh b/build/azure-pipelines/linux/multiarch/armhf/prebuild.sh similarity index 100% rename from build/azure-pipelines/linux/publish-alpine.sh rename to build/azure-pipelines/linux/multiarch/armhf/prebuild.sh diff --git a/build/azure-pipelines/linux/publish-arm.sh b/build/azure-pipelines/linux/multiarch/armhf/publish.sh similarity index 100% rename from build/azure-pipelines/linux/publish-arm.sh rename to build/azure-pipelines/linux/multiarch/armhf/publish.sh diff --git a/build/azure-pipelines/linux/product-build-linux-alpine.yml b/build/azure-pipelines/linux/product-build-linux-alpine.yml deleted file mode 100644 index 50f490b46a7..00000000000 --- a/build/azure-pipelines/linux/product-build-linux-alpine.yml +++ /dev/null @@ -1,108 +0,0 @@ -steps: -- task: NodeTool@0 - inputs: - versionSpec: "10.15.1" - -- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 - inputs: - versionSpec: "1.10.1" - -- task: AzureKeyVault@1 - displayName: 'Azure Key Vault: Get Secrets' - inputs: - azureSubscription: 'vscode-builds-subscription' - KeyVaultName: vscode - -- task: Docker@1 - displayName: 'Pull image' - inputs: - azureSubscriptionEndpoint: 'vscode-builds-subscription' - azureContainerRegistry: vscodehub.azurecr.io - command: 'Run an image' - imageName: 'vscode-linux-build-agent:alpine' - containerCommand: uname - -- script: | - set -e - - cat << EOF > ~/.netrc - machine monacotools.visualstudio.com - password $(devops-pat) - machine github.com - login vscode - password $(github-distro-mixin-password) - EOF - - git config user.email "vscode@microsoft.com" - git config user.name "VSCode" - displayName: Prepare tooling - -- script: | - set -e - git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git" - git fetch distro - git merge $(node -p "require('./package.json').distro") - displayName: Merge distro - -# - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 -# inputs: -# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' -# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' -# vstsFeed: 'npm-vscode' - -- script: | - set -e - CHILD_CONCURRENCY=1 yarn --frozen-lockfile - displayName: Install dependencies - # condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - -# - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 -# inputs: -# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' -# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' -# vstsFeed: 'npm-vscode' -# condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) - -# - script: | -# set -e -# yarn postinstall -# displayName: Run postinstall scripts -# condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) - -- script: | - set -e - yarn gulp mixin - displayName: Mix in quality - -- script: | - set -e - yarn gulp hygiene - yarn monaco-compile-check - displayName: Run hygiene checks - condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - -- script: | - set -e - ./build/azure-pipelines/linux/prebuild-alpine.sh - displayName: Prepare build - -- script: | - set -e - yarn gulp compile-build - yarn gulp compile-extensions-build-legacy - yarn gulp compile-extensions-build - ./build/azure-pipelines/linux/build-alpine.sh - displayName: Build - -- script: | - set -e - AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \ - AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ - VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ - VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ - ./build/azure-pipelines/linux/publish-alpine.sh - displayName: Publish - -- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 - displayName: 'Component Detection' - continueOnError: true \ No newline at end of file diff --git a/build/azure-pipelines/linux/product-build-linux-arm.yml b/build/azure-pipelines/linux/product-build-linux-multiarch.yml similarity index 51% rename from build/azure-pipelines/linux/product-build-linux-arm.yml rename to build/azure-pipelines/linux/product-build-linux-multiarch.yml index 9c79d33a93e..fb255944c04 100644 --- a/build/azure-pipelines/linux/product-build-linux-arm.yml +++ b/build/azure-pipelines/linux/product-build-linux-multiarch.yml @@ -1,4 +1,23 @@ steps: +- script: | + mkdir -p .build + echo -n $BUILD_SOURCEVERSION > .build/commit + displayName: Prepare cache flag + +- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + inputs: + keyfile: '.build/commit' + targetfolder: '.build, **/out-build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' + vstsFeed: 'npm-vscode' + platformIndependent: true + alias: 'Compilation' + +- script: | + set -e + exit 1 + displayName: Check RestoreCache + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + - task: NodeTool@0 inputs: versionSpec: "10.15.1" @@ -19,7 +38,7 @@ steps: azureSubscriptionEndpoint: 'vscode-builds-subscription' azureContainerRegistry: vscodehub.azurecr.io command: 'Run an image' - imageName: 'vscode-linux-build-agent:armhf' + imageName: 'vscode-linux-build-agent:$(VSCODE_ARCH)' containerCommand: uname - script: | @@ -44,30 +63,30 @@ steps: git merge $(node -p "require('./package.json').distro") displayName: Merge distro -# - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 -# inputs: -# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' -# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' -# vstsFeed: 'npm-vscode' +- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + inputs: + keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'npm-vscode' - script: | set -e CHILD_CONCURRENCY=1 yarn --frozen-lockfile displayName: Install dependencies - # condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) -# - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 -# inputs: -# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' -# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' -# vstsFeed: 'npm-vscode' -# condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) +- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 + inputs: + keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'npm-vscode' + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) -# - script: | -# set -e -# yarn postinstall -# displayName: Run postinstall scripts -# condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) +- script: | + set -e + yarn postinstall + displayName: Run postinstall scripts + condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) - script: | set -e @@ -76,22 +95,12 @@ steps: - script: | set -e - yarn gulp hygiene - yarn monaco-compile-check - displayName: Run hygiene checks - condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - -- script: | - set -e - ./build/azure-pipelines/linux/prebuild-arm.sh + ./build/azure-pipelines/linux/multiarch/$(VSCODE_ARCH)/prebuild.sh displayName: Prebuild - script: | set -e - yarn gulp compile-build - yarn gulp compile-extensions-build-legacy - yarn gulp compile-extensions-build - ./build/azure-pipelines/linux/build-arm.sh + ./build/azure-pipelines/linux/multiarch/$(VSCODE_ARCH)/build.sh displayName: Build - script: | @@ -100,7 +109,7 @@ steps: AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \ VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \ - ./build/azure-pipelines/linux/publish-arm.sh + ./build/azure-pipelines/linux/multiarch/$(VSCODE_ARCH)/publish.sh displayName: Publish - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 0960b70e59d..369c8abc7d0 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -1,4 +1,23 @@ steps: +- script: | + mkdir -p .build + echo -n $BUILD_SOURCEVERSION > .build/commit + displayName: Prepare cache flag + +- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + inputs: + keyfile: '.build/commit' + targetfolder: '.build, **/out-build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' + vstsFeed: 'npm-vscode' + platformIndependent: true + alias: 'Compilation' + +- script: | + set -e + exit 1 + displayName: Check RestoreCache + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + - task: NodeTool@0 inputs: versionSpec: "10.15.1" @@ -36,30 +55,36 @@ steps: git merge $(node -p "require('./package.json').distro") displayName: Merge distro -# - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 -# inputs: -# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' -# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' -# vstsFeed: 'npm-vscode' +- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + inputs: + keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'npm-vscode' - script: | set -e CHILD_CONCURRENCY=1 yarn --frozen-lockfile displayName: Install dependencies -# condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) -# - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 -# inputs: -# keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' -# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' -# vstsFeed: 'npm-vscode' -# condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) +- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 + inputs: + keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'npm-vscode' + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) -# - script: | -# set -e -# yarn postinstall -# displayName: Run postinstall scripts -# condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) +- script: | + set -e + yarn postinstall + displayName: Run postinstall scripts + condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) + +- script: | + set -e + node build/azure-pipelines/common/installDistroDependencies.js + node build/azure-pipelines/common/installDistroDependencies.js remote + displayName: Install distro dependencies - script: | set -e @@ -68,28 +93,6 @@ steps: - script: | set -e - yarn gulp hygiene - yarn monaco-compile-check - displayName: Run hygiene checks - condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - -- script: | - set -e - node build/azure-pipelines/common/installDistroDependencies.js - node build/azure-pipelines/common/installDistroDependencies.js remote - node build/lib/builtInExtensions.js - displayName: Install distro dependencies and extensions - -- script: | - set -e - ./build/azure-pipelines/common/extract-telemetry.sh - displayName: Extract Telemetry - -- script: | - set -e - yarn gulp compile-build - yarn gulp compile-extensions-build-legacy - yarn gulp compile-extensions-build VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ yarn gulp vscode-linux-$VSCODE_ARCH-min-ci VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \ @@ -119,12 +122,12 @@ steps: ./build/azure-pipelines/linux/publish.sh displayName: Publish -- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 - displayName: 'Component Detection' - continueOnError: true - - task: PublishPipelineArtifact@0 displayName: 'Publish Pipeline Artifact' inputs: artifactName: snap-$(VSCODE_ARCH) targetPath: .build/linux/snap-tarball + +- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 + displayName: 'Component Detection' + continueOnError: true diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index aca968c646d..ddaabdcdc72 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -7,45 +7,54 @@ resources: image: snapcore/snapcraft:stable jobs: -# - job: Compile -# pool: -# vmImage: 'Ubuntu-16.04' -# steps: -# - template: compile.yml - -- job: Windows - condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32'], 'true')) - timeoutInMinutes: 120 - pool: - vmImage: VS2017-Win2016 - variables: - VSCODE_ARCH: x64 - steps: - - template: win32/product-build-win32.yml - -- job: Windows32 - condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true')) - timeoutInMinutes: 120 - pool: - vmImage: VS2017-Win2016 - variables: - VSCODE_ARCH: ia32 - steps: - - template: win32/product-build-win32.yml - -- job: Linux - condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) - timeoutInMinutes: 120 +- job: Compile pool: vmImage: 'Ubuntu-16.04' variables: VSCODE_ARCH: x64 container: vscode-x64 steps: + - template: product-compile.yml + +- job: Windows + condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_WIN32'], 'true')) + timeoutInMinutes: 120 + pool: + vmImage: VS2017-Win2016 + variables: + VSCODE_ARCH: x64 + dependsOn: + - Compile + steps: + - template: win32/product-build-win32.yml + +- job: Windows32 + condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true')) + timeoutInMinutes: 120 + pool: + vmImage: VS2017-Win2016 + variables: + VSCODE_ARCH: ia32 + dependsOn: + - Compile + steps: + - template: win32/product-build-win32.yml + +- job: Linux + condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_LINUX'], 'true')) + timeoutInMinutes: 120 + pool: + vmImage: 'Ubuntu-16.04' + variables: + VSCODE_ARCH: x64 + container: vscode-x64 + dependsOn: + - Compile + steps: - template: linux/product-build-linux.yml - job: LinuxSnap - condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true')) + condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_LINUX'], 'true')) timeoutInMinutes: 120 pool: vmImage: 'Ubuntu-16.04' @@ -57,35 +66,41 @@ jobs: - template: linux/snap-build-linux.yml - job: LinuxArmhf - condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) + condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) timeoutInMinutes: 120 pool: vmImage: 'Ubuntu-16.04' variables: VSCODE_ARCH: armhf + dependsOn: + - Compile steps: - - template: linux/product-build-linux-arm.yml + - template: linux/product-build-linux-multiarch.yml - job: LinuxAlpine - condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) + condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable')) timeoutInMinutes: 120 pool: vmImage: 'Ubuntu-16.04' variables: VSCODE_ARCH: alpine + dependsOn: + - Compile steps: - - template: linux/product-build-linux-alpine.yml + - template: linux/product-build-linux-multiarch.yml - job: macOS - condition: and(succeeded(), eq(variables['VSCODE_BUILD_MACOS'], 'true')) + condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_MACOS'], 'true')) timeoutInMinutes: 120 pool: vmImage: macOS 10.13 + dependsOn: + - Compile steps: - template: darwin/product-build-darwin.yml - job: Release - condition: and(succeeded(), or(eq(variables['VSCODE_RELEASE'], 'true'), and(or(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['VSCODE_QUALITY'], 'exploration')), eq(variables['Build.Reason'], 'Schedule')))) + condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), or(eq(variables['VSCODE_RELEASE'], 'true'), and(or(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['VSCODE_QUALITY'], 'exploration')), eq(variables['Build.Reason'], 'Schedule')))) pool: vmImage: 'Ubuntu-16.04' dependsOn: @@ -102,7 +117,7 @@ jobs: - job: Mooncake pool: vmImage: 'Ubuntu-16.04' - condition: true + condition: and(succeededOrFailed(), eq(variables['VSCODE_COMPILE_ONLY'], 'false')) dependsOn: - Windows - Windows32 diff --git a/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml new file mode 100644 index 00000000000..a894140f52d --- /dev/null +++ b/build/azure-pipelines/product-compile.yml @@ -0,0 +1,121 @@ +steps: +- script: | + mkdir -p .build + echo -n $BUILD_SOURCEVERSION > .build/commit + displayName: Prepare cache flag + +- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + inputs: + keyfile: '.build/commit' + targetfolder: '.build, **/out-build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' + vstsFeed: 'npm-vscode' + platformIndependent: true + alias: 'Compilation' + +- task: NodeTool@0 + inputs: + versionSpec: "10.15.1" + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + +- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 + inputs: + versionSpec: "1.10.1" + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + +- task: AzureKeyVault@1 + displayName: 'Azure Key Vault: Get Secrets' + inputs: + azureSubscription: 'vscode-builds-subscription' + KeyVaultName: vscode + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + +- script: | + set -e + export npm_config_arch="$(VSCODE_ARCH)" + + cat << EOF > ~/.netrc + machine monacotools.visualstudio.com + password $(devops-pat) + machine github.com + login vscode + password $(github-distro-mixin-password) + EOF + + git config user.email "vscode@microsoft.com" + git config user.name "VSCode" + displayName: Prepare tooling + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + +- script: | + set -e + git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git" + git fetch distro + git merge $(node -p "require('./package.json').distro") + displayName: Merge distro + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + +- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + inputs: + keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'npm-vscode' + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + +- script: | + set -e + CHILD_CONCURRENCY=1 yarn --frozen-lockfile + displayName: Install dependencies + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), ne(variables['CacheRestored'], 'true')) + +- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 + inputs: + keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'npm-vscode' + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), ne(variables['CacheRestored'], 'true')) + +- script: | + set -e + yarn postinstall + displayName: Run postinstall scripts + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), eq(variables['CacheRestored'], 'true')) + +- script: | + set -e + node build/azure-pipelines/common/installDistroDependencies.js + node build/azure-pipelines/common/installDistroDependencies.js remote + displayName: Install distro dependencies + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + +- script: | + set -e + yarn gulp hygiene + yarn monaco-compile-check + displayName: Run hygiene checks + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) + +- script: | + set - + ./build/azure-pipelines/common/extract-telemetry.sh + displayName: Extract Telemetry + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + +- script: | + set -e + yarn gulp compile-build + yarn gulp compile-extensions-build-legacy + yarn gulp compile-extensions-build + yarn gulp minify-vscode + yarn gulp minify-vscode-reh + yarn gulp minify-vscode-web + displayName: Compile + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + +- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 + inputs: + keyfile: '.build/commit' + targetfolder: '.build, **/out-build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' + vstsFeed: 'npm-vscode' + platformIndependent: true + alias: 'Compilation' + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) \ No newline at end of file diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 0ccaab54a22..0aba8e8c3ce 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -1,4 +1,23 @@ steps: +- powershell: | + mkdir .build -ea 0 + "$env:BUILD_SOURCEVERSION" | Out-File -Encoding ascii -NoNewLine .build\commit + displayName: Prepare cache flag + +- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + inputs: + keyfile: '.build/commit' + targetfolder: '.build, **/out-build, **/out-vscode-min, **/out-vscode-reh-min, **/out-vscode-web-min' + vstsFeed: 'npm-vscode' + platformIndependent: true + alias: 'Compilation' + +- powershell: | + $ErrorActionPreference = "Stop" + exit 1 + displayName: Check RestoreCache + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) + - task: NodeTool@0 inputs: versionSpec: "10.15.1" @@ -38,11 +57,11 @@ steps: exec { git merge $(node -p "require('./package.json').distro") } displayName: Merge distro -# - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 -# inputs: -# keyfile: '.build/arch, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' -# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' -# vstsFeed: 'npm-vscode' +- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + inputs: + keyfile: 'build/.cachesalt, .build/arch, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'npm-vscode' - powershell: | . build/azure-pipelines/win32/exec.ps1 @@ -51,21 +70,28 @@ steps: $env:CHILD_CONCURRENCY="1" exec { yarn --frozen-lockfile } displayName: Install dependencies - # condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) -# - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 -# inputs: -# keyfile: '.build/arch, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' -# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' -# vstsFeed: 'npm-vscode' -# condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) +- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 + inputs: + keyfile: 'build/.cachesalt, .build/arch, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'npm-vscode' + condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) -# - powershell: | -# . build/azure-pipelines/win32/exec.ps1 -# $ErrorActionPreference = "Stop" -# exec { yarn postinstall } -# displayName: Run postinstall scripts -# condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) +- powershell: | + . build/azure-pipelines/win32/exec.ps1 + $ErrorActionPreference = "Stop" + exec { yarn postinstall } + displayName: Run postinstall scripts + condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) + +- powershell: | + . build/azure-pipelines/win32/exec.ps1 + $ErrorActionPreference = "Stop" + exec { node build/azure-pipelines/common/installDistroDependencies.js } + exec { node build/azure-pipelines/common/installDistroDependencies.js remote } + displayName: Install distro dependencies - powershell: | . build/azure-pipelines/win32/exec.ps1 @@ -73,45 +99,10 @@ steps: exec { yarn gulp mixin } displayName: Mix in quality -- powershell: | - . build/azure-pipelines/win32/exec.ps1 - $ErrorActionPreference = "Stop" - exec { yarn gulp hygiene } - exec { yarn monaco-compile-check } - displayName: Run hygiene checks - condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - -- powershell: | - . build/azure-pipelines/win32/exec.ps1 - $ErrorActionPreference = "Stop" - exec { node build/azure-pipelines/common/installDistroDependencies.js } - exec { node build/azure-pipelines/common/installDistroDependencies.js remote } - exec { node build/lib/builtInExtensions.js } - displayName: Install distro dependencies and extensions - -- powershell: | - . build/azure-pipelines/win32/exec.ps1 - $ErrorActionPreference = "Stop" - cd $env:BUILD_STAGINGDIRECTORY - exec { git clone https://github.com/microsoft/vscode-telemetry-extractor.git } - cd vscode-telemetry-extractor - exec { git checkout f538e3157c84d1bd0b239dfc5ebccac226006d58 } - exec { npm i } - exec { npm run setup-extension-repos } - exec { node .\out\cli-extract.js --sourceDir $env:BUILD_SOURCESDIRECTORY --excludedDirPattern extensions --outputDir . --applyEndpoints --includeIsMeasurement --patchWebsiteEvents } - exec { node .\out\cli-extract-extensions.js --sourceDir .\src\telemetry-sources --outputDir . --applyEndpoints --includeIsMeasurement } - mkdir $env:BUILD_SOURCESDIRECTORY\.build\telemetry -ea 0 - mv declarations-resolved.json $env:BUILD_SOURCESDIRECTORY\.build\telemetry\telemetry-core.json - mv declarations-extensions-resolved.json $env:BUILD_SOURCESDIRECTORY\.build\telemetry\telemetry-extensions.json - displayName: Extract Telemetry - - powershell: | . build/azure-pipelines/win32/exec.ps1 $ErrorActionPreference = "Stop" $env:VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" - exec { yarn gulp compile-build } - exec { yarn gulp compile-extensions-build-legacy } - exec { yarn gulp compile-extensions-build } exec { yarn gulp "vscode-win32-$env:VSCODE_ARCH-min-ci" } exec { yarn gulp "vscode-reh-win32-$env:VSCODE_ARCH-min-ci" } exec { yarn gulp "vscode-web-win32-$env:VSCODE_ARCH-min-ci" } diff --git a/build/gulpfile.compile.js b/build/gulpfile.compile.js index a32936ef4b2..21aa7896558 100644 --- a/build/gulpfile.compile.js +++ b/build/gulpfile.compile.js @@ -5,10 +5,12 @@ 'use strict'; +const gulp = require('gulp'); const util = require('./lib/util'); const task = require('./lib/task'); const compilation = require('./lib/compilation'); // Full compile, including nls and inline sources in sourcemaps, for build const compileBuildTask = task.define('compile-build', task.series(util.rimraf('out-build'), compilation.compileTask('src', 'out-build', true))); +gulp.task(compileBuildTask); exports.compileBuildTask = compileBuildTask; \ No newline at end of file diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 2846595f605..2475b3b6c45 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -104,6 +104,7 @@ const optimizeVSCodeTask = task.define('optimize-vscode', task.series( bundleInfo: undefined }) )); +gulp.task(optimizeVSCodeTask); const sourceMappingURLBase = `https://ticino.blob.core.windows.net/sourcemaps/${commit}`; const minifyVSCodeTask = task.define('minify-vscode', task.series( @@ -117,6 +118,7 @@ const minifyVSCodeTask = task.define('minify-vscode', task.series( }, common.minifyTask('out-vscode', `${sourceMappingURLBase}/core`) )); +gulp.task(minifyVSCodeTask); // Package @@ -307,13 +309,22 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op const telemetry = gulp.src('.build/telemetry/**', { base: '.build/telemetry', dot: true }); - const depsSrc = [ - ..._.flatten(productionDependencies.map(d => path.relative(root, d.path)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`])), - // @ts-ignore JSON checking: dependencies is optional - ..._.flatten(Object.keys(product.dependencies || {}).map(d => [`node_modules/${d}/**`, `!node_modules/${d}/**/{test,tests}/**`])) - ]; + const dependenciesSrc = _.flatten(productionDependencies.map(d => path.relative(root, d.path)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`])); - const deps = gulp.src(depsSrc, { base: '.', dot: true }) + // Collect distro dependencies, if any + if (quality) { + const qualityPackagePath = path.join(root, 'quality', quality, 'package.json'); + + if (fs.existsSync(qualityPackagePath)) { + const pkg = JSON.parse(fs.readFileSync(qualityPackagePath, 'utf8')); + + // @ts-ignore JSON checking: dependencies is optional + const distroDependencies = _.flatten(Object.keys(pkg.dependencies || {}).map(d => [`node_modules/${d}/**`, `!node_modules/${d}/**/{test,tests}/**`])); + dependenciesSrc.push(...distroDependencies); + } + } + + const deps = gulp.src(dependenciesSrc, { base: '.', dot: true }) .pipe(filter(['**', '!**/package-lock.json'])) .pipe(util.cleanNodeModules(path.join(__dirname, '.nativeignore'))) .pipe(createAsar(path.join(process.cwd(), 'node_modules'), ['**/*.node', '**/vscode-ripgrep/bin/*', '**/node-pty/build/Release/*'], 'app/node_modules.asar')); @@ -438,7 +449,6 @@ BUILD_TARGETS.forEach(buildTarget => { const destinationFolderName = `VSCode${dashed(platform)}${dashed(arch)}`; const vscodeTaskCI = task.define(`vscode${dashed(platform)}${dashed(arch)}${dashed(minified)}-ci`, task.series( - minified ? minifyVSCodeTask : optimizeVSCodeTask, util.rimraf(path.join(buildRoot, destinationFolderName)), packageTask(platform, arch, sourceFolderName, destinationFolderName, opts) )); @@ -447,6 +457,7 @@ BUILD_TARGETS.forEach(buildTarget => { const vscodeTask = task.define(`vscode${dashed(platform)}${dashed(arch)}${dashed(minified)}`, task.series( compileBuildTask, compileExtensionsBuildTask, + minified ? minifyVSCodeTask : optimizeVSCodeTask, vscodeTaskCI )); gulp.task(vscodeTask); diff --git a/package.json b/package.json index 38463fe255f..df3df6ff757 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "232f54dd8c50f5bdf086c2c557a42954a41170bd", + "distro": "65898cd4327756aaf3f5e65f02d0e1edee2db1a9", "author": { "name": "Microsoft Corporation" }, @@ -156,4 +156,4 @@ "windows-mutex": "0.2.1", "windows-process-tree": "0.2.3" } -} +} \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/browser/keybindingService.ts b/src/vs/workbench/services/keybinding/browser/keybindingService.ts index 1a165e03627..ed247dae97a 100644 --- a/src/vs/workbench/services/keybinding/browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/browser/keybindingService.ts @@ -532,7 +532,7 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { mightProducePrintableCharacter(event: IKeyboardEvent): boolean { if (event.ctrlKey || event.metaKey || event.altKey) { - // ignore ctrl/cmd-combination but not shift/alt-combinatios + // ignore ctrl/cmd/alt-combination but not shift-combinatios return false; } const code = ScanCodeUtils.toEnum(event.code); diff --git a/src/vs/workbench/services/textfile/test/textFileService.io.test.ts b/src/vs/workbench/services/textfile/test/textFileService.io.test.ts index 3337c56b2a2..8d4e1a407d1 100644 --- a/src/vs/workbench/services/textfile/test/textFileService.io.test.ts +++ b/src/vs/workbench/services/textfile/test/textFileService.io.test.ts @@ -247,7 +247,10 @@ suite('Files - TextFileService i/o', () => { } test('write - use encoding (cp1252)', async () => { - await testEncodingKeepsData(URI.file(join(testDir, 'some_cp1252.txt')), 'cp1252', ['ObjectCount = LoadObjects("Öffentlicher Ordner");', '', 'Private = "Persönliche Information"', ''].join(isWindows ? '\r\n' : '\n')); + const filePath = join(testDir, 'some_cp1252.txt'); + const contents = await readFile(filePath, 'utf8'); + const eol = /\r\n/.test(contents) ? '\r\n' : '\n'; + await testEncodingKeepsData(URI.file(filePath), 'cp1252', ['ObjectCount = LoadObjects("Öffentlicher Ordner");', '', 'Private = "Persönliche Information"', ''].join(eol)); }); test('write - use encoding (shiftjis)', async () => { From 5fbb8ba09f2448273b57d6fd488c601e2495e27c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 5 Jul 2019 17:03:15 +0200 Subject: [PATCH 1153/1449] stitch everything back together --- build/azure-pipelines/product-compile.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml index a60075132f5..9b7b18497ae 100644 --- a/build/azure-pipelines/product-compile.yml +++ b/build/azure-pipelines/product-compile.yml @@ -112,11 +112,6 @@ steps: yarn gulp compile-build yarn gulp compile-extensions-build-legacy yarn gulp compile-extensions-build - displayName: Compile - condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) - -- script: | - set -e yarn gulp minify-vscode yarn gulp minify-vscode-reh yarn gulp minify-vscode-web From ed54d9a4831cac2193dc34fcdfb8abdd63fcaeee Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 5 Jul 2019 08:03:39 -0700 Subject: [PATCH 1154/1449] Allow tasks to attach virtual process to a terminal created on renderer --- src/vs/workbench/api/node/extHostTerminalService.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 524cd7abb1e..744c0ca3c2c 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -337,6 +337,16 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { return terminal; } + public async attachVirtualProcessToTerminal(id: number, virtualProcess: vscode.TerminalVirtualProcess): Promise { + const terminal = this._getTerminalById(id); + if (!terminal) { + throw new Error(`Cannot resolve terminal with id ${id} for virtual process`); + } + const p = new ExtHostVirtualProcess(virtualProcess); + this._setupExtHostProcessListeners(id, p); + p.startSendingEvents(); + } + public createTerminalRenderer(name: string): vscode.TerminalRenderer { const terminal = new ExtHostTerminal(this._proxy, name); terminal._setProcessId(undefined); From 9c37b99a8c56df1a50f0cc4bc15967f58333fe6c Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 5 Jul 2019 17:11:25 +0200 Subject: [PATCH 1155/1449] fixes #61616 --- .../extensions/electron-browser/extensionEditor.ts | 10 ++++++---- .../electron-browser/media/extensionEditor.css | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts index c30e01a7d91..e536b6d9376 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts @@ -127,7 +127,7 @@ class NavBar extends Disposable { _update(id: string | null = this.currentId, focus?: boolean): Promise { this.currentId = id; this._onChange.fire({ id, focus: !!focus }); - this.actions.forEach(a => a.enabled = a.id !== id); + this.actions.forEach(a => a.checked = a.id === id); return Promise.resolve(undefined); } } @@ -224,19 +224,21 @@ export class ExtensionEditor extends BaseEditor { this.builtin.textContent = localize('builtin', "Built-in"); const subtitle = append(details, $('.subtitle')); - this.publisher = append(subtitle, $('span.publisher.clickable', { title: localize('publisher', "Publisher name") })); + this.publisher = append(subtitle, $('span.publisher.clickable', { title: localize('publisher', "Publisher name"), tabIndex: 0 })); - this.installCount = append(subtitle, $('span.install', { title: localize('install count', "Install count") })); + this.installCount = append(subtitle, $('span.install', { title: localize('install count', "Install count"), tabIndex: 0 })); - this.rating = append(subtitle, $('span.rating.clickable', { title: localize('rating', "Rating") })); + this.rating = append(subtitle, $('span.rating.clickable', { title: localize('rating', "Rating"), tabIndex: 0 })); this.repository = append(subtitle, $('span.repository.clickable')); this.repository.textContent = localize('repository', 'Repository'); this.repository.style.display = 'none'; + this.repository.tabIndex = 0; this.license = append(subtitle, $('span.license.clickable')); this.license.textContent = localize('license', 'License'); this.license.style.display = 'none'; + this.license.tabIndex = 0; this.description = append(details, $('.description')); diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/extensionEditor.css b/src/vs/workbench/contrib/extensions/electron-browser/media/extensionEditor.css index 3379ec0d6b7..3463297d67f 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/extensionEditor.css +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/extensionEditor.css @@ -205,7 +205,7 @@ opacity: 0.7; } -.extension-editor > .body > .navbar > .monaco-action-bar > .actions-container > .action-item.disabled > .action-label { +.extension-editor > .body > .navbar > .monaco-action-bar > .actions-container > .action-item > .action-label.checked { opacity: 1; text-decoration: underline; } From aa39a59c6552028d44ab734b4741ce1bd2954293 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 5 Jul 2019 17:11:04 +0200 Subject: [PATCH 1156/1449] storage - add tests for file service based storage --- .../storage/browser/storageService.ts | 89 +----------------- src/vs/platform/storage/common/storage.ts | 76 +++++++++++++++ .../storage/test/node/storage.test.ts | 92 +++++++++++++++++++ 3 files changed, 171 insertions(+), 86 deletions(-) create mode 100644 src/vs/platform/storage/test/node/storage.test.ts diff --git a/src/vs/platform/storage/browser/storageService.ts b/src/vs/platform/storage/browser/storageService.ts index b8c6f80c956..eef54ec075b 100644 --- a/src/vs/platform/storage/browser/storageService.ts +++ b/src/vs/platform/storage/browser/storageService.ts @@ -5,16 +5,14 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { Event, Emitter } from 'vs/base/common/event'; -import { IWorkspaceStorageChangeEvent, IStorageService, StorageScope, IWillSaveStateEvent, WillSaveStateReason, logStorage } from 'vs/platform/storage/common/storage'; +import { IWorkspaceStorageChangeEvent, IStorageService, StorageScope, IWillSaveStateEvent, WillSaveStateReason, logStorage, FileStorageDatabase } from 'vs/platform/storage/common/storage'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IWorkspaceInitializationPayload } from 'vs/platform/workspaces/common/workspaces'; import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; -import { IFileService, FileChangesEvent } from 'vs/platform/files/common/files'; -import { IStorage, IStorageDatabase, IUpdateRequest, Storage } from 'vs/base/parts/storage/common/storage'; +import { IFileService } from 'vs/platform/files/common/files'; +import { IStorage, Storage } from 'vs/base/parts/storage/common/storage'; import { URI } from 'vs/base/common/uri'; -import { VSBuffer } from 'vs/base/common/buffer'; import { joinPath } from 'vs/base/common/resources'; -import { serializableToMap, mapToSerializable } from 'vs/base/common/map'; export class BrowserStorageService extends Disposable implements IStorageService { @@ -123,84 +121,3 @@ export class BrowserStorageService extends Disposable implements IStorageService //#endregion } - -export class FileStorageDatabase extends Disposable implements IStorageDatabase { - - readonly onDidChangeItemsExternal = Event.None; // TODO@Ben implement global UI storage events - - private cache: Map | undefined; - - private pendingUpdate: Promise = Promise.resolve(); - - constructor( - private readonly file: URI, - private readonly fileService: IFileService - ) { - super(); - - this.registerListeners(); - } - - private registerListeners(): void { - this._register(this.fileService.watch(this.file)); - this._register(this.fileService.onFileChanges(e => this.onFileChanges(e))); - } - - private onFileChanges(e: FileChangesEvent): void { - - } - - async getItems(): Promise> { - if (!this.cache) { - try { - this.cache = await this.doGetItemsFromFile(); - } catch (error) { - this.cache = new Map(); - } - } - - return this.cache; - } - - private async doGetItemsFromFile(): Promise> { - await this.pendingUpdate; - - const itemsRaw = await this.fileService.readFile(this.file); - - return serializableToMap(JSON.parse(itemsRaw.value.toString())); - } - - async updateItems(request: IUpdateRequest): Promise { - let updateCount = 0; - if (request.insert) { - updateCount += request.insert.size; - } - if (request.delete) { - updateCount += request.delete.size; - } - - if (updateCount === 0) { - return Promise.resolve(); - } - - const items = await this.getItems(); - - if (request.insert) { - request.insert.forEach((value, key) => items.set(key, value)); - } - - if (request.delete) { - request.delete.forEach(key => items.delete(key)); - } - - await this.pendingUpdate; - - this.pendingUpdate = this.fileService.writeFile(this.file, VSBuffer.fromString(JSON.stringify(mapToSerializable(items)))).then(); - - return this.pendingUpdate; - } - - close(): Promise { - return this.pendingUpdate; - } -} \ No newline at end of file diff --git a/src/vs/platform/storage/common/storage.ts b/src/vs/platform/storage/common/storage.ts index d2b42b22532..c47ac6b4d80 100644 --- a/src/vs/platform/storage/common/storage.ts +++ b/src/vs/platform/storage/common/storage.ts @@ -7,6 +7,11 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' import { Event, Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { isUndefinedOrNull } from 'vs/base/common/types'; +import { IUpdateRequest, IStorageDatabase } from 'vs/base/parts/storage/common/storage'; +import { serializableToMap, mapToSerializable } from 'vs/base/common/map'; +import { VSBuffer } from 'vs/base/common/buffer'; +import { URI } from 'vs/base/common/uri'; +import { IFileService } from 'vs/platform/files/common/files'; export const IStorageService = createDecorator('storageService'); @@ -20,6 +25,7 @@ export interface IWillSaveStateEvent { } export interface IStorageService { + _serviceBrand: any; /** @@ -202,6 +208,76 @@ export class InMemoryStorageService extends Disposable implements IStorageServic } } +export class FileStorageDatabase extends Disposable implements IStorageDatabase { + + readonly onDidChangeItemsExternal = Event.None; // TODO@Ben implement global UI storage events + + private cache: Map | undefined; + + private pendingUpdate: Promise = Promise.resolve(); + + constructor( + private readonly file: URI, + private readonly fileService: IFileService + ) { + super(); + } + + async getItems(): Promise> { + if (!this.cache) { + try { + this.cache = await this.doGetItemsFromFile(); + } catch (error) { + this.cache = new Map(); + } + } + + return this.cache; + } + + private async doGetItemsFromFile(): Promise> { + await this.pendingUpdate; + + const itemsRaw = await this.fileService.readFile(this.file); + + return serializableToMap(JSON.parse(itemsRaw.value.toString())); + } + + async updateItems(request: IUpdateRequest): Promise { + let updateCount = 0; + if (request.insert) { + updateCount += request.insert.size; + } + if (request.delete) { + updateCount += request.delete.size; + } + + if (updateCount === 0) { + return Promise.resolve(); + } + + const items = await this.getItems(); + + if (request.insert) { + request.insert.forEach((value, key) => items.set(key, value)); + } + + if (request.delete) { + request.delete.forEach(key => items.delete(key)); + } + + await this.pendingUpdate; + + this.pendingUpdate = this.fileService.writeFile(this.file, VSBuffer.fromString(JSON.stringify(mapToSerializable(items)))).then(); + + return this.pendingUpdate; + } + + close(): Promise { + return this.pendingUpdate; + } +} + export async function logStorage(global: Map, workspace: Map, globalPath: string, workspacePath: string): Promise { const safeParse = (value: string) => { try { diff --git a/src/vs/platform/storage/test/node/storage.test.ts b/src/vs/platform/storage/test/node/storage.test.ts new file mode 100644 index 00000000000..254cb427afa --- /dev/null +++ b/src/vs/platform/storage/test/node/storage.test.ts @@ -0,0 +1,92 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { equal } from 'assert'; +import { FileStorageDatabase } from 'vs/platform/storage/common/storage'; +import { generateUuid } from 'vs/base/common/uuid'; +import { join } from 'vs/base/common/path'; +import { tmpdir } from 'os'; +import { rimraf, RimRafMode } from 'vs/base/node/pfs'; +import { NullLogService } from 'vs/platform/log/common/log'; +import { Storage } from 'vs/base/parts/storage/common/storage'; +import { URI } from 'vs/base/common/uri'; +import { FileService } from 'vs/workbench/services/files/common/fileService'; +import { getRandomTestPath } from 'vs/base/test/node/testUtils'; +import { DiskFileSystemProvider } from 'vs/workbench/services/files/node/diskFileSystemProvider'; +import { DisposableStore } from 'vs/base/common/lifecycle'; +import { Schemas } from 'vs/base/common/network'; + +suite('Storage', () => { + + const parentDir = getRandomTestPath(tmpdir(), 'vsctests', 'storageservice'); + + let fileService: FileService; + let fileProvider: DiskFileSystemProvider; + let testDir: string; + + const disposables = new DisposableStore(); + + setup(async () => { + const logService = new NullLogService(); + + fileService = new FileService(logService); + disposables.add(fileService); + + fileProvider = new DiskFileSystemProvider(logService); + disposables.add(fileService.registerProvider(Schemas.file, fileProvider)); + disposables.add(fileProvider); + + const id = generateUuid(); + testDir = join(parentDir, id); + }); + + teardown(async () => { + disposables.clear(); + + await rimraf(parentDir, RimRafMode.MOVE); + }); + + test('File Based Storage', async () => { + let storage = new Storage(new FileStorageDatabase(URI.file(join(testDir, 'storage.json')), fileService)); + + await storage.init(); + + storage.set('bar', 'foo'); + storage.set('barNumber', 55); + storage.set('barBoolean', true); + + equal(storage.get('bar'), 'foo'); + equal(storage.get('barNumber'), '55'); + equal(storage.get('barBoolean'), 'true'); + + await storage.close(); + + storage = new Storage(new FileStorageDatabase(URI.file(join(testDir, 'storage.json')), fileService)); + + await storage.init(); + + equal(storage.get('bar'), 'foo'); + equal(storage.get('barNumber'), '55'); + equal(storage.get('barBoolean'), 'true'); + + storage.delete('bar'); + storage.delete('barNumber'); + storage.delete('barBoolean'); + + equal(storage.get('bar', 'undefined'), 'undefined'); + equal(storage.get('barNumber', 'undefinedNumber'), 'undefinedNumber'); + equal(storage.get('barBoolean', 'undefinedBoolean'), 'undefinedBoolean'); + + await storage.close(); + + storage = new Storage(new FileStorageDatabase(URI.file(join(testDir, 'storage.json')), fileService)); + + await storage.init(); + + equal(storage.get('bar', 'undefined'), 'undefined'); + equal(storage.get('barNumber', 'undefinedNumber'), 'undefinedNumber'); + equal(storage.get('barBoolean', 'undefinedBoolean'), 'undefinedBoolean'); + }); +}); \ No newline at end of file From cf9c14d95404a70904ed3457a18eeadf3adb3a9a Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 5 Jul 2019 17:12:00 +0200 Subject: [PATCH 1157/1449] storage - remove unused code --- src/vs/base/parts/storage/node/storage.ts | 12 ------------ src/vs/platform/storage/common/storage.ts | 12 ------------ src/vs/platform/storage/node/storageIpc.ts | 7 ------- 3 files changed, 31 deletions(-) diff --git a/src/vs/base/parts/storage/node/storage.ts b/src/vs/base/parts/storage/node/storage.ts index 5f2e7c1d9b0..48e347df1f2 100644 --- a/src/vs/base/parts/storage/node/storage.ts +++ b/src/vs/base/parts/storage/node/storage.ts @@ -77,18 +77,6 @@ export class SQLiteStorageDatabase implements IStorageDatabase { } private doUpdateItems(connection: IDatabaseConnection, request: IUpdateRequest): Promise { - let updateCount = 0; - if (request.insert) { - updateCount += request.insert.size; - } - if (request.delete) { - updateCount += request.delete.size; - } - - if (updateCount === 0) { - return Promise.resolve(); - } - if (this.logger.isTracing) { this.logger.trace(`[storage ${this.name}] updateItems(): insert(${request.insert ? mapToString(request.insert) : '0'}), delete(${request.delete ? setToString(request.delete) : '0'})`); } diff --git a/src/vs/platform/storage/common/storage.ts b/src/vs/platform/storage/common/storage.ts index c47ac6b4d80..9521b9edbff 100644 --- a/src/vs/platform/storage/common/storage.ts +++ b/src/vs/platform/storage/common/storage.ts @@ -244,18 +244,6 @@ export class FileStorageDatabase extends Disposable implements IStorageDatabase } async updateItems(request: IUpdateRequest): Promise { - let updateCount = 0; - if (request.insert) { - updateCount += request.insert.size; - } - if (request.delete) { - updateCount += request.delete.size; - } - - if (updateCount === 0) { - return Promise.resolve(); - } - const items = await this.getItems(); if (request.insert) { diff --git a/src/vs/platform/storage/node/storageIpc.ts b/src/vs/platform/storage/node/storageIpc.ts index 1b34ec90f27..c60779b7bad 100644 --- a/src/vs/platform/storage/node/storageIpc.ts +++ b/src/vs/platform/storage/node/storageIpc.ts @@ -177,21 +177,14 @@ export class GlobalStorageDatabaseChannelClient extends Disposable implements IS } updateItems(request: IUpdateRequest): Promise { - let updateCount = 0; const serializableRequest: ISerializableUpdateRequest = Object.create(null); if (request.insert) { serializableRequest.insert = mapToSerializable(request.insert); - updateCount += request.insert.size; } if (request.delete) { serializableRequest.delete = values(request.delete); - updateCount += request.delete.size; - } - - if (updateCount === 0) { - return Promise.resolve(); // prevent work if not needed } return this.channel.call('updateItems', serializableRequest); From 57ddfdd929620f48cd3ac52ea9558f98bee0d821 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 5 Jul 2019 17:36:15 +0200 Subject: [PATCH 1158/1449] write tests for file user data provider --- .../userData/common/fileUserDataProvider.ts | 12 +- .../fileUserDataProvider.test.ts | 478 ++++++++++++++++++ 2 files changed, 484 insertions(+), 6 deletions(-) create mode 100644 src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts diff --git a/src/vs/workbench/services/userData/common/fileUserDataProvider.ts b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts index 008fc7d2b98..4bf98510ac4 100644 --- a/src/vs/workbench/services/userData/common/fileUserDataProvider.ts +++ b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts @@ -128,13 +128,13 @@ export class FileUserDataProvider extends Disposable implements IFileSystemProvi } private toUserDataResource(fileSystemResource: URI): URI | null { - const userDataRelativePath = resources.relativePath(this.fileSystemUserDataHome, fileSystemResource); - if (userDataRelativePath) { - return resources.joinPath(this.userDataHome, userDataRelativePath); + if (resources.isEqualOrParent(fileSystemResource, this.fileSystemUserDataHome)) { + const relativePath = resources.relativePath(this.fileSystemUserDataHome, fileSystemResource); + return relativePath ? resources.joinPath(this.userDataHome, relativePath) : this.userDataHome; } - const backupRelativePath = resources.relativePath(this.fileSystemBackupsHome, fileSystemResource); - if (backupRelativePath) { - return resources.joinPath(this.userDataHome, BACKUPS, backupRelativePath); + if (resources.isEqualOrParent(fileSystemResource, this.fileSystemBackupsHome)) { + const relativePath = resources.relativePath(this.fileSystemBackupsHome, fileSystemResource); + return relativePath ? resources.joinPath(this.userDataHome, BACKUPS, relativePath) : resources.joinPath(this.userDataHome, BACKUPS); } return null; } diff --git a/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts b/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts new file mode 100644 index 00000000000..d320cedfcc3 --- /dev/null +++ b/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts @@ -0,0 +1,478 @@ +/*--------------------------------------------------------------------------------------------- + * 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 os from 'os'; +import * as path from 'vs/base/common/path'; +import * as uuid from 'vs/base/common/uuid'; +import * as pfs from 'vs/base/node/pfs'; +import { IFileService, FileChangeType, IFileChange, IFileSystemProviderWithFileReadWriteCapability, IStat, FileType, FileSystemProviderCapabilities } from 'vs/platform/files/common/files'; +import { FileService } from 'vs/workbench/services/files/common/fileService'; +import { NullLogService } from 'vs/platform/log/common/log'; +import { Schemas } from 'vs/base/common/network'; +import { URI } from 'vs/base/common/uri'; +import { FileUserDataProvider } from 'vs/workbench/services/userData/common/fileUserDataProvider'; +import { joinPath, dirname } from 'vs/base/common/resources'; +import { VSBuffer } from 'vs/base/common/buffer'; +import { DiskFileSystemProvider } from 'vs/workbench/services/files/electron-browser/diskFileSystemProvider'; +import { BACKUPS } from 'vs/platform/environment/common/environment'; +import { DisposableStore, IDisposable, Disposable } from 'vs/base/common/lifecycle'; +import { BrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; +import { Emitter, Event } from 'vs/base/common/event'; +import { timeout } from 'vs/base/common/async'; + +suite('FileUserDataProvider', () => { + + let testObject: IFileService; + let rootPath: string; + let userDataPath: string; + let backupsPath: string; + let userDataResource: URI; + const disposables = new DisposableStore(); + + setup(async () => { + const logService = new NullLogService(); + testObject = new FileService(logService); + disposables.add(testObject); + + const diskFileSystemProvider = new DiskFileSystemProvider(logService); + disposables.add(diskFileSystemProvider); + disposables.add(testObject.registerProvider(Schemas.file, diskFileSystemProvider)); + + rootPath = path.join(os.tmpdir(), 'vsctests', uuid.generateUuid()); + userDataPath = path.join(rootPath, 'user'); + backupsPath = path.join(rootPath, BACKUPS); + userDataResource = URI.file(userDataPath).with({ scheme: Schemas.userData }); + await Promise.all([pfs.mkdirp(userDataPath), pfs.mkdirp(backupsPath)]); + + const environmentService = new BrowserWorkbenchEnvironmentService({ workspaceId: 'workspaceId' }); + environmentService.userRoamingDataHome = userDataResource; + + const userDataFileSystemProvider = new FileUserDataProvider(URI.file(userDataPath), URI.file(backupsPath), diskFileSystemProvider, environmentService); + disposables.add(userDataFileSystemProvider); + disposables.add(testObject.registerProvider(Schemas.userData, userDataFileSystemProvider)); + }); + + teardown(async () => { + disposables.clear(); + await pfs.rimraf(rootPath, pfs.RimRafMode.MOVE); + }); + + test('exists return false when file does not exist', async () => { + const exists = await testObject.exists(joinPath(userDataResource, 'settings.json')); + assert.equal(exists, false); + }); + + test('read file throws error if not exist', async () => { + try { + await testObject.readFile(joinPath(userDataResource, 'settings.json')); + assert.fail('Should fail since file does not exist'); + } catch (e) { } + }); + + test('read existing file', async () => { + await pfs.writeFile(path.join(userDataPath, 'settings.json'), '{}'); + const result = await testObject.readFile(joinPath(userDataResource, 'settings.json')); + assert.equal(result.value, '{}'); + }); + + test('create file', async () => { + const resource = joinPath(userDataResource, 'settings.json'); + const actual1 = await testObject.createFile(resource, VSBuffer.fromString('{}')); + assert.equal(actual1.resource.toString(), resource.toString()); + const actual2 = await pfs.readFile(path.join(userDataPath, 'settings.json')); + assert.equal(actual2, '{}'); + }); + + test('write file creates the file if not exist', async () => { + const resource = joinPath(userDataResource, 'settings.json'); + const actual1 = await testObject.writeFile(resource, VSBuffer.fromString('{}')); + assert.equal(actual1.resource.toString(), resource.toString()); + const actual2 = await pfs.readFile(path.join(userDataPath, 'settings.json')); + assert.equal(actual2, '{}'); + }); + + test('write to existing file', async () => { + const resource = joinPath(userDataResource, 'settings.json'); + await pfs.writeFile(path.join(userDataPath, 'settings.json'), '{}'); + const actual1 = await testObject.writeFile(resource, VSBuffer.fromString('{a:1}')); + assert.equal(actual1.resource.toString(), resource.toString()); + const actual2 = await pfs.readFile(path.join(userDataPath, 'settings.json')); + assert.equal(actual2, '{a:1}'); + }); + + test('delete file', async () => { + await pfs.writeFile(path.join(userDataPath, 'settings.json'), ''); + await testObject.del(joinPath(userDataResource, 'settings.json')); + const result = await pfs.exists(path.join(userDataPath, 'settings.json')); + assert.equal(false, result); + }); + + test('resolve file', async () => { + await pfs.writeFile(path.join(userDataPath, 'settings.json'), ''); + const result = await testObject.resolve(joinPath(userDataResource, 'settings.json')); + assert.ok(!result.isDirectory); + assert.ok(result.children === undefined); + }); + + test('exists return false for folder that does not exist', async () => { + const exists = await testObject.exists(joinPath(userDataResource, 'snippets')); + assert.equal(exists, false); + }); + + test('exists return true for folder that exists', async () => { + await pfs.mkdirp(path.join(userDataPath, 'snippets')); + const exists = await testObject.exists(joinPath(userDataResource, 'snippets')); + assert.equal(exists, true); + }); + + test('read file throws error for folder', async () => { + await pfs.mkdirp(path.join(userDataPath, 'snippets')); + try { + await testObject.readFile(joinPath(userDataResource, 'snippets')); + assert.fail('Should fail since read file is not supported for folders'); + } catch (e) { } + }); + + test('read file under folder', async () => { + await pfs.mkdirp(path.join(userDataPath, 'snippets')); + await pfs.writeFile(path.join(userDataPath, 'snippets', 'settings.json'), '{}'); + const resource = joinPath(userDataResource, 'snippets/settings.json'); + const actual = await testObject.readFile(resource); + assert.equal(actual.resource.toString(), resource.toString()); + assert.equal(actual.value, '{}'); + }); + + test('read file under sub folder', async () => { + await pfs.mkdirp(path.join(userDataPath, 'snippets', 'java')); + await pfs.writeFile(path.join(userDataPath, 'snippets', 'java', 'settings.json'), '{}'); + const resource = joinPath(userDataResource, 'snippets/java/settings.json'); + const actual = await testObject.readFile(resource); + assert.equal(actual.resource.toString(), resource.toString()); + assert.equal(actual.value, '{}'); + }); + + test('create file under folder that exists', async () => { + await pfs.mkdirp(path.join(userDataPath, 'snippets')); + const resource = joinPath(userDataResource, 'snippets/settings.json'); + const actual1 = await testObject.createFile(resource, VSBuffer.fromString('{}')); + assert.equal(actual1.resource.toString(), resource.toString()); + const actual2 = await pfs.readFile(path.join(userDataPath, 'snippets', 'settings.json')); + assert.equal(actual2, '{}'); + }); + + test('create file under folder that does not exist', async () => { + const resource = joinPath(userDataResource, 'snippets/settings.json'); + const actual1 = await testObject.createFile(resource, VSBuffer.fromString('{}')); + assert.equal(actual1.resource.toString(), resource.toString()); + const actual2 = await pfs.readFile(path.join(userDataPath, 'snippets', 'settings.json')); + assert.equal(actual2, '{}'); + }); + + test('write to not existing file under container that exists', async () => { + await pfs.mkdirp(path.join(userDataPath, 'snippets')); + const resource = joinPath(userDataResource, 'snippets/settings.json'); + const actual1 = await testObject.writeFile(resource, VSBuffer.fromString('{}')); + assert.equal(actual1.resource.toString(), resource.toString()); + const actual = await pfs.readFile(path.join(userDataPath, 'snippets', 'settings.json')); + assert.equal(actual, '{}'); + }); + + test('write to not existing file under container that does not exists', async () => { + const resource = joinPath(userDataResource, 'snippets/settings.json'); + const actual1 = await testObject.writeFile(resource, VSBuffer.fromString('{}')); + assert.equal(actual1.resource.toString(), resource.toString()); + const actual = await pfs.readFile(path.join(userDataPath, 'snippets', 'settings.json')); + assert.equal(actual, '{}'); + }); + + test('write to existing file under container', async () => { + await pfs.mkdirp(path.join(userDataPath, 'snippets')); + await pfs.writeFile(path.join(userDataPath, 'snippets', 'settings.json'), '{}'); + const resource = joinPath(userDataResource, 'snippets/settings.json'); + const actual1 = await testObject.writeFile(resource, VSBuffer.fromString('{a:1}')); + assert.equal(actual1.resource.toString(), resource.toString()); + const actual = await pfs.readFile(path.join(userDataPath, 'snippets', 'settings.json')); + assert.equal(actual.toString(), '{a:1}'); + }); + + test('write file under sub container', async () => { + const resource = joinPath(userDataResource, 'snippets/java/settings.json'); + const actual1 = await testObject.writeFile(resource, VSBuffer.fromString('{}')); + assert.equal(actual1.resource.toString(), resource.toString()); + const actual = await pfs.readFile(path.join(userDataPath, 'snippets', 'java', 'settings.json')); + assert.equal(actual, '{}'); + }); + + test('delete throws error for folder that does not exist', async () => { + try { + await testObject.del(joinPath(userDataResource, 'snippets')); + assert.fail('Should fail the folder does not exist'); + } catch (e) { } + }); + + test('delete not existing file under container that exists', async () => { + await pfs.mkdirp(path.join(userDataPath, 'snippets')); + try { + await testObject.del(joinPath(userDataResource, 'snippets/settings.json')); + assert.fail('Should fail since file does not exist'); + } catch (e) { } + }); + + test('delete not existing file under container that does not exists', async () => { + try { + await testObject.del(joinPath(userDataResource, 'snippets/settings.json')); + assert.fail('Should fail since file does not exist'); + } catch (e) { } + }); + + test('delete existing file under folder', async () => { + await pfs.mkdirp(path.join(userDataPath, 'snippets')); + pfs.writeFile(path.join(userDataPath, 'snippets', 'settings.json'), '{}'); + await testObject.del(joinPath(userDataResource, 'snippets/settings.json')); + const exists = await pfs.exists(path.join(userDataPath, 'snippets', 'settings.json')); + assert.equal(exists, false); + }); + + test('resolve folder', async () => { + await pfs.mkdirp(path.join(userDataPath, 'snippets')); + pfs.writeFile(path.join(userDataPath, 'snippets', 'settings.json'), '{}'); + const result = await testObject.resolve(joinPath(userDataResource, 'snippets')); + assert.ok(result.isDirectory); + assert.ok(result.children !== undefined); + assert.equal(result.children!.length, 1); + assert.equal(result.children![0].resource.toString(), joinPath(userDataResource, 'snippets/settings.json').toString()); + }); + + test('read backup file', async () => { + await pfs.writeFile(path.join(backupsPath, 'backup.json'), '{}'); + const result = await testObject.readFile(joinPath(userDataResource, `${BACKUPS}/backup.json`)); + assert.equal(result.value, '{}'); + }); + + test('create backup file', async () => { + await testObject.createFile(joinPath(userDataResource, `${BACKUPS}/backup.json`), VSBuffer.fromString('{}')); + const result = await pfs.readFile(path.join(backupsPath, 'backup.json')); + assert.equal(result, '{}'); + }); + + test('write backup file', async () => { + await pfs.writeFile(path.join(backupsPath, 'backup.json'), '{}'); + await testObject.writeFile(joinPath(userDataResource, `${BACKUPS}/backup.json`), VSBuffer.fromString('{a:1}')); + const result = await pfs.readFile(path.join(backupsPath, 'backup.json')); + assert.equal(result, '{a:1}'); + }); + + test('resolve backups folder', async () => { + pfs.writeFile(path.join(backupsPath, 'backup.json'), '{}'); + const result = await testObject.resolve(joinPath(userDataResource, BACKUPS)); + assert.ok(result.isDirectory); + assert.ok(result.children !== undefined); + assert.equal(result.children!.length, 1); + assert.equal(result.children![0].resource.toString(), joinPath(userDataResource, `${BACKUPS}/backup.json`).toString()); + }); +}); + +class TestFileSystemProvider implements IFileSystemProviderWithFileReadWriteCapability { + + constructor(readonly onDidChangeFile: Event) { } + + readonly capabilities: FileSystemProviderCapabilities = FileSystemProviderCapabilities.FileReadWrite; + + readonly onDidChangeCapabilities: Event = Event.None; + + watch(): IDisposable { return Disposable.None; } + + stat(): Promise { throw new Error('Not Supported'); } + + mkdir(resource: URI): Promise { throw new Error('Not Supported'); } + + rename(): Promise { throw new Error('Not Supported'); } + + readFile(resource: URI): Promise { throw new Error('Not Supported'); } + + readdir(resource: URI): Promise<[string, FileType][]> { throw new Error('Not Supported'); } + + writeFile(): Promise { throw new Error('Not Supported'); } + + delete(): Promise { throw new Error('Not Supported'); } + +} + +suite('FileUserDataProvider - Watching', () => { + + let testObject: IFileService; + let localBackupsResource: URI; + let localUserDataResource: URI; + let userDataResource: URI; + const disposables = new DisposableStore(); + + const fileEventEmitter: Emitter = new Emitter(); + disposables.add(fileEventEmitter); + + setup(() => { + + const rootPath = path.join(os.tmpdir(), 'vsctests', uuid.generateUuid()); + const userDataPath = path.join(rootPath, 'user'); + const backupsPath = path.join(rootPath, BACKUPS); + localBackupsResource = URI.file(backupsPath); + localUserDataResource = URI.file(userDataPath); + userDataResource = localUserDataResource.with({ scheme: Schemas.userData }); + + const environmentService = new BrowserWorkbenchEnvironmentService({ workspaceId: 'workspaceId' }); + environmentService.userRoamingDataHome = userDataResource; + + const userDataFileSystemProvider = new FileUserDataProvider(localUserDataResource, localBackupsResource, new TestFileSystemProvider(fileEventEmitter.event), environmentService); + disposables.add(userDataFileSystemProvider); + + testObject = new FileService(new NullLogService()); + disposables.add(testObject); + disposables.add(testObject.registerProvider(Schemas.userData, userDataFileSystemProvider)); + }); + + teardown(() => { + disposables.clear(); + }); + + test('file added change event', done => { + const expected = joinPath(userDataResource, 'settings.json'); + const target = joinPath(localUserDataResource, 'settings.json'); + testObject.onFileChanges(e => { + if (e.contains(expected, FileChangeType.ADDED)) { + done(); + } + }); + fileEventEmitter.fire([{ + resource: target, + type: FileChangeType.ADDED + }]); + }); + + test('file updated change event', done => { + const expected = joinPath(userDataResource, 'settings.json'); + const target = joinPath(localUserDataResource, 'settings.json'); + testObject.onFileChanges(e => { + if (e.contains(expected, FileChangeType.UPDATED)) { + done(); + } + }); + fileEventEmitter.fire([{ + resource: target, + type: FileChangeType.UPDATED + }]); + }); + + test('file deleted change event', done => { + const expected = joinPath(userDataResource, 'settings.json'); + const target = joinPath(localUserDataResource, 'settings.json'); + testObject.onFileChanges(e => { + if (e.contains(expected, FileChangeType.DELETED)) { + done(); + } + }); + fileEventEmitter.fire([{ + resource: target, + type: FileChangeType.DELETED + }]); + }); + + test('file under folder created change event', done => { + const expected = joinPath(userDataResource, 'snippets', 'settings.json'); + const target = joinPath(localUserDataResource, 'snippets', 'settings.json'); + testObject.onFileChanges(e => { + if (e.contains(expected, FileChangeType.ADDED)) { + done(); + } + }); + fileEventEmitter.fire([{ + resource: target, + type: FileChangeType.ADDED + }]); + }); + + test('file under folder updated change event', done => { + const expected = joinPath(userDataResource, 'snippets', 'settings.json'); + const target = joinPath(localUserDataResource, 'snippets', 'settings.json'); + testObject.onFileChanges(e => { + if (e.contains(expected, FileChangeType.UPDATED)) { + done(); + } + }); + fileEventEmitter.fire([{ + resource: target, + type: FileChangeType.UPDATED + }]); + }); + + test('file under folder deleted change event', done => { + const expected = joinPath(userDataResource, 'snippets', 'settings.json'); + const target = joinPath(localUserDataResource, 'snippets', 'settings.json'); + testObject.onFileChanges(e => { + if (e.contains(expected, FileChangeType.DELETED)) { + done(); + } + }); + fileEventEmitter.fire([{ + resource: target, + type: FileChangeType.DELETED + }]); + }); + + test('event is not triggered if file is not under user data', async () => { + const target = joinPath(dirname(localUserDataResource), 'settings.json'); + let triggered = false; + testObject.onFileChanges(() => triggered = true); + fileEventEmitter.fire([{ + resource: target, + type: FileChangeType.DELETED + }]); + await timeout(0); + if (triggered) { + assert.fail('event should not be triggered'); + } + }); + + test('backup file created change event', done => { + const expected = joinPath(userDataResource, BACKUPS, 'settings.json'); + const target = joinPath(localBackupsResource, 'settings.json'); + testObject.onFileChanges(e => { + if (e.contains(expected, FileChangeType.ADDED)) { + done(); + } + }); + fileEventEmitter.fire([{ + resource: target, + type: FileChangeType.ADDED + }]); + }); + + test('backup file update change event', done => { + const expected = joinPath(userDataResource, BACKUPS, 'settings.json'); + const target = joinPath(localBackupsResource, 'settings.json'); + testObject.onFileChanges(e => { + if (e.contains(expected, FileChangeType.UPDATED)) { + done(); + } + }); + fileEventEmitter.fire([{ + resource: target, + type: FileChangeType.UPDATED + }]); + }); + + test('backup file delete change event', done => { + const expected = joinPath(userDataResource, BACKUPS, 'settings.json'); + const target = joinPath(localBackupsResource, 'settings.json'); + testObject.onFileChanges(e => { + if (e.contains(expected, FileChangeType.DELETED)) { + done(); + } + }); + fileEventEmitter.fire([{ + resource: target, + type: FileChangeType.DELETED + }]); + }); +}); \ No newline at end of file From f96ea6c12573592721eea6e435f6f9cfbafacb8a Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 5 Jul 2019 17:39:58 +0200 Subject: [PATCH 1159/1449] web - register beforeunload listener so that there can be others --- src/vs/platform/lifecycle/browser/lifecycleService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/platform/lifecycle/browser/lifecycleService.ts b/src/vs/platform/lifecycle/browser/lifecycleService.ts index b0c3014986f..a54151f81b6 100644 --- a/src/vs/platform/lifecycle/browser/lifecycleService.ts +++ b/src/vs/platform/lifecycle/browser/lifecycleService.ts @@ -22,7 +22,7 @@ export class BrowserLifecycleService extends AbstractLifecycleService { } private registerListeners(): void { - window.onbeforeunload = () => this.beforeUnload(); + window.addEventListener('beforeunload', () => this.beforeUnload()); } private beforeUnload(): string | null { From 4c7e29993dea46c558063fef617504e8b511bf42 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 5 Jul 2019 17:44:59 +0200 Subject: [PATCH 1160/1449] web - store state periodically --- .../storage/browser/storageService.ts | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/src/vs/platform/storage/browser/storageService.ts b/src/vs/platform/storage/browser/storageService.ts index eef54ec075b..6bb78498f8d 100644 --- a/src/vs/platform/storage/browser/storageService.ts +++ b/src/vs/platform/storage/browser/storageService.ts @@ -13,6 +13,7 @@ import { IFileService } from 'vs/platform/files/common/files'; import { IStorage, Storage } from 'vs/base/parts/storage/common/storage'; import { URI } from 'vs/base/common/uri'; import { joinPath } from 'vs/base/common/resources'; +import { runWhenIdle } from 'vs/base/common/async'; export class BrowserStorageService extends Disposable implements IStorageService { @@ -37,6 +38,26 @@ export class BrowserStorageService extends Disposable implements IStorageService @IFileService private readonly fileService: IFileService ) { super(); + + // In the browser we do not have support for long running unload sequences. As such, + // we cannot ask for saving state in that moment, because that would result in a + // long running operation. + // Instead, periodically ask customers to save save. The library will be clever enough + // to only save state that has actually changed. + this.saveStatePeriodically(); + } + + private saveStatePeriodically(): void { + setTimeout(() => { + runWhenIdle(() => { + + // this event will potentially cause new state to be stored + this._onWillSaveState.fire({ reason: WillSaveStateReason.NONE }); + + // repeat + this.saveStatePeriodically(); + }); + }, 5000); } initialize(payload: IWorkspaceInitializationPayload): Promise { @@ -66,8 +87,6 @@ export class BrowserStorageService extends Disposable implements IStorageService ]); } - //#region - get(key: string, scope: StorageScope, fallbackValue: string): string; get(key: string, scope: StorageScope): string | undefined; get(key: string, scope: StorageScope, fallbackValue?: string): string | undefined { @@ -94,18 +113,6 @@ export class BrowserStorageService extends Disposable implements IStorageService this.getStorage(scope).delete(key); } - async close(): Promise { - - // Signal as event so that clients can still store data - this._onWillSaveState.fire({ reason: WillSaveStateReason.SHUTDOWN }); - - // Do it - await Promise.all([ - this.globalStorage.close(), - this.workspaceStorage.close() - ]); - } - private getStorage(scope: StorageScope): IStorage { return scope === StorageScope.GLOBAL ? this.globalStorage : this.workspaceStorage; } @@ -118,6 +125,4 @@ export class BrowserStorageService extends Disposable implements IStorageService return logStorage(result[0], result[1], this.globalStorageFile.toString(), this.workspaceStorageFile.toString()); } - - //#endregion } From 65f53d53b1b6ea2577e196a74251c13505497dcc Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Fri, 5 Jul 2019 17:57:03 +0200 Subject: [PATCH 1161/1449] Changes to terminal to enable Tasks use of TerminalVirtualProcess --- .../api/browser/mainThreadTerminalService.ts | 9 +++++++-- .../workbench/api/node/extHostTerminalService.ts | 14 ++++++++------ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index 29b4c6703a6..b781eb6ac2f 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -262,8 +262,13 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape } private _onTerminalRequestVirtualProcess(proxy: ITerminalProcessExtHostProxy): void { - this._terminalProcessesReady[proxy.terminalId](proxy); - delete this._terminalProcessesReady[proxy.terminalId]; + const ready = this._terminalProcessesReady[proxy.terminalId]; + if (!ready) { + this._terminalProcesses[proxy.terminalId] = Promise.resolve(proxy); + } else { + ready(proxy); + delete this._terminalProcessesReady[proxy.terminalId]; + } // Note that onReisze is not being listened to here as it needs to fire when max dimensions // change, excluding the dimension override diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 744c0ca3c2c..7624476c887 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -337,7 +337,7 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { return terminal; } - public async attachVirtualProcessToTerminal(id: number, virtualProcess: vscode.TerminalVirtualProcess): Promise { + public attachVirtualProcessToTerminal(id: number, virtualProcess: vscode.TerminalVirtualProcess) { const terminal = this._getTerminalById(id); if (!terminal) { throw new Error(`Cannot resolve terminal with id ${id} for virtual process`); @@ -411,7 +411,7 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { } return; } - this._performTerminalIdAction(id, terminal => { + this.performTerminalIdAction(id, terminal => { if (terminal) { this._activeTerminal = terminal; if (original !== this._activeTerminal) { @@ -496,10 +496,10 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { } public $acceptTerminalProcessId(id: number, processId: number): void { - this._performTerminalIdAction(id, terminal => terminal._setProcessId(processId)); + this.performTerminalIdAction(id, terminal => terminal._setProcessId(processId)); } - private _performTerminalIdAction(id: number, callback: (terminal: ExtHostTerminal) => void): void { + public performTerminalIdAction(id: number, callback: (terminal: ExtHostTerminal) => void): void { let terminal = this._getTerminalById(id); if (terminal) { callback(terminal); @@ -721,7 +721,7 @@ class ApiRequest { } } -class ExtHostVirtualProcess implements ITerminalChildProcess { +export class ExtHostVirtualProcess implements ITerminalChildProcess { private _queuedEvents: (IQueuedEvent | IQueuedEvent | IQueuedEvent<{ pid: number, cwd: string }> | IQueuedEvent)[] = []; private _queueDisposables: IDisposable[] | undefined; @@ -786,7 +786,9 @@ class ExtHostVirtualProcess implements ITerminalChildProcess { this._queueDisposables = undefined; // Attach the real listeners - this._virtualProcess.onDidWrite(e => this._onProcessData.fire(e)); + this._virtualProcess.onDidWrite(e => { + this._onProcessData.fire(e); + }); if (this._virtualProcess.onDidExit) { this._virtualProcess.onDidExit(e => this._onProcessExit.fire(e)); } From 6f40ddeee21348e1cbbeae114487e0f3bc8e677f Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Fri, 5 Jul 2019 17:59:05 +0200 Subject: [PATCH 1162/1449] Revert whitespace change --- src/vs/workbench/api/node/extHostTerminalService.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 7624476c887..15d4df084c5 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -786,9 +786,7 @@ export class ExtHostVirtualProcess implements ITerminalChildProcess { this._queueDisposables = undefined; // Attach the real listeners - this._virtualProcess.onDidWrite(e => { - this._onProcessData.fire(e); - }); + this._virtualProcess.onDidWrite(e => this._onProcessData.fire(e)); if (this._virtualProcess.onDidExit) { this._virtualProcess.onDidExit(e => this._onProcessExit.fire(e)); } From 8aed46f950ab1e5e4bc04244c9117da1dc23ed4a Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Fri, 5 Jul 2019 18:01:08 +0200 Subject: [PATCH 1163/1449] Revert unneeded export --- src/vs/workbench/api/node/extHostTerminalService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 15d4df084c5..ce45045e375 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -721,7 +721,7 @@ class ApiRequest { } } -export class ExtHostVirtualProcess implements ITerminalChildProcess { +class ExtHostVirtualProcess implements ITerminalChildProcess { private _queuedEvents: (IQueuedEvent | IQueuedEvent | IQueuedEvent<{ pid: number, cwd: string }> | IQueuedEvent)[] = []; private _queueDisposables: IDisposable[] | undefined; From 9d887e284a9ddb59d5dec578a52effa0cd8b189e Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 5 Jul 2019 18:03:59 +0200 Subject: [PATCH 1164/1449] web - enable hot exit by default again --- src/vs/platform/lifecycle/browser/lifecycleService.ts | 2 +- src/vs/workbench/contrib/files/browser/files.contribution.ts | 2 +- src/vs/workbench/services/backup/common/backupFileService.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/platform/lifecycle/browser/lifecycleService.ts b/src/vs/platform/lifecycle/browser/lifecycleService.ts index a54151f81b6..b0c3014986f 100644 --- a/src/vs/platform/lifecycle/browser/lifecycleService.ts +++ b/src/vs/platform/lifecycle/browser/lifecycleService.ts @@ -22,7 +22,7 @@ export class BrowserLifecycleService extends AbstractLifecycleService { } private registerListeners(): void { - window.addEventListener('beforeunload', () => this.beforeUnload()); + window.onbeforeunload = () => this.beforeUnload(); } private beforeUnload(): string | null { diff --git a/src/vs/workbench/contrib/files/browser/files.contribution.ts b/src/vs/workbench/contrib/files/browser/files.contribution.ts index 88ad0027e9c..f76f558041f 100644 --- a/src/vs/workbench/contrib/files/browser/files.contribution.ts +++ b/src/vs/workbench/contrib/files/browser/files.contribution.ts @@ -311,7 +311,7 @@ configurationRegistry.registerConfiguration({ 'type': 'string', 'scope': ConfigurationScope.APPLICATION, 'enum': [HotExitConfiguration.OFF, HotExitConfiguration.ON_EXIT, HotExitConfiguration.ON_EXIT_AND_WINDOW_CLOSE], - 'default': platform.isWeb ? HotExitConfiguration.OFF : HotExitConfiguration.ON_EXIT, // TODO@Ben enable once supported + 'default': HotExitConfiguration.ON_EXIT, 'markdownEnumDescriptions': [ nls.localize('hotExit.off', 'Disable hot exit.'), nls.localize('hotExit.onExit', 'Hot exit will be triggered when the last window is closed on Windows/Linux or when the `workbench.action.quit` command is triggered (command palette, keybinding, menu). All windows with backups will be restored upon next launch.'), diff --git a/src/vs/workbench/services/backup/common/backupFileService.ts b/src/vs/workbench/services/backup/common/backupFileService.ts index 1e00c93c669..492d26b67f4 100644 --- a/src/vs/workbench/services/backup/common/backupFileService.ts +++ b/src/vs/workbench/services/backup/common/backupFileService.ts @@ -310,7 +310,7 @@ class BackupFileServiceImpl implements IBackupFileService { return contents.substr(0, newLineIndex); } - throw new Error(`Could not find ${matchingString} in first ${maximumBytesToRead} bytes of ${file}`); + throw new Error(`Could not find ${JSON.stringify(matchingString)} in first ${maximumBytesToRead} bytes of ${file}`); } async resolveBackupContent(backup: URI): Promise> { From 8bd0e79c73148a101835fd5532d9ce87417692ce Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 5 Jul 2019 09:05:58 -0700 Subject: [PATCH 1165/1449] Fix ext host terminals Fixes #76670 --- src/vs/workbench/api/browser/mainThreadTerminalService.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index 29b4c6703a6..caf04c46e88 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -244,7 +244,13 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape return; } - this._terminalProcessesReady[request.proxy.terminalId](request.proxy); + const ready = this._terminalProcessesReady[request.proxy.terminalId]; + if (ready) { + ready(request.proxy); + delete this._terminalProcessesReady[request.proxy.terminalId]; + } else { + this._terminalProcesses[request.proxy.terminalId] = Promise.resolve(request.proxy); + } const shellLaunchConfigDto: ShellLaunchConfigDto = { name: request.shellLaunchConfig.name, executable: request.shellLaunchConfig.executable, From cb3b792b50867356115830aaf2200248150af019 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 5 Jul 2019 18:11:25 +0200 Subject: [PATCH 1166/1449] Fixes #70205: Switch to polling based watcher that does not miss events --- build/lib/compilation.js | 26 ++------------------------ build/lib/compilation.ts | 28 ++-------------------------- 2 files changed, 4 insertions(+), 50 deletions(-) diff --git a/build/lib/compilation.js b/build/lib/compilation.js index 592a5d087ce..62aff873509 100644 --- a/build/lib/compilation.js +++ b/build/lib/compilation.js @@ -112,7 +112,6 @@ class MonacoGenerator { this._executeSoonTimer = null; this._isWatch = isWatch; this.stream = es.through(); - this._watchers = []; this._watchedFiles = {}; let onWillReadFile = (moduleId, filePath) => { if (!this._isWatch) { @@ -122,26 +121,10 @@ class MonacoGenerator { return; } this._watchedFiles[filePath] = true; - const watcher = fs.watch(filePath); - watcher.addListener('change', () => { + fs.watchFile(filePath, () => { this._declarationResolver.invalidateCache(moduleId); this._executeSoon(); }); - watcher.addListener('error', (err) => { - console.error(`Encountered error while watching ${filePath}.`); - console.log(err); - delete this._watchedFiles[filePath]; - for (let i = 0; i < this._watchers.length; i++) { - if (this._watchers[i] === watcher) { - this._watchers.splice(i, 1); - break; - } - } - watcher.close(); - this._declarationResolver.invalidateCache(moduleId); - this._executeSoon(); - }); - this._watchers.push(watcher); }; this._fsProvider = new class extends monacodts.FSProvider { readFileSync(moduleId, filePath) { @@ -151,11 +134,9 @@ class MonacoGenerator { }; this._declarationResolver = new monacodts.DeclarationResolver(this._fsProvider); if (this._isWatch) { - const recipeWatcher = fs.watch(monacodts.RECIPE_PATH); - recipeWatcher.addListener('change', () => { + fs.watchFile(monacodts.RECIPE_PATH, () => { this._executeSoon(); }); - this._watchers.push(recipeWatcher); } } _executeSoon() { @@ -168,9 +149,6 @@ class MonacoGenerator { this.execute(); }, 20); } - dispose() { - this._watchers.forEach(watcher => watcher.close()); - } _run() { let r = monacodts.run3(this._declarationResolver); if (!r && !this._isWatch) { diff --git a/build/lib/compilation.ts b/build/lib/compilation.ts index b431a134f6c..f9544af9cc5 100644 --- a/build/lib/compilation.ts +++ b/build/lib/compilation.ts @@ -137,7 +137,6 @@ class MonacoGenerator { private readonly _isWatch: boolean; public readonly stream: NodeJS.ReadWriteStream; - private readonly _watchers: fs.FSWatcher[]; private readonly _watchedFiles: { [filePath: string]: boolean; }; private readonly _fsProvider: monacodts.FSProvider; private readonly _declarationResolver: monacodts.DeclarationResolver; @@ -145,7 +144,6 @@ class MonacoGenerator { constructor(isWatch: boolean) { this._isWatch = isWatch; this.stream = es.through(); - this._watchers = []; this._watchedFiles = {}; let onWillReadFile = (moduleId: string, filePath: string) => { if (!this._isWatch) { @@ -156,26 +154,10 @@ class MonacoGenerator { } this._watchedFiles[filePath] = true; - const watcher = fs.watch(filePath); - watcher.addListener('change', () => { + fs.watchFile(filePath, () => { this._declarationResolver.invalidateCache(moduleId); this._executeSoon(); }); - watcher.addListener('error', (err) => { - console.error(`Encountered error while watching ${filePath}.`); - console.log(err); - delete this._watchedFiles[filePath]; - for (let i = 0; i < this._watchers.length; i++) { - if (this._watchers[i] === watcher) { - this._watchers.splice(i, 1); - break; - } - } - watcher.close(); - this._declarationResolver.invalidateCache(moduleId); - this._executeSoon(); - }); - this._watchers.push(watcher); }; this._fsProvider = new class extends monacodts.FSProvider { public readFileSync(moduleId: string, filePath: string): Buffer { @@ -186,11 +168,9 @@ class MonacoGenerator { this._declarationResolver = new monacodts.DeclarationResolver(this._fsProvider); if (this._isWatch) { - const recipeWatcher = fs.watch(monacodts.RECIPE_PATH); - recipeWatcher.addListener('change', () => { + fs.watchFile(monacodts.RECIPE_PATH, () => { this._executeSoon(); }); - this._watchers.push(recipeWatcher); } } @@ -206,10 +186,6 @@ class MonacoGenerator { }, 20); } - public dispose(): void { - this._watchers.forEach(watcher => watcher.close()); - } - private _run(): monacodts.IMonacoDeclarationResult | null { let r = monacodts.run3(this._declarationResolver); if (!r && !this._isWatch) { From a72ad577c389c0b91619873ba939e4581bed38bf Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 5 Jul 2019 18:37:44 +0200 Subject: [PATCH 1167/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index df3df6ff757..3a6537a2b2a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "65898cd4327756aaf3f5e65f02d0e1edee2db1a9", + "distro": "e856b9e79a3a77d1a33f40a6d4a7ae182c69bdc6", "author": { "name": "Microsoft Corporation" }, From 51d5f88eec7d4986006a3c4d5762f2f5d10bf8d7 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 5 Jul 2019 19:04:16 +0200 Subject: [PATCH 1168/1449] use right arch in distro dependencies --- build/azure-pipelines/win32/product-build-win32.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 0aba8e8c3ce..02922016fe3 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -89,6 +89,8 @@ steps: - powershell: | . build/azure-pipelines/win32/exec.ps1 $ErrorActionPreference = "Stop" + $env:npm_config_arch="$(VSCODE_ARCH)" + $env:CHILD_CONCURRENCY="1" exec { node build/azure-pipelines/common/installDistroDependencies.js } exec { node build/azure-pipelines/common/installDistroDependencies.js remote } displayName: Install distro dependencies From 7e03eb1a1fce3beb6ccea5f3b8f828e01940be61 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 5 Jul 2019 19:54:38 +0200 Subject: [PATCH 1169/1449] fix resubmission --- build/azure-pipelines/product-compile.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml index 9b7b18497ae..f1b4e4eba6c 100644 --- a/build/azure-pipelines/product-compile.yml +++ b/build/azure-pipelines/product-compile.yml @@ -93,6 +93,7 @@ steps: set -e yarn gulp mixin displayName: Mix in quality + condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) - script: | set -e From 350d3212ef8cff5b9d29f055d29df78113ef3d57 Mon Sep 17 00:00:00 2001 From: Logan Ramos Date: Fri, 5 Jul 2019 10:55:23 -0700 Subject: [PATCH 1170/1449] Added new error code and better error message for invalid CWD --- .../terminal/browser/terminalInstance.ts | 4 ++- .../contrib/terminal/common/terminal.ts | 1 + .../contrib/terminal/node/terminalProcess.ts | 29 ++++++++++++++----- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index d2b165d0415..76c6127aa99 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -25,7 +25,7 @@ import { activeContrastBorder, scrollbarSliderActiveBackground, scrollbarSliderB import { ICssStyleCollector, ITheme, IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { PANEL_BACKGROUND } from 'vs/workbench/common/theme'; import { TerminalWidgetManager } from 'vs/workbench/contrib/terminal/browser/terminalWidgetManager'; -import { IShellLaunchConfig, ITerminalDimensions, ITerminalInstance, ITerminalProcessManager, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, NEVER_MEASURE_RENDER_TIME_STORAGE_KEY, ProcessState, TERMINAL_PANEL_ID, IWindowsShellHelper, SHELL_PATH_INVALID_EXIT_CODE, SHELL_PATH_DIRECTORY_EXIT_CODE } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IShellLaunchConfig, ITerminalDimensions, ITerminalInstance, ITerminalProcessManager, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, NEVER_MEASURE_RENDER_TIME_STORAGE_KEY, ProcessState, TERMINAL_PANEL_ID, IWindowsShellHelper, SHELL_PATH_INVALID_EXIT_CODE, SHELL_PATH_DIRECTORY_EXIT_CODE, SHELL_CWD_INVALID_EXIT_CODE } from 'vs/workbench/contrib/terminal/common/terminal'; import { ansiColorIdentifiers, TERMINAL_BACKGROUND_COLOR, TERMINAL_CURSOR_BACKGROUND_COLOR, TERMINAL_CURSOR_FOREGROUND_COLOR, TERMINAL_FOREGROUND_COLOR, TERMINAL_SELECTION_BACKGROUND_COLOR } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; import { TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminalCommands'; import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/browser/terminalConfigHelper'; @@ -1009,6 +1009,8 @@ export class TerminalInstance implements ITerminalInstance { exitCodeMessage = nls.localize('terminal.integrated.exitedWithInvalidPath', 'The terminal shell path "{0}" does not exist', this._shellLaunchConfig.executable); } else if (exitCode === SHELL_PATH_DIRECTORY_EXIT_CODE) { exitCodeMessage = nls.localize('terminal.integrated.exitedWithInvalidPathDirectory', 'The terminal shell path "{0}" is a directory', this._shellLaunchConfig.executable); + } else if (exitCode === SHELL_CWD_INVALID_EXIT_CODE && this._shellLaunchConfig.cwd) { + exitCodeMessage = nls.localize('terminal.integrated.exitedWithInvalidCWD', 'The terminal shell CWD "{0}" does not exist', this._shellLaunchConfig.cwd.toString()); } else if (this._processManager && this._processManager.processState === ProcessState.KILLED_DURING_LAUNCH) { let args = ''; if (typeof this._shellLaunchConfig.args === 'string') { diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index faddc2df87d..643d0aaeda2 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -64,6 +64,7 @@ export const MINIMUM_LETTER_SPACING = -5; export const DEFAULT_LINE_HEIGHT = 1; export const SHELL_PATH_INVALID_EXIT_CODE = -1; export const SHELL_PATH_DIRECTORY_EXIT_CODE = -2; +export const SHELL_CWD_INVALID_EXIT_CODE = -3; export type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900'; diff --git a/src/vs/workbench/contrib/terminal/node/terminalProcess.ts b/src/vs/workbench/contrib/terminal/node/terminalProcess.ts index e5e6470f5cb..a7b355f3cc2 100644 --- a/src/vs/workbench/contrib/terminal/node/terminalProcess.ts +++ b/src/vs/workbench/contrib/terminal/node/terminalProcess.ts @@ -11,7 +11,7 @@ import * as fs from 'fs'; import { Event, Emitter } from 'vs/base/common/event'; import { getWindowsBuildNumber } from 'vs/workbench/contrib/terminal/node/terminal'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { IShellLaunchConfig, ITerminalChildProcess, SHELL_PATH_INVALID_EXIT_CODE, SHELL_PATH_DIRECTORY_EXIT_CODE } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IShellLaunchConfig, ITerminalChildProcess, SHELL_PATH_INVALID_EXIT_CODE, SHELL_PATH_DIRECTORY_EXIT_CODE, SHELL_CWD_INVALID_EXIT_CODE } from 'vs/workbench/contrib/terminal/common/terminal'; import { exec } from 'child_process'; import { ILogService } from 'vs/platform/log/common/log'; import { stat } from 'vs/base/node/pfs'; @@ -68,20 +68,35 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable { conptyInheritCursor: true }; - stat(shellLaunchConfig.executable!).then(stat => { - if (!stat.isFile() && !stat.isSymbolicLink()) { - return this._launchFailed(stat.isDirectory() ? SHELL_PATH_DIRECTORY_EXIT_CODE : SHELL_PATH_INVALID_EXIT_CODE); + const cwdVerification = stat(cwd).catch((err) => { + if (err && err.code === 'ENOENT') { + // So we can include in the error message the specified CWD + shellLaunchConfig.cwd = cwd; + return Promise.reject(SHELL_CWD_INVALID_EXIT_CODE); } - this.setupPtyProcess(shellLaunchConfig, options); - }, async (err) => { + return; + }); + + const exectuableVerification = stat(shellLaunchConfig.executable!).then(stat => { + if (!stat.isFile() && !stat.isSymbolicLink()) { + return Promise.reject(stat.isDirectory() ? SHELL_PATH_DIRECTORY_EXIT_CODE : SHELL_PATH_INVALID_EXIT_CODE); + } + return; + }).catch(async (err) => { if (err && err.code === 'ENOENT') { let cwd = shellLaunchConfig.cwd instanceof URI ? shellLaunchConfig.cwd.path : shellLaunchConfig.cwd!; const executable = await findExecutable(shellLaunchConfig.executable!, cwd); if (!executable) { - return this._launchFailed(SHELL_PATH_INVALID_EXIT_CODE); + return Promise.reject(SHELL_PATH_INVALID_EXIT_CODE); } } + return; + }); + + Promise.all([cwdVerification, exectuableVerification]).then(() => { this.setupPtyProcess(shellLaunchConfig, options); + }).catch((exitCode: number) => { + return this._launchFailed(exitCode); }); } From f75b94c9beee5b94c918cb70c52d6220e72b2ec5 Mon Sep 17 00:00:00 2001 From: Logan Ramos Date: Fri, 5 Jul 2019 11:12:28 -0700 Subject: [PATCH 1171/1449] Don't allow users to specify files as working directories --- src/vs/workbench/contrib/terminal/node/terminalProcess.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/terminal/node/terminalProcess.ts b/src/vs/workbench/contrib/terminal/node/terminalProcess.ts index a7b355f3cc2..bd222fb397f 100644 --- a/src/vs/workbench/contrib/terminal/node/terminalProcess.ts +++ b/src/vs/workbench/contrib/terminal/node/terminalProcess.ts @@ -68,7 +68,12 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable { conptyInheritCursor: true }; - const cwdVerification = stat(cwd).catch((err) => { + const cwdVerification = stat(cwd).then(stat => { + if (!stat.isDirectory()) { + return Promise.reject(SHELL_CWD_INVALID_EXIT_CODE); + } + return; + }).catch((err) => { if (err && err.code === 'ENOENT') { // So we can include in the error message the specified CWD shellLaunchConfig.cwd = cwd; From 6432f0bfb7b41271b4cf16afeb62d866804ed576 Mon Sep 17 00:00:00 2001 From: Logan Ramos Date: Fri, 5 Jul 2019 11:27:58 -0700 Subject: [PATCH 1172/1449] Fixed exit code issues with promises --- src/vs/workbench/contrib/terminal/node/terminalProcess.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/node/terminalProcess.ts b/src/vs/workbench/contrib/terminal/node/terminalProcess.ts index bd222fb397f..89ccf31644e 100644 --- a/src/vs/workbench/contrib/terminal/node/terminalProcess.ts +++ b/src/vs/workbench/contrib/terminal/node/terminalProcess.ts @@ -73,7 +73,7 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable { return Promise.reject(SHELL_CWD_INVALID_EXIT_CODE); } return; - }).catch((err) => { + }, err => { if (err && err.code === 'ENOENT') { // So we can include in the error message the specified CWD shellLaunchConfig.cwd = cwd; @@ -87,7 +87,7 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable { return Promise.reject(stat.isDirectory() ? SHELL_PATH_DIRECTORY_EXIT_CODE : SHELL_PATH_INVALID_EXIT_CODE); } return; - }).catch(async (err) => { + }, async (err) => { if (err && err.code === 'ENOENT') { let cwd = shellLaunchConfig.cwd instanceof URI ? shellLaunchConfig.cwd.path : shellLaunchConfig.cwd!; const executable = await findExecutable(shellLaunchConfig.executable!, cwd); @@ -95,7 +95,6 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable { return Promise.reject(SHELL_PATH_INVALID_EXIT_CODE); } } - return; }); Promise.all([cwdVerification, exectuableVerification]).then(() => { From 102dbaaa4136b21c599b54ae1456bbfcfaeb60a2 Mon Sep 17 00:00:00 2001 From: Logan Ramos Date: Fri, 5 Jul 2019 11:37:11 -0700 Subject: [PATCH 1173/1449] Make callbacks async --- .../workbench/contrib/terminal/node/terminalProcess.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/node/terminalProcess.ts b/src/vs/workbench/contrib/terminal/node/terminalProcess.ts index 89ccf31644e..8b61a562d8d 100644 --- a/src/vs/workbench/contrib/terminal/node/terminalProcess.ts +++ b/src/vs/workbench/contrib/terminal/node/terminalProcess.ts @@ -68,25 +68,22 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable { conptyInheritCursor: true }; - const cwdVerification = stat(cwd).then(stat => { + const cwdVerification = stat(cwd).then(async stat => { if (!stat.isDirectory()) { return Promise.reject(SHELL_CWD_INVALID_EXIT_CODE); } - return; - }, err => { + }, async err => { if (err && err.code === 'ENOENT') { // So we can include in the error message the specified CWD shellLaunchConfig.cwd = cwd; return Promise.reject(SHELL_CWD_INVALID_EXIT_CODE); } - return; }); - const exectuableVerification = stat(shellLaunchConfig.executable!).then(stat => { + const exectuableVerification = stat(shellLaunchConfig.executable!).then(async stat => { if (!stat.isFile() && !stat.isSymbolicLink()) { return Promise.reject(stat.isDirectory() ? SHELL_PATH_DIRECTORY_EXIT_CODE : SHELL_PATH_INVALID_EXIT_CODE); } - return; }, async (err) => { if (err && err.code === 'ENOENT') { let cwd = shellLaunchConfig.cwd instanceof URI ? shellLaunchConfig.cwd.path : shellLaunchConfig.cwd!; From 32169bcc6ee31a6aa7cb54cf2e23e254d9eff456 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 5 Jul 2019 12:00:41 -0700 Subject: [PATCH 1174/1449] Fix hang when tokenizing PHP Fix #75468 --- extensions/php/build/update-grammar.js | 28 +++++++++++++++++++-- extensions/php/syntaxes/php.tmLanguage.json | 4 +-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/extensions/php/build/update-grammar.js b/extensions/php/build/update-grammar.js index a6bf6d52721..58b1207a4a2 100644 --- a/extensions/php/build/update-grammar.js +++ b/extensions/php/build/update-grammar.js @@ -23,16 +23,40 @@ function adaptInjectionScope(grammar) { // Workaround for https://github.com/Microsoft/vscode/issues/40279 // and https://github.com/Microsoft/vscode-textmate/issues/59 function fixBadRegex(grammar) { + function fail(msg) { + throw new Error(`fixBadRegex callback couldn't patch ${msg}. It may be obsolete`); + } + const scopeResolution = grammar.repository['scope-resolution']; if (scopeResolution) { const match = scopeResolution.patterns[0].match; if (match === '(?i)([a-z_\\x{7f}-\\x{7fffffff}\\\\][a-z0-9_\\x{7f}-\\x{7fffffff}\\\\]*)(?=\\s*::)') { scopeResolution.patterns[0].match = '([A-Za-z_\\x{7f}-\\x{7fffffff}\\\\][A-Za-z0-9_\\x{7f}-\\x{7fffffff}\\\\]*)(?=\\s*::)'; - return; + } else { + fail('scope-resolution.match'); } + } else { + fail('scope-resolution'); } - throw new Error(`fixBadRegex callback couldn't patch the regex. It may be obsolete`); + const functionCall = grammar.repository['function-call']; + if (functionCall) { + const begin0 = functionCall.patterns[0].begin; + if (begin0 === '(?xi)\n(\n \\\\?(? Date: Fri, 5 Jul 2019 12:05:34 -0700 Subject: [PATCH 1175/1449] Bump PHP grammar --- extensions/php/cgmanifest.json | 2 +- extensions/php/syntaxes/php.tmLanguage.json | 34 ++++++++++----------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/extensions/php/cgmanifest.json b/extensions/php/cgmanifest.json index 669ade1d4cb..c61d3054042 100644 --- a/extensions/php/cgmanifest.json +++ b/extensions/php/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "language-php", "repositoryUrl": "https://github.com/atom/language-php", - "commitHash": "b896ebfb6f669b8714f419527f047466420efe5c" + "commitHash": "0efbd42e73b52347f95ac5f00c9f288ed4958832" } }, "license": "MIT", diff --git a/extensions/php/syntaxes/php.tmLanguage.json b/extensions/php/syntaxes/php.tmLanguage.json index 43e3de1cd88..a480a7d1946 100644 --- a/extensions/php/syntaxes/php.tmLanguage.json +++ b/extensions/php/syntaxes/php.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/atom/language-php/commit/b896ebfb6f669b8714f419527f047466420efe5c", + "version": "https://github.com/atom/language-php/commit/0efbd42e73b52347f95ac5f00c9f288ed4958832", "scopeName": "source.php", "patterns": [ { @@ -1324,7 +1324,7 @@ } }, "contentName": "text.html", - "end": "^(\\3)(?=;?$)", + "end": "^\\s*(\\3)(?![A-Za-z0-9_\\x{7f}-\\x{7fffffff}])", "endCaptures": { "0": { "name": "punctuation.section.embedded.end.php" @@ -1360,7 +1360,7 @@ } }, "contentName": "text.xml", - "end": "^(\\3)(?=;?$)", + "end": "^\\s*(\\3)(?![A-Za-z0-9_\\x{7f}-\\x{7fffffff}])", "endCaptures": { "0": { "name": "punctuation.section.embedded.end.php" @@ -1396,7 +1396,7 @@ } }, "contentName": "source.sql", - "end": "^(\\3)(?=;?$)", + "end": "^\\s*(\\3)(?![A-Za-z0-9_\\x{7f}-\\x{7fffffff}])", "endCaptures": { "0": { "name": "punctuation.section.embedded.end.php" @@ -1432,7 +1432,7 @@ } }, "contentName": "source.js", - "end": "^(\\3)(?=;?$)", + "end": "^\\s*(\\3)(?![A-Za-z0-9_\\x{7f}-\\x{7fffffff}])", "endCaptures": { "0": { "name": "punctuation.section.embedded.end.php" @@ -1468,7 +1468,7 @@ } }, "contentName": "source.json", - "end": "^(\\3)(?=;?$)", + "end": "^\\s*(\\3)(?![A-Za-z0-9_\\x{7f}-\\x{7fffffff}])", "endCaptures": { "0": { "name": "punctuation.section.embedded.end.php" @@ -1504,7 +1504,7 @@ } }, "contentName": "source.css", - "end": "^(\\3)(?=;?$)", + "end": "^\\s*(\\3)(?![A-Za-z0-9_\\x{7f}-\\x{7fffffff}])", "endCaptures": { "0": { "name": "punctuation.section.embedded.end.php" @@ -1540,7 +1540,7 @@ } }, "contentName": "string.regexp.heredoc.php", - "end": "^(\\3)(?=;?$)", + "end": "^\\s*(\\3)(?![A-Za-z0-9_\\x{7f}-\\x{7fffffff}])", "endCaptures": { "0": { "name": "punctuation.section.embedded.end.php" @@ -1619,7 +1619,7 @@ "name": "invalid.illegal.trailing-whitespace.php" } }, - "end": "^(\\3)(?=;?$)", + "end": "^\\s*(\\3)(?![A-Za-z0-9_\\x{7f}-\\x{7fffffff}])", "endCaptures": { "1": { "name": "keyword.operator.heredoc.php" @@ -1652,7 +1652,7 @@ } }, "contentName": "text.html", - "end": "^(\\2)(?=;?$)", + "end": "^\\s*(\\2)(?![A-Za-z0-9_\\x{7f}-\\x{7fffffff}])", "endCaptures": { "0": { "name": "punctuation.section.embedded.end.php" @@ -1685,7 +1685,7 @@ } }, "contentName": "text.xml", - "end": "^(\\2)(?=;?$)", + "end": "^\\s*(\\2)(?![A-Za-z0-9_\\x{7f}-\\x{7fffffff}])", "endCaptures": { "0": { "name": "punctuation.section.embedded.end.php" @@ -1718,7 +1718,7 @@ } }, "contentName": "source.sql", - "end": "^(\\2)(?=;?$)", + "end": "^\\s*(\\2)(?![A-Za-z0-9_\\x{7f}-\\x{7fffffff}])", "endCaptures": { "0": { "name": "punctuation.section.embedded.end.php" @@ -1751,7 +1751,7 @@ } }, "contentName": "source.js", - "end": "^(\\2)(?=;?$)", + "end": "^\\s*(\\2)(?![A-Za-z0-9_\\x{7f}-\\x{7fffffff}])", "endCaptures": { "0": { "name": "punctuation.section.embedded.end.php" @@ -1784,7 +1784,7 @@ } }, "contentName": "source.json", - "end": "^(\\2)(?=;?$)", + "end": "^\\s*(\\2)(?![A-Za-z0-9_\\x{7f}-\\x{7fffffff}])", "endCaptures": { "0": { "name": "punctuation.section.embedded.end.php" @@ -1817,7 +1817,7 @@ } }, "contentName": "source.css", - "end": "^(\\2)(?=;?$)", + "end": "^\\s*(\\2)(?![A-Za-z0-9_\\x{7f}-\\x{7fffffff}])", "endCaptures": { "0": { "name": "punctuation.section.embedded.end.php" @@ -1850,7 +1850,7 @@ } }, "contentName": "string.regexp.nowdoc.php", - "end": "^(\\2)(?=;?$)", + "end": "^\\s*(\\2)(?![A-Za-z0-9_\\x{7f}-\\x{7fffffff}])", "endCaptures": { "0": { "name": "punctuation.section.embedded.end.php" @@ -1926,7 +1926,7 @@ "name": "invalid.illegal.trailing-whitespace.php" } }, - "end": "^(\\2)(?=;?$)", + "end": "^\\s*(\\2)(?![A-Za-z0-9_\\x{7f}-\\x{7fffffff}])", "endCaptures": { "1": { "name": "keyword.operator.nowdoc.php" From e97d26af8b0883709d66cd34e157498cef262a8d Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 5 Jul 2019 23:05:49 +0200 Subject: [PATCH 1176/1449] use CHILD_CONCURRENCY=1 --- build/azure-pipelines/darwin/product-build-darwin.yml | 4 ++-- build/azure-pipelines/linux/product-build-linux-multiarch.yml | 2 +- build/azure-pipelines/linux/product-build-linux.yml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index 2fcc73f632d..f82b4acf503 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -81,8 +81,8 @@ steps: - script: | set -e - node build/azure-pipelines/common/installDistroDependencies.js - node build/azure-pipelines/common/installDistroDependencies.js remote + CHILD_CONCURRENCY=1 node build/azure-pipelines/common/installDistroDependencies.js + CHILD_CONCURRENCY=1 node build/azure-pipelines/common/installDistroDependencies.js remote displayName: Install distro dependencies - script: | diff --git a/build/azure-pipelines/linux/product-build-linux-multiarch.yml b/build/azure-pipelines/linux/product-build-linux-multiarch.yml index fb255944c04..11af31f7bd3 100644 --- a/build/azure-pipelines/linux/product-build-linux-multiarch.yml +++ b/build/azure-pipelines/linux/product-build-linux-multiarch.yml @@ -95,7 +95,7 @@ steps: - script: | set -e - ./build/azure-pipelines/linux/multiarch/$(VSCODE_ARCH)/prebuild.sh + CHILD_CONCURRENCY=1 ./build/azure-pipelines/linux/multiarch/$(VSCODE_ARCH)/prebuild.sh displayName: Prebuild - script: | diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 369c8abc7d0..99b58772c9c 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -82,8 +82,8 @@ steps: - script: | set -e - node build/azure-pipelines/common/installDistroDependencies.js - node build/azure-pipelines/common/installDistroDependencies.js remote + CHILD_CONCURRENCY=1 node build/azure-pipelines/common/installDistroDependencies.js + CHILD_CONCURRENCY=1 node build/azure-pipelines/common/installDistroDependencies.js remote displayName: Install distro dependencies - script: | From a6ee65e647e6eeb1b6926d4100276e7afff14510 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Fri, 5 Jul 2019 23:09:16 -0700 Subject: [PATCH 1177/1449] Center breadcrumb icons --- src/vs/editor/contrib/documentSymbols/media/symbol-icons.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/editor/contrib/documentSymbols/media/symbol-icons.css b/src/vs/editor/contrib/documentSymbols/media/symbol-icons.css index 3494d1440a9..2579de84f34 100644 --- a/src/vs/editor/contrib/documentSymbols/media/symbol-icons.css +++ b/src/vs/editor/contrib/documentSymbols/media/symbol-icons.css @@ -15,6 +15,7 @@ width: 16px; min-height: 14px; min-width: 16px; + background-position: center; } /* default icons */ From dad0cbc9b1cad08503af6342159662259811ed49 Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Sat, 6 Jul 2019 16:03:11 +0200 Subject: [PATCH 1178/1449] php.validate.executablePath scoped 'machine' --- extensions/php-language-features/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extensions/php-language-features/package.json b/extensions/php-language-features/package.json index c27df6e4e6a..8172c6bece8 100644 --- a/extensions/php-language-features/package.json +++ b/extensions/php-language-features/package.json @@ -38,7 +38,8 @@ "null" ], "default": null, - "description": "%configuration.validate.executablePath%" + "description": "%configuration.validate.executablePath%", + "scope": "machine" }, "php.validate.run": { "type": "string", From 821e2867f9082eb551270a0bc66fb2558748c389 Mon Sep 17 00:00:00 2001 From: Rachel Macfarlane Date: Sat, 6 Jul 2019 07:55:07 -0700 Subject: [PATCH 1179/1449] Fix updates to comment thread expansion state --- .../contrib/comments/browser/commentThreadWidget.ts | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts b/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts index ce8407db283..963d71a6a3d 100644 --- a/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts +++ b/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts @@ -381,13 +381,10 @@ export class ReviewZoneWidget extends ZoneWidget implements ICommentThreadWidget this.show({ lineNumber, column: 1 }, 2); } - // The collapsible state is not initialized yet. - if (this._isExpanded === undefined) { - if (this._commentThread.collapsibleState === modes.CommentThreadCollapsibleState.Expanded) { - this.show({ lineNumber, column: 1 }, 2); - } else { - this.hide(); - } + if (this._commentThread.collapsibleState === modes.CommentThreadCollapsibleState.Expanded) { + this.show({ lineNumber, column: 1 }, 2); + } else { + this.hide(); } if (this._commentThread.contextValue) { From d50852db1af10ec100a71ad57cc3a04c8aead117 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Sun, 7 Jul 2019 08:18:16 -0700 Subject: [PATCH 1180/1449] Fix error when search is in panel Fix #76701 --- src/vs/workbench/contrib/search/browser/searchView.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/search/browser/searchView.ts b/src/vs/workbench/contrib/search/browser/searchView.ts index 268bffe415e..16ebfb4ed95 100644 --- a/src/vs/workbench/contrib/search/browser/searchView.ts +++ b/src/vs/workbench/contrib/search/browser/searchView.ts @@ -169,6 +169,7 @@ export class SearchView extends ViewletPanel { this.matchFocused = Constants.MatchFocusKey.bindTo(this.contextKeyService); this.hasSearchResultsKey = Constants.HasSearchResults.bindTo(this.contextKeyService); + this.viewModel = this._register(this.searchWorkbenchService.searchModel); this.queryBuilder = this.instantiationService.createInstance(QueryBuilder); this.memento = new Memento(this.id, storageService); this.viewletState = this.memento.getMemento(StorageScope.WORKSPACE); @@ -204,7 +205,6 @@ export class SearchView extends ViewletPanel { } renderBody(parent: HTMLElement): void { - this.viewModel = this._register(this.searchWorkbenchService.searchModel); this.container = dom.append(parent, dom.$('.search-view')); this.searchWidgetsContainerElement = dom.append(this.container, $('.search-widgets-container')); From 931b27d834c5861bd7742b706d90a658b9b51de9 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sun, 7 Jul 2019 09:57:43 -0700 Subject: [PATCH 1181/1449] Move env.shell to stable --- src/vs/vscode.d.ts | 6 ++++++ src/vs/vscode.proposed.d.ts | 6 ------ src/vs/workbench/api/node/extHost.api.impl.ts | 1 - 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 67b899a4313..00c92be9246 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -6079,6 +6079,12 @@ declare module 'vscode' { */ export const remoteName: string | undefined; + /** + * The detected default shell for the extension host, this is overridden by the + * `terminal.integrated.shell` setting for the extension host's platform. + */ + export const shell: string; + /** * Opens an *external* item, e.g. a http(s) or mailto-link, using the * default application. diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 183828a6860..1f376c0f99f 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -623,12 +623,6 @@ declare module 'vscode' { */ export const logLevel: LogLevel; - /** - * The detected default shell for the extension host, this is overridden by the - * `terminal.integrated.shell` setting for the extension host's platform. - */ - export const shell: string; - /** * An [event](#Event) that fires when the log level has changed. */ diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index bbb26a719e9..debcbce5d4c 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -258,7 +258,6 @@ export function createApiFactory( return extHostClipboard; }, get shell() { - checkProposedApiEnabled(extension); return extHostTerminalService.getDefaultShell(configProvider); }, openExternal(uri: URI) { From 4683c39346fca76f4cda1167f47d6c2234bb8717 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sun, 7 Jul 2019 09:57:58 -0700 Subject: [PATCH 1182/1449] Include env.shell in api tests --- extensions/vscode-api-tests/src/singlefolder-tests/env.test.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/env.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/env.test.ts index 6cfc6f60408..112c76139b7 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/env.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/env.test.ts @@ -14,6 +14,7 @@ suite('env-namespace', () => { assert.equal(typeof env.appName, 'string'); assert.equal(typeof env.machineId, 'string'); assert.equal(typeof env.sessionId, 'string'); + assert.equal(typeof env.shell, 'string'); }); test('env is readonly', function () { @@ -22,6 +23,7 @@ suite('env-namespace', () => { assert.throws(() => (env as any).appName = '234'); assert.throws(() => (env as any).machineId = '234'); assert.throws(() => (env as any).sessionId = '234'); + assert.throws(() => (env as any).shell = '234'); }); test('env.remoteName', function () { From df5b5cecfef936f2f6c7ee1464500994afff1270 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 8 Jul 2019 08:43:11 +0200 Subject: [PATCH 1183/1449] debt - port over some electron6 changes --- build/builtin/main.js | 2 +- .../test/common/quickOpenScorer.test.ts | 20 +++++++++++++++++-- src/vs/code/electron-main/auth.ts | 6 +++++- src/vs/code/electron-main/sharedProcess.ts | 1 + src/vs/code/electron-main/window.ts | 4 +++- .../electron-browser/clipboardService.ts | 4 ++-- .../windows/electron-main/windowsService.ts | 3 ++- .../api/extHostConfiguration.test.ts | 2 +- test/electron/index.js | 4 +++- 9 files changed, 36 insertions(+), 10 deletions(-) diff --git a/build/builtin/main.js b/build/builtin/main.js index 849027ad2b9..b094a67cac5 100644 --- a/build/builtin/main.js +++ b/build/builtin/main.js @@ -10,7 +10,7 @@ const path = require('path'); let window = null; app.once('ready', () => { - window = new BrowserWindow({ width: 800, height: 600 }); + window = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: true, webviewTag: true } }); window.setMenuBarVisibility(false); window.loadURL(url.format({ pathname: path.join(__dirname, 'index.html'), protocol: 'file:', slashes: true })); // window.webContents.openDevTools(); diff --git a/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts b/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts index 47c51b87902..548cc9489f0 100644 --- a/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts +++ b/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts @@ -515,11 +515,27 @@ suite('Quick Open Scorer', () => { let query = 'vscode'; - let res = [resourceA, resourceB].sort((r1, r2) => compareItemsByScore(r1, r2, query, true, ResourceAccessor, cache, (r1, r2, query, ResourceAccessor) => -1)); + let res = [resourceA, resourceB].sort((r1, r2) => { + return compareItemsByScore(r1, r2, query, true, ResourceAccessor, cache, (r1, r2, query, ResourceAccessor) => { + if (r1 as any /* TS fail */ === resourceA) { + return -1; + } + + return 1; + }); + }); assert.equal(res[0], resourceA); assert.equal(res[1], resourceB); - res = [resourceB, resourceA].sort((r1, r2) => compareItemsByScore(r1, r2, query, true, ResourceAccessor, cache, (r1, r2, query, ResourceAccessor) => -1)); + res = [resourceB, resourceA].sort((r1, r2) => { + return compareItemsByScore(r1, r2, query, true, ResourceAccessor, cache, (r1, r2, query, ResourceAccessor) => { + if (r1 as any /* TS fail */ === resourceB) { + return -1; + } + + return 1; + }); + }); assert.equal(res[0], resourceB); assert.equal(res[1], resourceA); }); diff --git a/src/vs/code/electron-main/auth.ts b/src/vs/code/electron-main/auth.ts index ed92533c32f..6fbd3fcce46 100644 --- a/src/vs/code/electron-main/auth.ts +++ b/src/vs/code/electron-main/auth.ts @@ -54,7 +54,11 @@ export class ProxyAuthHandler { width: 450, height: 220, show: true, - title: 'VS Code' + title: 'VS Code', + webPreferences: { + nodeIntegration: true, + webviewTag: true + } }; const focusedWindow = this.windowsMainService.getFocusedWindow(); diff --git a/src/vs/code/electron-main/sharedProcess.ts b/src/vs/code/electron-main/sharedProcess.ts index 70b6ec75768..60926b0d146 100644 --- a/src/vs/code/electron-main/sharedProcess.ts +++ b/src/vs/code/electron-main/sharedProcess.ts @@ -38,6 +38,7 @@ export class SharedProcess implements ISharedProcess { images: false, webaudio: false, webgl: false, + nodeIntegration: true, disableBlinkFeatures: 'Auxclick' // do NOT change, allows us to identify this window as shared-process in the process explorer } }); diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index 3889550305b..d031b8b673f 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -134,7 +134,9 @@ export class CodeWindow extends Disposable implements ICodeWindow { // want to enforce that Code stays in the foreground. This triggers a disable_hidden_ // flag that Electron provides via patch: // https://github.com/electron/libchromiumcontent/blob/master/patches/common/chromium/disable_hidden.patch - backgroundThrottling: false + backgroundThrottling: false, + nodeIntegration: true, + webviewTag: true } }; diff --git a/src/vs/platform/clipboard/electron-browser/clipboardService.ts b/src/vs/platform/clipboard/electron-browser/clipboardService.ts index 9952574fb54..0fa18f71ce7 100644 --- a/src/vs/platform/clipboard/electron-browser/clipboardService.ts +++ b/src/vs/platform/clipboard/electron-browser/clipboardService.ts @@ -14,11 +14,11 @@ export class ClipboardService implements IClipboardService { _serviceBrand: any; - writeText(text: string, type?: string): void { + writeText(text: string, type?: 'selection' | 'clipboard'): void { clipboard.writeText(text, type); } - readText(type?: string): string { + readText(type?: 'selection' | 'clipboard'): string { return clipboard.readText(type); } diff --git a/src/vs/platform/windows/electron-main/windowsService.ts b/src/vs/platform/windows/electron-main/windowsService.ts index b4851c55d0c..4722e6c8e9b 100644 --- a/src/vs/platform/windows/electron-main/windowsService.ts +++ b/src/vs/platform/windows/electron-main/windowsService.ts @@ -352,7 +352,8 @@ export class WindowsService extends Disposable implements IWindowsService, IURLH async openExternal(url: string): Promise { this.logService.trace('windowsService#openExternal'); - return shell.openExternal(url); + shell.openExternal(url); + return true; } async startCrashReporter(config: Electron.CrashReporterStartOptions): Promise { diff --git a/src/vs/workbench/test/electron-browser/api/extHostConfiguration.test.ts b/src/vs/workbench/test/electron-browser/api/extHostConfiguration.test.ts index 16a5eef9fc9..2a963f3a3ab 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostConfiguration.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostConfiguration.test.ts @@ -138,7 +138,7 @@ suite('ExtHostConfiguration', function () { testObject = all.getConfiguration('workbench'); actual = testObject.get('colorCustomizations')!; - delete actual['statusBar.foreground']; + actual['statusBar.foreground'] = undefined; assert.equal(actual['statusBar.foreground'], undefined); testObject = all.getConfiguration('workbench'); actual = testObject.get('colorCustomizations')!; diff --git a/test/electron/index.js b/test/electron/index.js index b0d82f6d1bd..1d9ef60b846 100644 --- a/test/electron/index.js +++ b/test/electron/index.js @@ -113,7 +113,9 @@ app.on('ready', () => { show: false, webPreferences: { backgroundThrottling: false, - webSecurity: false + nodeIntegration: true, + webSecurity: false, + webviewTag: true } }); From 8434efe71f2f382b313ec16bd7212b4c15b20989 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 8 Jul 2019 08:51:59 +0200 Subject: [PATCH 1184/1449] fix #76763 --- src/vs/workbench/contrib/files/browser/fileActions.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/files/browser/fileActions.ts b/src/vs/workbench/contrib/files/browser/fileActions.ts index 4d7115afb8b..bfe380ec78b 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.ts @@ -835,6 +835,7 @@ async function openExplorerAndCreate(accessor: ServicesAccessor, isFolder: boole const textFileService = accessor.get(ITextFileService); const editorService = accessor.get(IEditorService); const viewletService = accessor.get(IViewletService); + const notificationService = accessor.get(INotificationService); await viewletService.openViewlet(VIEWLET_ID, true); @@ -863,8 +864,8 @@ async function openExplorerAndCreate(accessor: ServicesAccessor, isFolder: boole refreshIfSeparator(value, explorerService); return isFolder ? explorerService.select(created.resource, true) : editorService.openEditor({ resource: created.resource, options: { pinned: true } }).then(() => undefined); - }, (error) => { - onErrorWithRetry(accessor.get(INotificationService), error, () => onSuccess(value)); + }, error => { + onErrorWithRetry(notificationService, error, () => onSuccess(value)); }); }; From e3e59dcfa204437c51773303e6261e9ef48ebd2c Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 8 Jul 2019 08:59:09 +0200 Subject: [PATCH 1185/1449] fix #76765 --- src/vs/workbench/browser/parts/sidebar/sidebarPart.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts index 1831daad7f6..e8bc995e65a 100644 --- a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts +++ b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts @@ -119,7 +119,8 @@ export class SidebarPart extends CompositePart implements IViewletServi // Viewlet deregister this._register(this.registry.onDidDeregister(async (viewletDescriptor: ViewletDescriptor) => { - if (this.getActiveViewlet().getId() === viewletDescriptor.id) { + const activeViewlet = this.getActiveViewlet(); + if (!activeViewlet || activeViewlet.getId() === viewletDescriptor.id) { await this.openViewlet(this.getDefaultViewletId()); } @@ -177,7 +178,7 @@ export class SidebarPart extends CompositePart implements IViewletServi // Viewlet service - getActiveViewlet(): IViewlet { + getActiveViewlet(): IViewlet | null { return this.getActiveComposite(); } From 20bef0622fc8aa419ad79494c2ffb7364a8e6f8b Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 8 Jul 2019 09:38:34 +0200 Subject: [PATCH 1186/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3a6537a2b2a..23d3a5504bf 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "e856b9e79a3a77d1a33f40a6d4a7ae182c69bdc6", + "distro": "2069209483770ea54d4a020efa830fdc2d574025", "author": { "name": "Microsoft Corporation" }, From 441da58f1eae66841c881d778995af2b17aace5f Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 5 Jul 2019 16:23:02 +0200 Subject: [PATCH 1187/1449] debt --- .../contrib/suggest/suggestController.ts | 6 ++-- .../workbench/api/common/extHostDocuments.ts | 28 +++++++++---------- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/src/vs/editor/contrib/suggest/suggestController.ts b/src/vs/editor/contrib/suggest/suggestController.ts index 32c77163d8b..3fd85e6138a 100644 --- a/src/vs/editor/contrib/suggest/suggestController.ts +++ b/src/vs/editor/contrib/suggest/suggestController.ts @@ -139,7 +139,7 @@ export class SuggestController implements IEditorContribution { const { acceptSuggestionOnEnter } = this._editor.getConfiguration().contribInfo; acceptSuggestionsOnEnter.set(acceptSuggestionOnEnter === 'on' || acceptSuggestionOnEnter === 'smart'); }; - this._toDispose.add(this._editor.onDidChangeConfiguration((e) => updateFromConfig())); + this._toDispose.add(this._editor.onDidChangeConfiguration(() => updateFromConfig())); updateFromConfig(); } @@ -151,9 +151,7 @@ export class SuggestController implements IEditorContribution { dispose(): void { this._toDispose.dispose(); this._widget.dispose(); - if (this._model) { - this._model.dispose(); - } + this._model.dispose(); } protected _insertSuggestion(event: ISelectedSuggestion | undefined, keepAlternativeSuggestions: boolean, undoStops: boolean): void { diff --git a/src/vs/workbench/api/common/extHostDocuments.ts b/src/vs/workbench/api/common/extHostDocuments.ts index b7cf7793138..fc8bc68cb40 100644 --- a/src/vs/workbench/api/common/extHostDocuments.ts +++ b/src/vs/workbench/api/common/extHostDocuments.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Emitter, Event } from 'vs/base/common/event'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { DisposableStore } from 'vs/base/common/lifecycle'; import { URI, UriComponents } from 'vs/base/common/uri'; import { IModelChangedEvent } from 'vs/editor/common/model/mirrorTextModel'; import { ExtHostDocumentsShape, IMainContext, MainContext, MainThreadDocumentsShape } from 'vs/workbench/api/common/extHost.protocol'; @@ -25,7 +25,7 @@ export class ExtHostDocuments implements ExtHostDocumentsShape { readonly onDidChangeDocument: Event = this._onDidChangeDocument.event; readonly onDidSaveDocument: Event = this._onDidSaveDocument.event; - private _toDispose: IDisposable[]; + private readonly _toDispose = new DisposableStore(); private _proxy: MainThreadDocumentsShape; private _documentsAndEditors: ExtHostDocumentsAndEditors; private _documentLoader = new Map>(); @@ -34,22 +34,20 @@ export class ExtHostDocuments implements ExtHostDocumentsShape { this._proxy = mainContext.getProxy(MainContext.MainThreadDocuments); this._documentsAndEditors = documentsAndEditors; - this._toDispose = [ - this._documentsAndEditors.onDidRemoveDocuments(documents => { - for (const data of documents) { - this._onDidRemoveDocument.fire(data.document); - } - }), - this._documentsAndEditors.onDidAddDocuments(documents => { - for (const data of documents) { - this._onDidAddDocument.fire(data.document); - } - }) - ]; + this._documentsAndEditors.onDidRemoveDocuments(documents => { + for (const data of documents) { + this._onDidRemoveDocument.fire(data.document); + } + }, undefined, this._toDispose); + this._documentsAndEditors.onDidAddDocuments(documents => { + for (const data of documents) { + this._onDidAddDocument.fire(data.document); + } + }, undefined, this._toDispose); } public dispose(): void { - dispose(this._toDispose); + this._toDispose.dispose(); } public getAllDocumentData(): ExtHostDocumentData[] { From 69146d090e1785fe122526a4d74467ece743f38a Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 5 Jul 2019 17:11:55 +0200 Subject: [PATCH 1188/1449] revert June URI changes --- src/vs/base/common/uri.ts | 139 ++++------------------------ src/vs/base/test/common/uri.test.ts | 71 ++------------ 2 files changed, 26 insertions(+), 184 deletions(-) diff --git a/src/vs/base/common/uri.ts b/src/vs/base/common/uri.ts index df6998eafe4..966555e04d0 100644 --- a/src/vs/base/common/uri.ts +++ b/src/vs/base/common/uri.ts @@ -96,19 +96,6 @@ const _empty = ''; const _slash = '/'; const _regexp = /^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/; -function _isQueryStringScheme(scheme: string): boolean { - if (!scheme) { - return false; - } - switch (scheme.toLowerCase()) { - case 'http': - case 'https': - case 'ftp': - return true; - } - return false; -} - /** * Uniform Resource Identifier (URI) http://tools.ietf.org/html/rfc3986. * This class is a simple parser which creates the basic component parts @@ -295,14 +282,14 @@ export class URI implements UriComponents { static parse(value: string, _strict: boolean = false): URI { const match = _regexp.exec(value); if (!match) { - return new _URI(_empty, _empty, _empty, _empty, _empty, _strict); + return new _URI(_empty, _empty, _empty, _empty, _empty); } return new _URI( match[2] || _empty, - decodeURIComponentFast(match[4] || _empty, false, false), - decodeURIComponentFast(match[5] || _empty, true, false), - decodeURIComponentFast(match[7] || _empty, false, _isQueryStringScheme(match[2])), - decodeURIComponentFast(match[9] || _empty, false, false), + decodeURIComponent(match[4] || _empty), + decodeURIComponent(match[5] || _empty), + decodeURIComponent(match[7] || _empty), + decodeURIComponent(match[9] || _empty), _strict ); } @@ -334,7 +321,7 @@ export class URI implements UriComponents { // normalize to fwd-slashes on windows, // on other systems bwd-slashes are valid - // filename character, e.g. /f\oo/ba\r.txt + // filename character, eg /f\oo/ba\r.txt if (isWindows) { path = path.replace(/\\/g, _slash); } @@ -478,84 +465,6 @@ class _URI extends URI { } } -function isHex(value: string, pos: number): boolean { - if (pos >= value.length) { - return false; - } - const code = value.charCodeAt(pos); - return (code >= CharCode.Digit0 && code <= CharCode.Digit9)// 0-9 - || (code >= CharCode.a && code <= CharCode.f) //a-f - || (code >= CharCode.A && code <= CharCode.F); //A-F -} - - -function decodeURIComponentFast(uriComponent: string, isPath: boolean, isQueryString: boolean): string { - - let res: string | undefined; - let nativeDecodePos = -1; - - for (let pos = 0; pos < uriComponent.length; pos++) { - const code = uriComponent.charCodeAt(pos); - - // decoding needed - if (code === CharCode.PercentSign && isHex(uriComponent, pos + 1) && isHex(uriComponent, pos + 2)) { - - const chA = uriComponent.charCodeAt(pos + 1); - const chB = uriComponent.charCodeAt(pos + 2); - - // when in a path -> check and accept %2f and %2F (fwd slash) - // when in a query string -> check and accept %3D, %26, and %3B (equals, ampersand, semi-colon) - if ( - (isPath && chA === CharCode.Digit2 && (chB === CharCode.F || chB === CharCode.f)) - || - (isQueryString && ( - (chA === CharCode.Digit2 && chB === CharCode.Digit6) // %26 - || - (chA === CharCode.Digit3 && (chB === CharCode.B || chB === CharCode.b || chB === CharCode.D || chB === CharCode.d)) // %3D, %3D - )) - ) { - if (nativeDecodePos !== -1) { - res += decodeURIComponent(uriComponent.substring(nativeDecodePos, pos)); - nativeDecodePos = -1; - } - - if (res !== undefined) { - res += uriComponent.substr(pos, 3); - } - - pos += 2; - continue; - } - - if (res === undefined) { - res = uriComponent.substring(0, pos); - } - if (nativeDecodePos === -1) { - nativeDecodePos = pos; - } - - pos += 2; - - } else { - - if (nativeDecodePos !== -1) { - res += decodeURIComponent(uriComponent.substring(nativeDecodePos, pos)); - nativeDecodePos = -1; - } - - if (res !== undefined) { - res += String.fromCharCode(code); - } - } - } - - if (nativeDecodePos !== -1) { - res += decodeURIComponent(uriComponent.substr(nativeDecodePos)); - } - - return res !== undefined ? res : uriComponent; -} - // reserved characters: https://tools.ietf.org/html/rfc3986#section-2.2 const encodeTable: { [ch: number]: string } = { [CharCode.Colon]: '%3A', // gen-delims @@ -581,7 +490,7 @@ const encodeTable: { [ch: number]: string } = { [CharCode.Space]: '%20', }; -function encodeURIComponentFast(uriComponent: string, isPath: boolean, isQueryString: boolean): string { +function encodeURIComponentFast(uriComponent: string, allowSlash: boolean): string { let res: string | undefined = undefined; let nativeEncodePos = -1; @@ -597,8 +506,7 @@ function encodeURIComponentFast(uriComponent: string, isPath: boolean, isQuerySt || code === CharCode.Period || code === CharCode.Underline || code === CharCode.Tilde - || (isPath && code === CharCode.Slash) // path => allow slash AS-IS - || (isQueryString && (code === CharCode.Equals || code === CharCode.Ampersand || code === CharCode.Semicolon)) // query string => allow &=; + || (allowSlash && code === CharCode.Slash) ) { // check if we are delaying native encode if (nativeEncodePos !== -1) { @@ -610,20 +518,6 @@ function encodeURIComponentFast(uriComponent: string, isPath: boolean, isQuerySt res += uriComponent.charAt(pos); } - } else if (code === CharCode.PercentSign && isHex(uriComponent, pos + 1) && isHex(uriComponent, pos + 2)) { - // at percentage encoded value - - // check if we are delaying native encode - if (nativeEncodePos !== -1) { - res += encodeURIComponent(uriComponent.substring(nativeEncodePos, pos)); - nativeEncodePos = -1; - } - // check if we write into a new string (by default we try to return the param) - if (res !== undefined) { - res += uriComponent.substr(pos, 3); - } - pos += 2; - } else { // encoding needed, we need to allocate a new string if (res === undefined) { @@ -712,7 +606,6 @@ function _asFormatted(uri: URI, skipEncoding: boolean): string { let res = ''; let { scheme, authority, path, query, fragment } = uri; - if (scheme) { res += scheme; res += ':'; @@ -729,22 +622,22 @@ function _asFormatted(uri: URI, skipEncoding: boolean): string { authority = authority.substr(idx + 1); idx = userinfo.indexOf(':'); if (idx === -1) { - res += encoder(userinfo, false, false); + res += encoder(userinfo, false); } else { // :@ - res += encoder(userinfo.substr(0, idx), false, false); + res += encoder(userinfo.substr(0, idx), false); res += ':'; - res += encoder(userinfo.substr(idx + 1), false, false); + res += encoder(userinfo.substr(idx + 1), false); } res += '@'; } authority = authority.toLowerCase(); idx = authority.indexOf(':'); if (idx === -1) { - res += encoder(authority, false, false); + res += encoder(authority, false); } else { // : - res += encoder(authority.substr(0, idx), false, false); + res += encoder(authority.substr(0, idx), false); res += authority.substr(idx); } } @@ -762,15 +655,15 @@ function _asFormatted(uri: URI, skipEncoding: boolean): string { } } // encode the rest of the path - res += encoder(path, true, false); + res += encoder(path, true); } if (query) { res += '?'; - res += encoder(query, false, _isQueryStringScheme(scheme)); + res += encoder(query, false); } if (fragment) { res += '#'; - res += !skipEncoding ? encodeURIComponentFast(fragment, false, false) : fragment; + res += !skipEncoding ? encodeURIComponentFast(fragment, false) : fragment; } return res; } diff --git a/src/vs/base/test/common/uri.test.ts b/src/vs/base/test/common/uri.test.ts index a4495718fcf..85f2ad691ac 100644 --- a/src/vs/base/test/common/uri.test.ts +++ b/src/vs/base/test/common/uri.test.ts @@ -63,7 +63,7 @@ suite('URI', () => { assert.equal(URI.from({ scheme: 'http', authority: '', path: 'my/path' }).toString(), 'http:/my/path'); assert.equal(URI.from({ scheme: 'http', authority: '', path: '/my/path' }).toString(), 'http:/my/path'); //http://a-test-site.com/#test=true - assert.equal(URI.from({ scheme: 'http', authority: 'a-test-site.com', path: '/', query: 'test=true' }).toString(), 'http://a-test-site.com/?test=true'); + assert.equal(URI.from({ scheme: 'http', authority: 'a-test-site.com', path: '/', query: 'test=true' }).toString(), 'http://a-test-site.com/?test%3Dtrue'); assert.equal(URI.from({ scheme: 'http', authority: 'a-test-site.com', path: '/', query: '', fragment: 'test=true' }).toString(), 'http://a-test-site.com/#test%3Dtrue'); }); @@ -102,11 +102,11 @@ suite('URI', () => { test('with, changes', () => { assert.equal(URI.parse('before:some/file/path').with({ scheme: 'after' }).toString(), 'after:some/file/path'); - assert.equal(URI.from({ scheme: 's' }).with({ scheme: 'http', path: '/api/files/test.me', query: 't=1234' }).toString(), 'http:/api/files/test.me?t=1234'); - assert.equal(URI.from({ scheme: 's' }).with({ scheme: 'http', authority: '', path: '/api/files/test.me', query: 't=1234', fragment: '' }).toString(), 'http:/api/files/test.me?t=1234'); - assert.equal(URI.from({ scheme: 's' }).with({ scheme: 'https', authority: '', path: '/api/files/test.me', query: 't=1234', fragment: '' }).toString(), 'https:/api/files/test.me?t=1234'); - assert.equal(URI.from({ scheme: 's' }).with({ scheme: 'HTTP', authority: '', path: '/api/files/test.me', query: 't=1234', fragment: '' }).toString(), 'HTTP:/api/files/test.me?t=1234'); - assert.equal(URI.from({ scheme: 's' }).with({ scheme: 'HTTPS', authority: '', path: '/api/files/test.me', query: 't=1234', fragment: '' }).toString(), 'HTTPS:/api/files/test.me?t=1234'); + assert.equal(URI.from({ scheme: 's' }).with({ scheme: 'http', path: '/api/files/test.me', query: 't=1234' }).toString(), 'http:/api/files/test.me?t%3D1234'); + assert.equal(URI.from({ scheme: 's' }).with({ scheme: 'http', authority: '', path: '/api/files/test.me', query: 't=1234', fragment: '' }).toString(), 'http:/api/files/test.me?t%3D1234'); + assert.equal(URI.from({ scheme: 's' }).with({ scheme: 'https', authority: '', path: '/api/files/test.me', query: 't=1234', fragment: '' }).toString(), 'https:/api/files/test.me?t%3D1234'); + assert.equal(URI.from({ scheme: 's' }).with({ scheme: 'HTTP', authority: '', path: '/api/files/test.me', query: 't=1234', fragment: '' }).toString(), 'HTTP:/api/files/test.me?t%3D1234'); + assert.equal(URI.from({ scheme: 's' }).with({ scheme: 'HTTPS', authority: '', path: '/api/files/test.me', query: 't=1234', fragment: '' }).toString(), 'HTTPS:/api/files/test.me?t%3D1234'); assert.equal(URI.from({ scheme: 's' }).with({ scheme: 'boo', authority: '', path: '/api/files/test.me', query: 't=1234', fragment: '' }).toString(), 'boo:/api/files/test.me?t%3D1234'); }); @@ -262,11 +262,11 @@ suite('URI', () => { value = URI.file('c:\\test with %25\\path'); assert.equal(value.path, '/c:/test with %25/path'); - assert.equal(value.toString(), 'file:///c%3A/test%20with%20%25/path'); + assert.equal(value.toString(), 'file:///c%3A/test%20with%20%2525/path'); value = URI.file('c:\\test with %25\\c#code'); assert.equal(value.path, '/c:/test with %25/c#code'); - assert.equal(value.toString(), 'file:///c%3A/test%20with%20%25/c%23code'); + assert.equal(value.toString(), 'file:///c%3A/test%20with%20%2525/c%23code'); value = URI.file('\\\\shares'); assert.equal(value.scheme, 'file'); @@ -376,7 +376,7 @@ suite('URI', () => { let uri = URI.parse('https://go.microsoft.com/fwlink/?LinkId=518008'); assert.equal(uri.query, 'LinkId=518008'); assert.equal(uri.toString(true), 'https://go.microsoft.com/fwlink/?LinkId=518008'); - assert.equal(uri.toString(), 'https://go.microsoft.com/fwlink/?LinkId=518008'); + assert.equal(uri.toString(), 'https://go.microsoft.com/fwlink/?LinkId%3D518008'); let uri2 = URI.parse(uri.toString()); assert.equal(uri2.query, 'LinkId=518008'); @@ -385,7 +385,7 @@ suite('URI', () => { uri = URI.parse('https://go.microsoft.com/fwlink/?LinkId=518008&foö&ké¥=üü'); assert.equal(uri.query, 'LinkId=518008&foö&ké¥=üü'); assert.equal(uri.toString(true), 'https://go.microsoft.com/fwlink/?LinkId=518008&foö&ké¥=üü'); - assert.equal(uri.toString(), 'https://go.microsoft.com/fwlink/?LinkId=518008&fo%C3%B6&k%C3%A9%C2%A5=%C3%BC%C3%BC'); + assert.equal(uri.toString(), 'https://go.microsoft.com/fwlink/?LinkId%3D518008%26fo%C3%B6%26k%C3%A9%C2%A5%3D%C3%BC%C3%BC'); uri2 = URI.parse(uri.toString()); assert.equal(uri2.query, 'LinkId=518008&foö&ké¥=üü'); @@ -426,57 +426,6 @@ suite('URI', () => { assert.equal(uri.toString(true), input); }); - test('Support URL specific encodings (query component) #25852', function () { - let input = 'http://example.com/over/there?name=ferret'; - assert.equal(input, URI.parse(input).toString()); - - input = 'http://example.com/over/there?name=ferret&foo=bar'; - assert.equal(input, URI.parse(input).toString()); - - input = 'attp://example.com/over/there?name=ferret'; - assert.equal('attp://example.com/over/there?name%3Dferret', URI.parse(input).toString()); - }); - - test('Uri#parse can break path-component #45515', function () { - let uri: URI; - uri = URI.from({ scheme: 's', authority: 'a', path: '/o%2f' }); - assert.equal(uri.toString(), 's://a/o%2f'); - uri = URI.from({ scheme: 's', authority: 'a', path: '/o%2fü' }); - assert.equal(uri.toString(), 's://a/o%2f%C3%BC'); - uri = URI.from({ scheme: 's', authority: 'a', path: '/o%2f%' }); - assert.equal(uri.toString(), 's://a/o%2f%25'); - - uri = URI.file('/test with %25/c#code'); - assert.equal(uri.path, '/test with %25/c#code'); - assert.equal(uri.toString(), 'file:///test%20with%20%25/c%23code'); - - uri = URI.from({ - scheme: 'http', - authority: 'a', - path: '/o/products%2FzVNZkudXJyq8bPGTXUxx%2FBetterave-Sesame.jpg' - }); - assert.equal(uri.path, '/o/products%2FzVNZkudXJyq8bPGTXUxx%2FBetterave-Sesame.jpg'); - assert.equal(uri.toString(), 'http://a/o/products%2FzVNZkudXJyq8bPGTXUxx%2FBetterave-Sesame.jpg'); - - assert.equal(URI.parse(uri.toString()).path, '/o/products%2FzVNZkudXJyq8bPGTXUxx%2FBetterave-Sesame.jpg'); - assert.equal(uri.toString(), URI.parse(uri.toString()).toString()); // identity - - uri = URI.parse('s://a/p%2ft%c3%bc'); - assert.equal(uri.path, '/p%2ftü'); - - uri = URI.parse('s://a/%c3%bcp%2f-REST'); - assert.equal(uri.path, '/üp%2f-REST'); - - uri = URI.parse('s://a/%c3%bcp%2fd%c3%b6wn'); - assert.equal(uri.path, '/üp%2fdöwn'); - - //https://github.com/microsoft/vscode/issues/25852 - uri = URI.parse('http://www.test.com/path/service?authId=CN%3DQ10'); - assert.equal(uri.query, 'authId=CN%3DQ10'); - assert.equal(uri.toString(), 'http://www.test.com/path/service?authId=CN%3DQ10'); - }); - - test('URI - (de)serialize', function () { const values = [ From 4259b43f7011bbd33281ebf9d4ffdc1421249b54 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 5 Jul 2019 17:12:45 +0200 Subject: [PATCH 1189/1449] Revert "fix double encoding issue, https://github.com/microsoft/vscode-azure-account/issues/142" This reverts commit 781e61bf568a5e99756597c21ae2e3d3d293b1a0. --- src/vs/editor/browser/services/openerService.ts | 2 +- src/vs/workbench/api/browser/mainThreadWindow.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/browser/services/openerService.ts b/src/vs/editor/browser/services/openerService.ts index 9cfeed27dd0..c175034f969 100644 --- a/src/vs/editor/browser/services/openerService.ts +++ b/src/vs/editor/browser/services/openerService.ts @@ -55,7 +55,7 @@ export class OpenerService implements IOpenerService { if (equalsIgnoreCase(scheme, Schemas.http) || equalsIgnoreCase(scheme, Schemas.https) || equalsIgnoreCase(scheme, Schemas.mailto)) { // open http or default mail application - dom.windowOpenNoOpener(resource.toString()); + dom.windowOpenNoOpener(encodeURI(resource.toString(true))); return Promise.resolve(true); } else if (equalsIgnoreCase(scheme, Schemas.command)) { diff --git a/src/vs/workbench/api/browser/mainThreadWindow.ts b/src/vs/workbench/api/browser/mainThreadWindow.ts index 1e948912b0c..410bb4ec66d 100644 --- a/src/vs/workbench/api/browser/mainThreadWindow.ts +++ b/src/vs/workbench/api/browser/mainThreadWindow.ts @@ -58,7 +58,7 @@ export class MainThreadWindow implements MainThreadWindowShape { } } - return this.windowsService.openExternal(uri.toString()); + return this.windowsService.openExternal(encodeURI(uri.toString(true))); } private getOrCreateTunnel(remotePort: number): Promise | undefined { From c5cdf50e1708b962382821e782746b06c4cdf53b Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 8 Jul 2019 11:39:01 +0200 Subject: [PATCH 1190/1449] prep-work for #76847 --- .../contrib/snippet/snippetController2.ts | 34 +++++++---- .../editor/contrib/snippet/snippetSession.ts | 28 +++++---- .../test/snippetController2.old.test.ts | 58 +++++++++---------- .../snippet/test/snippetSession.test.ts | 4 +- .../contrib/suggest/suggestController.ts | 12 ++-- .../workbench/api/browser/mainThreadEditor.ts | 2 +- .../browser/keybindingsEditorContribution.ts | 4 +- .../contrib/snippets/browser/insertSnippet.ts | 2 +- .../contrib/snippets/browser/tabCompletion.ts | 2 +- 9 files changed, 83 insertions(+), 63 deletions(-) diff --git a/src/vs/editor/contrib/snippet/snippetController2.ts b/src/vs/editor/contrib/snippet/snippetController2.ts index 214b0f390eb..75e8ad4ff86 100644 --- a/src/vs/editor/contrib/snippet/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/snippetController2.ts @@ -20,6 +20,22 @@ import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegis import { ILogService } from 'vs/platform/log/common/log'; import { SnippetSession } from './snippetSession'; +export interface ISnippetInsertOptions { + overwriteBefore: number; + overwriteAfter: number; + adjustWhitespace: boolean; + undoStopBefore: boolean; + undoStopAfter: boolean; +} + +const _defaultOptions: ISnippetInsertOptions = { + overwriteBefore: 0, + overwriteAfter: 0, + undoStopBefore: true, + undoStopAfter: true, + adjustWhitespace: true, +}; + export class SnippetController2 implements IEditorContribution { static get(editor: ICodeEditor): SnippetController2 { @@ -63,15 +79,13 @@ export class SnippetController2 implements IEditorContribution { insert( template: string, - overwriteBefore: number = 0, overwriteAfter: number = 0, - undoStopBefore: boolean = true, undoStopAfter: boolean = true, - adjustWhitespace: boolean = true, + opts?: Partial ): void { // this is here to find out more about the yet-not-understood // error that sometimes happens when we fail to inserted a nested // snippet try { - this._doInsert(template, overwriteBefore, overwriteAfter, undoStopBefore, undoStopAfter, adjustWhitespace); + this._doInsert(template, typeof opts === 'undefined' ? _defaultOptions : { ..._defaultOptions, ...opts }); } catch (e) { this.cancel(); @@ -84,9 +98,7 @@ export class SnippetController2 implements IEditorContribution { private _doInsert( template: string, - overwriteBefore: number = 0, overwriteAfter: number = 0, - undoStopBefore: boolean = true, undoStopAfter: boolean = true, - adjustWhitespace: boolean = true, + opts: ISnippetInsertOptions ): void { if (!this._editor.hasModel()) { return; @@ -96,19 +108,19 @@ export class SnippetController2 implements IEditorContribution { // as that is the inflight state causing cancelation this._snippetListener.clear(); - if (undoStopBefore) { + if (opts.undoStopBefore) { this._editor.getModel().pushStackElement(); } if (!this._session) { this._modelVersionId = this._editor.getModel().getAlternativeVersionId(); - this._session = new SnippetSession(this._editor, template, overwriteBefore, overwriteAfter, adjustWhitespace); + this._session = new SnippetSession(this._editor, template, opts); this._session.insert(); } else { - this._session.merge(template, overwriteBefore, overwriteAfter, adjustWhitespace); + this._session.merge(template, opts); } - if (undoStopAfter) { + if (opts.undoStopAfter) { this._editor.getModel().pushStackElement(); } diff --git a/src/vs/editor/contrib/snippet/snippetSession.ts b/src/vs/editor/contrib/snippet/snippetSession.ts index 6eeb1678913..3d3502b0fd3 100644 --- a/src/vs/editor/contrib/snippet/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/snippetSession.ts @@ -315,6 +315,18 @@ export class OneSnippet { } } +export interface ISnippetSessionInsertOptions { + overwriteBefore: number; + overwriteAfter: number; + adjustWhitespace: boolean; +} + +const _defaultOptions: ISnippetSessionInsertOptions = { + overwriteBefore: 0, + overwriteAfter: 0, + adjustWhitespace: true +}; + export class SnippetSession { static adjustWhitespace(model: ITextModel, position: IPosition, snippet: TextmateSnippet): void { @@ -450,17 +462,13 @@ export class SnippetSession { private readonly _editor: IActiveCodeEditor; private readonly _template: string; private readonly _templateMerges: [number, number, string][] = []; - private readonly _overwriteBefore: number; - private readonly _overwriteAfter: number; - private readonly _adjustWhitespace: boolean; + private readonly _options: ISnippetSessionInsertOptions; private _snippets: OneSnippet[] = []; - constructor(editor: IActiveCodeEditor, template: string, overwriteBefore: number = 0, overwriteAfter: number = 0, adjustWhitespace: boolean = true) { + constructor(editor: IActiveCodeEditor, template: string, options: ISnippetSessionInsertOptions = _defaultOptions) { this._editor = editor; this._template = template; - this._overwriteBefore = overwriteBefore; - this._overwriteAfter = overwriteAfter; - this._adjustWhitespace = adjustWhitespace; + this._options = options; } dispose(): void { @@ -479,7 +487,7 @@ export class SnippetSession { const model = this._editor.getModel(); // make insert edit and start with first selections - const { edits, snippets } = SnippetSession.createEditsAndSnippets(this._editor, this._template, this._overwriteBefore, this._overwriteAfter, false, this._adjustWhitespace); + const { edits, snippets } = SnippetSession.createEditsAndSnippets(this._editor, this._template, this._options.overwriteBefore, this._options.overwriteAfter, false, this._options.adjustWhitespace); this._snippets = snippets; const selections = model.pushEditOperations(this._editor.getSelections(), edits, undoEdits => { @@ -493,12 +501,12 @@ export class SnippetSession { this._editor.revealRange(selections[0]); } - merge(template: string, overwriteBefore: number = 0, overwriteAfter: number = 0, adjustWhitespace: boolean = true): void { + merge(template: string, options: ISnippetSessionInsertOptions = _defaultOptions): void { if (!this._editor.hasModel()) { return; } this._templateMerges.push([this._snippets[0]._nestingLevel, this._snippets[0]._placeholderGroupsIdx, template]); - const { edits, snippets } = SnippetSession.createEditsAndSnippets(this._editor, template, overwriteBefore, overwriteAfter, true, adjustWhitespace); + const { edits, snippets } = SnippetSession.createEditsAndSnippets(this._editor, template, options.overwriteBefore, options.overwriteAfter, true, options.adjustWhitespace); this._editor.setSelections(this._editor.getModel().pushEditOperations(this._editor.getSelections(), edits, undoEdits => { diff --git a/src/vs/editor/contrib/snippet/test/snippetController2.old.test.ts b/src/vs/editor/contrib/snippet/test/snippetController2.old.test.ts index 9770cb36420..c9751d0504d 100644 --- a/src/vs/editor/contrib/snippet/test/snippetController2.old.test.ts +++ b/src/vs/editor/contrib/snippet/test/snippetController2.old.test.ts @@ -62,7 +62,7 @@ suite('SnippetController', () => { snippetTest((editor, cursor, template, snippetController) => { editor.setPosition({ lineNumber: 4, column: 2 }); - snippetController.insert(template, 0, 0); + snippetController.insert(template); assert.equal(editor.getModel()!.getLineContent(4), '\tfor (var index; index < array.length; index++) {'); assert.equal(editor.getModel()!.getLineContent(5), '\t\tvar element = array[index];'); assert.equal(editor.getModel()!.getLineContent(6), '\t\t'); @@ -98,7 +98,7 @@ suite('SnippetController', () => { snippetTest((editor, cursor, template, snippetController) => { editor.setPosition({ lineNumber: 4, column: 2 }); - snippetController.insert(template, 0, 0); + snippetController.insert(template); assert.equal(editor.getModel()!.getLineContent(4), '\tfor (var index; index < array.length; index++) {'); assert.equal(editor.getModel()!.getLineContent(5), '\t\tvar element = array[index];'); assert.equal(editor.getModel()!.getLineContent(6), '\t\t'); @@ -180,7 +180,7 @@ suite('SnippetController', () => { test('Stops when calling model.setValue()', () => { snippetTest((editor, cursor, codeSnippet, snippetController) => { editor.setPosition({ lineNumber: 4, column: 2 }); - snippetController.insert(codeSnippet, 0, 0); + snippetController.insert(codeSnippet); editor.getModel()!.setValue('goodbye'); @@ -191,7 +191,7 @@ suite('SnippetController', () => { test('Stops when undoing', () => { snippetTest((editor, cursor, codeSnippet, snippetController) => { editor.setPosition({ lineNumber: 4, column: 2 }); - snippetController.insert(codeSnippet, 0, 0); + snippetController.insert(codeSnippet); editor.getModel()!.undo(); @@ -202,7 +202,7 @@ suite('SnippetController', () => { test('Stops when moving cursor outside', () => { snippetTest((editor, cursor, codeSnippet, snippetController) => { editor.setPosition({ lineNumber: 4, column: 2 }); - snippetController.insert(codeSnippet, 0, 0); + snippetController.insert(codeSnippet); editor.setPosition({ lineNumber: 1, column: 1 }); @@ -213,7 +213,7 @@ suite('SnippetController', () => { test('Stops when disconnecting editor model', () => { snippetTest((editor, cursor, codeSnippet, snippetController) => { editor.setPosition({ lineNumber: 4, column: 2 }); - snippetController.insert(codeSnippet, 0, 0); + snippetController.insert(codeSnippet); editor.setModel(null); @@ -224,7 +224,7 @@ suite('SnippetController', () => { test('Stops when disposing editor', () => { snippetTest((editor, cursor, codeSnippet, snippetController) => { editor.setPosition({ lineNumber: 4, column: 2 }); - snippetController.insert(codeSnippet, 0, 0); + snippetController.insert(codeSnippet); snippetController.dispose(); @@ -240,7 +240,7 @@ suite('SnippetController', () => { ]); codeSnippet = 'foo$0'; - snippetController.insert(codeSnippet, 0, 0); + snippetController.insert(codeSnippet); assert.equal(editor.getSelections()!.length, 2); const [first, second] = editor.getSelections()!; @@ -255,7 +255,7 @@ suite('SnippetController', () => { ]); codeSnippet = 'foo$0bar'; - snippetController.insert(codeSnippet, 0, 0); + snippetController.insert(codeSnippet); assert.equal(editor.getSelections()!.length, 2); const [first, second] = editor.getSelections()!; @@ -270,7 +270,7 @@ suite('SnippetController', () => { ]); codeSnippet = 'foo$0bar'; - snippetController.insert(codeSnippet, 0, 0); + snippetController.insert(codeSnippet); assert.equal(editor.getSelections()!.length, 2); const [first, second] = editor.getSelections()!; @@ -285,7 +285,7 @@ suite('SnippetController', () => { ]); codeSnippet = 'foo\n$0\nbar'; - snippetController.insert(codeSnippet, 0, 0); + snippetController.insert(codeSnippet); assert.equal(editor.getSelections()!.length, 2); const [first, second] = editor.getSelections()!; @@ -300,7 +300,7 @@ suite('SnippetController', () => { ]); codeSnippet = 'foo\n$0\nbar'; - snippetController.insert(codeSnippet, 0, 0); + snippetController.insert(codeSnippet); assert.equal(editor.getSelections()!.length, 2); const [first, second] = editor.getSelections()!; @@ -314,7 +314,7 @@ suite('SnippetController', () => { ]); codeSnippet = 'xo$0r'; - snippetController.insert(codeSnippet, 1, 0); + snippetController.insert(codeSnippet, { overwriteBefore: 1 }); assert.equal(editor.getSelections()!.length, 1); assert.ok(editor.getSelection()!.equalsRange({ startLineNumber: 2, startColumn: 8, endColumn: 8, endLineNumber: 2 })); @@ -327,7 +327,7 @@ suite('SnippetController', () => { editor.setSelection(new Selection(1, 19, 1, 19)); codeSnippet = '{{% url_**$1** %}}'; - controller.insert(codeSnippet, 2, 0); + controller.insert(codeSnippet, { overwriteBefore: 2 }); assert.equal(editor.getSelections()!.length, 1); assert.ok(editor.getSelection()!.equalsRange({ startLineNumber: 1, startColumn: 27, endLineNumber: 1, endColumn: 27 })); @@ -345,7 +345,7 @@ suite('SnippetController', () => { '});' ].join('\n'); - controller.insert(codeSnippet, 2, 0); + controller.insert(codeSnippet, { overwriteBefore: 2 }); assert.equal(editor.getSelections()!.length, 1); assert.ok(editor.getSelection()!.equalsRange({ startLineNumber: 2, startColumn: 2, endLineNumber: 2, endColumn: 2 }), editor.getSelection()!.toString()); @@ -363,7 +363,7 @@ suite('SnippetController', () => { '});' ].join('\n'); - controller.insert(codeSnippet, 2, 0); + controller.insert(codeSnippet, { overwriteBefore: 2 }); assert.equal(editor.getSelections()!.length, 1); assert.ok(editor.getSelection()!.equalsRange({ startLineNumber: 2, startColumn: 1, endLineNumber: 2, endColumn: 1 }), editor.getSelection()!.toString()); @@ -379,7 +379,7 @@ suite('SnippetController', () => { 'aft${1}er' ].join('\n'); - controller.insert(codeSnippet, 8, 0); + controller.insert(codeSnippet, { overwriteBefore: 8 }); assert.equal(editor.getModel()!.getValue(), 'after'); assert.equal(editor.getSelections()!.length, 1); @@ -403,7 +403,7 @@ suite('SnippetController', () => { '});' ].join('\n'); - controller.insert(codeSnippet, 2, 0); + controller.insert(codeSnippet, { overwriteBefore: 2 }); assert.equal(editor.getSelections()!.length, 2); const [first, second] = editor.getSelections()!; @@ -428,7 +428,7 @@ suite('SnippetController', () => { '});' ].join('\n'); - controller.insert(codeSnippet, 2, 0); + controller.insert(codeSnippet, { overwriteBefore: 2 }); assert.equal(editor.getSelections()!.length, 1); const [first] = editor.getSelections()!; @@ -448,7 +448,7 @@ suite('SnippetController', () => { codeSnippet = 'afterEach'; - controller.insert(codeSnippet, 2, 0); + controller.insert(codeSnippet, { overwriteBefore: 2 }); assert.ok(editor.getSelection()!.equalsRange({ startLineNumber: 1, startColumn: 10, endLineNumber: 1, endColumn: 10 })); @@ -465,7 +465,7 @@ suite('SnippetController', () => { ]); codeSnippet = '_foo'; - controller.insert(codeSnippet, 1, 0); + controller.insert(codeSnippet, { overwriteBefore: 1 }); assert.equal(editor.getModel()!.getValue(), 'this._foo\nabc_foo'); }, ['this._', 'abc']); @@ -478,7 +478,7 @@ suite('SnippetController', () => { ]); codeSnippet = 'XX'; - controller.insert(codeSnippet, 1, 0); + controller.insert(codeSnippet, { overwriteBefore: 1 }); assert.equal(editor.getModel()!.getValue(), 'this.XX\nabcXX'); }, ['this._', 'abc']); @@ -492,7 +492,7 @@ suite('SnippetController', () => { ]); codeSnippet = '_foo'; - controller.insert(codeSnippet, 1, 0); + controller.insert(codeSnippet, { overwriteBefore: 1 }); assert.equal(editor.getModel()!.getValue(), 'this._foo\nabc_foo\ndef_foo'); }, ['this._', 'abc', 'def_']); @@ -506,7 +506,7 @@ suite('SnippetController', () => { ]); codeSnippet = '._foo'; - controller.insert(codeSnippet, 2, 0); + controller.insert(codeSnippet, { overwriteBefore: 2 }); assert.equal(editor.getModel()!.getValue(), 'this._foo\nabc._foo\ndef._foo'); }, ['this._', 'abc', 'def._']); @@ -520,7 +520,7 @@ suite('SnippetController', () => { ]); codeSnippet = '._foo'; - controller.insert(codeSnippet, 2, 0); + controller.insert(codeSnippet, { overwriteBefore: 2 }); assert.equal(editor.getModel()!.getValue(), 'this._foo\nabc._foo\ndef._foo'); }, ['this._', 'abc', 'def._']); @@ -534,7 +534,7 @@ suite('SnippetController', () => { ]); codeSnippet = '._foo'; - controller.insert(codeSnippet, 2, 0); + controller.insert(codeSnippet, { overwriteBefore: 2 }); assert.equal(editor.getModel()!.getValue(), 'this._._foo\na._foo\ndef._._foo'); }, ['this._', 'abc', 'def._']); @@ -550,7 +550,7 @@ suite('SnippetController', () => { ]); codeSnippet = 'document'; - controller.insert(codeSnippet, 3, 0); + controller.insert(codeSnippet, { overwriteBefore: 3 }); assert.equal(editor.getModel()!.getValue(), '{document}\n{document && true}'); }, ['{foo}', '{foo && true}']); @@ -565,7 +565,7 @@ suite('SnippetController', () => { ]); codeSnippet = 'for (var ${1:i}=0; ${1:i} { ]); codeSnippet = 'for (let ${1:i}=0; ${1:i} { editor.setSelection(new Selection(2, 5, 2, 5)); - const session = new SnippetSession(editor, 'abc\n foo\n bar\n$0', 0, 0, false); + const session = new SnippetSession(editor, 'abc\n foo\n bar\n$0', { overwriteBefore: 0, overwriteAfter: 0, adjustWhitespace: false }); session.insert(); assert.equal(editor.getModel()!.getValue(), 'function foo() {\n abc\n foo\n bar\nconsole.log(a);\n}'); }); @@ -648,7 +648,7 @@ suite('SnippetSession', function () { assert.ok(actual.equalsSelection(new Selection(1, 9, 1, 12))); editor.setSelections([new Selection(1, 9, 1, 12)]); - new SnippetSession(editor, 'far', 3, 0).insert(); + new SnippetSession(editor, 'far', { overwriteBefore: 3, overwriteAfter: 0, adjustWhitespace: true }).insert(); assert.equal(model.getValue(), 'console.far'); }); }); diff --git a/src/vs/editor/contrib/suggest/suggestController.ts b/src/vs/editor/contrib/suggest/suggestController.ts index 3fd85e6138a..600cfc52273 100644 --- a/src/vs/editor/contrib/suggest/suggestController.ts +++ b/src/vs/editor/contrib/suggest/suggestController.ts @@ -192,13 +192,13 @@ export class SuggestController implements IEditorContribution { const overwriteBefore = position.column - suggestion.range.startColumn; const overwriteAfter = suggestion.range.endColumn - position.column; - SnippetController2.get(this._editor).insert( - insertText, - overwriteBefore + columnDelta, + SnippetController2.get(this._editor).insert(insertText, { + overwriteBefore: overwriteBefore + columnDelta, overwriteAfter, - false, false, - !(suggestion.insertTextRules! & CompletionItemInsertTextRule.KeepWhitespace) - ); + undoStopBefore: false, + undoStopAfter: false, + adjustWhitespace: !(suggestion.insertTextRules! & CompletionItemInsertTextRule.KeepWhitespace) + }); if (undoStops) { this._editor.pushUndoStop(); diff --git a/src/vs/workbench/api/browser/mainThreadEditor.ts b/src/vs/workbench/api/browser/mainThreadEditor.ts index 5e65f41e3c5..669ff5063fa 100644 --- a/src/vs/workbench/api/browser/mainThreadEditor.ts +++ b/src/vs/workbench/api/browser/mainThreadEditor.ts @@ -484,7 +484,7 @@ export class MainThreadTextEditor { this._codeEditor.focus(); // make modifications - snippetController.insert(template, 0, 0, opts.undoStopBefore, opts.undoStopAfter); + snippetController.insert(template, { overwriteBefore: 0, overwriteAfter: 0, undoStopBefore: opts.undoStopBefore, undoStopAfter: opts.undoStopAfter }); return true; } diff --git a/src/vs/workbench/contrib/preferences/browser/keybindingsEditorContribution.ts b/src/vs/workbench/contrib/preferences/browser/keybindingsEditorContribution.ts index 6683ddf176e..75a9891cb22 100644 --- a/src/vs/workbench/contrib/preferences/browser/keybindingsEditorContribution.ts +++ b/src/vs/workbench/contrib/preferences/browser/keybindingsEditorContribution.ts @@ -157,7 +157,7 @@ export class KeybindingWidgetRenderer extends Disposable { snippetText = smartInsertInfo.prepend + snippetText + smartInsertInfo.append; this._editor.setPosition(smartInsertInfo.position); - SnippetController2.get(this._editor).insert(snippetText, 0, 0); + SnippetController2.get(this._editor).insert(snippetText, { overwriteBefore: 0, overwriteAfter: 0 }); } } } @@ -406,4 +406,4 @@ registerEditorCommand(new DefineKeybindingCommand()); registerThemingParticipant((theme, collector) => { collector.addRule(`.monaco-editor .inlineKeybindingInfo:before { background: url("data:image/svg+xml,${SeverityIcon.getSVGData(Severity.Info, theme)}") -0.1em -0.2em no-repeat; }`); collector.addRule(`.monaco-editor .inlineKeybindingError:before { background: url("data:image/svg+xml,${SeverityIcon.getSVGData(Severity.Error, theme)}") -0.1em -0.2em no-repeat; }`); -}); \ No newline at end of file +}); diff --git a/src/vs/workbench/contrib/snippets/browser/insertSnippet.ts b/src/vs/workbench/contrib/snippets/browser/insertSnippet.ts index bcf3f7a202f..5484d9f9a93 100644 --- a/src/vs/workbench/contrib/snippets/browser/insertSnippet.ts +++ b/src/vs/workbench/contrib/snippets/browser/insertSnippet.ts @@ -167,7 +167,7 @@ class InsertSnippetAction extends EditorAction { } }).then(snippet => { if (snippet) { - SnippetController2.get(editor).insert(snippet.codeSnippet, 0, 0); + SnippetController2.get(editor).insert(snippet.codeSnippet, { overwriteBefore: 0, overwriteAfter: 0 }); } }); } diff --git a/src/vs/workbench/contrib/snippets/browser/tabCompletion.ts b/src/vs/workbench/contrib/snippets/browser/tabCompletion.ts index 15c2ebd44d9..8154a9da364 100644 --- a/src/vs/workbench/contrib/snippets/browser/tabCompletion.ts +++ b/src/vs/workbench/contrib/snippets/browser/tabCompletion.ts @@ -129,7 +129,7 @@ export class TabCompletionController implements editorCommon.IEditorContribution if (this._activeSnippets.length === 1) { // one -> just insert const [snippet] = this._activeSnippets; - SnippetController2.get(this._editor).insert(snippet.codeSnippet, snippet.prefix.length, 0); + SnippetController2.get(this._editor).insert(snippet.codeSnippet, { overwriteBefore: snippet.prefix.length, overwriteAfter: 0 }); } else if (this._activeSnippets.length > 1) { // two or more -> show IntelliSense box From 7b463651d94956880c06639e8e2b44204af1d86c Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 8 Jul 2019 11:59:07 +0200 Subject: [PATCH 1191/1449] clipboard variable resolver works with string, not clipboard service, #76847 --- .../editor/contrib/snippet/snippetSession.ts | 2 +- .../contrib/snippet/snippetVariables.ts | 12 ++-- .../snippet/test/snippetVariables.test.ts | 61 ++++--------------- 3 files changed, 17 insertions(+), 58 deletions(-) diff --git a/src/vs/editor/contrib/snippet/snippetSession.ts b/src/vs/editor/contrib/snippet/snippetSession.ts index 3d3502b0fd3..c916380c368 100644 --- a/src/vs/editor/contrib/snippet/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/snippetSession.ts @@ -439,7 +439,7 @@ export class SnippetSession { snippet.resolveVariables(new CompositeSnippetVariableResolver([ modelBasedVariableResolver, - new ClipboardBasedVariableResolver(clipboardService, idx, indexedSelections.length), + new ClipboardBasedVariableResolver(clipboardService && clipboardService.readText(), idx, indexedSelections.length), new SelectionBasedVariableResolver(model, selection), new CommentBasedVariableResolver(model), new TimeBasedVariableResolver, diff --git a/src/vs/editor/contrib/snippet/snippetVariables.ts b/src/vs/editor/contrib/snippet/snippetVariables.ts index 876a5f8be65..c640692d1cb 100644 --- a/src/vs/editor/contrib/snippet/snippetVariables.ts +++ b/src/vs/editor/contrib/snippet/snippetVariables.ts @@ -10,7 +10,6 @@ import { Selection } from 'vs/editor/common/core/selection'; import { VariableResolver, Variable, Text } from 'vs/editor/contrib/snippet/snippetParser'; import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; import { getLeadingWhitespace, commonPrefixLength, isFalsyOrWhitespace, pad, endsWith } from 'vs/base/common/strings'; -import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { isSingleFolderWorkspaceIdentifier, toWorkspaceIdentifier, WORKSPACE_EXTENSION } from 'vs/platform/workspaces/common/workspaces'; @@ -162,7 +161,7 @@ export class ModelBasedVariableResolver implements VariableResolver { export class ClipboardBasedVariableResolver implements VariableResolver { constructor( - private readonly _clipboardService: IClipboardService, + private readonly _clipboardText: string | undefined, private readonly _selectionIdx: number, private readonly _selectionCount: number ) { @@ -170,20 +169,19 @@ export class ClipboardBasedVariableResolver implements VariableResolver { } resolve(variable: Variable): string | undefined { - if (variable.name !== 'CLIPBOARD' || !this._clipboardService) { + if (variable.name !== 'CLIPBOARD') { return undefined; } - const text = this._clipboardService.readText(); - if (!text) { + if (!this._clipboardText) { return undefined; } - const lines = text.split(/\r\n|\n|\r/).filter(s => !isFalsyOrWhitespace(s)); + const lines = this._clipboardText.split(/\r\n|\n|\r/).filter(s => !isFalsyOrWhitespace(s)); if (lines.length === this._selectionCount) { return lines[this._selectionIdx]; } else { - return text; + return this._clipboardText; } } } diff --git a/src/vs/editor/contrib/snippet/test/snippetVariables.test.ts b/src/vs/editor/contrib/snippet/test/snippetVariables.test.ts index 0b44a9c6a68..64ad2bd985f 100644 --- a/src/vs/editor/contrib/snippet/test/snippetVariables.test.ts +++ b/src/vs/editor/contrib/snippet/test/snippetVariables.test.ts @@ -9,7 +9,6 @@ import { Selection } from 'vs/editor/common/core/selection'; import { SelectionBasedVariableResolver, CompositeSnippetVariableResolver, ModelBasedVariableResolver, ClipboardBasedVariableResolver, TimeBasedVariableResolver, WorkspaceBasedVariableResolver } from 'vs/editor/contrib/snippet/snippetVariables'; import { SnippetParser, Variable, VariableResolver } from 'vs/editor/contrib/snippet/snippetParser'; import { TextModel } from 'vs/editor/common/model/textModel'; -import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { Workspace, toWorkspaceFolders, IWorkspace, IWorkspaceContextService, toWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; suite('Snippet Variables Resolver', function () { @@ -209,63 +208,25 @@ suite('Snippet Variables Resolver', function () { test('Add variable to insert value from clipboard to a snippet #40153', function () { - let readTextResult: string | null | undefined; - const clipboardService = new class implements IClipboardService { - _serviceBrand: any; - readText(): any { return readTextResult; } - _throw = () => { throw new Error(); }; - writeText = this._throw; - readFindText = this._throw; - writeFindText = this._throw; - writeResources = this._throw; - readResources = this._throw; - hasResources = this._throw; - }; - let resolver = new ClipboardBasedVariableResolver(clipboardService, 1, 0); + assertVariableResolve(new ClipboardBasedVariableResolver(undefined, 1, 0), 'CLIPBOARD', undefined); - readTextResult = undefined; - assertVariableResolve(resolver, 'CLIPBOARD', undefined); + assertVariableResolve(new ClipboardBasedVariableResolver(null!, 1, 0), 'CLIPBOARD', undefined); - readTextResult = null; - assertVariableResolve(resolver, 'CLIPBOARD', undefined); + assertVariableResolve(new ClipboardBasedVariableResolver('', 1, 0), 'CLIPBOARD', undefined); - readTextResult = ''; - assertVariableResolve(resolver, 'CLIPBOARD', undefined); + assertVariableResolve(new ClipboardBasedVariableResolver('foo', 1, 0), 'CLIPBOARD', 'foo'); - readTextResult = 'foo'; - assertVariableResolve(resolver, 'CLIPBOARD', 'foo'); - - assertVariableResolve(resolver, 'foo', undefined); - assertVariableResolve(resolver, 'cLIPBOARD', undefined); + assertVariableResolve(new ClipboardBasedVariableResolver('foo', 1, 0), 'foo', undefined); + assertVariableResolve(new ClipboardBasedVariableResolver('foo', 1, 0), 'cLIPBOARD', undefined); }); test('Add variable to insert value from clipboard to a snippet #40153', function () { - let readTextResult: string; - let resolver: VariableResolver; - const clipboardService = new class implements IClipboardService { - _serviceBrand: any; - readText(): string { return readTextResult; } - _throw = () => { throw new Error(); }; - writeText = this._throw; - readFindText = this._throw; - writeFindText = this._throw; - writeResources = this._throw; - readResources = this._throw; - hasResources = this._throw; - }; + assertVariableResolve(new ClipboardBasedVariableResolver('line1', 1, 2), 'CLIPBOARD', 'line1'); + assertVariableResolve(new ClipboardBasedVariableResolver('line1\nline2\nline3', 1, 2), 'CLIPBOARD', 'line1\nline2\nline3'); - resolver = new ClipboardBasedVariableResolver(clipboardService, 1, 2); - readTextResult = 'line1'; - assertVariableResolve(resolver, 'CLIPBOARD', 'line1'); - readTextResult = 'line1\nline2\nline3'; - assertVariableResolve(resolver, 'CLIPBOARD', 'line1\nline2\nline3'); - - readTextResult = 'line1\nline2'; - assertVariableResolve(resolver, 'CLIPBOARD', 'line2'); - readTextResult = 'line1\nline2'; - resolver = new ClipboardBasedVariableResolver(clipboardService, 0, 2); - assertVariableResolve(resolver, 'CLIPBOARD', 'line1'); + assertVariableResolve(new ClipboardBasedVariableResolver('line1\nline2', 1, 2), 'CLIPBOARD', 'line2'); + assertVariableResolve(new ClipboardBasedVariableResolver('line1\nline2', 0, 2), 'CLIPBOARD', 'line1'); }); @@ -336,4 +297,4 @@ suite('Snippet Variables Resolver', function () { workspace = new Workspace('', toWorkspaceFolders([{ path: 'folderName' }], workspaceConfigPath), workspaceConfigPath); assertVariableResolve(resolver, 'WORKSPACE_NAME', 'testWorkspace'); }); -}); \ No newline at end of file +}); From 8c1327af613c04aca8e634e188ec198b245df575 Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 8 Jul 2019 12:16:26 +0200 Subject: [PATCH 1192/1449] fixes #76696 --- .../workbench/contrib/output/browser/outputActions.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/output/browser/outputActions.ts b/src/vs/workbench/contrib/output/browser/outputActions.ts index d54b975b717..5d296f8a59a 100644 --- a/src/vs/workbench/contrib/output/browser/outputActions.ts +++ b/src/vs/workbench/contrib/output/browser/outputActions.ts @@ -69,13 +69,12 @@ export class ToggleOrSetOutputScrollLockAction extends Action { private toDispose: IDisposable[] = []; - constructor(id: string, label: string, - @IOutputService private readonly outputService: IOutputService) { + constructor(id: string, label: string, @IOutputService private readonly outputService: IOutputService) { super(id, label, 'output-action output-scroll-unlock'); this.toDispose.push(this.outputService.onActiveOutputChannel(channel => { const activeChannel = this.outputService.getActiveChannel(); if (activeChannel) { - this.setClass(activeChannel.scrollLock); + this.setClassAndLabel(activeChannel.scrollLock); } })); } @@ -90,17 +89,19 @@ export class ToggleOrSetOutputScrollLockAction extends Action { else { activeChannel.scrollLock = !activeChannel.scrollLock; } - this.setClass(activeChannel.scrollLock); + this.setClassAndLabel(activeChannel.scrollLock); } return Promise.resolve(true); } - private setClass(locked: boolean) { + private setClassAndLabel(locked: boolean) { if (locked) { this.class = 'output-action output-scroll-lock'; + this.label = nls.localize('outputScrollOn', "Turn Auto Scrolling On"); } else { this.class = 'output-action output-scroll-unlock'; + this.label = nls.localize('outputScrollOff', "Turn Auto Scrolling Off"); } } From 1042d28f97c64383814855cda361929220e3987f Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 8 Jul 2019 12:29:38 +0200 Subject: [PATCH 1193/1449] Revert "clipboard variable resolver works with string, not clipboard service, #76847" This reverts commit 7b463651d94956880c06639e8e2b44204af1d86c. --- .../editor/contrib/snippet/snippetSession.ts | 2 +- .../contrib/snippet/snippetVariables.ts | 12 ++-- .../snippet/test/snippetVariables.test.ts | 61 +++++++++++++++---- 3 files changed, 58 insertions(+), 17 deletions(-) diff --git a/src/vs/editor/contrib/snippet/snippetSession.ts b/src/vs/editor/contrib/snippet/snippetSession.ts index c916380c368..3d3502b0fd3 100644 --- a/src/vs/editor/contrib/snippet/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/snippetSession.ts @@ -439,7 +439,7 @@ export class SnippetSession { snippet.resolveVariables(new CompositeSnippetVariableResolver([ modelBasedVariableResolver, - new ClipboardBasedVariableResolver(clipboardService && clipboardService.readText(), idx, indexedSelections.length), + new ClipboardBasedVariableResolver(clipboardService, idx, indexedSelections.length), new SelectionBasedVariableResolver(model, selection), new CommentBasedVariableResolver(model), new TimeBasedVariableResolver, diff --git a/src/vs/editor/contrib/snippet/snippetVariables.ts b/src/vs/editor/contrib/snippet/snippetVariables.ts index c640692d1cb..876a5f8be65 100644 --- a/src/vs/editor/contrib/snippet/snippetVariables.ts +++ b/src/vs/editor/contrib/snippet/snippetVariables.ts @@ -10,6 +10,7 @@ import { Selection } from 'vs/editor/common/core/selection'; import { VariableResolver, Variable, Text } from 'vs/editor/contrib/snippet/snippetParser'; import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; import { getLeadingWhitespace, commonPrefixLength, isFalsyOrWhitespace, pad, endsWith } from 'vs/base/common/strings'; +import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { isSingleFolderWorkspaceIdentifier, toWorkspaceIdentifier, WORKSPACE_EXTENSION } from 'vs/platform/workspaces/common/workspaces'; @@ -161,7 +162,7 @@ export class ModelBasedVariableResolver implements VariableResolver { export class ClipboardBasedVariableResolver implements VariableResolver { constructor( - private readonly _clipboardText: string | undefined, + private readonly _clipboardService: IClipboardService, private readonly _selectionIdx: number, private readonly _selectionCount: number ) { @@ -169,19 +170,20 @@ export class ClipboardBasedVariableResolver implements VariableResolver { } resolve(variable: Variable): string | undefined { - if (variable.name !== 'CLIPBOARD') { + if (variable.name !== 'CLIPBOARD' || !this._clipboardService) { return undefined; } - if (!this._clipboardText) { + const text = this._clipboardService.readText(); + if (!text) { return undefined; } - const lines = this._clipboardText.split(/\r\n|\n|\r/).filter(s => !isFalsyOrWhitespace(s)); + const lines = text.split(/\r\n|\n|\r/).filter(s => !isFalsyOrWhitespace(s)); if (lines.length === this._selectionCount) { return lines[this._selectionIdx]; } else { - return this._clipboardText; + return text; } } } diff --git a/src/vs/editor/contrib/snippet/test/snippetVariables.test.ts b/src/vs/editor/contrib/snippet/test/snippetVariables.test.ts index 64ad2bd985f..0b44a9c6a68 100644 --- a/src/vs/editor/contrib/snippet/test/snippetVariables.test.ts +++ b/src/vs/editor/contrib/snippet/test/snippetVariables.test.ts @@ -9,6 +9,7 @@ import { Selection } from 'vs/editor/common/core/selection'; import { SelectionBasedVariableResolver, CompositeSnippetVariableResolver, ModelBasedVariableResolver, ClipboardBasedVariableResolver, TimeBasedVariableResolver, WorkspaceBasedVariableResolver } from 'vs/editor/contrib/snippet/snippetVariables'; import { SnippetParser, Variable, VariableResolver } from 'vs/editor/contrib/snippet/snippetParser'; import { TextModel } from 'vs/editor/common/model/textModel'; +import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { Workspace, toWorkspaceFolders, IWorkspace, IWorkspaceContextService, toWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; suite('Snippet Variables Resolver', function () { @@ -208,25 +209,63 @@ suite('Snippet Variables Resolver', function () { test('Add variable to insert value from clipboard to a snippet #40153', function () { - assertVariableResolve(new ClipboardBasedVariableResolver(undefined, 1, 0), 'CLIPBOARD', undefined); + let readTextResult: string | null | undefined; + const clipboardService = new class implements IClipboardService { + _serviceBrand: any; + readText(): any { return readTextResult; } + _throw = () => { throw new Error(); }; + writeText = this._throw; + readFindText = this._throw; + writeFindText = this._throw; + writeResources = this._throw; + readResources = this._throw; + hasResources = this._throw; + }; + let resolver = new ClipboardBasedVariableResolver(clipboardService, 1, 0); - assertVariableResolve(new ClipboardBasedVariableResolver(null!, 1, 0), 'CLIPBOARD', undefined); + readTextResult = undefined; + assertVariableResolve(resolver, 'CLIPBOARD', undefined); - assertVariableResolve(new ClipboardBasedVariableResolver('', 1, 0), 'CLIPBOARD', undefined); + readTextResult = null; + assertVariableResolve(resolver, 'CLIPBOARD', undefined); - assertVariableResolve(new ClipboardBasedVariableResolver('foo', 1, 0), 'CLIPBOARD', 'foo'); + readTextResult = ''; + assertVariableResolve(resolver, 'CLIPBOARD', undefined); - assertVariableResolve(new ClipboardBasedVariableResolver('foo', 1, 0), 'foo', undefined); - assertVariableResolve(new ClipboardBasedVariableResolver('foo', 1, 0), 'cLIPBOARD', undefined); + readTextResult = 'foo'; + assertVariableResolve(resolver, 'CLIPBOARD', 'foo'); + + assertVariableResolve(resolver, 'foo', undefined); + assertVariableResolve(resolver, 'cLIPBOARD', undefined); }); test('Add variable to insert value from clipboard to a snippet #40153', function () { - assertVariableResolve(new ClipboardBasedVariableResolver('line1', 1, 2), 'CLIPBOARD', 'line1'); - assertVariableResolve(new ClipboardBasedVariableResolver('line1\nline2\nline3', 1, 2), 'CLIPBOARD', 'line1\nline2\nline3'); + let readTextResult: string; + let resolver: VariableResolver; + const clipboardService = new class implements IClipboardService { + _serviceBrand: any; + readText(): string { return readTextResult; } + _throw = () => { throw new Error(); }; + writeText = this._throw; + readFindText = this._throw; + writeFindText = this._throw; + writeResources = this._throw; + readResources = this._throw; + hasResources = this._throw; + }; - assertVariableResolve(new ClipboardBasedVariableResolver('line1\nline2', 1, 2), 'CLIPBOARD', 'line2'); - assertVariableResolve(new ClipboardBasedVariableResolver('line1\nline2', 0, 2), 'CLIPBOARD', 'line1'); + resolver = new ClipboardBasedVariableResolver(clipboardService, 1, 2); + readTextResult = 'line1'; + assertVariableResolve(resolver, 'CLIPBOARD', 'line1'); + readTextResult = 'line1\nline2\nline3'; + assertVariableResolve(resolver, 'CLIPBOARD', 'line1\nline2\nline3'); + + readTextResult = 'line1\nline2'; + assertVariableResolve(resolver, 'CLIPBOARD', 'line2'); + readTextResult = 'line1\nline2'; + resolver = new ClipboardBasedVariableResolver(clipboardService, 0, 2); + assertVariableResolve(resolver, 'CLIPBOARD', 'line1'); }); @@ -297,4 +336,4 @@ suite('Snippet Variables Resolver', function () { workspace = new Workspace('', toWorkspaceFolders([{ path: 'folderName' }], workspaceConfigPath), workspaceConfigPath); assertVariableResolve(resolver, 'WORKSPACE_NAME', 'testWorkspace'); }); -}); +}); \ No newline at end of file From aa386074838f3d35e01110818544583e6c9d3e44 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Sun, 7 Jul 2019 22:27:00 +0200 Subject: [PATCH 1194/1449] incremental text documents cause perf isssues --- extensions/css-language-features/server/src/cssServerMain.ts | 2 +- extensions/html-language-features/server/src/htmlServerMain.ts | 2 +- extensions/json-language-features/server/src/jsonServerMain.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/css-language-features/server/src/cssServerMain.ts b/extensions/css-language-features/server/src/cssServerMain.ts index 3eee352d7f2..e9d25e7547f 100644 --- a/extensions/css-language-features/server/src/cssServerMain.ts +++ b/extensions/css-language-features/server/src/cssServerMain.ts @@ -33,7 +33,7 @@ process.on('unhandledRejection', (e: any) => { }); // Create a text document manager. -const documents: TextDocuments = new TextDocuments(TextDocumentSyncKind.Incremental); +const documents: TextDocuments = new TextDocuments(); // Make the text document manager listen on the connection // for open, change and close text document events documents.listen(connection); diff --git a/extensions/html-language-features/server/src/htmlServerMain.ts b/extensions/html-language-features/server/src/htmlServerMain.ts index 46bd6e8d090..e3bfdebdab6 100644 --- a/extensions/html-language-features/server/src/htmlServerMain.ts +++ b/extensions/html-language-features/server/src/htmlServerMain.ts @@ -39,7 +39,7 @@ process.on('uncaughtException', (e: any) => { }); // Create a text document manager. -const documents: TextDocuments = new TextDocuments(TextDocumentSyncKind.Incremental); +const documents: TextDocuments = new TextDocuments(); // Make the text document manager listen on the connection // for open, change and close text document events documents.listen(connection); diff --git a/extensions/json-language-features/server/src/jsonServerMain.ts b/extensions/json-language-features/server/src/jsonServerMain.ts index bd1d3544163..6a099d46f21 100644 --- a/extensions/json-language-features/server/src/jsonServerMain.ts +++ b/extensions/json-language-features/server/src/jsonServerMain.ts @@ -106,7 +106,7 @@ let languageService = getLanguageService({ }); // Create a text document manager. -const documents: TextDocuments = new TextDocuments(TextDocumentSyncKind.Incremental); +const documents: TextDocuments = new TextDocuments(); // Make the text document manager listen on the connection // for open, change and close text document events From 4ed70122f8e96a016fb45edebbe9db4a61a7deb5 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Sun, 7 Jul 2019 22:44:04 +0200 Subject: [PATCH 1195/1449] remove imports --- extensions/css-language-features/server/src/cssServerMain.ts | 2 +- extensions/html-language-features/server/src/htmlServerMain.ts | 2 +- extensions/json-language-features/server/src/jsonServerMain.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/css-language-features/server/src/cssServerMain.ts b/extensions/css-language-features/server/src/cssServerMain.ts index e9d25e7547f..cf539df1e1d 100644 --- a/extensions/css-language-features/server/src/cssServerMain.ts +++ b/extensions/css-language-features/server/src/cssServerMain.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { - createConnection, IConnection, TextDocuments, InitializeParams, InitializeResult, ServerCapabilities, ConfigurationRequest, WorkspaceFolder, TextDocumentSyncKind + createConnection, IConnection, TextDocuments, InitializeParams, InitializeResult, ServerCapabilities, ConfigurationRequest, WorkspaceFolder } from 'vscode-languageserver'; import URI from 'vscode-uri'; import { TextDocument, CompletionList, Position } from 'vscode-languageserver-types'; diff --git a/extensions/html-language-features/server/src/htmlServerMain.ts b/extensions/html-language-features/server/src/htmlServerMain.ts index e3bfdebdab6..e3e62991aca 100644 --- a/extensions/html-language-features/server/src/htmlServerMain.ts +++ b/extensions/html-language-features/server/src/htmlServerMain.ts @@ -7,7 +7,7 @@ import { createConnection, IConnection, TextDocuments, InitializeParams, InitializeResult, RequestType, DocumentRangeFormattingRequest, Disposable, DocumentSelector, TextDocumentPositionParams, ServerCapabilities, Position, ConfigurationRequest, ConfigurationParams, DidChangeWorkspaceFoldersNotification, - WorkspaceFolder, DocumentColorRequest, ColorInformation, ColorPresentationRequest, TextDocumentSyncKind + WorkspaceFolder, DocumentColorRequest, ColorInformation, ColorPresentationRequest } from 'vscode-languageserver'; import { TextDocument, Diagnostic, DocumentLink, SymbolInformation } from 'vscode-languageserver-types'; import { getLanguageModes, LanguageModes, Settings } from './modes/languageModes'; diff --git a/extensions/json-language-features/server/src/jsonServerMain.ts b/extensions/json-language-features/server/src/jsonServerMain.ts index 6a099d46f21..b3d5ab47b8f 100644 --- a/extensions/json-language-features/server/src/jsonServerMain.ts +++ b/extensions/json-language-features/server/src/jsonServerMain.ts @@ -6,7 +6,7 @@ import { createConnection, IConnection, TextDocuments, TextDocument, InitializeParams, InitializeResult, NotificationType, RequestType, - DocumentRangeFormattingRequest, Disposable, ServerCapabilities, Diagnostic, TextDocumentSyncKind + DocumentRangeFormattingRequest, Disposable, ServerCapabilities, Diagnostic } from 'vscode-languageserver'; import { xhr, XHRResponse, configure as configureHttpRequests, getErrorStatusDescription } from 'request-light'; From 17cd9fb72636dba3534b1893b9e973061c016d42 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 8 Jul 2019 12:46:15 +0200 Subject: [PATCH 1196/1449] fix #76840 --- .../editor/contrib/snippet/snippetSession.ts | 3 +- .../contrib/snippet/snippetVariables.ts | 21 +++++++----- .../snippet/test/snippetVariables.test.ts | 32 +++++++++++++++++-- 3 files changed, 45 insertions(+), 11 deletions(-) diff --git a/src/vs/editor/contrib/snippet/snippetSession.ts b/src/vs/editor/contrib/snippet/snippetSession.ts index 3d3502b0fd3..9b9cfe2faff 100644 --- a/src/vs/editor/contrib/snippet/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/snippetSession.ts @@ -22,6 +22,7 @@ import { ClipboardBasedVariableResolver, CompositeSnippetVariableResolver, Model import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import * as colors from 'vs/platform/theme/common/colorRegistry'; import { withNullAsUndefined } from 'vs/base/common/types'; +import { ILabelService } from 'vs/platform/label/common/label'; registerThemingParticipant((theme, collector) => { @@ -384,9 +385,9 @@ export class SnippetSession { } const model = editor.getModel(); - const modelBasedVariableResolver = new ModelBasedVariableResolver(model); const clipboardService = editor.invokeWithinContext(accessor => accessor.get(IClipboardService, optional)); const workspaceService = editor.invokeWithinContext(accessor => accessor.get(IWorkspaceContextService, optional)); + const modelBasedVariableResolver = editor.invokeWithinContext(accessor => new ModelBasedVariableResolver(accessor.get(ILabelService, optional), model)); let delta = 0; diff --git a/src/vs/editor/contrib/snippet/snippetVariables.ts b/src/vs/editor/contrib/snippet/snippetVariables.ts index 876a5f8be65..6f472b5e094 100644 --- a/src/vs/editor/contrib/snippet/snippetVariables.ts +++ b/src/vs/editor/contrib/snippet/snippetVariables.ts @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import * as nls from 'vs/nls'; -import { basename, dirname } from 'vs/base/common/path'; +import * as path from 'vs/base/common/path'; +import { dirname } from 'vs/base/common/resources'; import { ITextModel } from 'vs/editor/common/model'; import { Selection } from 'vs/editor/common/core/selection'; import { VariableResolver, Variable, Text } from 'vs/editor/contrib/snippet/snippetParser'; @@ -13,6 +14,7 @@ import { getLeadingWhitespace, commonPrefixLength, isFalsyOrWhitespace, pad, end import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { isSingleFolderWorkspaceIdentifier, toWorkspaceIdentifier, WORKSPACE_EXTENSION } from 'vs/platform/workspaces/common/workspaces'; +import { ILabelService } from 'vs/platform/label/common/label'; export const KnownSnippetVariableNames: { [key: string]: true } = Object.freeze({ 'CURRENT_YEAR': true, @@ -126,6 +128,7 @@ export class SelectionBasedVariableResolver implements VariableResolver { export class ModelBasedVariableResolver implements VariableResolver { constructor( + private readonly _labelService: ILabelService, private readonly _model: ITextModel ) { // @@ -136,10 +139,10 @@ export class ModelBasedVariableResolver implements VariableResolver { const { name } = variable; if (name === 'TM_FILENAME') { - return basename(this._model.uri.fsPath); + return path.basename(this._model.uri.fsPath); } else if (name === 'TM_FILENAME_BASE') { - const name = basename(this._model.uri.fsPath); + const name = path.basename(this._model.uri.fsPath); const idx = name.lastIndexOf('.'); if (idx <= 0) { return name; @@ -148,11 +151,13 @@ export class ModelBasedVariableResolver implements VariableResolver { } } else if (name === 'TM_DIRECTORY') { - const dir = dirname(this._model.uri.fsPath); - return dir !== '.' ? dir : ''; + if (path.dirname(this._model.uri.fsPath) === '.') { + return ''; + } + return this._labelService.getUriLabel(dirname(this._model.uri)); } else if (name === 'TM_FILEPATH') { - return this._model.uri.fsPath; + return this._labelService.getUriLabel(this._model.uri); } return undefined; @@ -266,10 +271,10 @@ export class WorkspaceBasedVariableResolver implements VariableResolver { } if (isSingleFolderWorkspaceIdentifier(workspaceIdentifier)) { - return basename(workspaceIdentifier.path); + return path.basename(workspaceIdentifier.path); } - let filename = basename(workspaceIdentifier.configPath.path); + let filename = path.basename(workspaceIdentifier.configPath.path); if (endsWith(filename, WORKSPACE_EXTENSION)) { filename = filename.substr(0, filename.length - WORKSPACE_EXTENSION.length - 1); } diff --git a/src/vs/editor/contrib/snippet/test/snippetVariables.test.ts b/src/vs/editor/contrib/snippet/test/snippetVariables.test.ts index 0b44a9c6a68..266d4ccd6f2 100644 --- a/src/vs/editor/contrib/snippet/test/snippetVariables.test.ts +++ b/src/vs/editor/contrib/snippet/test/snippetVariables.test.ts @@ -11,9 +11,17 @@ import { SnippetParser, Variable, VariableResolver } from 'vs/editor/contrib/sni import { TextModel } from 'vs/editor/common/model/textModel'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { Workspace, toWorkspaceFolders, IWorkspace, IWorkspaceContextService, toWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; +import { ILabelService } from 'vs/platform/label/common/label'; +import { mock } from 'vs/editor/contrib/suggest/test/suggestModel.test'; suite('Snippet Variables Resolver', function () { + const labelService = new class extends mock() { + getUriLabel(uri: URI) { + return uri.fsPath; + } + }; + let model: TextModel; let resolver: VariableResolver; @@ -25,7 +33,7 @@ suite('Snippet Variables Resolver', function () { ].join('\n'), undefined, undefined, URI.parse('file:///foo/files/text.txt')); resolver = new CompositeSnippetVariableResolver([ - new ModelBasedVariableResolver(model), + new ModelBasedVariableResolver(labelService, model), new SelectionBasedVariableResolver(model, new Selection(1, 1, 1, 1)), ]); }); @@ -59,6 +67,7 @@ suite('Snippet Variables Resolver', function () { } resolver = new ModelBasedVariableResolver( + labelService, TextModel.createFromString('', undefined, undefined, URI.parse('http://www.pb.o/abc/def/ghi')) ); assertVariableResolve(resolver, 'TM_FILENAME', 'ghi'); @@ -68,6 +77,7 @@ suite('Snippet Variables Resolver', function () { } resolver = new ModelBasedVariableResolver( + labelService, TextModel.createFromString('', undefined, undefined, URI.parse('mem:fff.ts')) ); assertVariableResolve(resolver, 'TM_DIRECTORY', ''); @@ -75,6 +85,21 @@ suite('Snippet Variables Resolver', function () { }); + test('Path delimiters in code snippet variables aren\'t specific to remote OS #76840', function () { + + const labelService = new class extends mock() { + getUriLabel(uri: URI) { + return uri.fsPath.replace(/\/|\\/g, '|'); + } + }; + + const model = TextModel.createFromString([].join('\n'), undefined, undefined, URI.parse('foo:///foo/files/text.txt')); + + const resolver = new CompositeSnippetVariableResolver([new ModelBasedVariableResolver(labelService, model)]); + + assertVariableResolve(resolver, 'TM_FILEPATH', '|foo|files|text.txt'); + }); + test('editor variables, selection', function () { resolver = new SelectionBasedVariableResolver(model, new Selection(1, 2, 2, 3)); @@ -119,16 +144,19 @@ suite('Snippet Variables Resolver', function () { assertVariableResolve(resolver, 'TM_FILENAME_BASE', 'text'); resolver = new ModelBasedVariableResolver( + labelService, TextModel.createFromString('', undefined, undefined, URI.parse('http://www.pb.o/abc/def/ghi')) ); assertVariableResolve(resolver, 'TM_FILENAME_BASE', 'ghi'); resolver = new ModelBasedVariableResolver( + labelService, TextModel.createFromString('', undefined, undefined, URI.parse('mem:.git')) ); assertVariableResolve(resolver, 'TM_FILENAME_BASE', '.git'); resolver = new ModelBasedVariableResolver( + labelService, TextModel.createFromString('', undefined, undefined, URI.parse('mem:foo.')) ); assertVariableResolve(resolver, 'TM_FILENAME_BASE', 'foo'); @@ -336,4 +364,4 @@ suite('Snippet Variables Resolver', function () { workspace = new Workspace('', toWorkspaceFolders([{ path: 'folderName' }], workspaceConfigPath), workspaceConfigPath); assertVariableResolve(resolver, 'WORKSPACE_NAME', 'testWorkspace'); }); -}); \ No newline at end of file +}); From b29fec000b96d7912d56499a496284156c9aa891 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 8 Jul 2019 12:51:24 +0200 Subject: [PATCH 1197/1449] fix add after dispose issues --- src/vs/editor/contrib/snippet/snippetController2.ts | 2 +- src/vs/editor/contrib/suggest/suggestController.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/snippet/snippetController2.ts b/src/vs/editor/contrib/snippet/snippetController2.ts index 75e8ad4ff86..a09aa96db74 100644 --- a/src/vs/editor/contrib/snippet/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/snippetController2.ts @@ -208,7 +208,7 @@ export class SnippetController2 implements IEditorContribution { this._inSnippet.reset(); this._hasPrevTabstop.reset(); this._hasNextTabstop.reset(); - dispose(this._snippetListener); + this._snippetListener.clear(); dispose(this._session); this._session = undefined; this._modelVersionId = -1; diff --git a/src/vs/editor/contrib/suggest/suggestController.ts b/src/vs/editor/contrib/suggest/suggestController.ts index 600cfc52273..aac58cf801d 100644 --- a/src/vs/editor/contrib/suggest/suggestController.ts +++ b/src/vs/editor/contrib/suggest/suggestController.ts @@ -149,6 +149,7 @@ export class SuggestController implements IEditorContribution { } dispose(): void { + this._alternatives.dispose(); this._toDispose.dispose(); this._widget.dispose(); this._model.dispose(); From d56c4846c22a6f9ff61fcb650523bc51957e8c28 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 8 Jul 2019 13:39:24 +0200 Subject: [PATCH 1198/1449] fix #76715 --- .../electron-browser/extensionTipsService.ts | 65 ++++++++++--------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionTipsService.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionTipsService.ts index efa09426215..06c18df0750 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionTipsService.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionTipsService.ts @@ -596,8 +596,39 @@ export class ExtensionTipsService extends Disposable implements IExtensionTipsSe // re-schedule this bit of the operation to be off the critical path - in case glob-match is slow setImmediate(async () => { + + let recommendationsToSuggest: string[] = []; + const now = Date.now(); + forEach(this._availableRecommendations, entry => { + let { key: pattern, value: ids } = entry; + if (match(pattern, model.uri.path)) { + for (let id of ids) { + if (caseInsensitiveGet(product.extensionImportantTips, id)) { + recommendationsToSuggest.push(id); + } + const filedBasedRecommendation = this._fileBasedRecommendations[id.toLowerCase()] || { recommendedTime: now, sources: [] }; + filedBasedRecommendation.recommendedTime = now; + if (!filedBasedRecommendation.sources.some(s => s instanceof URI && s.toString() === model.uri.toString())) { + filedBasedRecommendation.sources.push(model.uri); + } + this._fileBasedRecommendations[id.toLowerCase()] = filedBasedRecommendation; + } + } + }); + + this.storageService.store( + 'extensionsAssistant/recommendations', + JSON.stringify(Object.keys(this._fileBasedRecommendations).reduce((result, key) => { result[key] = this._fileBasedRecommendations[key].recommendedTime; return result; }, {})), + StorageScope.GLOBAL + ); + + const config = this.configurationService.getValue(ConfigurationKey); + if (config.ignoreRecommendations || config.showRecommendationsOnlyOnDemand) { + return; + } + const installed = await this.extensionManagementService.getInstalled(ExtensionType.User); - if (await this.promptRecommendedExtensionForFileType(model, installed)) { + if (await this.promptRecommendedExtensionForFileType(recommendationsToSuggest, installed)) { return; } @@ -618,37 +649,7 @@ export class ExtensionTipsService extends Disposable implements IExtensionTipsSe }); } - private async promptRecommendedExtensionForFileType(model: ITextModel, installed: ILocalExtension[]): Promise { - let recommendationsToSuggest: string[] = []; - const now = Date.now(); - forEach(this._availableRecommendations, entry => { - let { key: pattern, value: ids } = entry; - if (match(pattern, model.uri.path)) { - for (let id of ids) { - if (caseInsensitiveGet(product.extensionImportantTips, id)) { - recommendationsToSuggest.push(id); - } - const filedBasedRecommendation = this._fileBasedRecommendations[id.toLowerCase()] || { recommendedTime: now, sources: [] }; - filedBasedRecommendation.recommendedTime = now; - if (!filedBasedRecommendation.sources.some(s => s instanceof URI && s.toString() === model.uri.toString())) { - filedBasedRecommendation.sources.push(model.uri); - } - this._fileBasedRecommendations[id.toLowerCase()] = filedBasedRecommendation; - } - } - }); - - this.storageService.store( - 'extensionsAssistant/recommendations', - JSON.stringify(Object.keys(this._fileBasedRecommendations).reduce((result, key) => { result[key] = this._fileBasedRecommendations[key].recommendedTime; return result; }, {})), - StorageScope.GLOBAL - ); - - const config = this.configurationService.getValue(ConfigurationKey); - if (config.ignoreRecommendations || config.showRecommendationsOnlyOnDemand) { - return false; - } - + private async promptRecommendedExtensionForFileType(recommendationsToSuggest: string[], installed: ILocalExtension[]): Promise { const importantRecommendationsIgnoreList = JSON.parse(this.storageService.get('extensionsAssistant/importantRecommendationsIgnore', StorageScope.GLOBAL, '[]')); const installedExtensionsIds = installed.reduce((result, i) => { result.add(i.identifier.id.toLowerCase()); return result; }, new Set()); recommendationsToSuggest = recommendationsToSuggest.filter(id => { From 64031a2360b00b67dd9b09755ea741f17113e8ba Mon Sep 17 00:00:00 2001 From: Brett Cannon <54418+brettcannon@users.noreply.github.com> Date: Mon, 8 Jul 2019 06:18:35 -0700 Subject: [PATCH 1199/1449] Remove snakemake files from being classified as Python files (#76625) They are not actually syntactically valid Python source. Fixes #76624 --- extensions/python/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/python/package.json b/extensions/python/package.json index 1553bad3191..645cba2bae3 100644 --- a/extensions/python/package.json +++ b/extensions/python/package.json @@ -11,7 +11,7 @@ "contributes": { "languages": [{ "id": "python", - "extensions": [ ".py", ".rpy", ".pyw", ".cpy", ".gyp", ".gypi", ".snakefile", ".smk", ".pyi", ".ipy"], + "extensions": [ ".py", ".rpy", ".pyw", ".cpy", ".gyp", ".gypi", ".pyi", ".ipy"], "aliases": [ "Python", "py" ], "filenames": [ "Snakefile" ], "firstLine": "^#!\\s*/.*\\bpython[0-9.-]*\\b", From 8200277bb1a7d8d6dd91d62eb0bdec674deba8d3 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Mon, 8 Jul 2019 16:07:31 +0200 Subject: [PATCH 1200/1449] Update C++ grammar to get * fix There is a known bug for macros, but it is better to get the * fix and pick up the macro fix as soon as it is made. --- extensions/cpp/cgmanifest.json | 2 +- extensions/cpp/syntaxes/c.tmLanguage.json | 116 +- extensions/cpp/syntaxes/cpp.tmLanguage.json | 10613 ++++++++++++---- .../test/colorize-results/test-23630_cpp.json | 22 +- .../test/colorize-results/test-23850_cpp.json | 20 +- .../cpp/test/colorize-results/test_cc.json | 360 +- .../cpp/test/colorize-results/test_cpp.json | 351 +- 7 files changed, 8657 insertions(+), 2827 deletions(-) diff --git a/extensions/cpp/cgmanifest.json b/extensions/cpp/cgmanifest.json index b6a12aa3af2..113cea950f6 100644 --- a/extensions/cpp/cgmanifest.json +++ b/extensions/cpp/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "jeff-hykin/cpp-textmate-grammar", "repositoryUrl": "https://github.com/jeff-hykin/cpp-textmate-grammar", - "commitHash": "59f0673f04d6e5c8a4d1b3ccc5235ed8a4ccb6c0" + "commitHash": "cb9cb59b32d0cb9e2cbbca1a9cdb62769fc2ca8e" } }, "license": "MIT", diff --git a/extensions/cpp/syntaxes/c.tmLanguage.json b/extensions/cpp/syntaxes/c.tmLanguage.json index 679f53c04c0..91be1a66bdf 100644 --- a/extensions/cpp/syntaxes/c.tmLanguage.json +++ b/extensions/cpp/syntaxes/c.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/jeff-hykin/cpp-textmate-grammar/commit/9c4f4b3291538d9f5144f02d3b6af877b84f2cb2", + "version": "https://github.com/jeff-hykin/cpp-textmate-grammar/commit/1a24b4aa383169919f0d92cf2735ac35a3e7db3c", "name": "C", "scopeName": "source.c", "patterns": [ @@ -374,16 +374,41 @@ "repository": { "default_statement": { "name": "meta.conditional.case.c", - "begin": "((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\()", "beginCaptures": { "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.c punctuation.definition.comment.begin.c" + }, + "3": { + "name": "comment.block.c" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.c punctuation.definition.comment.end.c" + }, + { + "match": "\\*", + "name": "comment.block.c" + } + ] + }, + "5": { "name": "punctuation.section.parens.begin.bracket.round.conditional.switch.c" } }, @@ -580,7 +680,7 @@ "begin": "(,)\\s*(?=(?:L|u8|u|U\\s*\\\")?)", "beginCaptures": { "1": { - "name": "comma.c punctuation.separator.delimiter.c" + "name": "punctuation.separator.delimiter.comma.c" } }, "end": "(?=\\))", diff --git a/extensions/cpp/syntaxes/cpp.tmLanguage.json b/extensions/cpp/syntaxes/cpp.tmLanguage.json index 9c0ca7e8464..e43d8d45b61 100644 --- a/extensions/cpp/syntaxes/cpp.tmLanguage.json +++ b/extensions/cpp/syntaxes/cpp.tmLanguage.json @@ -4,19 +4,93 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/jeff-hykin/cpp-textmate-grammar/commit/59f0673f04d6e5c8a4d1b3ccc5235ed8a4ccb6c0", + "version": "https://github.com/jeff-hykin/cpp-textmate-grammar/commit/cb9cb59b32d0cb9e2cbbca1a9cdb62769fc2ca8e", "name": "C++", "scopeName": "source.cpp", "patterns": [ { - "name": "source.cpp", - "begin": "(?=^|\\A|\\G)", - "end": "not(?<=possible)", - "patterns": [ - { - "include": "#initial_context" - } - ] + "include": "#ever_present_context" + }, + { + "include": "#constructor_root" + }, + { + "include": "#destructor_root" + }, + { + "include": "#function_definition" + }, + { + "include": "#operator_overload" + }, + { + "include": "#using_namespace" + }, + { + "include": "#type_alias" + }, + { + "include": "#using_name" + }, + { + "include": "#namespace_alias" + }, + { + "include": "#namespace_block" + }, + { + "include": "#extern_block" + }, + { + "include": "#typedef_class" + }, + { + "include": "#typedef_struct" + }, + { + "include": "#typedef_union" + }, + { + "include": "#typedef_keyword" + }, + { + "include": "#standard_declares" + }, + { + "include": "#class_block" + }, + { + "include": "#struct_block" + }, + { + "include": "#union_block" + }, + { + "include": "#enum_block" + }, + { + "include": "#template_isolated_definition" + }, + { + "include": "#template_definition" + }, + { + "include": "#access_control_keywords" + }, + { + "include": "#block" + }, + { + "include": "#static_assert" + }, + { + "include": "#assembly" + }, + { + "include": "#function_pointer" + }, + { + "include": "#evaluation_context" } ], "repository": { @@ -49,7 +123,7 @@ }, "comma": { "match": ",", - "name": "comma.cpp punctuation.separator.delimiter.cpp" + "name": "punctuation.separator.delimiter.comma.cpp" }, "assignment_operator": { "match": "\\=", @@ -224,6 +298,9 @@ { "include": "#language_constants" }, + { + "include": "#builtin_storage_type_initilizer" + }, { "include": "#qualifiers_and_specifiers_post_parameters" }, @@ -711,12 +788,70 @@ "name": "constant.language.$0.cpp" }, "primitive_types": { - "match": "(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(((?:private|protected|public))\\s*(:))", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "5": { + "name": "storage.type.modifier.access.control.$6.cpp" + }, + "7": { + "name": "punctuation.separator.colon.access.control.cpp" + } + } + }, + "exception_keywords": { + "match": "((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:(delete)\\s*(\\[\\])|(delete))|(new))(?!\\w))", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "5": { + "name": "keyword.operator.wordlike.cpp" + }, + "6": { + "name": "keyword.operator.delete.array.cpp" + }, + "7": { + "name": "keyword.operator.delete.array.bracket.cpp" + }, + "8": { + "name": "keyword.operator.delete.cpp" + }, + "9": { "name": "keyword.operator.new.cpp" } - }, - "name": "keyword.operator.wordlike.cpp" + } }, "control_flow_keywords": { - "match": "(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)", @@ -988,16 +1438,41 @@ }, "default_statement": { "name": "meta.conditional.case.cpp", - "begin": "((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\()", "beginCaptures": { "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "5": { "name": "punctuation.section.parens.begin.bracket.round.conditional.switch.cpp" } }, @@ -1057,12 +1582,37 @@ }, "switch_statement": { "name": "meta.block.switch.cpp", - "begin": "(((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?]*|[^>]*+<[^>]*+>)++>\\s*", @@ -1486,12 +2036,37 @@ } }, "template_definition_argument": { - "match": "(?:(?:\\s*((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)|((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s+)+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*))|((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*(\\.\\.\\.)\\s*((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*))\\s*(?:(,)|(?=>|$))", + "match": "((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)|((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s+)+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*))|((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*(\\.\\.\\.)\\s*((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*))\\s*(?:(,)|(?=>|$))", "captures": { "1": { - "name": "storage.type.template.argument.$1.cpp" + "patterns": [ + { + "include": "#inline_comment" + } + ] }, "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "5": { + "name": "storage.type.template.argument.$5.cpp" + }, + "6": { "patterns": [ { "match": "(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*", @@ -1499,20 +2074,20 @@ } ] }, - "3": { + "7": { "name": "entity.name.type.template.cpp" }, - "4": { + "8": { "name": "storage.type.template.cpp" }, - "5": { + "9": { "name": "ellipses.cpp punctuation.vararg-ellipses.template.definition.cpp" }, - "6": { + "10": { "name": "entity.name.type.template.cpp" }, - "7": { - "name": "comma.cpp punctuation.separator.template.argument.cpp" + "11": { + "name": "punctuation.separator.delimiter.comma.template.argument.cpp" } } }, @@ -2047,8 +2622,252 @@ } } }, + "simple_type": { + "match": "(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))(((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))?(?:(?:\\&|\\*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:\\&|\\*))?", + "captures": { + "1": { + "name": "meta.qualified_type.cpp", + "patterns": [ + { + "match": "(?:class|struct|union|enum)", + "name": "storage.type.$0.cpp" + }, + { + "include": "#attributes_context" + }, + { + "include": "#function_type" + }, + { + "include": "#storage_types" + }, + { + "include": "#number_literal" + }, + { + "include": "#string_context_c" + }, + { + "include": "#comma" + }, + { + "include": "#scope_resolution_inner_generated" + }, + { + "include": "#template_call_range" + }, + { + "match": "(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*", + "name": "entity.name.type.cpp" + } + ] + }, + "2": { + "patterns": [ + { + "include": "#attributes_context" + }, + { + "include": "#number_literal" + } + ] + }, + "3": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "4": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "5": { + "name": "comment.block.cpp" + }, + "6": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "7": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "8": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "9": { + "name": "comment.block.cpp" + }, + "10": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "12": { + "patterns": [ + { + "include": "#scope_resolution_inner_generated" + } + ] + }, + "13": { + "name": "entity.name.scope-resolution.cpp" + }, + "14": { + "name": "meta.template.call.cpp", + "patterns": [ + { + "include": "#template_call_range" + } + ] + }, + "15": { + "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.cpp" + }, + "16": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "17": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "18": { + "name": "comment.block.cpp" + }, + "19": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "20": { + "name": "entity.name.type.cpp" + }, + "21": { + "patterns": [ + { + "match": "\\*", + "name": "storage.modifier.pointer.cpp" + }, + { + "match": "(?:\\&((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){2,}\\&", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "name": "invalid.illegal.reference-type.cpp" + }, + { + "match": "\\&", + "name": "storage.modifier.reference.cpp" + } + ] + }, + "22": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "23": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "24": { + "name": "comment.block.cpp" + }, + "25": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "26": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "27": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "28": { + "name": "comment.block.cpp" + }, + "29": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + } + }, "type_alias": { - "match": "(using)\\s*(?!namespace)(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))\\s*(\\=)\\s*((?:typename)?)\\s*((?:(?:(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))|(.*(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)(?:(\\[)(\\w*)(\\])\\s*)?\\s*(?:(;)|\\n)", + "match": "(using)\\s*(?!namespace)(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))\\s*(\\=)\\s*((?:typename)?)\\s*((?:(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))|(.*(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))?(?:(?:\\&|\\*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:\\&|\\*))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?(?:(\\[)(\\w*)(\\])\\s*)?\\s*(?:(;)|\\n)", "captures": { "1": { "name": "keyword.other.using.directive.cpp" @@ -2366,6 +3185,49 @@ } ] }, + "46": { + "patterns": [ + { + "match": "\\*", + "name": "storage.modifier.pointer.cpp" + }, + { + "match": "(?:\\&((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){2,}\\&", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "name": "invalid.illegal.reference-type.cpp" + }, + { + "match": "\\&", + "name": "storage.modifier.reference.cpp" + } + ] + }, "47": { "patterns": [ { @@ -2392,107 +3254,76 @@ ] }, "51": { - "name": "storage.modifier.pointer.cpp" - }, - "52": { "patterns": [ { "include": "#inline_comment" } ] }, - "53": { + "52": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "54": { + "53": { "name": "comment.block.cpp" }, + "54": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, "55": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "56": { - "name": "storage.modifier.reference.cpp" + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "57": { - "patterns": [ - { - "include": "#inline_comment" - } - ] + "name": "comment.block.cpp" }, "58": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] }, "59": { - "name": "comment.block.cpp" - }, - "60": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "61": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "62": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "63": { - "name": "comment.block.cpp" - }, - "64": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "65": { "name": "punctuation.definition.begin.bracket.square.cpp" }, - "66": { + "60": { "patterns": [ { "include": "#evaluation_context" } ] }, - "67": { + "61": { "name": "punctuation.definition.end.bracket.square.cpp" }, - "68": { + "62": { "name": "punctuation.terminator.statement.cpp" } }, "name": "meta.declaration.type.alias.cpp" }, "typename": { - "match": "((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))", + "match": "(((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))", "captures": { "1": { "name": "storage.modifier.cpp" @@ -2523,6 +3354,31 @@ ] }, "6": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "7": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "8": { + "name": "comment.block.cpp" + }, + "9": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "10": { "name": "meta.qualified_type.cpp", "patterns": [ { @@ -2559,7 +3415,7 @@ } ] }, - "7": { + "11": { "patterns": [ { "include": "#attributes_context" @@ -2569,31 +3425,6 @@ } ] }, - "8": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "9": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "10": { - "name": "comment.block.cpp" - }, - "11": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, "12": { "patterns": [ { @@ -2619,41 +3450,20 @@ } ] }, - "17": { - "patterns": [ - { - "include": "#scope_resolution_inner_generated" - } - ] - }, - "18": { - "name": "entity.name.scope-resolution.cpp" - }, - "19": { - "name": "meta.template.call.cpp", - "patterns": [ - { - "include": "#template_call_range" - } - ] - }, - "20": { - "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.cpp" - }, - "21": { + "16": { "patterns": [ { "include": "#inline_comment" } ] }, - "22": { + "17": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "23": { + "18": { "name": "comment.block.cpp" }, - "24": { + "19": { "patterns": [ { "match": "\\*\\/", @@ -2665,7 +3475,53 @@ } ] }, + "21": { + "patterns": [ + { + "include": "#scope_resolution_inner_generated" + } + ] + }, + "22": { + "name": "entity.name.scope-resolution.cpp" + }, + "23": { + "name": "meta.template.call.cpp", + "patterns": [ + { + "include": "#template_call_range" + } + ] + }, + "24": { + "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.cpp" + }, "25": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "26": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "27": { + "name": "comment.block.cpp" + }, + "28": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "29": { "name": "entity.name.type.cpp" } } @@ -3692,11 +4548,528 @@ }, "function_definition": { "name": "meta.function.definition.cpp", - "begin": "(\\s*+(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))((?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)\\s*+((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\())", + "begin": "((?:(?:^|\\G|(?<=;|\\}))|(?<=>))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?(?:((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))(((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))?(?:(?:\\&|\\*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:\\&|\\*))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\())", "beginCaptures": { "1": { "name": "meta.head.function.definition.cpp" }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "name": "storage.type.template.cpp" + }, + "7": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "8": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "9": { + "name": "comment.block.cpp" + }, + "10": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "11": { + "name": "storage.modifier.$11.cpp" + }, + "12": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "13": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "14": { + "name": "comment.block.cpp" + }, + "15": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "16": { + "name": "meta.qualified_type.cpp", + "patterns": [ + { + "match": "(?:class|struct|union|enum)", + "name": "storage.type.$0.cpp" + }, + { + "include": "#attributes_context" + }, + { + "include": "#function_type" + }, + { + "include": "#storage_types" + }, + { + "include": "#number_literal" + }, + { + "include": "#string_context_c" + }, + { + "include": "#comma" + }, + { + "include": "#scope_resolution_inner_generated" + }, + { + "include": "#template_call_range" + }, + { + "match": "(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*", + "name": "entity.name.type.cpp" + } + ] + }, + "17": { + "patterns": [ + { + "include": "#attributes_context" + }, + { + "include": "#number_literal" + } + ] + }, + "18": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "19": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "20": { + "name": "comment.block.cpp" + }, + "21": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "22": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "23": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "24": { + "name": "comment.block.cpp" + }, + "25": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "27": { + "patterns": [ + { + "include": "#scope_resolution_inner_generated" + } + ] + }, + "28": { + "name": "entity.name.scope-resolution.cpp" + }, + "29": { + "name": "meta.template.call.cpp", + "patterns": [ + { + "include": "#template_call_range" + } + ] + }, + "30": { + "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.cpp" + }, + "31": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "32": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "33": { + "name": "comment.block.cpp" + }, + "34": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "35": { + "name": "entity.name.type.cpp" + }, + "36": { + "patterns": [ + { + "match": "\\*", + "name": "storage.modifier.pointer.cpp" + }, + { + "match": "(?:\\&((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){2,}\\&", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "name": "invalid.illegal.reference-type.cpp" + }, + { + "match": "\\&", + "name": "storage.modifier.reference.cpp" + } + ] + }, + "37": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "38": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "39": { + "name": "comment.block.cpp" + }, + "40": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "41": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "42": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "43": { + "name": "comment.block.cpp" + }, + "44": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "45": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "46": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "47": { + "name": "comment.block.cpp" + }, + "48": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "49": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "50": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "51": { + "name": "comment.block.cpp" + }, + "52": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "53": { + "name": "storage.type.modifier.calling-convention.cpp" + }, + "54": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "55": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "56": { + "name": "comment.block.cpp" + }, + "57": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "58": { + "patterns": [ + { + "include": "#scope_resolution_function_definition_inner_generated" + } + ] + }, + "59": { + "name": "entity.name.function.definition.cpp" + }, + "60": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "61": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "62": { + "name": "comment.block.cpp" + }, + "63": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "end": "(?:(?<=\\}|%>|\\?\\?>)|(?=[;>\\[\\]=]))", + "patterns": [ + { + "name": "meta.head.function.definition.cpp", + "begin": "\\G ?", + "end": "((?:\\{|<%|\\?\\?<|(?=;)))", + "endCaptures": { + "1": { + "name": "punctuation.section.block.begin.bracket.curly.function.definition.cpp" + } + }, + "patterns": [ + { + "include": "#ever_present_context" + }, + { + "contentName": "meta.function.definition.parameters.cpp", + "begin": "(\\()", + "beginCaptures": { + "1": { + "name": "punctuation.section.parameters.begin.bracket.round.cpp" + } + }, + "end": "(\\))", + "endCaptures": { + "1": { + "name": "punctuation.section.parameters.end.bracket.round.cpp" + } + }, + "patterns": [ + { + "include": "#ever_present_context" + }, + { + "include": "#parameter_or_maybe_value" + }, + { + "include": "#comma" + }, + { + "include": "#evaluation_context" + } + ] + }, + { + "include": "$base" + } + ] + }, + { + "name": "meta.body.function.definition.cpp", + "begin": "(?<=\\{|<%|\\?\\?<)", + "end": "(\\}|%>|\\?\\?>)", + "endCaptures": { + "1": { + "name": "punctuation.section.block.end.bracket.curly.function.definition.cpp" + } + }, + "patterns": [ + { + "include": "#function_body_context" + } + ] + }, + { + "name": "meta.tail.function.definition.cpp", + "begin": "(?<=\\}|%>|\\?\\?>)[\\s\\n]*", + "end": "[\\s\\n]*(?=;)", + "patterns": [ + { + "include": "$base" + } + ] + } + ] + }, + "operator_overload": { + "name": "meta.function.definition.special.operator-overload.cpp", + "begin": "((?:(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))(((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))?(?:(?:\\&|\\*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:\\&|\\*))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*)(operator)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*)(?:(?:((?:\\+\\+|\\-\\-|\\(\\)|\\[\\]|\\->|\\+\\+|\\-\\-|\\+|\\-|!|~|\\*|&|new|new\\[\\]|delete|delete\\[\\]|\\->\\*|\\*|\\/|%|\\+|\\-|<<|>>|<=>|<|<=|>|>=|==|!=|&|\\^|\\||&&|\\|\\||=|\\+=|\\-=|\\*=|\\/=|%=|<<=|>>=|&=|\\^=|\\|=|,))|((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))?(?:(?:\\&|\\*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:\\&|\\*))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\[\\])?)))|(\"\")((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\<|\\())", + "beginCaptures": { + "1": { + "name": "meta.head.function.definition.special.operator-overload.cpp" + }, "2": { "name": "meta.qualified_type.cpp", "patterns": [ @@ -3843,6 +5216,49 @@ "21": { "name": "entity.name.type.cpp" }, + "22": { + "patterns": [ + { + "match": "\\*", + "name": "storage.modifier.pointer.cpp" + }, + { + "match": "(?:\\&((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){2,}\\&", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "name": "invalid.illegal.reference-type.cpp" + }, + { + "match": "\\&", + "name": "storage.modifier.reference.cpp" + } + ] + }, "23": { "patterns": [ { @@ -3869,50 +5285,44 @@ ] }, "27": { - "name": "storage.modifier.pointer.cpp" - }, - "28": { "patterns": [ { "include": "#inline_comment" } ] }, - "29": { + "28": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "30": { + "29": { "name": "comment.block.cpp" }, + "30": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, "31": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "32": { - "name": "storage.modifier.reference.cpp" - }, - "33": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "34": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "35": { + "33": { "name": "comment.block.cpp" }, - "36": { + "34": { "patterns": [ { "match": "\\*\\/", @@ -3924,48 +5334,48 @@ } ] }, - "37": { + "35": { "patterns": [ { "include": "#inline_comment" } ] }, - "38": { + "36": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "39": { + "37": { "name": "comment.block.cpp" }, + "38": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "39": { + "name": "storage.type.modifier.calling-convention.cpp" + }, "40": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "41": { - "name": "storage.type.modifier.calling-convention.cpp" - }, - "42": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "43": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "44": { + "42": { "name": "comment.block.cpp" }, - "45": { + "43": { "patterns": [ { "match": "\\*\\/", @@ -3977,30 +5387,261 @@ } ] }, - "46": { - "patterns": [ - { - "include": "#scope_resolution_function_definition_inner_generated" - } - ] - }, - "47": { - "name": "entity.name.function.definition.cpp" - }, - "48": { + "44": { "patterns": [ { "include": "#inline_comment" } ] }, - "49": { + "45": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "50": { + "46": { "name": "comment.block.cpp" }, + "47": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "48": { + "patterns": [ + { + "match": "::", + "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.operator.cpp" + }, + { + "match": "(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){2,}\\&", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "name": "invalid.illegal.reference-type.cpp" + }, + { + "match": "\\&", + "name": "entity.name.operator.type.reference.cpp" + } + ] + }, + "58": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "59": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "60": { + "name": "comment.block.cpp" + }, + "61": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "62": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "63": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "64": { + "name": "comment.block.cpp" + }, + "65": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "66": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "67": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "68": { + "name": "comment.block.cpp" + }, + "69": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "70": { + "name": "entity.name.operator.type.array.cpp" + }, + "71": { + "name": "entity.name.operator.custom-literal.cpp" + }, + "72": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "73": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "74": { + "name": "comment.block.cpp" + }, + "75": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "76": { + "name": "entity.name.operator.custom-literal.cpp" + }, + "77": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "78": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "79": { + "name": "comment.block.cpp" + }, + "80": { "patterns": [ { "match": "\\*\\/", @@ -4016,12 +5657,12 @@ "end": "(?:(?<=\\}|%>|\\?\\?>)|(?=[;>\\[\\]=]))", "patterns": [ { - "name": "meta.head.function.definition.cpp", + "name": "meta.head.function.definition.special.operator-overload.cpp", "begin": "\\G ?", "end": "((?:\\{|<%|\\?\\?<|(?=;)))", "endCaptures": { "1": { - "name": "punctuation.section.block.begin.bracket.curly.function.definition.cpp" + "name": "punctuation.section.block.begin.bracket.curly.function.definition.special.operator-overload.cpp" } }, "patterns": [ @@ -4029,115 +5670,25 @@ "include": "#ever_present_context" }, { - "contentName": "meta.function.definition.parameters.cpp", + "include": "#template_call_range" + }, + { + "contentName": "meta.function.definition.parameters.special.operator-overload.cpp", "begin": "(\\()", "beginCaptures": { "1": { - "name": "punctuation.section.parameters.begin.bracket.round.cpp" + "name": "punctuation.section.parameters.begin.bracket.round.special.operator-overload.cpp" } }, "end": "(\\))", "endCaptures": { "1": { - "name": "punctuation.section.parameters.end.bracket.round.cpp" + "name": "punctuation.section.parameters.end.bracket.round.special.operator-overload.cpp" } }, "patterns": [ { - "include": "#ever_present_context" - }, - { - "include": "#memory_operators" - }, - { - "begin": "((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\()", - "beginCaptures": { - "1": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "2": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "3": { - "name": "comment.block.cpp" - }, - "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "5": { - "name": "storage.type.primitive.cpp storage.type.built-in.primitive.cpp" - }, - "6": { - "name": "storage.type.cpp storage.type.built-in.cpp" - }, - "7": { - "name": "support.type.posix-reserved.pthread.cpp support.type.built-in.posix-reserved.pthread.cpp" - }, - "8": { - "name": "support.type.posix-reserved.cpp support.type.built-in.posix-reserved.cpp" - }, - "9": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "10": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "11": { - "name": "comment.block.cpp" - }, - "12": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "13": { - "name": "punctuation.section.arguments.begin.bracket.round.initializer.cpp" - } - }, - "end": "(\\))", - "endCaptures": { - "1": { - "name": "punctuation.section.arguments.end.bracket.round.initializer.cpp" - } - }, - "patterns": [ - { - "include": "#evaluation_context" - } - ] - }, - { - "include": "#curly_initializer" - }, - { - "include": "#parameter_or_maybe_value" - }, - { - "include": "#comma" + "include": "#function_parameter_context" }, { "include": "#evaluation_context" @@ -4145,17 +5696,17 @@ ] }, { - "include": "#initial_context" + "include": "$base" } ] }, { - "name": "meta.body.function.definition.cpp", + "name": "meta.body.function.definition.special.operator-overload.cpp", "begin": "(?<=\\{|<%|\\?\\?<)", "end": "(\\}|%>|\\?\\?>)", "endCaptures": { "1": { - "name": "punctuation.section.block.end.bracket.curly.function.definition.cpp" + "name": "punctuation.section.block.end.bracket.curly.function.definition.special.operator-overload.cpp" } }, "patterns": [ @@ -4165,17 +5716,169 @@ ] }, { - "name": "meta.tail.function.definition.cpp", + "name": "meta.tail.function.definition.special.operator-overload.cpp", "begin": "(?<=\\}|%>|\\?\\?>)[\\s\\n]*", "end": "[\\s\\n]*(?=;)", "patterns": [ { - "include": "#initial_context" + "include": "$base" } ] } ] }, + "static_assert": { + "begin": "((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\()", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "5": { + "name": "keyword.other.static_assert.cpp" + }, + "6": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "7": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "8": { + "name": "comment.block.cpp" + }, + "9": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "10": { + "name": "punctuation.section.arguments.begin.bracket.round.static_assert.cpp" + } + }, + "end": "(\\))", + "endCaptures": { + "1": { + "name": "punctuation.section.arguments.end.bracket.round.static_assert.cpp" + } + }, + "patterns": [ + { + "name": "meta.static_assert.message.cpp", + "begin": "(,)\\s*(?=(?:L|u8|u|U\\s*\\\")?)", + "beginCaptures": { + "1": { + "name": "punctuation.separator.delimiter.comma.cpp" + } + }, + "end": "(?=\\))", + "patterns": [ + { + "include": "#string_context" + }, + { + "include": "#string_context_c" + } + ] + }, + { + "include": "#evaluation_context" + } + ] + }, + "function_call": { + "begin": "((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?]*|[^>]*+<[^>]*+>)++>\\s*)?(\\()", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#scope_resolution_function_call_inner_generated" + } + ] + }, + "2": { + "name": "entity.name.function.call.cpp" + }, + "3": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "4": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "5": { + "name": "comment.block.cpp" + }, + "6": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "7": { + "name": "meta.template.call.cpp", + "patterns": [ + { + "include": "#template_call_range" + } + ] + }, + "8": { + "name": "punctuation.section.arguments.begin.bracket.round.function.call.cpp" + } + }, + "end": "(\\))", + "endCaptures": { + "1": { + "name": "punctuation.section.arguments.end.bracket.round.function.call.cpp" + } + }, + "patterns": [ + { + "include": "#evaluation_context" + } + ] + }, "curly_initializer": { "name": "meta.initialization.cpp", "begin": "(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\{)", @@ -4370,99 +6073,48 @@ } ] }, - "operator_overload": { - "name": "meta.function.definition.special.operator-overload.cpp", - "begin": "((?:(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))((?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?))?\\s*+((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*)(operator)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*)(?:(?:((?:\\+\\+|\\-\\-|\\(\\)|\\[\\]|\\->|\\+\\+|\\-\\-|\\+|\\-|!|~|\\*|&|new|new\\[\\]|delete|delete\\[\\]|\\->\\*|\\*|\\/|%|\\+|\\-|<<|>>|<=>|<|<=|>|>=|==|!=|&|\\^|\\||&&|\\|\\||=|\\+=|\\-=|\\*=|\\/=|%=|<<=|>>=|&=|\\^=|\\|=|,))|((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\[\\])?)))|(\"\")((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\<|\\())", + "builtin_storage_type_initilizer": { + "begin": "((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\()", "beginCaptures": { "1": { - "name": "meta.head.function.definition.special.operator-overload.cpp" + "patterns": [ + { + "include": "#inline_comment" + } + ] }, "2": { - "name": "meta.qualified_type.cpp", - "patterns": [ - { - "match": "(?:class|struct|union|enum)", - "name": "storage.type.$0.cpp" - }, - { - "include": "#attributes_context" - }, - { - "include": "#function_type" - }, - { - "include": "#storage_types" - }, - { - "include": "#number_literal" - }, - { - "include": "#string_context_c" - }, - { - "include": "#comma" - }, - { - "include": "#scope_resolution_inner_generated" - }, - { - "include": "#template_call_range" - }, - { - "match": "(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*", - "name": "entity.name.type.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "3": { - "patterns": [ - { - "include": "#attributes_context" - }, - { - "include": "#number_literal" - } - ] + "name": "comment.block.cpp" }, "4": { "patterns": [ { - "include": "#inline_comment" + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" } ] }, "5": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "6": { - "name": "comment.block.cpp" - }, - "7": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "8": { "patterns": [ { "include": "#inline_comment" } ] }, - "9": { + "6": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "10": { + "7": { "name": "comment.block.cpp" }, - "11": { + "8": { "patterns": [ { "match": "\\*\\/", @@ -4474,686 +6126,126 @@ } ] }, + "9": { + "name": "storage.type.primitive.cpp storage.type.built-in.primitive.cpp" + }, + "10": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "11": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "12": { + "name": "comment.block.cpp" + }, "13": { "patterns": [ { - "include": "#scope_resolution_inner_generated" + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" } ] }, "14": { - "name": "entity.name.scope-resolution.cpp" + "name": "storage.type.cpp storage.type.built-in.cpp" }, "15": { - "name": "meta.template.call.cpp", "patterns": [ { - "include": "#template_call_range" + "include": "#inline_comment" } ] }, "16": { - "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.cpp" + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "17": { + "name": "comment.block.cpp" + }, + "18": { "patterns": [ { - "include": "#inline_comment" + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" } ] }, - "18": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, "19": { - "name": "comment.block.cpp" + "name": "support.type.posix-reserved.pthread.cpp support.type.built-in.posix-reserved.pthread.cpp" }, "20": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "21": { - "name": "entity.name.type.cpp" + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "22": { + "name": "comment.block.cpp" }, "23": { "patterns": [ { - "include": "#inline_comment" + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" } ] }, "24": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + "name": "support.type.posix-reserved.cpp support.type.built-in.posix-reserved.cpp" }, "25": { - "name": "comment.block.cpp" - }, - "26": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, + "26": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, "27": { - "name": "storage.modifier.pointer.cpp" + "name": "comment.block.cpp" }, "28": { "patterns": [ { - "include": "#inline_comment" + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" } ] }, "29": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "30": { - "name": "comment.block.cpp" - }, - "31": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "32": { - "name": "storage.modifier.reference.cpp" - }, - "33": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "34": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "35": { - "name": "comment.block.cpp" - }, - "36": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "37": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "38": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "39": { - "name": "comment.block.cpp" - }, - "40": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "41": { - "name": "storage.type.modifier.calling-convention.cpp" - }, - "42": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "43": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "44": { - "name": "comment.block.cpp" - }, - "45": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "46": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "47": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "48": { - "name": "comment.block.cpp" - }, - "49": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "50": { - "patterns": [ - { - "match": "::", - "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.operator.cpp" - }, - { - "match": "(?|\\?\\?>)|(?=[;>\\[\\]=]))", - "patterns": [ - { - "name": "meta.head.function.definition.special.operator-overload.cpp", - "begin": "\\G ?", - "end": "((?:\\{|<%|\\?\\?<|(?=;)))", - "endCaptures": { - "1": { - "name": "punctuation.section.block.begin.bracket.curly.function.definition.special.operator-overload.cpp" - } - }, - "patterns": [ - { - "include": "#ever_present_context" - }, - { - "include": "#template_call_range" - }, - { - "contentName": "meta.function.definition.parameters.special.operator-overload.cpp", - "begin": "(\\()", - "beginCaptures": { - "1": { - "name": "punctuation.section.parameters.begin.bracket.round.special.operator-overload.cpp" - } - }, - "end": "(\\))", - "endCaptures": { - "1": { - "name": "punctuation.section.parameters.end.bracket.round.special.operator-overload.cpp" - } - }, - "patterns": [ - { - "include": "#function_parameter_context" - }, - { - "include": "#evaluation_context" - } - ] - }, - { - "include": "#initial_context" - } - ] - }, - { - "name": "meta.body.function.definition.special.operator-overload.cpp", - "begin": "(?<=\\{|<%|\\?\\?<)", - "end": "(\\}|%>|\\?\\?>)", - "endCaptures": { - "1": { - "name": "punctuation.section.block.end.bracket.curly.function.definition.special.operator-overload.cpp" - } - }, - "patterns": [ - { - "include": "#function_body_context" - } - ] - }, - { - "name": "meta.tail.function.definition.special.operator-overload.cpp", - "begin": "(?<=\\}|%>|\\?\\?>)[\\s\\n]*", - "end": "[\\s\\n]*(?=;)", - "patterns": [ - { - "include": "#initial_context" - } - ] - } - ] - }, - "static_assert": { - "begin": "((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\()", - "beginCaptures": { - "1": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "2": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "3": { - "name": "comment.block.cpp" - }, - "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "5": { - "name": "keyword.other.static_assert.cpp" - }, - "6": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "7": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "8": { - "name": "comment.block.cpp" - }, - "9": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "10": { - "name": "punctuation.section.arguments.begin.bracket.round.static_assert.cpp" + "name": "punctuation.section.arguments.begin.bracket.round.initializer.cpp" } }, "end": "(\\))", "endCaptures": { "1": { - "name": "punctuation.section.arguments.end.bracket.round.static_assert.cpp" - } - }, - "patterns": [ - { - "name": "meta.static_assert.message.cpp", - "begin": "(,)\\s*(?=(?:L|u8|u|U\\s*\\\")?)", - "beginCaptures": { - "1": { - "name": "comma.cpp punctuation.separator.delimiter.cpp" - } - }, - "end": "(?=\\))", - "patterns": [ - { - "include": "#string_context" - }, - { - "include": "#string_context_c" - } - ] - }, - { - "include": "#evaluation_context" - } - ] - }, - "function_call": { - "begin": "((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?]*|[^>]*+<[^>]*+>)++>\\s*)?(\\()", - "beginCaptures": { - "1": { - "patterns": [ - { - "include": "#scope_resolution_function_call_inner_generated" - } - ] - }, - "2": { - "name": "entity.name.function.call.cpp" - }, - "3": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "4": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "5": { - "name": "comment.block.cpp" - }, - "6": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "7": { - "name": "meta.template.call.cpp", - "patterns": [ - { - "include": "#template_call_range" - } - ] - }, - "8": { - "name": "punctuation.section.arguments.begin.bracket.round.function.call.cpp" - } - }, - "end": "(\\))", - "endCaptures": { - "1": { - "name": "punctuation.section.arguments.end.bracket.round.function.call.cpp" + "name": "punctuation.section.arguments.end.bracket.round.initializer.cpp" } }, "patterns": [ @@ -5164,7 +6256,7 @@ }, "constructor_inline": { "name": "meta.function.definition.special.constructor.cpp", - "begin": "(^((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:((?:inline|constexpr|mutable|friend|explicit|virtual))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*\\s*+((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:inline|constexpr|mutable|friend|explicit|virtual)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*)(((?>(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))::((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\9((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\()))", + "begin": "(\\s*+((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*)(((?>(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))::((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\13((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\()))", "beginCaptures": { "1": { "name": "meta.head.function.definition.special.constructor.cpp" }, "2": { - "name": "storage.type.modifier.calling-convention.cpp" - }, - "3": { "patterns": [ { "include": "#inline_comment" } ] }, - "4": { + "3": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "5": { + "4": { "name": "comment.block.cpp" }, - "6": { + "5": { "patterns": [ { "match": "\\*\\/", @@ -5462,7 +6583,35 @@ } ] }, + "6": { + "name": "storage.type.modifier.calling-convention.cpp" + }, "7": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "8": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "9": { + "name": "comment.block.cpp" + }, + "10": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "11": { "patterns": [ { "match": "::", @@ -5477,7 +6626,7 @@ } ] }, - "8": { + "12": { "patterns": [ { "match": "(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*(?=:)", @@ -5493,31 +6642,6 @@ } ] }, - "10": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "11": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "12": { - "name": "comment.block.cpp" - }, - "13": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, "14": { "patterns": [ { @@ -5567,6 +6691,31 @@ "name": "comment.block.cpp" } ] + }, + "22": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "23": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "24": { + "name": "comment.block.cpp" + }, + "25": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] } }, "end": "(?:(?<=\\}|%>|\\?\\?>)|(?=[;>\\[\\]=]))", @@ -5627,6 +6776,9 @@ } ] }, + { + "include": "#functional_specifiers_pre_parameters" + }, { "begin": "(:)", "beginCaptures": { @@ -5711,7 +6863,7 @@ ] }, { - "include": "#initial_context" + "include": "$base" } ] }, @@ -5736,7 +6888,7 @@ "end": "[\\s\\n]*(?=;)", "patterns": [ { - "include": "#initial_context" + "include": "$base" } ] } @@ -5744,7 +6896,7 @@ }, "destructor_inline": { "name": "meta.function.definition.special.member.destructor.cpp", - "begin": "(^((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\s*+((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:((?:inline|constexpr|mutable|friend|explicit|virtual))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(~(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:inline|constexpr|mutable|friend|explicit|virtual)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*)(~(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*)(((?>(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))::((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))~\\9((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\()))", + "begin": "(((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*)(((?>(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))::((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))~\\13((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\()))", "beginCaptures": { "1": { "name": "meta.head.function.definition.special.member.destructor.cpp" }, "2": { - "name": "storage.type.modifier.calling-convention.cpp" - }, - "3": { "patterns": [ { "include": "#inline_comment" } ] }, - "4": { + "3": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "5": { + "4": { "name": "comment.block.cpp" }, - "6": { + "5": { "patterns": [ { "match": "\\*\\/", @@ -5974,7 +7152,35 @@ } ] }, + "6": { + "name": "storage.type.modifier.calling-convention.cpp" + }, "7": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "8": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "9": { + "name": "comment.block.cpp" + }, + "10": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "11": { "patterns": [ { "match": "::", @@ -5989,7 +7195,7 @@ } ] }, - "8": { + "12": { "patterns": [ { "match": "(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*(?=:)", @@ -6005,31 +7211,6 @@ } ] }, - "10": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "11": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "12": { - "name": "comment.block.cpp" - }, - "13": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, "14": { "patterns": [ { @@ -6079,6 +7260,31 @@ "name": "comment.block.cpp" } ] + }, + "22": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "23": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "24": { + "name": "comment.block.cpp" + }, + "25": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] } }, "end": "(?:(?<=\\}|%>|\\?\\?>)|(?=[;>\\[\\]=]))", @@ -6155,7 +7361,7 @@ } }, { - "include": "#initial_context" + "include": "$base" } ] }, @@ -6180,7 +7386,7 @@ "end": "[\\s\\n]*(?=;)", "patterns": [ { - "include": "#initial_context" + "include": "$base" } ] } @@ -6212,7 +7418,7 @@ "name": "keyword.operator.increment.cpp" }, { - "match": "%=|\\+=|-=|\\*=|(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))((?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)(\\()(\\*)\\s*((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)?)\\s*(?:(\\[)(\\w*)(\\])\\s*)*(\\))\\s*(\\()", + "begin": "(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))(((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))?(?:(?:\\&|\\*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:\\&|\\*))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\()(\\*)\\s*((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)?)\\s*(?:(\\[)(\\w*)(\\])\\s*)*(\\))\\s*(\\()", "beginCaptures": { "1": { "name": "meta.qualified_type.cpp", @@ -6741,6 +7950,49 @@ "20": { "name": "entity.name.type.cpp" }, + "21": { + "patterns": [ + { + "match": "\\*", + "name": "storage.modifier.pointer.cpp" + }, + { + "match": "(?:\\&((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){2,}\\&", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "name": "invalid.illegal.reference-type.cpp" + }, + { + "match": "\\&", + "name": "storage.modifier.reference.cpp" + } + ] + }, "22": { "patterns": [ { @@ -6767,112 +8019,81 @@ ] }, "26": { - "name": "storage.modifier.pointer.cpp" - }, - "27": { "patterns": [ { "include": "#inline_comment" } ] }, - "28": { + "27": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "29": { + "28": { "name": "comment.block.cpp" }, + "29": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, "30": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "31": { - "name": "storage.modifier.reference.cpp" + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "32": { - "patterns": [ - { - "include": "#inline_comment" - } - ] + "name": "comment.block.cpp" }, "33": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] }, "34": { - "name": "comment.block.cpp" - }, - "35": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "36": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "37": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "38": { - "name": "comment.block.cpp" - }, - "39": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "40": { "name": "punctuation.section.parens.begin.bracket.round.function.pointer.cpp" }, - "41": { + "35": { "name": "punctuation.definition.function.pointer.dereference.cpp" }, - "42": { + "36": { "name": "variable.other.definition.pointer.function.cpp" }, - "43": { + "37": { "name": "punctuation.definition.begin.bracket.square.cpp" }, - "44": { + "38": { "patterns": [ { "include": "#evaluation_context" } ] }, - "45": { + "39": { "name": "punctuation.definition.end.bracket.square.cpp" }, - "46": { + "40": { "name": "punctuation.section.parens.end.bracket.round.function.pointer.cpp" }, - "47": { + "41": { "name": "punctuation.section.parameters.begin.bracket.round.function.pointer.cpp" } }, @@ -6914,7 +8135,7 @@ ] }, "function_pointer_parameter": { - "begin": "(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))((?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)(\\()(\\*)\\s*((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)?)\\s*(?:(\\[)(\\w*)(\\])\\s*)*(\\))\\s*(\\()", + "begin": "(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))(((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))?(?:(?:\\&|\\*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:\\&|\\*))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\()(\\*)\\s*((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)?)\\s*(?:(\\[)(\\w*)(\\])\\s*)*(\\))\\s*(\\()", "beginCaptures": { "1": { "name": "meta.qualified_type.cpp", @@ -7062,6 +8283,49 @@ "20": { "name": "entity.name.type.cpp" }, + "21": { + "patterns": [ + { + "match": "\\*", + "name": "storage.modifier.pointer.cpp" + }, + { + "match": "(?:\\&((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){2,}\\&", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "name": "invalid.illegal.reference-type.cpp" + }, + { + "match": "\\&", + "name": "storage.modifier.reference.cpp" + } + ] + }, "22": { "patterns": [ { @@ -7088,112 +8352,81 @@ ] }, "26": { - "name": "storage.modifier.pointer.cpp" - }, - "27": { "patterns": [ { "include": "#inline_comment" } ] }, - "28": { + "27": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "29": { + "28": { "name": "comment.block.cpp" }, + "29": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, "30": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "31": { - "name": "storage.modifier.reference.cpp" + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "32": { - "patterns": [ - { - "include": "#inline_comment" - } - ] + "name": "comment.block.cpp" }, "33": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] }, "34": { - "name": "comment.block.cpp" - }, - "35": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "36": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "37": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "38": { - "name": "comment.block.cpp" - }, - "39": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "40": { "name": "punctuation.section.parens.begin.bracket.round.function.pointer.cpp" }, - "41": { + "35": { "name": "punctuation.definition.function.pointer.dereference.cpp" }, - "42": { + "36": { "name": "variable.parameter.pointer.function.cpp" }, - "43": { + "37": { "name": "punctuation.definition.begin.bracket.square.cpp" }, - "44": { + "38": { "patterns": [ { "include": "#evaluation_context" } ] }, - "45": { + "39": { "name": "punctuation.definition.end.bracket.square.cpp" }, - "46": { + "40": { "name": "punctuation.section.parens.end.bracket.round.function.pointer.cpp" }, - "47": { + "41": { "name": "punctuation.section.parameters.begin.bracket.round.function.pointer.cpp" } }, @@ -7267,10 +8500,22 @@ "end": "(?:(?=\\))|(,))", "endCaptures": { "1": { - "name": "comma.cpp punctuation.separator.delimiter.cpp" + "name": "punctuation.separator.delimiter.comma.cpp" } }, "patterns": [ + { + "include": "#ever_present_context" + }, + { + "include": "#memory_operators" + }, + { + "include": "#builtin_storage_type_initilizer" + }, + { + "include": "#curly_initializer" + }, { "include": "#function_pointer_parameter" }, @@ -7281,7 +8526,7 @@ "include": "#vararg_ellipses" }, { - "match": "((?:((?:const|static|volatile|register|restrict|extern))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))|((?:short|signed|unsigned|long))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\w))+)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=,|\\)|=)", + "match": "((?:((?:const|static|volatile|register|restrict|extern))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))+)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=,|\\)|=)", "captures": { "1": { "patterns": [ @@ -7319,47 +8564,69 @@ ] }, "7": { - "name": "storage.modifier.specifier.parameter.cpp" - }, - "8": { "patterns": [ { "include": "#inline_comment" } ] }, - "9": { + "8": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "10": { + "9": { "name": "comment.block.cpp" }, + "10": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, "11": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "12": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "13": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "14": { + "13": { "name": "comment.block.cpp" }, + "14": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, "15": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "16": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "17": { + "name": "comment.block.cpp" + }, + "18": { "patterns": [ { "match": "\\*\\/", @@ -7371,20 +8638,23 @@ } ] }, - "16": { + "19": { + "name": "storage.type.primitive.cpp storage.type.built-in.primitive.cpp" + }, + "20": { "patterns": [ { "include": "#inline_comment" } ] }, - "17": { + "21": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "18": { + "22": { "name": "comment.block.cpp" }, - "19": { + "23": { "patterns": [ { "match": "\\*\\/", @@ -7396,20 +8666,8 @@ } ] }, - "20": { - "name": "storage.type.primitive.cpp storage.type.built-in.primitive.cpp" - }, - "21": { - "name": "storage.type.cpp storage.type.built-in.cpp" - }, - "22": { - "name": "support.type.posix-reserved.pthread.cpp support.type.built-in.posix-reserved.pthread.cpp" - }, - "23": { - "name": "support.type.posix-reserved.cpp support.type.built-in.posix-reserved.cpp" - }, "24": { - "name": "entity.name.type.parameter.cpp" + "name": "storage.type.cpp storage.type.built-in.cpp" }, "25": { "patterns": [ @@ -7435,6 +8693,65 @@ "name": "comment.block.cpp" } ] + }, + "29": { + "name": "support.type.posix-reserved.pthread.cpp support.type.built-in.posix-reserved.pthread.cpp" + }, + "30": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "31": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "32": { + "name": "comment.block.cpp" + }, + "33": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "34": { + "name": "support.type.posix-reserved.cpp support.type.built-in.posix-reserved.cpp" + }, + "35": { + "name": "entity.name.type.parameter.cpp" + }, + "36": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "37": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "38": { + "name": "comment.block.cpp" + }, + "39": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] } } }, @@ -7456,7 +8773,7 @@ "end": "(?:(?=\\))|(,))", "endCaptures": { "1": { - "name": "comma.cpp punctuation.separator.delimiter.cpp" + "name": "punctuation.separator.delimiter.comma.cpp" } }, "patterns": [ @@ -7466,10 +8783,7 @@ ] }, { - "include": "#assignment_operator" - }, - { - "match": "(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\)|,|\\[|=)", + "match": "(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\)|,|\\[|=|\\n)", "captures": { "1": { "patterns": [ @@ -7557,8 +8871,51 @@ "include": "#template_call_range" }, { - "match": "((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})", + "match": "((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))?(?:(?:\\&|\\*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:\\&|\\*)", "captures": { + "0": { + "patterns": [ + { + "match": "\\*", + "name": "storage.modifier.pointer.cpp" + }, + { + "match": "(?:\\&((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){2,}\\&", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "name": "invalid.illegal.reference-type.cpp" + }, + { + "match": "\\&", + "name": "storage.modifier.reference.cpp" + } + ] + }, "1": { "patterns": [ { @@ -7585,50 +8942,19 @@ ] }, "5": { - "name": "storage.modifier.pointer.cpp" + "patterns": [ + { + "include": "#inline_comment" + } + ] }, "6": { - "patterns": [ - { - "include": "#inline_comment" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "7": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + "name": "comment.block.cpp" }, "8": { - "name": "comment.block.cpp" - }, - "9": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "10": { - "name": "storage.modifier.reference.cpp" - }, - "11": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "12": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "13": { - "name": "comment.block.cpp" - }, - "14": { "patterns": [ { "match": "\\*\\/", @@ -7641,6 +8967,9 @@ ] } } + }, + { + "include": "#evaluation_context" } ] }, @@ -7677,10 +9006,13 @@ "end": "(?:(?=\\))|(,))", "endCaptures": { "1": { - "name": "comma.cpp punctuation.separator.delimiter.cpp" + "name": "punctuation.separator.delimiter.comma.cpp" } }, "patterns": [ + { + "include": "#ever_present_context" + }, { "include": "#function_pointer_parameter" }, @@ -7691,7 +9023,7 @@ "include": "#vararg_ellipses" }, { - "match": "((?:((?:const|static|volatile|register|restrict|extern))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))|((?:short|signed|unsigned|long))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\w))+)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=,|\\)|=)", + "match": "((?:((?:const|static|volatile|register|restrict|extern))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))+)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=,|\\)|=)", "captures": { "1": { "patterns": [ @@ -7729,47 +9061,69 @@ ] }, "7": { - "name": "storage.modifier.specifier.parameter.cpp" - }, - "8": { "patterns": [ { "include": "#inline_comment" } ] }, - "9": { + "8": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "10": { + "9": { "name": "comment.block.cpp" }, + "10": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, "11": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "12": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "13": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "14": { + "13": { "name": "comment.block.cpp" }, + "14": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, "15": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "16": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "17": { + "name": "comment.block.cpp" + }, + "18": { "patterns": [ { "match": "\\*\\/", @@ -7781,20 +9135,23 @@ } ] }, - "16": { + "19": { + "name": "storage.type.primitive.cpp storage.type.built-in.primitive.cpp" + }, + "20": { "patterns": [ { "include": "#inline_comment" } ] }, - "17": { + "21": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "18": { + "22": { "name": "comment.block.cpp" }, - "19": { + "23": { "patterns": [ { "match": "\\*\\/", @@ -7806,20 +9163,8 @@ } ] }, - "20": { - "name": "storage.type.primitive.cpp storage.type.built-in.primitive.cpp" - }, - "21": { - "name": "storage.type.cpp storage.type.built-in.cpp" - }, - "22": { - "name": "support.type.posix-reserved.pthread.cpp support.type.built-in.posix-reserved.pthread.cpp" - }, - "23": { - "name": "support.type.posix-reserved.cpp support.type.built-in.posix-reserved.cpp" - }, "24": { - "name": "entity.name.type.parameter.cpp" + "name": "storage.type.cpp storage.type.built-in.cpp" }, "25": { "patterns": [ @@ -7845,6 +9190,65 @@ "name": "comment.block.cpp" } ] + }, + "29": { + "name": "support.type.posix-reserved.pthread.cpp support.type.built-in.posix-reserved.pthread.cpp" + }, + "30": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "31": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "32": { + "name": "comment.block.cpp" + }, + "33": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "34": { + "name": "support.type.posix-reserved.cpp support.type.built-in.posix-reserved.cpp" + }, + "35": { + "name": "entity.name.type.parameter.cpp" + }, + "36": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "37": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "38": { + "name": "comment.block.cpp" + }, + "39": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] } } }, @@ -7863,7 +9267,7 @@ "end": "(?:(?=\\))|(,))", "endCaptures": { "1": { - "name": "comma.cpp punctuation.separator.delimiter.cpp" + "name": "punctuation.separator.delimiter.comma.cpp" } }, "patterns": [ @@ -7964,8 +9368,51 @@ "include": "#template_call_range" }, { - "match": "((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})", + "match": "((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))?(?:(?:\\&|\\*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:\\&|\\*)", "captures": { + "0": { + "patterns": [ + { + "match": "\\*", + "name": "storage.modifier.pointer.cpp" + }, + { + "match": "(?:\\&((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){2,}\\&", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "name": "invalid.illegal.reference-type.cpp" + }, + { + "match": "\\&", + "name": "storage.modifier.reference.cpp" + } + ] + }, "1": { "patterns": [ { @@ -7992,50 +9439,19 @@ ] }, "5": { - "name": "storage.modifier.pointer.cpp" + "patterns": [ + { + "include": "#inline_comment" + } + ] }, "6": { - "patterns": [ - { - "include": "#inline_comment" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "7": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + "name": "comment.block.cpp" }, "8": { - "name": "comment.block.cpp" - }, - "9": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "10": { - "name": "storage.modifier.reference.cpp" - }, - "11": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "12": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "13": { - "name": "comment.block.cpp" - }, - "14": { "patterns": [ { "match": "\\*\\/", @@ -8052,52 +9468,127 @@ ] }, "member_access": { - "match": "(?:((?\\*|->)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*(?:(?:(?:\\.\\*|\\.))|(?:(?:->\\*|->)))\\s*)*)\\s*(\\b(?!auto[^(?-mix:\\w)]|void[^(?-mix:\\w)]|char[^(?-mix:\\w)]|short[^(?-mix:\\w)]|int[^(?-mix:\\w)]|signed[^(?-mix:\\w)]|unsigned[^(?-mix:\\w)]|long[^(?-mix:\\w)]|float[^(?-mix:\\w)]|double[^(?-mix:\\w)]|bool[^(?-mix:\\w)]|wchar_t[^(?-mix:\\w)]|u_char[^(?-mix:\\w)]|u_short[^(?-mix:\\w)]|u_int[^(?-mix:\\w)]|u_long[^(?-mix:\\w)]|ushort[^(?-mix:\\w)]|uint[^(?-mix:\\w)]|u_quad_t[^(?-mix:\\w)]|quad_t[^(?-mix:\\w)]|qaddr_t[^(?-mix:\\w)]|caddr_t[^(?-mix:\\w)]|daddr_t[^(?-mix:\\w)]|div_t[^(?-mix:\\w)]|dev_t[^(?-mix:\\w)]|fixpt_t[^(?-mix:\\w)]|blkcnt_t[^(?-mix:\\w)]|blksize_t[^(?-mix:\\w)]|gid_t[^(?-mix:\\w)]|in_addr_t[^(?-mix:\\w)]|in_port_t[^(?-mix:\\w)]|ino_t[^(?-mix:\\w)]|key_t[^(?-mix:\\w)]|mode_t[^(?-mix:\\w)]|nlink_t[^(?-mix:\\w)]|id_t[^(?-mix:\\w)]|pid_t[^(?-mix:\\w)]|off_t[^(?-mix:\\w)]|segsz_t[^(?-mix:\\w)]|swblk_t[^(?-mix:\\w)]|uid_t[^(?-mix:\\w)]|id_t[^(?-mix:\\w)]|clock_t[^(?-mix:\\w)]|size_t[^(?-mix:\\w)]|ssize_t[^(?-mix:\\w)]|time_t[^(?-mix:\\w)]|useconds_t[^(?-mix:\\w)]|suseconds_t[^(?-mix:\\w)]|int8_t[^(?-mix:\\w)]|int16_t[^(?-mix:\\w)]|int32_t[^(?-mix:\\w)]|int64_t[^(?-mix:\\w)]|uint8_t[^(?-mix:\\w)]|uint16_t[^(?-mix:\\w)]|uint32_t[^(?-mix:\\w)]|uint64_t[^(?-mix:\\w)]|int_least8_t[^(?-mix:\\w)]|int_least16_t[^(?-mix:\\w)]|int_least32_t[^(?-mix:\\w)]|int_least64_t[^(?-mix:\\w)]|uint_least8_t[^(?-mix:\\w)]|uint_least16_t[^(?-mix:\\w)]|uint_least32_t[^(?-mix:\\w)]|uint_least64_t[^(?-mix:\\w)]|int_fast8_t[^(?-mix:\\w)]|int_fast16_t[^(?-mix:\\w)]|int_fast32_t[^(?-mix:\\w)]|int_fast64_t[^(?-mix:\\w)]|uint_fast8_t[^(?-mix:\\w)]|uint_fast16_t[^(?-mix:\\w)]|uint_fast32_t[^(?-mix:\\w)]|uint_fast64_t[^(?-mix:\\w)]|intptr_t[^(?-mix:\\w)]|uintptr_t[^(?-mix:\\w)]|intmax_t[^(?-mix:\\w)]|intmax_t[^(?-mix:\\w)]|uintmax_t[^(?-mix:\\w)]|uintmax_t[^(?-mix:\\w)])(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b(?!\\())", + "match": "(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\*|->)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*(?:(?:(?:\\.\\*|\\.))|(?:(?:->\\*|->)))\\s*)*)\\s*(\\b(?!auto[^(?-mix:\\w)]|void[^(?-mix:\\w)]|char[^(?-mix:\\w)]|short[^(?-mix:\\w)]|int[^(?-mix:\\w)]|signed[^(?-mix:\\w)]|unsigned[^(?-mix:\\w)]|long[^(?-mix:\\w)]|float[^(?-mix:\\w)]|double[^(?-mix:\\w)]|bool[^(?-mix:\\w)]|wchar_t[^(?-mix:\\w)]|u_char[^(?-mix:\\w)]|u_short[^(?-mix:\\w)]|u_int[^(?-mix:\\w)]|u_long[^(?-mix:\\w)]|ushort[^(?-mix:\\w)]|uint[^(?-mix:\\w)]|u_quad_t[^(?-mix:\\w)]|quad_t[^(?-mix:\\w)]|qaddr_t[^(?-mix:\\w)]|caddr_t[^(?-mix:\\w)]|daddr_t[^(?-mix:\\w)]|div_t[^(?-mix:\\w)]|dev_t[^(?-mix:\\w)]|fixpt_t[^(?-mix:\\w)]|blkcnt_t[^(?-mix:\\w)]|blksize_t[^(?-mix:\\w)]|gid_t[^(?-mix:\\w)]|in_addr_t[^(?-mix:\\w)]|in_port_t[^(?-mix:\\w)]|ino_t[^(?-mix:\\w)]|key_t[^(?-mix:\\w)]|mode_t[^(?-mix:\\w)]|nlink_t[^(?-mix:\\w)]|id_t[^(?-mix:\\w)]|pid_t[^(?-mix:\\w)]|off_t[^(?-mix:\\w)]|segsz_t[^(?-mix:\\w)]|swblk_t[^(?-mix:\\w)]|uid_t[^(?-mix:\\w)]|id_t[^(?-mix:\\w)]|clock_t[^(?-mix:\\w)]|size_t[^(?-mix:\\w)]|ssize_t[^(?-mix:\\w)]|time_t[^(?-mix:\\w)]|useconds_t[^(?-mix:\\w)]|suseconds_t[^(?-mix:\\w)]|int8_t[^(?-mix:\\w)]|int16_t[^(?-mix:\\w)]|int32_t[^(?-mix:\\w)]|int64_t[^(?-mix:\\w)]|uint8_t[^(?-mix:\\w)]|uint16_t[^(?-mix:\\w)]|uint32_t[^(?-mix:\\w)]|uint64_t[^(?-mix:\\w)]|int_least8_t[^(?-mix:\\w)]|int_least16_t[^(?-mix:\\w)]|int_least32_t[^(?-mix:\\w)]|int_least64_t[^(?-mix:\\w)]|uint_least8_t[^(?-mix:\\w)]|uint_least16_t[^(?-mix:\\w)]|uint_least32_t[^(?-mix:\\w)]|uint_least64_t[^(?-mix:\\w)]|int_fast8_t[^(?-mix:\\w)]|int_fast16_t[^(?-mix:\\w)]|int_fast32_t[^(?-mix:\\w)]|int_fast64_t[^(?-mix:\\w)]|uint_fast8_t[^(?-mix:\\w)]|uint_fast16_t[^(?-mix:\\w)]|uint_fast32_t[^(?-mix:\\w)]|uint_fast64_t[^(?-mix:\\w)]|intptr_t[^(?-mix:\\w)]|uintptr_t[^(?-mix:\\w)]|intmax_t[^(?-mix:\\w)]|intmax_t[^(?-mix:\\w)]|uintmax_t[^(?-mix:\\w)]|uintmax_t[^(?-mix:\\w)])(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b(?!\\())", "captures": { "1": { - "name": "variable.language.this.cpp" - }, - "2": { - "name": "variable.other.object.access.cpp" - }, - "3": { - "name": "punctuation.separator.dot-access.cpp" - }, - "4": { - "name": "punctuation.separator.pointer-access.cpp" - }, - "5": { "patterns": [ { - "match": "(?<=(?:\\.\\*|\\.|->|->\\*))\\s*(?:((?\\*|->)))", + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "5": { + "name": "variable.language.this.cpp" + }, + "6": { + "name": "variable.other.object.access.cpp" + }, + "7": { + "name": "punctuation.separator.dot-access.cpp" + }, + "8": { + "name": "punctuation.separator.pointer-access.cpp" + }, + "9": { + "patterns": [ + { + "match": "(?<=(?:\\.\\*|\\.|->|->\\*))\\s*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\*|->)))", "captures": { "1": { - "name": "variable.language.this.cpp" + "patterns": [ + { + "include": "#inline_comment" + } + ] }, "2": { - "name": "variable.other.object.property.cpp" + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "3": { - "name": "punctuation.separator.dot-access.cpp" + "name": "comment.block.cpp" }, "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "5": { + "name": "variable.language.this.cpp" + }, + "6": { + "name": "variable.other.object.property.cpp" + }, + "7": { + "name": "punctuation.separator.dot-access.cpp" + }, + "8": { "name": "punctuation.separator.pointer-access.cpp" } } }, { - "match": "(?:((?\\*|->)))", + "match": "(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\*|->)))", "captures": { "1": { - "name": "variable.language.this.cpp" + "patterns": [ + { + "include": "#inline_comment" + } + ] }, "2": { - "name": "variable.other.object.access.cpp" + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "3": { - "name": "punctuation.separator.dot-access.cpp" + "name": "comment.block.cpp" }, "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "5": { + "name": "variable.language.this.cpp" + }, + "6": { + "name": "variable.other.object.access.cpp" + }, + "7": { + "name": "punctuation.separator.dot-access.cpp" + }, + "8": { "name": "punctuation.separator.pointer-access.cpp" } } @@ -8110,58 +9601,133 @@ } ] }, - "6": { + "10": { "name": "variable.other.property.cpp" } } }, "method_access": { - "begin": "(?:((?\\*|->)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*(?:(?:(?:\\.\\*|\\.))|(?:(?:->\\*|->)))\\s*)*)\\s*(~?(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*(\\()", + "begin": "(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\*|->)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*(?:(?:(?:\\.\\*|\\.))|(?:(?:->\\*|->)))\\s*)*)\\s*(~?(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*(\\()", "beginCaptures": { "1": { - "name": "variable.language.this.cpp" - }, - "2": { - "name": "variable.other.object.access.cpp" - }, - "3": { - "name": "punctuation.separator.dot-access.cpp" - }, - "4": { - "name": "punctuation.separator.pointer-access.cpp" - }, - "5": { "patterns": [ { - "match": "(?<=(?:\\.\\*|\\.|->|->\\*))\\s*(?:((?\\*|->)))", + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "5": { + "name": "variable.language.this.cpp" + }, + "6": { + "name": "variable.other.object.access.cpp" + }, + "7": { + "name": "punctuation.separator.dot-access.cpp" + }, + "8": { + "name": "punctuation.separator.pointer-access.cpp" + }, + "9": { + "patterns": [ + { + "match": "(?<=(?:\\.\\*|\\.|->|->\\*))\\s*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\*|->)))", "captures": { "1": { - "name": "variable.language.this.cpp" + "patterns": [ + { + "include": "#inline_comment" + } + ] }, "2": { - "name": "variable.other.object.property.cpp" + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "3": { - "name": "punctuation.separator.dot-access.cpp" + "name": "comment.block.cpp" }, "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "5": { + "name": "variable.language.this.cpp" + }, + "6": { + "name": "variable.other.object.property.cpp" + }, + "7": { + "name": "punctuation.separator.dot-access.cpp" + }, + "8": { "name": "punctuation.separator.pointer-access.cpp" } } }, { - "match": "(?:((?\\*|->)))", + "match": "(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\*|->)))", "captures": { "1": { - "name": "variable.language.this.cpp" + "patterns": [ + { + "include": "#inline_comment" + } + ] }, "2": { - "name": "variable.other.object.access.cpp" + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "3": { - "name": "punctuation.separator.dot-access.cpp" + "name": "comment.block.cpp" }, "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "5": { + "name": "variable.language.this.cpp" + }, + "6": { + "name": "variable.other.object.access.cpp" + }, + "7": { + "name": "punctuation.separator.dot-access.cpp" + }, + "8": { "name": "punctuation.separator.pointer-access.cpp" } } @@ -8174,10 +9740,10 @@ } ] }, - "6": { + "10": { "name": "entity.name.function.member.cpp" }, - "7": { + "11": { "name": "punctuation.section.arguments.begin.bracket.round.function.member.cpp" } }, @@ -8315,7 +9881,7 @@ }, "patterns": [ { - "include": "#initial_context" + "include": "$base" } ] }, @@ -8325,14 +9891,14 @@ "end": "[\\s\\n]*(?=;)", "patterns": [ { - "include": "#initial_context" + "include": "$base" } ] } ] }, "macro_argument": { - "match": "##(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*(?!\\w)", + "match": "##?(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*(?!\\w)", "name": "variable.other.macro.argument.cpp" }, "lambdas": { @@ -8379,7 +9945,7 @@ ] }, "6": { - "name": "comma.cpp punctuation.separator.delimiter.cpp" + "name": "punctuation.separator.delimiter.comma.cpp" }, "7": { "name": "keyword.operator.assignment.cpp" @@ -8448,7 +10014,7 @@ }, "patterns": [ { - "include": "#initial_context" + "include": "$base" } ] } @@ -8520,7 +10086,7 @@ "name": "entity.name.type.enum.cpp" }, "6": { - "name": "colon.cpp punctuation.separator.type-specifier.cpp" + "name": "punctuation.separator.colon.type-specifier.cpp" }, "8": { "patterns": [ @@ -8568,7 +10134,7 @@ }, "patterns": [ { - "include": "#initial_context" + "include": "$base" } ] }, @@ -8602,7 +10168,7 @@ "end": "[\\s\\n]*(?=;)", "patterns": [ { - "include": "#initial_context" + "include": "$base" } ] } @@ -8612,7 +10178,7 @@ "patterns": [ { "match": ",", - "name": "comma.cpp punctuation.separator.delimiter.inheritance.cpp" + "name": "punctuation.separator.delimiter.comma.inheritance.cpp" }, { "match": "(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(extern)(?=\\s*\\\"))", "beginCaptures": { "1": { "name": "meta.head.extern.cpp" }, "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { "name": "storage.type.extern.cpp" } }, @@ -9174,7 +10765,7 @@ }, "patterns": [ { - "include": "#initial_context" + "include": "$base" } ] }, @@ -9189,7 +10780,7 @@ }, "patterns": [ { - "include": "#initial_context" + "include": "$base" } ] }, @@ -9199,12 +10790,12 @@ "end": "[\\s\\n]*(?=;)", "patterns": [ { - "include": "#initial_context" + "include": "$base" } ] }, { - "include": "#initial_context" + "include": "$base" } ] }, @@ -9307,7 +10898,7 @@ "name": "storage.type.modifier.final.cpp" }, "17": { - "name": "colon.cpp punctuation.separator.inheritance.cpp" + "name": "punctuation.separator.colon.inheritance.cpp" }, "18": { "patterns": [ @@ -9371,7 +10962,7 @@ "include": "#destructor_inline" }, { - "include": "#initial_context" + "include": "$base" } ] }, @@ -9381,8 +10972,51 @@ "end": "[\\s\\n]*(?=;)", "patterns": [ { - "match": "((?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))?(?:(?:\\&|\\*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:\\&|\\*))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){2,}\\&", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "name": "invalid.illegal.reference-type.cpp" + }, + { + "match": "\\&", + "name": "storage.modifier.reference.cpp" + } + ] + }, "2": { "patterns": [ { @@ -9409,87 +11043,56 @@ ] }, "6": { - "name": "storage.modifier.pointer.cpp" - }, - "7": { "patterns": [ { "include": "#inline_comment" } ] }, - "8": { + "7": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "9": { + "8": { "name": "comment.block.cpp" }, + "9": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, "10": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "11": { - "name": "storage.modifier.reference.cpp" + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "12": { - "patterns": [ - { - "include": "#inline_comment" - } - ] + "name": "comment.block.cpp" }, "13": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] }, "14": { - "name": "comment.block.cpp" - }, - "15": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "16": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "17": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "18": { - "name": "comment.block.cpp" - }, - "19": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "20": { "name": "entity.name.type.alias.cpp" } } @@ -9602,7 +11205,7 @@ "name": "storage.type.modifier.final.cpp" }, "17": { - "name": "colon.cpp punctuation.separator.inheritance.cpp" + "name": "punctuation.separator.colon.inheritance.cpp" }, "18": { "patterns": [ @@ -9666,7 +11269,7 @@ "include": "#destructor_inline" }, { - "include": "#initial_context" + "include": "$base" } ] }, @@ -9676,8 +11279,51 @@ "end": "[\\s\\n]*(?=;)", "patterns": [ { - "match": "((?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))?(?:(?:\\&|\\*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:\\&|\\*))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){2,}\\&", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "name": "invalid.illegal.reference-type.cpp" + }, + { + "match": "\\&", + "name": "storage.modifier.reference.cpp" + } + ] + }, "2": { "patterns": [ { @@ -9704,87 +11350,56 @@ ] }, "6": { - "name": "storage.modifier.pointer.cpp" - }, - "7": { "patterns": [ { "include": "#inline_comment" } ] }, - "8": { + "7": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "9": { + "8": { "name": "comment.block.cpp" }, + "9": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, "10": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "11": { - "name": "storage.modifier.reference.cpp" + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "12": { - "patterns": [ - { - "include": "#inline_comment" - } - ] + "name": "comment.block.cpp" }, "13": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] }, "14": { - "name": "comment.block.cpp" - }, - "15": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "16": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "17": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "18": { - "name": "comment.block.cpp" - }, - "19": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "20": { "name": "entity.name.type.alias.cpp" } } @@ -9897,7 +11512,7 @@ "name": "storage.type.modifier.final.cpp" }, "17": { - "name": "colon.cpp punctuation.separator.inheritance.cpp" + "name": "punctuation.separator.colon.inheritance.cpp" }, "18": { "patterns": [ @@ -9961,7 +11576,7 @@ "include": "#destructor_inline" }, { - "include": "#initial_context" + "include": "$base" } ] }, @@ -9971,8 +11586,51 @@ "end": "[\\s\\n]*(?=;)", "patterns": [ { - "match": "((?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))?(?:(?:\\&|\\*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:\\&|\\*))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){2,}\\&", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "name": "invalid.illegal.reference-type.cpp" + }, + { + "match": "\\&", + "name": "storage.modifier.reference.cpp" + } + ] + }, "2": { "patterns": [ { @@ -9999,87 +11657,56 @@ ] }, "6": { - "name": "storage.modifier.pointer.cpp" - }, - "7": { "patterns": [ { "include": "#inline_comment" } ] }, - "8": { + "7": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "9": { + "8": { "name": "comment.block.cpp" }, + "9": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, "10": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "11": { - "name": "storage.modifier.reference.cpp" + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "12": { - "patterns": [ - { - "include": "#inline_comment" - } - ] + "name": "comment.block.cpp" }, "13": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] }, "14": { - "name": "comment.block.cpp" - }, - "15": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "16": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "17": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "18": { - "name": "comment.block.cpp" - }, - "19": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "20": { "name": "entity.name.type.alias.cpp" } } @@ -10094,7 +11721,7 @@ ] }, "struct_declare": { - "match": "(struct)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\b(?!final\\W|final\\$|override\\W|override\\$)((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\S)(?!:)", + "match": "(struct)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))?(?:(?:\\&|\\*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:\\&|\\*))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\b(?!final\\W|final\\$|override\\W|override\\$)((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\S)(?!:)", "captures": { "1": { "name": "storage.type.struct.declare.cpp" @@ -10127,6 +11754,49 @@ "6": { "name": "entity.name.type.struct.cpp" }, + "7": { + "patterns": [ + { + "match": "\\*", + "name": "storage.modifier.pointer.cpp" + }, + { + "match": "(?:\\&((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){2,}\\&", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "name": "invalid.illegal.reference-type.cpp" + }, + { + "match": "\\&", + "name": "storage.modifier.reference.cpp" + } + ] + }, "8": { "patterns": [ { @@ -10153,128 +11823,72 @@ ] }, "12": { - "name": "storage.modifier.pointer.cpp" - }, - "13": { "patterns": [ { "include": "#inline_comment" } ] }, - "14": { + "13": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "15": { + "14": { "name": "comment.block.cpp" }, + "15": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, "16": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "17": { - "name": "storage.modifier.reference.cpp" + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "18": { + "name": "comment.block.cpp" + }, + "19": { "patterns": [ { - "include": "#inline_comment" + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" } ] }, - "19": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, "20": { - "name": "comment.block.cpp" + "name": "variable.other.object.declare.cpp" }, "21": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "22": { - "patterns": [ - { - "include": "#inline_comment" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "23": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + "name": "comment.block.cpp" }, "24": { - "name": "comment.block.cpp" - }, - "25": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "26": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "27": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "28": { - "name": "comment.block.cpp" - }, - "29": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "30": { - "name": "variable.other.object.declare.cpp" - }, - "31": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "32": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "33": { - "name": "comment.block.cpp" - }, - "34": { "patterns": [ { "match": "\\*\\/", @@ -10289,7 +11903,7 @@ } }, "union_declare": { - "match": "(union)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\b(?!final\\W|final\\$|override\\W|override\\$)((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\S)(?!:)", + "match": "(union)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))?(?:(?:\\&|\\*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:\\&|\\*))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\b(?!final\\W|final\\$|override\\W|override\\$)((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\S)(?!:)", "captures": { "1": { "name": "storage.type.union.declare.cpp" @@ -10322,6 +11936,49 @@ "6": { "name": "entity.name.type.union.cpp" }, + "7": { + "patterns": [ + { + "match": "\\*", + "name": "storage.modifier.pointer.cpp" + }, + { + "match": "(?:\\&((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){2,}\\&", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "name": "invalid.illegal.reference-type.cpp" + }, + { + "match": "\\&", + "name": "storage.modifier.reference.cpp" + } + ] + }, "8": { "patterns": [ { @@ -10348,128 +12005,72 @@ ] }, "12": { - "name": "storage.modifier.pointer.cpp" - }, - "13": { "patterns": [ { "include": "#inline_comment" } ] }, - "14": { + "13": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "15": { + "14": { "name": "comment.block.cpp" }, + "15": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, "16": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "17": { - "name": "storage.modifier.reference.cpp" + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "18": { + "name": "comment.block.cpp" + }, + "19": { "patterns": [ { - "include": "#inline_comment" + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" } ] }, - "19": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, "20": { - "name": "comment.block.cpp" + "name": "variable.other.object.declare.cpp" }, "21": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "22": { - "patterns": [ - { - "include": "#inline_comment" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "23": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + "name": "comment.block.cpp" }, "24": { - "name": "comment.block.cpp" - }, - "25": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "26": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "27": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "28": { - "name": "comment.block.cpp" - }, - "29": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "30": { - "name": "variable.other.object.declare.cpp" - }, - "31": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "32": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "33": { - "name": "comment.block.cpp" - }, - "34": { "patterns": [ { "match": "\\*\\/", @@ -10484,7 +12085,7 @@ } }, "enum_declare": { - "match": "(enum)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\b(?!final\\W|final\\$|override\\W|override\\$)((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\S)(?!:)", + "match": "(enum)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))?(?:(?:\\&|\\*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:\\&|\\*))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\b(?!final\\W|final\\$|override\\W|override\\$)((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\S)(?!:)", "captures": { "1": { "name": "storage.type.enum.declare.cpp" @@ -10517,6 +12118,49 @@ "6": { "name": "entity.name.type.enum.cpp" }, + "7": { + "patterns": [ + { + "match": "\\*", + "name": "storage.modifier.pointer.cpp" + }, + { + "match": "(?:\\&((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){2,}\\&", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "name": "invalid.illegal.reference-type.cpp" + }, + { + "match": "\\&", + "name": "storage.modifier.reference.cpp" + } + ] + }, "8": { "patterns": [ { @@ -10543,128 +12187,72 @@ ] }, "12": { - "name": "storage.modifier.pointer.cpp" - }, - "13": { "patterns": [ { "include": "#inline_comment" } ] }, - "14": { + "13": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "15": { + "14": { "name": "comment.block.cpp" }, + "15": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, "16": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "17": { - "name": "storage.modifier.reference.cpp" + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "18": { + "name": "comment.block.cpp" + }, + "19": { "patterns": [ { - "include": "#inline_comment" + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" } ] }, - "19": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, "20": { - "name": "comment.block.cpp" + "name": "variable.other.object.declare.cpp" }, "21": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "22": { - "patterns": [ - { - "include": "#inline_comment" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "23": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + "name": "comment.block.cpp" }, "24": { - "name": "comment.block.cpp" - }, - "25": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "26": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "27": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "28": { - "name": "comment.block.cpp" - }, - "29": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "30": { - "name": "variable.other.object.declare.cpp" - }, - "31": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "32": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "33": { - "name": "comment.block.cpp" - }, - "34": { "patterns": [ { "match": "\\*\\/", @@ -10679,7 +12267,7 @@ } }, "class_declare": { - "match": "(class)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\b(?!final\\W|final\\$|override\\W|override\\$)((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\S)(?!:)", + "match": "(class)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))?(?:(?:\\&|\\*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:\\&|\\*))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\b(?!final\\W|final\\$|override\\W|override\\$)((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\S)(?!:)", "captures": { "1": { "name": "storage.type.class.declare.cpp" @@ -10712,6 +12300,49 @@ "6": { "name": "entity.name.type.class.cpp" }, + "7": { + "patterns": [ + { + "match": "\\*", + "name": "storage.modifier.pointer.cpp" + }, + { + "match": "(?:\\&((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){2,}\\&", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "name": "invalid.illegal.reference-type.cpp" + }, + { + "match": "\\&", + "name": "storage.modifier.reference.cpp" + } + ] + }, "8": { "patterns": [ { @@ -10738,128 +12369,72 @@ ] }, "12": { - "name": "storage.modifier.pointer.cpp" - }, - "13": { "patterns": [ { "include": "#inline_comment" } ] }, - "14": { + "13": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "15": { + "14": { "name": "comment.block.cpp" }, + "15": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, "16": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "17": { - "name": "storage.modifier.reference.cpp" + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "18": { + "name": "comment.block.cpp" + }, + "19": { "patterns": [ { - "include": "#inline_comment" + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" } ] }, - "19": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, "20": { - "name": "comment.block.cpp" + "name": "variable.other.object.declare.cpp" }, "21": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "22": { - "patterns": [ - { - "include": "#inline_comment" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "23": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + "name": "comment.block.cpp" }, "24": { - "name": "comment.block.cpp" - }, - "25": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "26": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "27": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "28": { - "name": "comment.block.cpp" - }, - "29": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "30": { - "name": "variable.other.object.declare.cpp" - }, - "31": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "32": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "33": { - "name": "comment.block.cpp" - }, - "34": { "patterns": [ { "match": "\\*\\/", @@ -10890,7 +12465,7 @@ ] }, "parameter_struct": { - "match": "(struct)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?:(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:\\[((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\]((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?(?=,|\\)|\\n)", + "match": "(struct)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))?(?:(?:\\&|\\*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:\\&|\\*))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?((?:(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:\\[((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\]((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?(?=,|\\)|\\n)", "captures": { "1": { "name": "storage.type.struct.parameter.cpp" @@ -10948,6 +12523,49 @@ } ] }, + "11": { + "patterns": [ + { + "match": "\\*", + "name": "storage.modifier.pointer.cpp" + }, + { + "match": "(?:\\&((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){2,}\\&", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "name": "invalid.illegal.reference-type.cpp" + }, + { + "match": "\\&", + "name": "storage.modifier.reference.cpp" + } + ] + }, "12": { "patterns": [ { @@ -10974,153 +12592,122 @@ ] }, "16": { - "name": "storage.modifier.pointer.cpp" - }, - "17": { "patterns": [ { "include": "#inline_comment" } ] }, - "18": { + "17": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "19": { + "18": { "name": "comment.block.cpp" }, + "19": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, "20": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "21": { - "name": "storage.modifier.reference.cpp" + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "22": { + "name": "comment.block.cpp" + }, + "23": { "patterns": [ { - "include": "#inline_comment" + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" } ] }, - "23": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, "24": { - "name": "comment.block.cpp" + "name": "variable.other.object.declare.cpp" }, "25": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "26": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "27": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "28": { + "27": { "name": "comment.block.cpp" }, + "28": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, "29": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "30": { - "name": "variable.other.object.declare.cpp" + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "31": { - "patterns": [ - { - "include": "#inline_comment" - } - ] + "name": "comment.block.cpp" }, "32": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] }, "33": { - "name": "comment.block.cpp" + "patterns": [ + { + "include": "#inline_comment" + } + ] }, "34": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "35": { - "patterns": [ - { - "include": "#inline_comment" - } - ] + "name": "comment.block.cpp" }, "36": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "37": { - "name": "comment.block.cpp" - }, - "38": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "39": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "40": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "41": { - "name": "comment.block.cpp" - }, - "42": { "patterns": [ { "match": "\\*\\/", @@ -11135,7 +12722,7 @@ } }, "parameter_enum": { - "match": "(enum)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?:(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:\\[((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\]((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?(?=,|\\)|\\n)", + "match": "(enum)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))?(?:(?:\\&|\\*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:\\&|\\*))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?((?:(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:\\[((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\]((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?(?=,|\\)|\\n)", "captures": { "1": { "name": "storage.type.enum.parameter.cpp" @@ -11193,6 +12780,49 @@ } ] }, + "11": { + "patterns": [ + { + "match": "\\*", + "name": "storage.modifier.pointer.cpp" + }, + { + "match": "(?:\\&((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){2,}\\&", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "name": "invalid.illegal.reference-type.cpp" + }, + { + "match": "\\&", + "name": "storage.modifier.reference.cpp" + } + ] + }, "12": { "patterns": [ { @@ -11219,153 +12849,122 @@ ] }, "16": { - "name": "storage.modifier.pointer.cpp" - }, - "17": { "patterns": [ { "include": "#inline_comment" } ] }, - "18": { + "17": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "19": { + "18": { "name": "comment.block.cpp" }, + "19": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, "20": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "21": { - "name": "storage.modifier.reference.cpp" + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "22": { + "name": "comment.block.cpp" + }, + "23": { "patterns": [ { - "include": "#inline_comment" + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" } ] }, - "23": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, "24": { - "name": "comment.block.cpp" + "name": "variable.other.object.declare.cpp" }, "25": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "26": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "27": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "28": { + "27": { "name": "comment.block.cpp" }, + "28": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, "29": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "30": { - "name": "variable.other.object.declare.cpp" + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "31": { - "patterns": [ - { - "include": "#inline_comment" - } - ] + "name": "comment.block.cpp" }, "32": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] }, "33": { - "name": "comment.block.cpp" + "patterns": [ + { + "include": "#inline_comment" + } + ] }, "34": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "35": { - "patterns": [ - { - "include": "#inline_comment" - } - ] + "name": "comment.block.cpp" }, "36": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "37": { - "name": "comment.block.cpp" - }, - "38": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "39": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "40": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "41": { - "name": "comment.block.cpp" - }, - "42": { "patterns": [ { "match": "\\*\\/", @@ -11380,7 +12979,7 @@ } }, "parameter_union": { - "match": "(union)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?:(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:\\[((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\]((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?(?=,|\\)|\\n)", + "match": "(union)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))?(?:(?:\\&|\\*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:\\&|\\*))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?((?:(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:\\[((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\]((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?(?=,|\\)|\\n)", "captures": { "1": { "name": "storage.type.union.parameter.cpp" @@ -11438,6 +13037,49 @@ } ] }, + "11": { + "patterns": [ + { + "match": "\\*", + "name": "storage.modifier.pointer.cpp" + }, + { + "match": "(?:\\&((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){2,}\\&", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "name": "invalid.illegal.reference-type.cpp" + }, + { + "match": "\\&", + "name": "storage.modifier.reference.cpp" + } + ] + }, "12": { "patterns": [ { @@ -11464,153 +13106,122 @@ ] }, "16": { - "name": "storage.modifier.pointer.cpp" - }, - "17": { "patterns": [ { "include": "#inline_comment" } ] }, - "18": { + "17": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "19": { + "18": { "name": "comment.block.cpp" }, + "19": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, "20": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "21": { - "name": "storage.modifier.reference.cpp" + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "22": { + "name": "comment.block.cpp" + }, + "23": { "patterns": [ { - "include": "#inline_comment" + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" } ] }, - "23": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, "24": { - "name": "comment.block.cpp" + "name": "variable.other.object.declare.cpp" }, "25": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "26": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "27": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "28": { + "27": { "name": "comment.block.cpp" }, + "28": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, "29": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "30": { - "name": "variable.other.object.declare.cpp" + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "31": { - "patterns": [ - { - "include": "#inline_comment" - } - ] + "name": "comment.block.cpp" }, "32": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] }, "33": { - "name": "comment.block.cpp" + "patterns": [ + { + "include": "#inline_comment" + } + ] }, "34": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "35": { - "patterns": [ - { - "include": "#inline_comment" - } - ] + "name": "comment.block.cpp" }, "36": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "37": { - "name": "comment.block.cpp" - }, - "38": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "39": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "40": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "41": { - "name": "comment.block.cpp" - }, - "42": { "patterns": [ { "match": "\\*\\/", @@ -11625,7 +13236,7 @@ } }, "parameter_class": { - "match": "(class)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\*(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\*|\\&))?)*)((?:&(?:((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\&))?){0,2})((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?)((?:(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:\\[((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\]((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?(?=,|\\)|\\n)", + "match": "(class)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))?(?:(?:\\&|\\*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:\\&|\\*))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?((?:(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:\\[((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\]((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?(?=,|\\)|\\n)", "captures": { "1": { "name": "storage.type.class.parameter.cpp" @@ -11683,6 +13294,49 @@ } ] }, + "11": { + "patterns": [ + { + "match": "\\*", + "name": "storage.modifier.pointer.cpp" + }, + { + "match": "(?:\\&((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){2,}\\&", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "name": "invalid.illegal.reference-type.cpp" + }, + { + "match": "\\&", + "name": "storage.modifier.reference.cpp" + } + ] + }, "12": { "patterns": [ { @@ -11709,153 +13363,122 @@ ] }, "16": { - "name": "storage.modifier.pointer.cpp" - }, - "17": { "patterns": [ { "include": "#inline_comment" } ] }, - "18": { + "17": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "19": { + "18": { "name": "comment.block.cpp" }, + "19": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, "20": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "21": { - "name": "storage.modifier.reference.cpp" + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "22": { + "name": "comment.block.cpp" + }, + "23": { "patterns": [ { - "include": "#inline_comment" + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" } ] }, - "23": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, "24": { - "name": "comment.block.cpp" + "name": "variable.other.object.declare.cpp" }, "25": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "26": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "27": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "28": { + "27": { "name": "comment.block.cpp" }, + "28": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, "29": { "patterns": [ { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" + "include": "#inline_comment" } ] }, "30": { - "name": "variable.other.object.declare.cpp" + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "31": { - "patterns": [ - { - "include": "#inline_comment" - } - ] + "name": "comment.block.cpp" }, "32": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] }, "33": { - "name": "comment.block.cpp" + "patterns": [ + { + "include": "#inline_comment" + } + ] }, "34": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, "35": { - "patterns": [ - { - "include": "#inline_comment" - } - ] + "name": "comment.block.cpp" }, "36": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "37": { - "name": "comment.block.cpp" - }, - "38": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "39": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "40": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "41": { - "name": "comment.block.cpp" - }, - "42": { "patterns": [ { "match": "\\*\\/", @@ -12067,8 +13690,8 @@ "match": "(?-mix:(?-mix:(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*)(((?>(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))::((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))\\13((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\()))", + "beginCaptures": { + "1": { + "name": "meta.head.function.definition.special.constructor.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "name": "storage.type.modifier.calling-convention.cpp" + }, + "7": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "8": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "9": { + "name": "comment.block.cpp" + }, + "10": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "11": { + "patterns": [ + { + "match": "::", + "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.constructor.cpp" + }, + { + "match": "(?|\\?\\?>)|(?=[;>\\[\\]=]))|(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(default)|(delete))", + "captures": { + "1": { + "name": "keyword.operator.assignment.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "name": "keyword.other.default.constructor.cpp" + }, + "7": { + "name": "keyword.other.delete.constructor.cpp" + } + } + } + ] + }, + { + "include": "#functional_specifiers_pre_parameters" + }, + { + "begin": "(:)", + "beginCaptures": { + "1": { + "name": "punctuation.separator.initializers.cpp" + } + }, + "end": "(?=\\{)", + "patterns": [ + { + "contentName": "meta.parameter.initialization.cpp", + "begin": "((?|\\?\\?>)", + "endCaptures": { + "1": { + "name": "punctuation.section.block.end.bracket.curly.function.definition.special.constructor.cpp" + } + }, + "patterns": [ + { + "include": "#function_body_context" + } + ] + }, + { + "name": "meta.tail.function.definition.special.constructor.cpp", + "begin": "(?<=\\}|%>|\\?\\?>)[\\s\\n]*", + "end": "[\\s\\n]*(?=;)", + "patterns": [ + { + "include": "$base" + } + ] + } + ] + }, + "macro_safe_destructor_root": { + "name": "meta.function.definition.special.member.destructor.cpp", + "begin": "(((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*)(((?>(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))::((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))~\\13((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\()))", + "beginCaptures": { + "1": { + "name": "meta.head.function.definition.special.member.destructor.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "name": "storage.type.modifier.calling-convention.cpp" + }, + "7": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "8": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "9": { + "name": "comment.block.cpp" + }, + "10": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "11": { + "patterns": [ + { + "match": "::", + "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.destructor.cpp" + }, + { + "match": "(?|\\?\\?>)|(?=[;>\\[\\]=]))|(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(default)|(delete))", + "captures": { + "1": { + "name": "keyword.operator.assignment.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "name": "keyword.other.default.constructor.cpp" + }, + "7": { + "name": "keyword.other.delete.constructor.cpp" + } + } + } + ] + }, + { + "contentName": "meta.function.definition.parameters.special.member.destructor.cpp", + "begin": "(\\()", + "beginCaptures": { + "1": { + "name": "punctuation.section.parameters.begin.bracket.round.special.member.destructor.cpp" + } + }, + "end": "(\\))", + "endCaptures": { + "1": { + "name": "punctuation.section.parameters.end.bracket.round.special.member.destructor.cpp" + } + } + }, + { + "include": "$base" + } + ] + }, + { + "name": "meta.body.function.definition.special.member.destructor.cpp", + "begin": "(?<=\\{|<%|\\?\\?<)", + "end": "(\\}|%>|\\?\\?>)", + "endCaptures": { + "1": { + "name": "punctuation.section.block.end.bracket.curly.function.definition.special.member.destructor.cpp" + } + }, + "patterns": [ + { + "include": "#function_body_context" + } + ] + }, + { + "name": "meta.tail.function.definition.special.member.destructor.cpp", + "begin": "(?<=\\}|%>|\\?\\?>)[\\s\\n]*", + "end": "[\\s\\n]*(?=;)", + "patterns": [ + { + "include": "$base" + } + ] + } + ] + }, + "macro_safe_function_definition": { + "name": "meta.function.definition.cpp", + "begin": "((?:(?:^|\\G|(?<=;|\\}))|(?<=>))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?(?:((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))(((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))?(?:(?:\\&|\\*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:\\&|\\*))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\())", + "beginCaptures": { + "1": { + "name": "meta.head.function.definition.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "name": "storage.type.template.cpp" + }, + "7": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "8": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "9": { + "name": "comment.block.cpp" + }, + "10": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "11": { + "name": "storage.modifier.$11.cpp" + }, + "12": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "13": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "14": { + "name": "comment.block.cpp" + }, + "15": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "16": { + "name": "meta.qualified_type.cpp", + "patterns": [ + { + "match": "(?:class|struct|union|enum)", + "name": "storage.type.$0.cpp" + }, + { + "include": "#attributes_context" + }, + { + "include": "#function_type" + }, + { + "include": "#storage_types" + }, + { + "include": "#number_literal" + }, + { + "include": "#string_context_c" + }, + { + "include": "#comma" + }, + { + "include": "#scope_resolution_inner_generated" + }, + { + "include": "#template_call_range" + }, + { + "match": "(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*", + "name": "entity.name.type.cpp" + } + ] + }, + "17": { + "patterns": [ + { + "include": "#attributes_context" + }, + { + "include": "#number_literal" + } + ] + }, + "18": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "19": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "20": { + "name": "comment.block.cpp" + }, + "21": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "22": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "23": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "24": { + "name": "comment.block.cpp" + }, + "25": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "27": { + "patterns": [ + { + "include": "#scope_resolution_inner_generated" + } + ] + }, + "28": { + "name": "entity.name.scope-resolution.cpp" + }, + "29": { + "name": "meta.template.call.cpp", + "patterns": [ + { + "include": "#template_call_range" + } + ] + }, + "30": { + "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.cpp" + }, + "31": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "32": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "33": { + "name": "comment.block.cpp" + }, + "34": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "35": { + "name": "entity.name.type.cpp" + }, + "36": { + "patterns": [ + { + "match": "\\*", + "name": "storage.modifier.pointer.cpp" + }, + { + "match": "(?:\\&((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){2,}\\&", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "name": "invalid.illegal.reference-type.cpp" + }, + { + "match": "\\&", + "name": "storage.modifier.reference.cpp" + } + ] + }, + "37": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "38": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "39": { + "name": "comment.block.cpp" + }, + "40": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "41": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "42": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "43": { + "name": "comment.block.cpp" + }, + "44": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "45": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "46": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "47": { + "name": "comment.block.cpp" + }, + "48": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "49": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "50": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "51": { + "name": "comment.block.cpp" + }, + "52": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "53": { + "name": "storage.type.modifier.calling-convention.cpp" + }, + "54": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "55": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "56": { + "name": "comment.block.cpp" + }, + "57": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "58": { + "patterns": [ + { + "include": "#scope_resolution_function_definition_inner_generated" + } + ] + }, + "59": { + "name": "entity.name.function.definition.cpp" + }, + "60": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "61": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "62": { + "name": "comment.block.cpp" + }, + "63": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "end": "(?:(?<=\\}|%>|\\?\\?>)|(?=[;>\\[\\]=]))|(?|\\?\\?>)", + "endCaptures": { + "1": { + "name": "punctuation.section.block.end.bracket.curly.function.definition.cpp" + } + }, + "patterns": [ + { + "include": "#function_body_context" + } + ] + }, + { + "name": "meta.tail.function.definition.cpp", + "begin": "(?<=\\}|%>|\\?\\?>)[\\s\\n]*", + "end": "[\\s\\n]*(?=;)", + "patterns": [ + { + "include": "$base" + } + ] + } + ] + }, + "macro_safe_operator_overload": { + "name": "meta.function.definition.special.operator-overload.cpp", + "begin": "((?:(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))(((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))?(?:(?:\\&|\\*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:\\&|\\*))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*)(operator)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*)(?:(?:((?:\\+\\+|\\-\\-|\\(\\)|\\[\\]|\\->|\\+\\+|\\-\\-|\\+|\\-|!|~|\\*|&|new|new\\[\\]|delete|delete\\[\\]|\\->\\*|\\*|\\/|%|\\+|\\-|<<|>>|<=>|<|<=|>|>=|==|!=|&|\\^|\\||&&|\\|\\||=|\\+=|\\-=|\\*=|\\/=|%=|<<=|>>=|&=|\\^=|\\|=|,))|((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))?(?:(?:\\&|\\*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:\\&|\\*))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?:\\[\\])?)))|(\"\")((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=\\<|\\())", + "beginCaptures": { + "1": { + "name": "meta.head.function.definition.special.operator-overload.cpp" + }, + "2": { + "name": "meta.qualified_type.cpp", + "patterns": [ + { + "match": "(?:class|struct|union|enum)", + "name": "storage.type.$0.cpp" + }, + { + "include": "#attributes_context" + }, + { + "include": "#function_type" + }, + { + "include": "#storage_types" + }, + { + "include": "#number_literal" + }, + { + "include": "#string_context_c" + }, + { + "include": "#comma" + }, + { + "include": "#scope_resolution_inner_generated" + }, + { + "include": "#template_call_range" + }, + { + "match": "(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*", + "name": "entity.name.type.cpp" + } + ] + }, + "3": { + "patterns": [ + { + "include": "#attributes_context" + }, + { + "include": "#number_literal" + } + ] + }, + "4": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "5": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "6": { + "name": "comment.block.cpp" + }, + "7": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "8": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "9": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "10": { + "name": "comment.block.cpp" + }, + "11": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "13": { + "patterns": [ + { + "include": "#scope_resolution_inner_generated" + } + ] + }, + "14": { + "name": "entity.name.scope-resolution.cpp" + }, + "15": { + "name": "meta.template.call.cpp", + "patterns": [ + { + "include": "#template_call_range" + } + ] + }, + "16": { + "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.cpp" + }, + "17": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "18": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "19": { + "name": "comment.block.cpp" + }, + "20": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "21": { + "name": "entity.name.type.cpp" + }, + "22": { + "patterns": [ + { + "match": "\\*", + "name": "storage.modifier.pointer.cpp" + }, + { + "match": "(?:\\&((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){2,}\\&", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "name": "invalid.illegal.reference-type.cpp" + }, + { + "match": "\\&", + "name": "storage.modifier.reference.cpp" + } + ] + }, + "23": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "24": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "25": { + "name": "comment.block.cpp" + }, + "26": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "27": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "28": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "29": { + "name": "comment.block.cpp" + }, + "30": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "31": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "32": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "33": { + "name": "comment.block.cpp" + }, + "34": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "35": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "36": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "37": { + "name": "comment.block.cpp" + }, + "38": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "39": { + "name": "storage.type.modifier.calling-convention.cpp" + }, + "40": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "41": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "42": { + "name": "comment.block.cpp" + }, + "43": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "44": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "45": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "46": { + "name": "comment.block.cpp" + }, + "47": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "48": { + "patterns": [ + { + "match": "::", + "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.operator.cpp" + }, + { + "match": "(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){2,}\\&", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "name": "invalid.illegal.reference-type.cpp" + }, + { + "match": "\\&", + "name": "entity.name.operator.type.reference.cpp" + } + ] + }, + "58": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "59": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "60": { + "name": "comment.block.cpp" + }, + "61": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "62": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "63": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "64": { + "name": "comment.block.cpp" + }, + "65": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "66": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "67": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "68": { + "name": "comment.block.cpp" + }, + "69": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "70": { + "name": "entity.name.operator.type.array.cpp" + }, + "71": { + "name": "entity.name.operator.custom-literal.cpp" + }, + "72": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "73": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "74": { + "name": "comment.block.cpp" + }, + "75": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "76": { + "name": "entity.name.operator.custom-literal.cpp" + }, + "77": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "78": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "79": { + "name": "comment.block.cpp" + }, + "80": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "end": "(?:(?<=\\}|%>|\\?\\?>)|(?=[;>\\[\\]=]))|(?|\\?\\?>)", + "endCaptures": { + "1": { + "name": "punctuation.section.block.end.bracket.curly.function.definition.special.operator-overload.cpp" + } + }, + "patterns": [ + { + "include": "#function_body_context" + } + ] + }, + { + "name": "meta.tail.function.definition.special.operator-overload.cpp", + "begin": "(?<=\\}|%>|\\?\\?>)[\\s\\n]*", + "end": "[\\s\\n]*(?=;)", + "patterns": [ + { + "include": "$base" + } + ] + } + ] + }, + "macro_safe_using_namespace": { + "name": "meta.using-namespace.cpp", + "begin": "(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)?((?|\\?\\?>)|(?=[;>\\[\\]=]))|(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)\\s*((?|\\?\\?>)", + "endCaptures": { + "1": { + "name": "punctuation.section.block.end.bracket.curly.namespace.cpp" + } + }, + "patterns": [ + { + "include": "$base" + } + ] + }, + { + "name": "meta.tail.namespace.cpp", + "begin": "(?<=\\}|%>|\\?\\?>)[\\s\\n]*", + "end": "[\\s\\n]*(?=;)", + "patterns": [ + { + "include": "$base" + } + ] + } + ] + }, + "macro_safe_extern_block": { + "name": "meta.block.extern.cpp", + "begin": "(((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(extern)(?=\\s*\\\"))", + "beginCaptures": { + "1": { + "name": "meta.head.extern.cpp" + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "name": "storage.type.extern.cpp" + } + }, + "end": "(?:(?:(?<=\\}|%>|\\?\\?>)\\s*(;)|(;))|(?=[;>\\[\\]=]))|(?|\\?\\?>)", + "endCaptures": { + "1": { + "name": "punctuation.section.block.end.bracket.curly.extern.cpp" + } + }, + "patterns": [ + { + "include": "$base" + } + ] + }, + { + "name": "meta.tail.extern.cpp", + "begin": "(?<=\\}|%>|\\?\\?>)[\\s\\n]*", + "end": "[\\s\\n]*(?=;)", + "patterns": [ + { + "include": "$base" + } + ] + }, + { + "include": "$base" + } + ] + }, + "macro_safe_typedef_class": { + "begin": "((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(DLLEXPORT)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?\\s*((?:(?\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:(?:(?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?:::))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.])))+)*))?))", + "beginCaptures": { + "1": { + "name": "meta.head.class.cpp" + }, + "3": { + "name": "storage.type.$3.cpp" + }, + "4": { + "patterns": [ + { + "include": "#attributes_context" + }, + { + "include": "#number_literal" + } + ] + }, + "5": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "6": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "7": { + "name": "comment.block.cpp" + }, + "8": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "9": { + "name": "entity.name.other.preprocessor.macro.predefined.DLLEXPORT.cpp" + }, + "10": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "11": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "12": { + "name": "comment.block.cpp" + }, + "13": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "14": { + "patterns": [ + { + "include": "#attributes_context" + }, + { + "include": "#number_literal" + } + ] + }, + "15": { + "name": "entity.name.type.$3.cpp" + }, + "16": { + "name": "storage.type.modifier.final.cpp" + }, + "17": { + "name": "punctuation.separator.colon.inheritance.cpp" + }, + "18": { + "patterns": [ + { + "include": "#inheritance_context" + } + ] + } + }, + "end": "(?:(?:(?<=\\}|%>|\\?\\?>)\\s*(;)|(;))|(?=[;>\\[\\]=]))", + "endCaptures": { + "1": { + "name": "punctuation.terminator.statement.cpp" + }, + "2": { + "name": "punctuation.terminator.statement.cpp" + } + }, + "patterns": [ + { + "name": "meta.head.class.cpp", + "begin": "\\G ?", + "end": "((?:\\{|<%|\\?\\?<|(?=;)))", + "endCaptures": { + "1": { + "name": "punctuation.section.block.begin.bracket.curly.class.cpp" + } + }, + "patterns": [ + { + "include": "#ever_present_context" + }, + { + "include": "#inheritance_context" + }, + { + "include": "#template_call_range" + } + ] + }, + { + "name": "meta.body.class.cpp", + "begin": "(?<=\\{|<%|\\?\\?<)", + "end": "(\\}|%>|\\?\\?>)", + "endCaptures": { + "1": { + "name": "punctuation.section.block.end.bracket.curly.class.cpp" + } + }, + "patterns": [ + { + "include": "#function_pointer" + }, + { + "include": "#static_assert" + }, + { + "include": "#constructor_inline" + }, + { + "include": "#destructor_inline" + }, + { + "include": "$base" + } + ] + }, + { + "name": "meta.tail.class.cpp", + "begin": "(?<=\\}|%>|\\?\\?>)[\\s\\n]*", + "end": "[\\s\\n]*(?=;)", + "patterns": [ + { + "match": "(((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))?(?:(?:\\&|\\*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:\\&|\\*))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){2,}\\&", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "name": "invalid.illegal.reference-type.cpp" + }, + { + "match": "\\&", + "name": "storage.modifier.reference.cpp" + } + ] + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "7": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "8": { + "name": "comment.block.cpp" + }, + "9": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "10": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "11": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "12": { + "name": "comment.block.cpp" + }, + "13": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "14": { + "name": "entity.name.type.alias.cpp" + } + } + }, + { + "match": "," + } + ] + } + ] + } + ] + }, + "macro_safe_typedef_struct": { + "begin": "((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(DLLEXPORT)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?\\s*((?:(?\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:(?:(?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?:::))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.])))+)*))?))", + "beginCaptures": { + "1": { + "name": "meta.head.struct.cpp" + }, + "3": { + "name": "storage.type.$3.cpp" + }, + "4": { + "patterns": [ + { + "include": "#attributes_context" + }, + { + "include": "#number_literal" + } + ] + }, + "5": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "6": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "7": { + "name": "comment.block.cpp" + }, + "8": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "9": { + "name": "entity.name.other.preprocessor.macro.predefined.DLLEXPORT.cpp" + }, + "10": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "11": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "12": { + "name": "comment.block.cpp" + }, + "13": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "14": { + "patterns": [ + { + "include": "#attributes_context" + }, + { + "include": "#number_literal" + } + ] + }, + "15": { + "name": "entity.name.type.$3.cpp" + }, + "16": { + "name": "storage.type.modifier.final.cpp" + }, + "17": { + "name": "punctuation.separator.colon.inheritance.cpp" + }, + "18": { + "patterns": [ + { + "include": "#inheritance_context" + } + ] + } + }, + "end": "(?:(?:(?<=\\}|%>|\\?\\?>)\\s*(;)|(;))|(?=[;>\\[\\]=]))", + "endCaptures": { + "1": { + "name": "punctuation.terminator.statement.cpp" + }, + "2": { + "name": "punctuation.terminator.statement.cpp" + } + }, + "patterns": [ + { + "name": "meta.head.struct.cpp", + "begin": "\\G ?", + "end": "((?:\\{|<%|\\?\\?<|(?=;)))", + "endCaptures": { + "1": { + "name": "punctuation.section.block.begin.bracket.curly.struct.cpp" + } + }, + "patterns": [ + { + "include": "#ever_present_context" + }, + { + "include": "#inheritance_context" + }, + { + "include": "#template_call_range" + } + ] + }, + { + "name": "meta.body.struct.cpp", + "begin": "(?<=\\{|<%|\\?\\?<)", + "end": "(\\}|%>|\\?\\?>)", + "endCaptures": { + "1": { + "name": "punctuation.section.block.end.bracket.curly.struct.cpp" + } + }, + "patterns": [ + { + "include": "#function_pointer" + }, + { + "include": "#static_assert" + }, + { + "include": "#constructor_inline" + }, + { + "include": "#destructor_inline" + }, + { + "include": "$base" + } + ] + }, + { + "name": "meta.tail.struct.cpp", + "begin": "(?<=\\}|%>|\\?\\?>)[\\s\\n]*", + "end": "[\\s\\n]*(?=;)", + "patterns": [ + { + "match": "(((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))?(?:(?:\\&|\\*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:\\&|\\*))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){2,}\\&", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "name": "invalid.illegal.reference-type.cpp" + }, + { + "match": "\\&", + "name": "storage.modifier.reference.cpp" + } + ] + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "7": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "8": { + "name": "comment.block.cpp" + }, + "9": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "10": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "11": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "12": { + "name": "comment.block.cpp" + }, + "13": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "14": { + "name": "entity.name.type.alias.cpp" + } + } + }, + { + "match": "," + } + ] + } + ] + } + ] + }, + "macro_safe_typedef_union": { + "begin": "((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(DLLEXPORT)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?\\s*((?:(?\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:(?:(?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?:::))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.])))+)*))?))", + "beginCaptures": { + "1": { + "name": "meta.head.union.cpp" + }, + "3": { + "name": "storage.type.$3.cpp" + }, + "4": { + "patterns": [ + { + "include": "#attributes_context" + }, + { + "include": "#number_literal" + } + ] + }, + "5": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "6": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "7": { + "name": "comment.block.cpp" + }, + "8": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "9": { + "name": "entity.name.other.preprocessor.macro.predefined.DLLEXPORT.cpp" + }, + "10": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "11": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "12": { + "name": "comment.block.cpp" + }, + "13": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "14": { + "patterns": [ + { + "include": "#attributes_context" + }, + { + "include": "#number_literal" + } + ] + }, + "15": { + "name": "entity.name.type.$3.cpp" + }, + "16": { + "name": "storage.type.modifier.final.cpp" + }, + "17": { + "name": "punctuation.separator.colon.inheritance.cpp" + }, + "18": { + "patterns": [ + { + "include": "#inheritance_context" + } + ] + } + }, + "end": "(?:(?:(?<=\\}|%>|\\?\\?>)\\s*(;)|(;))|(?=[;>\\[\\]=]))", + "endCaptures": { + "1": { + "name": "punctuation.terminator.statement.cpp" + }, + "2": { + "name": "punctuation.terminator.statement.cpp" + } + }, + "patterns": [ + { + "name": "meta.head.union.cpp", + "begin": "\\G ?", + "end": "((?:\\{|<%|\\?\\?<|(?=;)))", + "endCaptures": { + "1": { + "name": "punctuation.section.block.begin.bracket.curly.union.cpp" + } + }, + "patterns": [ + { + "include": "#ever_present_context" + }, + { + "include": "#inheritance_context" + }, + { + "include": "#template_call_range" + } + ] + }, + { + "name": "meta.body.union.cpp", + "begin": "(?<=\\{|<%|\\?\\?<)", + "end": "(\\}|%>|\\?\\?>)", + "endCaptures": { + "1": { + "name": "punctuation.section.block.end.bracket.curly.union.cpp" + } + }, + "patterns": [ + { + "include": "#function_pointer" + }, + { + "include": "#static_assert" + }, + { + "include": "#constructor_inline" + }, + { + "include": "#destructor_inline" + }, + { + "include": "$base" + } + ] + }, + { + "name": "meta.tail.union.cpp", + "begin": "(?<=\\}|%>|\\?\\?>)[\\s\\n]*", + "end": "[\\s\\n]*(?=;)", + "patterns": [ + { + "match": "(((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))?(?:(?:\\&|\\*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:\\&|\\*))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){2,}\\&", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "name": "invalid.illegal.reference-type.cpp" + }, + { + "match": "\\&", + "name": "storage.modifier.reference.cpp" + } + ] + }, + "2": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "3": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "4": { + "name": "comment.block.cpp" + }, + "5": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "6": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "7": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "8": { + "name": "comment.block.cpp" + }, + "9": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "10": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "11": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "12": { + "name": "comment.block.cpp" + }, + "13": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "14": { + "name": "entity.name.type.alias.cpp" + } + } + }, + { + "match": "," + } + ] + } + ] + } + ] + }, + "macro_safe_class_block": { + "name": "meta.block.class.cpp", + "begin": "((((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(DLLEXPORT)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?\\s*((?:(?\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:(?:(?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?:::))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.])))+)*))?))", + "beginCaptures": { + "1": { + "name": "meta.head.class.cpp" + }, + "3": { + "name": "storage.type.$3.cpp" + }, + "4": { + "patterns": [ + { + "include": "#attributes_context" + }, + { + "include": "#number_literal" + } + ] + }, + "5": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "6": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "7": { + "name": "comment.block.cpp" + }, + "8": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "9": { + "name": "entity.name.other.preprocessor.macro.predefined.DLLEXPORT.cpp" + }, + "10": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "11": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "12": { + "name": "comment.block.cpp" + }, + "13": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "14": { + "patterns": [ + { + "include": "#attributes_context" + }, + { + "include": "#number_literal" + } + ] + }, + "15": { + "name": "entity.name.type.$3.cpp" + }, + "16": { + "name": "storage.type.modifier.final.cpp" + }, + "17": { + "name": "punctuation.separator.colon.inheritance.cpp" + }, + "18": { + "patterns": [ + { + "include": "#inheritance_context" + } + ] + } + }, + "end": "(?:(?:(?<=\\}|%>|\\?\\?>)\\s*(;)|(;))|(?=[;>\\[\\]=]))|(?|\\?\\?>)", + "endCaptures": { + "1": { + "name": "punctuation.section.block.end.bracket.curly.class.cpp" + } + }, + "patterns": [ + { + "include": "#function_pointer" + }, + { + "include": "#static_assert" + }, + { + "include": "#constructor_inline" + }, + { + "include": "#destructor_inline" + }, + { + "include": "$base" + } + ] + }, + { + "name": "meta.tail.class.cpp", + "begin": "(?<=\\}|%>|\\?\\?>)[\\s\\n]*", + "end": "[\\s\\n]*(?=;)", + "patterns": [ + { + "include": "$base" + } + ] + } + ] + }, + "macro_safe_struct_block": { + "name": "meta.block.struct.cpp", + "begin": "((((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(DLLEXPORT)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?\\s*((?:(?\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:(?:(?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?:::))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.])))+)*))?))", + "beginCaptures": { + "1": { + "name": "meta.head.struct.cpp" + }, + "3": { + "name": "storage.type.$3.cpp" + }, + "4": { + "patterns": [ + { + "include": "#attributes_context" + }, + { + "include": "#number_literal" + } + ] + }, + "5": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "6": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "7": { + "name": "comment.block.cpp" + }, + "8": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "9": { + "name": "entity.name.other.preprocessor.macro.predefined.DLLEXPORT.cpp" + }, + "10": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "11": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "12": { + "name": "comment.block.cpp" + }, + "13": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "14": { + "patterns": [ + { + "include": "#attributes_context" + }, + { + "include": "#number_literal" + } + ] + }, + "15": { + "name": "entity.name.type.$3.cpp" + }, + "16": { + "name": "storage.type.modifier.final.cpp" + }, + "17": { + "name": "punctuation.separator.colon.inheritance.cpp" + }, + "18": { + "patterns": [ + { + "include": "#inheritance_context" + } + ] + } + }, + "end": "(?:(?:(?<=\\}|%>|\\?\\?>)\\s*(;)|(;))|(?=[;>\\[\\]=]))|(?|\\?\\?>)", + "endCaptures": { + "1": { + "name": "punctuation.section.block.end.bracket.curly.struct.cpp" + } + }, + "patterns": [ + { + "include": "#function_pointer" + }, + { + "include": "#static_assert" + }, + { + "include": "#constructor_inline" + }, + { + "include": "#destructor_inline" + }, + { + "include": "$base" + } + ] + }, + { + "name": "meta.tail.struct.cpp", + "begin": "(?<=\\}|%>|\\?\\?>)[\\s\\n]*", + "end": "[\\s\\n]*(?=;)", + "patterns": [ + { + "include": "$base" + } + ] + } + ] + }, + "macro_safe_union_block": { + "name": "meta.block.union.cpp", + "begin": "((((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(DLLEXPORT)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))?((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\(\\(.*?\\)\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?\\s*((?:(?\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:(?:(?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?:::))?(?:(?:(?:(?>\\s+)|(?:\\/\\*)(?:(?>(?:[^\\*]|(?>\\*+)[^\\/])*)(?:(?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.])))+)*))?))", + "beginCaptures": { + "1": { + "name": "meta.head.union.cpp" + }, + "3": { + "name": "storage.type.$3.cpp" + }, + "4": { + "patterns": [ + { + "include": "#attributes_context" + }, + { + "include": "#number_literal" + } + ] + }, + "5": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "6": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "7": { + "name": "comment.block.cpp" + }, + "8": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "9": { + "name": "entity.name.other.preprocessor.macro.predefined.DLLEXPORT.cpp" + }, + "10": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "11": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "12": { + "name": "comment.block.cpp" + }, + "13": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "14": { + "patterns": [ + { + "include": "#attributes_context" + }, + { + "include": "#number_literal" + } + ] + }, + "15": { + "name": "entity.name.type.$3.cpp" + }, + "16": { + "name": "storage.type.modifier.final.cpp" + }, + "17": { + "name": "punctuation.separator.colon.inheritance.cpp" + }, + "18": { + "patterns": [ + { + "include": "#inheritance_context" + } + ] + } + }, + "end": "(?:(?:(?<=\\}|%>|\\?\\?>)\\s*(;)|(;))|(?=[;>\\[\\]=]))|(?|\\?\\?>)", + "endCaptures": { + "1": { + "name": "punctuation.section.block.end.bracket.curly.union.cpp" + } + }, + "patterns": [ + { + "include": "#function_pointer" + }, + { + "include": "#static_assert" + }, + { + "include": "#constructor_inline" + }, + { + "include": "#destructor_inline" + }, + { + "include": "$base" + } + ] + }, + { + "name": "meta.tail.union.cpp", + "begin": "(?<=\\}|%>|\\?\\?>)[\\s\\n]*", + "end": "[\\s\\n]*(?=;)", + "patterns": [ + { + "include": "$base" + } + ] + } + ] + }, + "macro_safe_enum_block": { + "name": "meta.block.enum.cpp", + "begin": "(((?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?\\s*((?|\\?\\?>)\\s*(;)|(;))|(?=[;>\\[\\]=]))|(?|\\?\\?>)", + "endCaptures": { + "1": { + "name": "punctuation.section.block.end.bracket.curly.enum.cpp" + } + }, + "patterns": [ + { + "include": "#enumerator_list" + }, + { + "include": "#comments" + }, + { + "include": "#comma" + }, + { + "include": "#semicolon" + } + ] + }, + { + "name": "meta.tail.enum.cpp", + "begin": "(?<=\\}|%>|\\?\\?>)[\\s\\n]*", + "end": "[\\s\\n]*(?=;)", + "patterns": [ + { + "include": "$base" + } + ] + } + ] + }, + "macro_safe_template_definition": { + "name": "meta.template.definition.cpp", + "begin": "(?)|(?)", + "endCaptures": { + "1": { + "name": "punctuation.section.angle-brackets.begin.template.call.cpp" + } + }, + "patterns": [ + { + "include": "#template_call_context" + } + ] + }, + { + "include": "#template_definition_context" + } + ] + }, + "macro_safe_block": { + "name": "meta.block.cpp", + "begin": "({)", + "beginCaptures": { + "1": { + "name": "punctuation.section.block.begin.bracket.curly.cpp" + } + }, + "end": "(}|(?=\\s*#\\s*(?:elif|else|endif)\\b))|(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))((?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\()", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "5": { + "name": "keyword.other.static_assert.cpp" + }, + "6": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "7": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "8": { + "name": "comment.block.cpp" + }, + "9": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "10": { + "name": "punctuation.section.arguments.begin.bracket.round.static_assert.cpp" + } + }, + "end": "(\\))|(?\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?:(?:(?:short|signed|unsigned|long)|(?:class|struct|union|enum))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(((?:::)?(?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\s*+(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\s*+((?]*|[^>]*+<[^>]*+>)++>\\s*)?(::))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?!(?:not|compl|sizeof|new|delete|not_eq|bitand|xor|bitor|and|or|throw|and_eq|xor_eq|or_eq|alignof|alignas|typeid|noexcept|noexcept|static_cast|dynamic_cast|const_cast|reinterpret_cast|while|for|do|if|else|goto|switch|try|catch|return|break|case|continue|default|NULL|true|false|nullptr|const|static|volatile|register|restrict|extern|inline|constexpr|mutable|friend|explicit|virtual|final|override|volatile|const|noexcept|constexpr|mutable|constexpr|consteval|private|protected|public|if|elif|else|endif|ifdef|ifndef|define|undef|include|line|error|warning|pragma|_Pragma|defined|__has_include|__has_cpp_attribute|this|template|namespace|using|operator|typedef|decltype|typename|asm|__asm__|concept|requires|export|thread_local|atomic_cancel|atomic_commit|atomic_noexcept|co_await|co_return|co_yield|import|module|reflexpr|synchronized|audit|axiom|transaction_safe|transaction_safe_dynamic)\\b)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?:(?]*|[^>]*+<[^>]*+>)++>\\s*)?(?![\\w<:.]))(((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))?(?:(?:\\&|\\*)((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z))))*(?:\\&|\\*))?((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(\\()(\\*)\\s*((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)?)\\s*(?:(\\[)(\\w*)(\\])\\s*)*(\\))\\s*(\\()", + "beginCaptures": { + "1": { + "name": "meta.qualified_type.cpp", + "patterns": [ + { + "match": "(?:class|struct|union|enum)", + "name": "storage.type.$0.cpp" + }, + { + "include": "#attributes_context" + }, + { + "include": "#function_type" + }, + { + "include": "#storage_types" + }, + { + "include": "#number_literal" + }, + { + "include": "#string_context_c" + }, + { + "include": "#comma" + }, + { + "include": "#scope_resolution_inner_generated" + }, + { + "include": "#template_call_range" + }, + { + "match": "(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*", + "name": "entity.name.type.cpp" + } + ] + }, + "2": { + "patterns": [ + { + "include": "#attributes_context" + }, + { + "include": "#number_literal" + } + ] + }, + "3": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "4": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "5": { + "name": "comment.block.cpp" + }, + "6": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "7": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "8": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "9": { + "name": "comment.block.cpp" + }, + "10": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "12": { + "patterns": [ + { + "include": "#scope_resolution_inner_generated" + } + ] + }, + "13": { + "name": "entity.name.scope-resolution.cpp" + }, + "14": { + "name": "meta.template.call.cpp", + "patterns": [ + { + "include": "#template_call_range" + } + ] + }, + "15": { + "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.cpp" + }, + "16": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "17": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "18": { + "name": "comment.block.cpp" + }, + "19": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "20": { + "name": "entity.name.type.cpp" + }, + "21": { + "patterns": [ + { + "match": "\\*", + "name": "storage.modifier.pointer.cpp" + }, + { + "match": "(?:\\&((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))){2,}\\&", + "captures": { + "1": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "2": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "3": { + "name": "comment.block.cpp" + }, + "4": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + } + }, + "name": "invalid.illegal.reference-type.cpp" + }, + { + "match": "\\&", + "name": "storage.modifier.reference.cpp" + } + ] + }, + "22": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "23": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "24": { + "name": "comment.block.cpp" + }, + "25": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "26": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "27": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "28": { + "name": "comment.block.cpp" + }, + "29": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "30": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "31": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "32": { + "name": "comment.block.cpp" + }, + "33": { + "patterns": [ + { + "match": "\\*\\/", + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, + { + "match": "\\*", + "name": "comment.block.cpp" + } + ] + }, + "34": { + "name": "punctuation.section.parens.begin.bracket.round.function.pointer.cpp" + }, + "35": { + "name": "punctuation.definition.function.pointer.dereference.cpp" + }, + "36": { + "name": "variable.other.definition.pointer.function.cpp" + }, + "37": { + "name": "punctuation.definition.begin.bracket.square.cpp" + }, + "38": { + "patterns": [ + { + "include": "#evaluation_context" + } + ] + }, + "39": { + "name": "punctuation.definition.end.bracket.square.cpp" + }, + "40": { + "name": "punctuation.section.parens.end.bracket.round.function.pointer.cpp" + }, + "41": { + "name": "punctuation.section.parameters.begin.bracket.round.function.pointer.cpp" + } + }, + "end": "(\\))((?:(?:(?>\\s+)|(\\/\\*)((?>(?:[^\\*]|(?>\\*+)[^\\/])*)((?>\\*+)\\/)))+?|(?:(?:(?:(?:\\b|(?<=\\W))|(?=\\W))|\\A)|\\Z)))(?=[{=,);]|\\n)(?!\\()|(?", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp keyword.operator.comparison.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp keyword.operator.comparison.cpp", "r": { "dark_plus": "keyword.operator: #D4D4D4", "light_plus": "keyword.operator: #000000", @@ -1266,7 +1266,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1277,7 +1277,7 @@ }, { "c": "o", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp entity.name.function.call.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp entity.name.function.call.cpp", "r": { "dark_plus": "entity.name.function: #DCDCAA", "light_plus": "entity.name.function: #795E26", @@ -1288,7 +1288,7 @@ }, { "c": "(", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.arguments.begin.bracket.round.function.call.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.arguments.begin.bracket.round.function.call.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1299,7 +1299,7 @@ }, { "c": "new", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp keyword.operator.wordlike.cpp keyword.operator.new.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp keyword.operator.wordlike.cpp keyword.operator.new.cpp", "r": { "dark_plus": "source.cpp keyword.operator.new: #C586C0", "light_plus": "source.cpp keyword.operator.new: #AF00DB", @@ -1310,7 +1310,7 @@ }, { "c": " O", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1321,7 +1321,7 @@ }, { "c": ")", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.arguments.end.bracket.round.function.call.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.arguments.end.bracket.round.function.call.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1332,7 +1332,7 @@ }, { "c": ";", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1343,7 +1343,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp comment.line.double-slash.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp comment.line.double-slash.cpp", "r": { "dark_plus": "comment: #6A9955", "light_plus": "comment: #008000", @@ -1354,7 +1354,7 @@ }, { "c": "//", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp comment.line.double-slash.cpp punctuation.definition.comment.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp comment.line.double-slash.cpp punctuation.definition.comment.cpp", "r": { "dark_plus": "comment: #6A9955", "light_plus": "comment: #008000", @@ -1365,7 +1365,7 @@ }, { "c": " sadness.", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp comment.line.double-slash.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp comment.line.double-slash.cpp", "r": { "dark_plus": "comment: #6A9955", "light_plus": "comment: #008000", @@ -1376,7 +1376,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1387,7 +1387,7 @@ }, { "c": "sprintf", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp entity.name.function.call.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp entity.name.function.call.cpp", "r": { "dark_plus": "entity.name.function: #DCDCAA", "light_plus": "entity.name.function: #795E26", @@ -1398,7 +1398,7 @@ }, { "c": "(", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.arguments.begin.bracket.round.function.call.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.arguments.begin.bracket.round.function.call.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1409,7 +1409,7 @@ }, { "c": "options", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1420,7 +1420,7 @@ }, { "c": ",", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp comma.cpp punctuation.separator.delimiter.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.separator.delimiter.comma.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1431,7 +1431,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1442,7 +1442,7 @@ }, { "c": "\"", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp punctuation.definition.string.begin.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp punctuation.definition.string.begin.cpp", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -1453,7 +1453,7 @@ }, { "c": "STYLE=Keramik;TITLE=", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -1464,7 +1464,7 @@ }, { "c": "%s", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp constant.other.placeholder.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp constant.other.placeholder.cpp", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -1475,7 +1475,7 @@ }, { "c": ";THEME=", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -1486,7 +1486,7 @@ }, { "c": "%s", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp constant.other.placeholder.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp constant.other.placeholder.cpp", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -1497,7 +1497,7 @@ }, { "c": "\"", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp punctuation.definition.string.end.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp punctuation.definition.string.end.cpp", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -1508,7 +1508,7 @@ }, { "c": ",", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp comma.cpp punctuation.separator.delimiter.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.separator.delimiter.comma.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1519,7 +1519,7 @@ }, { "c": " ...", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1530,7 +1530,7 @@ }, { "c": ")", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.arguments.end.bracket.round.function.call.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.arguments.end.bracket.round.function.call.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1541,7 +1541,7 @@ }, { "c": ";", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1552,7 +1552,7 @@ }, { "c": "}", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.block.end.bracket.curly.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.block.end.bracket.curly.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1563,7 +1563,7 @@ }, { "c": "int", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.qualified_type.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", + "t": "source.cpp meta.function.definition.cpp meta.qualified_type.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", "r": { "dark_plus": "storage.type: #569CD6", "light_plus": "storage.type: #0000FF", @@ -1574,7 +1574,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1585,7 +1585,7 @@ }, { "c": "main2", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp entity.name.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.head.function.definition.cpp entity.name.function.definition.cpp", "r": { "dark_plus": "entity.name.function: #DCDCAA", "light_plus": "entity.name.function: #795E26", @@ -1596,7 +1596,7 @@ }, { "c": "(", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.parameters.begin.bracket.round.cpp", + "t": "source.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.parameters.begin.bracket.round.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1607,7 +1607,7 @@ }, { "c": ")", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.parameters.end.bracket.round.cpp", + "t": "source.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.parameters.end.bracket.round.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1618,7 +1618,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.head.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1629,7 +1629,7 @@ }, { "c": "{", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.block.begin.bracket.curly.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.block.begin.bracket.curly.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1640,7 +1640,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1651,7 +1651,7 @@ }, { "c": "printf", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp entity.name.function.call.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp entity.name.function.call.cpp", "r": { "dark_plus": "entity.name.function: #DCDCAA", "light_plus": "entity.name.function: #795E26", @@ -1662,7 +1662,7 @@ }, { "c": "(", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.arguments.begin.bracket.round.function.call.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.arguments.begin.bracket.round.function.call.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1673,7 +1673,7 @@ }, { "c": "\"", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp punctuation.definition.string.begin.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp punctuation.definition.string.begin.cpp", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -1684,7 +1684,7 @@ }, { "c": ";", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -1695,7 +1695,7 @@ }, { "c": "\"", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp punctuation.definition.string.end.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp punctuation.definition.string.end.cpp", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -1706,7 +1706,7 @@ }, { "c": ")", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.arguments.end.bracket.round.function.call.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.arguments.end.bracket.round.function.call.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1717,7 +1717,7 @@ }, { "c": ";", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1728,7 +1728,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp comment.line.double-slash.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp comment.line.double-slash.cpp", "r": { "dark_plus": "comment: #6A9955", "light_plus": "comment: #008000", @@ -1739,7 +1739,7 @@ }, { "c": "//", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp comment.line.double-slash.cpp punctuation.definition.comment.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp comment.line.double-slash.cpp punctuation.definition.comment.cpp", "r": { "dark_plus": "comment: #6A9955", "light_plus": "comment: #008000", @@ -1750,7 +1750,7 @@ }, { "c": " the rest of", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp comment.line.double-slash.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp comment.line.double-slash.cpp", "r": { "dark_plus": "comment: #6A9955", "light_plus": "comment: #008000", @@ -1761,7 +1761,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1772,7 +1772,7 @@ }, { "c": "asm", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.asm.cpp storage.type.asm.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.asm.cpp storage.type.asm.cpp", "r": { "dark_plus": "storage.type: #569CD6", "light_plus": "storage.type: #0000FF", @@ -1783,7 +1783,7 @@ }, { "c": "(", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.asm.cpp punctuation.section.parens.begin.bracket.round.assembly.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.asm.cpp punctuation.section.parens.begin.bracket.round.assembly.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1794,7 +1794,7 @@ }, { "c": "\"", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.asm.cpp string.quoted.double.cpp punctuation.definition.string.begin.assembly.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.asm.cpp string.quoted.double.cpp punctuation.definition.string.begin.assembly.cpp", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -1805,7 +1805,7 @@ }, { "c": "movw $0x38, %ax; ltr %ax", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.asm.cpp string.quoted.double.cpp meta.embedded.assembly.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.asm.cpp string.quoted.double.cpp meta.embedded.assembly.cpp", "r": { "dark_plus": "meta.embedded: #D4D4D4", "light_plus": "meta.embedded: #000000", @@ -1816,7 +1816,7 @@ }, { "c": "\"", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.asm.cpp string.quoted.double.cpp punctuation.definition.string.end.assembly.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.asm.cpp string.quoted.double.cpp punctuation.definition.string.end.assembly.cpp", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -1827,7 +1827,7 @@ }, { "c": ")", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.asm.cpp punctuation.section.parens.end.bracket.round.assembly.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.asm.cpp punctuation.section.parens.end.bracket.round.assembly.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1838,7 +1838,7 @@ }, { "c": ";", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1849,7 +1849,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1860,7 +1860,7 @@ }, { "c": "fn", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp entity.name.function.call.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp entity.name.function.call.cpp", "r": { "dark_plus": "entity.name.function: #DCDCAA", "light_plus": "entity.name.function: #795E26", @@ -1871,7 +1871,7 @@ }, { "c": "(", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.arguments.begin.bracket.round.function.call.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.arguments.begin.bracket.round.function.call.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1882,7 +1882,7 @@ }, { "c": "\"", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp punctuation.definition.string.begin.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp punctuation.definition.string.begin.cpp", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -1893,7 +1893,7 @@ }, { "c": "{};", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -1904,7 +1904,7 @@ }, { "c": "\"", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp punctuation.definition.string.end.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp punctuation.definition.string.end.cpp", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -1915,7 +1915,7 @@ }, { "c": ")", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.arguments.end.bracket.round.function.call.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.arguments.end.bracket.round.function.call.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1926,7 +1926,7 @@ }, { "c": ";", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1937,7 +1937,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp comment.line.double-slash.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp comment.line.double-slash.cpp", "r": { "dark_plus": "comment: #6A9955", "light_plus": "comment: #008000", @@ -1948,7 +1948,7 @@ }, { "c": "//", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp comment.line.double-slash.cpp punctuation.definition.comment.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp comment.line.double-slash.cpp punctuation.definition.comment.cpp", "r": { "dark_plus": "comment: #6A9955", "light_plus": "comment: #008000", @@ -1959,7 +1959,7 @@ }, { "c": " the rest of", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp comment.line.double-slash.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp comment.line.double-slash.cpp", "r": { "dark_plus": "comment: #6A9955", "light_plus": "comment: #008000", @@ -1970,7 +1970,7 @@ }, { "c": "}", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.block.end.bracket.curly.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.block.end.bracket.curly.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", diff --git a/extensions/cpp/test/colorize-results/test_cpp.json b/extensions/cpp/test/colorize-results/test_cpp.json index bf47c52c329..0cda6fbe21a 100644 --- a/extensions/cpp/test/colorize-results/test_cpp.json +++ b/extensions/cpp/test/colorize-results/test_cpp.json @@ -1,7 +1,7 @@ [ { "c": "//", - "t": "source.cpp source.cpp comment.line.double-slash.cpp punctuation.definition.comment.cpp", + "t": "source.cpp comment.line.double-slash.cpp punctuation.definition.comment.cpp", "r": { "dark_plus": "comment: #6A9955", "light_plus": "comment: #008000", @@ -12,7 +12,7 @@ }, { "c": " classes example", - "t": "source.cpp source.cpp comment.line.double-slash.cpp", + "t": "source.cpp comment.line.double-slash.cpp", "r": { "dark_plus": "comment: #6A9955", "light_plus": "comment: #008000", @@ -22,74 +22,63 @@ } }, { - "c": "#", - "t": "source.cpp source.cpp meta.preprocessor.include.cpp keyword.control.directive.include.cpp punctuation.definition.directive.cpp", + "c": "#include", + "t": "source.cpp variable.other.macro.argument.cpp", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #C586C0" - } - }, - { - "c": "include", - "t": "source.cpp source.cpp meta.preprocessor.include.cpp keyword.control.directive.include.cpp", - "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #C586C0" + "dark_plus": "variable: #9CDCFE", + "light_plus": "variable: #001080", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "variable: #9CDCFE" } }, { "c": " ", - "t": "source.cpp source.cpp meta.preprocessor.include.cpp", + "t": "source.cpp", "r": { - "dark_plus": "meta.preprocessor: #569CD6", - "light_plus": "meta.preprocessor: #0000FF", - "dark_vs": "meta.preprocessor: #569CD6", - "light_vs": "meta.preprocessor: #0000FF", - "hc_black": "meta.preprocessor: #569CD6" + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" } }, { "c": "<", - "t": "source.cpp source.cpp meta.preprocessor.include.cpp string.quoted.other.lt-gt.include.cpp punctuation.definition.string.begin.cpp", + "t": "source.cpp keyword.operator.comparison.cpp", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" } }, { "c": "iostream", - "t": "source.cpp source.cpp meta.preprocessor.include.cpp string.quoted.other.lt-gt.include.cpp", + "t": "source.cpp", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" } }, { "c": ">", - "t": "source.cpp source.cpp meta.preprocessor.include.cpp string.quoted.other.lt-gt.include.cpp punctuation.definition.string.end.cpp", + "t": "source.cpp keyword.operator.comparison.cpp", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" } }, { "c": "using", - "t": "source.cpp source.cpp meta.using-namespace.cpp keyword.other.using.directive.cpp", + "t": "source.cpp meta.using-namespace.cpp keyword.other.using.directive.cpp", "r": { "dark_plus": "keyword.other.using: #C586C0", "light_plus": "keyword.other.using: #AF00DB", @@ -100,7 +89,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.using-namespace.cpp", + "t": "source.cpp meta.using-namespace.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -111,7 +100,7 @@ }, { "c": "namespace", - "t": "source.cpp source.cpp meta.using-namespace.cpp keyword.other.namespace.directive.cpp storage.type.namespace.directive.cpp", + "t": "source.cpp meta.using-namespace.cpp keyword.other.namespace.directive.cpp storage.type.namespace.directive.cpp", "r": { "dark_plus": "storage.type: #569CD6", "light_plus": "storage.type: #0000FF", @@ -122,7 +111,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.using-namespace.cpp", + "t": "source.cpp meta.using-namespace.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -133,7 +122,7 @@ }, { "c": "std", - "t": "source.cpp source.cpp meta.using-namespace.cpp entity.name.namespace.cpp", + "t": "source.cpp meta.using-namespace.cpp entity.name.namespace.cpp", "r": { "dark_plus": "entity.name.namespace: #4EC9B0", "light_plus": "entity.name.namespace: #267F99", @@ -144,7 +133,7 @@ }, { "c": ";", - "t": "source.cpp source.cpp meta.using-namespace.cpp punctuation.terminator.statement.cpp", + "t": "source.cpp meta.using-namespace.cpp punctuation.terminator.statement.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -155,7 +144,7 @@ }, { "c": "#", - "t": "source.cpp source.cpp meta.preprocessor.macro.cpp keyword.control.directive.define.cpp punctuation.definition.directive.cpp", + "t": "source.cpp meta.preprocessor.macro.cpp keyword.control.directive.define.cpp punctuation.definition.directive.cpp", "r": { "dark_plus": "keyword.control: #C586C0", "light_plus": "keyword.control: #AF00DB", @@ -166,7 +155,7 @@ }, { "c": "define", - "t": "source.cpp source.cpp meta.preprocessor.macro.cpp keyword.control.directive.define.cpp", + "t": "source.cpp meta.preprocessor.macro.cpp keyword.control.directive.define.cpp", "r": { "dark_plus": "keyword.control: #C586C0", "light_plus": "keyword.control: #AF00DB", @@ -177,7 +166,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.preprocessor.macro.cpp", + "t": "source.cpp meta.preprocessor.macro.cpp", "r": { "dark_plus": "meta.preprocessor: #569CD6", "light_plus": "meta.preprocessor: #0000FF", @@ -188,7 +177,7 @@ }, { "c": "EXTERN_C", - "t": "source.cpp source.cpp meta.preprocessor.macro.cpp entity.name.function.preprocessor.cpp", + "t": "source.cpp meta.preprocessor.macro.cpp entity.name.function.preprocessor.cpp", "r": { "dark_plus": "entity.name.function: #DCDCAA", "light_plus": "entity.name.function: #795E26", @@ -199,7 +188,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.preprocessor.macro.cpp", + "t": "source.cpp meta.preprocessor.macro.cpp meta.block.extern.cpp", "r": { "dark_plus": "meta.preprocessor: #569CD6", "light_plus": "meta.preprocessor: #0000FF", @@ -210,7 +199,7 @@ }, { "c": "extern", - "t": "source.cpp source.cpp meta.preprocessor.macro.cpp meta.block.extern.cpp meta.head.extern.cpp storage.type.extern.cpp", + "t": "source.cpp meta.preprocessor.macro.cpp meta.block.extern.cpp meta.head.extern.cpp storage.type.extern.cpp", "r": { "dark_plus": "storage.type: #569CD6", "light_plus": "storage.type: #0000FF", @@ -221,7 +210,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.preprocessor.macro.cpp meta.block.extern.cpp meta.head.extern.cpp", + "t": "source.cpp meta.preprocessor.macro.cpp meta.block.extern.cpp meta.head.extern.cpp", "r": { "dark_plus": "meta.preprocessor: #569CD6", "light_plus": "meta.preprocessor: #0000FF", @@ -232,7 +221,7 @@ }, { "c": "\"", - "t": "source.cpp source.cpp meta.preprocessor.macro.cpp meta.block.extern.cpp meta.head.extern.cpp string.quoted.double.cpp punctuation.definition.string.begin.cpp", + "t": "source.cpp meta.preprocessor.macro.cpp meta.block.extern.cpp meta.head.extern.cpp string.quoted.double.cpp punctuation.definition.string.begin.cpp", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -243,7 +232,7 @@ }, { "c": "C", - "t": "source.cpp source.cpp meta.preprocessor.macro.cpp meta.block.extern.cpp meta.head.extern.cpp string.quoted.double.cpp", + "t": "source.cpp meta.preprocessor.macro.cpp meta.block.extern.cpp meta.head.extern.cpp string.quoted.double.cpp", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -254,7 +243,7 @@ }, { "c": "\"", - "t": "source.cpp source.cpp meta.preprocessor.macro.cpp meta.block.extern.cpp meta.head.extern.cpp string.quoted.double.cpp punctuation.definition.string.end.cpp", + "t": "source.cpp meta.preprocessor.macro.cpp meta.block.extern.cpp meta.head.extern.cpp string.quoted.double.cpp punctuation.definition.string.end.cpp", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -265,7 +254,7 @@ }, { "c": "class", - "t": "source.cpp source.cpp meta.block.class.cpp meta.head.class.cpp storage.type.class.cpp", + "t": "source.cpp meta.block.class.cpp meta.head.class.cpp storage.type.class.cpp", "r": { "dark_plus": "storage.type: #569CD6", "light_plus": "storage.type: #0000FF", @@ -276,7 +265,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.block.class.cpp meta.head.class.cpp", + "t": "source.cpp meta.block.class.cpp meta.head.class.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -287,7 +276,7 @@ }, { "c": "Rectangle", - "t": "source.cpp source.cpp meta.block.class.cpp meta.head.class.cpp entity.name.type.class.cpp", + "t": "source.cpp meta.block.class.cpp meta.head.class.cpp entity.name.type.class.cpp", "r": { "dark_plus": "entity.name.type: #4EC9B0", "light_plus": "entity.name.type: #267F99", @@ -298,7 +287,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.block.class.cpp meta.head.class.cpp", + "t": "source.cpp meta.block.class.cpp meta.head.class.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -309,7 +298,7 @@ }, { "c": "{", - "t": "source.cpp source.cpp meta.block.class.cpp meta.head.class.cpp punctuation.section.block.begin.bracket.curly.class.cpp", + "t": "source.cpp meta.block.class.cpp meta.head.class.cpp punctuation.section.block.begin.bracket.curly.class.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -320,7 +309,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -331,7 +320,7 @@ }, { "c": "int", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", "r": { "dark_plus": "storage.type: #569CD6", "light_plus": "storage.type: #0000FF", @@ -342,7 +331,7 @@ }, { "c": " width", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -353,7 +342,7 @@ }, { "c": ",", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp comma.cpp punctuation.separator.delimiter.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp punctuation.separator.delimiter.comma.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -364,7 +353,7 @@ }, { "c": " height", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -375,7 +364,7 @@ }, { "c": ";", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp punctuation.terminator.statement.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp punctuation.terminator.statement.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -386,7 +375,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -397,7 +386,7 @@ }, { "c": "public", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp storage.type.modifier.access.control.public.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp storage.type.modifier.access.control.public.cpp", "r": { "dark_plus": "storage.type: #569CD6", "light_plus": "storage.type: #0000FF", @@ -408,7 +397,7 @@ }, { "c": ":", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp storage.type.modifier.access.control.public.cpp colon.cpp punctuation.separator.delimiter.colon.access.control.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp storage.type.modifier.access.control.public.cpp punctuation.separator.colon.access.control.cpp", "r": { "dark_plus": "storage.type: #569CD6", "light_plus": "storage.type: #0000FF", @@ -419,7 +408,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -430,7 +419,7 @@ }, { "c": "void", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.qualified_type.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.qualified_type.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", "r": { "dark_plus": "storage.type: #569CD6", "light_plus": "storage.type: #0000FF", @@ -441,7 +430,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -452,7 +441,7 @@ }, { "c": "set_values", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp entity.name.function.definition.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp entity.name.function.definition.cpp", "r": { "dark_plus": "entity.name.function: #DCDCAA", "light_plus": "entity.name.function: #795E26", @@ -463,7 +452,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -474,7 +463,7 @@ }, { "c": "(", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.parameters.begin.bracket.round.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.parameters.begin.bracket.round.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -485,7 +474,7 @@ }, { "c": "int", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", "r": { "dark_plus": "storage.type: #569CD6", "light_plus": "storage.type: #0000FF", @@ -496,7 +485,7 @@ }, { "c": ",", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp comma.cpp punctuation.separator.delimiter.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp punctuation.separator.delimiter.comma.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -507,7 +496,7 @@ }, { "c": "int", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", "r": { "dark_plus": "storage.type: #569CD6", "light_plus": "storage.type: #0000FF", @@ -518,7 +507,7 @@ }, { "c": ")", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.parameters.end.bracket.round.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.parameters.end.bracket.round.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -529,7 +518,7 @@ }, { "c": ";", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp punctuation.terminator.statement.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp punctuation.terminator.statement.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -540,7 +529,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -551,7 +540,7 @@ }, { "c": "int", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.qualified_type.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.qualified_type.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", "r": { "dark_plus": "storage.type: #569CD6", "light_plus": "storage.type: #0000FF", @@ -562,7 +551,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -573,7 +562,7 @@ }, { "c": "area", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp entity.name.function.definition.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp entity.name.function.definition.cpp", "r": { "dark_plus": "entity.name.function: #DCDCAA", "light_plus": "entity.name.function: #795E26", @@ -584,7 +573,7 @@ }, { "c": "(", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.parameters.begin.bracket.round.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.parameters.begin.bracket.round.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -595,7 +584,7 @@ }, { "c": ")", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.parameters.end.bracket.round.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.parameters.end.bracket.round.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -606,7 +595,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -617,7 +606,7 @@ }, { "c": "{", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.block.begin.bracket.curly.function.definition.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.block.begin.bracket.curly.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -628,7 +617,7 @@ }, { "c": "return", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.body.function.definition.cpp keyword.control.return.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.body.function.definition.cpp keyword.control.return.cpp", "r": { "dark_plus": "keyword.control: #C586C0", "light_plus": "keyword.control: #AF00DB", @@ -639,7 +628,7 @@ }, { "c": " width", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.body.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -650,7 +639,7 @@ }, { "c": "*", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.body.function.definition.cpp keyword.operator.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.body.function.definition.cpp keyword.operator.cpp", "r": { "dark_plus": "keyword.operator: #D4D4D4", "light_plus": "keyword.operator: #000000", @@ -661,7 +650,7 @@ }, { "c": "height", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.body.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -672,7 +661,7 @@ }, { "c": ";", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -683,7 +672,7 @@ }, { "c": "}", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.block.end.bracket.curly.function.definition.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.block.end.bracket.curly.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -694,7 +683,7 @@ }, { "c": "}", - "t": "source.cpp source.cpp meta.block.class.cpp meta.body.class.cpp punctuation.section.block.end.bracket.curly.class.cpp", + "t": "source.cpp meta.block.class.cpp meta.body.class.cpp punctuation.section.block.end.bracket.curly.class.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -705,7 +694,7 @@ }, { "c": ";", - "t": "source.cpp source.cpp meta.block.class.cpp punctuation.terminator.statement.cpp", + "t": "source.cpp meta.block.class.cpp punctuation.terminator.statement.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -716,7 +705,7 @@ }, { "c": "void", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.qualified_type.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", + "t": "source.cpp meta.function.definition.cpp meta.qualified_type.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", "r": { "dark_plus": "storage.type: #569CD6", "light_plus": "storage.type: #0000FF", @@ -727,7 +716,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -738,7 +727,7 @@ }, { "c": "Rectangle", - "t": "source.cpp source.cpp meta.function.definition.cpp entity.name.scope-resolution.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp entity.name.scope-resolution.function.definition.cpp", "r": { "dark_plus": "entity.name.scope-resolution: #4EC9B0", "light_plus": "entity.name.scope-resolution: #267F99", @@ -749,7 +738,7 @@ }, { "c": "::", - "t": "source.cpp source.cpp meta.function.definition.cpp punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -760,7 +749,7 @@ }, { "c": "set_values", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp entity.name.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.head.function.definition.cpp entity.name.function.definition.cpp", "r": { "dark_plus": "entity.name.function: #DCDCAA", "light_plus": "entity.name.function: #795E26", @@ -771,7 +760,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -782,7 +771,7 @@ }, { "c": "(", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.parameters.begin.bracket.round.cpp", + "t": "source.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.parameters.begin.bracket.round.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -793,7 +782,7 @@ }, { "c": "int", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", + "t": "source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", "r": { "dark_plus": "storage.type: #569CD6", "light_plus": "storage.type: #0000FF", @@ -804,7 +793,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp", + "t": "source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -815,7 +804,7 @@ }, { "c": "x", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp variable.parameter.cpp", + "t": "source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp variable.parameter.cpp", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", @@ -826,7 +815,7 @@ }, { "c": ",", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp comma.cpp punctuation.separator.delimiter.cpp", + "t": "source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp punctuation.separator.delimiter.comma.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -837,7 +826,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp", + "t": "source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -848,7 +837,7 @@ }, { "c": "int", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", + "t": "source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", "r": { "dark_plus": "storage.type: #569CD6", "light_plus": "storage.type: #0000FF", @@ -859,7 +848,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp", + "t": "source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -870,7 +859,7 @@ }, { "c": "y", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp variable.parameter.cpp", + "t": "source.cpp meta.function.definition.cpp meta.head.function.definition.cpp meta.function.definition.parameters.cpp meta.parameter.cpp variable.parameter.cpp", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", @@ -881,7 +870,7 @@ }, { "c": ")", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.parameters.end.bracket.round.cpp", + "t": "source.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.parameters.end.bracket.round.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -892,7 +881,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.head.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -903,7 +892,7 @@ }, { "c": "{", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.block.begin.bracket.curly.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.block.begin.bracket.curly.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -914,7 +903,7 @@ }, { "c": " width ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -925,7 +914,7 @@ }, { "c": "=", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp keyword.operator.assignment.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp keyword.operator.assignment.cpp", "r": { "dark_plus": "keyword.operator: #D4D4D4", "light_plus": "keyword.operator: #000000", @@ -936,7 +925,7 @@ }, { "c": " x", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -947,7 +936,7 @@ }, { "c": ";", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -958,7 +947,7 @@ }, { "c": " height ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -969,7 +958,7 @@ }, { "c": "=", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp keyword.operator.assignment.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp keyword.operator.assignment.cpp", "r": { "dark_plus": "keyword.operator: #D4D4D4", "light_plus": "keyword.operator: #000000", @@ -980,7 +969,7 @@ }, { "c": " y", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -991,7 +980,7 @@ }, { "c": ";", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1002,7 +991,7 @@ }, { "c": "}", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.block.end.bracket.curly.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.block.end.bracket.curly.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1013,7 +1002,7 @@ }, { "c": "int", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.qualified_type.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", + "t": "source.cpp meta.function.definition.cpp meta.qualified_type.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", "r": { "dark_plus": "storage.type: #569CD6", "light_plus": "storage.type: #0000FF", @@ -1024,7 +1013,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1035,7 +1024,7 @@ }, { "c": "main", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp entity.name.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.head.function.definition.cpp entity.name.function.definition.cpp", "r": { "dark_plus": "entity.name.function: #DCDCAA", "light_plus": "entity.name.function: #795E26", @@ -1046,7 +1035,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1057,7 +1046,7 @@ }, { "c": "(", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.parameters.begin.bracket.round.cpp", + "t": "source.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.parameters.begin.bracket.round.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1068,7 +1057,7 @@ }, { "c": ")", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.parameters.end.bracket.round.cpp", + "t": "source.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.parameters.end.bracket.round.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1079,7 +1068,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.head.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1090,7 +1079,7 @@ }, { "c": "{", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.block.begin.bracket.curly.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.head.function.definition.cpp punctuation.section.block.begin.bracket.curly.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1101,7 +1090,7 @@ }, { "c": " Rectangle rect", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1112,7 +1101,7 @@ }, { "c": ";", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1123,7 +1112,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1134,7 +1123,7 @@ }, { "c": "rect", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp variable.other.object.access.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp variable.other.object.access.cpp", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", @@ -1145,7 +1134,7 @@ }, { "c": ".", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.separator.dot-access.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.separator.dot-access.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1156,7 +1145,7 @@ }, { "c": "set_values", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp entity.name.function.member.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp entity.name.function.member.cpp", "r": { "dark_plus": "entity.name.function: #DCDCAA", "light_plus": "entity.name.function: #795E26", @@ -1167,7 +1156,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1178,7 +1167,7 @@ }, { "c": "(", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.arguments.begin.bracket.round.function.member.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.arguments.begin.bracket.round.function.member.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1189,7 +1178,7 @@ }, { "c": "3", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp constant.numeric.decimal.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp constant.numeric.decimal.cpp", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -1200,7 +1189,7 @@ }, { "c": ",", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp comma.cpp punctuation.separator.delimiter.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.separator.delimiter.comma.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1211,7 +1200,7 @@ }, { "c": "4", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp constant.numeric.decimal.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp constant.numeric.decimal.cpp", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -1222,7 +1211,7 @@ }, { "c": ")", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.arguments.end.bracket.round.function.member.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.arguments.end.bracket.round.function.member.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1233,7 +1222,7 @@ }, { "c": ";", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1244,7 +1233,7 @@ }, { "c": " cout ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1255,7 +1244,7 @@ }, { "c": "<<", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp keyword.operator.bitwise.shift.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp keyword.operator.bitwise.shift.cpp", "r": { "dark_plus": "keyword.operator: #D4D4D4", "light_plus": "keyword.operator: #000000", @@ -1266,7 +1255,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1277,7 +1266,7 @@ }, { "c": "\"", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp punctuation.definition.string.begin.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp punctuation.definition.string.begin.cpp", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -1288,7 +1277,7 @@ }, { "c": "area: ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -1299,7 +1288,7 @@ }, { "c": "\"", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp punctuation.definition.string.end.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp punctuation.definition.string.end.cpp", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -1310,7 +1299,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1321,7 +1310,7 @@ }, { "c": "<<", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp keyword.operator.bitwise.shift.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp keyword.operator.bitwise.shift.cpp", "r": { "dark_plus": "keyword.operator: #D4D4D4", "light_plus": "keyword.operator: #000000", @@ -1332,7 +1321,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1343,7 +1332,7 @@ }, { "c": "rect", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp variable.other.object.access.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp variable.other.object.access.cpp", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", @@ -1354,7 +1343,7 @@ }, { "c": ".", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.separator.dot-access.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.separator.dot-access.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1365,7 +1354,7 @@ }, { "c": "area", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp entity.name.function.member.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp entity.name.function.member.cpp", "r": { "dark_plus": "entity.name.function: #DCDCAA", "light_plus": "entity.name.function: #795E26", @@ -1376,7 +1365,7 @@ }, { "c": "(", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.arguments.begin.bracket.round.function.member.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.arguments.begin.bracket.round.function.member.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1387,7 +1376,7 @@ }, { "c": ")", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.arguments.end.bracket.round.function.member.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.arguments.end.bracket.round.function.member.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1398,7 +1387,7 @@ }, { "c": ";", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1409,7 +1398,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1420,7 +1409,7 @@ }, { "c": "Task", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp entity.name.scope-resolution.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp entity.name.scope-resolution.cpp", "r": { "dark_plus": "entity.name.scope-resolution: #4EC9B0", "light_plus": "entity.name.scope-resolution: #267F99", @@ -1431,7 +1420,7 @@ }, { "c": "<", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.template.call.cpp meta.template.call.cpp punctuation.section.angle-brackets.begin.template.call.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.template.call.cpp meta.template.call.cpp punctuation.section.angle-brackets.begin.template.call.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1442,7 +1431,7 @@ }, { "c": "ANY_OUTPUT_TYPE", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.template.call.cpp meta.template.call.cpp meta.qualified_type.cpp entity.name.type.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.template.call.cpp meta.template.call.cpp meta.qualified_type.cpp entity.name.type.cpp", "r": { "dark_plus": "entity.name.type: #4EC9B0", "light_plus": "entity.name.type: #267F99", @@ -1453,7 +1442,7 @@ }, { "c": ",", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.template.call.cpp meta.template.call.cpp comma.cpp punctuation.separator.template.argument.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.template.call.cpp meta.template.call.cpp punctuation.separator.delimiter.comma.template.argument.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1464,7 +1453,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.template.call.cpp meta.template.call.cpp meta.qualified_type.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.template.call.cpp meta.template.call.cpp meta.qualified_type.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1475,7 +1464,7 @@ }, { "c": "ANY_INPUT_TYPE", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.template.call.cpp meta.template.call.cpp meta.qualified_type.cpp entity.name.type.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.template.call.cpp meta.template.call.cpp meta.qualified_type.cpp entity.name.type.cpp", "r": { "dark_plus": "entity.name.type: #4EC9B0", "light_plus": "entity.name.type: #267F99", @@ -1486,7 +1475,7 @@ }, { "c": ">", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.template.call.cpp meta.template.call.cpp punctuation.section.angle-brackets.end.template.call.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.template.call.cpp meta.template.call.cpp punctuation.section.angle-brackets.end.template.call.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1497,7 +1486,7 @@ }, { "c": "::", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1508,7 +1497,7 @@ }, { "c": "links_to", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1519,7 +1508,7 @@ }, { "c": ";", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1530,7 +1519,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1541,7 +1530,7 @@ }, { "c": "return", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp keyword.control.return.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp keyword.control.return.cpp", "r": { "dark_plus": "keyword.control: #C586C0", "light_plus": "keyword.control: #AF00DB", @@ -1552,7 +1541,7 @@ }, { "c": " ", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1563,7 +1552,7 @@ }, { "c": "0", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp constant.numeric.decimal.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp constant.numeric.decimal.cpp", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -1574,7 +1563,7 @@ }, { "c": ";", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1585,7 +1574,7 @@ }, { "c": "}", - "t": "source.cpp source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.block.end.bracket.curly.function.definition.cpp", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.block.end.bracket.curly.function.definition.cpp", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", From 6fb0c87f9c9293415f112447c36fb89f78d4a9ac Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 8 Jul 2019 16:47:30 +0200 Subject: [PATCH 1201/1449] build - enable schedules again --- build/azure-pipelines/product-build.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index ddaabdcdc72..666cfa07ca9 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -129,9 +129,9 @@ jobs: steps: - template: sync-mooncake.yml -# schedules: -# - cron: "0 6 * * Mon-Fri" -# displayName: Mon-Fri at 6:00 -# branches: -# include: -# - master \ No newline at end of file +schedules: +- cron: "0 6 * * Mon-Fri" + displayName: Mon-Fri at 6:00 + branches: + include: + - master \ No newline at end of file From b24d67b5fb1759c86c6b0aa259a4898dbe4ed39a Mon Sep 17 00:00:00 2001 From: Orta Therox Date: Mon, 8 Jul 2019 10:45:21 -0400 Subject: [PATCH 1202/1449] Updates to the latest icon theme from seti-ui --- .../theme-seti/build/update-icon-theme.js | 5 +- extensions/theme-seti/cgmanifest.json | 2 +- extensions/theme-seti/icons/seti.woff | Bin 33904 -> 34800 bytes .../theme-seti/icons/vs-seti-icon-theme.json | 644 +++++++++++------- 4 files changed, 395 insertions(+), 256 deletions(-) diff --git a/extensions/theme-seti/build/update-icon-theme.js b/extensions/theme-seti/build/update-icon-theme.js index c60de74fe2c..4982c678a37 100644 --- a/extensions/theme-seti/build/update-icon-theme.js +++ b/extensions/theme-seti/build/update-icon-theme.js @@ -10,7 +10,7 @@ let fs = require('fs'); let https = require('https'); let url = require('url'); -// list of languagesIs not shipped with VSCode. The information is used to associate an icon with a langauge association +// list of languages which are not shipped with VSCode. The information is used to associate an icon with a language association let nonBuiltInLanguages = { // { fileNames, extensions } "r": { extensions: ['r', 'rhistory', 'rprofile', 'rt'] }, "argdown": { extensions: ['ad', 'adown', 'argdown', 'argdn'] }, @@ -35,7 +35,8 @@ let nonBuiltInLanguages = { // { fileNames, extensions } "todo": { fileNames: ['todo'] } }; -let FROM_DISK = false; // set to true to take content from a repo checkedout next to the vscode repo +// If true, use `node build/update-icon-theme.js` from the theme-seti folder +let FROM_DISK = true; // set to true to take content from a repo checked out next to the vscode repo let font, fontMappingsFile, fileAssociationFile, colorsFile; if (!FROM_DISK) { diff --git a/extensions/theme-seti/cgmanifest.json b/extensions/theme-seti/cgmanifest.json index 2b449830f50..a9f5274462a 100644 --- a/extensions/theme-seti/cgmanifest.json +++ b/extensions/theme-seti/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "seti-ui", "repositoryUrl": "https://github.com/jesseweed/seti-ui", - "commitHash": "89175d7f9e0c70cd325b80a18a3c77fc8eb7c798" + "commitHash": "59ef8c31d9a0c3cef688278c20c6c1c6a84db221" } }, "version": "0.1.0" diff --git a/extensions/theme-seti/icons/seti.woff b/extensions/theme-seti/icons/seti.woff index e590d77f6840c65388f761b878df92e329bb897e..dd662ac459db9cf8063694fa51f83615797baea9 100644 GIT binary patch delta 34585 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 delta 33680 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 E0DV6%7ytkO diff --git a/extensions/theme-seti/icons/vs-seti-icon-theme.json b/extensions/theme-seti/icons/vs-seti-icon-theme.json index 4aec2074092..d30e60a7c85 100644 --- a/extensions/theme-seti/icons/vs-seti-icon-theme.json +++ b/extensions/theme-seti/icons/vs-seti-icon-theme.json @@ -206,6 +206,14 @@ "fontCharacter": "\\E017", "fontColor": "#a074c4" }, + "_cpp_2_light": { + "fontCharacter": "\\E017", + "fontColor": "#b7b73b" + }, + "_cpp_2": { + "fontCharacter": "\\E017", + "fontColor": "#cbcb41" + }, "_crystal_light": { "fontCharacter": "\\E018", "fontColor": "#bfc2c1" @@ -246,999 +254,1087 @@ "fontCharacter": "\\E01C", "fontColor": "#cc3e44" }, - "_db_light": { + "_dart_light": { "fontCharacter": "\\E01D", + "fontColor": "#498ba7" + }, + "_dart": { + "fontCharacter": "\\E01D", + "fontColor": "#519aba" + }, + "_db_light": { + "fontCharacter": "\\E01E", "fontColor": "#dd4b78" }, "_db": { - "fontCharacter": "\\E01D", + "fontCharacter": "\\E01E", "fontColor": "#f55385" }, "_default_light": { - "fontCharacter": "\\E01E", + "fontCharacter": "\\E01F", "fontColor": "#bfc2c1" }, "_default": { - "fontCharacter": "\\E01E", + "fontCharacter": "\\E01F", "fontColor": "#d4d7d6" }, "_docker_light": { - "fontCharacter": "\\E020", + "fontCharacter": "\\E021", "fontColor": "#498ba7" }, "_docker": { - "fontCharacter": "\\E020", + "fontCharacter": "\\E021", "fontColor": "#519aba" }, "_docker_1_light": { - "fontCharacter": "\\E020", + "fontCharacter": "\\E021", "fontColor": "#455155" }, "_docker_1": { - "fontCharacter": "\\E020", + "fontCharacter": "\\E021", "fontColor": "#4d5a5e" }, "_docker_2_light": { - "fontCharacter": "\\E020", + "fontCharacter": "\\E021", "fontColor": "#7fae42" }, "_docker_2": { - "fontCharacter": "\\E020", + "fontCharacter": "\\E021", "fontColor": "#8dc149" }, "_docker_3_light": { - "fontCharacter": "\\E020", + "fontCharacter": "\\E021", "fontColor": "#dd4b78" }, "_docker_3": { - "fontCharacter": "\\E020", + "fontCharacter": "\\E021", "fontColor": "#f55385" }, "_ejs_light": { - "fontCharacter": "\\E022", + "fontCharacter": "\\E023", "fontColor": "#b7b73b" }, "_ejs": { - "fontCharacter": "\\E022", + "fontCharacter": "\\E023", "fontColor": "#cbcb41" }, "_elixir_light": { - "fontCharacter": "\\E023", + "fontCharacter": "\\E024", "fontColor": "#9068b0" }, "_elixir": { - "fontCharacter": "\\E023", + "fontCharacter": "\\E024", "fontColor": "#a074c4" }, "_elixir_script_light": { - "fontCharacter": "\\E024", + "fontCharacter": "\\E025", "fontColor": "#9068b0" }, "_elixir_script": { - "fontCharacter": "\\E024", + "fontCharacter": "\\E025", "fontColor": "#a074c4" }, "_elm_light": { - "fontCharacter": "\\E025", + "fontCharacter": "\\E026", "fontColor": "#498ba7" }, "_elm": { - "fontCharacter": "\\E025", + "fontCharacter": "\\E026", "fontColor": "#519aba" }, "_eslint_light": { - "fontCharacter": "\\E027", + "fontCharacter": "\\E028", "fontColor": "#9068b0" }, "_eslint": { - "fontCharacter": "\\E027", + "fontCharacter": "\\E028", "fontColor": "#a074c4" }, "_eslint_1_light": { - "fontCharacter": "\\E027", + "fontCharacter": "\\E028", "fontColor": "#455155" }, "_eslint_1": { - "fontCharacter": "\\E027", + "fontCharacter": "\\E028", "fontColor": "#4d5a5e" }, "_ethereum_light": { - "fontCharacter": "\\E028", + "fontCharacter": "\\E029", "fontColor": "#498ba7" }, "_ethereum": { - "fontCharacter": "\\E028", + "fontCharacter": "\\E029", "fontColor": "#519aba" }, "_f-sharp_light": { - "fontCharacter": "\\E029", + "fontCharacter": "\\E02A", "fontColor": "#498ba7" }, "_f-sharp": { - "fontCharacter": "\\E029", + "fontCharacter": "\\E02A", "fontColor": "#519aba" }, "_favicon_light": { - "fontCharacter": "\\E02A", + "fontCharacter": "\\E02B", "fontColor": "#b7b73b" }, "_favicon": { - "fontCharacter": "\\E02A", + "fontCharacter": "\\E02B", "fontColor": "#cbcb41" }, "_firebase_light": { - "fontCharacter": "\\E02B", + "fontCharacter": "\\E02C", "fontColor": "#cc6d2e" }, "_firebase": { - "fontCharacter": "\\E02B", + "fontCharacter": "\\E02C", "fontColor": "#e37933" }, "_firefox_light": { - "fontCharacter": "\\E02C", + "fontCharacter": "\\E02D", "fontColor": "#cc6d2e" }, "_firefox": { - "fontCharacter": "\\E02C", + "fontCharacter": "\\E02D", "fontColor": "#e37933" }, "_font_light": { - "fontCharacter": "\\E02E", + "fontCharacter": "\\E02F", "fontColor": "#b8383d" }, "_font": { - "fontCharacter": "\\E02E", + "fontCharacter": "\\E02F", "fontColor": "#cc3e44" }, "_git_light": { - "fontCharacter": "\\E02F", + "fontCharacter": "\\E030", "fontColor": "#3b4b52" }, "_git": { - "fontCharacter": "\\E02F", + "fontCharacter": "\\E030", "fontColor": "#41535b" }, "_go_light": { - "fontCharacter": "\\E033", + "fontCharacter": "\\E034", "fontColor": "#498ba7" }, "_go": { - "fontCharacter": "\\E033", + "fontCharacter": "\\E034", "fontColor": "#519aba" }, "_go2_light": { - "fontCharacter": "\\E034", + "fontCharacter": "\\E035", "fontColor": "#498ba7" }, "_go2": { - "fontCharacter": "\\E034", + "fontCharacter": "\\E035", "fontColor": "#519aba" }, "_gradle_light": { - "fontCharacter": "\\E035", + "fontCharacter": "\\E036", "fontColor": "#7fae42" }, "_gradle": { - "fontCharacter": "\\E035", + "fontCharacter": "\\E036", "fontColor": "#8dc149" }, "_grails_light": { - "fontCharacter": "\\E036", + "fontCharacter": "\\E037", "fontColor": "#7fae42" }, "_grails": { - "fontCharacter": "\\E036", + "fontCharacter": "\\E037", "fontColor": "#8dc149" }, + "_graphql_light": { + "fontCharacter": "\\E038", + "fontColor": "#dd4b78" + }, + "_graphql": { + "fontCharacter": "\\E038", + "fontColor": "#f55385" + }, "_grunt_light": { - "fontCharacter": "\\E037", + "fontCharacter": "\\E039", "fontColor": "#cc6d2e" }, "_grunt": { - "fontCharacter": "\\E037", + "fontCharacter": "\\E039", "fontColor": "#e37933" }, "_gulp_light": { - "fontCharacter": "\\E038", + "fontCharacter": "\\E03A", "fontColor": "#b8383d" }, "_gulp": { - "fontCharacter": "\\E038", + "fontCharacter": "\\E03A", "fontColor": "#cc3e44" }, "_haml_light": { - "fontCharacter": "\\E03A", + "fontCharacter": "\\E03C", "fontColor": "#b8383d" }, "_haml": { - "fontCharacter": "\\E03A", + "fontCharacter": "\\E03C", "fontColor": "#cc3e44" }, + "_happenings_light": { + "fontCharacter": "\\E03D", + "fontColor": "#498ba7" + }, + "_happenings": { + "fontCharacter": "\\E03D", + "fontColor": "#519aba" + }, "_haskell_light": { - "fontCharacter": "\\E03B", + "fontCharacter": "\\E03E", "fontColor": "#9068b0" }, "_haskell": { - "fontCharacter": "\\E03B", + "fontCharacter": "\\E03E", "fontColor": "#a074c4" }, "_haxe_light": { - "fontCharacter": "\\E03C", + "fontCharacter": "\\E03F", "fontColor": "#cc6d2e" }, "_haxe": { - "fontCharacter": "\\E03C", + "fontCharacter": "\\E03F", "fontColor": "#e37933" }, "_haxe_1_light": { - "fontCharacter": "\\E03C", + "fontCharacter": "\\E03F", "fontColor": "#b7b73b" }, "_haxe_1": { - "fontCharacter": "\\E03C", + "fontCharacter": "\\E03F", "fontColor": "#cbcb41" }, "_haxe_2_light": { - "fontCharacter": "\\E03C", + "fontCharacter": "\\E03F", "fontColor": "#498ba7" }, "_haxe_2": { - "fontCharacter": "\\E03C", + "fontCharacter": "\\E03F", "fontColor": "#519aba" }, "_haxe_3_light": { - "fontCharacter": "\\E03C", + "fontCharacter": "\\E03F", "fontColor": "#9068b0" }, "_haxe_3": { - "fontCharacter": "\\E03C", + "fontCharacter": "\\E03F", "fontColor": "#a074c4" }, "_heroku_light": { - "fontCharacter": "\\E03D", + "fontCharacter": "\\E040", "fontColor": "#9068b0" }, "_heroku": { - "fontCharacter": "\\E03D", + "fontCharacter": "\\E040", "fontColor": "#a074c4" }, "_hex_light": { - "fontCharacter": "\\E03E", + "fontCharacter": "\\E041", "fontColor": "#b8383d" }, "_hex": { - "fontCharacter": "\\E03E", + "fontCharacter": "\\E041", "fontColor": "#cc3e44" }, "_html_light": { - "fontCharacter": "\\E03F", - "fontColor": "#cc6d2e" + "fontCharacter": "\\E042", + "fontColor": "#498ba7" }, "_html": { - "fontCharacter": "\\E03F", + "fontCharacter": "\\E042", + "fontColor": "#519aba" + }, + "_html_1_light": { + "fontCharacter": "\\E042", + "fontColor": "#7fae42" + }, + "_html_1": { + "fontCharacter": "\\E042", + "fontColor": "#8dc149" + }, + "_html_2_light": { + "fontCharacter": "\\E042", + "fontColor": "#b7b73b" + }, + "_html_2": { + "fontCharacter": "\\E042", + "fontColor": "#cbcb41" + }, + "_html_3_light": { + "fontCharacter": "\\E042", + "fontColor": "#cc6d2e" + }, + "_html_3": { + "fontCharacter": "\\E042", "fontColor": "#e37933" }, "_html_erb_light": { - "fontCharacter": "\\E040", + "fontCharacter": "\\E043", "fontColor": "#b8383d" }, "_html_erb": { - "fontCharacter": "\\E040", + "fontCharacter": "\\E043", "fontColor": "#cc3e44" }, "_ignored_light": { - "fontCharacter": "\\E041", + "fontCharacter": "\\E044", "fontColor": "#3b4b52" }, "_ignored": { - "fontCharacter": "\\E041", + "fontCharacter": "\\E044", "fontColor": "#41535b" }, "_illustrator_light": { - "fontCharacter": "\\E042", + "fontCharacter": "\\E045", "fontColor": "#b7b73b" }, "_illustrator": { - "fontCharacter": "\\E042", + "fontCharacter": "\\E045", "fontColor": "#cbcb41" }, "_image_light": { - "fontCharacter": "\\E043", + "fontCharacter": "\\E046", "fontColor": "#9068b0" }, "_image": { - "fontCharacter": "\\E043", + "fontCharacter": "\\E046", "fontColor": "#a074c4" }, "_info_light": { - "fontCharacter": "\\E044", + "fontCharacter": "\\E047", "fontColor": "#498ba7" }, "_info": { - "fontCharacter": "\\E044", + "fontCharacter": "\\E047", "fontColor": "#519aba" }, "_ionic_light": { - "fontCharacter": "\\E045", + "fontCharacter": "\\E048", "fontColor": "#498ba7" }, "_ionic": { - "fontCharacter": "\\E045", + "fontCharacter": "\\E048", "fontColor": "#519aba" }, "_jade_light": { - "fontCharacter": "\\E046", + "fontCharacter": "\\E049", "fontColor": "#b8383d" }, "_jade": { - "fontCharacter": "\\E046", + "fontCharacter": "\\E049", "fontColor": "#cc3e44" }, "_java_light": { - "fontCharacter": "\\E047", + "fontCharacter": "\\E04A", "fontColor": "#b8383d" }, "_java": { - "fontCharacter": "\\E047", + "fontCharacter": "\\E04A", "fontColor": "#cc3e44" }, "_javascript_light": { - "fontCharacter": "\\E048", + "fontCharacter": "\\E04B", "fontColor": "#b7b73b" }, "_javascript": { - "fontCharacter": "\\E048", + "fontCharacter": "\\E04B", "fontColor": "#cbcb41" }, "_javascript_1_light": { - "fontCharacter": "\\E048", + "fontCharacter": "\\E04B", "fontColor": "#cc6d2e" }, "_javascript_1": { - "fontCharacter": "\\E048", + "fontCharacter": "\\E04B", "fontColor": "#e37933" }, "_javascript_2_light": { - "fontCharacter": "\\E048", + "fontCharacter": "\\E04B", "fontColor": "#498ba7" }, "_javascript_2": { - "fontCharacter": "\\E048", + "fontCharacter": "\\E04B", "fontColor": "#519aba" }, "_jenkins_light": { - "fontCharacter": "\\E049", + "fontCharacter": "\\E04C", "fontColor": "#b8383d" }, "_jenkins": { - "fontCharacter": "\\E049", + "fontCharacter": "\\E04C", "fontColor": "#cc3e44" }, "_jinja_light": { - "fontCharacter": "\\E04A", + "fontCharacter": "\\E04D", "fontColor": "#b8383d" }, "_jinja": { - "fontCharacter": "\\E04A", + "fontCharacter": "\\E04D", "fontColor": "#cc3e44" }, "_json_light": { - "fontCharacter": "\\E04C", + "fontCharacter": "\\E04F", "fontColor": "#b7b73b" }, "_json": { - "fontCharacter": "\\E04C", + "fontCharacter": "\\E04F", "fontColor": "#cbcb41" }, "_json_1_light": { - "fontCharacter": "\\E04C", + "fontCharacter": "\\E04F", "fontColor": "#7fae42" }, "_json_1": { - "fontCharacter": "\\E04C", + "fontCharacter": "\\E04F", "fontColor": "#8dc149" }, "_julia_light": { - "fontCharacter": "\\E04D", + "fontCharacter": "\\E050", "fontColor": "#9068b0" }, "_julia": { - "fontCharacter": "\\E04D", + "fontCharacter": "\\E050", "fontColor": "#a074c4" }, "_karma_light": { - "fontCharacter": "\\E04E", + "fontCharacter": "\\E051", "fontColor": "#7fae42" }, "_karma": { - "fontCharacter": "\\E04E", + "fontCharacter": "\\E051", "fontColor": "#8dc149" }, "_kotlin_light": { - "fontCharacter": "\\E04F", + "fontCharacter": "\\E052", "fontColor": "#cc6d2e" }, "_kotlin": { - "fontCharacter": "\\E04F", + "fontCharacter": "\\E052", "fontColor": "#e37933" }, "_less_light": { - "fontCharacter": "\\E050", + "fontCharacter": "\\E053", "fontColor": "#498ba7" }, "_less": { - "fontCharacter": "\\E050", + "fontCharacter": "\\E053", "fontColor": "#519aba" }, "_license_light": { - "fontCharacter": "\\E051", + "fontCharacter": "\\E054", "fontColor": "#b7b73b" }, "_license": { - "fontCharacter": "\\E051", + "fontCharacter": "\\E054", "fontColor": "#cbcb41" }, "_license_1_light": { - "fontCharacter": "\\E051", + "fontCharacter": "\\E054", "fontColor": "#cc6d2e" }, "_license_1": { - "fontCharacter": "\\E051", + "fontCharacter": "\\E054", "fontColor": "#e37933" }, "_license_2_light": { - "fontCharacter": "\\E051", + "fontCharacter": "\\E054", "fontColor": "#b8383d" }, "_license_2": { - "fontCharacter": "\\E051", + "fontCharacter": "\\E054", "fontColor": "#cc3e44" }, "_liquid_light": { - "fontCharacter": "\\E052", + "fontCharacter": "\\E055", "fontColor": "#7fae42" }, "_liquid": { - "fontCharacter": "\\E052", + "fontCharacter": "\\E055", "fontColor": "#8dc149" }, "_livescript_light": { - "fontCharacter": "\\E053", + "fontCharacter": "\\E056", "fontColor": "#498ba7" }, "_livescript": { - "fontCharacter": "\\E053", + "fontCharacter": "\\E056", "fontColor": "#519aba" }, "_lock_light": { - "fontCharacter": "\\E054", + "fontCharacter": "\\E057", "fontColor": "#7fae42" }, "_lock": { - "fontCharacter": "\\E054", + "fontCharacter": "\\E057", "fontColor": "#8dc149" }, "_lua_light": { - "fontCharacter": "\\E055", + "fontCharacter": "\\E058", "fontColor": "#498ba7" }, "_lua": { - "fontCharacter": "\\E055", + "fontCharacter": "\\E058", "fontColor": "#519aba" }, "_makefile_light": { - "fontCharacter": "\\E056", + "fontCharacter": "\\E059", "fontColor": "#cc6d2e" }, "_makefile": { - "fontCharacter": "\\E056", + "fontCharacter": "\\E059", "fontColor": "#e37933" }, "_makefile_1_light": { - "fontCharacter": "\\E056", + "fontCharacter": "\\E059", "fontColor": "#9068b0" }, "_makefile_1": { - "fontCharacter": "\\E056", + "fontCharacter": "\\E059", "fontColor": "#a074c4" }, "_makefile_2_light": { - "fontCharacter": "\\E056", + "fontCharacter": "\\E059", "fontColor": "#627379" }, "_makefile_2": { - "fontCharacter": "\\E056", + "fontCharacter": "\\E059", "fontColor": "#6d8086" }, "_makefile_3_light": { - "fontCharacter": "\\E056", + "fontCharacter": "\\E059", "fontColor": "#498ba7" }, "_makefile_3": { - "fontCharacter": "\\E056", + "fontCharacter": "\\E059", "fontColor": "#519aba" }, "_markdown_light": { - "fontCharacter": "\\E057", + "fontCharacter": "\\E05A", "fontColor": "#498ba7" }, "_markdown": { - "fontCharacter": "\\E057", + "fontCharacter": "\\E05A", "fontColor": "#519aba" }, "_maven_light": { - "fontCharacter": "\\E058", + "fontCharacter": "\\E05B", "fontColor": "#b8383d" }, "_maven": { - "fontCharacter": "\\E058", + "fontCharacter": "\\E05B", "fontColor": "#cc3e44" }, "_mdo_light": { - "fontCharacter": "\\E059", + "fontCharacter": "\\E05C", "fontColor": "#b8383d" }, "_mdo": { - "fontCharacter": "\\E059", + "fontCharacter": "\\E05C", "fontColor": "#cc3e44" }, "_mustache_light": { - "fontCharacter": "\\E05A", + "fontCharacter": "\\E05D", "fontColor": "#cc6d2e" }, "_mustache": { - "fontCharacter": "\\E05A", + "fontCharacter": "\\E05D", "fontColor": "#e37933" }, "_npm_light": { - "fontCharacter": "\\E05C", + "fontCharacter": "\\E05F", "fontColor": "#3b4b52" }, "_npm": { - "fontCharacter": "\\E05C", + "fontCharacter": "\\E05F", "fontColor": "#41535b" }, "_npm_1_light": { - "fontCharacter": "\\E05C", + "fontCharacter": "\\E05F", "fontColor": "#b8383d" }, "_npm_1": { - "fontCharacter": "\\E05C", + "fontCharacter": "\\E05F", "fontColor": "#cc3e44" }, "_npm_ignored_light": { - "fontCharacter": "\\E05D", + "fontCharacter": "\\E060", "fontColor": "#3b4b52" }, "_npm_ignored": { - "fontCharacter": "\\E05D", + "fontCharacter": "\\E060", "fontColor": "#41535b" }, "_nunjucks_light": { - "fontCharacter": "\\E05E", + "fontCharacter": "\\E061", "fontColor": "#7fae42" }, "_nunjucks": { - "fontCharacter": "\\E05E", + "fontCharacter": "\\E061", "fontColor": "#8dc149" }, "_ocaml_light": { - "fontCharacter": "\\E05F", + "fontCharacter": "\\E062", "fontColor": "#cc6d2e" }, "_ocaml": { - "fontCharacter": "\\E05F", + "fontCharacter": "\\E062", "fontColor": "#e37933" }, "_odata_light": { - "fontCharacter": "\\E060", + "fontCharacter": "\\E063", "fontColor": "#cc6d2e" }, "_odata": { - "fontCharacter": "\\E060", + "fontCharacter": "\\E063", "fontColor": "#e37933" }, + "_pddl_light": { + "fontCharacter": "\\E064", + "fontColor": "#9068b0" + }, + "_pddl": { + "fontCharacter": "\\E064", + "fontColor": "#a074c4" + }, "_pdf_light": { - "fontCharacter": "\\E061", + "fontCharacter": "\\E065", "fontColor": "#b8383d" }, "_pdf": { - "fontCharacter": "\\E061", + "fontCharacter": "\\E065", "fontColor": "#cc3e44" }, "_perl_light": { - "fontCharacter": "\\E062", + "fontCharacter": "\\E066", "fontColor": "#498ba7" }, "_perl": { - "fontCharacter": "\\E062", + "fontCharacter": "\\E066", "fontColor": "#519aba" }, "_photoshop_light": { - "fontCharacter": "\\E063", + "fontCharacter": "\\E067", "fontColor": "#498ba7" }, "_photoshop": { - "fontCharacter": "\\E063", + "fontCharacter": "\\E067", "fontColor": "#519aba" }, "_php_light": { - "fontCharacter": "\\E064", + "fontCharacter": "\\E068", "fontColor": "#9068b0" }, "_php": { - "fontCharacter": "\\E064", + "fontCharacter": "\\E068", "fontColor": "#a074c4" }, + "_plan_light": { + "fontCharacter": "\\E069", + "fontColor": "#7fae42" + }, + "_plan": { + "fontCharacter": "\\E069", + "fontColor": "#8dc149" + }, + "_platformio_light": { + "fontCharacter": "\\E06A", + "fontColor": "#cc6d2e" + }, + "_platformio": { + "fontCharacter": "\\E06A", + "fontColor": "#e37933" + }, "_powershell_light": { - "fontCharacter": "\\E065", + "fontCharacter": "\\E06B", "fontColor": "#498ba7" }, "_powershell": { - "fontCharacter": "\\E065", + "fontCharacter": "\\E06B", "fontColor": "#519aba" }, "_pug_light": { - "fontCharacter": "\\E067", + "fontCharacter": "\\E06D", "fontColor": "#b8383d" }, "_pug": { - "fontCharacter": "\\E067", + "fontCharacter": "\\E06D", "fontColor": "#cc3e44" }, "_puppet_light": { - "fontCharacter": "\\E068", + "fontCharacter": "\\E06E", "fontColor": "#b7b73b" }, "_puppet": { - "fontCharacter": "\\E068", + "fontCharacter": "\\E06E", "fontColor": "#cbcb41" }, "_python_light": { - "fontCharacter": "\\E069", + "fontCharacter": "\\E06F", "fontColor": "#498ba7" }, "_python": { - "fontCharacter": "\\E069", + "fontCharacter": "\\E06F", "fontColor": "#519aba" }, "_react_light": { - "fontCharacter": "\\E06B", + "fontCharacter": "\\E071", "fontColor": "#498ba7" }, "_react": { - "fontCharacter": "\\E06B", + "fontCharacter": "\\E071", "fontColor": "#519aba" }, + "_reasonml_light": { + "fontCharacter": "\\E072", + "fontColor": "#b8383d" + }, + "_reasonml": { + "fontCharacter": "\\E072", + "fontColor": "#cc3e44" + }, "_rollup_light": { - "fontCharacter": "\\E06C", + "fontCharacter": "\\E073", "fontColor": "#b8383d" }, "_rollup": { - "fontCharacter": "\\E06C", + "fontCharacter": "\\E073", "fontColor": "#cc3e44" }, "_ruby_light": { - "fontCharacter": "\\E06D", + "fontCharacter": "\\E074", "fontColor": "#b8383d" }, "_ruby": { - "fontCharacter": "\\E06D", + "fontCharacter": "\\E074", "fontColor": "#cc3e44" }, "_rust_light": { - "fontCharacter": "\\E06E", + "fontCharacter": "\\E075", "fontColor": "#627379" }, "_rust": { - "fontCharacter": "\\E06E", + "fontCharacter": "\\E075", "fontColor": "#6d8086" }, "_salesforce_light": { - "fontCharacter": "\\E06F", + "fontCharacter": "\\E076", "fontColor": "#498ba7" }, "_salesforce": { - "fontCharacter": "\\E06F", + "fontCharacter": "\\E076", "fontColor": "#519aba" }, "_sass_light": { - "fontCharacter": "\\E070", + "fontCharacter": "\\E077", "fontColor": "#dd4b78" }, "_sass": { - "fontCharacter": "\\E070", + "fontCharacter": "\\E077", "fontColor": "#f55385" }, "_sbt_light": { - "fontCharacter": "\\E071", + "fontCharacter": "\\E078", "fontColor": "#498ba7" }, "_sbt": { - "fontCharacter": "\\E071", + "fontCharacter": "\\E078", "fontColor": "#519aba" }, "_scala_light": { - "fontCharacter": "\\E072", + "fontCharacter": "\\E079", "fontColor": "#b8383d" }, "_scala": { - "fontCharacter": "\\E072", + "fontCharacter": "\\E079", "fontColor": "#cc3e44" }, "_shell_light": { - "fontCharacter": "\\E075", + "fontCharacter": "\\E07C", "fontColor": "#455155" }, "_shell": { - "fontCharacter": "\\E075", + "fontCharacter": "\\E07C", "fontColor": "#4d5a5e" }, "_slim_light": { - "fontCharacter": "\\E076", + "fontCharacter": "\\E07D", "fontColor": "#cc6d2e" }, "_slim": { - "fontCharacter": "\\E076", + "fontCharacter": "\\E07D", "fontColor": "#e37933" }, "_smarty_light": { - "fontCharacter": "\\E077", + "fontCharacter": "\\E07E", "fontColor": "#b7b73b" }, "_smarty": { - "fontCharacter": "\\E077", + "fontCharacter": "\\E07E", "fontColor": "#cbcb41" }, "_spring_light": { - "fontCharacter": "\\E078", + "fontCharacter": "\\E07F", "fontColor": "#7fae42" }, "_spring": { - "fontCharacter": "\\E078", + "fontCharacter": "\\E07F", "fontColor": "#8dc149" }, "_stylelint_light": { - "fontCharacter": "\\E079", + "fontCharacter": "\\E080", "fontColor": "#bfc2c1" }, "_stylelint": { - "fontCharacter": "\\E079", + "fontCharacter": "\\E080", "fontColor": "#d4d7d6" }, "_stylelint_1_light": { - "fontCharacter": "\\E079", + "fontCharacter": "\\E080", "fontColor": "#455155" }, "_stylelint_1": { - "fontCharacter": "\\E079", + "fontCharacter": "\\E080", "fontColor": "#4d5a5e" }, "_stylus_light": { - "fontCharacter": "\\E07A", + "fontCharacter": "\\E081", "fontColor": "#7fae42" }, "_stylus": { - "fontCharacter": "\\E07A", + "fontCharacter": "\\E081", "fontColor": "#8dc149" }, "_sublime_light": { - "fontCharacter": "\\E07B", + "fontCharacter": "\\E082", "fontColor": "#cc6d2e" }, "_sublime": { - "fontCharacter": "\\E07B", + "fontCharacter": "\\E082", "fontColor": "#e37933" }, "_svg_light": { - "fontCharacter": "\\E07C", + "fontCharacter": "\\E083", "fontColor": "#9068b0" }, "_svg": { - "fontCharacter": "\\E07C", + "fontCharacter": "\\E083", "fontColor": "#a074c4" }, "_svg_1_light": { - "fontCharacter": "\\E07C", + "fontCharacter": "\\E083", "fontColor": "#498ba7" }, "_svg_1": { - "fontCharacter": "\\E07C", + "fontCharacter": "\\E083", "fontColor": "#519aba" }, "_swift_light": { - "fontCharacter": "\\E07D", + "fontCharacter": "\\E084", "fontColor": "#cc6d2e" }, "_swift": { - "fontCharacter": "\\E07D", + "fontCharacter": "\\E084", "fontColor": "#e37933" }, "_terraform_light": { - "fontCharacter": "\\E07E", + "fontCharacter": "\\E085", "fontColor": "#9068b0" }, "_terraform": { - "fontCharacter": "\\E07E", + "fontCharacter": "\\E085", "fontColor": "#a074c4" }, "_tex_light": { - "fontCharacter": "\\E07F", + "fontCharacter": "\\E086", "fontColor": "#498ba7" }, "_tex": { - "fontCharacter": "\\E07F", + "fontCharacter": "\\E086", "fontColor": "#519aba" }, "_tex_1_light": { - "fontCharacter": "\\E07F", + "fontCharacter": "\\E086", "fontColor": "#b7b73b" }, "_tex_1": { - "fontCharacter": "\\E07F", + "fontCharacter": "\\E086", "fontColor": "#cbcb41" }, "_tex_2_light": { - "fontCharacter": "\\E07F", + "fontCharacter": "\\E086", "fontColor": "#cc6d2e" }, "_tex_2": { - "fontCharacter": "\\E07F", + "fontCharacter": "\\E086", "fontColor": "#e37933" }, "_tex_3_light": { - "fontCharacter": "\\E07F", + "fontCharacter": "\\E086", "fontColor": "#bfc2c1" }, "_tex_3": { - "fontCharacter": "\\E07F", + "fontCharacter": "\\E086", "fontColor": "#d4d7d6" }, "_todo": { - "fontCharacter": "\\E081" + "fontCharacter": "\\E088" + }, + "_tsconfig_light": { + "fontCharacter": "\\E089", + "fontColor": "#498ba7" + }, + "_tsconfig": { + "fontCharacter": "\\E089", + "fontColor": "#519aba" }, "_twig_light": { - "fontCharacter": "\\E082", + "fontCharacter": "\\E08A", "fontColor": "#7fae42" }, "_twig": { - "fontCharacter": "\\E082", + "fontCharacter": "\\E08A", "fontColor": "#8dc149" }, "_typescript_light": { - "fontCharacter": "\\E083", + "fontCharacter": "\\E08B", "fontColor": "#498ba7" }, "_typescript": { - "fontCharacter": "\\E083", + "fontCharacter": "\\E08B", "fontColor": "#519aba" }, "_typescript_1_light": { - "fontCharacter": "\\E083", + "fontCharacter": "\\E08B", "fontColor": "#b7b73b" }, "_typescript_1": { - "fontCharacter": "\\E083", + "fontCharacter": "\\E08B", "fontColor": "#cbcb41" }, "_vala_light": { - "fontCharacter": "\\E084", + "fontCharacter": "\\E08C", "fontColor": "#627379" }, "_vala": { - "fontCharacter": "\\E084", + "fontCharacter": "\\E08C", "fontColor": "#6d8086" }, "_video_light": { - "fontCharacter": "\\E085", + "fontCharacter": "\\E08D", "fontColor": "#dd4b78" }, "_video": { - "fontCharacter": "\\E085", + "fontCharacter": "\\E08D", "fontColor": "#f55385" }, "_vue_light": { - "fontCharacter": "\\E086", + "fontCharacter": "\\E08E", "fontColor": "#7fae42" }, "_vue": { - "fontCharacter": "\\E086", + "fontCharacter": "\\E08E", "fontColor": "#8dc149" }, "_wasm_light": { - "fontCharacter": "\\E087", + "fontCharacter": "\\E08F", "fontColor": "#9068b0" }, "_wasm": { - "fontCharacter": "\\E087", + "fontCharacter": "\\E08F", "fontColor": "#a074c4" }, "_wat_light": { - "fontCharacter": "\\E088", + "fontCharacter": "\\E090", "fontColor": "#9068b0" }, "_wat": { - "fontCharacter": "\\E088", + "fontCharacter": "\\E090", "fontColor": "#a074c4" }, "_webpack_light": { - "fontCharacter": "\\E089", + "fontCharacter": "\\E091", "fontColor": "#498ba7" }, "_webpack": { - "fontCharacter": "\\E089", + "fontCharacter": "\\E091", "fontColor": "#519aba" }, "_wgt_light": { - "fontCharacter": "\\E08A", + "fontCharacter": "\\E092", "fontColor": "#498ba7" }, "_wgt": { - "fontCharacter": "\\E08A", + "fontCharacter": "\\E092", "fontColor": "#519aba" }, "_windows_light": { - "fontCharacter": "\\E08B", + "fontCharacter": "\\E093", "fontColor": "#498ba7" }, "_windows": { - "fontCharacter": "\\E08B", + "fontCharacter": "\\E093", "fontColor": "#519aba" }, "_word_light": { - "fontCharacter": "\\E08C", + "fontCharacter": "\\E094", "fontColor": "#498ba7" }, "_word": { - "fontCharacter": "\\E08C", + "fontCharacter": "\\E094", "fontColor": "#519aba" }, "_xls_light": { - "fontCharacter": "\\E08D", + "fontCharacter": "\\E095", "fontColor": "#7fae42" }, "_xls": { - "fontCharacter": "\\E08D", + "fontCharacter": "\\E095", "fontColor": "#8dc149" }, "_xml_light": { - "fontCharacter": "\\E08E", + "fontCharacter": "\\E096", "fontColor": "#cc6d2e" }, "_xml": { - "fontCharacter": "\\E08E", + "fontCharacter": "\\E096", "fontColor": "#e37933" }, "_yarn_light": { - "fontCharacter": "\\E08F", + "fontCharacter": "\\E097", "fontColor": "#498ba7" }, "_yarn": { - "fontCharacter": "\\E08F", + "fontCharacter": "\\E097", "fontColor": "#519aba" }, "_yml_light": { - "fontCharacter": "\\E090", + "fontCharacter": "\\E098", "fontColor": "#9068b0" }, "_yml": { - "fontCharacter": "\\E090", + "fontCharacter": "\\E098", "fontColor": "#a074c4" }, "_zip_light": { - "fontCharacter": "\\E091", + "fontCharacter": "\\E099", "fontColor": "#b8383d" }, "_zip": { - "fontCharacter": "\\E091", + "fontCharacter": "\\E099", "fontColor": "#cc3e44" }, "_zip_1_light": { - "fontCharacter": "\\E091", + "fontCharacter": "\\E099", "fontColor": "#627379" }, "_zip_1": { - "fontCharacter": "\\E091", + "fontCharacter": "\\E099", "fontColor": "#6d8086" } }, @@ -1249,6 +1345,10 @@ "asm": "_asm", "s": "_asm", "h": "_c_1", + "aspx": "_html", + "ascx": "_html_1", + "asax": "_html_2", + "master": "_html_2", "hh": "_cpp_1", "hpp": "_cpp_1", "hxx": "_cpp_1", @@ -1286,6 +1386,8 @@ "article": "_go", "gradle": "_gradle", "gsp": "_grails", + "gql": "_graphql", + "graphql": "_graphql", "haml": "_haml", "hs": "_haskell", "lhs": "_haskell", @@ -1305,6 +1407,7 @@ "jl": "_julia", "kt": "_kotlin", "kts": "_kotlin", + "dart": "_dart", "liquid": "_liquid", "ls": "_livescript", "argdown": "_argdown", @@ -1326,10 +1429,14 @@ "cmxa": "_ocaml", "odata": "_odata", "php.inc": "_php", + "pddl": "_pddl", + "plan": "_plan", + "happenings": "_happenings", "pug": "_pug", "pp": "_puppet", "epp": "_puppet", "cjsx": "_react", + "re": "_reasonml", "r": "_R", "erb": "_html_erb", "erb.html": "_html_erb", @@ -1352,6 +1459,9 @@ "toml": "_config", "twig": "_twig", "spec.ts": "_typescript_1", + "test.ts": "_typescript_1", + "spec.tsx": "_typescript_1", + "test.tsx": "_typescript_1", "vala": "_vala", "vapi": "_vala", "vue": "_vue", @@ -1452,6 +1562,7 @@ "gulpfile": "_gulp", "ionic.config.json": "_ionic", "ionic.project": "_ionic", + "platformio.ini": "_platformio", "rollup.config.js": "_rollup", "sass-lint.yml": "_sass", "stylelint.config.js": "_stylelint", @@ -1459,6 +1570,9 @@ "yarn.lock": "_yarn", "webpack.config.js": "_webpack", "webpack.config.build.js": "_webpack", + "webpack.common.js": "_webpack", + "webpack.dev.js": "_webpack", + "webpack.prod.js": "_webpack", "license": "_license", "licence": "_license", "copying": "_license", @@ -1475,6 +1589,7 @@ "bat": "_windows", "clojure": "_clojure", "coffeescript": "_coffee", + "jsonc": "_tsconfig", "c": "_c", "cpp": "_cpp", "csharp": "_c-sharp", @@ -1484,7 +1599,7 @@ "go": "_go2", "groovy": "_grails", "handlebars": "_mustache", - "html": "_html", + "html": "_html_3", "properties": "_java", "java": "_java", "javascriptreact": "_react", @@ -1495,12 +1610,14 @@ "makefile": "_makefile", "markdown": "_markdown", "objective-c": "_c_2", + "objective-cpp": "_cpp_2", "perl": "_perl", "php": "_php", "powershell": "_powershell", "jade": "_jade", "python": "_python", "r": "_R", + "razor": "_html", "ruby": "_ruby", "rust": "_rust", "scss": "_sass", @@ -1539,6 +1656,10 @@ "asm": "_asm_light", "s": "_asm_light", "h": "_c_1_light", + "aspx": "_html_light", + "ascx": "_html_1_light", + "asax": "_html_2_light", + "master": "_html_2_light", "hh": "_cpp_1_light", "hpp": "_cpp_1_light", "hxx": "_cpp_1_light", @@ -1576,6 +1697,8 @@ "article": "_go_light", "gradle": "_gradle_light", "gsp": "_grails_light", + "gql": "_graphql_light", + "graphql": "_graphql_light", "haml": "_haml_light", "hs": "_haskell_light", "lhs": "_haskell_light", @@ -1595,6 +1718,7 @@ "jl": "_julia_light", "kt": "_kotlin_light", "kts": "_kotlin_light", + "dart": "_dart_light", "liquid": "_liquid_light", "ls": "_livescript_light", "argdown": "_argdown_light", @@ -1616,10 +1740,14 @@ "cmxa": "_ocaml_light", "odata": "_odata_light", "php.inc": "_php_light", + "pddl": "_pddl_light", + "plan": "_plan_light", + "happenings": "_happenings_light", "pug": "_pug_light", "pp": "_puppet_light", "epp": "_puppet_light", "cjsx": "_react_light", + "re": "_reasonml_light", "r": "_R_light", "erb": "_html_erb_light", "erb.html": "_html_erb_light", @@ -1642,6 +1770,9 @@ "toml": "_config_light", "twig": "_twig_light", "spec.ts": "_typescript_1_light", + "test.ts": "_typescript_1_light", + "spec.tsx": "_typescript_1_light", + "test.tsx": "_typescript_1_light", "vala": "_vala_light", "vapi": "_vala_light", "vue": "_vue_light", @@ -1718,6 +1849,7 @@ "bat": "_windows_light", "clojure": "_clojure_light", "coffeescript": "_coffee_light", + "jsonc": "_tsconfig_light", "c": "_c_light", "cpp": "_cpp_light", "csharp": "_c-sharp_light", @@ -1727,7 +1859,7 @@ "go": "_go2_light", "groovy": "_grails_light", "handlebars": "_mustache_light", - "html": "_html_light", + "html": "_html_3_light", "properties": "_java_light", "java": "_java_light", "javascriptreact": "_react_light", @@ -1738,12 +1870,14 @@ "makefile": "_makefile_light", "markdown": "_markdown_light", "objective-c": "_c_2_light", + "objective-cpp": "_cpp_2_light", "perl": "_perl_light", "php": "_php_light", "powershell": "_powershell_light", "jade": "_jade_light", "python": "_python_light", "r": "_R_light", + "razor": "_html_light", "ruby": "_ruby_light", "rust": "_rust_light", "scss": "_sass_light", @@ -1801,6 +1935,7 @@ "gulpfile": "_gulp_light", "ionic.config.json": "_ionic_light", "ionic.project": "_ionic_light", + "platformio.ini": "_platformio_light", "rollup.config.js": "_rollup_light", "sass-lint.yml": "_sass_light", "stylelint.config.js": "_stylelint_light", @@ -1808,6 +1943,9 @@ "yarn.lock": "_yarn_light", "webpack.config.js": "_webpack_light", "webpack.config.build.js": "_webpack_light", + "webpack.common.js": "_webpack_light", + "webpack.dev.js": "_webpack_light", + "webpack.prod.js": "_webpack_light", "license": "_license_light", "licence": "_license_light", "copying": "_license_light", @@ -1820,5 +1958,5 @@ "npm-debug.log": "_npm_ignored_light" } }, - "version": "https://github.com/jesseweed/seti-ui/commit/89175d7f9e0c70cd325b80a18a3c77fc8eb7c798" + "version": "https://github.com/jesseweed/seti-ui/commit/59ef8c31d9a0c3cef688278c20c6c1c6a84db221" } \ No newline at end of file From 2467eab1338d03631cb4e11123b4ded84615aa0e Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 8 Jul 2019 17:04:22 +0200 Subject: [PATCH 1203/1449] polish --- src/vs/base/browser/ui/list/listView.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/base/browser/ui/list/listView.ts b/src/vs/base/browser/ui/list/listView.ts index d2678253ecd..d42777bec4b 100644 --- a/src/vs/base/browser/ui/list/listView.ts +++ b/src/vs/base/browser/ui/list/listView.ts @@ -571,7 +571,7 @@ export class ListView implements ISpliceable, IDisposable { const role = this.ariaProvider.getRole ? this.ariaProvider.getRole(item.element) : 'treeitem'; item.row!.domNode!.setAttribute('role', role); const checked = this.ariaProvider.isChecked ? this.ariaProvider.isChecked(item.element) : undefined; - if (checked !== undefined) { + if (typeof checked !== 'undefined') { item.row!.domNode!.setAttribute('aria-checked', String(checked)); } } From f176bee18192d6ea76479337e35d95c2ccbca9f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Mon, 8 Jul 2019 17:22:32 +0200 Subject: [PATCH 1204/1449] Cleanup distro dependencies installation (#76893) * depend directly on vsda * add vsda to remote * remove vsda cleanup rules * update distro * upgrade vsda * update distro * update vsda * remove vsda * add vsda rules * distro * distro --- build/.nativeignore | 10 ++--- .../common/installDistroDependencies.ts | 38 ------------------- .../darwin/product-build-darwin.yml | 12 +----- .../linux/product-build-linux-multiarch.yml | 6 +-- .../linux/product-build-linux.yml | 12 +----- build/azure-pipelines/product-compile.yml | 13 +------ .../win32/product-build-win32.yml | 15 ++------ build/gulpfile.mixin.js | 1 - build/gulpfile.vscode.js | 13 ------- package.json | 2 +- 10 files changed, 17 insertions(+), 105 deletions(-) delete mode 100644 build/azure-pipelines/common/installDistroDependencies.ts diff --git a/build/.nativeignore b/build/.nativeignore index e3dca97ca41..a4823bf719c 100644 --- a/build/.nativeignore +++ b/build/.nativeignore @@ -91,13 +91,13 @@ nsfw/includes/** !nsfw/build/Release/*.node !nsfw/**/*.a +vsda/build/** +vsda/ci/** +vsda/src/** +vsda/.gitignore vsda/binding.gyp vsda/README.md -vsda/build/** -vsda/*.bat -vsda/*.sh -vsda/*.cpp -vsda/*.h +vsda/targets !vsda/build/Release/vsda.node vscode-windows-ca-certs/**/* diff --git a/build/azure-pipelines/common/installDistroDependencies.ts b/build/azure-pipelines/common/installDistroDependencies.ts deleted file mode 100644 index a0dd3a295db..00000000000 --- a/build/azure-pipelines/common/installDistroDependencies.ts +++ /dev/null @@ -1,38 +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 * as path from 'path'; -import * as fs from 'fs'; - -function yarnInstall(packageName: string, cwd: string): void { - console.log(`yarn add --no-lockfile ${packageName}`, cwd); - cp.execSync(`yarn add --no-lockfile ${packageName}`, { cwd, stdio: 'inherit' }); -} - -/** - * Install additional dependencies listed on each quality `package.json` file. - */ -function main() { - const quality = process.env['VSCODE_QUALITY']; - - if (!quality) { - throw new Error('Missing VSCODE_QUALITY, can\'t install distro'); - } - - const rootPath = path.dirname(path.dirname(path.dirname(__dirname))); - const qualityPath = path.join(rootPath, 'quality', quality); - const packagePath = path.join(qualityPath, 'package.json'); - const pkg = JSON.parse(fs.readFileSync(packagePath, 'utf8')); - const dependencies = pkg.dependencies || {} as { [name: string]: string; }; - - Object.keys(dependencies).forEach(name => { - const url = dependencies[name]; - const cwd = process.argv.length < 3 ? process.cwd() : path.join(process.cwd(), process.argv[2]); - yarnInstall(url, cwd); - }); -} - -main(); \ No newline at end of file diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index f82b4acf503..cdf7eb2f1df 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -36,8 +36,6 @@ steps: set -e cat << EOF > ~/.netrc - machine monacotools.visualstudio.com - password $(devops-pat) machine github.com login vscode password $(github-distro-mixin-password) @@ -56,7 +54,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' @@ -68,7 +66,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) @@ -79,12 +77,6 @@ steps: displayName: Run postinstall scripts condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) -- script: | - set -e - CHILD_CONCURRENCY=1 node build/azure-pipelines/common/installDistroDependencies.js - CHILD_CONCURRENCY=1 node build/azure-pipelines/common/installDistroDependencies.js remote - displayName: Install distro dependencies - - script: | set -e yarn gulp mixin diff --git a/build/azure-pipelines/linux/product-build-linux-multiarch.yml b/build/azure-pipelines/linux/product-build-linux-multiarch.yml index 11af31f7bd3..66b6bbff713 100644 --- a/build/azure-pipelines/linux/product-build-linux-multiarch.yml +++ b/build/azure-pipelines/linux/product-build-linux-multiarch.yml @@ -45,8 +45,6 @@ steps: set -e cat << EOF > ~/.netrc - machine monacotools.visualstudio.com - password $(devops-pat) machine github.com login vscode password $(github-distro-mixin-password) @@ -65,7 +63,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' @@ -77,7 +75,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 99b58772c9c..1e48713cd86 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -37,8 +37,6 @@ steps: export npm_config_arch="$(VSCODE_ARCH)" cat << EOF > ~/.netrc - machine monacotools.visualstudio.com - password $(devops-pat) machine github.com login vscode password $(github-distro-mixin-password) @@ -57,7 +55,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' @@ -69,7 +67,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) @@ -80,12 +78,6 @@ steps: displayName: Run postinstall scripts condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) -- script: | - set -e - CHILD_CONCURRENCY=1 node build/azure-pipelines/common/installDistroDependencies.js - CHILD_CONCURRENCY=1 node build/azure-pipelines/common/installDistroDependencies.js remote - displayName: Install distro dependencies - - script: | set -e yarn gulp mixin diff --git a/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml index f1b4e4eba6c..cc2639f139c 100644 --- a/build/azure-pipelines/product-compile.yml +++ b/build/azure-pipelines/product-compile.yml @@ -34,8 +34,6 @@ steps: export npm_config_arch="$(VSCODE_ARCH)" cat << EOF > ~/.netrc - machine monacotools.visualstudio.com - password $(devops-pat) machine github.com login vscode password $(github-distro-mixin-password) @@ -56,7 +54,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) @@ -69,7 +67,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), ne(variables['CacheRestored'], 'true')) @@ -80,13 +78,6 @@ steps: displayName: Run postinstall scripts condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), eq(variables['CacheRestored'], 'true')) -- script: | - set -e - CHILD_CONCURRENCY=1 node build/azure-pipelines/common/installDistroDependencies.js - CHILD_CONCURRENCY=1 node build/azure-pipelines/common/installDistroDependencies.js remote - displayName: Install distro dependencies - condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true')) - # Mixin must run before optimize, because the CSS loader will # inline small SVGs - script: | diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 02922016fe3..66d8bf4af32 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -40,7 +40,7 @@ steps: - powershell: | . build/azure-pipelines/win32/exec.ps1 $ErrorActionPreference = "Stop" - "machine monacotools.visualstudio.com`npassword $(devops-pat)`nmachine github.com`nlogin vscode`npassword $(github-distro-mixin-password)" | Out-File "$env:USERPROFILE\_netrc" -Encoding ASCII + "machine github.com`nlogin vscode`npassword $(github-distro-mixin-password)" | Out-File "$env:USERPROFILE\_netrc" -Encoding ASCII exec { git config user.email "vscode@microsoft.com" } exec { git config user.name "VSCode" } @@ -59,7 +59,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 inputs: - keyfile: 'build/.cachesalt, .build/arch, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: 'build/.cachesalt, .build/arch, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' @@ -74,7 +74,7 @@ steps: - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 inputs: - keyfile: 'build/.cachesalt, .build/arch, .yarnrc, remote/.yarnrc, quality/*/package.json, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' + keyfile: 'build/.cachesalt, .build/arch, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' targetfolder: '**/node_modules, !**/node_modules/**/node_modules' vstsFeed: 'npm-vscode' condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) @@ -86,15 +86,6 @@ steps: displayName: Run postinstall scripts condition: and(succeeded(), eq(variables['CacheRestored'], 'true')) -- powershell: | - . build/azure-pipelines/win32/exec.ps1 - $ErrorActionPreference = "Stop" - $env:npm_config_arch="$(VSCODE_ARCH)" - $env:CHILD_CONCURRENCY="1" - exec { node build/azure-pipelines/common/installDistroDependencies.js } - exec { node build/azure-pipelines/common/installDistroDependencies.js remote } - displayName: Install distro dependencies - - powershell: | . build/azure-pipelines/win32/exec.ps1 $ErrorActionPreference = "Stop" diff --git a/build/gulpfile.mixin.js b/build/gulpfile.mixin.js index 0f9b1d990f3..a2b61d33ad3 100644 --- a/build/gulpfile.mixin.js +++ b/build/gulpfile.mixin.js @@ -28,7 +28,6 @@ gulp.task('mixin', function () { return vfs .src(`quality/${quality}/**`, { base: `quality/${quality}` }) .pipe(filter(f => !f.isDirectory())) - .pipe(filter(['**', '!**/package.json'])) .pipe(productJsonFilter) .pipe(buffer()) .pipe(json(o => Object.assign({}, require('../product.json'), o))) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 2475b3b6c45..2d73433dfd6 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -311,19 +311,6 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op const dependenciesSrc = _.flatten(productionDependencies.map(d => path.relative(root, d.path)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`])); - // Collect distro dependencies, if any - if (quality) { - const qualityPackagePath = path.join(root, 'quality', quality, 'package.json'); - - if (fs.existsSync(qualityPackagePath)) { - const pkg = JSON.parse(fs.readFileSync(qualityPackagePath, 'utf8')); - - // @ts-ignore JSON checking: dependencies is optional - const distroDependencies = _.flatten(Object.keys(pkg.dependencies || {}).map(d => [`node_modules/${d}/**`, `!node_modules/${d}/**/{test,tests}/**`])); - dependenciesSrc.push(...distroDependencies); - } - } - const deps = gulp.src(dependenciesSrc, { base: '.', dot: true }) .pipe(filter(['**', '!**/package-lock.json'])) .pipe(util.cleanNodeModules(path.join(__dirname, '.nativeignore'))) diff --git a/package.json b/package.json index 23d3a5504bf..e509252782f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "2069209483770ea54d4a020efa830fdc2d574025", + "distro": "382ae0863e9d7c4b14a176686e2065cf7f7f5a18", "author": { "name": "Microsoft Corporation" }, From 89c3ec088e2c2af022837bf7dbc1768a2b756c2f Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 8 Jul 2019 17:29:23 +0200 Subject: [PATCH 1205/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e509252782f..4b7ec1f3164 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "382ae0863e9d7c4b14a176686e2065cf7f7f5a18", + "distro": "58d6bc66af41677e68c378399cb12ad0a23ed145", "author": { "name": "Microsoft Corporation" }, From b07ff48eaef4baabcad09f89f3ca9b64a4eb76bc Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Mon, 8 Jul 2019 17:53:03 +0200 Subject: [PATCH 1206/1449] Add a test for * bug in C++ grammar Fixes #76774 --- .../cpp/test/colorize-fixtures/test.cpp | 2 + .../cpp/test/colorize-results/test_cpp.json | 275 ++++++++++++++++++ 2 files changed, 277 insertions(+) diff --git a/extensions/cpp/test/colorize-fixtures/test.cpp b/extensions/cpp/test/colorize-fixtures/test.cpp index bcf563621fb..4c38c6904d3 100644 --- a/extensions/cpp/test/colorize-fixtures/test.cpp +++ b/extensions/cpp/test/colorize-fixtures/test.cpp @@ -21,5 +21,7 @@ int main () { rect.set_values (3,4); cout << "area: " << rect.area(); Task::links_to; + int t = 2; + if (t > 0) puts("\n*************************************************"); return 0; } \ No newline at end of file diff --git a/extensions/cpp/test/colorize-results/test_cpp.json b/extensions/cpp/test/colorize-results/test_cpp.json index 0cda6fbe21a..4f8817ed2a0 100644 --- a/extensions/cpp/test/colorize-results/test_cpp.json +++ b/extensions/cpp/test/colorize-results/test_cpp.json @@ -1528,6 +1528,281 @@ "hc_black": "default: #FFFFFF" } }, + { + "c": "int", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp storage.type.primitive.cpp storage.type.built-in.primitive.cpp", + "r": { + "dark_plus": "storage.type: #569CD6", + "light_plus": "storage.type: #0000FF", + "dark_vs": "storage.type: #569CD6", + "light_vs": "storage.type: #0000FF", + "hc_black": "storage.type: #569CD6" + } + }, + { + "c": " t ", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "=", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp keyword.operator.assignment.cpp", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "2", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp constant.numeric.decimal.cpp", + "r": { + "dark_plus": "constant.numeric: #B5CEA8", + "light_plus": "constant.numeric: #09885A", + "dark_vs": "constant.numeric: #B5CEA8", + "light_vs": "constant.numeric: #09885A", + "hc_black": "constant.numeric: #B5CEA8" + } + }, + { + "c": ";", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "if", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp keyword.control.if.cpp", + "r": { + "dark_plus": "keyword.control: #C586C0", + "light_plus": "keyword.control: #AF00DB", + "dark_vs": "keyword.control: #569CD6", + "light_vs": "keyword.control: #0000FF", + "hc_black": "keyword.control: #C586C0" + } + }, + { + "c": " ", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "(", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.parens.cpp punctuation.section.parens.begin.bracket.round.cpp", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "t ", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.parens.cpp", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ">", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.parens.cpp keyword.operator.comparison.cpp", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.parens.cpp", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "0", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.parens.cpp constant.numeric.decimal.cpp", + "r": { + "dark_plus": "constant.numeric: #B5CEA8", + "light_plus": "constant.numeric: #09885A", + "dark_vs": "constant.numeric: #B5CEA8", + "light_vs": "constant.numeric: #09885A", + "hc_black": "constant.numeric: #B5CEA8" + } + }, + { + "c": ")", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp meta.parens.cpp punctuation.section.parens.end.bracket.round.cpp", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "puts", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp entity.name.function.call.cpp", + "r": { + "dark_plus": "entity.name.function: #DCDCAA", + "light_plus": "entity.name.function: #795E26", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "entity.name.function: #DCDCAA" + } + }, + { + "c": "(", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.arguments.begin.bracket.round.function.call.cpp", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "\"", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp punctuation.definition.string.begin.cpp", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" + } + }, + { + "c": "\\n", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp constant.character.escape.cpp", + "r": { + "dark_plus": "constant.character.escape: #D7BA7D", + "light_plus": "constant.character.escape: #FF0000", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "constant.character: #569CD6" + } + }, + { + "c": "*************************************************", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" + } + }, + { + "c": "\"", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp punctuation.definition.string.end.cpp", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" + } + }, + { + "c": ")", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.section.arguments.end.bracket.round.function.call.cpp", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ";", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp punctuation.terminator.statement.cpp", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, { "c": "return", "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp keyword.control.return.cpp", From a70ca602bc8f6529e2eeffc3512bf51f0b5c7a7e Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Mon, 8 Jul 2019 18:07:16 +0200 Subject: [PATCH 1207/1449] Adopt new tree in custom views (#76407) Auto expand initial state of tree nodes is not yet implemented. Part of #63566 --- src/vs/base/browser/ui/tree/treeDefaults.ts | 25 ++ .../api/browser/mainThreadTreeViews.ts | 5 +- .../api/browser/viewsExtensionPoint.ts | 2 +- .../browser/parts/views/customView.ts | 322 +++++++++--------- .../browser/parts/views/media/views.css | 27 +- 5 files changed, 205 insertions(+), 176 deletions(-) create mode 100644 src/vs/base/browser/ui/tree/treeDefaults.ts diff --git a/src/vs/base/browser/ui/tree/treeDefaults.ts b/src/vs/base/browser/ui/tree/treeDefaults.ts new file mode 100644 index 00000000000..03b8665cd64 --- /dev/null +++ b/src/vs/base/browser/ui/tree/treeDefaults.ts @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as nls from 'vs/nls'; +import { Action } from 'vs/base/common/actions'; +import { AsyncDataTree } from 'vs/base/browser/ui/tree/asyncDataTree'; + +export class CollapseAllAction extends Action { + + constructor(private viewer: AsyncDataTree, enabled: boolean) { + super('vs.tree.collapse', nls.localize('collapse all', "Collapse All"), 'monaco-tree-action collapse-all', enabled); + } + + public run(context?: any): Promise { + this.viewer.collapseAll(); + this.viewer.setSelection([]); + this.viewer.setFocus([]); + this.viewer.domFocus(); + this.viewer.focusFirst(); + + return Promise.resolve(); + } +} \ No newline at end of file diff --git a/src/vs/workbench/api/browser/mainThreadTreeViews.ts b/src/vs/workbench/api/browser/mainThreadTreeViews.ts index f7aa4f1dad9..ba23ab500c8 100644 --- a/src/vs/workbench/api/browser/mainThreadTreeViews.ts +++ b/src/vs/workbench/api/browser/mainThreadTreeViews.ts @@ -81,7 +81,10 @@ export class MainThreadTreeViews extends Disposable implements MainThreadTreeVie await treeView.refresh(); } for (const parent of parentChain) { - await treeView.expand(parent); + const parentItem = dataProvider.getItem(parent.handle); + if (parentItem) { + await treeView.expand(parentItem); + } } const item = dataProvider.getItem(itemIn.handle); if (item) { diff --git a/src/vs/workbench/api/browser/viewsExtensionPoint.ts b/src/vs/workbench/api/browser/viewsExtensionPoint.ts index 687ce57cd78..149f1f4cebe 100644 --- a/src/vs/workbench/api/browser/viewsExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsExtensionPoint.ts @@ -383,7 +383,7 @@ class ViewsExtensionHandler implements IWorkbenchContribution { when: ContextKeyExpr.deserialize(item.when), canToggleVisibility: true, collapsed: this.showCollapsed(container), - treeView: this.instantiationService.createInstance(CustomTreeView, item.id, container), + treeView: this.instantiationService.createInstance(CustomTreeView, item.id, item.name, container), order: ExtensionIdentifier.equals(extension.description.identifier, container.extensionId) ? index + 1 : undefined, extensionId: extension.description.identifier, originalContainerId: entry.key diff --git a/src/vs/workbench/browser/parts/views/customView.ts b/src/vs/workbench/browser/parts/views/customView.ts index 11812612e5d..4eafe940c88 100644 --- a/src/vs/workbench/browser/parts/views/customView.ts +++ b/src/vs/workbench/browser/parts/views/customView.ts @@ -14,7 +14,7 @@ import { IMenuService, MenuId, MenuItemAction } from 'vs/platform/actions/common import { ContextAwareMenuEntryActionViewItem, createAndFillInActionBarActions, createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IViewsService, ITreeView, ITreeItem, TreeItemCollapsibleState, ITreeViewDataProvider, TreeViewItemHandleArg, ITreeViewDescriptor, IViewsRegistry, ViewContainer, ITreeItemLabel, Extensions } from 'vs/workbench/common/views'; -import { IViewletViewOptions, FileIconThemableWorkbenchTree } from 'vs/workbench/browser/parts/views/viewsViewlet'; +import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IProgressService } from 'vs/platform/progress/common/progress'; @@ -22,19 +22,16 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; import { ICommandService } from 'vs/platform/commands/common/commands'; import * as DOM from 'vs/base/browser/dom'; -import { IDataSource, ITree, IRenderer, ContextMenuEvent } from 'vs/base/parts/tree/browser/tree'; import { ResourceLabels, IResourceLabel } from 'vs/workbench/browser/labels'; import { ActionBar, IActionViewItemProvider, ActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { URI } from 'vs/base/common/uri'; import { dirname, basename } from 'vs/base/common/resources'; import { LIGHT, FileThemeIcon, FolderThemeIcon, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { FileKind } from 'vs/platform/files/common/files'; -import { WorkbenchTreeController } from 'vs/platform/list/browser/listService'; +import { WorkbenchAsyncDataTree } from 'vs/platform/list/browser/listService'; import { ViewletPanel, IViewletPanelOptions } from 'vs/workbench/browser/parts/views/panelViewlet'; -import { IMouseEvent } from 'vs/base/browser/mouseEvent'; import { localize } from 'vs/nls'; import { timeout } from 'vs/base/common/async'; -import { CollapseAllAction } from 'vs/base/parts/tree/browser/treeDefaults'; import { editorFindMatchHighlight, editorFindMatchHighlightBorder, textLinkForeground, textCodeBlockBackground, focusBorder } from 'vs/platform/theme/common/colorRegistry'; import { IMarkdownString } from 'vs/base/common/htmlContent'; import { isString } from 'vs/base/common/types'; @@ -44,6 +41,10 @@ import { IOpenerService } from 'vs/platform/opener/common/opener'; import { IMarkdownRenderResult } from 'vs/editor/contrib/markdown/markdownRenderer'; import { ILabelService } from 'vs/platform/label/common/label'; import { Registry } from 'vs/platform/registry/common/platform'; +import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; +import { ITreeRenderer, ITreeNode, IAsyncDataSource, ITreeContextMenuEvent, ITreeEvent } from 'vs/base/browser/ui/tree/tree'; +import { FuzzyScore, createMatches } from 'vs/base/common/filters'; +import { CollapseAllAction } from 'vs/base/browser/ui/tree/treeDefaults'; export class CustomTreeViewPanel extends ViewletPanel { @@ -168,7 +169,7 @@ export class CustomTreeView extends Disposable implements ITreeView { private treeContainer: HTMLElement; private _messageValue: string | IMarkdownString | undefined; private messageElement: HTMLDivElement; - private tree: FileIconThemableWorkbenchTree; + private tree: WorkbenchAsyncDataTree; private treeLabels: ResourceLabels; private root: ITreeItem; private elementsToRefresh: ITreeItem[] = []; @@ -194,13 +195,16 @@ export class CustomTreeView extends Disposable implements ITreeView { constructor( private id: string, + private title: string, private viewContainer: ViewContainer, @IExtensionService private readonly extensionService: IExtensionService, @IWorkbenchThemeService private readonly themeService: IWorkbenchThemeService, @IInstantiationService private readonly instantiationService: IInstantiationService, @ICommandService private readonly commandService: ICommandService, @IConfigurationService private readonly configurationService: IConfigurationService, - @IProgressService private readonly progressService: IProgressService + @IProgressService private readonly progressService: IProgressService, + @IContextMenuService private readonly contextMenuService: IContextMenuService, + @IKeybindingService private readonly keybindingService: IKeybindingService ) { super(); this.root = new Root(); @@ -287,7 +291,7 @@ export class CustomTreeView extends Disposable implements ITreeView { getPrimaryActions(): IAction[] { if (this.showCollapseAllAction) { - const collapseAllAction = new Action('vs.tree.collapse', localize('collapseAll', "Collapse All"), 'monaco-tree-action collapse-all', true, () => this.tree ? new CollapseAllAction(this.tree, true).run() : Promise.resolve()); + const collapseAllAction = new Action('vs.tree.collapse', localize('collapseAll', "Collapse All"), 'monaco-tree-action collapse-all', true, () => this.tree ? new CollapseAllAction(this.tree, true).run() : Promise.resolve()); return [...this.menus.getTitleActions(), collapseAllAction]; } else { return this.menus.getTitleActions(); @@ -316,12 +320,6 @@ export class CustomTreeView extends Disposable implements ITreeView { DOM.hide(this.tree.getHTMLElement()); // make sure the tree goes out of the tabindex world by hiding it } - if (this.isVisible) { - this.tree.onVisible(); - } else { - this.tree.onHidden(); - } - if (this.isVisible && this.elementsToRefresh.length) { this.doRefresh(this.elementsToRefresh); this.elementsToRefresh = []; @@ -354,6 +352,8 @@ export class CustomTreeView extends Disposable implements ITreeView { this.domNode = DOM.$('.tree-explorer-viewlet-tree-view'); this.messageElement = DOM.append(this.domNode, DOM.$('.message')); this.treeContainer = DOM.append(this.domNode, DOM.$('.customview-tree')); + DOM.addClass(this.treeContainer, 'file-icon-themable-tree'); + DOM.addClass(this.treeContainer, 'show-file-icons'); const focusTracker = this._register(DOM.trackFocus(this.domNode)); this._register(focusTracker.onDidFocus(() => this.focused = true)); this._register(focusTracker.onDidBlur(() => this.focused = false)); @@ -361,20 +361,84 @@ export class CustomTreeView extends Disposable implements ITreeView { private createTree() { const actionViewItemProvider = (action: IAction) => action instanceof MenuItemAction ? this.instantiationService.createInstance(ContextAwareMenuEntryActionViewItem, action) : undefined; - const menus = this._register(this.instantiationService.createInstance(TreeMenus, this.id)); + const treeMenus = this._register(this.instantiationService.createInstance(TreeMenus, this.id)); this.treeLabels = this._register(this.instantiationService.createInstance(ResourceLabels, this)); const dataSource = this.instantiationService.createInstance(TreeDataSource, this, (task: Promise) => this.progressService.withProgress({ location: this.viewContainer.id }, () => task)); - const renderer = this.instantiationService.createInstance(TreeRenderer, this.id, menus, this.treeLabels, actionViewItemProvider); - const controller = this.instantiationService.createInstance(TreeController, this.id, menus); - this.tree = this._register(this.instantiationService.createInstance(FileIconThemableWorkbenchTree, this.treeContainer, { dataSource, renderer, controller }, {})); + const aligner = new Aligner(this.themeService); + const renderer = this.instantiationService.createInstance(TreeRenderer, this.id, treeMenus, this.treeLabels, actionViewItemProvider, aligner); + + this.tree = this._register(this.instantiationService.createInstance(WorkbenchAsyncDataTree, this.treeContainer, new CustomTreeDelegate(), [renderer], + dataSource, { + accessibilityProvider: { + getAriaLabel(element: ITreeItem): string { + return element.label ? element.label.label : ''; + } + }, + ariaLabel: this.title, + keyboardNavigationLabelProvider: { + getKeyboardNavigationLabel: (item: ITreeItem) => { + return item.label ? item.label.label : (item.resourceUri ? basename(URI.revive(item.resourceUri)) : undefined); + } + }, + expandOnlyOnTwistieClick: (e: ITreeItem) => !!e.command + }) as WorkbenchAsyncDataTree); + aligner.tree = this.tree; + this.tree.contextKeyService.createKey(this.id, true); this._register(this.tree.onDidChangeSelection(e => this.onSelection(e))); - this._register(this.tree.onDidExpandItem(e => this._onDidExpandItem.fire(e.item.getElement()))); - this._register(this.tree.onDidCollapseItem(e => this._onDidCollapseItem.fire(e.item.getElement()))); - this._register(this.tree.onDidChangeSelection(e => this._onDidChangeSelection.fire(e.selection))); + this._register(this.tree.onContextMenu(e => this.onContextMenu(treeMenus, e))); + this._register(this.tree.onDidChangeSelection(e => this._onDidChangeSelection.fire(e.elements))); + this._register(this.tree.onDidChangeCollapseState(e => { + const element: ITreeItem = Array.isArray(e.node.element.element) ? e.node.element.element[0] : e.node.element.element; + if (e.node.collapsed) { + this._onDidCollapseItem.fire(element); + } else { + this._onDidExpandItem.fire(element); + } + })); this.tree.setInput(this.root).then(() => this.updateContentAreas()); } + private onContextMenu(treeMenus: TreeMenus, treeEvent: ITreeContextMenuEvent): void { + const node: ITreeItem | null = treeEvent.element; + if (node === null) { + return; + } + const event: UIEvent = treeEvent.browserEvent; + + event.preventDefault(); + event.stopPropagation(); + + this.tree.setFocus([node]); + const actions = treeMenus.getResourceContextActions(node); + if (!actions.length) { + return; + } + this.contextMenuService.showContextMenu({ + getAnchor: () => treeEvent.anchor, + + getActions: () => actions, + + getActionViewItem: (action) => { + const keybinding = this.keybindingService.lookupKeybinding(action.id); + if (keybinding) { + return new ActionViewItem(action, action, { label: true, keybinding: keybinding.getLabel() }); + } + return undefined; + }, + + onHide: (wasCancelled?: boolean) => { + if (wasCancelled) { + this.tree.domFocus(); + } + }, + + getActionsContext: () => ({ $treeViewId: this.id, $treeItemHandle: node.handle }), + + actionRunner: new MultipleSelectionActionRunner(() => this.tree.getSelection()) + }); + } + private updateMessage(): void { if (this._message) { this.showMessage(this._message); @@ -465,30 +529,32 @@ export class CustomTreeView extends Disposable implements ITreeView { return Promise.resolve(undefined); } - expand(itemOrItems: ITreeItem | ITreeItem[]): Promise { + async expand(itemOrItems: ITreeItem | ITreeItem[]): Promise { if (this.tree) { itemOrItems = Array.isArray(itemOrItems) ? itemOrItems : [itemOrItems]; - return this.tree.expandAll(itemOrItems); + await Promise.all(itemOrItems.map(element => { + return this.tree.expand(element, false); + })); } return Promise.resolve(undefined); } setSelection(items: ITreeItem[]): void { if (this.tree) { - this.tree.setSelection(items, { source: 'api' }); + this.tree.setSelection(items); } } setFocus(item: ITreeItem): void { if (this.tree) { this.focus(); - this.tree.setFocus(item); + this.tree.setFocus([item]); } } reveal(item: ITreeItem): Promise { if (this.tree) { - return this.tree.reveal(item); + return Promise.resolve(this.tree.reveal(item)); } return Promise.resolve(); } @@ -509,7 +575,7 @@ export class CustomTreeView extends Disposable implements ITreeView { private async doRefresh(elements: ITreeItem[]): Promise { if (this.tree) { this.refreshing = true; - await Promise.all(elements.map(e => this.tree.refresh(e))); + await Promise.all(elements.map(element => this.tree.updateChildren(element, true))); this.refreshing = false; this.updateContentAreas(); if (this.focused) { @@ -530,18 +596,14 @@ export class CustomTreeView extends Disposable implements ITreeView { } } - private onSelection({ payload }: any): void { - if (payload && (!!payload.didClickOnTwistie || payload.source === 'api')) { + private onSelection(e: ITreeEvent): void { + if (!e.browserEvent) { return; } const selection: ITreeItem = this.tree.getSelection()[0]; if (selection) { if (selection.command) { - const originalEvent: KeyboardEvent | MouseEvent = payload && payload.originalEvent; - const isMouseEvent = payload && payload.origin === 'mouse'; - const isDoubleClick = isMouseEvent && originalEvent && originalEvent.detail === 2; - - if (!isMouseEvent || this.tree.openOnSingleClick || isDoubleClick) { + if (this.tree.openOnSingleClick) { this.commandService.executeCommand(selection.command.id, ...(selection.command.arguments || [])); } } @@ -549,7 +611,18 @@ export class CustomTreeView extends Disposable implements ITreeView { } } -class TreeDataSource implements IDataSource { +class CustomTreeDelegate implements IListVirtualDelegate { + + getHeight(element: ITreeItem): number { + return TreeRenderer.ITEM_HEIGHT; + } + + getTemplateId(element: ITreeItem): string { + return TreeRenderer.TREE_TEMPLATE_ID; + } +} + +class TreeDataSource implements IAsyncDataSource { constructor( private treeView: ITreeView, @@ -557,35 +630,16 @@ class TreeDataSource implements IDataSource { ) { } - getId(tree: ITree, node: ITreeItem): string { - return node.handle; + hasChildren(element: ITreeItem): boolean { + return !!this.treeView.dataProvider && (element.collapsibleState !== TreeItemCollapsibleState.None); } - hasChildren(tree: ITree, node: ITreeItem): boolean { - return !!this.treeView.dataProvider && node.collapsibleState !== TreeItemCollapsibleState.None; - } - - getChildren(tree: ITree, node: ITreeItem): Promise { + getChildren(element: ITreeItem): ITreeItem[] | Promise { if (this.treeView.dataProvider) { - return this.withProgress(this.treeView.dataProvider.getChildren(node)); + return this.withProgress(this.treeView.dataProvider.getChildren(element)); } return Promise.resolve([]); } - - shouldAutoexpand(tree: ITree, node: ITreeItem): boolean { - return node.collapsibleState === TreeItemCollapsibleState.Expanded; - } - - getParent(tree: ITree, node: any): Promise { - return Promise.resolve(null); - } -} - -interface ITreeExplorerTemplateData { - resourceLabel: IResourceLabel; - icon: HTMLElement; - actionBar: ActionBar; - aligner: Aligner; } // todo@joh,sandy make this proper and contributable from extensions @@ -593,21 +647,21 @@ registerThemingParticipant((theme, collector) => { const findMatchHighlightColor = theme.getColor(editorFindMatchHighlight); if (findMatchHighlightColor) { - collector.addRule(`.file-icon-themable-tree .monaco-tree-row .content .monaco-highlighted-label .highlight { color: unset !important; background-color: ${findMatchHighlightColor}; }`); + collector.addRule(`.file-icon-themable-tree .monaco-list-row .content .monaco-highlighted-label .highlight { color: unset !important; background-color: ${findMatchHighlightColor}; }`); collector.addRule(`.monaco-tl-contents .monaco-highlighted-label .highlight { color: unset !important; background-color: ${findMatchHighlightColor}; }`); } const findMatchHighlightColorBorder = theme.getColor(editorFindMatchHighlightBorder); if (findMatchHighlightColorBorder) { - collector.addRule(`.file-icon-themable-tree .monaco-tree-row .content .monaco-highlighted-label .highlight { color: unset !important; border: 1px dotted ${findMatchHighlightColorBorder}; box-sizing: border-box; }`); + collector.addRule(`.file-icon-themable-tree .monaco-list-row .content .monaco-highlighted-label .highlight { color: unset !important; border: 1px dotted ${findMatchHighlightColorBorder}; box-sizing: border-box; }`); collector.addRule(`.monaco-tl-contents .monaco-highlighted-label .highlight { color: unset !important; border: 1px dotted ${findMatchHighlightColorBorder}; box-sizing: border-box; }`); } const link = theme.getColor(textLinkForeground); if (link) { collector.addRule(`.tree-explorer-viewlet-tree-view > .message a { color: ${link}; }`); } - const focustBorderColor = theme.getColor(focusBorder); - if (focustBorderColor) { - collector.addRule(`.tree-explorer-viewlet-tree-view > .message a:focus { outline: 1px solid ${focustBorderColor}; outline-offset: -1px; }`); + const focusBorderColor = theme.getColor(focusBorder); + if (focusBorderColor) { + collector.addRule(`.tree-explorer-viewlet-tree-view > .message a:focus { outline: 1px solid ${focusBorderColor}; outline-offset: -1px; }`); } const codeBackground = theme.getColor(textCodeBlockBackground); if (codeBackground) { @@ -615,51 +669,56 @@ registerThemingParticipant((theme, collector) => { } }); -class TreeRenderer implements IRenderer { +interface ITreeExplorerTemplateData { + elementDisposable: IDisposable; + container: HTMLElement; + resourceLabel: IResourceLabel; + icon: HTMLElement; + actionBar: ActionBar; +} - private static readonly ITEM_HEIGHT = 22; - private static readonly TREE_TEMPLATE_ID = 'treeExplorer'; +class TreeRenderer extends Disposable implements ITreeRenderer { + static readonly ITEM_HEIGHT = 22; + static readonly TREE_TEMPLATE_ID = 'treeExplorer'; constructor( private treeViewId: string, private menus: TreeMenus, private labels: ResourceLabels, private actionViewItemProvider: IActionViewItemProvider, + private aligner: Aligner, @IWorkbenchThemeService private readonly themeService: IWorkbenchThemeService, @IConfigurationService private readonly configurationService: IConfigurationService, @ILabelService private readonly labelService: ILabelService ) { + super(); } - getHeight(tree: ITree, element: any): number { - return TreeRenderer.ITEM_HEIGHT; - } - - getTemplateId(tree: ITree, element: any): string { + get templateId(): string { return TreeRenderer.TREE_TEMPLATE_ID; } - renderTemplate(tree: ITree, templateId: string, container: HTMLElement): ITreeExplorerTemplateData { + renderTemplate(container: HTMLElement): ITreeExplorerTemplateData { DOM.addClass(container, 'custom-view-tree-node-item'); const icon = DOM.append(container, DOM.$('.custom-view-tree-node-item-icon')); + const resourceLabel = this.labels.create(container, { supportHighlights: true, donotSupportOcticons: true }); - DOM.addClass(resourceLabel.element, 'custom-view-tree-node-item-resourceLabel'); - const actionsContainer = DOM.append(resourceLabel.element, DOM.$('.actions')); + const actionsContainer = DOM.append(container, DOM.$('.actions')); const actionBar = new ActionBar(actionsContainer, { - actionViewItemProvider: this.actionViewItemProvider, - actionRunner: new MultipleSelectionActionRunner(() => tree.getSelection()) + actionViewItemProvider: this.actionViewItemProvider }); - return { resourceLabel, icon, actionBar, aligner: new Aligner(container, tree, this.themeService) }; + return { resourceLabel, icon, actionBar, container, elementDisposable: Disposable.None }; } - renderElement(tree: ITree, node: ITreeItem, templateId: string, templateData: ITreeExplorerTemplateData): void { + renderElement(element: ITreeNode, index: number, templateData: ITreeExplorerTemplateData): void { + templateData.elementDisposable.dispose(); + const node = element.element; const resource = node.resourceUri ? URI.revive(node.resourceUri) : null; const treeItemLabel: ITreeItemLabel | undefined = node.label ? node.label : resource ? { label: basename(resource) } : undefined; const description = isString(node.description) ? node.description : resource && node.description === true ? this.labelService.getUriLabel(dirname(resource), { relative: true }) : undefined; const label = treeItemLabel ? treeItemLabel.label : undefined; - const matches = treeItemLabel && treeItemLabel.highlights ? treeItemLabel.highlights.map(([start, end]) => ({ start, end })) : undefined; const icon = this.themeService.getTheme().type === LIGHT ? node.icon : node.iconDark; const iconUrl = icon ? URI.revive(icon) : null; const title = node.tooltip ? node.tooltip : resource ? undefined : label; @@ -669,17 +728,21 @@ class TreeRenderer implements IRenderer { if (resource || node.themeIcon) { const fileDecorations = this.configurationService.getValue<{ colors: boolean, badges: boolean }>('explorer.decorations'); - templateData.resourceLabel.setResource({ name: label, description, resource: resource ? resource : URI.parse('missing:_icon_resource') }, { fileKind: this.getFileKind(node), title, hideIcon: !!iconUrl, fileDecorations, extraClasses: ['custom-view-tree-node-item-resourceLabel'], matches }); + templateData.resourceLabel.setResource({ name: label, description, resource: resource ? resource : URI.parse('missing:_icon_resource') }, { fileKind: this.getFileKind(node), title, hideIcon: !!iconUrl, fileDecorations, extraClasses: ['custom-view-tree-node-item-resourceLabel'], matches: createMatches(element.filterData) }); } else { - templateData.resourceLabel.setResource({ name: label, description }, { title, hideIcon: true, extraClasses: ['custom-view-tree-node-item-resourceLabel'], matches }); + templateData.resourceLabel.setResource({ name: label, description }, { title, hideIcon: true, extraClasses: ['custom-view-tree-node-item-resourceLabel'], matches: createMatches(element.filterData) }); } templateData.icon.style.backgroundImage = iconUrl ? `url('${DOM.asDomUri(iconUrl).toString(true)}')` : ''; DOM.toggleClass(templateData.icon, 'custom-view-tree-node-item-icon', !!iconUrl); templateData.actionBar.context = ({ $treeViewId: this.treeViewId, $treeItemHandle: node.handle }); templateData.actionBar.push(this.menus.getResourceActions(node), { icon: true, label: false }); + this.setAlignment(templateData.container, node); + templateData.elementDisposable = (this.themeService.onDidFileIconThemeChange(() => this.setAlignment(templateData.container, node))); + } - templateData.aligner.treeItem = node; + private setAlignment(container: HTMLElement, treeItem: ITreeItem) { + DOM.toggleClass(container.parentElement!, 'align-icon-with-twisty', this.aligner.alignIconWithTwisty(treeItem)); } private getFileKind(node: ITreeItem): FileKind { @@ -694,46 +757,37 @@ class TreeRenderer implements IRenderer { return node.collapsibleState === TreeItemCollapsibleState.Collapsed || node.collapsibleState === TreeItemCollapsibleState.Expanded ? FileKind.FOLDER : FileKind.FILE; } - disposeTemplate(tree: ITree, templateId: string, templateData: ITreeExplorerTemplateData): void { + disposeElement(resource: ITreeNode, index: number, templateData: ITreeExplorerTemplateData): void { + templateData.elementDisposable.dispose(); + } + + disposeTemplate(templateData: ITreeExplorerTemplateData): void { templateData.resourceLabel.dispose(); templateData.actionBar.dispose(); - templateData.aligner.dispose(); + templateData.elementDisposable.dispose(); } } class Aligner extends Disposable { + private _tree: WorkbenchAsyncDataTree; - private _treeItem: ITreeItem; - - constructor( - private container: HTMLElement, - private tree: ITree, - private themeService: IWorkbenchThemeService - ) { + constructor(private themeService: IWorkbenchThemeService) { super(); - this._register(this.themeService.onDidFileIconThemeChange(() => this.render())); } - set treeItem(treeItem: ITreeItem) { - this._treeItem = treeItem; - this.render(); + set tree(tree: WorkbenchAsyncDataTree) { + this._tree = tree; } - private render(): void { - if (this._treeItem) { - DOM.toggleClass(this.container, 'align-icon-with-twisty', this.hasToAlignIconWithTwisty()); - } - } - - private hasToAlignIconWithTwisty(): boolean { - if (this._treeItem.collapsibleState !== TreeItemCollapsibleState.None) { + public alignIconWithTwisty(treeItem: ITreeItem): boolean { + if (treeItem.collapsibleState !== TreeItemCollapsibleState.None) { return false; } - if (!this.hasIcon(this._treeItem)) { + if (!this.hasIcon(treeItem)) { return false; - } - const parent: ITreeItem = this.tree.getNavigator(this._treeItem).parent() || this.tree.getInput(); + + const parent: ITreeItem = this._tree.getParentElement(treeItem) || this._tree.getInput(); if (this.hasIcon(parent)) { return false; } @@ -757,63 +811,9 @@ class Aligner extends Disposable { } } -class TreeController extends WorkbenchTreeController { - - constructor( - private treeViewId: string, - private menus: TreeMenus, - @IContextMenuService private readonly contextMenuService: IContextMenuService, - @IKeybindingService private readonly _keybindingService: IKeybindingService, - @IConfigurationService configurationService: IConfigurationService - ) { - super({}, configurationService); - } - - protected shouldToggleExpansion(element: ITreeItem, event: IMouseEvent, origin: string): boolean { - return element.command ? this.isClickOnTwistie(event) : super.shouldToggleExpansion(element, event, origin); - } - - onContextMenu(tree: ITree, node: ITreeItem, event: ContextMenuEvent): boolean { - event.preventDefault(); - event.stopPropagation(); - - tree.setFocus(node); - const actions = this.menus.getResourceContextActions(node); - if (!actions.length) { - return true; - } - const anchor = { x: event.posx, y: event.posy }; - this.contextMenuService.showContextMenu({ - getAnchor: () => anchor, - - getActions: () => actions, - - getActionViewItem: (action) => { - const keybinding = this._keybindingService.lookupKeybinding(action.id); - if (keybinding) { - return new ActionViewItem(action, action, { label: true, keybinding: keybinding.getLabel() }); - } - return undefined; - }, - - onHide: (wasCancelled?: boolean) => { - if (wasCancelled) { - tree.domFocus(); - } - }, - - getActionsContext: () => ({ $treeViewId: this.treeViewId, $treeItemHandle: node.handle }), - - actionRunner: new MultipleSelectionActionRunner(() => tree.getSelection()) - }); - - return true; - } -} - class MultipleSelectionActionRunner extends ActionRunner { - constructor(private getSelectedResources: () => any[]) { + constructor(private getSelectedResources: (() => any[])) { super(); } diff --git a/src/vs/workbench/browser/parts/views/media/views.css b/src/vs/workbench/browser/parts/views/media/views.css index 7469562967f..21ff6a8edc6 100644 --- a/src/vs/workbench/browser/parts/views/media/views.css +++ b/src/vs/workbench/browser/parts/views/media/views.css @@ -53,6 +53,7 @@ /* File icons in trees */ .file-icon-themable-tree.align-icons-and-twisties .monaco-tl-twistie:not(.collapsible), +.file-icon-themable-tree .align-icon-with-twisty .monaco-tl-twistie:not(.collapsible), .file-icon-themable-tree.hide-arrows .monaco-tl-twistie { background-image: none !important; width: 0 !important; @@ -93,19 +94,19 @@ display: none; } -.customview-tree.file-icon-themable-tree .monaco-tree-row .content.align-icon-with-twisty::before { +.customview-tree .monaco-list-row .monaco-tl-contents.align-icon-with-twisty::before { display: none; } -.customview-tree.file-icon-themable-tree .monaco-tree-row .content:not(.align-icon-with-twisty)::before { +.customview-tree .monaco-list-row .monaco-tl-contents:not(.align-icon-with-twisty)::before { display: inline-block; } -.customview-tree .monaco-tree .monaco-tree-row { +.customview-tree .monaco-list .monaco-list-row { padding-right: 12px; } -.customview-tree .monaco-tree .monaco-tree-row .custom-view-tree-node-item { +.customview-tree .monaco-list .monaco-list-row .custom-view-tree-node-item { display: flex; height: 22px; line-height: 22px; @@ -115,13 +116,13 @@ flex-wrap: nowrap } -.customview-tree .monaco-tree .monaco-tree-row .custom-view-tree-node-item .custom-view-tree-node-item-resourceLabel { +.customview-tree .monaco-list .monaco-list-row .custom-view-tree-node-item .custom-view-tree-node-item-resourceLabel { flex: 1; text-overflow: ellipsis; overflow: hidden; } -.customview-tree .monaco-tree .monaco-tree-row .custom-view-tree-node-item > .custom-view-tree-node-item-icon { +.customview-tree .monaco-list .monaco-list-row .custom-view-tree-node-item > .custom-view-tree-node-item-icon { background-size: 16px; background-position: left center; background-repeat: no-repeat; @@ -131,25 +132,25 @@ -webkit-font-smoothing: antialiased; } -.customview-tree .monaco-tree .monaco-tree-row .custom-view-tree-node-item > .custom-view-tree-node-item-resourceLabel .monaco-icon-label-description-container { +.customview-tree .monaco-list .monaco-list-row .custom-view-tree-node-item .custom-view-tree-node-item-resourceLabel .monaco-highlighted-label { flex: 1; } -.customview-tree .monaco-tree .monaco-tree-row .custom-view-tree-node-item > .custom-view-tree-node-item-resourceLabel::after { +.customview-tree .monaco-list .monaco-list-row .custom-view-tree-node-item .custom-view-tree-node-item-resourceLabel::after { padding-right: 0px; } -.customview-tree .monaco-tree .monaco-tree-row .custom-view-tree-node-item > .custom-view-tree-node-item-resourceLabel > .actions { +.customview-tree .monaco-list .monaco-list-row .custom-view-tree-node-item .actions { display: none; } -.customview-tree .monaco-tree .monaco-tree-row:hover .custom-view-tree-node-item > .custom-view-tree-node-item-resourceLabel > .actions, -.customview-tree .monaco-tree .monaco-tree-row.selected .custom-view-tree-node-item > .custom-view-tree-node-item-resourceLabel > .actions, -.customview-tree .monaco-tree .monaco-tree-row.focused .custom-view-tree-node-item > .custom-view-tree-node-item-resourceLabel > .actions { +.customview-tree .monaco-list .monaco-list-row:hover .custom-view-tree-node-item .actions, +.customview-tree .monaco-list .monaco-list-row.selected .custom-view-tree-node-item .actions, +.customview-tree .monaco-list .monaco-list-row.focused .custom-view-tree-node-item .actions { display: block; } -.customview-tree .monaco-tree .custom-view-tree-node-item > .custom-view-tree-node-item-resourceLabel > .actions .action-label { +.customview-tree .monaco-list .custom-view-tree-node-item .actions .action-label { width: 16px; height: 100%; background-size: 16px; From f104ade94b6ef5623b7365cffe31415565967078 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 8 Jul 2019 20:02:17 +0200 Subject: [PATCH 1208/1449] [json] confusing error message when schema can not be loaded --- extensions/json-language-features/client/src/jsonMain.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/json-language-features/client/src/jsonMain.ts b/extensions/json-language-features/client/src/jsonMain.ts index 1f51b66733d..3515c4a8aa6 100644 --- a/extensions/json-language-features/client/src/jsonMain.ts +++ b/extensions/json-language-features/client/src/jsonMain.ts @@ -11,7 +11,7 @@ import { xhr, XHRResponse, getErrorStatusDescription } from 'request-light'; const localize = nls.loadMessageBundle(); import { workspace, window, languages, commands, ExtensionContext, extensions, Uri, LanguageConfiguration, Diagnostic, StatusBarAlignment, TextEditor, TextDocument, Position, SelectionRange } from 'vscode'; -import { LanguageClient, LanguageClientOptions, RequestType, ServerOptions, TransportKind, NotificationType, DidChangeConfigurationNotification, HandleDiagnosticsSignature } from 'vscode-languageclient'; +import { LanguageClient, LanguageClientOptions, RequestType, ServerOptions, TransportKind, NotificationType, DidChangeConfigurationNotification, HandleDiagnosticsSignature, ResponseError } from 'vscode-languageclient'; import TelemetryReporter from 'vscode-extension-telemetry'; import { hash } from './utils/hash'; @@ -159,7 +159,7 @@ export function activate(context: ExtensionContext) { return xhr({ url: uriPath, followRedirects: 5, headers }).then(response => { return response.responseText; }, (error: XHRResponse) => { - return Promise.reject(error.responseText || getErrorStatusDescription(error.status) || error.toString()); + return Promise.reject(new ResponseError(error.status, error.responseText || getErrorStatusDescription(error.status) || error.toString())); }); } }); From b37e5dbca610922bbf2fac9329ba933992892c57 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Mon, 8 Jul 2019 11:04:46 -0700 Subject: [PATCH 1209/1449] Swap split icons --- .../files/browser/media/split-editor-horizontal-dark.svg | 2 +- .../files/browser/media/split-editor-horizontal-hc.svg | 2 +- .../files/browser/media/split-editor-horizontal-light.svg | 6 +++--- .../files/browser/media/split-editor-vertical-dark.svg | 2 +- .../files/browser/media/split-editor-vertical-hc.svg | 2 +- .../files/browser/media/split-editor-vertical-light.svg | 6 +++--- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/contrib/files/browser/media/split-editor-horizontal-dark.svg b/src/vs/workbench/contrib/files/browser/media/split-editor-horizontal-dark.svg index 8c22a7c5bfe..419c21be4f6 100644 --- a/src/vs/workbench/contrib/files/browser/media/split-editor-horizontal-dark.svg +++ b/src/vs/workbench/contrib/files/browser/media/split-editor-horizontal-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/files/browser/media/split-editor-horizontal-hc.svg b/src/vs/workbench/contrib/files/browser/media/split-editor-horizontal-hc.svg index 82c19d0c8fc..7565fd3c168 100644 --- a/src/vs/workbench/contrib/files/browser/media/split-editor-horizontal-hc.svg +++ b/src/vs/workbench/contrib/files/browser/media/split-editor-horizontal-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/files/browser/media/split-editor-horizontal-light.svg b/src/vs/workbench/contrib/files/browser/media/split-editor-horizontal-light.svg index 400952cdda8..405291c14dd 100644 --- a/src/vs/workbench/contrib/files/browser/media/split-editor-horizontal-light.svg +++ b/src/vs/workbench/contrib/files/browser/media/split-editor-horizontal-light.svg @@ -1,7 +1,7 @@ - + - - + + diff --git a/src/vs/workbench/contrib/files/browser/media/split-editor-vertical-dark.svg b/src/vs/workbench/contrib/files/browser/media/split-editor-vertical-dark.svg index 419c21be4f6..8c22a7c5bfe 100644 --- a/src/vs/workbench/contrib/files/browser/media/split-editor-vertical-dark.svg +++ b/src/vs/workbench/contrib/files/browser/media/split-editor-vertical-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/files/browser/media/split-editor-vertical-hc.svg b/src/vs/workbench/contrib/files/browser/media/split-editor-vertical-hc.svg index 7565fd3c168..82c19d0c8fc 100644 --- a/src/vs/workbench/contrib/files/browser/media/split-editor-vertical-hc.svg +++ b/src/vs/workbench/contrib/files/browser/media/split-editor-vertical-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/files/browser/media/split-editor-vertical-light.svg b/src/vs/workbench/contrib/files/browser/media/split-editor-vertical-light.svg index 405291c14dd..d5a2e9415b0 100644 --- a/src/vs/workbench/contrib/files/browser/media/split-editor-vertical-light.svg +++ b/src/vs/workbench/contrib/files/browser/media/split-editor-vertical-light.svg @@ -1,7 +1,7 @@ - + - - + + From 8ec3a1b39e22099622c4fb5d23ad06495f5dedfd Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 8 Jul 2019 12:32:27 -0700 Subject: [PATCH 1210/1449] Rename input to handleInput Part of #70978 --- src/vs/vscode.proposed.d.ts | 4 ++-- src/vs/workbench/api/node/extHostTerminalService.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 1f376c0f99f..13dbe4284e0 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1373,12 +1373,12 @@ declare module 'vscode' { * const writeEmitter = new vscode.EventEmitter(); * const virtualProcess: TerminalVirtualProcess = { * onDidWrite: writeEmitter.event, - * input: data => writeEmitter.fire(data === '\r' ? '\r\n' : data) + * handleInput: data => writeEmitter.fire(data === '\r' ? '\r\n' : data) * }; * vscode.window.createTerminal({ name: 'Local echo', virtualProcess }); * ``` */ - input?(data: string): void; + handleInput?(data: string): void; /** * Implement to handle when the number of rows and columns that fit into the terminal panel diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index ce45045e375..61bbc06ecc7 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -756,8 +756,8 @@ class ExtHostVirtualProcess implements ITerminalChildProcess { } input(data: string): void { - if (this._virtualProcess.input) { - this._virtualProcess.input(data); + if (this._virtualProcess.handleInput) { + this._virtualProcess.handleInput(data); } } From 7f6d2d30aa54f69da4fa8480714957d8a78f1405 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Mon, 8 Jul 2019 12:51:09 -0700 Subject: [PATCH 1211/1449] Fix #76912, swap theme icons --- src/vs/workbench/browser/parts/quickopen/media/quickopen.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/parts/quickopen/media/quickopen.css b/src/vs/workbench/browser/parts/quickopen/media/quickopen.css index 2143d469c09..d36b36b0a20 100644 --- a/src/vs/workbench/browser/parts/quickopen/media/quickopen.css +++ b/src/vs/workbench/browser/parts/quickopen/media/quickopen.css @@ -15,10 +15,10 @@ } .vs .monaco-workbench .monaco-quick-open-widget .quick-open-tree .quick-open-entry .quick-open-entry-icon.dirty { - background-image: url('dirty-dark.svg'); + background-image: url('dirty-light.svg'); } .hc-black .monaco-workbench .monaco-quick-open-widget .quick-open-tree .quick-open-entry .quick-open-entry-icon.dirty, .vs-dark .monaco-workbench .monaco-quick-open-widget .quick-open-tree .quick-open-entry .quick-open-entry-icon.dirty { - background-image: url('dirty-light.svg'); + background-image: url('dirty-dark.svg'); } \ No newline at end of file From 6b88a5364546109b6bec8b56873aa8a51b4005b6 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 8 Jul 2019 13:36:00 -0700 Subject: [PATCH 1212/1449] Remove duplicate registration of FocusTerminalFindWidgetAction --- .../contrib/terminal/browser/terminal.contribution.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts index e2e01bbb8b6..14a1be7a866 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts @@ -377,9 +377,6 @@ actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(RenameTerminalAc actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusTerminalFindWidgetAction, FocusTerminalFindWidgetAction.ID, FocusTerminalFindWidgetAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.KEY_F }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Focus Find Widget', category); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusTerminalFindWidgetAction, FocusTerminalFindWidgetAction.ID, FocusTerminalFindWidgetAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.KEY_F -}, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED), 'Terminal: Focus Find Widget', category); actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(HideTerminalFindWidgetAction, HideTerminalFindWidgetAction.ID, HideTerminalFindWidgetAction.LABEL, { primary: KeyCode.Escape, secondary: [KeyMod.Shift | KeyCode.Escape] From 985b5fe1d51daf32199b7332be2e9b2f3d36339c Mon Sep 17 00:00:00 2001 From: SteVen Batten Date: Mon, 8 Jul 2019 21:56:02 +0000 Subject: [PATCH 1213/1449] http link fix in d ts --- src/vs/vscode.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 00c92be9246..6f326cc55aa 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -2903,7 +2903,7 @@ declare module 'vscode' { * and `${3:foo}`. `$0` defines the final tab stop, it defaults to * the end of the snippet. Variables are defined with `$name` and * `${name:default value}`. The full snippet syntax is documented - * [here](http://code.visualstudio.com/docs/editor/userdefinedsnippets#_creating-your-own-snippets). + * [here](https://code.visualstudio.com/docs/editor/userdefinedsnippets#_creating-your-own-snippets). */ export class SnippetString { From 7ef96fc3a73afe81b839472605b27b274d9ad811 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 8 Jul 2019 15:01:00 -0700 Subject: [PATCH 1214/1449] Fix lifecycle for code actions that are updated while the code action menu is already showing Fixes #76851 In the following case 1. Code action list is shown 1. We then update the code actions in the background (possibly because extensions took a little while to compute them) 1. The user accepts a code action At step 2, we release the previous code action list which causes all of its actions to be gabage collected **Fix** Move lifecycle management of the code actions into the two consumers. Will look into make the code safer with a follow up fix --- .../contrib/codeAction/codeActionCommands.ts | 18 +++++++-------- .../contrib/codeAction/codeActionWidget.ts | 22 +++++++++++++++---- .../contrib/codeAction/lightBulbWidget.ts | 5 ++++- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/vs/editor/contrib/codeAction/codeActionCommands.ts b/src/vs/editor/contrib/codeAction/codeActionCommands.ts index dbe2c213647..35f86f732f4 100644 --- a/src/vs/editor/contrib/codeAction/codeActionCommands.ts +++ b/src/vs/editor/contrib/codeAction/codeActionCommands.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; -import { Disposable, MutableDisposable } from 'vs/base/common/lifecycle'; +import { Disposable } from 'vs/base/common/lifecycle'; import { escapeRegExpCharacters } from 'vs/base/common/strings'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorAction, EditorCommand, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; @@ -26,7 +26,6 @@ import { CodeActionWidget } from './codeActionWidget'; import { LightBulbWidget } from './lightBulbWidget'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { onUnexpectedError } from 'vs/base/common/errors'; -import { CodeActionSet } from 'vs/editor/contrib/codeAction/codeAction'; function contextKeyForSupportedActions(kind: CodeActionKind) { return ContextKeyExpr.regex( @@ -46,7 +45,6 @@ export class QuickFixController extends Disposable implements IEditorContributio private readonly _model: CodeActionModel; private readonly _codeActionWidget: CodeActionWidget; private readonly _lightBulbWidget: LightBulbWidget; - private readonly _currentCodeActions = this._register(new MutableDisposable()); constructor( editor: ICodeEditor, @@ -81,29 +79,30 @@ export class QuickFixController extends Disposable implements IEditorContributio this._register(this._keybindingService.onDidUpdateKeybindings(this._updateLightBulbTitle, this)); } - private _onDidChangeCodeActionsState(newState: CodeActionsState.State): void { if (newState.type === CodeActionsState.Type.Triggered) { newState.actions.then(actions => { - this._currentCodeActions.value = actions; - if (!actions.actions.length && newState.trigger.context) { MessageController.get(this._editor).showMessage(newState.trigger.context.notAvailableMessage, newState.trigger.context.position); + actions.dispose(); } }); if (newState.trigger.filter && newState.trigger.filter.kind) { // Triggered for specific scope - newState.actions.then(codeActions => { + newState.actions.then(async codeActions => { if (codeActions.actions.length > 0) { // Apply if we only have one action or requested autoApply if (newState.trigger.autoApply === CodeActionAutoApply.First || (newState.trigger.autoApply === CodeActionAutoApply.IfSingle && codeActions.actions.length === 1)) { - this._applyCodeAction(codeActions.actions[0]); + try { + await this._applyCodeAction(codeActions.actions[0]); + } finally { + codeActions.dispose(); + } return; } } this._codeActionWidget.show(newState.actions, newState.position); - }).catch(onUnexpectedError); } else if (newState.trigger.type === 'manual') { this._codeActionWidget.show(newState.actions, newState.position); @@ -118,7 +117,6 @@ export class QuickFixController extends Disposable implements IEditorContributio } } } else { - this._currentCodeActions.clear(); this._lightBulbWidget.hide(); } } diff --git a/src/vs/editor/contrib/codeAction/codeActionWidget.ts b/src/vs/editor/contrib/codeAction/codeActionWidget.ts index f05a1aba075..1420d096701 100644 --- a/src/vs/editor/contrib/codeAction/codeActionWidget.ts +++ b/src/vs/editor/contrib/codeAction/codeActionWidget.ts @@ -12,35 +12,49 @@ import { ScrollType } from 'vs/editor/common/editorCommon'; import { CodeAction } from 'vs/editor/common/modes'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { CodeActionSet } from 'vs/editor/contrib/codeAction/codeAction'; +import { Disposable, MutableDisposable } from 'vs/base/common/lifecycle'; interface CodeActionWidgetDelegate { onSelectCodeAction: (action: CodeAction) => Promise; } -export class CodeActionWidget { +export class CodeActionWidget extends Disposable { private _visible: boolean; + private readonly _showingActions = this._register(new MutableDisposable()); constructor( private readonly _editor: ICodeEditor, private readonly _contextMenuService: IContextMenuService, - private readonly _delegate: CodeActionWidgetDelegate - ) { } + private readonly _delegate: CodeActionWidgetDelegate, + ) { + super(); + } public async show(actionsToShow: Promise, at?: { x: number; y: number } | Position): Promise { - const codeActions = await actionsToShow; + let codeActions: CodeActionSet | undefined = await actionsToShow; if (!codeActions.actions.length) { + codeActions.dispose(); this._visible = false; return; } if (!this._editor.getDomNode()) { // cancel when editor went off-dom this._visible = false; + codeActions.dispose(); return Promise.reject(canceled()); } + if (this._visible) { + // TODO: Figure out if we should update the showing menu? + codeActions.dispose(); + return; + } + this._visible = true; const actions = codeActions.actions.map(action => this.codeActionToAction(action)); + + this._showingActions.value = codeActions; this._contextMenuService.showContextMenu({ getAnchor: () => { if (Position.isIPosition(at)) { diff --git a/src/vs/editor/contrib/codeAction/lightBulbWidget.ts b/src/vs/editor/contrib/codeAction/lightBulbWidget.ts index aadc318a386..99476ed57a3 100644 --- a/src/vs/editor/contrib/codeAction/lightBulbWidget.ts +++ b/src/vs/editor/contrib/codeAction/lightBulbWidget.ts @@ -7,7 +7,7 @@ import * as dom from 'vs/base/browser/dom'; import { GlobalMouseMoveMonitor, IStandardMouseMoveEventData, standardMouseMoveMerger } from 'vs/base/browser/globalMouseMoveMonitor'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { Emitter } from 'vs/base/common/event'; -import { Disposable } from 'vs/base/common/lifecycle'; +import { Disposable, MutableDisposable } from 'vs/base/common/lifecycle'; import 'vs/css!./lightBulbWidget'; import { ContentWidgetPositionPreference, ICodeEditor, IContentWidget, IContentWidgetPosition } from 'vs/editor/browser/editorBrowser'; import { TextModel } from 'vs/editor/common/model/textModel'; @@ -27,6 +27,7 @@ export class LightBulbWidget extends Disposable implements IContentWidget { private _position: IContentWidgetPosition | null; private _state: CodeActionsState.State = CodeActionsState.Empty; private _futureFixes = new CancellationTokenSource(); + private readonly _showingActions = this._register(new MutableDisposable()); constructor(editor: ICodeEditor) { super(); @@ -116,6 +117,7 @@ export class LightBulbWidget extends Disposable implements IContentWidget { // cancel pending show request in any case this._futureFixes.cancel(); } + this._showingActions.clear(); this._futureFixes = new CancellationTokenSource(); const { token } = this._futureFixes; @@ -123,6 +125,7 @@ export class LightBulbWidget extends Disposable implements IContentWidget { const selection = this._state.rangeOrSelection; this._state.actions.then(fixes => { + this._showingActions.value = fixes; if (!token.isCancellationRequested && fixes.actions.length > 0 && selection) { this._show(fixes); } else { From 58e2a079a521b2a8743fb83bf2a5d69489c6f2d4 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Mon, 8 Jul 2019 15:02:10 -0700 Subject: [PATCH 1215/1449] Place Git activity bar icon on pixel grid --- .../scm/browser/media/scm-activity-bar.svg | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/src/vs/workbench/contrib/scm/browser/media/scm-activity-bar.svg b/src/vs/workbench/contrib/scm/browser/media/scm-activity-bar.svg index 8251f475e50..9aa985bc979 100644 --- a/src/vs/workbench/contrib/scm/browser/media/scm-activity-bar.svg +++ b/src/vs/workbench/contrib/scm/browser/media/scm-activity-bar.svg @@ -1,18 +1,3 @@ - - - - - - - - - - - - - - - - - + + From 4e96d16be35ce4422515839600a3fcc6d5e460ea Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Mon, 8 Jul 2019 15:02:24 -0700 Subject: [PATCH 1216/1449] Simplify extension icon --- .../electron-browser/media/extensions-activity-bar.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/extensions-activity-bar.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/extensions-activity-bar.svg index 16dfefd854b..93e4b554dab 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/extensions-activity-bar.svg +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/extensions-activity-bar.svg @@ -1,3 +1,3 @@ - + From 1016c99dab4c9271c66b2351d038a51ea57ef92c Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Mon, 8 Jul 2019 15:40:29 -0700 Subject: [PATCH 1217/1449] Update gear and files exclude icons to have smaller inner circle --- .../parts/activitybar/media/settings-activity-bar.svg | 2 +- .../browser/parts/notifications/media/configure-dark.svg | 6 ++++-- .../browser/parts/notifications/media/configure-light.svg | 6 ++++-- .../contrib/debug/browser/media/configure-dark.svg | 6 ++++-- .../workbench/contrib/debug/browser/media/configure-hc.svg | 6 ++++-- .../contrib/debug/browser/media/configure-light.svg | 6 ++++-- .../extensions/electron-browser/media/configure-dark.svg | 6 ++++-- .../extensions/electron-browser/media/configure-hc.svg | 6 ++++-- .../extensions/electron-browser/media/configure-light.svg | 6 ++++-- .../contrib/markers/browser/media/exclude-settings-dark.svg | 2 +- .../contrib/markers/browser/media/exclude-settings-hc.svg | 2 +- .../markers/browser/media/exclude-settings-light.svg | 2 +- .../contrib/preferences/browser/media/configure-dark.svg | 6 ++++-- .../contrib/preferences/browser/media/configure-light.svg | 6 ++++-- .../contrib/search/browser/media/exclude-settings-dark.svg | 2 +- .../contrib/search/browser/media/exclude-settings-hc.svg | 2 +- .../contrib/search/browser/media/exclude-settings-light.svg | 2 +- .../workbench/contrib/tasks/common/media/configure-dark.svg | 6 ++++-- .../contrib/tasks/common/media/configure-light.svg | 6 ++++-- .../contrib/terminal/browser/media/configure-dark.svg | 6 ++++-- .../contrib/terminal/browser/media/configure-hc.svg | 6 ++++-- .../contrib/terminal/browser/media/configure-light.svg | 6 ++++-- 22 files changed, 67 insertions(+), 37 deletions(-) diff --git a/src/vs/workbench/browser/parts/activitybar/media/settings-activity-bar.svg b/src/vs/workbench/browser/parts/activitybar/media/settings-activity-bar.svg index 7e2c729438a..5d5fbb8ea5e 100644 --- a/src/vs/workbench/browser/parts/activitybar/media/settings-activity-bar.svg +++ b/src/vs/workbench/browser/parts/activitybar/media/settings-activity-bar.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/browser/parts/notifications/media/configure-dark.svg b/src/vs/workbench/browser/parts/notifications/media/configure-dark.svg index b86450be44a..ace01a5ddf5 100644 --- a/src/vs/workbench/browser/parts/notifications/media/configure-dark.svg +++ b/src/vs/workbench/browser/parts/notifications/media/configure-dark.svg @@ -1,4 +1,6 @@ - - + + + + diff --git a/src/vs/workbench/browser/parts/notifications/media/configure-light.svg b/src/vs/workbench/browser/parts/notifications/media/configure-light.svg index 067e45d1c40..4194780bbaa 100644 --- a/src/vs/workbench/browser/parts/notifications/media/configure-light.svg +++ b/src/vs/workbench/browser/parts/notifications/media/configure-light.svg @@ -1,4 +1,6 @@ - - + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/configure-dark.svg b/src/vs/workbench/contrib/debug/browser/media/configure-dark.svg index b86450be44a..ace01a5ddf5 100644 --- a/src/vs/workbench/contrib/debug/browser/media/configure-dark.svg +++ b/src/vs/workbench/contrib/debug/browser/media/configure-dark.svg @@ -1,4 +1,6 @@ - - + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/configure-hc.svg b/src/vs/workbench/contrib/debug/browser/media/configure-hc.svg index 50ad319fa69..bd59cb81f6d 100644 --- a/src/vs/workbench/contrib/debug/browser/media/configure-hc.svg +++ b/src/vs/workbench/contrib/debug/browser/media/configure-hc.svg @@ -1,4 +1,6 @@ - - + + + + diff --git a/src/vs/workbench/contrib/debug/browser/media/configure-light.svg b/src/vs/workbench/contrib/debug/browser/media/configure-light.svg index 067e45d1c40..4194780bbaa 100644 --- a/src/vs/workbench/contrib/debug/browser/media/configure-light.svg +++ b/src/vs/workbench/contrib/debug/browser/media/configure-light.svg @@ -1,4 +1,6 @@ - - + + + + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/configure-dark.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-dark.svg index b86450be44a..ace01a5ddf5 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/configure-dark.svg +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-dark.svg @@ -1,4 +1,6 @@ - - + + + + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/configure-hc.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-hc.svg index 50ad319fa69..bd59cb81f6d 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/configure-hc.svg +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-hc.svg @@ -1,4 +1,6 @@ - - + + + + diff --git a/src/vs/workbench/contrib/extensions/electron-browser/media/configure-light.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-light.svg index 067e45d1c40..4194780bbaa 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/media/configure-light.svg +++ b/src/vs/workbench/contrib/extensions/electron-browser/media/configure-light.svg @@ -1,4 +1,6 @@ - - + + + + diff --git a/src/vs/workbench/contrib/markers/browser/media/exclude-settings-dark.svg b/src/vs/workbench/contrib/markers/browser/media/exclude-settings-dark.svg index 22cc3c421a6..0b1694dc2f1 100644 --- a/src/vs/workbench/contrib/markers/browser/media/exclude-settings-dark.svg +++ b/src/vs/workbench/contrib/markers/browser/media/exclude-settings-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/markers/browser/media/exclude-settings-hc.svg b/src/vs/workbench/contrib/markers/browser/media/exclude-settings-hc.svg index 46a365e3b2d..ba88235419a 100644 --- a/src/vs/workbench/contrib/markers/browser/media/exclude-settings-hc.svg +++ b/src/vs/workbench/contrib/markers/browser/media/exclude-settings-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/markers/browser/media/exclude-settings-light.svg b/src/vs/workbench/contrib/markers/browser/media/exclude-settings-light.svg index 3248beed377..114ec3f0fec 100644 --- a/src/vs/workbench/contrib/markers/browser/media/exclude-settings-light.svg +++ b/src/vs/workbench/contrib/markers/browser/media/exclude-settings-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/preferences/browser/media/configure-dark.svg b/src/vs/workbench/contrib/preferences/browser/media/configure-dark.svg index b86450be44a..ace01a5ddf5 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/configure-dark.svg +++ b/src/vs/workbench/contrib/preferences/browser/media/configure-dark.svg @@ -1,4 +1,6 @@ - - + + + + diff --git a/src/vs/workbench/contrib/preferences/browser/media/configure-light.svg b/src/vs/workbench/contrib/preferences/browser/media/configure-light.svg index b86450be44a..4194780bbaa 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/configure-light.svg +++ b/src/vs/workbench/contrib/preferences/browser/media/configure-light.svg @@ -1,4 +1,6 @@ - - + + + + diff --git a/src/vs/workbench/contrib/search/browser/media/exclude-settings-dark.svg b/src/vs/workbench/contrib/search/browser/media/exclude-settings-dark.svg index 22cc3c421a6..0b1694dc2f1 100644 --- a/src/vs/workbench/contrib/search/browser/media/exclude-settings-dark.svg +++ b/src/vs/workbench/contrib/search/browser/media/exclude-settings-dark.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/search/browser/media/exclude-settings-hc.svg b/src/vs/workbench/contrib/search/browser/media/exclude-settings-hc.svg index 46a365e3b2d..ba88235419a 100644 --- a/src/vs/workbench/contrib/search/browser/media/exclude-settings-hc.svg +++ b/src/vs/workbench/contrib/search/browser/media/exclude-settings-hc.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/search/browser/media/exclude-settings-light.svg b/src/vs/workbench/contrib/search/browser/media/exclude-settings-light.svg index 3248beed377..114ec3f0fec 100644 --- a/src/vs/workbench/contrib/search/browser/media/exclude-settings-light.svg +++ b/src/vs/workbench/contrib/search/browser/media/exclude-settings-light.svg @@ -1,3 +1,3 @@ - + diff --git a/src/vs/workbench/contrib/tasks/common/media/configure-dark.svg b/src/vs/workbench/contrib/tasks/common/media/configure-dark.svg index b86450be44a..ace01a5ddf5 100644 --- a/src/vs/workbench/contrib/tasks/common/media/configure-dark.svg +++ b/src/vs/workbench/contrib/tasks/common/media/configure-dark.svg @@ -1,4 +1,6 @@ - - + + + + diff --git a/src/vs/workbench/contrib/tasks/common/media/configure-light.svg b/src/vs/workbench/contrib/tasks/common/media/configure-light.svg index 067e45d1c40..4194780bbaa 100644 --- a/src/vs/workbench/contrib/tasks/common/media/configure-light.svg +++ b/src/vs/workbench/contrib/tasks/common/media/configure-light.svg @@ -1,4 +1,6 @@ - - + + + + diff --git a/src/vs/workbench/contrib/terminal/browser/media/configure-dark.svg b/src/vs/workbench/contrib/terminal/browser/media/configure-dark.svg index b86450be44a..ace01a5ddf5 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/configure-dark.svg +++ b/src/vs/workbench/contrib/terminal/browser/media/configure-dark.svg @@ -1,4 +1,6 @@ - - + + + + diff --git a/src/vs/workbench/contrib/terminal/browser/media/configure-hc.svg b/src/vs/workbench/contrib/terminal/browser/media/configure-hc.svg index 50ad319fa69..bd59cb81f6d 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/configure-hc.svg +++ b/src/vs/workbench/contrib/terminal/browser/media/configure-hc.svg @@ -1,4 +1,6 @@ - - + + + + diff --git a/src/vs/workbench/contrib/terminal/browser/media/configure-light.svg b/src/vs/workbench/contrib/terminal/browser/media/configure-light.svg index 067e45d1c40..4194780bbaa 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/configure-light.svg +++ b/src/vs/workbench/contrib/terminal/browser/media/configure-light.svg @@ -1,4 +1,6 @@ - - + + + + From 4f3262dd1bba349e5be1e415a60874662da2c038 Mon Sep 17 00:00:00 2001 From: Rachel Macfarlane Date: Mon, 8 Jul 2019 15:43:04 -0700 Subject: [PATCH 1218/1449] Correctly render multiline decorations in the minimap, fixes #76133 --- .../browser/viewParts/minimap/minimap.ts | 76 +++++++++---------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/src/vs/editor/browser/viewParts/minimap/minimap.ts b/src/vs/editor/browser/viewParts/minimap/minimap.ts index 1641841c2f8..564ed6482d1 100644 --- a/src/vs/editor/browser/viewParts/minimap/minimap.ts +++ b/src/vs/editor/browser/viewParts/minimap/minimap.ts @@ -738,61 +738,61 @@ export class Minimap extends ViewPart { const lineHeightRatio = renderMinimap === RenderMinimap.LargeBlocks || renderMinimap === RenderMinimap.SmallBlocks ? 0.5 : 1; const height = lineHeight * lineHeightRatio; - // Loop over decorations, ignoring those that don't have the minimap property set and rendering those on the same line together - let i = 0; - for (; i < decorations.length; i++) { - if (!decorations[i].options.minimap) { + // Loop over decorations, ignoring those that don't have the minimap property set and rendering rectangles for each line the decoration spans + const lineOffsetMap = new Map(); + for (let i = 0; i < decorations.length; i++) { + const decoration = decorations[i]; + + if (!decoration.options.minimap) { continue; } - let decorationsForLine = [decorations[i]]; - let currentLine = decorations[i].range.startLineNumber; - let j = i + 1; - while (j < decorations.length && decorations[j].range.startLineNumber === currentLine) { - if (decorations[j].options.minimap) { - decorationsForLine.push(decorations[j]); - } - - j += 1; + for (let line = decoration.range.startLineNumber; line <= decoration.range.endLineNumber; line++) { + this.renderDecorationOnLine(canvasContext, lineOffsetMap, decoration, layout, line, height, lineHeight, tabSize, characterWidth); } - - i = j - 1; - this.renderDecorationsForLine(canvasContext, decorationsForLine, layout, currentLine, height, lineHeight, tabSize, characterWidth); } } } - private renderDecorationsForLine(canvasContext: CanvasRenderingContext2D, - decorations: ViewModelDecoration[], + private renderDecorationOnLine(canvasContext: CanvasRenderingContext2D, + lineOffsetMap: Map, + decoration: ViewModelDecoration, layout: MinimapLayout, - startLineNumber: number, + lineNumber: number, height: number, lineHeight: number, tabSize: number, - charWidth: number) { - const y = (startLineNumber - layout.startLineNumber) * lineHeight; + charWidth: number): void { + const y = (lineNumber - layout.startLineNumber) * lineHeight; - const lineData = this._context.model.getLineContent(startLineNumber); - const lineIndexToXOffset = [0]; - for (let i = 1; i < lineData.length + 1; i++) { - const charCode = lineData.charCodeAt(i - 1); - const dx = charCode === CharCode.Tab - ? tabSize * charWidth - : strings.isFullWidthCharacter(charCode) - ? 2 * charWidth - : charWidth; + // Cache line offset data so that it is only read once per line + let lineIndexToXOffset = lineOffsetMap.get(lineNumber); + if (!lineIndexToXOffset) { + const lineData = this._context.model.getLineContent(lineNumber); + lineIndexToXOffset = [0]; + for (let i = 1; i < lineData.length + 1; i++) { + const charCode = lineData.charCodeAt(i - 1); + const dx = charCode === CharCode.Tab + ? tabSize * charWidth + : strings.isFullWidthCharacter(charCode) + ? 2 * charWidth + : charWidth; - lineIndexToXOffset[i] = lineIndexToXOffset[i - 1] + dx; + lineIndexToXOffset[i] = lineIndexToXOffset[i - 1] + dx; + } + + lineOffsetMap.set(lineNumber, lineIndexToXOffset); } - for (let i = 0; i < decorations.length; i++) { - const currentDecoration = decorations[i]; - const { startColumn, endColumn } = currentDecoration.range; - const x = lineIndexToXOffset[startColumn - 1]; - const width = lineIndexToXOffset[endColumn - 1] - x; + const { startColumn, endColumn, startLineNumber, endLineNumber } = decoration.range; + const x = startLineNumber === lineNumber ? lineIndexToXOffset[startColumn - 1] : 0; - this.renderDecoration(canvasContext, currentDecoration.options.minimap, x, y, width, height); - } + const endColumnForLine = endLineNumber > lineNumber ? lineIndexToXOffset.length - 1 : endColumn - 1; + + // If the decoration starts at the last character of the column and spans over it, ensure it has a width + const width = lineIndexToXOffset[endColumnForLine] - x || 2; + + this.renderDecoration(canvasContext, decoration.options.minimap, x, y, width, height); } private renderDecoration(canvasContext: CanvasRenderingContext2D, minimapOptions: ModelDecorationMinimapOptions, x: number, y: number, width: number, height: number) { From 83cc1d284964fd18d95b75482b133ff720fa52af Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 8 Jul 2019 15:43:17 -0700 Subject: [PATCH 1219/1449] Make sure we dispose of CodeActionWidget --- src/vs/editor/contrib/codeAction/codeActionCommands.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/contrib/codeAction/codeActionCommands.ts b/src/vs/editor/contrib/codeAction/codeActionCommands.ts index 35f86f732f4..651f8f10a9b 100644 --- a/src/vs/editor/contrib/codeAction/codeActionCommands.ts +++ b/src/vs/editor/contrib/codeAction/codeActionCommands.ts @@ -60,7 +60,7 @@ export class QuickFixController extends Disposable implements IEditorContributio this._editor = editor; this._model = this._register(new CodeActionModel(this._editor, markerService, contextKeyService, progressService)); - this._codeActionWidget = new CodeActionWidget(editor, contextMenuService, { + this._codeActionWidget = this._register(new CodeActionWidget(editor, contextMenuService, { onSelectCodeAction: async (action) => { try { await this._applyCodeAction(action); @@ -69,7 +69,7 @@ export class QuickFixController extends Disposable implements IEditorContributio this._trigger({ type: 'auto', filter: {} }); } } - }); + })); this._lightBulbWidget = this._register(new LightBulbWidget(editor)); this._updateLightBulbTitle(); From c9c4d72ece44300ed4e25827c4605926da007af2 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 8 Jul 2019 15:51:51 -0700 Subject: [PATCH 1220/1449] Change conditional to make logic clearer --- .../contrib/codeAction/codeActionCommands.ts | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/vs/editor/contrib/codeAction/codeActionCommands.ts b/src/vs/editor/contrib/codeAction/codeActionCommands.ts index 651f8f10a9b..7cdcc08712c 100644 --- a/src/vs/editor/contrib/codeAction/codeActionCommands.ts +++ b/src/vs/editor/contrib/codeAction/codeActionCommands.ts @@ -33,6 +33,7 @@ function contextKeyForSupportedActions(kind: CodeActionKind) { new RegExp('(\\s|^)' + escapeRegExpCharacters(kind.value) + '\\b')); } + export class QuickFixController extends Disposable implements IEditorContribution { private static readonly ID = 'editor.contrib.quickFixController'; @@ -88,24 +89,26 @@ export class QuickFixController extends Disposable implements IEditorContributio } }); - if (newState.trigger.filter && newState.trigger.filter.kind) { - // Triggered for specific scope - newState.actions.then(async codeActions => { - if (codeActions.actions.length > 0) { - // Apply if we only have one action or requested autoApply - if (newState.trigger.autoApply === CodeActionAutoApply.First || (newState.trigger.autoApply === CodeActionAutoApply.IfSingle && codeActions.actions.length === 1)) { - try { - await this._applyCodeAction(codeActions.actions[0]); - } finally { - codeActions.dispose(); + if (newState.trigger.type === 'manual') { + if (newState.trigger.filter && newState.trigger.filter.kind) { + // Triggered for specific scope + newState.actions.then(async codeActions => { + if (codeActions.actions.length > 0) { + // Apply if we only have one action or requested autoApply + if (newState.trigger.autoApply === CodeActionAutoApply.First || (newState.trigger.autoApply === CodeActionAutoApply.IfSingle && codeActions.actions.length === 1)) { + try { + await this._applyCodeAction(codeActions.actions[0]); + } finally { + codeActions.dispose(); + } + return; } - return; } - } + this._codeActionWidget.show(newState.actions, newState.position); + }).catch(onUnexpectedError); + } else { this._codeActionWidget.show(newState.actions, newState.position); - }).catch(onUnexpectedError); - } else if (newState.trigger.type === 'manual') { - this._codeActionWidget.show(newState.actions, newState.position); + } } else { // auto magically triggered // * update an existing list of code actions From 7ecf6f19f7c871094971c3d72fcaaba4e6e962f0 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 8 Jul 2019 16:04:46 -0700 Subject: [PATCH 1221/1449] Remove always true conditional --- src/vs/editor/contrib/codeAction/lightBulbWidget.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/vs/editor/contrib/codeAction/lightBulbWidget.ts b/src/vs/editor/contrib/codeAction/lightBulbWidget.ts index 99476ed57a3..a6c642b77ee 100644 --- a/src/vs/editor/contrib/codeAction/lightBulbWidget.ts +++ b/src/vs/editor/contrib/codeAction/lightBulbWidget.ts @@ -123,10 +123,9 @@ export class LightBulbWidget extends Disposable implements IContentWidget { const { token } = this._futureFixes; this._state = newState; - const selection = this._state.rangeOrSelection; this._state.actions.then(fixes => { this._showingActions.value = fixes; - if (!token.isCancellationRequested && fixes.actions.length > 0 && selection) { + if (!token.isCancellationRequested && fixes.actions.length > 0) { this._show(fixes); } else { this.hide(); From 9066768895e499851b9ab777f56db1b0a299975f Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 8 Jul 2019 16:24:26 -0700 Subject: [PATCH 1222/1449] Move UI management of code actions to own class --- .../contrib/codeAction/codeActionCommands.ts | 89 +++------------ .../editor/contrib/codeAction/codeActionUi.ts | 107 ++++++++++++++++++ 2 files changed, 121 insertions(+), 75 deletions(-) create mode 100644 src/vs/editor/contrib/codeAction/codeActionUi.ts diff --git a/src/vs/editor/contrib/codeAction/codeActionCommands.ts b/src/vs/editor/contrib/codeAction/codeActionCommands.ts index 7cdcc08712c..657322a1a3c 100644 --- a/src/vs/editor/contrib/codeAction/codeActionCommands.ts +++ b/src/vs/editor/contrib/codeAction/codeActionCommands.ts @@ -12,20 +12,18 @@ import { IBulkEditService } from 'vs/editor/browser/services/bulkEditService'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { CodeAction } from 'vs/editor/common/modes'; +import { CodeActionUi } from 'vs/editor/contrib/codeAction/codeActionUi'; import { MessageController } from 'vs/editor/contrib/message/messageController'; import * as nls from 'vs/nls'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { IMarkerService } from 'vs/platform/markers/common/markers'; import { IEditorProgressService } from 'vs/platform/progress/common/progress'; -import { CodeActionModel, SUPPORTED_CODE_ACTIONS, CodeActionsState } from './codeActionModel'; +import { CodeActionModel, CodeActionsState, SUPPORTED_CODE_ACTIONS } from './codeActionModel'; import { CodeActionAutoApply, CodeActionFilter, CodeActionKind, CodeActionTrigger } from './codeActionTrigger'; -import { CodeActionWidget } from './codeActionWidget'; -import { LightBulbWidget } from './lightBulbWidget'; -import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { onUnexpectedError } from 'vs/base/common/errors'; function contextKeyForSupportedActions(kind: CodeActionKind) { return ContextKeyExpr.regex( @@ -44,8 +42,7 @@ export class QuickFixController extends Disposable implements IEditorContributio private readonly _editor: ICodeEditor; private readonly _model: CodeActionModel; - private readonly _codeActionWidget: CodeActionWidget; - private readonly _lightBulbWidget: LightBulbWidget; + private readonly _ui: CodeActionUi; constructor( editor: ICodeEditor, @@ -53,75 +50,32 @@ export class QuickFixController extends Disposable implements IEditorContributio @IContextKeyService contextKeyService: IContextKeyService, @IEditorProgressService progressService: IEditorProgressService, @IContextMenuService contextMenuService: IContextMenuService, + @IKeybindingService keybindingService: IKeybindingService, @ICommandService private readonly _commandService: ICommandService, - @IKeybindingService private readonly _keybindingService: IKeybindingService, @IBulkEditService private readonly _bulkEditService: IBulkEditService, ) { super(); this._editor = editor; this._model = this._register(new CodeActionModel(this._editor, markerService, contextKeyService, progressService)); - this._codeActionWidget = this._register(new CodeActionWidget(editor, contextMenuService, { - onSelectCodeAction: async (action) => { + this._register(this._model.onDidChangeState((newState) => this._onDidChangeCodeActionsState(newState))); + + this._ui = this._register(new CodeActionUi(editor, QuickFixAction.Id, { + applyCodeAction: async (action, retrigger) => { try { await this._applyCodeAction(action); } finally { - // Retrigger - this._trigger({ type: 'auto', filter: {} }); + if (retrigger) { + this._trigger({ type: 'auto', filter: {} }); + } } } - })); - this._lightBulbWidget = this._register(new LightBulbWidget(editor)); + }, contextMenuService, keybindingService)); - this._updateLightBulbTitle(); - - this._register(this._lightBulbWidget.onClick(this._handleLightBulbSelect, this)); - this._register(this._model.onDidChangeState((newState) => this._onDidChangeCodeActionsState(newState))); - this._register(this._keybindingService.onDidUpdateKeybindings(this._updateLightBulbTitle, this)); } private _onDidChangeCodeActionsState(newState: CodeActionsState.State): void { - if (newState.type === CodeActionsState.Type.Triggered) { - newState.actions.then(actions => { - if (!actions.actions.length && newState.trigger.context) { - MessageController.get(this._editor).showMessage(newState.trigger.context.notAvailableMessage, newState.trigger.context.position); - actions.dispose(); - } - }); - - if (newState.trigger.type === 'manual') { - if (newState.trigger.filter && newState.trigger.filter.kind) { - // Triggered for specific scope - newState.actions.then(async codeActions => { - if (codeActions.actions.length > 0) { - // Apply if we only have one action or requested autoApply - if (newState.trigger.autoApply === CodeActionAutoApply.First || (newState.trigger.autoApply === CodeActionAutoApply.IfSingle && codeActions.actions.length === 1)) { - try { - await this._applyCodeAction(codeActions.actions[0]); - } finally { - codeActions.dispose(); - } - return; - } - } - this._codeActionWidget.show(newState.actions, newState.position); - }).catch(onUnexpectedError); - } else { - this._codeActionWidget.show(newState.actions, newState.position); - } - } else { - // auto magically triggered - // * update an existing list of code actions - // * manage light bulb - if (this._codeActionWidget.isVisible) { - this._codeActionWidget.show(newState.actions, newState.position); - } else { - this._lightBulbWidget.tryShow(newState); - } - } - } else { - this._lightBulbWidget.hide(); - } + this._ui.update(newState); } public getId(): string { @@ -146,21 +100,6 @@ export class QuickFixController extends Disposable implements IEditorContributio return this._model.trigger(trigger); } - private _handleLightBulbSelect(e: { x: number, y: number, state: CodeActionsState.Triggered }): void { - this._codeActionWidget.show(e.state.actions, e); - } - - private _updateLightBulbTitle(): void { - const kb = this._keybindingService.lookupKeybinding(QuickFixAction.Id); - let title: string; - if (kb) { - title = nls.localize('quickFixWithKb', "Show Fixes ({0})", kb.getLabel()); - } else { - title = nls.localize('quickFix', "Show Fixes"); - } - this._lightBulbWidget.title = title; - } - private _applyCodeAction(action: CodeAction): Promise { return applyCodeAction(action, this._bulkEditService, this._commandService, this._editor); } diff --git a/src/vs/editor/contrib/codeAction/codeActionUi.ts b/src/vs/editor/contrib/codeAction/codeActionUi.ts new file mode 100644 index 00000000000..ed6cf564865 --- /dev/null +++ b/src/vs/editor/contrib/codeAction/codeActionUi.ts @@ -0,0 +1,107 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { onUnexpectedError } from 'vs/base/common/errors'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { CodeAction } from 'vs/editor/common/modes'; +import { MessageController } from 'vs/editor/contrib/message/messageController'; +import * as nls from 'vs/nls'; +import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { CodeActionsState } from './codeActionModel'; +import { CodeActionAutoApply } from './codeActionTrigger'; +import { CodeActionWidget } from './codeActionWidget'; +import { LightBulbWidget } from './lightBulbWidget'; + + +export class CodeActionUi extends Disposable { + + private readonly _codeActionWidget: CodeActionWidget; + private readonly _lightBulbWidget: LightBulbWidget; + + constructor( + private readonly _editor: ICodeEditor, + private readonly quickFixActionId: string, + private readonly delegate: { + applyCodeAction: (action: CodeAction, regtriggerAfterApply: boolean) => void + }, + @IContextMenuService contextMenuService: IContextMenuService, + @IKeybindingService private readonly _keybindingService: IKeybindingService, + ) { + super(); + + this._codeActionWidget = this._register(new CodeActionWidget(this._editor, contextMenuService, { + onSelectCodeAction: async (action) => { + this.delegate.applyCodeAction(action, /* retrigger */true); + } + })); + this._lightBulbWidget = this._register(new LightBulbWidget(this._editor)); + + this._updateLightBulbTitle(); + + this._register(this._lightBulbWidget.onClick(this._handleLightBulbSelect, this)); + this._register(this._keybindingService.onDidUpdateKeybindings(this._updateLightBulbTitle, this)); + } + + public update(newState: CodeActionsState.State): void { + if (newState.type === CodeActionsState.Type.Triggered) { + newState.actions.then(actions => { + if (!actions.actions.length && newState.trigger.context) { + MessageController.get(this._editor).showMessage(newState.trigger.context.notAvailableMessage, newState.trigger.context.position); + actions.dispose(); + } + }); + + if (newState.trigger.type === 'manual') { + if (newState.trigger.filter && newState.trigger.filter.kind) { + // Triggered for specific scope + newState.actions.then(async codeActions => { + if (codeActions.actions.length > 0) { + // Apply if we only have one action or requested autoApply + if (newState.trigger.autoApply === CodeActionAutoApply.First || (newState.trigger.autoApply === CodeActionAutoApply.IfSingle && codeActions.actions.length === 1)) { + try { + await this.delegate.applyCodeAction(codeActions.actions[0], false); + } finally { + codeActions.dispose(); + } + return; + } + } + this._codeActionWidget.show(newState.actions, newState.position); + }).catch(onUnexpectedError); + } else { + this._codeActionWidget.show(newState.actions, newState.position); + } + } else { + // auto magically triggered + // * update an existing list of code actions + // * manage light bulb + if (this._codeActionWidget.isVisible) { + this._codeActionWidget.show(newState.actions, newState.position); + } else { + this._lightBulbWidget.tryShow(newState); + } + } + } else { + this._lightBulbWidget.hide(); + } + } + + private _handleLightBulbSelect(e: { x: number, y: number, state: CodeActionsState.Triggered }): void { + this._codeActionWidget.show(e.state.actions, e); + } + + private _updateLightBulbTitle(): void { + const kb = this._keybindingService.lookupKeybinding(this.quickFixActionId); + let title: string; + if (kb) { + title = nls.localize('quickFixWithKb', "Show Fixes ({0})", kb.getLabel()); + } else { + title = nls.localize('quickFix', "Show Fixes"); + } + this._lightBulbWidget.title = title; + } +} From ea22ac19b0878adc5c666cade024c1e896ec7eb1 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 8 Jul 2019 16:28:45 -0700 Subject: [PATCH 1223/1449] Move updateLightBulbTitle into lightbulb class --- .../contrib/codeAction/codeActionCommands.ts | 1 - .../editor/contrib/codeAction/codeActionUi.ts | 21 ++---------- .../contrib/codeAction/lightBulbWidget.ts | 33 ++++++++++++++----- 3 files changed, 27 insertions(+), 28 deletions(-) diff --git a/src/vs/editor/contrib/codeAction/codeActionCommands.ts b/src/vs/editor/contrib/codeAction/codeActionCommands.ts index 657322a1a3c..26c8ff520f4 100644 --- a/src/vs/editor/contrib/codeAction/codeActionCommands.ts +++ b/src/vs/editor/contrib/codeAction/codeActionCommands.ts @@ -71,7 +71,6 @@ export class QuickFixController extends Disposable implements IEditorContributio } } }, contextMenuService, keybindingService)); - } private _onDidChangeCodeActionsState(newState: CodeActionsState.State): void { diff --git a/src/vs/editor/contrib/codeAction/codeActionUi.ts b/src/vs/editor/contrib/codeAction/codeActionUi.ts index ed6cf564865..3d7f08d7a3a 100644 --- a/src/vs/editor/contrib/codeAction/codeActionUi.ts +++ b/src/vs/editor/contrib/codeAction/codeActionUi.ts @@ -8,7 +8,6 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { CodeAction } from 'vs/editor/common/modes'; import { MessageController } from 'vs/editor/contrib/message/messageController'; -import * as nls from 'vs/nls'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { CodeActionsState } from './codeActionModel'; @@ -24,12 +23,12 @@ export class CodeActionUi extends Disposable { constructor( private readonly _editor: ICodeEditor, - private readonly quickFixActionId: string, + quickFixActionId: string, private readonly delegate: { applyCodeAction: (action: CodeAction, regtriggerAfterApply: boolean) => void }, @IContextMenuService contextMenuService: IContextMenuService, - @IKeybindingService private readonly _keybindingService: IKeybindingService, + @IKeybindingService keybindingService: IKeybindingService, ) { super(); @@ -38,12 +37,9 @@ export class CodeActionUi extends Disposable { this.delegate.applyCodeAction(action, /* retrigger */true); } })); - this._lightBulbWidget = this._register(new LightBulbWidget(this._editor)); - - this._updateLightBulbTitle(); + this._lightBulbWidget = this._register(new LightBulbWidget(this._editor, quickFixActionId, keybindingService)); this._register(this._lightBulbWidget.onClick(this._handleLightBulbSelect, this)); - this._register(this._keybindingService.onDidUpdateKeybindings(this._updateLightBulbTitle, this)); } public update(newState: CodeActionsState.State): void { @@ -93,15 +89,4 @@ export class CodeActionUi extends Disposable { private _handleLightBulbSelect(e: { x: number, y: number, state: CodeActionsState.Triggered }): void { this._codeActionWidget.show(e.state.actions, e); } - - private _updateLightBulbTitle(): void { - const kb = this._keybindingService.lookupKeybinding(this.quickFixActionId); - let title: string; - if (kb) { - title = nls.localize('quickFixWithKb', "Show Fixes ({0})", kb.getLabel()); - } else { - title = nls.localize('quickFix', "Show Fixes"); - } - this._lightBulbWidget.title = title; - } } diff --git a/src/vs/editor/contrib/codeAction/lightBulbWidget.ts b/src/vs/editor/contrib/codeAction/lightBulbWidget.ts index a6c642b77ee..8fddd1790c4 100644 --- a/src/vs/editor/contrib/codeAction/lightBulbWidget.ts +++ b/src/vs/editor/contrib/codeAction/lightBulbWidget.ts @@ -12,6 +12,8 @@ import 'vs/css!./lightBulbWidget'; import { ContentWidgetPositionPreference, ICodeEditor, IContentWidget, IContentWidgetPosition } from 'vs/editor/browser/editorBrowser'; import { TextModel } from 'vs/editor/common/model/textModel'; import { CodeActionSet } from 'vs/editor/contrib/codeAction/codeAction'; +import * as nls from 'vs/nls'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { CodeActionsState } from './codeActionModel'; export class LightBulbWidget extends Disposable implements IContentWidget { @@ -19,7 +21,6 @@ export class LightBulbWidget extends Disposable implements IContentWidget { private static readonly _posPref = [ContentWidgetPositionPreference.EXACT]; private readonly _domNode: HTMLDivElement; - private readonly _editor: ICodeEditor; private readonly _onClick = this._register(new Emitter<{ x: number; y: number; state: CodeActionsState.Triggered }>()); public readonly onClick = this._onClick.event; @@ -29,12 +30,15 @@ export class LightBulbWidget extends Disposable implements IContentWidget { private _futureFixes = new CancellationTokenSource(); private readonly _showingActions = this._register(new MutableDisposable()); - constructor(editor: ICodeEditor) { + constructor( + private readonly _editor: ICodeEditor, + private readonly _quickFixActionId: string, + @IKeybindingService private readonly _keybindingService: IKeybindingService + ) { super(); this._domNode = document.createElement('div'); this._domNode.className = 'lightbulb-glyph'; - this._editor = editor; this._editor.addContentWidget(this); this._register(this._editor.onDidChangeModel(_ => this._futureFixes.cancel())); @@ -89,6 +93,10 @@ export class LightBulbWidget extends Disposable implements IContentWidget { this.hide(); } })); + + this._updateLightBulbTitle(); + this._register(this._keybindingService.onDidUpdateKeybindings(this._updateLightBulbTitle, this)); + } dispose(): void { @@ -135,14 +143,10 @@ export class LightBulbWidget extends Disposable implements IContentWidget { }); } - set title(value: string) { + private set title(value: string) { this._domNode.title = value; } - get title(): string { - return this._domNode.title; - } - private _show(codeActions: CodeActionSet): void { const config = this._editor.getConfiguration(); if (!config.contribInfo.lightbulbEnabled) { @@ -187,10 +191,21 @@ export class LightBulbWidget extends Disposable implements IContentWidget { this._editor.layoutContentWidget(this); } - hide(): void { + public hide(): void { this._position = null; this._state = CodeActionsState.Empty; this._futureFixes.cancel(); this._editor.layoutContentWidget(this); } + + private _updateLightBulbTitle(): void { + const kb = this._keybindingService.lookupKeybinding(this._quickFixActionId); + let title: string; + if (kb) { + title = nls.localize('quickFixWithKb', "Show Fixes ({0})", kb.getLabel()); + } else { + title = nls.localize('quickFix', "Show Fixes"); + } + this.title = title; + } } From ea9ed25285337bdd25e47e3d7802cbf12b2a0802 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 8 Jul 2019 17:27:44 -0700 Subject: [PATCH 1224/1449] Reworking code action UI logic * Make widgets take a code action set directly instead of a promise to one * Trying to move ownership of the code actions into the CodeActionUi class --- .../editor/contrib/codeAction/codeActionUi.ts | 66 ++++++----- .../contrib/codeAction/codeActionWidget.ts | 11 +- .../contrib/codeAction/lightBulbWidget.ts | 103 ++++++++---------- 3 files changed, 84 insertions(+), 96 deletions(-) diff --git a/src/vs/editor/contrib/codeAction/codeActionUi.ts b/src/vs/editor/contrib/codeAction/codeActionUi.ts index 3d7f08d7a3a..8443281db7f 100644 --- a/src/vs/editor/contrib/codeAction/codeActionUi.ts +++ b/src/vs/editor/contrib/codeAction/codeActionUi.ts @@ -4,9 +4,10 @@ *--------------------------------------------------------------------------------------------*/ import { onUnexpectedError } from 'vs/base/common/errors'; -import { Disposable } from 'vs/base/common/lifecycle'; +import { Disposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { CodeAction } from 'vs/editor/common/modes'; +import { CodeActionSet } from 'vs/editor/contrib/codeAction/codeAction'; import { MessageController } from 'vs/editor/contrib/message/messageController'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; @@ -15,11 +16,11 @@ import { CodeActionAutoApply } from './codeActionTrigger'; import { CodeActionWidget } from './codeActionWidget'; import { LightBulbWidget } from './lightBulbWidget'; - export class CodeActionUi extends Disposable { private readonly _codeActionWidget: CodeActionWidget; private readonly _lightBulbWidget: LightBulbWidget; + private readonly _activeCodeActions = this._register(new MutableDisposable()); constructor( private readonly _editor: ICodeEditor, @@ -34,7 +35,7 @@ export class CodeActionUi extends Disposable { this._codeActionWidget = this._register(new CodeActionWidget(this._editor, contextMenuService, { onSelectCodeAction: async (action) => { - this.delegate.applyCodeAction(action, /* retrigger */true); + this.delegate.applyCodeAction(action, /* retrigger */ true); } })); this._lightBulbWidget = this._register(new LightBulbWidget(this._editor, quickFixActionId, keybindingService)); @@ -42,43 +43,48 @@ export class CodeActionUi extends Disposable { this._register(this._lightBulbWidget.onClick(this._handleLightBulbSelect, this)); } - public update(newState: CodeActionsState.State): void { + public async update(newState: CodeActionsState.State): Promise { if (newState.type === CodeActionsState.Type.Triggered) { - newState.actions.then(actions => { - if (!actions.actions.length && newState.trigger.context) { - MessageController.get(this._editor).showMessage(newState.trigger.context.notAvailableMessage, newState.trigger.context.position); - actions.dispose(); - } - }); + let actions: CodeActionSet; + try { + actions = await newState.actions; + } catch (e) { + onUnexpectedError(e); + return; + } + + this._lightBulbWidget.update(actions, newState.position); + + if (!actions.actions.length && newState.trigger.context) { + MessageController.get(this._editor).showMessage(newState.trigger.context.notAvailableMessage, newState.trigger.context.position); + this._activeCodeActions.value = actions; + return; + } if (newState.trigger.type === 'manual') { if (newState.trigger.filter && newState.trigger.filter.kind) { // Triggered for specific scope - newState.actions.then(async codeActions => { - if (codeActions.actions.length > 0) { - // Apply if we only have one action or requested autoApply - if (newState.trigger.autoApply === CodeActionAutoApply.First || (newState.trigger.autoApply === CodeActionAutoApply.IfSingle && codeActions.actions.length === 1)) { - try { - await this.delegate.applyCodeAction(codeActions.actions[0], false); - } finally { - codeActions.dispose(); - } - return; + if (actions.actions.length > 0) { + // Apply if we only have one action or requested autoApply + if (newState.trigger.autoApply === CodeActionAutoApply.First || (newState.trigger.autoApply === CodeActionAutoApply.IfSingle && actions.actions.length === 1)) { + try { + await this.delegate.applyCodeAction(actions.actions[0], false); + } finally { + actions.dispose(); } + return; } - this._codeActionWidget.show(newState.actions, newState.position); - }).catch(onUnexpectedError); - } else { - this._codeActionWidget.show(newState.actions, newState.position); + } } + this._activeCodeActions.value = actions; + this._codeActionWidget.show(actions, newState.position); } else { // auto magically triggered - // * update an existing list of code actions - // * manage light bulb if (this._codeActionWidget.isVisible) { - this._codeActionWidget.show(newState.actions, newState.position); + // TODO: Figure out if we should update the showing menu? + actions.dispose(); } else { - this._lightBulbWidget.tryShow(newState); + this._activeCodeActions.value = actions; } } } else { @@ -86,7 +92,7 @@ export class CodeActionUi extends Disposable { } } - private _handleLightBulbSelect(e: { x: number, y: number, state: CodeActionsState.Triggered }): void { - this._codeActionWidget.show(e.state.actions, e); + private _handleLightBulbSelect(e: { x: number, y: number, actions: CodeActionSet }): void { + this._codeActionWidget.show(e.actions, e); } } diff --git a/src/vs/editor/contrib/codeAction/codeActionWidget.ts b/src/vs/editor/contrib/codeAction/codeActionWidget.ts index 1420d096701..a3f50cff8ad 100644 --- a/src/vs/editor/contrib/codeAction/codeActionWidget.ts +++ b/src/vs/editor/contrib/codeAction/codeActionWidget.ts @@ -31,26 +31,17 @@ export class CodeActionWidget extends Disposable { super(); } - public async show(actionsToShow: Promise, at?: { x: number; y: number } | Position): Promise { - let codeActions: CodeActionSet | undefined = await actionsToShow; + public async show(codeActions: CodeActionSet, at?: { x: number; y: number } | Position): Promise { if (!codeActions.actions.length) { - codeActions.dispose(); this._visible = false; return; } if (!this._editor.getDomNode()) { // cancel when editor went off-dom this._visible = false; - codeActions.dispose(); return Promise.reject(canceled()); } - if (this._visible) { - // TODO: Figure out if we should update the showing menu? - codeActions.dispose(); - return; - } - this._visible = true; const actions = codeActions.actions.map(action => this.codeActionToAction(action)); diff --git a/src/vs/editor/contrib/codeAction/lightBulbWidget.ts b/src/vs/editor/contrib/codeAction/lightBulbWidget.ts index 8fddd1790c4..e74a01bfef4 100644 --- a/src/vs/editor/contrib/codeAction/lightBulbWidget.ts +++ b/src/vs/editor/contrib/codeAction/lightBulbWidget.ts @@ -5,16 +5,37 @@ import * as dom from 'vs/base/browser/dom'; import { GlobalMouseMoveMonitor, IStandardMouseMoveEventData, standardMouseMoveMerger } from 'vs/base/browser/globalMouseMoveMonitor'; -import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { Emitter } from 'vs/base/common/event'; -import { Disposable, MutableDisposable } from 'vs/base/common/lifecycle'; +import { Disposable } from 'vs/base/common/lifecycle'; import 'vs/css!./lightBulbWidget'; import { ContentWidgetPositionPreference, ICodeEditor, IContentWidget, IContentWidgetPosition } from 'vs/editor/browser/editorBrowser'; +import { IPosition } from 'vs/editor/common/core/position'; import { TextModel } from 'vs/editor/common/model/textModel'; import { CodeActionSet } from 'vs/editor/contrib/codeAction/codeAction'; import * as nls from 'vs/nls'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { CodeActionsState } from './codeActionModel'; + +namespace LightBulbState { + + export const enum Type { + Hidden, + Showing, + } + + export const Hidden = new class { readonly type = Type.Hidden; }; + + export class Showing { + readonly type = Type.Showing; + + constructor( + public readonly actions: CodeActionSet, + public readonly position: IPosition, + ) { } + } + + export type State = typeof Hidden | Showing; +} + export class LightBulbWidget extends Disposable implements IContentWidget { @@ -22,13 +43,11 @@ export class LightBulbWidget extends Disposable implements IContentWidget { private readonly _domNode: HTMLDivElement; - private readonly _onClick = this._register(new Emitter<{ x: number; y: number; state: CodeActionsState.Triggered }>()); + private readonly _onClick = this._register(new Emitter<{ x: number; y: number; actions: CodeActionSet }>()); public readonly onClick = this._onClick.event; private _position: IContentWidgetPosition | null; - private _state: CodeActionsState.State = CodeActionsState.Empty; - private _futureFixes = new CancellationTokenSource(); - private readonly _showingActions = this._register(new MutableDisposable()); + private _state: LightBulbState.State = LightBulbState.Hidden; constructor( private readonly _editor: ICodeEditor, @@ -41,17 +60,15 @@ export class LightBulbWidget extends Disposable implements IContentWidget { this._editor.addContentWidget(this); - this._register(this._editor.onDidChangeModel(_ => this._futureFixes.cancel())); - this._register(this._editor.onDidChangeModelLanguage(_ => this._futureFixes.cancel())); this._register(this._editor.onDidChangeModelContent(_ => { // cancel when the line in question has been removed const editorModel = this._editor.getModel(); - if (this._state.type !== CodeActionsState.Type.Triggered || !editorModel || this._state.position.lineNumber >= editorModel.getLineCount()) { - this._futureFixes.cancel(); + if (this._state.type !== LightBulbState.Type.Showing || !editorModel || this._state.position.lineNumber >= editorModel.getLineCount()) { + this.hide(); } })); this._register(dom.addStandardDisposableListener(this._domNode, 'mousedown', e => { - if (this._state.type !== CodeActionsState.Type.Triggered) { + if (this._state.type !== LightBulbState.Type.Showing) { return; } @@ -71,7 +88,7 @@ export class LightBulbWidget extends Disposable implements IContentWidget { this._onClick.fire({ x: e.posx, y: top + height + pad, - state: this._state + actions: this._state.actions }); })); this._register(dom.addDisposableListener(this._domNode, 'mouseenter', (e: MouseEvent) => { @@ -96,7 +113,6 @@ export class LightBulbWidget extends Disposable implements IContentWidget { this._updateLightBulbTitle(); this._register(this._keybindingService.onDidUpdateKeybindings(this._updateLightBulbTitle, this)); - } dispose(): void { @@ -116,51 +132,23 @@ export class LightBulbWidget extends Disposable implements IContentWidget { return this._position; } - tryShow(newState: CodeActionsState.Triggered) { - if (this._position && (!newState.position || this._position.position && this._position.position.lineNumber !== newState.position.lineNumber)) { - // hide when getting a 'hide'-request or when currently - // showing on another line - this.hide(); - } else if (this._futureFixes) { - // cancel pending show request in any case - this._futureFixes.cancel(); + public update(actions: CodeActionSet, atPosition: IPosition) { + if (actions.actions.length <= 0) { + return this.hide(); } - this._showingActions.clear(); - this._futureFixes = new CancellationTokenSource(); - const { token } = this._futureFixes; - this._state = newState; - - this._state.actions.then(fixes => { - this._showingActions.value = fixes; - if (!token.isCancellationRequested && fixes.actions.length > 0) { - this._show(fixes); - } else { - this.hide(); - } - }).catch(() => { - this.hide(); - }); - } - - private set title(value: string) { - this._domNode.title = value; - } - - private _show(codeActions: CodeActionSet): void { const config = this._editor.getConfiguration(); if (!config.contribInfo.lightbulbEnabled) { - return; - } - if (this._state.type !== CodeActionsState.Type.Triggered) { - return; - } - const { lineNumber, column } = this._state.position; - const model = this._editor.getModel(); - if (!model) { - return; + return this.hide(); } + const { lineNumber, column } = atPosition; + const model = this._editor.getModel(); + if (!model) { + return this.hide(); + } + + this._state = new LightBulbState.Showing(actions, atPosition); const tabSize = model.getOptions().tabSize; const lineContent = model.getLineContent(lineNumber); const indent = TextModel.computeIndentLevel(lineContent, tabSize); @@ -187,14 +175,17 @@ export class LightBulbWidget extends Disposable implements IContentWidget { position: { lineNumber: effectiveLineNumber, column: 1 }, preference: LightBulbWidget._posPref }; - dom.toggleClass(this._domNode, 'autofixable', codeActions.hasAutoFix); + dom.toggleClass(this._domNode, 'autofixable', actions.hasAutoFix); this._editor.layoutContentWidget(this); } + private set title(value: string) { + this._domNode.title = value; + } + public hide(): void { this._position = null; - this._state = CodeActionsState.Empty; - this._futureFixes.cancel(); + this._state = LightBulbState.Hidden; this._editor.layoutContentWidget(this); } From f928d0eb3604f6dd0d85ca10b81ad7f17db9605e Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 8 Jul 2019 17:53:22 -0700 Subject: [PATCH 1225/1449] Add log message to help catch leaked disposables in ext host --- .../api/common/extHostLanguageFeatures.ts | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/api/common/extHostLanguageFeatures.ts b/src/vs/workbench/api/common/extHostLanguageFeatures.ts index 84e28939bb3..884618cc457 100644 --- a/src/vs/workbench/api/common/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/common/extHostLanguageFeatures.ts @@ -102,7 +102,7 @@ class CodeLensAdapter { private static _badCmd: vscode.Command = { command: 'missing', title: '!!MISSING: command!!' }; - private readonly _cache = new Cache(); + private readonly _cache = new Cache('CodeLens'); private readonly _disposables = new Map(); constructor( @@ -315,7 +315,7 @@ export interface CustomCodeAction extends CodeActionDto { class CodeActionAdapter { private static readonly _maxCodeActionsPerFile: number = 1000; - private readonly _cache = new Cache(); + private readonly _cache = new Cache('CodeAction'); private readonly _disposables = new Map(); constructor( @@ -624,7 +624,7 @@ class SuggestAdapter { private _commands: CommandsConverter; private _provider: vscode.CompletionItemProvider; - private _cache = new Cache(); + private _cache = new Cache('CompletionItem'); private _disposables = new Map(); constructor(documents: ExtHostDocuments, commands: CommandsConverter, provider: vscode.CompletionItemProvider) { @@ -770,7 +770,7 @@ class SuggestAdapter { class SignatureHelpAdapter { - private readonly _cache = new Cache(); + private readonly _cache = new Cache('SignatureHelp'); constructor( private readonly _documents: ExtHostDocuments, @@ -813,13 +813,19 @@ class SignatureHelpAdapter { } class Cache { + private static readonly enableDebugLogging = false; - private _data = new Map(); + private readonly _data = new Map(); private _idPool = 1; + constructor( + private readonly id: string + ) { } + add(item: readonly T[]): number { const id = this._idPool++; this._data.set(id, item); + this.logDebugInfo(); return id; } @@ -829,12 +835,20 @@ class Cache { delete(id: number) { this._data.delete(id); + this.logDebugInfo(); + } + + private logDebugInfo() { + if (!Cache.enableDebugLogging) { + return; + } + console.log(`${this.id} cache size — ${this._data.size}`); } } class LinkProviderAdapter { - private _cache = new Cache(); + private _cache = new Cache('DocumentLink'); constructor( private readonly _documents: ExtHostDocuments, From 0b31a161599d3457c7d8a525234d33663a3a50d5 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 8 Jul 2019 18:07:27 -0700 Subject: [PATCH 1226/1449] Fixing implict index error and extract duplicated code For #76442 --- .../issue/electron-main/issueService.ts | 36 +++++++++---------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/src/vs/platform/issue/electron-main/issueService.ts b/src/vs/platform/issue/electron-main/issueService.ts index 5fc1f5464f1..97c788209ed 100644 --- a/src/vs/platform/issue/electron-main/issueService.ts +++ b/src/vs/platform/issue/electron-main/issueService.ts @@ -237,15 +237,8 @@ export class IssueService implements IIssueService { data }; - const environment = parseArgs(process.argv); - const config = objects.assign(environment, windowConfiguration); - for (let key in config) { - if (config[key] === undefined || config[key] === null || config[key] === '') { - delete config[key]; // only send over properties that have a true value - } - } - - this._processExplorerWindow.loadURL(`${require.toUrl('vs/code/electron-browser/processExplorer/processExplorer.html')}?config=${encodeURIComponent(JSON.stringify(config))}`); + this._processExplorerWindow.loadURL( + toLauchUrl('vs/code/electron-browser/processExplorer/processExplorer.html', windowConfiguration)); this._processExplorerWindow.on('close', () => this._processExplorerWindow = null); @@ -373,14 +366,19 @@ export class IssueService implements IIssueService { features }; - const environment = parseArgs(process.argv); - const config = objects.assign(environment, windowConfiguration); - for (let key in config) { - if (config[key] === undefined || config[key] === null || config[key] === '') { - delete config[key]; // only send over properties that have a true value - } - } - - return `${require.toUrl('vs/code/electron-browser/issue/issueReporter.html')}?config=${encodeURIComponent(JSON.stringify(config))}`; + return toLauchUrl('vs/code/electron-browser/issue/issueReporter.html', windowConfiguration); } -} \ No newline at end of file +} + +function toLauchUrl(pathToHtml: string, windowConfiguration: T): string { + const environment = parseArgs(process.argv); + const config = objects.assign(environment, windowConfiguration); + for (const keyValue of Object.keys(config)) { + const key = keyValue as keyof typeof config; + if (config[key] === undefined || config[key] === null || config[key] === '') { + delete config[key]; // only send over properties that have a true value + } + } + + return `${require.toUrl(pathToHtml)}?config=${encodeURIComponent(JSON.stringify(config))}`; +} From f3b0ce602fadc0f31e943965a43bb64096c1b85b Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 8 Jul 2019 18:16:48 -0700 Subject: [PATCH 1227/1449] Add index signatures #76442 --- src/vs/editor/common/config/commonEditorConfig.ts | 4 ++-- src/vs/platform/telemetry/common/telemetryUtils.ts | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index 3752591e93f..5866654f0ca 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -153,8 +153,8 @@ export abstract class CommonEditorConfiguration extends Disposable implements ed return true; } - private static _subsetEquals(base: object, subset: object): boolean { - for (let key in subset) { + private static _subsetEquals(base: { [key: string]: any }, subset: { [key: string]: any }): boolean { + for (const key in subset) { if (hasOwnProperty.call(subset, key)) { const subsetValue = subset[key]; const baseValue = base[key]; diff --git a/src/vs/platform/telemetry/common/telemetryUtils.ts b/src/vs/platform/telemetry/common/telemetryUtils.ts index dd9ef9aeea7..ed1b6622f90 100644 --- a/src/vs/platform/telemetry/common/telemetryUtils.ts +++ b/src/vs/platform/telemetry/common/telemetryUtils.ts @@ -54,7 +54,7 @@ export class LogAppender implements ITelemetryAppender { } log(eventName: string, data: any): void { - const strippedData = {}; + const strippedData: { [key: string]: any } = {}; Object.keys(data).forEach(key => { if (!this.commonPropertiesRegex.test(key)) { strippedData[key] = data[key]; @@ -244,7 +244,7 @@ export function keybindingsTelemetry(telemetryService: ITelemetryService, keybin }); } -function flattenKeys(value: Object): string[] { +function flattenKeys(value: Object | undefined): string[] { if (!value) { return []; } @@ -253,7 +253,7 @@ function flattenKeys(value: Object): string[] { return result; } -function flatKeys(result: string[], prefix: string, value: Object): void { +function flatKeys(result: string[], prefix: string, value: { [key: string]: any } | undefined): void { if (value && typeof value === 'object' && !Array.isArray(value)) { Object.keys(value) .forEach(key => flatKeys(result, prefix ? `${prefix}.${key}` : key, value[key])); @@ -262,7 +262,7 @@ function flatKeys(result: string[], prefix: string, value: Object): void { } } -function flattenValues(value: Object, keys: string[]): { [key: string]: any }[] { +function flattenValues(value: { [key: string]: any } | undefined, keys: string[]): { [key: string]: any }[] { if (!value) { return []; } From 573c5422a54f6bc6a38243fdf1f365f05a602e31 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 8 Jul 2019 18:17:31 -0700 Subject: [PATCH 1228/1449] Use Set instead of using object to track previously seen values --- .../services/extensions/node/proxyResolver.ts | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/services/extensions/node/proxyResolver.ts b/src/vs/workbench/services/extensions/node/proxyResolver.ts index 5480a882d78..34100b16ec1 100644 --- a/src/vs/workbench/services/extensions/node/proxyResolver.ts +++ b/src/vs/workbench/services/extensions/node/proxyResolver.ts @@ -403,7 +403,7 @@ function configureModuleLoading(extensionService: ExtHostExtensionService, looku const modules = lookup[request]; const ext = extensionPaths.findSubstr(URI.file(parent.filename).fsPath); if (ext && ext.enableProposedApi) { - return modules[(ext).proxySupport] || modules.onRequest; + return (modules as any)[(ext).proxySupport] || modules.onRequest; } return modules.default; }; @@ -471,11 +471,9 @@ async function readWindowsCaCertificates() { store.done(); } - const seen = {}; - const certs = ders.map(derToPem) - .filter(pem => !seen[pem] && (seen[pem] = true)); + const certs = new Set(ders.map(derToPem)); return { - certs, + certs: Array.from(certs), append: true }; } @@ -489,11 +487,10 @@ async function readMacCaCertificates() { child.on('error', reject); child.on('exit', code => code ? reject(code) : resolve(stdout.join(''))); }); - const seen = {}; - const certs = stdout.split(/(?=-----BEGIN CERTIFICATE-----)/g) - .filter(pem => !!pem.length && !seen[pem] && (seen[pem] = true)); + const certs = new Set(stdout.split(/(?=-----BEGIN CERTIFICATE-----)/g) + .filter(pem => !!pem.length)); return { - certs, + certs: Array.from(certs), append: true }; } @@ -507,11 +504,10 @@ async function readLinuxCaCertificates() { for (const certPath of linuxCaCertificatePaths) { try { const content = await promisify(fs.readFile)(certPath, { encoding: 'utf8' }); - const seen = {}; - const certs = content.split(/(?=-----BEGIN CERTIFICATE-----)/g) - .filter(pem => !!pem.length && !seen[pem] && (seen[pem] = true)); + const certs = new Set(content.split(/(?=-----BEGIN CERTIFICATE-----)/g) + .filter(pem => !!pem.length)); return { - certs, + certs: Array.from(certs), append: false }; } catch (err) { From 8e86602c75e96957f52588b9a6e7c38df8602125 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 8 Jul 2019 18:21:41 -0700 Subject: [PATCH 1229/1449] Adding explicit index signature types #76442 --- .../extensions/electron-browser/extensionTipsService.ts | 6 +++--- src/vs/workbench/services/keybinding/common/keymapInfo.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionTipsService.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionTipsService.ts index 06c18df0750..f192f1c16d9 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionTipsService.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionTipsService.ts @@ -618,7 +618,7 @@ export class ExtensionTipsService extends Disposable implements IExtensionTipsSe this.storageService.store( 'extensionsAssistant/recommendations', - JSON.stringify(Object.keys(this._fileBasedRecommendations).reduce((result, key) => { result[key] = this._fileBasedRecommendations[key].recommendedTime; return result; }, {})), + JSON.stringify(Object.keys(this._fileBasedRecommendations).reduce((result, key) => { result[key] = this._fileBasedRecommendations[key].recommendedTime; return result; }, {} as { [key: string]: any })), StorageScope.GLOBAL ); @@ -935,7 +935,7 @@ export class ExtensionTipsService extends Disposable implements IExtensionTipsSe } const storageKey = 'extensionsAssistant/dynamicWorkspaceRecommendations'; - let storedRecommendationsJson = {}; + let storedRecommendationsJson: { [key: string]: any } = {}; try { storedRecommendationsJson = JSON.parse(this.storageService.get(storageKey, StorageScope.WORKSPACE, '{}')); } catch (e) { @@ -980,7 +980,7 @@ export class ExtensionTipsService extends Disposable implements IExtensionTipsSe if (context.res.statusCode !== 200) { return Promise.resolve(undefined); } - return asJson(context).then((result) => { + return asJson(context).then((result: { [key: string]: any }) => { if (!result) { return; } diff --git a/src/vs/workbench/services/keybinding/common/keymapInfo.ts b/src/vs/workbench/services/keybinding/common/keymapInfo.ts index edea5fd675c..5282815cd9a 100644 --- a/src/vs/workbench/services/keybinding/common/keymapInfo.ts +++ b/src/vs/workbench/services/keybinding/common/keymapInfo.ts @@ -192,7 +192,7 @@ export function getKeyboardLayoutId(layout: IKeyboardLayoutInfo): string { function deserializeMapping(serializedMapping: ISerializedMapping) { let mapping = serializedMapping; - let ret = {}; + let ret: { [key: string]: any } = {}; for (let key in mapping) { let result: (string | number)[] = mapping[key]; if (result.length) { From 6824cc90231d378ab1214339bb50d1ec80de1e97 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 8 Jul 2019 18:27:09 -0700 Subject: [PATCH 1230/1449] Fix/supress more implict index errors #76442 --- src/vs/platform/diagnostics/common/diagnosticsService.ts | 3 ++- .../contrib/markers/browser/markersPanelActions.ts | 9 +++++---- src/vs/workbench/contrib/output/browser/outputPanel.ts | 2 +- .../contrib/preferences/browser/preferencesEditor.ts | 4 ++-- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/vs/platform/diagnostics/common/diagnosticsService.ts b/src/vs/platform/diagnostics/common/diagnosticsService.ts index 496b75397c0..ae854fcfb7c 100644 --- a/src/vs/platform/diagnostics/common/diagnosticsService.ts +++ b/src/vs/platform/diagnostics/common/diagnosticsService.ts @@ -8,6 +8,7 @@ import { ProcessItem } from 'vs/base/common/processes'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IMainProcessInfo } from 'vs/platform/launch/common/launchService'; import { IWorkspace } from 'vs/platform/workspace/common/workspace'; +import { IStringDictionary } from 'vs/base/common/collections'; export interface IMachineInfo { os: string; @@ -18,7 +19,7 @@ export interface IMachineInfo { export interface IDiagnosticInfo { machineInfo: IMachineInfo; - workspaceMetadata?: { [key: string]: WorkspaceStats }; + workspaceMetadata?: IStringDictionary; processes?: ProcessItem; } export interface SystemInfo extends IMachineInfo { diff --git a/src/vs/workbench/contrib/markers/browser/markersPanelActions.ts b/src/vs/workbench/contrib/markers/browser/markersPanelActions.ts index 01d83e82d95..92fd3b3c925 100644 --- a/src/vs/workbench/contrib/markers/browser/markersPanelActions.ts +++ b/src/vs/workbench/contrib/markers/browser/markersPanelActions.ts @@ -275,10 +275,11 @@ export class MarkersFilterActionViewItem extends BaseActionViewItem { private reportFilteringUsed(): void { const filterOptions = this.filterController.getFilterOptions(); - const data = {}; - data['errors'] = filterOptions.filterErrors; - data['warnings'] = filterOptions.filterWarnings; - data['infos'] = filterOptions.filterInfos; + const data = { + errors: filterOptions.filterErrors, + warnings: filterOptions.filterWarnings, + infos: filterOptions.filterInfos, + }; /* __GDPR__ "problems.filter" : { "errors" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, diff --git a/src/vs/workbench/contrib/output/browser/outputPanel.ts b/src/vs/workbench/contrib/output/browser/outputPanel.ts index 7537b9381b6..09365d68550 100644 --- a/src/vs/workbench/contrib/output/browser/outputPanel.ts +++ b/src/vs/workbench/contrib/output/browser/outputPanel.ts @@ -95,7 +95,7 @@ export class OutputPanel extends AbstractTextResourceEditor { options.renderLineHighlight = 'none'; options.minimap = { enabled: false }; - const outputConfig = this.baseConfigurationService.getValue<{}>('[Log]'); + const outputConfig = this.baseConfigurationService.getValue('[Log]'); if (outputConfig) { if (outputConfig['editor.minimap.enabled']) { options.minimap = { enabled: true }; diff --git a/src/vs/workbench/contrib/preferences/browser/preferencesEditor.ts b/src/vs/workbench/contrib/preferences/browser/preferencesEditor.ts index 6912a5f72a6..8d87975990c 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferencesEditor.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferencesEditor.ts @@ -284,7 +284,7 @@ export class PreferencesEditor extends BaseEditor { } private _countById(settingsGroups: ISettingsGroup[]): IStringDictionary { - const result = {}; + const result: IStringDictionary = {}; for (const group of settingsGroups) { let i = 0; @@ -680,7 +680,7 @@ class PreferencesRenderersController extends Disposable { } private _updatePreference(key: string, value: any, source: ISetting, fromEditableSettings?: boolean): void { - const data = { + const data: { [key: string]: any } = { userConfigurationKeys: [key] }; From 3492642650205941e2b9c15af3c4aebc5f590d5a Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 8 Jul 2019 18:36:33 -0700 Subject: [PATCH 1231/1449] Fix/supressing more implicit index errors #76442 --- src/vs/base/common/console.ts | 5 ++++- src/vs/base/parts/storage/node/storage.ts | 2 +- src/vs/workbench/contrib/extensions/common/extensionQuery.ts | 4 ++-- .../workbench/contrib/quickopen/browser/viewPickerHandler.ts | 3 ++- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/vs/base/common/console.ts b/src/vs/base/common/console.ts index ccd30d07a1e..9b49ff985d4 100644 --- a/src/vs/base/common/console.ts +++ b/src/vs/base/common/console.ts @@ -131,7 +131,10 @@ export function log(entry: IRemoteConsoleLog, label: string): void { } // Log it - console[entry.severity].apply(console, consoleArgs); + if (typeof (console as any)[entry.severity] !== 'function') { + throw new Error('Unknown console method'); + } + (console as any)[entry.severity].apply(console, consoleArgs); } function color(color: string): string { diff --git a/src/vs/base/parts/storage/node/storage.ts b/src/vs/base/parts/storage/node/storage.ts index 48e347df1f2..6cebac12c9f 100644 --- a/src/vs/base/parts/storage/node/storage.ts +++ b/src/vs/base/parts/storage/node/storage.ts @@ -237,7 +237,7 @@ export class SQLiteStorageDatabase implements IStorageDatabase { const connection = await this.whenConnected; const row = await this.get(connection, full ? 'PRAGMA integrity_check' : 'PRAGMA quick_check'); - const integrity = full ? row['integrity_check'] : row['quick_check']; + const integrity = full ? (row as any)['integrity_check'] : (row as any)['quick_check']; if (connection.isErroneous) { return `${integrity} (last error: ${connection.lastError})`; diff --git a/src/vs/workbench/contrib/extensions/common/extensionQuery.ts b/src/vs/workbench/contrib/extensions/common/extensionQuery.ts index 25b9c3cf909..445e23db188 100644 --- a/src/vs/workbench/contrib/extensions/common/extensionQuery.ts +++ b/src/vs/workbench/contrib/extensions/common/extensionQuery.ts @@ -29,8 +29,8 @@ export class Query { if (hasSort && command === 'sort' || hasCategory && command === 'category') { return []; } - if (subcommands[command]) { - return subcommands[command].map((subcommand: string) => `@${command}:${subcommand}${subcommand === '' ? '' : ' '}`); + if ((subcommands as any)[command]) { + return (subcommands as any)[command].map((subcommand: string) => `@${command}:${subcommand}${subcommand === '' ? '' : ' '}`); } else { return [`@${command} `]; diff --git a/src/vs/workbench/contrib/quickopen/browser/viewPickerHandler.ts b/src/vs/workbench/contrib/quickopen/browser/viewPickerHandler.ts index b7aa6827dfc..8c11af81604 100644 --- a/src/vs/workbench/contrib/quickopen/browser/viewPickerHandler.ts +++ b/src/vs/workbench/contrib/quickopen/browser/viewPickerHandler.ts @@ -21,6 +21,7 @@ import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { ViewletDescriptor } from 'vs/workbench/browser/viewlet'; import { Registry } from 'vs/platform/registry/common/platform'; import { CancellationToken } from 'vs/base/common/cancellation'; +import { IStringDictionary } from 'vs/base/common/collections'; export const VIEW_PICKER_PREFIX = 'view '; @@ -101,7 +102,7 @@ export class ViewPickerHandler extends QuickOpenHandler { return true; }); - const entryToCategory = {}; + const entryToCategory: IStringDictionary = {}; entries.forEach(e => { if (!entryToCategory[e.getLabel()]) { entryToCategory[e.getLabel()] = e.getCategory(); From a558a9504aae896efc0fa50509d157e34254e3e9 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 3 Jul 2019 19:14:19 -0700 Subject: [PATCH 1232/1449] Adding toWebviewResource api For #76489 --- .../media/markdown.css | 6 +- .../src/features/preview.ts | 16 ++- .../src/features/previewContentProvider.ts | 116 +++++++++--------- .../src/util/resources.ts | 12 +- .../src/singlefolder-tests/webview.test.ts | 9 +- .../environment/common/environment.ts | 1 + .../environment/node/environmentService.ts | 5 +- src/vs/vscode.proposed.d.ts | 12 +- .../api/browser/mainThreadCodeInsets.ts | 6 - .../api/browser/mainThreadWebview.ts | 16 +-- .../workbench/api/common/extHost.protocol.ts | 4 +- .../workbench/api/common/extHostCodeInsets.ts | 20 +-- src/vs/workbench/api/common/extHostWebview.ts | 19 ++- src/vs/workbench/api/common/shared/webview.ts | 24 ++++ src/vs/workbench/api/node/extHost.api.impl.ts | 4 +- .../electron-browser/webviewService.ts | 2 +- .../environment/browser/environmentService.ts | 4 + .../common/remoteExtensionHostClient.ts | 2 + .../electron-browser/extensionHost.ts | 2 + .../api/extHostWebview.test.ts | 2 +- 20 files changed, 168 insertions(+), 114 deletions(-) create mode 100644 src/vs/workbench/api/common/shared/webview.ts diff --git a/extensions/markdown-language-features/media/markdown.css b/extensions/markdown-language-features/media/markdown.css index dc2310763c1..dc12cfca001 100644 --- a/extensions/markdown-language-features/media/markdown.css +++ b/extensions/markdown-language-features/media/markdown.css @@ -4,10 +4,10 @@ *--------------------------------------------------------------------------------------------*/ html, body { - font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif; - font-size: 14px; + font-family: var(--vscode-markdown-font-family, -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif); + font-size: var(--vscode-markdown-font-size, 14px); padding: 0 26px; - line-height: 22px; + line-height: var(--vscode-markdown-line-height, 22px); word-wrap: break-word; } diff --git a/extensions/markdown-language-features/src/features/preview.ts b/extensions/markdown-language-features/src/features/preview.ts index 1479a6ea112..6ee3bb71770 100644 --- a/extensions/markdown-language-features/src/features/preview.ts +++ b/extensions/markdown-language-features/src/features/preview.ts @@ -16,6 +16,7 @@ import { MarkdownPreviewConfigurationManager } from './previewConfig'; import { MarkdownContributionProvider, MarkdownContributions } from '../markdownExtensions'; import { isMarkdownFile } from '../util/file'; import { resolveLinkToMarkdownFile } from '../commands/openDocumentLink'; +import { WebviewResourceProvider } from '../util/resources'; const localize = nls.loadMessageBundle(); interface WebviewMessage { @@ -388,6 +389,10 @@ export class MarkdownPreview extends Disposable { } private async doUpdate(): Promise { + if (this._disposed) { + return; + } + const resource = this._resource; clearTimeout(this.throttleTimer); @@ -401,6 +406,10 @@ export class MarkdownPreview extends Disposable { return; } + if (this._disposed) { + return; + } + const pendingVersion = new PreviewDocumentVersion(resource, document.version); if (!this.forceUpdate && this.currentVersion && this.currentVersion.equals(pendingVersion)) { if (this.line) { @@ -412,7 +421,12 @@ export class MarkdownPreview extends Disposable { this.currentVersion = pendingVersion; if (this._resource === resource) { - const content = await this._contentProvider.provideTextDocumentContent(document, await this.editor.webview.resourceRoot, this._previewConfigurations, this.line, this.state); + const self = this; + const resourceProvider: WebviewResourceProvider = { + toWebviewResource: (resource) => this.editor.webview.toWebviewResource(resource), + get cspRule() { return self.editor.webview.cspRule; } + }; + const content = await this._contentProvider.provideTextDocumentContent(document, resourceProvider, this._previewConfigurations, this.line, this.state); // Another call to `doUpdate` may have happened. // Make sure we are still updating for the correct document if (this.currentVersion && this.currentVersion.equals(pendingVersion)) { diff --git a/extensions/markdown-language-features/src/features/previewContentProvider.ts b/extensions/markdown-language-features/src/features/previewContentProvider.ts index 00bcf723aab..fc54cc69a7b 100644 --- a/extensions/markdown-language-features/src/features/previewContentProvider.ts +++ b/extensions/markdown-language-features/src/features/previewContentProvider.ts @@ -3,18 +3,17 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as vscode from 'vscode'; import * as path from 'path'; -import { MarkdownEngine } from '../markdownEngine'; - +import * as vscode from 'vscode'; import * as nls from 'vscode-nls'; -const localize = nls.loadMessageBundle(); - import { Logger } from '../logger'; -import { ContentSecurityPolicyArbiter, MarkdownPreviewSecurityLevel } from '../security'; -import { MarkdownPreviewConfigurationManager, MarkdownPreviewConfiguration } from './previewConfig'; +import { MarkdownEngine } from '../markdownEngine'; import { MarkdownContributionProvider } from '../markdownExtensions'; -import { toResoruceUri } from '../util/resources'; +import { ContentSecurityPolicyArbiter, MarkdownPreviewSecurityLevel } from '../security'; +import { WebviewResourceProvider } from '../util/resources'; +import { MarkdownPreviewConfiguration, MarkdownPreviewConfigurationManager } from './previewConfig'; + +const localize = nls.loadMessageBundle(); /** * Strings used inside the markdown preview. @@ -36,8 +35,8 @@ const previewStrings = { 'Content Disabled Security Warning') }; -function escapeAttribute(value: string): string { - return value.replace(/"/g, '"'); +function escapeAttribute(value: string | vscode.Uri): string { + return value.toString().replace(/"/g, '"'); } export class MarkdownContentProvider { @@ -51,7 +50,7 @@ export class MarkdownContentProvider { public async provideTextDocumentContent( markdownDocument: vscode.TextDocument, - webviewResourceRoot: string, + resourceProvider: WebviewResourceProvider, previewConfigurations: MarkdownPreviewConfigurationManager, initialLine: number | undefined = undefined, state?: any @@ -66,18 +65,18 @@ export class MarkdownContentProvider { scrollEditorWithPreview: config.scrollEditorWithPreview, doubleClickToSwitchToEditor: config.doubleClickToSwitchToEditor, disableSecurityWarnings: this.cspArbiter.shouldDisableSecurityWarnings(), - webviewResourceRoot: webviewResourceRoot, + webviewResourceRoot: resourceProvider.toWebviewResource(markdownDocument.uri).toString(), }; this.logger.log('provideTextDocumentContent', initialData); // Content Security Policy const nonce = new Date().getTime() + '' + new Date().getMilliseconds(); - const csp = this.getCspForResource(webviewResourceRoot, sourceUri, nonce); + const csp = this.getCsp(resourceProvider, sourceUri, nonce); const body = await this.engine.render(markdownDocument); return ` - + ${csp} @@ -85,14 +84,14 @@ export class MarkdownContentProvider { data-settings="${escapeAttribute(JSON.stringify(initialData))}" data-strings="${escapeAttribute(JSON.stringify(previewStrings))}" data-state="${escapeAttribute(JSON.stringify(state || {}))}"> - - ${this.getStyles(webviewResourceRoot, sourceUri, nonce, config, state)} - + + ${this.getStyles(resourceProvider, sourceUri, config, state)} + ${body}
- ${this.getScripts(webviewResourceRoot, nonce)} + ${this.getScripts(resourceProvider, nonce)} `; } @@ -110,12 +109,13 @@ export class MarkdownContentProvider { `; } - private extensionResourcePath(webviewResourceRoot: string, mediaFile: string): string { - return toResoruceUri(webviewResourceRoot, vscode.Uri.file(this.context.asAbsolutePath(path.join('media', mediaFile)))) - .toString(); + private extensionResourcePath(resourceProvider: WebviewResourceProvider, mediaFile: string): string { + const webviewResource = resourceProvider.toWebviewResource( + vscode.Uri.file(this.context.asAbsolutePath(path.join('media', mediaFile)))); + return webviewResource.toString(); } - private fixHref(webviewResourceRoot: string, resource: vscode.Uri, href: string): string { + private fixHref(resourceProvider: WebviewResourceProvider, resource: vscode.Uri, href: string): string { if (!href) { return href; } @@ -126,36 +126,36 @@ export class MarkdownContentProvider { // Assume it must be a local file if (path.isAbsolute(href)) { - return toResoruceUri(webviewResourceRoot, vscode.Uri.file(href)).toString(); + return resourceProvider.toWebviewResource(vscode.Uri.file(href)).toString(); } // Use a workspace relative path if there is a workspace const root = vscode.workspace.getWorkspaceFolder(resource); if (root) { - return toResoruceUri(webviewResourceRoot, vscode.Uri.file(path.join(root.uri.fsPath, href))).toString(); + return resourceProvider.toWebviewResource(vscode.Uri.file(path.join(root.uri.fsPath, href))).toString(); } // Otherwise look relative to the markdown file - return toResoruceUri(webviewResourceRoot, vscode.Uri.file(path.join(path.dirname(resource.fsPath), href))).toString(); + return resourceProvider.toWebviewResource(vscode.Uri.file(path.join(path.dirname(resource.fsPath), href))).toString(); } - private computeCustomStyleSheetIncludes(webviewResourceRoot: string, resource: vscode.Uri, config: MarkdownPreviewConfiguration): string { - if (Array.isArray(config.styles)) { - return config.styles.map(style => { - return ``; - }).join('\n'); + private computeCustomStyleSheetIncludes(resourceProvider: WebviewResourceProvider, resource: vscode.Uri, config: MarkdownPreviewConfiguration): string { + if (!Array.isArray(config.styles)) { + return ''; } - return ''; + const out: string[] = []; + for (const style of config.styles) { + out.push(``); + } + return out.join('\n'); } - private getSettingsOverrideStyles(nonce: string, config: MarkdownPreviewConfiguration): string { - return ``; + private getSettingsOverrideStyles(config: MarkdownPreviewConfiguration): string { + return [ + config.fontFamily ? `--vscode-markdown-font-family: ${config.fontFamily};` : '', + isNaN(config.fontSize) ? '' : `--vscode-markdown-font-size: ${config.fontSize}px;`, + isNaN(config.lineHeight) ? '' : `--vscode-markdown-line-height: ${config.lineHeight};`, + ].join(' '); } private getImageStabilizerStyles(state?: any) { @@ -173,41 +173,47 @@ export class MarkdownContentProvider { return ret; } - private getStyles(webviewResourceRoot: string, resource: vscode.Uri, nonce: string, config: MarkdownPreviewConfiguration, state?: any): string { - const baseStyles = this.contributionProvider.contributions.previewStyles - .map(resource => ``) - .join('\n'); + private getStyles(resourceProvider: WebviewResourceProvider, resource: vscode.Uri, config: MarkdownPreviewConfiguration, state?: any): string { + const baseStyles: string[] = []; + for (const resource of this.contributionProvider.contributions.previewStyles) { + baseStyles.push(``); + } - return `${baseStyles} - ${this.getSettingsOverrideStyles(nonce, config)} - ${this.computeCustomStyleSheetIncludes(webviewResourceRoot, resource, config)} + return `${baseStyles.join('\n')} + ${this.computeCustomStyleSheetIncludes(resourceProvider, resource, config)} ${this.getImageStabilizerStyles(state)}`; } - private getScripts(resourceRoot: string, nonce: string): string { - return this.contributionProvider.contributions.previewScripts - .map(resource => ``) - .join('\n'); + private getScripts(resourceProvider: WebviewResourceProvider, nonce: string): string { + const out: string[] = []; + for (const resource of this.contributionProvider.contributions.previewScripts) { + out.push(``); + } + return out.join('\n'); } - private getCspForResource( - webviewResourceRoot: string, + private getCsp( + provider: WebviewResourceProvider, resource: vscode.Uri, nonce: string ): string { + const rule = provider.cspRule; switch (this.cspArbiter.getSecurityLevelForResource(resource)) { case MarkdownPreviewSecurityLevel.AllowInsecureContent: - return ``; + return ``; case MarkdownPreviewSecurityLevel.AllowInsecureLocalContent: - return ``; + return ``; case MarkdownPreviewSecurityLevel.AllowScriptsAndAllContent: return ''; case MarkdownPreviewSecurityLevel.Strict: default: - return ``; + return ``; } } } diff --git a/extensions/markdown-language-features/src/util/resources.ts b/extensions/markdown-language-features/src/util/resources.ts index cb9b8cb56d6..854e26b871e 100644 --- a/extensions/markdown-language-features/src/util/resources.ts +++ b/extensions/markdown-language-features/src/util/resources.ts @@ -5,12 +5,8 @@ import * as vscode from 'vscode'; +export interface WebviewResourceProvider { + toWebviewResource(resource: vscode.Uri): vscode.Uri; -export function toResoruceUri(webviewResourceRoot: string, uri: vscode.Uri): vscode.Uri { - const rootUri = vscode.Uri.parse(webviewResourceRoot); - return rootUri.with({ - path: rootUri.path + uri.path, - query: uri.query, - fragment: uri.fragment, - }); -} + readonly cspRule: string; +} \ No newline at end of file diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/webview.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/webview.test.ts index 8ef8cec74d6..4be0218ab64 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/webview.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/webview.test.ts @@ -251,15 +251,18 @@ suite('Webview tests', () => { }); `); - const workspaceRootUri = webview.webview.resourceRoot + vscode.Uri.file(vscode.workspace.rootPath!).path; + async function toWebviewResource(path: string) { + const root = await webview.webview.toWebviewResource(vscode.Uri.file(vscode.workspace.rootPath!)); + return root.toString() + path; + } { - const imagePath = workspaceRootUri.toString() + '/image.png'; + const imagePath = await toWebviewResource('/image.png'); const response = sendRecieveMessage(webview, { src: imagePath }); assert.strictEqual((await response).value, true); } { - const imagePath = workspaceRootUri.toString() + '/no-such-image.png'; + const imagePath = await toWebviewResource('/no-such-image.png'); const response = sendRecieveMessage(webview, { src: imagePath }); assert.strictEqual((await response).value, false); } diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index 189d930f7b7..676b656049e 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -169,4 +169,5 @@ export interface IEnvironmentService { webviewEndpoint?: string; readonly webviewResourceRoot: string; + readonly webviewCspRule: string; } diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts index 0b2fd7547db..0aad1cf390d 100644 --- a/src/vs/platform/environment/node/environmentService.ts +++ b/src/vs/platform/environment/node/environmentService.ts @@ -278,9 +278,8 @@ export class EnvironmentService implements IEnvironmentService { get driverHandle(): string | undefined { return this._args['driver']; } get driverVerbose(): boolean { return !!this._args['driver-verbose']; } - get webviewResourceRoot(): string { - return 'vscode-resource:'; - } + readonly webviewResourceRoot = 'vscode-resource:'; + readonly webviewCspRule = 'vscode-resource:'; constructor(private _args: ParsedArgs, private _execPath: string) { if (!process.env['VSCODE_LOGS']) { diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 13dbe4284e0..707eba8b5db 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1579,12 +1579,14 @@ declare module 'vscode' { export interface Webview { /** - * Root url from which local resources are loaded inside of webviews. - * - * This is `vscode-resource:` when vscode is run on the desktop. When vscode is run - * on the web, this points to a server endpoint. + * Convert a uri for the local file system to one that can be used inside webviews. */ - readonly resourceRoot: Thenable; + toWebviewResource(localResource: Uri): Uri; + + /** + * Content security policy rule for webview resources. + */ + readonly cspRule: string; } //#endregion diff --git a/src/vs/workbench/api/browser/mainThreadCodeInsets.ts b/src/vs/workbench/api/browser/mainThreadCodeInsets.ts index 2044af5567f..e52a8969269 100644 --- a/src/vs/workbench/api/browser/mainThreadCodeInsets.ts +++ b/src/vs/workbench/api/browser/mainThreadCodeInsets.ts @@ -12,7 +12,6 @@ import { IWebviewService, Webview } from 'vs/workbench/contrib/webview/common/we import { DisposableStore } from 'vs/base/common/lifecycle'; import { IActiveCodeEditor, IViewZone } from 'vs/editor/browser/editorBrowser'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; // todo@joh move these things back into something like contrib/insets class EditorWebviewZone implements IViewZone { @@ -60,7 +59,6 @@ export class MainThreadEditorInsets implements MainThreadEditorInsetsShape { constructor( context: IExtHostContext, - @IEnvironmentService private readonly _environmentService: IEnvironmentService, @ICodeEditorService private readonly _editorService: ICodeEditorService, @IWebviewService private readonly _webviewService: IWebviewService, ) { @@ -147,8 +145,4 @@ export class MainThreadEditorInsets implements MainThreadEditorInsetsShape { } return inset; } - - async $getResourceRoot(_handle: number): Promise { - return this._environmentService.webviewResourceRoot; - } } diff --git a/src/vs/workbench/api/browser/mainThreadWebview.ts b/src/vs/workbench/api/browser/mainThreadWebview.ts index 5dd98e6e0d6..48b250bff1d 100644 --- a/src/vs/workbench/api/browser/mainThreadWebview.ts +++ b/src/vs/workbench/api/browser/mainThreadWebview.ts @@ -23,7 +23,6 @@ import { ACTIVE_GROUP, IEditorService } from 'vs/workbench/services/editor/commo import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { extHostNamedCustomer } from '../common/extHostCustomers'; import { IProductService } from 'vs/platform/product/common/product'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @extHostNamedCustomer(MainContext.MainThreadWebviews) export class MainThreadWebviews extends Disposable implements MainThreadWebviewsShape { @@ -51,11 +50,10 @@ export class MainThreadWebviews extends Disposable implements MainThreadWebviews @IExtensionService extensionService: IExtensionService, @IEditorGroupsService private readonly _editorGroupService: IEditorGroupsService, @IEditorService private readonly _editorService: IEditorService, - @IWebviewEditorService private readonly _webviewService: IWebviewEditorService, + @IWebviewEditorService private readonly _webviewEditorService: IWebviewEditorService, @IOpenerService private readonly _openerService: IOpenerService, @ITelemetryService private readonly _telemetryService: ITelemetryService, @IProductService private readonly _productService: IProductService, - @IEnvironmentService private readonly _environmentService: IEnvironmentService, ) { super(); @@ -65,7 +63,7 @@ export class MainThreadWebviews extends Disposable implements MainThreadWebviews // This reviver's only job is to activate webview extensions // This should trigger the real reviver to be registered from the extension host side. - this._register(_webviewService.registerReviver({ + this._register(_webviewEditorService.registerReviver({ canRevive: (webview) => { const viewType = webview.state.viewType; if (viewType) { @@ -97,7 +95,7 @@ export class MainThreadWebviews extends Disposable implements MainThreadWebviews mainThreadShowOptions.group = viewColumnToEditorGroup(this._editorGroupService, showOptions.viewColumn); } - const webview = this._webviewService.createWebview(this.getInternalWebviewId(viewType), title, mainThreadShowOptions, reviveWebviewOptions(options), { + const webview = this._webviewEditorService.createWebview(this.getInternalWebviewId(viewType), title, mainThreadShowOptions, reviveWebviewOptions(options), { location: URI.revive(extensionLocation), id: extensionId }, this.createWebviewEventDelegate(handle)); @@ -141,10 +139,6 @@ export class MainThreadWebviews extends Disposable implements MainThreadWebviews webview.setOptions(reviveWebviewOptions(options as any /*todo@mat */)); } - async $getResourceRoot(_handle: WebviewPanelHandle): Promise { - return this._environmentService.webviewResourceRoot; - } - public $reveal(handle: WebviewPanelHandle, showOptions: WebviewPanelShowOptions): void { const webview = this.getWebview(handle); if (webview.isDisposed()) { @@ -153,7 +147,7 @@ export class MainThreadWebviews extends Disposable implements MainThreadWebviews const targetGroup = this._editorGroupService.getGroup(viewColumnToEditorGroup(this._editorGroupService, showOptions.viewColumn)) || this._editorGroupService.getGroup(webview.group || 0); if (targetGroup) { - this._webviewService.revealWebview(webview, targetGroup, !!showOptions.preserveFocus); + this._webviewEditorService.revealWebview(webview, targetGroup, !!showOptions.preserveFocus); } } @@ -182,7 +176,7 @@ export class MainThreadWebviews extends Disposable implements MainThreadWebviews throw new Error(`Reviver for ${viewType} already registered`); } - this._revivers.set(viewType, this._webviewService.registerReviver({ + this._revivers.set(viewType, this._webviewEditorService.registerReviver({ canRevive: (webview) => { return webview.state && webview.state.viewType === viewType; }, diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 1f2802ea390..28af0f381b7 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -59,6 +59,8 @@ export interface IEnvironment { extensionTestsLocationURI?: URI; globalStorageHome: URI; userHome: URI; + webviewResourceRoot: string; + webviewCspRule: string; } export interface IStaticWorkspaceData { @@ -533,7 +535,6 @@ export interface MainThreadEditorInsetsShape extends IDisposable { $setHtml(handle: number, value: string): void; $setOptions(handle: number, options: modes.IWebviewOptions): void; $postMessage(handle: number, value: any): Promise; - $getResourceRoot(handle: number): Promise; } export interface ExtHostEditorInsetsShape { @@ -558,7 +559,6 @@ export interface MainThreadWebviewsShape extends IDisposable { $setHtml(handle: WebviewPanelHandle, value: string): void; $setOptions(handle: WebviewPanelHandle, options: modes.IWebviewOptions): void; $postMessage(handle: WebviewPanelHandle, value: any): Promise; - $getResourceRoot(handle: WebviewPanelHandle): Promise; $registerSerializer(viewType: string): void; $unregisterSerializer(viewType: string): void; diff --git a/src/vs/workbench/api/common/extHostCodeInsets.ts b/src/vs/workbench/api/common/extHostCodeInsets.ts index 5b40af3d04d..49ba7410c64 100644 --- a/src/vs/workbench/api/common/extHostCodeInsets.ts +++ b/src/vs/workbench/api/common/extHostCodeInsets.ts @@ -4,12 +4,13 @@ *--------------------------------------------------------------------------------------------*/ import { Emitter } from 'vs/base/common/event'; -import * as vscode from 'vscode'; -import { MainThreadEditorInsetsShape, ExtHostEditorInsetsShape } from './extHost.protocol'; -import { ExtHostEditors } from 'vs/workbench/api/common/extHostTextEditors'; import { DisposableStore } from 'vs/base/common/lifecycle'; -import { ExtHostTextEditor } from 'vs/workbench/api/common/extHostTextEditor'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { ExtHostTextEditor } from 'vs/workbench/api/common/extHostTextEditor'; +import { ExtHostEditors } from 'vs/workbench/api/common/extHostTextEditors'; +import * as vscode from 'vscode'; +import { ExtHostEditorInsetsShape, MainThreadEditorInsetsShape } from './extHost.protocol'; +import { toWebviewResource, WebviewInitData } from 'vs/workbench/api/common/shared/webview'; export class ExtHostEditorInsets implements ExtHostEditorInsetsShape { @@ -19,7 +20,8 @@ export class ExtHostEditorInsets implements ExtHostEditorInsetsShape { constructor( private readonly _proxy: MainThreadEditorInsetsShape, - private readonly _editors: ExtHostEditors + private readonly _editors: ExtHostEditors, + private readonly _initData: WebviewInitData ) { // dispose editor inset whenever the hosting editor goes away @@ -61,8 +63,12 @@ export class ExtHostEditorInsets implements ExtHostEditorInsetsShape { private _html: string = ''; private _options: vscode.WebviewOptions; - get resourceRoot(): Promise { - return that._proxy.$getResourceRoot(handle); + toWebviewResource(resource: vscode.Uri): vscode.Uri { + return toWebviewResource(that._initData, resource); + } + + get cspRule(): string { + return that._initData.webviewCspRule; } set options(value: vscode.WebviewOptions) { diff --git a/src/vs/workbench/api/common/extHostWebview.ts b/src/vs/workbench/api/common/extHostWebview.ts index 98d6631c2a0..e4e4756afe9 100644 --- a/src/vs/workbench/api/common/extHostWebview.ts +++ b/src/vs/workbench/api/common/extHostWebview.ts @@ -12,6 +12,7 @@ import { ExtHostWebviewsShape, IMainContext, MainContext, MainThreadWebviewsShap import { Disposable } from './extHostTypes'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import * as modes from 'vs/editor/common/modes'; +import { WebviewInitData, toWebviewResource } from 'vs/workbench/api/common/shared/webview'; type IconPath = URI | { light: URI, dark: URI }; @@ -28,7 +29,8 @@ export class ExtHostWebview implements vscode.Webview { constructor( handle: WebviewPanelHandle, proxy: MainThreadWebviewsShape, - options: vscode.WebviewOptions + options: vscode.WebviewOptions, + private readonly initData: WebviewInitData ) { this._handle = handle; this._proxy = proxy; @@ -39,8 +41,12 @@ export class ExtHostWebview implements vscode.Webview { this._onMessageEmitter.dispose(); } - public get resourceRoot(): Promise { - return this._proxy.$getResourceRoot(this._handle); + public toWebviewResource(resource: vscode.Uri): vscode.Uri { + return toWebviewResource(this.initData, resource); + } + + public get cspRule(): string { + return this.initData.webviewCspRule; } public get html(): string { @@ -243,7 +249,8 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { private readonly _serializers = new Map(); constructor( - mainContext: IMainContext + mainContext: IMainContext, + private readonly initData: WebviewInitData ) { this._proxy = mainContext.getProxy(MainContext.MainThreadWebviews); } @@ -264,7 +271,7 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { const handle = ExtHostWebviews.newHandle(); this._proxy.$createWebviewPanel(handle, viewType, title, webviewShowOptions, convertWebviewOptions(options), extension.identifier, extension.extensionLocation); - const webview = new ExtHostWebview(handle, this._proxy, options); + const webview = new ExtHostWebview(handle, this._proxy, options, this.initData); const panel = new ExtHostWebviewPanel(handle, this._proxy, viewType, title, viewColumn, options, webview); this._webviewPanels.set(handle, panel); return panel; @@ -337,7 +344,7 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { return Promise.reject(new Error(`No serializer found for '${viewType}'`)); } - const webview = new ExtHostWebview(webviewHandle, this._proxy, options); + const webview = new ExtHostWebview(webviewHandle, this._proxy, options, this.initData); const revivedPanel = new ExtHostWebviewPanel(webviewHandle, this._proxy, viewType, title, typeof position === 'number' && position >= 0 ? typeConverters.ViewColumn.to(position) : undefined, options, webview); this._webviewPanels.set(webviewHandle, revivedPanel); return Promise.resolve(serializer.deserializeWebviewPanel(revivedPanel, state)); diff --git a/src/vs/workbench/api/common/shared/webview.ts b/src/vs/workbench/api/common/shared/webview.ts new file mode 100644 index 00000000000..95320c72136 --- /dev/null +++ b/src/vs/workbench/api/common/shared/webview.ts @@ -0,0 +1,24 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { URI } from 'vs/base/common/uri'; +import * as vscode from 'vscode'; + +export interface WebviewInitData { + readonly webviewResourceRoot: string; + readonly webviewCspRule: string; +} + +export function toWebviewResource( + initData: WebviewInitData, + resource: vscode.Uri +): vscode.Uri { + const rootUri = URI.parse(initData.webviewResourceRoot); + return rootUri.with({ + path: rootUri.path + resource.path, + query: resource.query, + fragment: resource.fragment, + }); +} diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index debcbce5d4c..018dec12b5b 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -98,7 +98,7 @@ export function createApiFactory( // Addressable instances rpcProtocol.set(ExtHostContext.ExtHostLogService, extHostLogService); const extHostDecorations = rpcProtocol.set(ExtHostContext.ExtHostDecorations, new ExtHostDecorations(rpcProtocol)); - const extHostWebviews = rpcProtocol.set(ExtHostContext.ExtHostWebviews, new ExtHostWebviews(rpcProtocol)); + const extHostWebviews = rpcProtocol.set(ExtHostContext.ExtHostWebviews, new ExtHostWebviews(rpcProtocol, initData.environment)); const extHostUrls = rpcProtocol.set(ExtHostContext.ExtHostUrls, new ExtHostUrls(rpcProtocol)); const extHostDocumentsAndEditors = rpcProtocol.set(ExtHostContext.ExtHostDocumentsAndEditors, new ExtHostDocumentsAndEditors(rpcProtocol)); const extHostDocuments = rpcProtocol.set(ExtHostContext.ExtHostDocuments, new ExtHostDocuments(rpcProtocol, extHostDocumentsAndEditors)); @@ -109,7 +109,7 @@ export function createApiFactory( const extHostTreeViews = rpcProtocol.set(ExtHostContext.ExtHostTreeViews, new ExtHostTreeViews(rpcProtocol.getProxy(MainContext.MainThreadTreeViews), extHostCommands, extHostLogService)); rpcProtocol.set(ExtHostContext.ExtHostWorkspace, extHostWorkspace); rpcProtocol.set(ExtHostContext.ExtHostConfiguration, extHostConfiguration); - const extHostEditorInsets = rpcProtocol.set(ExtHostContext.ExtHostEditorInsets, new ExtHostEditorInsets(rpcProtocol.getProxy(MainContext.MainThreadEditorInsets), extHostEditors)); + const extHostEditorInsets = rpcProtocol.set(ExtHostContext.ExtHostEditorInsets, new ExtHostEditorInsets(rpcProtocol.getProxy(MainContext.MainThreadEditorInsets), extHostEditors, initData.environment)); const extHostDiagnostics = rpcProtocol.set(ExtHostContext.ExtHostDiagnostics, new ExtHostDiagnostics(rpcProtocol)); const extHostLanguageFeatures = rpcProtocol.set(ExtHostContext.ExtHostLanguageFeatures, new ExtHostLanguageFeatures(rpcProtocol, uriTransformer, extHostDocuments, extHostCommands, extHostDiagnostics, extHostLogService)); const extHostFileSystem = rpcProtocol.set(ExtHostContext.ExtHostFileSystem, new ExtHostFileSystem(rpcProtocol, extHostLanguageFeatures)); diff --git a/src/vs/workbench/contrib/webview/electron-browser/webviewService.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewService.ts index 3d2c83af712..e8ccaee1881 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webviewService.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewService.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IWebviewService, Webview, WebviewContentOptions, WebviewOptions } from 'vs/workbench/contrib/webview/common/webview'; import { WebviewElement } from 'vs/workbench/contrib/webview/electron-browser/webviewElement'; -import { IWebviewService, WebviewOptions, WebviewContentOptions, Webview } from 'vs/workbench/contrib/webview/common/webview'; export class WebviewService implements IWebviewService { _serviceBrand: any; diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts index 34b57e9fd73..947b0db9f59 100644 --- a/src/vs/workbench/services/environment/browser/environmentService.ts +++ b/src/vs/workbench/services/environment/browser/environmentService.ts @@ -149,4 +149,8 @@ export class BrowserWorkbenchEnvironmentService implements IEnvironmentService { get webviewResourceRoot(): string { return this.webviewEndpoint ? this.webviewEndpoint + '/vscode-resource' : 'vscode-resource:'; } + + get webviewCspRule(): string { + return this.webviewEndpoint ? this.webviewEndpoint : 'vscode-resource:'; + } } diff --git a/src/vs/workbench/services/extensions/common/remoteExtensionHostClient.ts b/src/vs/workbench/services/extensions/common/remoteExtensionHostClient.ts index f43a59b9663..cf99a0b4b54 100644 --- a/src/vs/workbench/services/extensions/common/remoteExtensionHostClient.ts +++ b/src/vs/workbench/services/extensions/common/remoteExtensionHostClient.ts @@ -190,6 +190,8 @@ export class RemoteExtensionHostClient extends Disposable implements IExtensionH extensionTestsLocationURI: this._environmentService.extensionTestsLocationURI, globalStorageHome: remoteExtensionHostData.globalStorageHome, userHome: remoteExtensionHostData.userHome, + webviewResourceRoot: this._environmentService.webviewResourceRoot, + webviewCspRule: this._environmentService.webviewCspRule, }, workspace: this._contextService.getWorkbenchState() === WorkbenchState.EMPTY ? null : { configuration: workspace.configuration, diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts index 3d324296b01..54d30f406e3 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts @@ -400,6 +400,8 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter { extensionTestsLocationURI: this._environmentService.extensionTestsLocationURI, globalStorageHome: URI.file(this._environmentService.globalStorageHome), userHome: URI.file(this._environmentService.userHome), + webviewResourceRoot: this._environmentService.webviewResourceRoot, + webviewCspRule: this._environmentService.webviewCspRule, }, workspace: this._contextService.getWorkbenchState() === WorkbenchState.EMPTY ? undefined : { configuration: withNullAsUndefined(workspace.configuration), diff --git a/src/vs/workbench/test/electron-browser/api/extHostWebview.test.ts b/src/vs/workbench/test/electron-browser/api/extHostWebview.test.ts index 2650c602cdf..3282e7a6f8b 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostWebview.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostWebview.test.ts @@ -17,7 +17,7 @@ suite('ExtHostWebview', function () { const viewType = 'view.type'; const shape = createNoopMainThreadWebviews(); - const extHostWebviews = new ExtHostWebviews(SingleProxyRPCProtocol(shape)); + const extHostWebviews = new ExtHostWebviews(SingleProxyRPCProtocol(shape), { webviewCspRule: '', webviewResourceRoot: '' }); let lastInvokedDeserializer: vscode.WebviewPanelSerializer | undefined = undefined; From 82e2f7a82801ba199c7ce80b7ae54eac695d7627 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 8 Jul 2019 19:17:39 -0700 Subject: [PATCH 1233/1449] Add basic tests for vscode-resource case --- .../api/extHostWebview.test.ts | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/test/electron-browser/api/extHostWebview.test.ts b/src/vs/workbench/test/electron-browser/api/extHostWebview.test.ts index 3282e7a6f8b..5ea5164c7a1 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostWebview.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostWebview.test.ts @@ -10,8 +10,9 @@ import { mock } from 'vs/workbench/test/electron-browser/api/mock'; import * as vscode from 'vscode'; import { SingleProxyRPCProtocol } from './testRPCProtocol'; import { EditorViewColumn } from 'vs/workbench/api/common/shared/editor'; +import { URI } from 'vs/base/common/uri'; -suite('ExtHostWebview', function () { +suite('ExtHostWebview', () => { test('Cannot register multiple serializers for the same view type', async () => { const viewType = 'view.type'; @@ -46,11 +47,48 @@ suite('ExtHostWebview', function () { await extHostWebviews.$deserializeWebviewPanel('x', viewType, 'title', {}, 0 as EditorViewColumn, {}); assert.strictEqual(lastInvokedDeserializer, serializerB); }); + + test('toWebviewResource for desktop vscode-resource scheme', () => { + const shape = createNoopMainThreadWebviews(); + const extHostWebviews = new ExtHostWebviews(SingleProxyRPCProtocol(shape), { webviewCspRule: '', webviewResourceRoot: 'vscode-resource:' }); + const webview = extHostWebviews.createWebviewPanel({} as any, 'type', 'title', 1, {}); + + assert.strictEqual( + webview.webview.toWebviewResource(URI.parse('file:///Users/codey/file.html')).toString(), + 'vscode-resource:/Users/codey/file.html', + 'Unix basic' + ); + assert.strictEqual( + webview.webview.toWebviewResource(URI.parse('file:///Users/codey/file.html#frag')).toString(), + 'vscode-resource:/Users/codey/file.html#frag', + 'Unix should preserve fragment' + ); + + assert.strictEqual( + webview.webview.toWebviewResource(URI.parse('file:///Users/codey/f%20ile.html')).toString(), + 'vscode-resource:/Users/codey/f%20ile.html', + 'Unix with encoding' + ); + + // TODO: Fix for #48403 + // assert.strictEqual( + // webview.webview.toWebviewResource(URI.parse('file://localhost/Users/codey/file.html')).toString(), + // 'vscode-resource:/Users/codey/file.html', + // 'Unix should preserve authority' + // ); + + assert.strictEqual( + webview.webview.toWebviewResource(URI.parse('file:///c:/codey/file.txt')).toString(), + 'vscode-resource:/c%3A/codey/file.txt', + 'Windows C drive' + ); + }); }); function createNoopMainThreadWebviews() { return new class extends mock() { + $createWebviewPanel() { /* noop */ } $registerSerializer() { /* noop */ } $unregisterSerializer() { /* noop */ } }; From b59b11f1b734ceadc0759680f8b77b1e7da7b73e Mon Sep 17 00:00:00 2001 From: Hung-Wei Hung Date: Tue, 9 Jul 2019 13:27:26 +0800 Subject: [PATCH 1234/1449] Fix #76885 - Add icons for Configure File Association (#76900) --- .../browser/parts/editor/editorStatus.ts | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/editorStatus.ts b/src/vs/workbench/browser/parts/editor/editorStatus.ts index 9fc2e6ca564..a79e4dc2c02 100644 --- a/src/vs/workbench/browser/parts/editor/editorStatus.ts +++ b/src/vs/workbench/browser/parts/editor/editorStatus.ts @@ -898,21 +898,9 @@ export class ChangeModeAction extends Action { description = nls.localize('languageDescriptionConfigured', "({0})", this.modeService.getModeIdForLanguageName(lang.toLowerCase())); } - // construct a fake resource to be able to show nice icons if any - let fakeResource: URI | undefined; - const extensions = this.modeService.getExtensions(lang); - if (extensions && extensions.length) { - fakeResource = URI.file(extensions[0]); - } else { - const filenames = this.modeService.getFilenames(lang); - if (filenames && filenames.length) { - fakeResource = URI.file(filenames[0]); - } - } - return { label: lang, - iconClasses: getIconClasses(this.modelService, this.modeService, fakeResource), + iconClasses: getIconClasses(this.modelService, this.modeService, this.getResource(lang)), description }; }); @@ -1011,6 +999,7 @@ export class ChangeModeAction extends Action { return { id, label: lang, + iconClasses: getIconClasses(this.modelService, this.modeService, this.getResource(lang)), description: (id === currentAssociation) ? nls.localize('currentAssociation', "Current Association") : undefined }; }); @@ -1041,6 +1030,21 @@ export class ChangeModeAction extends Action { } }, 50 /* quick open is sensitive to being opened so soon after another */); } + + private getResource(lang: string): URI | undefined { + // construct a fake resource to be able to show nice icons if any + let fakeResource: URI | undefined; + const extensions = this.modeService.getExtensions(lang); + if (extensions && extensions.length) { + fakeResource = URI.file(extensions[0]); + } else { + const filenames = this.modeService.getFilenames(lang); + if (filenames && filenames.length) { + fakeResource = URI.file(filenames[0]); + } + } + return fakeResource; + } } export interface IChangeEOLEntry extends IQuickPickItem { From c0989dff49b902711c7f7df6c0d687e94e25d950 Mon Sep 17 00:00:00 2001 From: Ryo Nishimura Date: Tue, 9 Jul 2019 14:33:12 +0900 Subject: [PATCH 1235/1449] Fix typo transitionDisposables (#76723) --- src/vs/workbench/browser/layout.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/browser/layout.ts b/src/vs/workbench/browser/layout.ts index b378f17f8e6..6b6fce275d2 100644 --- a/src/vs/workbench/browser/layout.ts +++ b/src/vs/workbench/browser/layout.ts @@ -157,7 +157,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi transitionedToCenteredEditorLayout: false, wasSideBarVisible: false, wasPanelVisible: false, - transitionDisposeables: new DisposableStore() + transitionDisposables: new DisposableStore() } }; @@ -567,7 +567,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi toggleZenMode(skipLayout?: boolean, restoring = false): void { this.state.zenMode.active = !this.state.zenMode.active; - this.state.zenMode.transitionDisposeables.clear(); + this.state.zenMode.transitionDisposables.clear(); const setLineNumbers = (lineNumbers: any) => this.editorService.visibleTextEditorWidgets.forEach(editor => editor.updateOptions({ lineNumbers })); @@ -606,11 +606,11 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi if (config.hideLineNumbers) { setLineNumbers('off'); - this.state.zenMode.transitionDisposeables.add(this.editorService.onDidVisibleEditorsChange(() => setLineNumbers('off'))); + this.state.zenMode.transitionDisposables.add(this.editorService.onDidVisibleEditorsChange(() => setLineNumbers('off'))); } if (config.hideTabs && this.editorGroupService.partOptions.showTabs) { - this.state.zenMode.transitionDisposeables.add(this.editorGroupService.enforcePartOptions({ showTabs: false })); + this.state.zenMode.transitionDisposables.add(this.editorGroupService.enforcePartOptions({ showTabs: false })); } if (config.centerLayout) { From 2ea7d60b2547bf23a52d41694d3ef243cfd5e3fb Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 9 Jul 2019 07:34:19 +0200 Subject: [PATCH 1236/1449] :lipstick: --- .../browser/parts/editor/editorControl.ts | 8 ++++---- .../browser/parts/editor/editorStatus.ts | 9 +++++---- .../browser/parts/editor/tabsTitleControl.ts | 10 +++++----- .../parts/notifications/notificationsToasts.ts | 16 ++++++++-------- .../parts/notifications/notificationsViewer.ts | 18 +++++++++--------- src/vs/workbench/electron-browser/main.ts | 1 - .../services/editor/browser/editorService.ts | 12 ++++++------ 7 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/editorControl.ts b/src/vs/workbench/browser/parts/editor/editorControl.ts index 646ecb46f2c..3db5b69060b 100644 --- a/src/vs/workbench/browser/parts/editor/editorControl.ts +++ b/src/vs/workbench/browser/parts/editor/editorControl.ts @@ -38,7 +38,7 @@ export class EditorControl extends Disposable { private _activeControl: BaseEditor | null; private controls: BaseEditor[] = []; - private readonly activeControlDisposeables = this._register(new DisposableStore()); + private readonly activeControlDisposables = this._register(new DisposableStore()); private dimension: Dimension; private editorOperation: LongRunningOperation; @@ -139,12 +139,12 @@ export class EditorControl extends Disposable { this._activeControl = control; // Clear out previous active control listeners - this.activeControlDisposeables.clear(); + this.activeControlDisposables.clear(); // Listen to control changes if (control) { - this.activeControlDisposeables.add(control.onDidSizeConstraintsChange(e => this._onDidSizeConstraintsChange.fire(e))); - this.activeControlDisposeables.add(control.onDidFocus(() => this._onDidFocus.fire())); + this.activeControlDisposables.add(control.onDidSizeConstraintsChange(e => this._onDidSizeConstraintsChange.fire(e))); + this.activeControlDisposables.add(control.onDidFocus(() => this._onDidFocus.fire())); } // Indicate that size constraints could have changed due to new editor diff --git a/src/vs/workbench/browser/parts/editor/editorStatus.ts b/src/vs/workbench/browser/parts/editor/editorStatus.ts index a79e4dc2c02..f57adac50c7 100644 --- a/src/vs/workbench/browser/parts/editor/editorStatus.ts +++ b/src/vs/workbench/browser/parts/editor/editorStatus.ts @@ -900,7 +900,7 @@ export class ChangeModeAction extends Action { return { label: lang, - iconClasses: getIconClasses(this.modelService, this.modeService, this.getResource(lang)), + iconClasses: getIconClasses(this.modelService, this.modeService, this.getFakeResource(lang)), description }; }); @@ -999,7 +999,7 @@ export class ChangeModeAction extends Action { return { id, label: lang, - iconClasses: getIconClasses(this.modelService, this.modeService, this.getResource(lang)), + iconClasses: getIconClasses(this.modelService, this.modeService, this.getFakeResource(lang)), description: (id === currentAssociation) ? nls.localize('currentAssociation', "Current Association") : undefined }; }); @@ -1031,9 +1031,9 @@ export class ChangeModeAction extends Action { }, 50 /* quick open is sensitive to being opened so soon after another */); } - private getResource(lang: string): URI | undefined { - // construct a fake resource to be able to show nice icons if any + private getFakeResource(lang: string): URI | undefined { let fakeResource: URI | undefined; + const extensions = this.modeService.getExtensions(lang); if (extensions && extensions.length) { fakeResource = URI.file(extensions[0]); @@ -1043,6 +1043,7 @@ export class ChangeModeAction extends Action { fakeResource = URI.file(filenames[0]); } } + return fakeResource; } } diff --git a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts index 8fa00b20595..7af89021113 100644 --- a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts +++ b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts @@ -61,7 +61,7 @@ export class TabsTitleControl extends TitleControl { private tabResourceLabels: ResourceLabels; private tabLabels: IEditorInputLabel[] = []; - private tabDisposeables: IDisposable[] = []; + private tabDisposables: IDisposable[] = []; private dimension: Dimension; private readonly layoutScheduled = this._register(new MutableDisposable()); @@ -301,7 +301,7 @@ export class TabsTitleControl extends TitleControl { (this.tabsContainer.lastChild as HTMLElement).remove(); // Remove associated tab label and widget - this.tabDisposeables.pop()!.dispose(); + this.tabDisposables.pop()!.dispose(); } // A removal of a label requires to recompute all labels @@ -315,7 +315,7 @@ export class TabsTitleControl extends TitleControl { else { clearNode(this.tabsContainer); - this.tabDisposeables = dispose(this.tabDisposeables); + this.tabDisposables = dispose(this.tabDisposables); this.tabResourceLabels.clear(); this.tabLabels = []; @@ -454,7 +454,7 @@ export class TabsTitleControl extends TitleControl { // Eventing const eventsDisposable = this.registerTabListeners(tabContainer, index); - this.tabDisposeables.push(combinedDisposable(eventsDisposable, tabActionBar, tabActionRunner, editorLabel)); + this.tabDisposables.push(combinedDisposable(eventsDisposable, tabActionBar, tabActionRunner, editorLabel)); return tabContainer; } @@ -1149,7 +1149,7 @@ export class TabsTitleControl extends TitleControl { dispose(): void { super.dispose(); - this.tabDisposeables = dispose(this.tabDisposeables); + this.tabDisposables = dispose(this.tabDisposables); } } diff --git a/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts b/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts index 26b7cebe885..f2db74fd89b 100644 --- a/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts +++ b/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts @@ -135,7 +135,7 @@ export class NotificationsToasts extends Themable { // Make Visible addClass(this.notificationsToastsContainer, 'visible'); - const itemDisposeables = new DisposableStore(); + const itemDisposables = new DisposableStore(); // Container const notificationToastContainer = document.createElement('div'); @@ -158,12 +158,12 @@ export class NotificationsToasts extends Themable { ariaLabel: localize('notificationsToast', "Notification Toast"), verticalScrollMode: ScrollbarVisibility.Hidden }); - itemDisposeables.add(notificationList); + itemDisposables.add(notificationList); - const toast: INotificationToast = { item, list: notificationList, container: notificationToastContainer, toast: notificationToast, toDispose: itemDisposeables }; + const toast: INotificationToast = { item, list: notificationList, container: notificationToastContainer, toast: notificationToast, toDispose: itemDisposables }; this.mapNotificationToToast.set(item, toast); - itemDisposeables.add(toDisposable(() => { + itemDisposables.add(toDisposable(() => { if (this.isVisible(toast)) { this.notificationsToastsContainer.removeChild(toast.container); } @@ -184,12 +184,12 @@ export class NotificationsToasts extends Themable { this.layoutContainer(maxDimensions.height); // Update when item height changes due to expansion - itemDisposeables.add(item.onDidExpansionChange(() => { + itemDisposables.add(item.onDidExpansionChange(() => { notificationList.updateNotificationsList(0, 1, [item]); })); // Update when item height potentially changes due to label changes - itemDisposeables.add(item.onDidLabelChange(e => { + itemDisposables.add(item.onDidLabelChange(e => { if (!item.expanded) { return; // dynamic height only applies to expanded notifications } @@ -205,7 +205,7 @@ export class NotificationsToasts extends Themable { }); // Automatically purge non-sticky notifications - this.purgeNotification(item, notificationToastContainer, notificationList, itemDisposeables); + this.purgeNotification(item, notificationToastContainer, notificationList, itemDisposables); // Theming this.updateStyles(); @@ -215,7 +215,7 @@ export class NotificationsToasts extends Themable { // Animate in addClass(notificationToast, 'notification-fade-in'); - itemDisposeables.add(addDisposableListener(notificationToast, 'transitionend', () => { + itemDisposables.add(addDisposableListener(notificationToast, 'transitionend', () => { removeClass(notificationToast, 'notification-fade-in'); addClass(notificationToast, 'notification-fade-in-done'); })); diff --git a/src/vs/workbench/browser/parts/notifications/notificationsViewer.ts b/src/vs/workbench/browser/parts/notifications/notificationsViewer.ts index 24a1c8ca822..1e52e099f54 100644 --- a/src/vs/workbench/browser/parts/notifications/notificationsViewer.ts +++ b/src/vs/workbench/browser/parts/notifications/notificationsViewer.ts @@ -288,7 +288,7 @@ export class NotificationTemplateRenderer extends Disposable { private static readonly SEVERITIES: Array<'info' | 'warning' | 'error'> = ['info', 'warning', 'error']; - private readonly inputDisposeables = this._register(new DisposableStore()); + private readonly inputDisposables = this._register(new DisposableStore()); constructor( private template: INotificationTemplateData, @@ -308,7 +308,7 @@ export class NotificationTemplateRenderer extends Disposable { } setInput(notification: INotificationViewItem): void { - this.inputDisposeables.clear(); + this.inputDisposables.clear(); this.render(notification); } @@ -317,7 +317,7 @@ export class NotificationTemplateRenderer extends Disposable { // Container toggleClass(this.template.container, 'expanded', notification.expanded); - this.inputDisposeables.add(addDisposableListener(this.template.container, EventType.MOUSE_UP, e => { + this.inputDisposables.add(addDisposableListener(this.template.container, EventType.MOUSE_UP, e => { if (e.button === 1 /* Middle Button */) { EventHelper.stop(e); @@ -344,7 +344,7 @@ export class NotificationTemplateRenderer extends Disposable { this.renderProgress(notification); // Label Change Events - this.inputDisposeables.add(notification.onDidLabelChange(event => { + this.inputDisposables.add(notification.onDidLabelChange(event => { switch (event.kind) { case NotificationViewItemLabelKind.SEVERITY: this.renderSeverity(notification); @@ -370,7 +370,7 @@ export class NotificationTemplateRenderer extends Disposable { clearNode(this.template.message); this.template.message.appendChild(NotificationMessageRenderer.render(notification.message, { callback: link => this.openerService.open(URI.parse(link)), - toDispose: this.inputDisposeables + toDispose: this.inputDisposables })); const messageOverflows = notification.canCollapse && !notification.expanded && this.template.message.scrollWidth > this.template.message.clientWidth; @@ -395,7 +395,7 @@ export class NotificationTemplateRenderer extends Disposable { if (isNonEmptyArray(notification.actions.secondary)) { const configureNotificationAction = this.instantiationService.createInstance(ConfigureNotificationAction, ConfigureNotificationAction.ID, ConfigureNotificationAction.LABEL, notification.actions.secondary); actions.push(configureNotificationAction); - this.inputDisposeables.add(configureNotificationAction); + this.inputDisposables.add(configureNotificationAction); } // Expand / Collapse @@ -441,7 +441,7 @@ export class NotificationTemplateRenderer extends Disposable { const action = notification.actions.primary![index]; button.label = action.label; - this.inputDisposeables.add(button.onDidClick(e => { + this.inputDisposables.add(button.onDidClick(e => { EventHelper.stop(e, true); // Run action @@ -453,10 +453,10 @@ export class NotificationTemplateRenderer extends Disposable { } })); - this.inputDisposeables.add(attachButtonStyler(button, this.themeService)); + this.inputDisposables.add(attachButtonStyler(button, this.themeService)); }); - this.inputDisposeables.add(buttonGroup); + this.inputDisposables.add(buttonGroup); } } diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index 82f0dc8930b..f8aaa15b064 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -210,7 +210,6 @@ class CodeRendererMain extends Disposable { fileService.registerProvider(Schemas.vscodeRemote, remoteFileSystemProvider); } - const payload = await this.resolveWorkspaceInitializationPayload(); const services = await Promise.all([ diff --git a/src/vs/workbench/services/editor/browser/editorService.ts b/src/vs/workbench/services/editor/browser/editorService.ts index 1aff720e6e3..3211d6adeb4 100644 --- a/src/vs/workbench/services/editor/browser/editorService.ts +++ b/src/vs/workbench/services/editor/browser/editorService.ts @@ -118,29 +118,29 @@ export class EditorService extends Disposable implements EditorServiceImpl { } private registerGroupListeners(group: IEditorGroupView): void { - const groupDisposeables = new DisposableStore(); + const groupDisposables = new DisposableStore(); - groupDisposeables.add(group.onDidGroupChange(e => { + groupDisposables.add(group.onDidGroupChange(e => { if (e.kind === GroupChangeKind.EDITOR_ACTIVE) { this.handleActiveEditorChange(group); this._onDidVisibleEditorsChange.fire(); } })); - groupDisposeables.add(group.onDidCloseEditor(event => { + groupDisposables.add(group.onDidCloseEditor(event => { this._onDidCloseEditor.fire(event); })); - groupDisposeables.add(group.onWillOpenEditor(event => { + groupDisposables.add(group.onWillOpenEditor(event => { this.onGroupWillOpenEditor(group, event); })); - groupDisposeables.add(group.onDidOpenEditorFail(editor => { + groupDisposables.add(group.onDidOpenEditorFail(editor => { this._onDidOpenEditorFail.fire({ editor, groupId: group.id }); })); Event.once(group.onWillDispose)(() => { - dispose(groupDisposeables); + dispose(groupDisposables); }); } From 3976e538f5fa81f4533a5cab1fa4bf1da72e288a Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 9 Jul 2019 08:02:47 +0200 Subject: [PATCH 1237/1449] remove swipeToNavigate (#57629) --- src/vs/code/electron-main/window.ts | 34 +------------------ .../telemetry/common/telemetryUtils.ts | 1 - .../browser/workbench.contribution.ts | 6 ---- src/vs/workbench/common/editor.ts | 1 - 4 files changed, 1 insertion(+), 41 deletions(-) diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index d031b8b673f..35007bcf2f5 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -13,7 +13,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { parseArgs } from 'vs/platform/environment/node/argv'; import product from 'vs/platform/product/node/product'; -import { IWindowSettings, MenuBarVisibility, IWindowConfiguration, ReadyState, IRunActionInWindowRequest, getTitleBarStyle } from 'vs/platform/windows/common/windows'; +import { IWindowSettings, MenuBarVisibility, IWindowConfiguration, ReadyState, getTitleBarStyle } from 'vs/platform/windows/common/windows'; import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; import { isLinux, isMacintosh, isWindows } from 'vs/base/common/platform'; import { ICodeWindow, IWindowState, WindowMode } from 'vs/platform/windows/electron-main/windows'; @@ -40,14 +40,6 @@ export const defaultWindowState = function (mode = WindowMode.Normal): IWindowSt }; }; -interface IWorkbenchEditorConfiguration { - workbench: { - editor: { - swipeToNavigate: boolean - } - }; -} - interface ITouchBarSegment extends Electron.SegmentedControlSegment { id: string; } @@ -460,30 +452,6 @@ export class CodeWindow extends Disposable implements ICodeWindow { this.currentMenuBarVisibility = newMenuBarVisibility; this.setMenuBarVisibility(newMenuBarVisibility); } - - // Swipe command support (macOS) - if (isMacintosh) { - const config = this.configurationService.getValue(); - if (config && config.workbench && config.workbench.editor && config.workbench.editor.swipeToNavigate) { - this.registerSwipeListener(); - } else { - this._win.removeAllListeners('swipe'); - } - } - } - - private registerSwipeListener() { - this._win.on('swipe', (event: Electron.Event, cmd: string) => { - if (!this.isReady) { - return; // window must be ready - } - - if (cmd === 'left') { - this.send('vscode:runAction', { id: 'workbench.action.openPreviousRecentlyUsedEditor', from: 'mouse' } as IRunActionInWindowRequest); - } else if (cmd === 'right') { - this.send('vscode:runAction', { id: 'workbench.action.openNextRecentlyUsedEditor', from: 'mouse' } as IRunActionInWindowRequest); - } - }); } addTabbedWindow(window: ICodeWindow): void { diff --git a/src/vs/platform/telemetry/common/telemetryUtils.ts b/src/vs/platform/telemetry/common/telemetryUtils.ts index ed1b6622f90..37b4f848681 100644 --- a/src/vs/platform/telemetry/common/telemetryUtils.ts +++ b/src/vs/platform/telemetry/common/telemetryUtils.ts @@ -185,7 +185,6 @@ const configurationValueWhitelist = [ 'workbench.editor.enablePreviewFromQuickOpen', 'workbench.editor.showTabs', 'workbench.editor.highlightModifiedTabs', - 'workbench.editor.swipeToNavigate', 'workbench.sideBar.location', 'workbench.startupEditor', 'workbench.statusBar.visible', diff --git a/src/vs/workbench/browser/workbench.contribution.ts b/src/vs/workbench/browser/workbench.contribution.ts index dc449eb18c5..664cc45a74e 100644 --- a/src/vs/workbench/browser/workbench.contribution.ts +++ b/src/vs/workbench/browser/workbench.contribution.ts @@ -107,12 +107,6 @@ import { isMacintosh, isWindows, isLinux, isWeb } from 'vs/base/common/platform' 'description': nls.localize('revealIfOpen', "Controls whether an editor is revealed in any of the visible groups if opened. If disabled, an editor will prefer to open in the currently active editor group. If enabled, an already opened editor will be revealed instead of opened again in the currently active editor group. Note that there are some cases where this setting is ignored, e.g. when forcing an editor to open in a specific group or to the side of the currently active group."), 'default': false }, - 'workbench.editor.swipeToNavigate': { - 'type': 'boolean', - 'description': nls.localize('swipeToNavigate', "Navigate between open files using three-finger swipe horizontally."), - 'default': false, - 'included': isMacintosh && !isWeb - }, 'workbench.editor.mouseBackForwardToNavigate': { 'type': 'boolean', 'description': nls.localize('mouseBackForwardToNavigate', "Navigate between open files using mouse buttons four and five if provided."), diff --git a/src/vs/workbench/common/editor.ts b/src/vs/workbench/common/editor.ts index 3286b47068e..93dacfeacde 100644 --- a/src/vs/workbench/common/editor.ts +++ b/src/vs/workbench/common/editor.ts @@ -986,7 +986,6 @@ interface IEditorPartConfiguration { openSideBySideDirection?: 'right' | 'down'; closeEmptyGroups?: boolean; revealIfOpen?: boolean; - swipeToNavigate?: boolean; mouseBackForwardToNavigate?: boolean; labelFormat?: 'default' | 'short' | 'medium' | 'long'; restoreViewState?: boolean; From 8d1ff2484905e0819d7cc52f54351b76953d54b5 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 9 Jul 2019 08:17:37 +0200 Subject: [PATCH 1238/1449] fix #76739 --- .../workbench/browser/parts/editor/editor.contribution.ts | 8 ++++---- .../browser/parts/editor/media/close-dark-alt.svg | 3 +++ .../browser/parts/editor/media/close-dirty-dark-alt.svg | 3 +++ .../browser/parts/editor/media/close-dirty-light-alt.svg | 3 +++ .../browser/parts/editor/media/close-light-alt.svg | 3 +++ 5 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 src/vs/workbench/browser/parts/editor/media/close-dark-alt.svg create mode 100644 src/vs/workbench/browser/parts/editor/media/close-dirty-dark-alt.svg create mode 100644 src/vs/workbench/browser/parts/editor/media/close-dirty-light-alt.svg create mode 100644 src/vs/workbench/browser/parts/editor/media/close-light-alt.svg diff --git a/src/vs/workbench/browser/parts/editor/editor.contribution.ts b/src/vs/workbench/browser/parts/editor/editor.contribution.ts index 9451b02835c..c10e7979ba0 100644 --- a/src/vs/workbench/browser/parts/editor/editor.contribution.ts +++ b/src/vs/workbench/browser/parts/editor/editor.contribution.ts @@ -516,8 +516,8 @@ appendEditorToolItem( { id: editorCommands.CLOSE_EDITOR_COMMAND_ID, title: nls.localize('close', "Close"), - iconDark: 'close-dark.svg', - iconLight: 'close-light.svg' + iconDark: 'close-dark-alt.svg', + iconLight: 'close-light-alt.svg' }, ContextKeyExpr.and(ContextKeyExpr.not('config.workbench.editor.showTabs'), ContextKeyExpr.not('groupActiveEditorDirty')), 1000000, // towards the far end @@ -533,8 +533,8 @@ appendEditorToolItem( { id: editorCommands.CLOSE_EDITOR_COMMAND_ID, title: nls.localize('close', "Close"), - iconDark: 'close-dark.svg', - iconLight: 'close-light.svg' + iconDark: 'close-dirty-dark-alt.svg', + iconLight: 'close-dirty-light-alt.svg' }, ContextKeyExpr.and(ContextKeyExpr.not('config.workbench.editor.showTabs'), ContextKeyExpr.has('groupActiveEditorDirty')), 1000000, // towards the far end diff --git a/src/vs/workbench/browser/parts/editor/media/close-dark-alt.svg b/src/vs/workbench/browser/parts/editor/media/close-dark-alt.svg new file mode 100644 index 00000000000..44ece771f45 --- /dev/null +++ b/src/vs/workbench/browser/parts/editor/media/close-dark-alt.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/editor/media/close-dirty-dark-alt.svg b/src/vs/workbench/browser/parts/editor/media/close-dirty-dark-alt.svg new file mode 100644 index 00000000000..51946be5bb7 --- /dev/null +++ b/src/vs/workbench/browser/parts/editor/media/close-dirty-dark-alt.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/editor/media/close-dirty-light-alt.svg b/src/vs/workbench/browser/parts/editor/media/close-dirty-light-alt.svg new file mode 100644 index 00000000000..fb91225b968 --- /dev/null +++ b/src/vs/workbench/browser/parts/editor/media/close-dirty-light-alt.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/browser/parts/editor/media/close-light-alt.svg b/src/vs/workbench/browser/parts/editor/media/close-light-alt.svg new file mode 100644 index 00000000000..742fcae4ae7 --- /dev/null +++ b/src/vs/workbench/browser/parts/editor/media/close-light-alt.svg @@ -0,0 +1,3 @@ + + + From 232918877696427bc943d0cb0f9054dc58ff17aa Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 8 Jul 2019 12:21:51 +0200 Subject: [PATCH 1239/1449] Extract TMGrammarFactory --- .../browser/abstractTextMateService.ts | 515 +++++++++++------- .../textMate/browser/textMateService.ts | 6 +- .../textMate/common/TMScopeRegistry.ts | 97 +--- .../electron-browser/textMateService.ts | 5 + 4 files changed, 341 insertions(+), 282 deletions(-) diff --git a/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts b/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts index 065ece1282e..259b53bf167 100644 --- a/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts +++ b/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts @@ -12,7 +12,7 @@ import * as resources from 'vs/base/common/resources'; import * as types from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import { TokenizationResult, TokenizationResult2 } from 'vs/editor/common/core/token'; -import { IState, ITokenizationSupport, LanguageId, TokenMetadata, TokenizationRegistry } from 'vs/editor/common/modes'; +import { IState, ITokenizationSupport, LanguageId, TokenMetadata, TokenizationRegistry, StandardTokenType, LanguageIdentifier } from 'vs/editor/common/modes'; import { nullTokenize2 } from 'vs/editor/common/modes/nullMode'; import { generateTokensCSSForColorMap } from 'vs/editor/common/modes/supports/tokenization'; import { IModeService } from 'vs/editor/common/services/modeService'; @@ -20,20 +20,13 @@ import { IFileService } from 'vs/platform/files/common/files'; import { ILogService } from 'vs/platform/log/common/log'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { ExtensionMessageCollector } from 'vs/workbench/services/extensions/common/extensionsRegistry'; -import { IEmbeddedLanguagesMap, ITMSyntaxExtensionPoint, grammarsExtPoint } from 'vs/workbench/services/textMate/common/TMGrammars'; +import { ITMSyntaxExtensionPoint, grammarsExtPoint } from 'vs/workbench/services/textMate/common/TMGrammars'; import { ITextMateService } from 'vs/workbench/services/textMate/common/textMateService'; -import { ITokenColorizationRule, IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; -import { IEmbeddedLanguagesMap as IEmbeddedLanguagesMap2, IGrammar, Registry, StackElement, RegistryOptions, IRawGrammar } from 'vscode-textmate'; +import { ITokenColorizationRule, IWorkbenchThemeService, IColorTheme } from 'vs/workbench/services/themes/common/workbenchThemeService'; +import { IGrammar, Registry, StackElement, IRawTheme, IOnigLib } from 'vscode-textmate'; import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { TMScopeRegistry } from 'vs/workbench/services/textMate/common/TMScopeRegistry'; - -interface ICreateGrammarResult { - languageId: LanguageId; - grammar: IGrammar; - initialState: StackElement; - containsEmbeddedLanguages: boolean; -} +import { TMScopeRegistry, IValidGrammarDefinition, IValidEmbeddedLanguagesMap, IValidTokenTypeMap } from 'vs/workbench/services/textMate/common/TMScopeRegistry'; export abstract class AbstractTextMateService extends Disposable implements ITextMateService { public _serviceBrand: any; @@ -43,16 +36,12 @@ export abstract class AbstractTextMateService extends Disposable implements ITex private readonly _styleElement: HTMLStyleElement; private readonly _createdModes: string[]; + private readonly _encounteredLanguages: boolean[]; - protected _scopeRegistry: TMScopeRegistry; - private _encounteredLanguages: boolean[]; - private _injections: { [scopeName: string]: string[]; }; - private _injectedEmbeddedLanguages: { [scopeName: string]: IEmbeddedLanguagesMap[]; }; - protected _languageToScope: Map; - private _grammarRegistry: Promise<[Registry, StackElement]> | null; + private _grammarDefinitions: IValidGrammarDefinition[] | null; + private _grammarFactory: TMGrammarFactory | null; private _tokenizersRegistrations: IDisposable[]; private _currentTokenColors: ITokenColorizationRule[] | null; - private _themeListener: IDisposable | null; constructor( @IModeService private readonly _modeService: IModeService, @@ -66,33 +55,78 @@ export abstract class AbstractTextMateService extends Disposable implements ITex this._styleElement = dom.createStyleSheet(); this._styleElement.className = 'vscode-tokens-styles'; this._createdModes = []; - this._scopeRegistry = new TMScopeRegistry(); this._encounteredLanguages = []; - this._injections = {}; - this._injectedEmbeddedLanguages = {}; - this._languageToScope = new Map(); - this._grammarRegistry = null; + + this._grammarDefinitions = null; + this._grammarFactory = null; this._tokenizersRegistrations = []; - this._currentTokenColors = null; - this._themeListener = null; grammarsExtPoint.setHandler((extensions) => { - this._scopeRegistry.reset(); - this._injections = {}; - this._injectedEmbeddedLanguages = {}; - this._languageToScope = new Map(); - this._grammarRegistry = null; - this._tokenizersRegistrations = dispose(this._tokenizersRegistrations); - this._currentTokenColors = null; - if (this._themeListener) { - this._themeListener.dispose(); - this._themeListener = null; + this._grammarDefinitions = null; + if (this._grammarFactory) { + this._grammarFactory.dispose(); + this._grammarFactory = null; } + this._tokenizersRegistrations = dispose(this._tokenizersRegistrations); + this._grammarDefinitions = []; for (const extension of extensions) { - let grammars = extension.value; + const grammars = extension.value; for (const grammar of grammars) { - this._handleGrammarExtensionPointUser(extension.description.extensionLocation, grammar, extension.collector); + if (!this._validateGrammarExtensionPoint(extension.description.extensionLocation, grammar, extension.collector)) { + continue; + } + const grammarLocation = resources.joinPath(extension.description.extensionLocation, grammar.path); + + const embeddedLanguages: IValidEmbeddedLanguagesMap = Object.create(null); + if (grammar.embeddedLanguages) { + let scopes = Object.keys(grammar.embeddedLanguages); + for (let i = 0, len = scopes.length; i < len; i++) { + let scope = scopes[i]; + let language = grammar.embeddedLanguages[scope]; + if (typeof language !== 'string') { + // never hurts to be too careful + continue; + } + let languageIdentifier = this._modeService.getLanguageIdentifier(language); + if (languageIdentifier) { + embeddedLanguages[scope] = languageIdentifier.id; + } + } + } + + const tokenTypes: IValidTokenTypeMap = Object.create(null); + if (grammar.tokenTypes) { + const scopes = Object.keys(grammar.tokenTypes); + for (const scope of scopes) { + const tokenType = grammar.tokenTypes[scope]; + switch (tokenType) { + case 'string': + tokenTypes[scope] = StandardTokenType.String; + break; + case 'other': + tokenTypes[scope] = StandardTokenType.Other; + break; + case 'comment': + tokenTypes[scope] = StandardTokenType.Comment; + break; + } + } + } + + let languageIdentifier: LanguageIdentifier | null = null; + if (grammar.language) { + languageIdentifier = this._modeService.getLanguageIdentifier(grammar.language); + } + + this._grammarDefinitions.push({ + location: grammarLocation, + language: languageIdentifier ? languageIdentifier.id : undefined, + scopeName: grammar.scopeName, + embeddedLanguages: embeddedLanguages, + tokenTypes: tokenTypes, + injectTo: grammar.injectTo, + }); } } @@ -101,6 +135,12 @@ export abstract class AbstractTextMateService extends Disposable implements ITex } }); + this._register(this._themeService.onDidColorThemeChange(() => { + if (this._grammarFactory) { + this._updateTheme(this._grammarFactory, this._themeService.getColorTheme(), false); + } + })); + // Generate some color map until the grammar registry is loaded let colorTheme = this._themeService.getColorTheme(); let defaultForeground: Color = Color.transparent; @@ -125,38 +165,202 @@ export abstract class AbstractTextMateService extends Disposable implements ITex }); } - private _registerDefinitionIfAvailable(modeId: string): void { - if (this._languageToScope.has(modeId)) { - const promise = this._createGrammar(modeId).then((r) => { - const tokenization = new TMTokenization(r.grammar, r.initialState, r.containsEmbeddedLanguages); - tokenization.onDidEncounterLanguage((languageId) => { - if (!this._encounteredLanguages[languageId]) { - this._encounteredLanguages[languageId] = true; - this._onDidEncounterLanguage.fire(languageId); - } + private _canCreateGrammarFactory(): boolean { + // Check if extension point is ready + return (this._grammarDefinitions ? true : false); + } + + private async _getOrCreateGrammarFactory(): Promise { + if (this._grammarFactory) { + return this._grammarFactory; + } + + const vscodeTextmate = await this._loadVSCodeTextmate(); + + // Avoid duplicate instantiations + if (this._grammarFactory) { + return this._grammarFactory; + } + + this._grammarFactory = new TMGrammarFactory({ + logTrace: (msg: string) => this._logService.trace(msg), + logError: (msg: string, err: any) => this._logService.error(msg, err), + readFile: async (resource: URI) => { + const content = await this._fileService.readFile(resource); + return content.value.toString(); + } + }, this._grammarDefinitions || [], vscodeTextmate, this._loadOnigLib()); + + this._updateTheme(this._grammarFactory, this._themeService.getColorTheme(), true); + + return this._grammarFactory; + } + + private async _registerDefinitionIfAvailable(modeId: string): Promise { + const languageIdentifier = this._modeService.getLanguageIdentifier(modeId); + if (!languageIdentifier) { + return; + } + const languageId = languageIdentifier.id; + try { + if (!this._canCreateGrammarFactory()) { + return; + } + const grammarFactory = await this._getOrCreateGrammarFactory(); + if (grammarFactory.has(languageId)) { + const promise = grammarFactory.createGrammar(languageId).then((r) => { + const tokenization = new TMTokenization(r.grammar, r.initialState, r.containsEmbeddedLanguages); + tokenization.onDidEncounterLanguage((languageId) => { + if (!this._encounteredLanguages[languageId]) { + this._encounteredLanguages[languageId] = true; + this._onDidEncounterLanguage.fire(languageId); + } + }); + return new TMTokenizationSupport(r.languageId, tokenization, this._notificationService, this._configurationService); + }, e => { + onUnexpectedError(e); + return null; }); - return new TMTokenizationSupport(r.languageId, tokenization, this._notificationService, this._configurationService); - }, e => { - onUnexpectedError(e); - return null; - }); - this._tokenizersRegistrations.push(TokenizationRegistry.registerPromise(modeId, promise)); + this._tokenizersRegistrations.push(TokenizationRegistry.registerPromise(modeId, promise)); + } + } catch (err) { + onUnexpectedError(err); } } - protected _getRegistryOptions(parseRawGrammar: (content: string, filePath: string) => IRawGrammar): RegistryOptions { - return { + private static _toColorMap(colorMap: string[]): Color[] { + let result: Color[] = [null!]; + for (let i = 1, len = colorMap.length; i < len; i++) { + result[i] = Color.fromHex(colorMap[i]); + } + return result; + } + + private _updateTheme(grammarFactory: TMGrammarFactory, colorTheme: IColorTheme, forceUpdate: boolean): void { + if (!forceUpdate && AbstractTextMateService.equalsTokenRules(this._currentTokenColors, colorTheme.tokenColors)) { + return; + } + this._currentTokenColors = colorTheme.tokenColors; + + grammarFactory.setTheme({ name: colorTheme.label, settings: colorTheme.tokenColors }); + let colorMap = AbstractTextMateService._toColorMap(grammarFactory.getColorMap()); + let cssRules = generateTokensCSSForColorMap(colorMap); + this._styleElement.innerHTML = cssRules; + TokenizationRegistry.setColorMap(colorMap); + } + + private static equalsTokenRules(a: ITokenColorizationRule[] | null, b: ITokenColorizationRule[] | null): boolean { + if (!b || !a || b.length !== a.length) { + return false; + } + for (let i = b.length - 1; i >= 0; i--) { + let r1 = b[i]; + let r2 = a[i]; + if (r1.scope !== r2.scope) { + return false; + } + let s1 = r1.settings; + let s2 = r2.settings; + if (s1 && s2) { + if (s1.fontStyle !== s2.fontStyle || s1.foreground !== s2.foreground || s1.background !== s2.background) { + return false; + } + } else if (!s1 || !s2) { + return false; + } + } + return true; + } + + private _validateGrammarExtensionPoint(extensionLocation: URI, syntax: ITMSyntaxExtensionPoint, collector: ExtensionMessageCollector): boolean { + if (syntax.language && ((typeof syntax.language !== 'string') || !this._modeService.isRegisteredMode(syntax.language))) { + collector.error(nls.localize('invalid.language', "Unknown language in `contributes.{0}.language`. Provided value: {1}", grammarsExtPoint.name, String(syntax.language))); + return false; + } + if (!syntax.scopeName || (typeof syntax.scopeName !== 'string')) { + collector.error(nls.localize('invalid.scopeName', "Expected string in `contributes.{0}.scopeName`. Provided value: {1}", grammarsExtPoint.name, String(syntax.scopeName))); + return false; + } + if (!syntax.path || (typeof syntax.path !== 'string')) { + collector.error(nls.localize('invalid.path.0', "Expected string in `contributes.{0}.path`. Provided value: {1}", grammarsExtPoint.name, String(syntax.path))); + return false; + } + if (syntax.injectTo && (!Array.isArray(syntax.injectTo) || syntax.injectTo.some(scope => typeof scope !== 'string'))) { + collector.error(nls.localize('invalid.injectTo', "Invalid value in `contributes.{0}.injectTo`. Must be an array of language scope names. Provided value: {1}", grammarsExtPoint.name, JSON.stringify(syntax.injectTo))); + return false; + } + if (syntax.embeddedLanguages && !types.isObject(syntax.embeddedLanguages)) { + collector.error(nls.localize('invalid.embeddedLanguages', "Invalid value in `contributes.{0}.embeddedLanguages`. Must be an object map from scope name to language. Provided value: {1}", grammarsExtPoint.name, JSON.stringify(syntax.embeddedLanguages))); + return false; + } + + if (syntax.tokenTypes && !types.isObject(syntax.tokenTypes)) { + collector.error(nls.localize('invalid.tokenTypes', "Invalid value in `contributes.{0}.tokenTypes`. Must be an object map from scope name to token type. Provided value: {1}", grammarsExtPoint.name, JSON.stringify(syntax.tokenTypes))); + return false; + } + + const grammarLocation = resources.joinPath(extensionLocation, syntax.path); + if (!resources.isEqualOrParent(grammarLocation, extensionLocation)) { + collector.warn(nls.localize('invalid.path.1', "Expected `contributes.{0}.path` ({1}) to be included inside extension's folder ({2}). This might make the extension non-portable.", grammarsExtPoint.name, grammarLocation.path, extensionLocation.path)); + } + return true; + } + + public async createGrammar(modeId: string): Promise { + const grammarFactory = await this._getOrCreateGrammarFactory(); + const { grammar } = await grammarFactory.createGrammar(this._modeService.getLanguageIdentifier(modeId)!.id); + return grammar; + } + + protected abstract _loadVSCodeTextmate(): Promise; + protected abstract _loadOnigLib(): Promise | undefined; +} + +interface ITMGrammarFactoryHost { + logTrace(msg: string): void; + logError(msg: string, err: any): void; + readFile(resource: URI): Promise; +} + +interface ICreateGrammarResult { + languageId: LanguageId; + grammar: IGrammar; + initialState: StackElement; + containsEmbeddedLanguages: boolean; +} + +class TMGrammarFactory extends Disposable { + + private readonly _host: ITMGrammarFactoryHost; + private readonly _initialState: StackElement; + private readonly _scopeRegistry: TMScopeRegistry; + private readonly _injections: { [scopeName: string]: string[]; }; + private readonly _injectedEmbeddedLanguages: { [scopeName: string]: IValidEmbeddedLanguagesMap[]; }; + private readonly _languageToScope2: string[]; + private readonly _grammarRegistry: Registry; + + constructor(host: ITMGrammarFactoryHost, grammarDefinitions: IValidGrammarDefinition[], vscodeTextmate: typeof import('vscode-textmate'), onigLib?: Promise) { + super(); + this._host = host; + this._initialState = vscodeTextmate.INITIAL; + this._scopeRegistry = this._register(new TMScopeRegistry()); + this._injections = {}; + this._injectedEmbeddedLanguages = {}; + this._languageToScope2 = []; + this._grammarRegistry = new vscodeTextmate.Registry({ + getOnigLib: (typeof onigLib === 'undefined' ? undefined : () => onigLib), loadGrammar: async (scopeName: string) => { - const location = this._scopeRegistry.getGrammarLocation(scopeName); - if (!location) { - this._logService.trace(`No grammar found for scope ${scopeName}`); + const grammarDefinition = this._scopeRegistry.getGrammarDefinition(scopeName); + if (!grammarDefinition) { + this._host.logTrace(`No grammar found for scope ${scopeName}`); return null; } + const location = grammarDefinition.location; try { - const content = await this._fileService.readFile(location); - return parseRawGrammar(content.value.toString(), location.path); + const content = await this._host.readFile(location); + return vscodeTextmate.parseRawGrammar(content, location.path); } catch (e) { - this._logService.error(`Unable to load and parse grammar for scope ${scopeName} from ${location}`, e); + this._host.logError(`Unable to load and parse grammar for scope ${scopeName} from ${location}`, e); return null; } }, @@ -169,163 +373,65 @@ export abstract class AbstractTextMateService extends Disposable implements ITex } return injections; } - }; - } + }); - private async _createGrammarRegistry(): Promise<[Registry, StackElement]> { - const { Registry, INITIAL, parseRawGrammar } = await this._loadVSCodeTextmate(); - const grammarRegistry = new Registry(this._getRegistryOptions(parseRawGrammar)); - this._updateTheme(grammarRegistry); - this._themeListener = this._themeService.onDidColorThemeChange((e) => this._updateTheme(grammarRegistry)); - return <[Registry, StackElement]>[grammarRegistry, INITIAL]; - } + for (const validGrammar of grammarDefinitions) { + this._scopeRegistry.register(validGrammar); - private _getOrCreateGrammarRegistry(): Promise<[Registry, StackElement]> { - if (!this._grammarRegistry) { - this._grammarRegistry = this._createGrammarRegistry(); - } - return this._grammarRegistry; - } - - private static _toColorMap(colorMap: string[]): Color[] { - let result: Color[] = [null!]; - for (let i = 1, len = colorMap.length; i < len; i++) { - result[i] = Color.fromHex(colorMap[i]); - } - return result; - } - - private _updateTheme(grammarRegistry: Registry): void { - let colorTheme = this._themeService.getColorTheme(); - if (!this.compareTokenRules(colorTheme.tokenColors)) { - return; - } - grammarRegistry.setTheme({ name: colorTheme.label, settings: colorTheme.tokenColors }); - let colorMap = AbstractTextMateService._toColorMap(grammarRegistry.getColorMap()); - let cssRules = generateTokensCSSForColorMap(colorMap); - this._styleElement.innerHTML = cssRules; - TokenizationRegistry.setColorMap(colorMap); - } - - private compareTokenRules(newRules: ITokenColorizationRule[]): boolean { - let currRules = this._currentTokenColors; - this._currentTokenColors = newRules; - if (!newRules || !currRules || newRules.length !== currRules.length) { - return true; - } - for (let i = newRules.length - 1; i >= 0; i--) { - let r1 = newRules[i]; - let r2 = currRules[i]; - if (r1.scope !== r2.scope) { - return true; - } - let s1 = r1.settings; - let s2 = r2.settings; - if (s1 && s2) { - if (s1.fontStyle !== s2.fontStyle || s1.foreground !== s2.foreground || s1.background !== s2.background) { - return true; - } - } else if (!s1 || !s2) { - return true; - } - } - return false; - } - - private _handleGrammarExtensionPointUser(extensionLocation: URI, syntax: ITMSyntaxExtensionPoint, collector: ExtensionMessageCollector): void { - if (syntax.language && ((typeof syntax.language !== 'string') || !this._modeService.isRegisteredMode(syntax.language))) { - collector.error(nls.localize('invalid.language', "Unknown language in `contributes.{0}.language`. Provided value: {1}", grammarsExtPoint.name, String(syntax.language))); - return; - } - if (!syntax.scopeName || (typeof syntax.scopeName !== 'string')) { - collector.error(nls.localize('invalid.scopeName', "Expected string in `contributes.{0}.scopeName`. Provided value: {1}", grammarsExtPoint.name, String(syntax.scopeName))); - return; - } - if (!syntax.path || (typeof syntax.path !== 'string')) { - collector.error(nls.localize('invalid.path.0', "Expected string in `contributes.{0}.path`. Provided value: {1}", grammarsExtPoint.name, String(syntax.path))); - return; - } - if (syntax.injectTo && (!Array.isArray(syntax.injectTo) || syntax.injectTo.some(scope => typeof scope !== 'string'))) { - collector.error(nls.localize('invalid.injectTo', "Invalid value in `contributes.{0}.injectTo`. Must be an array of language scope names. Provided value: {1}", grammarsExtPoint.name, JSON.stringify(syntax.injectTo))); - return; - } - if (syntax.embeddedLanguages && !types.isObject(syntax.embeddedLanguages)) { - collector.error(nls.localize('invalid.embeddedLanguages', "Invalid value in `contributes.{0}.embeddedLanguages`. Must be an object map from scope name to language. Provided value: {1}", grammarsExtPoint.name, JSON.stringify(syntax.embeddedLanguages))); - return; - } - - if (syntax.tokenTypes && !types.isObject(syntax.tokenTypes)) { - collector.error(nls.localize('invalid.tokenTypes', "Invalid value in `contributes.{0}.tokenTypes`. Must be an object map from scope name to token type. Provided value: {1}", grammarsExtPoint.name, JSON.stringify(syntax.tokenTypes))); - return; - } - - const grammarLocation = resources.joinPath(extensionLocation, syntax.path); - if (!resources.isEqualOrParent(grammarLocation, extensionLocation)) { - collector.warn(nls.localize('invalid.path.1', "Expected `contributes.{0}.path` ({1}) to be included inside extension's folder ({2}). This might make the extension non-portable.", grammarsExtPoint.name, grammarLocation.path, extensionLocation.path)); - } - - this._scopeRegistry.register(syntax.scopeName, grammarLocation, syntax.embeddedLanguages, syntax.tokenTypes); - - if (syntax.injectTo) { - for (let injectScope of syntax.injectTo) { - let injections = this._injections[injectScope]; - if (!injections) { - this._injections[injectScope] = injections = []; - } - injections.push(syntax.scopeName); - } - - if (syntax.embeddedLanguages) { - for (let injectScope of syntax.injectTo) { - let injectedEmbeddedLanguages = this._injectedEmbeddedLanguages[injectScope]; - if (!injectedEmbeddedLanguages) { - this._injectedEmbeddedLanguages[injectScope] = injectedEmbeddedLanguages = []; + if (validGrammar.injectTo) { + for (let injectScope of validGrammar.injectTo) { + let injections = this._injections[injectScope]; + if (!injections) { + this._injections[injectScope] = injections = []; + } + injections.push(validGrammar.scopeName); + } + + if (validGrammar.embeddedLanguages) { + for (let injectScope of validGrammar.injectTo) { + let injectedEmbeddedLanguages = this._injectedEmbeddedLanguages[injectScope]; + if (!injectedEmbeddedLanguages) { + this._injectedEmbeddedLanguages[injectScope] = injectedEmbeddedLanguages = []; + } + injectedEmbeddedLanguages.push(validGrammar.embeddedLanguages); } - injectedEmbeddedLanguages.push(syntax.embeddedLanguages); } } - } - let modeId = syntax.language; - if (modeId) { - this._languageToScope.set(modeId, syntax.scopeName); - } - } - - private _resolveEmbeddedLanguages(embeddedLanguages: IEmbeddedLanguagesMap): IEmbeddedLanguagesMap2 { - let scopes = Object.keys(embeddedLanguages); - let result: IEmbeddedLanguagesMap2 = Object.create(null); - for (let i = 0, len = scopes.length; i < len; i++) { - let scope = scopes[i]; - let language = embeddedLanguages[scope]; - let languageIdentifier = this._modeService.getLanguageIdentifier(language); - if (languageIdentifier) { - result[scope] = languageIdentifier.id; + if (validGrammar.language) { + this._languageToScope2[validGrammar.language] = validGrammar.scopeName; } } - return result; } - public async createGrammar(modeId: string): Promise { - const { grammar } = await this._createGrammar(modeId); - return grammar; + public has(languageId: LanguageId): boolean { + return this._languageToScope2[languageId] ? true : false; } - private async _createGrammar(modeId: string): Promise { - const scopeName = this._languageToScope.get(modeId); + public setTheme(theme: IRawTheme): void { + this._grammarRegistry.setTheme(theme); + } + + public getColorMap(): string[] { + return this._grammarRegistry.getColorMap(); + } + + public async createGrammar(languageId: LanguageId): Promise { + const scopeName = this._languageToScope2[languageId]; if (typeof scopeName !== 'string') { // No TM grammar defined return Promise.reject(new Error(nls.localize('no-tm-grammar', "No TM Grammar registered for this language."))); } - const languageRegistration = this._scopeRegistry.getLanguageRegistration(scopeName); - if (!languageRegistration) { + + const grammarDefinition = this._scopeRegistry.getGrammarDefinition(scopeName); + if (!grammarDefinition) { // No TM grammar defined return Promise.reject(new Error(nls.localize('no-tm-grammar', "No TM Grammar registered for this language."))); } - let embeddedLanguages = this._resolveEmbeddedLanguages(languageRegistration.embeddedLanguages); - let rawInjectedEmbeddedLanguages = this._injectedEmbeddedLanguages[scopeName]; - if (rawInjectedEmbeddedLanguages) { - let injectedEmbeddedLanguages: IEmbeddedLanguagesMap2[] = rawInjectedEmbeddedLanguages.map(this._resolveEmbeddedLanguages.bind(this)); + + let embeddedLanguages = grammarDefinition.embeddedLanguages; + if (this._injectedEmbeddedLanguages[scopeName]) { + const injectedEmbeddedLanguages = this._injectedEmbeddedLanguages[scopeName]; for (const injected of injectedEmbeddedLanguages) { for (const scope of Object.keys(injected)) { embeddedLanguages[scope] = injected[scope]; @@ -333,20 +439,17 @@ export abstract class AbstractTextMateService extends Disposable implements ITex } } - let languageId = this._modeService.getLanguageIdentifier(modeId)!.id; - let containsEmbeddedLanguages = (Object.keys(embeddedLanguages).length > 0); + const containsEmbeddedLanguages = (Object.keys(embeddedLanguages).length > 0); + + const grammar = await this._grammarRegistry.loadGrammarWithConfiguration(scopeName, languageId, { embeddedLanguages, tokenTypes: grammarDefinition.tokenTypes }); - const [grammarRegistry, initialState] = await this._getOrCreateGrammarRegistry(); - const grammar = await grammarRegistry.loadGrammarWithConfiguration(scopeName, languageId, { embeddedLanguages, tokenTypes: languageRegistration.tokenTypes }); return { languageId: languageId, grammar: grammar, - initialState: initialState, + initialState: this._initialState, containsEmbeddedLanguages: containsEmbeddedLanguages }; } - - protected abstract _loadVSCodeTextmate(): Promise; } class TMTokenizationSupport implements ITokenizationSupport { diff --git a/src/vs/workbench/services/textMate/browser/textMateService.ts b/src/vs/workbench/services/textMate/browser/textMateService.ts index c126bf74d25..0e95d04a847 100644 --- a/src/vs/workbench/services/textMate/browser/textMateService.ts +++ b/src/vs/workbench/services/textMate/browser/textMateService.ts @@ -32,10 +32,8 @@ export class TextMateService extends AbstractTextMateService { return import('vscode-textmate'); } - protected _getRegistryOptions(parseRawGrammar: (content: string, filePath: string) => vscodeTextmate.IRawGrammar): vscodeTextmate.RegistryOptions { - const result = super._getRegistryOptions(parseRawGrammar); - result.getOnigLib = () => loadOnigasm(); - return result; + protected _loadOnigLib(): Promise | undefined { + return loadOnigasm(); } } diff --git a/src/vs/workbench/services/textMate/common/TMScopeRegistry.ts b/src/vs/workbench/services/textMate/common/TMScopeRegistry.ts index c9e1ee58a1a..4c352da67a4 100644 --- a/src/vs/workbench/services/textMate/common/TMScopeRegistry.ts +++ b/src/vs/workbench/services/textMate/common/TMScopeRegistry.ts @@ -5,20 +5,29 @@ import * as resources from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; -import { IEmbeddedLanguagesMap, TokenTypesContribution } from 'vs/workbench/services/textMate/common/TMGrammars'; import { Disposable } from 'vs/base/common/lifecycle'; -import { StandardTokenType } from 'vs/editor/common/modes'; +import { StandardTokenType, LanguageId } from 'vs/editor/common/modes'; -/** - * A map from selectors to token types. - */ -export interface ITokenTypeMap { +export interface IValidGrammarDefinition { + location: URI; + language?: LanguageId; + scopeName: string; + embeddedLanguages: IValidEmbeddedLanguagesMap; + tokenTypes: IValidTokenTypeMap; + injectTo?: string[]; +} + +export interface IValidTokenTypeMap { [selector: string]: StandardTokenType; } +export interface IValidEmbeddedLanguagesMap { + [scopeName: string]: LanguageId; +} + export class TMScopeRegistry extends Disposable { - private _scopeNameToLanguageRegistration: { [scopeName: string]: TMLanguageRegistration; }; + private _scopeNameToLanguageRegistration: { [scopeName: string]: IValidGrammarDefinition; }; constructor() { super(); @@ -29,77 +38,21 @@ export class TMScopeRegistry extends Disposable { this._scopeNameToLanguageRegistration = Object.create(null); } - public register(scopeName: string, grammarLocation: URI, embeddedLanguages?: IEmbeddedLanguagesMap, tokenTypes?: TokenTypesContribution): void { - if (this._scopeNameToLanguageRegistration[scopeName]) { - const existingRegistration = this._scopeNameToLanguageRegistration[scopeName]; - if (!resources.isEqual(existingRegistration.grammarLocation, grammarLocation)) { + public register(def: IValidGrammarDefinition): void { + if (this._scopeNameToLanguageRegistration[def.scopeName]) { + const existingRegistration = this._scopeNameToLanguageRegistration[def.scopeName]; + if (!resources.isEqual(existingRegistration.location, def.location)) { console.warn( - `Overwriting grammar scope name to file mapping for scope ${scopeName}.\n` + - `Old grammar file: ${existingRegistration.grammarLocation.toString()}.\n` + - `New grammar file: ${grammarLocation.toString()}` + `Overwriting grammar scope name to file mapping for scope ${def.scopeName}.\n` + + `Old grammar file: ${existingRegistration.location.toString()}.\n` + + `New grammar file: ${def.location.toString()}` ); } } - this._scopeNameToLanguageRegistration[scopeName] = new TMLanguageRegistration(scopeName, grammarLocation, embeddedLanguages, tokenTypes); + this._scopeNameToLanguageRegistration[def.scopeName] = def; } - public getLanguageRegistration(scopeName: string): TMLanguageRegistration { + public getGrammarDefinition(scopeName: string): IValidGrammarDefinition | null { return this._scopeNameToLanguageRegistration[scopeName] || null; } - - public getGrammarLocation(scopeName: string): URI | null { - let data = this.getLanguageRegistration(scopeName); - return data ? data.grammarLocation : null; - } -} - -export class TMLanguageRegistration { - _topLevelScopeNameDataBrand: void; - - readonly scopeName: string; - readonly grammarLocation: URI; - readonly embeddedLanguages: IEmbeddedLanguagesMap; - readonly tokenTypes: ITokenTypeMap; - - constructor(scopeName: string, grammarLocation: URI, embeddedLanguages: IEmbeddedLanguagesMap | undefined, tokenTypes: TokenTypesContribution | undefined) { - this.scopeName = scopeName; - this.grammarLocation = grammarLocation; - - // embeddedLanguages handling - this.embeddedLanguages = Object.create(null); - - if (embeddedLanguages) { - // If embeddedLanguages are configured, fill in `this._embeddedLanguages` - let scopes = Object.keys(embeddedLanguages); - for (let i = 0, len = scopes.length; i < len; i++) { - let scope = scopes[i]; - let language = embeddedLanguages[scope]; - if (typeof language !== 'string') { - // never hurts to be too careful - continue; - } - this.embeddedLanguages[scope] = language; - } - } - - this.tokenTypes = Object.create(null); - if (tokenTypes) { - // If tokenTypes is configured, fill in `this._tokenTypes` - const scopes = Object.keys(tokenTypes); - for (const scope of scopes) { - const tokenType = tokenTypes[scope]; - switch (tokenType) { - case 'string': - this.tokenTypes[scope] = StandardTokenType.String; - break; - case 'other': - this.tokenTypes[scope] = StandardTokenType.Other; - break; - case 'comment': - this.tokenTypes[scope] = StandardTokenType.Comment; - break; - } - } - } - } } diff --git a/src/vs/workbench/services/textMate/electron-browser/textMateService.ts b/src/vs/workbench/services/textMate/electron-browser/textMateService.ts index 4b5ec093cd9..6e952ad9de7 100644 --- a/src/vs/workbench/services/textMate/electron-browser/textMateService.ts +++ b/src/vs/workbench/services/textMate/electron-browser/textMateService.ts @@ -6,12 +6,17 @@ import { ITextMateService } from 'vs/workbench/services/textMate/common/textMateService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { AbstractTextMateService } from 'vs/workbench/services/textMate/browser/abstractTextMateService'; +import { IOnigLib } from 'vscode-textmate'; export class TextMateService extends AbstractTextMateService { protected _loadVSCodeTextmate(): Promise { return import('vscode-textmate'); } + + protected _loadOnigLib(): Promise | undefined { + return undefined; + } } registerSingleton(ITextMateService, TextMateService); \ No newline at end of file From c3f72b8b80eb70d37683fe227a078428f5a02c51 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 8 Jul 2019 12:26:30 +0200 Subject: [PATCH 1240/1449] Extract TMGrammarFactory to its own file --- .../browser/abstractTextMateService.ts | 141 +---------------- .../textMate/common/TMGrammarFactory.ts | 147 ++++++++++++++++++ tslint.json | 3 +- 3 files changed, 152 insertions(+), 139 deletions(-) create mode 100644 src/vs/workbench/services/textMate/common/TMGrammarFactory.ts diff --git a/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts b/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts index 259b53bf167..00481804cb5 100644 --- a/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts +++ b/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts @@ -23,10 +23,11 @@ import { ExtensionMessageCollector } from 'vs/workbench/services/extensions/comm import { ITMSyntaxExtensionPoint, grammarsExtPoint } from 'vs/workbench/services/textMate/common/TMGrammars'; import { ITextMateService } from 'vs/workbench/services/textMate/common/textMateService'; import { ITokenColorizationRule, IWorkbenchThemeService, IColorTheme } from 'vs/workbench/services/themes/common/workbenchThemeService'; -import { IGrammar, Registry, StackElement, IRawTheme, IOnigLib } from 'vscode-textmate'; +import { IGrammar, StackElement, IOnigLib } from 'vscode-textmate'; import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { TMScopeRegistry, IValidGrammarDefinition, IValidEmbeddedLanguagesMap, IValidTokenTypeMap } from 'vs/workbench/services/textMate/common/TMScopeRegistry'; +import { IValidGrammarDefinition, IValidEmbeddedLanguagesMap, IValidTokenTypeMap } from 'vs/workbench/services/textMate/common/TMScopeRegistry'; +import { TMGrammarFactory } from 'vs/workbench/services/textMate/common/TMGrammarFactory'; export abstract class AbstractTextMateService extends Disposable implements ITextMateService { public _serviceBrand: any; @@ -316,142 +317,6 @@ export abstract class AbstractTextMateService extends Disposable implements ITex protected abstract _loadOnigLib(): Promise | undefined; } -interface ITMGrammarFactoryHost { - logTrace(msg: string): void; - logError(msg: string, err: any): void; - readFile(resource: URI): Promise; -} - -interface ICreateGrammarResult { - languageId: LanguageId; - grammar: IGrammar; - initialState: StackElement; - containsEmbeddedLanguages: boolean; -} - -class TMGrammarFactory extends Disposable { - - private readonly _host: ITMGrammarFactoryHost; - private readonly _initialState: StackElement; - private readonly _scopeRegistry: TMScopeRegistry; - private readonly _injections: { [scopeName: string]: string[]; }; - private readonly _injectedEmbeddedLanguages: { [scopeName: string]: IValidEmbeddedLanguagesMap[]; }; - private readonly _languageToScope2: string[]; - private readonly _grammarRegistry: Registry; - - constructor(host: ITMGrammarFactoryHost, grammarDefinitions: IValidGrammarDefinition[], vscodeTextmate: typeof import('vscode-textmate'), onigLib?: Promise) { - super(); - this._host = host; - this._initialState = vscodeTextmate.INITIAL; - this._scopeRegistry = this._register(new TMScopeRegistry()); - this._injections = {}; - this._injectedEmbeddedLanguages = {}; - this._languageToScope2 = []; - this._grammarRegistry = new vscodeTextmate.Registry({ - getOnigLib: (typeof onigLib === 'undefined' ? undefined : () => onigLib), - loadGrammar: async (scopeName: string) => { - const grammarDefinition = this._scopeRegistry.getGrammarDefinition(scopeName); - if (!grammarDefinition) { - this._host.logTrace(`No grammar found for scope ${scopeName}`); - return null; - } - const location = grammarDefinition.location; - try { - const content = await this._host.readFile(location); - return vscodeTextmate.parseRawGrammar(content, location.path); - } catch (e) { - this._host.logError(`Unable to load and parse grammar for scope ${scopeName} from ${location}`, e); - return null; - } - }, - getInjections: (scopeName: string) => { - const scopeParts = scopeName.split('.'); - let injections: string[] = []; - for (let i = 1; i <= scopeParts.length; i++) { - const subScopeName = scopeParts.slice(0, i).join('.'); - injections = [...injections, ...(this._injections[subScopeName] || [])]; - } - return injections; - } - }); - - for (const validGrammar of grammarDefinitions) { - this._scopeRegistry.register(validGrammar); - - if (validGrammar.injectTo) { - for (let injectScope of validGrammar.injectTo) { - let injections = this._injections[injectScope]; - if (!injections) { - this._injections[injectScope] = injections = []; - } - injections.push(validGrammar.scopeName); - } - - if (validGrammar.embeddedLanguages) { - for (let injectScope of validGrammar.injectTo) { - let injectedEmbeddedLanguages = this._injectedEmbeddedLanguages[injectScope]; - if (!injectedEmbeddedLanguages) { - this._injectedEmbeddedLanguages[injectScope] = injectedEmbeddedLanguages = []; - } - injectedEmbeddedLanguages.push(validGrammar.embeddedLanguages); - } - } - } - - if (validGrammar.language) { - this._languageToScope2[validGrammar.language] = validGrammar.scopeName; - } - } - } - - public has(languageId: LanguageId): boolean { - return this._languageToScope2[languageId] ? true : false; - } - - public setTheme(theme: IRawTheme): void { - this._grammarRegistry.setTheme(theme); - } - - public getColorMap(): string[] { - return this._grammarRegistry.getColorMap(); - } - - public async createGrammar(languageId: LanguageId): Promise { - const scopeName = this._languageToScope2[languageId]; - if (typeof scopeName !== 'string') { - // No TM grammar defined - return Promise.reject(new Error(nls.localize('no-tm-grammar', "No TM Grammar registered for this language."))); - } - - const grammarDefinition = this._scopeRegistry.getGrammarDefinition(scopeName); - if (!grammarDefinition) { - // No TM grammar defined - return Promise.reject(new Error(nls.localize('no-tm-grammar', "No TM Grammar registered for this language."))); - } - - let embeddedLanguages = grammarDefinition.embeddedLanguages; - if (this._injectedEmbeddedLanguages[scopeName]) { - const injectedEmbeddedLanguages = this._injectedEmbeddedLanguages[scopeName]; - for (const injected of injectedEmbeddedLanguages) { - for (const scope of Object.keys(injected)) { - embeddedLanguages[scope] = injected[scope]; - } - } - } - - const containsEmbeddedLanguages = (Object.keys(embeddedLanguages).length > 0); - - const grammar = await this._grammarRegistry.loadGrammarWithConfiguration(scopeName, languageId, { embeddedLanguages, tokenTypes: grammarDefinition.tokenTypes }); - - return { - languageId: languageId, - grammar: grammar, - initialState: this._initialState, - containsEmbeddedLanguages: containsEmbeddedLanguages - }; - } -} - class TMTokenizationSupport implements ITokenizationSupport { private readonly _languageId: LanguageId; private readonly _actual: TMTokenization; diff --git a/src/vs/workbench/services/textMate/common/TMGrammarFactory.ts b/src/vs/workbench/services/textMate/common/TMGrammarFactory.ts new file mode 100644 index 00000000000..16656f562eb --- /dev/null +++ b/src/vs/workbench/services/textMate/common/TMGrammarFactory.ts @@ -0,0 +1,147 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as nls from 'vs/nls'; +import { URI } from 'vs/base/common/uri'; +import { LanguageId } from 'vs/editor/common/modes'; +import { IGrammar, Registry, StackElement, IRawTheme, IOnigLib } from 'vscode-textmate'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { TMScopeRegistry, IValidGrammarDefinition, IValidEmbeddedLanguagesMap } from 'vs/workbench/services/textMate/common/TMScopeRegistry'; + +interface ITMGrammarFactoryHost { + logTrace(msg: string): void; + logError(msg: string, err: any): void; + readFile(resource: URI): Promise; +} + +interface ICreateGrammarResult { + languageId: LanguageId; + grammar: IGrammar; + initialState: StackElement; + containsEmbeddedLanguages: boolean; +} + +export class TMGrammarFactory extends Disposable { + + private readonly _host: ITMGrammarFactoryHost; + private readonly _initialState: StackElement; + private readonly _scopeRegistry: TMScopeRegistry; + private readonly _injections: { [scopeName: string]: string[]; }; + private readonly _injectedEmbeddedLanguages: { [scopeName: string]: IValidEmbeddedLanguagesMap[]; }; + private readonly _languageToScope2: string[]; + private readonly _grammarRegistry: Registry; + + constructor(host: ITMGrammarFactoryHost, grammarDefinitions: IValidGrammarDefinition[], vscodeTextmate: typeof import('vscode-textmate'), onigLib: Promise | undefined) { + super(); + this._host = host; + this._initialState = vscodeTextmate.INITIAL; + this._scopeRegistry = this._register(new TMScopeRegistry()); + this._injections = {}; + this._injectedEmbeddedLanguages = {}; + this._languageToScope2 = []; + this._grammarRegistry = new vscodeTextmate.Registry({ + getOnigLib: (typeof onigLib === 'undefined' ? undefined : () => onigLib), + loadGrammar: async (scopeName: string) => { + const grammarDefinition = this._scopeRegistry.getGrammarDefinition(scopeName); + if (!grammarDefinition) { + this._host.logTrace(`No grammar found for scope ${scopeName}`); + return null; + } + const location = grammarDefinition.location; + try { + const content = await this._host.readFile(location); + return vscodeTextmate.parseRawGrammar(content, location.path); + } catch (e) { + this._host.logError(`Unable to load and parse grammar for scope ${scopeName} from ${location}`, e); + return null; + } + }, + getInjections: (scopeName: string) => { + const scopeParts = scopeName.split('.'); + let injections: string[] = []; + for (let i = 1; i <= scopeParts.length; i++) { + const subScopeName = scopeParts.slice(0, i).join('.'); + injections = [...injections, ...(this._injections[subScopeName] || [])]; + } + return injections; + } + }); + + for (const validGrammar of grammarDefinitions) { + this._scopeRegistry.register(validGrammar); + + if (validGrammar.injectTo) { + for (let injectScope of validGrammar.injectTo) { + let injections = this._injections[injectScope]; + if (!injections) { + this._injections[injectScope] = injections = []; + } + injections.push(validGrammar.scopeName); + } + + if (validGrammar.embeddedLanguages) { + for (let injectScope of validGrammar.injectTo) { + let injectedEmbeddedLanguages = this._injectedEmbeddedLanguages[injectScope]; + if (!injectedEmbeddedLanguages) { + this._injectedEmbeddedLanguages[injectScope] = injectedEmbeddedLanguages = []; + } + injectedEmbeddedLanguages.push(validGrammar.embeddedLanguages); + } + } + } + + if (validGrammar.language) { + this._languageToScope2[validGrammar.language] = validGrammar.scopeName; + } + } + } + + public has(languageId: LanguageId): boolean { + return this._languageToScope2[languageId] ? true : false; + } + + public setTheme(theme: IRawTheme): void { + this._grammarRegistry.setTheme(theme); + } + + public getColorMap(): string[] { + return this._grammarRegistry.getColorMap(); + } + + public async createGrammar(languageId: LanguageId): Promise { + const scopeName = this._languageToScope2[languageId]; + if (typeof scopeName !== 'string') { + // No TM grammar defined + return Promise.reject(new Error(nls.localize('no-tm-grammar', "No TM Grammar registered for this language."))); + } + + const grammarDefinition = this._scopeRegistry.getGrammarDefinition(scopeName); + if (!grammarDefinition) { + // No TM grammar defined + return Promise.reject(new Error(nls.localize('no-tm-grammar', "No TM Grammar registered for this language."))); + } + + let embeddedLanguages = grammarDefinition.embeddedLanguages; + if (this._injectedEmbeddedLanguages[scopeName]) { + const injectedEmbeddedLanguages = this._injectedEmbeddedLanguages[scopeName]; + for (const injected of injectedEmbeddedLanguages) { + for (const scope of Object.keys(injected)) { + embeddedLanguages[scope] = injected[scope]; + } + } + } + + const containsEmbeddedLanguages = (Object.keys(embeddedLanguages).length > 0); + + const grammar = await this._grammarRegistry.loadGrammarWithConfiguration(scopeName, languageId, { embeddedLanguages, tokenTypes: grammarDefinition.tokenTypes }); + + return { + languageId: languageId, + grammar: grammar, + initialState: this._initialState, + containsEmbeddedLanguages: containsEmbeddedLanguages + }; + } +} diff --git a/tslint.json b/tslint.json index bf277c33bd1..3ff7147730b 100644 --- a/tslint.json +++ b/tslint.json @@ -430,7 +430,8 @@ "**/vs/editor/common/**", "**/vs/workbench/common/**", "**/vs/workbench/services/**/common/**", - "**/vs/workbench/api/**/common/**" + "**/vs/workbench/api/**/common/**", + "vscode-textmate" ] }, { From 49c45742b979ee742af2fc778e99ac3af074bff9 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 8 Jul 2019 17:53:56 +0200 Subject: [PATCH 1241/1449] Towards loading TM grammars in a web worker --- src/vs/code/electron-main/window.ts | 3 + .../browser/abstractTextMateService.ts | 15 +- .../textMate/common/TMGrammarFactory.ts | 2 +- .../electron-browser/textMateService.ts | 130 ++++++++++++++++++ .../electron-browser/textMateWorker.ts | 128 +++++++++++++++++ 5 files changed, 275 insertions(+), 3 deletions(-) create mode 100644 src/vs/workbench/services/textMate/electron-browser/textMateWorker.ts diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index 35007bcf2f5..a1671f40d44 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -26,6 +26,8 @@ import { IThemeMainService } from 'vs/platform/theme/electron-main/themeMainServ import { endsWith } from 'vs/base/common/strings'; import { RunOnceScheduler } from 'vs/base/common/async'; +const RUN_TEXTMATE_IN_WORKER = false; + export interface IWindowCreationOptions { state: IWindowState; extensionDevelopmentPath?: string | string[]; @@ -128,6 +130,7 @@ export class CodeWindow extends Disposable implements ICodeWindow { // https://github.com/electron/libchromiumcontent/blob/master/patches/common/chromium/disable_hidden.patch backgroundThrottling: false, nodeIntegration: true, + nodeIntegrationInWorker: RUN_TEXTMATE_IN_WORKER, webviewTag: true } }; diff --git a/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts b/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts index 00481804cb5..db27997d72c 100644 --- a/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts +++ b/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts @@ -23,7 +23,7 @@ import { ExtensionMessageCollector } from 'vs/workbench/services/extensions/comm import { ITMSyntaxExtensionPoint, grammarsExtPoint } from 'vs/workbench/services/textMate/common/TMGrammars'; import { ITextMateService } from 'vs/workbench/services/textMate/common/textMateService'; import { ITokenColorizationRule, IWorkbenchThemeService, IColorTheme } from 'vs/workbench/services/themes/common/workbenchThemeService'; -import { IGrammar, StackElement, IOnigLib } from 'vscode-textmate'; +import { IGrammar, StackElement, IOnigLib, IRawTheme } from 'vscode-textmate'; import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IValidGrammarDefinition, IValidEmbeddedLanguagesMap, IValidTokenTypeMap } from 'vs/workbench/services/textMate/common/TMScopeRegistry'; @@ -67,6 +67,7 @@ export abstract class AbstractTextMateService extends Disposable implements ITex if (this._grammarFactory) { this._grammarFactory.dispose(); this._grammarFactory = null; + this._onDidDisposeGrammarFactory(); } this._tokenizersRegistrations = dispose(this._tokenizersRegistrations); @@ -191,6 +192,7 @@ export abstract class AbstractTextMateService extends Disposable implements ITex return content.value.toString(); } }, this._grammarDefinitions || [], vscodeTextmate, this._loadOnigLib()); + this._onDidCreateGrammarFactory(this._grammarDefinitions || []); this._updateTheme(this._grammarFactory, this._themeService.getColorTheme(), true); @@ -242,8 +244,11 @@ export abstract class AbstractTextMateService extends Disposable implements ITex return; } this._currentTokenColors = colorTheme.tokenColors; + this._doUpdateTheme(grammarFactory, { name: colorTheme.label, settings: colorTheme.tokenColors }); + } - grammarFactory.setTheme({ name: colorTheme.label, settings: colorTheme.tokenColors }); + protected _doUpdateTheme(grammarFactory: TMGrammarFactory, theme: IRawTheme): void { + grammarFactory.setTheme(theme); let colorMap = AbstractTextMateService._toColorMap(grammarFactory.getColorMap()); let cssRules = generateTokensCSSForColorMap(colorMap); this._styleElement.innerHTML = cssRules; @@ -313,6 +318,12 @@ export abstract class AbstractTextMateService extends Disposable implements ITex return grammar; } + protected _onDidCreateGrammarFactory(grammarDefinitions: IValidGrammarDefinition[]): void { + } + + protected _onDidDisposeGrammarFactory(): void { + } + protected abstract _loadVSCodeTextmate(): Promise; protected abstract _loadOnigLib(): Promise | undefined; } diff --git a/src/vs/workbench/services/textMate/common/TMGrammarFactory.ts b/src/vs/workbench/services/textMate/common/TMGrammarFactory.ts index 16656f562eb..1ea68789895 100644 --- a/src/vs/workbench/services/textMate/common/TMGrammarFactory.ts +++ b/src/vs/workbench/services/textMate/common/TMGrammarFactory.ts @@ -16,7 +16,7 @@ interface ITMGrammarFactoryHost { readFile(resource: URI): Promise; } -interface ICreateGrammarResult { +export interface ICreateGrammarResult { languageId: LanguageId; grammar: IGrammar; initialState: StackElement; diff --git a/src/vs/workbench/services/textMate/electron-browser/textMateService.ts b/src/vs/workbench/services/textMate/electron-browser/textMateService.ts index 6e952ad9de7..0eb7be9c3dc 100644 --- a/src/vs/workbench/services/textMate/electron-browser/textMateService.ts +++ b/src/vs/workbench/services/textMate/electron-browser/textMateService.ts @@ -6,10 +6,99 @@ import { ITextMateService } from 'vs/workbench/services/textMate/common/textMateService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { AbstractTextMateService } from 'vs/workbench/services/textMate/browser/abstractTextMateService'; +import { IModeService } from 'vs/editor/common/services/modeService'; +import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; +import { IFileService } from 'vs/platform/files/common/files'; +import { INotificationService } from 'vs/platform/notification/common/notification'; +import { ILogService } from 'vs/platform/log/common/log'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { createWebWorker, MonacoWebWorker } from 'vs/editor/common/services/webWorker'; +import { IModelService } from 'vs/editor/common/services/modelService'; import { IOnigLib } from 'vscode-textmate'; +import { IValidGrammarDefinition } from 'vs/workbench/services/textMate/common/TMScopeRegistry'; +import { TextMateWorker } from 'vs/workbench/services/textMate/electron-browser/textMateWorker'; +import { ITextModel } from 'vs/editor/common/model'; +import { Disposable } from 'vs/base/common/lifecycle'; + +const RUN_TEXTMATE_IN_WORKER = false; + +class ModelWorkerTextMateTokenizer extends Disposable { + + private readonly _worker: TextMateWorker; + private readonly _model: ITextModel; + + constructor(worker: TextMateWorker, model: ITextModel) { + super(); + this._worker = worker; + this._model = model; + + this._worker.acceptNewModel({ + uri: this._model.uri, + versionId: this._model.getVersionId(), + lines: this._model.getLinesContent(), + EOL: this._model.getEOL(), + languageId: this._model.getLanguageIdentifier().id, + }); + + this._register(this._model.onDidChangeContent((e) => { + this._worker.acceptModelChanged(this._model.uri.toString(), e); + })); + + this._register(this._model.onDidChangeLanguage((e) => { + this._worker.acceptModelLanguageChanged(this._model.uri.toString(), this._model.getLanguageIdentifier().id); + })); + } + + public dispose() { + super.dispose(); + this._worker.acceptRemovedModel(this._model.uri.toString()); + } +} export class TextMateService extends AbstractTextMateService { + private _worker: MonacoWebWorker | null; + private _workerProxy: TextMateWorker | null; + private _tokenizers: { [uri: string]: ModelWorkerTextMateTokenizer; }; + + constructor( + @IModeService modeService: IModeService, + @IWorkbenchThemeService themeService: IWorkbenchThemeService, + @IFileService fileService: IFileService, + @INotificationService notificationService: INotificationService, + @ILogService logService: ILogService, + @IConfigurationService configurationService: IConfigurationService, + @IModelService private readonly _modelService: IModelService, + ) { + super(modeService, themeService, fileService, notificationService, logService, configurationService); + this._worker = null; + this._workerProxy = null; + this._tokenizers = Object.create(null); + this._register(this._modelService.onModelAdded(model => this._onModelAdded(model))); + this._register(this._modelService.onModelRemoved(model => this._onModelRemoved(model))); + this._modelService.getModels().forEach((model) => this._onModelAdded(model)); + } + + private _onModelAdded(model: ITextModel): void { + if (!this._workerProxy) { + return; + } + if (model.isTooLargeForSyncing()) { + return; + } + const key = model.uri.toString(); + const tokenizer = new ModelWorkerTextMateTokenizer(this._workerProxy, model); + this._tokenizers[key] = tokenizer; + } + + private _onModelRemoved(model: ITextModel): void { + const key = model.uri.toString(); + if (this._tokenizers[key]) { + this._tokenizers[key].dispose(); + delete this._tokenizers[key]; + } + } + protected _loadVSCodeTextmate(): Promise { return import('vscode-textmate'); } @@ -17,6 +106,47 @@ export class TextMateService extends AbstractTextMateService { protected _loadOnigLib(): Promise | undefined { return undefined; } + + protected _onDidCreateGrammarFactory(grammarDefinitions: IValidGrammarDefinition[]): void { + this._killWorker(); + + if (RUN_TEXTMATE_IN_WORKER) { + const worker = createWebWorker(this._modelService, { + createData: { + grammarDefinitions + }, + label: 'textMateWorker', + moduleId: 'vs/workbench/services/textMate/electron-browser/textMateWorker', + }); + + this._worker = worker; + worker.getProxy().then((proxy) => { + if (this._worker !== worker) { + // disposed in the meantime + return; + } + this._workerProxy = proxy; + this._modelService.getModels().forEach((model) => this._onModelAdded(model)); + }); + } + } + + protected _onDidDisposeGrammarFactory(): void { + this._killWorker(); + } + + private _killWorker(): void { + for (let key of Object.keys(this._tokenizers)) { + this._tokenizers[key].dispose(); + } + this._tokenizers = Object.create(null); + + if (this._worker) { + this._worker.dispose(); + this._worker = null; + } + this._workerProxy = null; + } } registerSingleton(ITextMateService, TextMateService); \ No newline at end of file diff --git a/src/vs/workbench/services/textMate/electron-browser/textMateWorker.ts b/src/vs/workbench/services/textMate/electron-browser/textMateWorker.ts new file mode 100644 index 00000000000..ac231c2bece --- /dev/null +++ b/src/vs/workbench/services/textMate/electron-browser/textMateWorker.ts @@ -0,0 +1,128 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IWorkerContext } from 'vs/editor/common/services/editorSimpleWorker'; +import { UriComponents, URI } from 'vs/base/common/uri'; +import { LanguageId } from 'vs/editor/common/modes'; +import { IValidEmbeddedLanguagesMap, IValidTokenTypeMap, IValidGrammarDefinition } from 'vs/workbench/services/textMate/common/TMScopeRegistry'; +import { TMGrammarFactory, ICreateGrammarResult } from 'vs/workbench/services/textMate/common/TMGrammarFactory'; +import { IModelChangedEvent, MirrorTextModel } from 'vs/editor/common/model/mirrorTextModel'; + +export interface IValidGrammarDefinitionDTO { + location: UriComponents; + language?: LanguageId; + scopeName: string; + embeddedLanguages: IValidEmbeddedLanguagesMap; + tokenTypes: IValidTokenTypeMap; + injectTo?: string[]; +} + +export interface ICreateData { + grammarDefinitions: IValidGrammarDefinitionDTO[]; +} + +export interface IRawModelData { + uri: UriComponents; + versionId: number; + lines: string[]; + EOL: string; + languageId: LanguageId; +} + +class TextMateWorkerModel extends MirrorTextModel { + + private readonly _worker: TextMateWorker; + private _languageId: LanguageId; + + constructor(uri: URI, lines: string[], eol: string, versionId: number, worker: TextMateWorker, languageId: LanguageId) { + super(uri, lines, eol, versionId); + this._worker = worker; + this._languageId = languageId; + this._resetTokenization(); + } + + onLanguageId(languageId: LanguageId): void { + this._languageId = languageId; + this._resetTokenization(); + } + + private _resetTokenization(): void { + console.log(this._worker, this._languageId); + // this._worker.getOrCreateGrammar(this._languageId).then((r) => { + // console.log(r); + // }); + } +} + +export class TextMateWorker { + + private readonly _models: { [uri: string]: TextMateWorkerModel; }; + private readonly _grammarCache: Promise[]; + private readonly _grammarFactory: TMGrammarFactory; + + constructor(ctx: IWorkerContext, createData: ICreateData) { + this._models = Object.create(null); + this._grammarCache = []; + const grammarDefinitions = createData.grammarDefinitions.map((def) => { + return { + location: URI.revive(def.location), + language: def.language, + scopeName: def.scopeName, + embeddedLanguages: def.embeddedLanguages, + tokenTypes: def.tokenTypes, + injectTo: def.injectTo, + }; + }); + + let vscodeTextmate: typeof import('vscode-textmate'); + const globalDefine = (self).define; + try { + (self).define.amd = undefined; + vscodeTextmate = require.__$__nodeRequire('vscode-textmate'); + } catch (err) { + console.error(err); + return; + } finally { + (self).define = globalDefine; + } + + this._grammarFactory = new TMGrammarFactory({ + logTrace: (msg: string) => console.log(msg), + logError: (msg: string, err: any) => console.error(msg, err), + readFile: async (resource: URI) => { + throw new Error(`Not implemented!`); + } + }, grammarDefinitions, vscodeTextmate, undefined); + } + + public acceptNewModel(data: IRawModelData): void { + const uri = URI.revive(data.uri); + const key = uri.toString(); + this._models[key] = new TextMateWorkerModel(uri, data.lines, data.EOL, data.versionId, this, data.languageId); + } + + public acceptModelChanged(strURL: string, e: IModelChangedEvent): void { + this._models[strURL].onEvents(e); + } + + public acceptModelLanguageChanged(strURL: string, newLanguageId: LanguageId): void { + this._models[strURL].onLanguageId(newLanguageId); + } + + public acceptRemovedModel(strURL: string): void { + delete this._models[strURL]; + } + + public getOrCreateGrammar(languageId: LanguageId): Promise { + if (!this._grammarCache[languageId]) { + this._grammarCache[languageId] = this._grammarFactory.createGrammar(languageId); + } + return this._grammarCache[languageId]; + } +} + +export function create(ctx: IWorkerContext, createData: ICreateData): TextMateWorker { + return new TextMateWorker(ctx, createData); +} From 139f7de5039512df925887c1f96d9c80085692fc Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 9 Jul 2019 09:42:51 +0200 Subject: [PATCH 1242/1449] implicit any casts --- src/vs/workbench/contrib/debug/browser/rawDebugSession.ts | 2 +- src/vs/workbench/contrib/debug/test/node/debugger.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts b/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts index 1fdbad5a8f9..23119470129 100644 --- a/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts +++ b/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts @@ -598,7 +598,7 @@ export class RawDebugSession { } } else { - args[key] = value; + (args)[key] = value; } } else { 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 ee7eba706fd..5105121ce58 100644 --- a/src/vs/workbench/contrib/debug/test/node/debugger.test.ts +++ b/src/vs/workbench/contrib/debug/test/node/debugger.test.ts @@ -151,7 +151,7 @@ suite('Debug - Debugger', () => { const schemaAttribute = _debugger.getSchemaAttributes()![0]; assert.notDeepEqual(schemaAttribute, debuggerContribution.configurationAttributes); Object.keys(debuggerContribution.configurationAttributes.launch).forEach(key => { - assert.deepEqual(schemaAttribute[key], debuggerContribution.configurationAttributes.launch[key]); + assert.deepEqual((schemaAttribute)[key], (debuggerContribution.configurationAttributes.launch)[key]); }); assert.equal(schemaAttribute['additionalProperties'], false); From 763b6987e050a01f6524ff223c4ce4d9bebabd20 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 9 Jul 2019 09:45:34 +0200 Subject: [PATCH 1243/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4b7ec1f3164..993c4112c88 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "58d6bc66af41677e68c378399cb12ad0a23ed145", + "distro": "5205a6d29c1fbadec4626377aa1ed100d512908d", "author": { "name": "Microsoft Corporation" }, From 1b1296cdb3213d5ca5ca50e51e0890dcba6b6735 Mon Sep 17 00:00:00 2001 From: Alexander Date: Tue, 9 Jul 2019 11:00:45 +0300 Subject: [PATCH 1244/1449] Revert "Add CLI flag to be able to disable smooth scroll in webviews" (#76944) This reverts commit c93c73137e542a8d8bd29798ad165036a8164b6d. --- src/main.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main.js b/src/main.js index c1d198ca5ff..6902f1d6530 100644 --- a/src/main.js +++ b/src/main.js @@ -147,11 +147,6 @@ function configureCommandlineSwitches(cliArgs) { if (jsFlags) { app.commandLine.appendSwitch('--js-flags', jsFlags); } - - // Disable smooth scrolling for Webviews - if (cliArgs['disable-smooth-scrolling']) { - app.commandLine.appendSwitch('disable-smooth-scrolling'); - } } /** From d51f45162985766f27c16683ab8f8c4cd2734478 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 9 Jul 2019 10:08:33 +0200 Subject: [PATCH 1245/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 993c4112c88..5fdfe76f69a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "5205a6d29c1fbadec4626377aa1ed100d512908d", + "distro": "773234694260efe26c5781d4e011fdd1063a948a", "author": { "name": "Microsoft Corporation" }, From e01e4f92ee4819e2c469c22ec4dc0f948113f857 Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 9 Jul 2019 10:09:17 +0200 Subject: [PATCH 1246/1449] fixes #76767 --- src/vs/workbench/contrib/debug/browser/repl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/debug/browser/repl.ts b/src/vs/workbench/contrib/debug/browser/repl.ts index 5f7d93cdea0..9e89ac09d99 100644 --- a/src/vs/workbench/contrib/debug/browser/repl.ts +++ b/src/vs/workbench/contrib/debug/browser/repl.ts @@ -741,7 +741,7 @@ class ReplDelegate implements IListVirtualDelegate { constructor(private configurationService: IConfigurationService) { } getHeight(element: IReplElement): number { - const countNumberOfLines = (str: string) => Math.max(1, (str.match(/\r\n|\n/g) || []).length); + const countNumberOfLines = (str: string) => Math.max(1, (str && str.match(/\r\n|\n/g) || []).length); // Give approximate heights. Repl has dynamic height so the tree will measure the actual height on its own. const config = this.configurationService.getValue('debug'); From c615eb859128a91a9484dc41fb087a385b846026 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Tue, 9 Jul 2019 09:42:11 +0200 Subject: [PATCH 1247/1449] Revert "Updates to the latest icon theme from seti-ui" This reverts commit b24d67b5fb1759c86c6b0aa259a4898dbe4ed39a. --- .../theme-seti/build/update-icon-theme.js | 5 +- extensions/theme-seti/cgmanifest.json | 2 +- extensions/theme-seti/icons/seti.woff | Bin 34800 -> 33904 bytes .../theme-seti/icons/vs-seti-icon-theme.json | 644 +++++++----------- 4 files changed, 256 insertions(+), 395 deletions(-) diff --git a/extensions/theme-seti/build/update-icon-theme.js b/extensions/theme-seti/build/update-icon-theme.js index 4982c678a37..c60de74fe2c 100644 --- a/extensions/theme-seti/build/update-icon-theme.js +++ b/extensions/theme-seti/build/update-icon-theme.js @@ -10,7 +10,7 @@ let fs = require('fs'); let https = require('https'); let url = require('url'); -// list of languages which are not shipped with VSCode. The information is used to associate an icon with a language association +// list of languagesIs not shipped with VSCode. The information is used to associate an icon with a langauge association let nonBuiltInLanguages = { // { fileNames, extensions } "r": { extensions: ['r', 'rhistory', 'rprofile', 'rt'] }, "argdown": { extensions: ['ad', 'adown', 'argdown', 'argdn'] }, @@ -35,8 +35,7 @@ let nonBuiltInLanguages = { // { fileNames, extensions } "todo": { fileNames: ['todo'] } }; -// If true, use `node build/update-icon-theme.js` from the theme-seti folder -let FROM_DISK = true; // set to true to take content from a repo checked out next to the vscode repo +let FROM_DISK = false; // set to true to take content from a repo checkedout next to the vscode repo let font, fontMappingsFile, fileAssociationFile, colorsFile; if (!FROM_DISK) { diff --git a/extensions/theme-seti/cgmanifest.json b/extensions/theme-seti/cgmanifest.json index a9f5274462a..2b449830f50 100644 --- a/extensions/theme-seti/cgmanifest.json +++ b/extensions/theme-seti/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "seti-ui", "repositoryUrl": "https://github.com/jesseweed/seti-ui", - "commitHash": "59ef8c31d9a0c3cef688278c20c6c1c6a84db221" + "commitHash": "89175d7f9e0c70cd325b80a18a3c77fc8eb7c798" } }, "version": "0.1.0" diff --git a/extensions/theme-seti/icons/seti.woff b/extensions/theme-seti/icons/seti.woff index dd662ac459db9cf8063694fa51f83615797baea9..e590d77f6840c65388f761b878df92e329bb897e 100644 GIT binary patch delta 33680 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 E0DV6%7ytkO delta 34585 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 diff --git a/extensions/theme-seti/icons/vs-seti-icon-theme.json b/extensions/theme-seti/icons/vs-seti-icon-theme.json index d30e60a7c85..4aec2074092 100644 --- a/extensions/theme-seti/icons/vs-seti-icon-theme.json +++ b/extensions/theme-seti/icons/vs-seti-icon-theme.json @@ -206,14 +206,6 @@ "fontCharacter": "\\E017", "fontColor": "#a074c4" }, - "_cpp_2_light": { - "fontCharacter": "\\E017", - "fontColor": "#b7b73b" - }, - "_cpp_2": { - "fontCharacter": "\\E017", - "fontColor": "#cbcb41" - }, "_crystal_light": { "fontCharacter": "\\E018", "fontColor": "#bfc2c1" @@ -254,1087 +246,999 @@ "fontCharacter": "\\E01C", "fontColor": "#cc3e44" }, - "_dart_light": { - "fontCharacter": "\\E01D", - "fontColor": "#498ba7" - }, - "_dart": { - "fontCharacter": "\\E01D", - "fontColor": "#519aba" - }, "_db_light": { - "fontCharacter": "\\E01E", + "fontCharacter": "\\E01D", "fontColor": "#dd4b78" }, "_db": { - "fontCharacter": "\\E01E", + "fontCharacter": "\\E01D", "fontColor": "#f55385" }, "_default_light": { - "fontCharacter": "\\E01F", + "fontCharacter": "\\E01E", "fontColor": "#bfc2c1" }, "_default": { - "fontCharacter": "\\E01F", + "fontCharacter": "\\E01E", "fontColor": "#d4d7d6" }, "_docker_light": { - "fontCharacter": "\\E021", + "fontCharacter": "\\E020", "fontColor": "#498ba7" }, "_docker": { - "fontCharacter": "\\E021", + "fontCharacter": "\\E020", "fontColor": "#519aba" }, "_docker_1_light": { - "fontCharacter": "\\E021", + "fontCharacter": "\\E020", "fontColor": "#455155" }, "_docker_1": { - "fontCharacter": "\\E021", + "fontCharacter": "\\E020", "fontColor": "#4d5a5e" }, "_docker_2_light": { - "fontCharacter": "\\E021", + "fontCharacter": "\\E020", "fontColor": "#7fae42" }, "_docker_2": { - "fontCharacter": "\\E021", + "fontCharacter": "\\E020", "fontColor": "#8dc149" }, "_docker_3_light": { - "fontCharacter": "\\E021", + "fontCharacter": "\\E020", "fontColor": "#dd4b78" }, "_docker_3": { - "fontCharacter": "\\E021", + "fontCharacter": "\\E020", "fontColor": "#f55385" }, "_ejs_light": { - "fontCharacter": "\\E023", + "fontCharacter": "\\E022", "fontColor": "#b7b73b" }, "_ejs": { - "fontCharacter": "\\E023", + "fontCharacter": "\\E022", "fontColor": "#cbcb41" }, "_elixir_light": { - "fontCharacter": "\\E024", + "fontCharacter": "\\E023", "fontColor": "#9068b0" }, "_elixir": { - "fontCharacter": "\\E024", + "fontCharacter": "\\E023", "fontColor": "#a074c4" }, "_elixir_script_light": { - "fontCharacter": "\\E025", + "fontCharacter": "\\E024", "fontColor": "#9068b0" }, "_elixir_script": { - "fontCharacter": "\\E025", + "fontCharacter": "\\E024", "fontColor": "#a074c4" }, "_elm_light": { - "fontCharacter": "\\E026", + "fontCharacter": "\\E025", "fontColor": "#498ba7" }, "_elm": { - "fontCharacter": "\\E026", + "fontCharacter": "\\E025", "fontColor": "#519aba" }, "_eslint_light": { - "fontCharacter": "\\E028", + "fontCharacter": "\\E027", "fontColor": "#9068b0" }, "_eslint": { - "fontCharacter": "\\E028", + "fontCharacter": "\\E027", "fontColor": "#a074c4" }, "_eslint_1_light": { - "fontCharacter": "\\E028", + "fontCharacter": "\\E027", "fontColor": "#455155" }, "_eslint_1": { - "fontCharacter": "\\E028", + "fontCharacter": "\\E027", "fontColor": "#4d5a5e" }, "_ethereum_light": { - "fontCharacter": "\\E029", + "fontCharacter": "\\E028", "fontColor": "#498ba7" }, "_ethereum": { - "fontCharacter": "\\E029", + "fontCharacter": "\\E028", "fontColor": "#519aba" }, "_f-sharp_light": { - "fontCharacter": "\\E02A", + "fontCharacter": "\\E029", "fontColor": "#498ba7" }, "_f-sharp": { - "fontCharacter": "\\E02A", + "fontCharacter": "\\E029", "fontColor": "#519aba" }, "_favicon_light": { - "fontCharacter": "\\E02B", + "fontCharacter": "\\E02A", "fontColor": "#b7b73b" }, "_favicon": { - "fontCharacter": "\\E02B", + "fontCharacter": "\\E02A", "fontColor": "#cbcb41" }, "_firebase_light": { - "fontCharacter": "\\E02C", + "fontCharacter": "\\E02B", "fontColor": "#cc6d2e" }, "_firebase": { - "fontCharacter": "\\E02C", + "fontCharacter": "\\E02B", "fontColor": "#e37933" }, "_firefox_light": { - "fontCharacter": "\\E02D", + "fontCharacter": "\\E02C", "fontColor": "#cc6d2e" }, "_firefox": { - "fontCharacter": "\\E02D", + "fontCharacter": "\\E02C", "fontColor": "#e37933" }, "_font_light": { - "fontCharacter": "\\E02F", + "fontCharacter": "\\E02E", "fontColor": "#b8383d" }, "_font": { - "fontCharacter": "\\E02F", + "fontCharacter": "\\E02E", "fontColor": "#cc3e44" }, "_git_light": { - "fontCharacter": "\\E030", + "fontCharacter": "\\E02F", "fontColor": "#3b4b52" }, "_git": { - "fontCharacter": "\\E030", + "fontCharacter": "\\E02F", "fontColor": "#41535b" }, "_go_light": { - "fontCharacter": "\\E034", + "fontCharacter": "\\E033", "fontColor": "#498ba7" }, "_go": { - "fontCharacter": "\\E034", + "fontCharacter": "\\E033", "fontColor": "#519aba" }, "_go2_light": { - "fontCharacter": "\\E035", + "fontCharacter": "\\E034", "fontColor": "#498ba7" }, "_go2": { - "fontCharacter": "\\E035", + "fontCharacter": "\\E034", "fontColor": "#519aba" }, "_gradle_light": { - "fontCharacter": "\\E036", + "fontCharacter": "\\E035", "fontColor": "#7fae42" }, "_gradle": { - "fontCharacter": "\\E036", + "fontCharacter": "\\E035", "fontColor": "#8dc149" }, "_grails_light": { - "fontCharacter": "\\E037", + "fontCharacter": "\\E036", "fontColor": "#7fae42" }, "_grails": { - "fontCharacter": "\\E037", + "fontCharacter": "\\E036", "fontColor": "#8dc149" }, - "_graphql_light": { - "fontCharacter": "\\E038", - "fontColor": "#dd4b78" - }, - "_graphql": { - "fontCharacter": "\\E038", - "fontColor": "#f55385" - }, "_grunt_light": { - "fontCharacter": "\\E039", + "fontCharacter": "\\E037", "fontColor": "#cc6d2e" }, "_grunt": { - "fontCharacter": "\\E039", + "fontCharacter": "\\E037", "fontColor": "#e37933" }, "_gulp_light": { - "fontCharacter": "\\E03A", + "fontCharacter": "\\E038", "fontColor": "#b8383d" }, "_gulp": { - "fontCharacter": "\\E03A", + "fontCharacter": "\\E038", "fontColor": "#cc3e44" }, "_haml_light": { - "fontCharacter": "\\E03C", + "fontCharacter": "\\E03A", "fontColor": "#b8383d" }, "_haml": { - "fontCharacter": "\\E03C", + "fontCharacter": "\\E03A", "fontColor": "#cc3e44" }, - "_happenings_light": { - "fontCharacter": "\\E03D", - "fontColor": "#498ba7" - }, - "_happenings": { - "fontCharacter": "\\E03D", - "fontColor": "#519aba" - }, "_haskell_light": { - "fontCharacter": "\\E03E", + "fontCharacter": "\\E03B", "fontColor": "#9068b0" }, "_haskell": { - "fontCharacter": "\\E03E", + "fontCharacter": "\\E03B", "fontColor": "#a074c4" }, "_haxe_light": { - "fontCharacter": "\\E03F", + "fontCharacter": "\\E03C", "fontColor": "#cc6d2e" }, "_haxe": { - "fontCharacter": "\\E03F", + "fontCharacter": "\\E03C", "fontColor": "#e37933" }, "_haxe_1_light": { - "fontCharacter": "\\E03F", + "fontCharacter": "\\E03C", "fontColor": "#b7b73b" }, "_haxe_1": { - "fontCharacter": "\\E03F", + "fontCharacter": "\\E03C", "fontColor": "#cbcb41" }, "_haxe_2_light": { - "fontCharacter": "\\E03F", + "fontCharacter": "\\E03C", "fontColor": "#498ba7" }, "_haxe_2": { - "fontCharacter": "\\E03F", + "fontCharacter": "\\E03C", "fontColor": "#519aba" }, "_haxe_3_light": { - "fontCharacter": "\\E03F", + "fontCharacter": "\\E03C", "fontColor": "#9068b0" }, "_haxe_3": { - "fontCharacter": "\\E03F", + "fontCharacter": "\\E03C", "fontColor": "#a074c4" }, "_heroku_light": { - "fontCharacter": "\\E040", + "fontCharacter": "\\E03D", "fontColor": "#9068b0" }, "_heroku": { - "fontCharacter": "\\E040", + "fontCharacter": "\\E03D", "fontColor": "#a074c4" }, "_hex_light": { - "fontCharacter": "\\E041", + "fontCharacter": "\\E03E", "fontColor": "#b8383d" }, "_hex": { - "fontCharacter": "\\E041", + "fontCharacter": "\\E03E", "fontColor": "#cc3e44" }, "_html_light": { - "fontCharacter": "\\E042", - "fontColor": "#498ba7" - }, - "_html": { - "fontCharacter": "\\E042", - "fontColor": "#519aba" - }, - "_html_1_light": { - "fontCharacter": "\\E042", - "fontColor": "#7fae42" - }, - "_html_1": { - "fontCharacter": "\\E042", - "fontColor": "#8dc149" - }, - "_html_2_light": { - "fontCharacter": "\\E042", - "fontColor": "#b7b73b" - }, - "_html_2": { - "fontCharacter": "\\E042", - "fontColor": "#cbcb41" - }, - "_html_3_light": { - "fontCharacter": "\\E042", + "fontCharacter": "\\E03F", "fontColor": "#cc6d2e" }, - "_html_3": { - "fontCharacter": "\\E042", + "_html": { + "fontCharacter": "\\E03F", "fontColor": "#e37933" }, "_html_erb_light": { - "fontCharacter": "\\E043", + "fontCharacter": "\\E040", "fontColor": "#b8383d" }, "_html_erb": { - "fontCharacter": "\\E043", + "fontCharacter": "\\E040", "fontColor": "#cc3e44" }, "_ignored_light": { - "fontCharacter": "\\E044", + "fontCharacter": "\\E041", "fontColor": "#3b4b52" }, "_ignored": { - "fontCharacter": "\\E044", + "fontCharacter": "\\E041", "fontColor": "#41535b" }, "_illustrator_light": { - "fontCharacter": "\\E045", + "fontCharacter": "\\E042", "fontColor": "#b7b73b" }, "_illustrator": { - "fontCharacter": "\\E045", + "fontCharacter": "\\E042", "fontColor": "#cbcb41" }, "_image_light": { - "fontCharacter": "\\E046", + "fontCharacter": "\\E043", "fontColor": "#9068b0" }, "_image": { - "fontCharacter": "\\E046", + "fontCharacter": "\\E043", "fontColor": "#a074c4" }, "_info_light": { - "fontCharacter": "\\E047", + "fontCharacter": "\\E044", "fontColor": "#498ba7" }, "_info": { - "fontCharacter": "\\E047", + "fontCharacter": "\\E044", "fontColor": "#519aba" }, "_ionic_light": { - "fontCharacter": "\\E048", + "fontCharacter": "\\E045", "fontColor": "#498ba7" }, "_ionic": { - "fontCharacter": "\\E048", + "fontCharacter": "\\E045", "fontColor": "#519aba" }, "_jade_light": { - "fontCharacter": "\\E049", + "fontCharacter": "\\E046", "fontColor": "#b8383d" }, "_jade": { - "fontCharacter": "\\E049", + "fontCharacter": "\\E046", "fontColor": "#cc3e44" }, "_java_light": { - "fontCharacter": "\\E04A", + "fontCharacter": "\\E047", "fontColor": "#b8383d" }, "_java": { - "fontCharacter": "\\E04A", + "fontCharacter": "\\E047", "fontColor": "#cc3e44" }, "_javascript_light": { - "fontCharacter": "\\E04B", + "fontCharacter": "\\E048", "fontColor": "#b7b73b" }, "_javascript": { - "fontCharacter": "\\E04B", + "fontCharacter": "\\E048", "fontColor": "#cbcb41" }, "_javascript_1_light": { - "fontCharacter": "\\E04B", + "fontCharacter": "\\E048", "fontColor": "#cc6d2e" }, "_javascript_1": { - "fontCharacter": "\\E04B", + "fontCharacter": "\\E048", "fontColor": "#e37933" }, "_javascript_2_light": { - "fontCharacter": "\\E04B", + "fontCharacter": "\\E048", "fontColor": "#498ba7" }, "_javascript_2": { - "fontCharacter": "\\E04B", + "fontCharacter": "\\E048", "fontColor": "#519aba" }, "_jenkins_light": { - "fontCharacter": "\\E04C", + "fontCharacter": "\\E049", "fontColor": "#b8383d" }, "_jenkins": { - "fontCharacter": "\\E04C", + "fontCharacter": "\\E049", "fontColor": "#cc3e44" }, "_jinja_light": { - "fontCharacter": "\\E04D", + "fontCharacter": "\\E04A", "fontColor": "#b8383d" }, "_jinja": { - "fontCharacter": "\\E04D", + "fontCharacter": "\\E04A", "fontColor": "#cc3e44" }, "_json_light": { - "fontCharacter": "\\E04F", + "fontCharacter": "\\E04C", "fontColor": "#b7b73b" }, "_json": { - "fontCharacter": "\\E04F", + "fontCharacter": "\\E04C", "fontColor": "#cbcb41" }, "_json_1_light": { - "fontCharacter": "\\E04F", + "fontCharacter": "\\E04C", "fontColor": "#7fae42" }, "_json_1": { - "fontCharacter": "\\E04F", + "fontCharacter": "\\E04C", "fontColor": "#8dc149" }, "_julia_light": { - "fontCharacter": "\\E050", + "fontCharacter": "\\E04D", "fontColor": "#9068b0" }, "_julia": { - "fontCharacter": "\\E050", + "fontCharacter": "\\E04D", "fontColor": "#a074c4" }, "_karma_light": { - "fontCharacter": "\\E051", + "fontCharacter": "\\E04E", "fontColor": "#7fae42" }, "_karma": { - "fontCharacter": "\\E051", + "fontCharacter": "\\E04E", "fontColor": "#8dc149" }, "_kotlin_light": { - "fontCharacter": "\\E052", + "fontCharacter": "\\E04F", "fontColor": "#cc6d2e" }, "_kotlin": { - "fontCharacter": "\\E052", + "fontCharacter": "\\E04F", "fontColor": "#e37933" }, "_less_light": { - "fontCharacter": "\\E053", + "fontCharacter": "\\E050", "fontColor": "#498ba7" }, "_less": { - "fontCharacter": "\\E053", + "fontCharacter": "\\E050", "fontColor": "#519aba" }, "_license_light": { - "fontCharacter": "\\E054", + "fontCharacter": "\\E051", "fontColor": "#b7b73b" }, "_license": { - "fontCharacter": "\\E054", + "fontCharacter": "\\E051", "fontColor": "#cbcb41" }, "_license_1_light": { - "fontCharacter": "\\E054", + "fontCharacter": "\\E051", "fontColor": "#cc6d2e" }, "_license_1": { - "fontCharacter": "\\E054", + "fontCharacter": "\\E051", "fontColor": "#e37933" }, "_license_2_light": { - "fontCharacter": "\\E054", + "fontCharacter": "\\E051", "fontColor": "#b8383d" }, "_license_2": { - "fontCharacter": "\\E054", + "fontCharacter": "\\E051", "fontColor": "#cc3e44" }, "_liquid_light": { - "fontCharacter": "\\E055", + "fontCharacter": "\\E052", "fontColor": "#7fae42" }, "_liquid": { - "fontCharacter": "\\E055", + "fontCharacter": "\\E052", "fontColor": "#8dc149" }, "_livescript_light": { - "fontCharacter": "\\E056", + "fontCharacter": "\\E053", "fontColor": "#498ba7" }, "_livescript": { - "fontCharacter": "\\E056", + "fontCharacter": "\\E053", "fontColor": "#519aba" }, "_lock_light": { - "fontCharacter": "\\E057", + "fontCharacter": "\\E054", "fontColor": "#7fae42" }, "_lock": { - "fontCharacter": "\\E057", + "fontCharacter": "\\E054", "fontColor": "#8dc149" }, "_lua_light": { - "fontCharacter": "\\E058", + "fontCharacter": "\\E055", "fontColor": "#498ba7" }, "_lua": { - "fontCharacter": "\\E058", + "fontCharacter": "\\E055", "fontColor": "#519aba" }, "_makefile_light": { - "fontCharacter": "\\E059", + "fontCharacter": "\\E056", "fontColor": "#cc6d2e" }, "_makefile": { - "fontCharacter": "\\E059", + "fontCharacter": "\\E056", "fontColor": "#e37933" }, "_makefile_1_light": { - "fontCharacter": "\\E059", + "fontCharacter": "\\E056", "fontColor": "#9068b0" }, "_makefile_1": { - "fontCharacter": "\\E059", + "fontCharacter": "\\E056", "fontColor": "#a074c4" }, "_makefile_2_light": { - "fontCharacter": "\\E059", + "fontCharacter": "\\E056", "fontColor": "#627379" }, "_makefile_2": { - "fontCharacter": "\\E059", + "fontCharacter": "\\E056", "fontColor": "#6d8086" }, "_makefile_3_light": { - "fontCharacter": "\\E059", + "fontCharacter": "\\E056", "fontColor": "#498ba7" }, "_makefile_3": { - "fontCharacter": "\\E059", + "fontCharacter": "\\E056", "fontColor": "#519aba" }, "_markdown_light": { - "fontCharacter": "\\E05A", + "fontCharacter": "\\E057", "fontColor": "#498ba7" }, "_markdown": { - "fontCharacter": "\\E05A", + "fontCharacter": "\\E057", "fontColor": "#519aba" }, "_maven_light": { - "fontCharacter": "\\E05B", + "fontCharacter": "\\E058", "fontColor": "#b8383d" }, "_maven": { - "fontCharacter": "\\E05B", + "fontCharacter": "\\E058", "fontColor": "#cc3e44" }, "_mdo_light": { - "fontCharacter": "\\E05C", + "fontCharacter": "\\E059", "fontColor": "#b8383d" }, "_mdo": { - "fontCharacter": "\\E05C", + "fontCharacter": "\\E059", "fontColor": "#cc3e44" }, "_mustache_light": { - "fontCharacter": "\\E05D", + "fontCharacter": "\\E05A", "fontColor": "#cc6d2e" }, "_mustache": { - "fontCharacter": "\\E05D", + "fontCharacter": "\\E05A", "fontColor": "#e37933" }, "_npm_light": { - "fontCharacter": "\\E05F", + "fontCharacter": "\\E05C", "fontColor": "#3b4b52" }, "_npm": { - "fontCharacter": "\\E05F", + "fontCharacter": "\\E05C", "fontColor": "#41535b" }, "_npm_1_light": { - "fontCharacter": "\\E05F", + "fontCharacter": "\\E05C", "fontColor": "#b8383d" }, "_npm_1": { - "fontCharacter": "\\E05F", + "fontCharacter": "\\E05C", "fontColor": "#cc3e44" }, "_npm_ignored_light": { - "fontCharacter": "\\E060", + "fontCharacter": "\\E05D", "fontColor": "#3b4b52" }, "_npm_ignored": { - "fontCharacter": "\\E060", + "fontCharacter": "\\E05D", "fontColor": "#41535b" }, "_nunjucks_light": { - "fontCharacter": "\\E061", + "fontCharacter": "\\E05E", "fontColor": "#7fae42" }, "_nunjucks": { - "fontCharacter": "\\E061", + "fontCharacter": "\\E05E", "fontColor": "#8dc149" }, "_ocaml_light": { - "fontCharacter": "\\E062", + "fontCharacter": "\\E05F", "fontColor": "#cc6d2e" }, "_ocaml": { - "fontCharacter": "\\E062", + "fontCharacter": "\\E05F", "fontColor": "#e37933" }, "_odata_light": { - "fontCharacter": "\\E063", + "fontCharacter": "\\E060", "fontColor": "#cc6d2e" }, "_odata": { - "fontCharacter": "\\E063", + "fontCharacter": "\\E060", "fontColor": "#e37933" }, - "_pddl_light": { - "fontCharacter": "\\E064", - "fontColor": "#9068b0" - }, - "_pddl": { - "fontCharacter": "\\E064", - "fontColor": "#a074c4" - }, "_pdf_light": { - "fontCharacter": "\\E065", + "fontCharacter": "\\E061", "fontColor": "#b8383d" }, "_pdf": { - "fontCharacter": "\\E065", + "fontCharacter": "\\E061", "fontColor": "#cc3e44" }, "_perl_light": { - "fontCharacter": "\\E066", + "fontCharacter": "\\E062", "fontColor": "#498ba7" }, "_perl": { - "fontCharacter": "\\E066", + "fontCharacter": "\\E062", "fontColor": "#519aba" }, "_photoshop_light": { - "fontCharacter": "\\E067", + "fontCharacter": "\\E063", "fontColor": "#498ba7" }, "_photoshop": { - "fontCharacter": "\\E067", + "fontCharacter": "\\E063", "fontColor": "#519aba" }, "_php_light": { - "fontCharacter": "\\E068", + "fontCharacter": "\\E064", "fontColor": "#9068b0" }, "_php": { - "fontCharacter": "\\E068", + "fontCharacter": "\\E064", "fontColor": "#a074c4" }, - "_plan_light": { - "fontCharacter": "\\E069", - "fontColor": "#7fae42" - }, - "_plan": { - "fontCharacter": "\\E069", - "fontColor": "#8dc149" - }, - "_platformio_light": { - "fontCharacter": "\\E06A", - "fontColor": "#cc6d2e" - }, - "_platformio": { - "fontCharacter": "\\E06A", - "fontColor": "#e37933" - }, "_powershell_light": { - "fontCharacter": "\\E06B", + "fontCharacter": "\\E065", "fontColor": "#498ba7" }, "_powershell": { - "fontCharacter": "\\E06B", + "fontCharacter": "\\E065", "fontColor": "#519aba" }, "_pug_light": { - "fontCharacter": "\\E06D", + "fontCharacter": "\\E067", "fontColor": "#b8383d" }, "_pug": { - "fontCharacter": "\\E06D", + "fontCharacter": "\\E067", "fontColor": "#cc3e44" }, "_puppet_light": { - "fontCharacter": "\\E06E", + "fontCharacter": "\\E068", "fontColor": "#b7b73b" }, "_puppet": { - "fontCharacter": "\\E06E", + "fontCharacter": "\\E068", "fontColor": "#cbcb41" }, "_python_light": { - "fontCharacter": "\\E06F", + "fontCharacter": "\\E069", "fontColor": "#498ba7" }, "_python": { - "fontCharacter": "\\E06F", + "fontCharacter": "\\E069", "fontColor": "#519aba" }, "_react_light": { - "fontCharacter": "\\E071", + "fontCharacter": "\\E06B", "fontColor": "#498ba7" }, "_react": { - "fontCharacter": "\\E071", + "fontCharacter": "\\E06B", "fontColor": "#519aba" }, - "_reasonml_light": { - "fontCharacter": "\\E072", - "fontColor": "#b8383d" - }, - "_reasonml": { - "fontCharacter": "\\E072", - "fontColor": "#cc3e44" - }, "_rollup_light": { - "fontCharacter": "\\E073", + "fontCharacter": "\\E06C", "fontColor": "#b8383d" }, "_rollup": { - "fontCharacter": "\\E073", + "fontCharacter": "\\E06C", "fontColor": "#cc3e44" }, "_ruby_light": { - "fontCharacter": "\\E074", + "fontCharacter": "\\E06D", "fontColor": "#b8383d" }, "_ruby": { - "fontCharacter": "\\E074", + "fontCharacter": "\\E06D", "fontColor": "#cc3e44" }, "_rust_light": { - "fontCharacter": "\\E075", + "fontCharacter": "\\E06E", "fontColor": "#627379" }, "_rust": { - "fontCharacter": "\\E075", + "fontCharacter": "\\E06E", "fontColor": "#6d8086" }, "_salesforce_light": { - "fontCharacter": "\\E076", + "fontCharacter": "\\E06F", "fontColor": "#498ba7" }, "_salesforce": { - "fontCharacter": "\\E076", + "fontCharacter": "\\E06F", "fontColor": "#519aba" }, "_sass_light": { - "fontCharacter": "\\E077", + "fontCharacter": "\\E070", "fontColor": "#dd4b78" }, "_sass": { - "fontCharacter": "\\E077", + "fontCharacter": "\\E070", "fontColor": "#f55385" }, "_sbt_light": { - "fontCharacter": "\\E078", + "fontCharacter": "\\E071", "fontColor": "#498ba7" }, "_sbt": { - "fontCharacter": "\\E078", + "fontCharacter": "\\E071", "fontColor": "#519aba" }, "_scala_light": { - "fontCharacter": "\\E079", + "fontCharacter": "\\E072", "fontColor": "#b8383d" }, "_scala": { - "fontCharacter": "\\E079", + "fontCharacter": "\\E072", "fontColor": "#cc3e44" }, "_shell_light": { - "fontCharacter": "\\E07C", + "fontCharacter": "\\E075", "fontColor": "#455155" }, "_shell": { - "fontCharacter": "\\E07C", + "fontCharacter": "\\E075", "fontColor": "#4d5a5e" }, "_slim_light": { - "fontCharacter": "\\E07D", + "fontCharacter": "\\E076", "fontColor": "#cc6d2e" }, "_slim": { - "fontCharacter": "\\E07D", + "fontCharacter": "\\E076", "fontColor": "#e37933" }, "_smarty_light": { - "fontCharacter": "\\E07E", + "fontCharacter": "\\E077", "fontColor": "#b7b73b" }, "_smarty": { - "fontCharacter": "\\E07E", + "fontCharacter": "\\E077", "fontColor": "#cbcb41" }, "_spring_light": { - "fontCharacter": "\\E07F", + "fontCharacter": "\\E078", "fontColor": "#7fae42" }, "_spring": { - "fontCharacter": "\\E07F", + "fontCharacter": "\\E078", "fontColor": "#8dc149" }, "_stylelint_light": { - "fontCharacter": "\\E080", + "fontCharacter": "\\E079", "fontColor": "#bfc2c1" }, "_stylelint": { - "fontCharacter": "\\E080", + "fontCharacter": "\\E079", "fontColor": "#d4d7d6" }, "_stylelint_1_light": { - "fontCharacter": "\\E080", + "fontCharacter": "\\E079", "fontColor": "#455155" }, "_stylelint_1": { - "fontCharacter": "\\E080", + "fontCharacter": "\\E079", "fontColor": "#4d5a5e" }, "_stylus_light": { - "fontCharacter": "\\E081", + "fontCharacter": "\\E07A", "fontColor": "#7fae42" }, "_stylus": { - "fontCharacter": "\\E081", + "fontCharacter": "\\E07A", "fontColor": "#8dc149" }, "_sublime_light": { - "fontCharacter": "\\E082", + "fontCharacter": "\\E07B", "fontColor": "#cc6d2e" }, "_sublime": { - "fontCharacter": "\\E082", + "fontCharacter": "\\E07B", "fontColor": "#e37933" }, "_svg_light": { - "fontCharacter": "\\E083", + "fontCharacter": "\\E07C", "fontColor": "#9068b0" }, "_svg": { - "fontCharacter": "\\E083", + "fontCharacter": "\\E07C", "fontColor": "#a074c4" }, "_svg_1_light": { - "fontCharacter": "\\E083", + "fontCharacter": "\\E07C", "fontColor": "#498ba7" }, "_svg_1": { - "fontCharacter": "\\E083", + "fontCharacter": "\\E07C", "fontColor": "#519aba" }, "_swift_light": { - "fontCharacter": "\\E084", + "fontCharacter": "\\E07D", "fontColor": "#cc6d2e" }, "_swift": { - "fontCharacter": "\\E084", + "fontCharacter": "\\E07D", "fontColor": "#e37933" }, "_terraform_light": { - "fontCharacter": "\\E085", + "fontCharacter": "\\E07E", "fontColor": "#9068b0" }, "_terraform": { - "fontCharacter": "\\E085", + "fontCharacter": "\\E07E", "fontColor": "#a074c4" }, "_tex_light": { - "fontCharacter": "\\E086", + "fontCharacter": "\\E07F", "fontColor": "#498ba7" }, "_tex": { - "fontCharacter": "\\E086", + "fontCharacter": "\\E07F", "fontColor": "#519aba" }, "_tex_1_light": { - "fontCharacter": "\\E086", + "fontCharacter": "\\E07F", "fontColor": "#b7b73b" }, "_tex_1": { - "fontCharacter": "\\E086", + "fontCharacter": "\\E07F", "fontColor": "#cbcb41" }, "_tex_2_light": { - "fontCharacter": "\\E086", + "fontCharacter": "\\E07F", "fontColor": "#cc6d2e" }, "_tex_2": { - "fontCharacter": "\\E086", + "fontCharacter": "\\E07F", "fontColor": "#e37933" }, "_tex_3_light": { - "fontCharacter": "\\E086", + "fontCharacter": "\\E07F", "fontColor": "#bfc2c1" }, "_tex_3": { - "fontCharacter": "\\E086", + "fontCharacter": "\\E07F", "fontColor": "#d4d7d6" }, "_todo": { - "fontCharacter": "\\E088" - }, - "_tsconfig_light": { - "fontCharacter": "\\E089", - "fontColor": "#498ba7" - }, - "_tsconfig": { - "fontCharacter": "\\E089", - "fontColor": "#519aba" + "fontCharacter": "\\E081" }, "_twig_light": { - "fontCharacter": "\\E08A", + "fontCharacter": "\\E082", "fontColor": "#7fae42" }, "_twig": { - "fontCharacter": "\\E08A", + "fontCharacter": "\\E082", "fontColor": "#8dc149" }, "_typescript_light": { - "fontCharacter": "\\E08B", + "fontCharacter": "\\E083", "fontColor": "#498ba7" }, "_typescript": { - "fontCharacter": "\\E08B", + "fontCharacter": "\\E083", "fontColor": "#519aba" }, "_typescript_1_light": { - "fontCharacter": "\\E08B", + "fontCharacter": "\\E083", "fontColor": "#b7b73b" }, "_typescript_1": { - "fontCharacter": "\\E08B", + "fontCharacter": "\\E083", "fontColor": "#cbcb41" }, "_vala_light": { - "fontCharacter": "\\E08C", + "fontCharacter": "\\E084", "fontColor": "#627379" }, "_vala": { - "fontCharacter": "\\E08C", + "fontCharacter": "\\E084", "fontColor": "#6d8086" }, "_video_light": { - "fontCharacter": "\\E08D", + "fontCharacter": "\\E085", "fontColor": "#dd4b78" }, "_video": { - "fontCharacter": "\\E08D", + "fontCharacter": "\\E085", "fontColor": "#f55385" }, "_vue_light": { - "fontCharacter": "\\E08E", + "fontCharacter": "\\E086", "fontColor": "#7fae42" }, "_vue": { - "fontCharacter": "\\E08E", + "fontCharacter": "\\E086", "fontColor": "#8dc149" }, "_wasm_light": { - "fontCharacter": "\\E08F", + "fontCharacter": "\\E087", "fontColor": "#9068b0" }, "_wasm": { - "fontCharacter": "\\E08F", + "fontCharacter": "\\E087", "fontColor": "#a074c4" }, "_wat_light": { - "fontCharacter": "\\E090", + "fontCharacter": "\\E088", "fontColor": "#9068b0" }, "_wat": { - "fontCharacter": "\\E090", + "fontCharacter": "\\E088", "fontColor": "#a074c4" }, "_webpack_light": { - "fontCharacter": "\\E091", + "fontCharacter": "\\E089", "fontColor": "#498ba7" }, "_webpack": { - "fontCharacter": "\\E091", + "fontCharacter": "\\E089", "fontColor": "#519aba" }, "_wgt_light": { - "fontCharacter": "\\E092", + "fontCharacter": "\\E08A", "fontColor": "#498ba7" }, "_wgt": { - "fontCharacter": "\\E092", + "fontCharacter": "\\E08A", "fontColor": "#519aba" }, "_windows_light": { - "fontCharacter": "\\E093", + "fontCharacter": "\\E08B", "fontColor": "#498ba7" }, "_windows": { - "fontCharacter": "\\E093", + "fontCharacter": "\\E08B", "fontColor": "#519aba" }, "_word_light": { - "fontCharacter": "\\E094", + "fontCharacter": "\\E08C", "fontColor": "#498ba7" }, "_word": { - "fontCharacter": "\\E094", + "fontCharacter": "\\E08C", "fontColor": "#519aba" }, "_xls_light": { - "fontCharacter": "\\E095", + "fontCharacter": "\\E08D", "fontColor": "#7fae42" }, "_xls": { - "fontCharacter": "\\E095", + "fontCharacter": "\\E08D", "fontColor": "#8dc149" }, "_xml_light": { - "fontCharacter": "\\E096", + "fontCharacter": "\\E08E", "fontColor": "#cc6d2e" }, "_xml": { - "fontCharacter": "\\E096", + "fontCharacter": "\\E08E", "fontColor": "#e37933" }, "_yarn_light": { - "fontCharacter": "\\E097", + "fontCharacter": "\\E08F", "fontColor": "#498ba7" }, "_yarn": { - "fontCharacter": "\\E097", + "fontCharacter": "\\E08F", "fontColor": "#519aba" }, "_yml_light": { - "fontCharacter": "\\E098", + "fontCharacter": "\\E090", "fontColor": "#9068b0" }, "_yml": { - "fontCharacter": "\\E098", + "fontCharacter": "\\E090", "fontColor": "#a074c4" }, "_zip_light": { - "fontCharacter": "\\E099", + "fontCharacter": "\\E091", "fontColor": "#b8383d" }, "_zip": { - "fontCharacter": "\\E099", + "fontCharacter": "\\E091", "fontColor": "#cc3e44" }, "_zip_1_light": { - "fontCharacter": "\\E099", + "fontCharacter": "\\E091", "fontColor": "#627379" }, "_zip_1": { - "fontCharacter": "\\E099", + "fontCharacter": "\\E091", "fontColor": "#6d8086" } }, @@ -1345,10 +1249,6 @@ "asm": "_asm", "s": "_asm", "h": "_c_1", - "aspx": "_html", - "ascx": "_html_1", - "asax": "_html_2", - "master": "_html_2", "hh": "_cpp_1", "hpp": "_cpp_1", "hxx": "_cpp_1", @@ -1386,8 +1286,6 @@ "article": "_go", "gradle": "_gradle", "gsp": "_grails", - "gql": "_graphql", - "graphql": "_graphql", "haml": "_haml", "hs": "_haskell", "lhs": "_haskell", @@ -1407,7 +1305,6 @@ "jl": "_julia", "kt": "_kotlin", "kts": "_kotlin", - "dart": "_dart", "liquid": "_liquid", "ls": "_livescript", "argdown": "_argdown", @@ -1429,14 +1326,10 @@ "cmxa": "_ocaml", "odata": "_odata", "php.inc": "_php", - "pddl": "_pddl", - "plan": "_plan", - "happenings": "_happenings", "pug": "_pug", "pp": "_puppet", "epp": "_puppet", "cjsx": "_react", - "re": "_reasonml", "r": "_R", "erb": "_html_erb", "erb.html": "_html_erb", @@ -1459,9 +1352,6 @@ "toml": "_config", "twig": "_twig", "spec.ts": "_typescript_1", - "test.ts": "_typescript_1", - "spec.tsx": "_typescript_1", - "test.tsx": "_typescript_1", "vala": "_vala", "vapi": "_vala", "vue": "_vue", @@ -1562,7 +1452,6 @@ "gulpfile": "_gulp", "ionic.config.json": "_ionic", "ionic.project": "_ionic", - "platformio.ini": "_platformio", "rollup.config.js": "_rollup", "sass-lint.yml": "_sass", "stylelint.config.js": "_stylelint", @@ -1570,9 +1459,6 @@ "yarn.lock": "_yarn", "webpack.config.js": "_webpack", "webpack.config.build.js": "_webpack", - "webpack.common.js": "_webpack", - "webpack.dev.js": "_webpack", - "webpack.prod.js": "_webpack", "license": "_license", "licence": "_license", "copying": "_license", @@ -1589,7 +1475,6 @@ "bat": "_windows", "clojure": "_clojure", "coffeescript": "_coffee", - "jsonc": "_tsconfig", "c": "_c", "cpp": "_cpp", "csharp": "_c-sharp", @@ -1599,7 +1484,7 @@ "go": "_go2", "groovy": "_grails", "handlebars": "_mustache", - "html": "_html_3", + "html": "_html", "properties": "_java", "java": "_java", "javascriptreact": "_react", @@ -1610,14 +1495,12 @@ "makefile": "_makefile", "markdown": "_markdown", "objective-c": "_c_2", - "objective-cpp": "_cpp_2", "perl": "_perl", "php": "_php", "powershell": "_powershell", "jade": "_jade", "python": "_python", "r": "_R", - "razor": "_html", "ruby": "_ruby", "rust": "_rust", "scss": "_sass", @@ -1656,10 +1539,6 @@ "asm": "_asm_light", "s": "_asm_light", "h": "_c_1_light", - "aspx": "_html_light", - "ascx": "_html_1_light", - "asax": "_html_2_light", - "master": "_html_2_light", "hh": "_cpp_1_light", "hpp": "_cpp_1_light", "hxx": "_cpp_1_light", @@ -1697,8 +1576,6 @@ "article": "_go_light", "gradle": "_gradle_light", "gsp": "_grails_light", - "gql": "_graphql_light", - "graphql": "_graphql_light", "haml": "_haml_light", "hs": "_haskell_light", "lhs": "_haskell_light", @@ -1718,7 +1595,6 @@ "jl": "_julia_light", "kt": "_kotlin_light", "kts": "_kotlin_light", - "dart": "_dart_light", "liquid": "_liquid_light", "ls": "_livescript_light", "argdown": "_argdown_light", @@ -1740,14 +1616,10 @@ "cmxa": "_ocaml_light", "odata": "_odata_light", "php.inc": "_php_light", - "pddl": "_pddl_light", - "plan": "_plan_light", - "happenings": "_happenings_light", "pug": "_pug_light", "pp": "_puppet_light", "epp": "_puppet_light", "cjsx": "_react_light", - "re": "_reasonml_light", "r": "_R_light", "erb": "_html_erb_light", "erb.html": "_html_erb_light", @@ -1770,9 +1642,6 @@ "toml": "_config_light", "twig": "_twig_light", "spec.ts": "_typescript_1_light", - "test.ts": "_typescript_1_light", - "spec.tsx": "_typescript_1_light", - "test.tsx": "_typescript_1_light", "vala": "_vala_light", "vapi": "_vala_light", "vue": "_vue_light", @@ -1849,7 +1718,6 @@ "bat": "_windows_light", "clojure": "_clojure_light", "coffeescript": "_coffee_light", - "jsonc": "_tsconfig_light", "c": "_c_light", "cpp": "_cpp_light", "csharp": "_c-sharp_light", @@ -1859,7 +1727,7 @@ "go": "_go2_light", "groovy": "_grails_light", "handlebars": "_mustache_light", - "html": "_html_3_light", + "html": "_html_light", "properties": "_java_light", "java": "_java_light", "javascriptreact": "_react_light", @@ -1870,14 +1738,12 @@ "makefile": "_makefile_light", "markdown": "_markdown_light", "objective-c": "_c_2_light", - "objective-cpp": "_cpp_2_light", "perl": "_perl_light", "php": "_php_light", "powershell": "_powershell_light", "jade": "_jade_light", "python": "_python_light", "r": "_R_light", - "razor": "_html_light", "ruby": "_ruby_light", "rust": "_rust_light", "scss": "_sass_light", @@ -1935,7 +1801,6 @@ "gulpfile": "_gulp_light", "ionic.config.json": "_ionic_light", "ionic.project": "_ionic_light", - "platformio.ini": "_platformio_light", "rollup.config.js": "_rollup_light", "sass-lint.yml": "_sass_light", "stylelint.config.js": "_stylelint_light", @@ -1943,9 +1808,6 @@ "yarn.lock": "_yarn_light", "webpack.config.js": "_webpack_light", "webpack.config.build.js": "_webpack_light", - "webpack.common.js": "_webpack_light", - "webpack.dev.js": "_webpack_light", - "webpack.prod.js": "_webpack_light", "license": "_license_light", "licence": "_license_light", "copying": "_license_light", @@ -1958,5 +1820,5 @@ "npm-debug.log": "_npm_ignored_light" } }, - "version": "https://github.com/jesseweed/seti-ui/commit/59ef8c31d9a0c3cef688278c20c6c1c6a84db221" + "version": "https://github.com/jesseweed/seti-ui/commit/89175d7f9e0c70cd325b80a18a3c77fc8eb7c798" } \ No newline at end of file From f3569142cc702896e3569b6f3de66f41d02a613d Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 9 Jul 2019 10:13:42 +0200 Subject: [PATCH 1248/1449] update references view extension --- build/builtInExtensions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/builtInExtensions.json b/build/builtInExtensions.json index 7f1c9fd2f6f..f044a0e5384 100644 --- a/build/builtInExtensions.json +++ b/build/builtInExtensions.json @@ -31,7 +31,7 @@ }, { "name": "ms-vscode.references-view", - "version": "0.0.27", + "version": "0.0.28", "repo": "https://github.com/Microsoft/vscode-reference-view", "metadata": { "id": "dc489f46-520d-4556-ae85-1f9eab3c412d", From 9e769ab2adb4dcfc86c206f5dc1650a7eb6c40a4 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Tue, 9 Jul 2019 10:21:48 +0200 Subject: [PATCH 1249/1449] Addresses #76442: Remove suppressImplicitAnyIndexErrors --- .../contrib/localizations/browser/minimalTranslations.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/localizations/browser/minimalTranslations.ts b/src/vs/workbench/contrib/localizations/browser/minimalTranslations.ts index 42e71e0a725..00cffc61629 100644 --- a/src/vs/workbench/contrib/localizations/browser/minimalTranslations.ts +++ b/src/vs/workbench/contrib/localizations/browser/minimalTranslations.ts @@ -8,10 +8,9 @@ import { localize } from 'vs/nls'; // The strings localized in this file will get pulled into the manifest of the language packs. // So that they are available for VS Code to use without downloading the entire language pack. -export const minimumTranslatedStrings = { +export const minimumTranslatedStrings: { [key: string]: string } = { showLanguagePackExtensions: localize('showLanguagePackExtensions', "Search language packs in the Marketplace to change the display language to {0}."), searchMarketplace: localize('searchMarketplace', "Search Marketplace"), installAndRestartMessage: localize('installAndRestartMessage', "Install language pack to change the display language to {0}."), installAndRestart: localize('installAndRestart', "Install and Restart") -}; - +}; \ No newline at end of file From 922ab6db6251a58ac7761174a7208c9d62116a02 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Tue, 9 Jul 2019 10:47:13 +0200 Subject: [PATCH 1250/1449] Update grammar script to include option path for version Update C grammars to get macro fix --- build/npm/update-grammar.js | 8 +- extensions/cpp/build/update-grammars.js | 4 +- extensions/cpp/cgmanifest.json | 4 +- extensions/cpp/syntaxes/cpp.tmLanguage.json | 8 +- .../cpp/test/colorize-results/test_cpp.json | 73 +++++++++++-------- .../objective-c/build/update-grammars.js | 4 +- extensions/objective-c/cgmanifest.json | 2 +- 7 files changed, 59 insertions(+), 44 deletions(-) diff --git a/build/npm/update-grammar.js b/build/npm/update-grammar.js index 522b2941218..5321b7b1dcd 100644 --- a/build/npm/update-grammar.js +++ b/build/npm/update-grammar.js @@ -82,7 +82,7 @@ function getCommitSha(repoId, repoPath) { }); } -exports.update = function (repoId, repoPath, dest, modifyGrammar, version = 'master') { +exports.update = function (repoId, repoPath, dest, modifyGrammar, version = 'master', packageJsonPathOverride = '') { var contentPath = 'https://raw.githubusercontent.com/' + repoId + `/${version}/` + repoPath; console.log('Reading from ' + contentPath); return download(contentPath).then(function (content) { @@ -128,7 +128,11 @@ exports.update = function (repoId, repoPath, dest, modifyGrammar, version = 'mas // Add commit sha to cgmanifest. if (currentCommitDate > commitDate) { - let packageJsonPath = 'https://raw.githubusercontent.com/' + repoId + `/${info.commitSha}/package.json`; + let packageJsonPath = 'https://raw.githubusercontent.com/' + repoId + `/${info.commitSha}/`; + if (packageJsonPathOverride) { + packageJsonPath += packageJsonPathOverride; + } + packageJsonPath += '/package.json'; for (let i = 0; i < cgmanifestRead.registrations.length; i++) { if (cgmanifestRead.registrations[i].component.git.repositoryUrl.substr(cgmanifestRead.registrations[i].component.git.repositoryUrl.length - repoId.length, repoId.length) === repoId) { cgmanifestRead.registrations[i].component.git.commitHash = info.commitSha; diff --git a/extensions/cpp/build/update-grammars.js b/extensions/cpp/build/update-grammars.js index 406b326156c..29761cdaf95 100644 --- a/extensions/cpp/build/update-grammars.js +++ b/extensions/cpp/build/update-grammars.js @@ -6,8 +6,8 @@ var updateGrammar = require('../../../build/npm/update-grammar'); -updateGrammar.update('jeff-hykin/cpp-textmate-grammar', '/syntaxes/c.tmLanguage.json', './syntaxes/c.tmLanguage.json'); -updateGrammar.update('jeff-hykin/cpp-textmate-grammar', '/syntaxes/cpp.tmLanguage.json', './syntaxes/cpp.tmLanguage.json'); +updateGrammar.update('jeff-hykin/cpp-textmate-grammar', '/syntaxes/c.tmLanguage.json', './syntaxes/c.tmLanguage.json', undefined, 'master', 'source/languages/cpp'); +updateGrammar.update('jeff-hykin/cpp-textmate-grammar', '/syntaxes/cpp.tmLanguage.json', './syntaxes/cpp.tmLanguage.json', undefined, 'master', 'source/languages/cpp'); // `source.c.platform` which is still included by other grammars updateGrammar.update('textmate/c.tmbundle', 'Syntaxes/Platform.tmLanguage', './syntaxes/platform.tmLanguage.json'); diff --git a/extensions/cpp/cgmanifest.json b/extensions/cpp/cgmanifest.json index 113cea950f6..6716fa1a223 100644 --- a/extensions/cpp/cgmanifest.json +++ b/extensions/cpp/cgmanifest.json @@ -6,11 +6,11 @@ "git": { "name": "jeff-hykin/cpp-textmate-grammar", "repositoryUrl": "https://github.com/jeff-hykin/cpp-textmate-grammar", - "commitHash": "cb9cb59b32d0cb9e2cbbca1a9cdb62769fc2ca8e" + "commitHash": "992c5ba8789288707f2a13778452d644677d9699" } }, "license": "MIT", - "version": "1.0.0", + "version": "1.12.18", "description": "The files syntaxes/c.json and syntaxes/c++.json were derived from https://github.com/atom/language-c which was originally converted from the C TextMate bundle https://github.com/textmate/c.tmbundle." }, { diff --git a/extensions/cpp/syntaxes/cpp.tmLanguage.json b/extensions/cpp/syntaxes/cpp.tmLanguage.json index e43d8d45b61..f7495aee6e3 100644 --- a/extensions/cpp/syntaxes/cpp.tmLanguage.json +++ b/extensions/cpp/syntaxes/cpp.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/jeff-hykin/cpp-textmate-grammar/commit/cb9cb59b32d0cb9e2cbbca1a9cdb62769fc2ca8e", + "version": "https://github.com/jeff-hykin/cpp-textmate-grammar/commit/992c5ba8789288707f2a13778452d644677d9699", "name": "C++", "scopeName": "source.cpp", "patterns": [ @@ -143,9 +143,6 @@ { "include": "#preprocessor_rule_conditional" }, - { - "include": "#macro_argument" - }, { "include": "#meta_preprocessor_macro" }, @@ -19409,6 +19406,9 @@ }, { "include": "#evaluation_context" + }, + { + "include": "#macro_argument" } ] } diff --git a/extensions/cpp/test/colorize-results/test_cpp.json b/extensions/cpp/test/colorize-results/test_cpp.json index 4f8817ed2a0..025f668b4c9 100644 --- a/extensions/cpp/test/colorize-results/test_cpp.json +++ b/extensions/cpp/test/colorize-results/test_cpp.json @@ -22,58 +22,69 @@ } }, { - "c": "#include", - "t": "source.cpp variable.other.macro.argument.cpp", + "c": "#", + "t": "source.cpp meta.preprocessor.include.cpp keyword.control.directive.include.cpp punctuation.definition.directive.cpp", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "variable: #9CDCFE" + "dark_plus": "keyword.control: #C586C0", + "light_plus": "keyword.control: #AF00DB", + "dark_vs": "keyword.control: #569CD6", + "light_vs": "keyword.control: #0000FF", + "hc_black": "keyword.control: #C586C0" + } + }, + { + "c": "include", + "t": "source.cpp meta.preprocessor.include.cpp keyword.control.directive.include.cpp", + "r": { + "dark_plus": "keyword.control: #C586C0", + "light_plus": "keyword.control: #AF00DB", + "dark_vs": "keyword.control: #569CD6", + "light_vs": "keyword.control: #0000FF", + "hc_black": "keyword.control: #C586C0" } }, { "c": " ", - "t": "source.cpp", + "t": "source.cpp meta.preprocessor.include.cpp", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "dark_plus": "meta.preprocessor: #569CD6", + "light_plus": "meta.preprocessor: #0000FF", + "dark_vs": "meta.preprocessor: #569CD6", + "light_vs": "meta.preprocessor: #0000FF", + "hc_black": "meta.preprocessor: #569CD6" } }, { "c": "<", - "t": "source.cpp keyword.operator.comparison.cpp", + "t": "source.cpp meta.preprocessor.include.cpp string.quoted.other.lt-gt.include.cpp punctuation.definition.string.begin.cpp", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", - "hc_black": "keyword.operator: #D4D4D4" + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" } }, { "c": "iostream", - "t": "source.cpp", + "t": "source.cpp meta.preprocessor.include.cpp string.quoted.other.lt-gt.include.cpp", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" } }, { "c": ">", - "t": "source.cpp keyword.operator.comparison.cpp", + "t": "source.cpp meta.preprocessor.include.cpp string.quoted.other.lt-gt.include.cpp punctuation.definition.string.end.cpp", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", - "hc_black": "keyword.operator: #D4D4D4" + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" } }, { diff --git a/extensions/objective-c/build/update-grammars.js b/extensions/objective-c/build/update-grammars.js index 52dd76e06a1..5518bbcb033 100644 --- a/extensions/objective-c/build/update-grammars.js +++ b/extensions/objective-c/build/update-grammars.js @@ -6,6 +6,6 @@ var updateGrammar = require('../../../build/npm/update-grammar'); -updateGrammar.update('jeff-hykin/cpp-textmate-grammar', '/syntaxes/objc.tmLanguage.json', './syntaxes/objective-c.tmLanguage.json'); -updateGrammar.update('jeff-hykin/cpp-textmate-grammar', '/syntaxes/objcpp.tmLanguage.json', './syntaxes/objective-c++.tmLanguage.json'); +updateGrammar.update('jeff-hykin/cpp-textmate-grammar', '/syntaxes/objc.tmLanguage.json', './syntaxes/objective-c.tmLanguage.json', undefined, 'master', 'source/languages/cpp'); +updateGrammar.update('jeff-hykin/cpp-textmate-grammar', '/syntaxes/objcpp.tmLanguage.json', './syntaxes/objective-c++.tmLanguage.json', undefined, 'master', 'source/languages/cpp'); diff --git a/extensions/objective-c/cgmanifest.json b/extensions/objective-c/cgmanifest.json index f7f15ff638a..f33f55aad69 100644 --- a/extensions/objective-c/cgmanifest.json +++ b/extensions/objective-c/cgmanifest.json @@ -10,7 +10,7 @@ } }, "license": "MIT", - "version": "1.0.0", + "version": "1.12.11", "description": "The files syntaxes/objective-c.tmLanguage.json and syntaxes/objective-c++.tmLanguage.json were derived from the language package https://github.com/jeff-hykin/cpp-textmate-grammar." } ], From 28e07ec523f8fbdda98123b352416114dce0db62 Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 9 Jul 2019 11:41:32 +0200 Subject: [PATCH 1251/1449] fixes #76768 --- .../contrib/files/browser/fileActions.contribution.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts index 101acd25023..044c0db7733 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts @@ -23,7 +23,7 @@ import { ResourceContextKey } from 'vs/workbench/common/resources'; import { WorkbenchListDoubleSelection } from 'vs/platform/list/browser/listService'; import { URI } from 'vs/base/common/uri'; import { Schemas } from 'vs/base/common/network'; -import { SupportsWorkspacesContext, IsWebContext, RemoteFileDialogContext } from 'vs/workbench/browser/contextkeys'; +import { SupportsWorkspacesContext, IsWebContext, RemoteFileDialogContext, WorkspaceFolderCountContext } from 'vs/workbench/browser/contextkeys'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { OpenFileFolderAction, OpenLocalFileFolderCommand, OpenFileAction, OpenFolderAction, OpenLocalFileCommand, OpenLocalFolderCommand, OpenWorkspaceAction, SaveLocalFileCommand } from 'vs/workbench/browser/actions/workspaceActions'; @@ -262,8 +262,8 @@ appendToCommandPalette(COMPARE_WITH_SAVED_COMMAND_ID, { value: nls.localize('com appendToCommandPalette(REVEAL_IN_OS_COMMAND_ID, { value: REVEAL_IN_OS_LABEL, original: isWindows ? 'Reveal in Explorer' : isMacintosh ? 'Reveal in Finder' : 'Open Containing Folder' }, category); appendToCommandPalette(SAVE_FILE_AS_COMMAND_ID, { value: SAVE_FILE_AS_LABEL, original: 'Save As...' }, category); appendToCommandPalette(CLOSE_EDITOR_COMMAND_ID, { value: nls.localize('closeEditor', "Close Editor"), original: 'Close Editor' }, { value: nls.localize('view', "View"), original: 'View' }); -appendToCommandPalette(NEW_FILE_COMMAND_ID, { value: NEW_FILE_LABEL, original: 'New File' }, category); -appendToCommandPalette(NEW_FOLDER_COMMAND_ID, { value: NEW_FOLDER_LABEL, original: 'New Folder' }, category); +appendToCommandPalette(NEW_FILE_COMMAND_ID, { value: NEW_FILE_LABEL, original: 'New File' }, category, WorkspaceFolderCountContext.notEqualsTo('0')); +appendToCommandPalette(NEW_FOLDER_COMMAND_ID, { value: NEW_FOLDER_LABEL, original: 'New Folder' }, category, WorkspaceFolderCountContext.notEqualsTo('0')); appendToCommandPalette(DOWNLOAD_COMMAND_ID, { value: downloadLabel, original: 'Download' }, category, ContextKeyExpr.and(IsWebContext.toNegated(), ResourceContextKey.Scheme.notEqualsTo(Schemas.file))); // Menu registration - open editors From 077fb1b43044a1c568365581d8e18f3be23902c6 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 9 Jul 2019 11:33:16 +0200 Subject: [PATCH 1252/1449] only cache extension resources, #75061 --- .../browser/resourceServiceWorker.ts | 18 ++++++++++----- .../browser/resourceServiceWorkerClient.ts | 22 +++++++++++++++++-- .../browser/resourceServiceWorkerMain.ts | 4 ++++ 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/contrib/resources/browser/resourceServiceWorker.ts b/src/vs/workbench/contrib/resources/browser/resourceServiceWorker.ts index c2163194783..0e1667fff5e 100644 --- a/src/vs/workbench/contrib/resources/browser/resourceServiceWorker.ts +++ b/src/vs/workbench/contrib/resources/browser/resourceServiceWorker.ts @@ -17,7 +17,7 @@ const _pending = new Map(); export function handleMessageEvent(event: MessageEvent): void { const fn = _pending.get(event.data.token); if (fn) { - fn(event.data.data); + fn(event.data.data, event.data.isExtensionResource); _pending.delete(event.data.token); } } @@ -49,16 +49,24 @@ export async function handleFetchEvent(event: any): Promise { + _pending.set(token, (data: ArrayBuffer, isExtensionResource: boolean) => { clearTimeout(handle); const res = new Response(data, { status: 200, headers: { 'Content-Type': getMediaMime(URI.parse(url.query).path) || 'text/plain' } }); - caches.open(cacheName).then(cache => { - cache.put(event.request, res.clone()); + + if (!isExtensionResource) { + // only cache extension resources but not other + // resources, esp not workspace resources resolve(res); - }); + + } else { + caches.open(cacheName).then(cache => { + cache.put(event.request, res.clone()); + resolve(res); + }); + } }); const client = await clients.get(event.clientId); diff --git a/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerClient.ts b/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerClient.ts index a8d6c9ee756..b491ca9b447 100644 --- a/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerClient.ts +++ b/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerClient.ts @@ -9,6 +9,8 @@ import { URI } from 'vs/base/common/uri'; import { Registry } from 'vs/platform/registry/common/platform'; import { IWorkbenchContributionsRegistry, Extensions } from 'vs/workbench/common/contributions'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; +import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; +import { isEqualOrParent } from 'vs/base/common/resources'; class ResourceServiceWorker { @@ -16,6 +18,7 @@ class ResourceServiceWorker { constructor( @IFileService private readonly _fileService: IFileService, + @IExtensionService private readonly _extensionService: IExtensionService, ) { this._initServiceWorker(); this._initFetchHandler(); @@ -41,17 +44,32 @@ class ResourceServiceWorker { const fetchListener: (this: ServiceWorkerContainer, ev: MessageEvent) => void = event => { const uri = URI.parse(event.data.uri); - this._fileService.readFile(uri).then(file => { + + Promise.all([ + this._fileService.readFile(uri), + this._isExtensionResource(uri) + ]).then(([file, isExtensionResource]) => { + // todo@joh typings (event.source).postMessage({ token: event.data.token, - data: file.value.buffer.buffer + data: file.value.buffer.buffer, + isExtensionResource }, [file.value.buffer.buffer]); }); }; navigator.serviceWorker.addEventListener('message', fetchListener); this._disposables.add(toDisposable(() => navigator.serviceWorker.removeEventListener('message', fetchListener))); } + + private async _isExtensionResource(uri: URI): Promise { + for (const ext of await this._extensionService.getExtensions()) { + if (isEqualOrParent(uri, ext.extensionLocation)) { + return true; + } + } + return false; + } } Registry.as(Extensions.Workbench).registerWorkbenchContribution( diff --git a/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts b/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts index f1b1a56927c..3f57cf8824f 100644 --- a/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts +++ b/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts @@ -3,7 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +// trigger service worker updates +const VERSION = 2; + (function () { + type Handler = { handleFetchEvent(event: Event): Promise; handleMessageEvent(event: MessageEvent): void; From 9b0f7c03ca23073bb282d9112e8d81e10496d617 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 9 Jul 2019 12:05:08 +0200 Subject: [PATCH 1253/1449] async data tree: collapseByDefault per element related to #63566 --- src/vs/base/browser/ui/tree/asyncDataTree.ts | 46 ++++++++------ .../browser/ui/tree/asyncDataTree.test.ts | 60 +++++++++++++++++++ src/vs/platform/list/browser/listService.ts | 10 ++-- 3 files changed, 92 insertions(+), 24 deletions(-) diff --git a/src/vs/base/browser/ui/tree/asyncDataTree.ts b/src/vs/base/browser/ui/tree/asyncDataTree.ts index 6be40083966..6da67eeb800 100644 --- a/src/vs/base/browser/ui/tree/asyncDataTree.ts +++ b/src/vs/base/browser/ui/tree/asyncDataTree.ts @@ -28,6 +28,7 @@ interface IAsyncDataTreeNode { hasChildren: boolean; stale: boolean; slow: boolean; + collapsedByDefault: boolean | undefined; } interface IAsyncDataTreeNodeRequiredProps extends Partial> { @@ -42,7 +43,8 @@ function createAsyncDataTreeNode(props: IAsyncDataTreeNodeRequiredPro children: [], loading: false, stale: true, - slow: false + slow: false, + collapsedByDefault: undefined }; } @@ -243,10 +245,14 @@ function asObjectTreeOptions(options?: IAsyncDataTreeOpt function asTreeElement(node: IAsyncDataTreeNode, viewStateContext?: IAsyncDataTreeViewStateContext): ITreeElement> { let collapsed: boolean | undefined; - if (viewStateContext && viewStateContext.viewState.expanded && node.id) { - collapsed = viewStateContext.viewState.expanded.indexOf(node.id) === -1; + if (viewStateContext && viewStateContext.viewState.expanded && node.id && viewStateContext.viewState.expanded.indexOf(node.id) > -1) { + collapsed = false; + } else { + collapsed = node.collapsedByDefault; } + node.collapsedByDefault = undefined; + return { element: node, children: node.hasChildren ? Iterator.map(Iterator.fromArray(node.children), child => asTreeElement(child, viewStateContext)) : [], @@ -257,10 +263,11 @@ function asTreeElement(node: IAsyncDataTreeNode, viewState export interface IAsyncDataTreeOptionsUpdate extends IAbstractTreeOptionsUpdate { } -export interface IAsyncDataTreeOptions extends IAsyncDataTreeOptionsUpdate, IAbstractTreeOptions { - identityProvider?: IIdentityProvider; - sorter?: ITreeSorter; - autoExpandSingleChildren?: boolean; +export interface IAsyncDataTreeOptions extends IAsyncDataTreeOptionsUpdate, Pick, Exclude, 'collapseByDefault'>> { + readonly collapseByDefault?: { (e: T): boolean; }; + readonly identityProvider?: IIdentityProvider; + readonly sorter?: ITreeSorter; + readonly autoExpandSingleChildren?: boolean; } export interface IAsyncDataTreeViewState { @@ -287,6 +294,7 @@ export class AsyncDataTree implements IDisposable private readonly root: IAsyncDataTreeNode; private readonly nodes = new Map>(); private readonly sorter?: ITreeSorter; + private readonly collapseByDefault?: { (e: T): boolean; }; private readonly subTreeRefreshPromises = new Map, Promise>(); private readonly refreshPromises = new Map, CancelablePromise>(); @@ -331,6 +339,7 @@ export class AsyncDataTree implements IDisposable this.identityProvider = options.identityProvider; this.autoExpandSingleChildren = typeof options.autoExpandSingleChildren === 'undefined' ? false : options.autoExpandSingleChildren; this.sorter = options.sorter; + this.collapseByDefault = options.collapseByDefault; const objectTreeDelegate = new ComposedTreeDelegate>(delegate); const objectTreeRenderers = renderers.map(r => new DataTreeRenderer(r, this._onDidChangeNodeSlowState.event)); @@ -766,12 +775,10 @@ export class AsyncDataTree implements IDisposable const childrenToRefresh: IAsyncDataTreeNode[] = []; const children = childrenElements.map>(element => { + const hasChildren = !!this.dataSource.hasChildren(element); + if (!this.identityProvider) { - return createAsyncDataTreeNode({ - element, - parent: node, - hasChildren: !!this.dataSource.hasChildren(element) - }); + return createAsyncDataTreeNode({ element, parent: node, hasChildren }); } const id = this.identityProvider.getId(element).toString(); @@ -785,7 +792,7 @@ export class AsyncDataTree implements IDisposable this.nodes.set(element, asyncDataTreeNode); asyncDataTreeNode.element = element; - asyncDataTreeNode.hasChildren = !!this.dataSource.hasChildren(element); + asyncDataTreeNode.hasChildren = hasChildren; if (recursive) { if (childNode.collapsed) { @@ -793,17 +800,15 @@ export class AsyncDataTree implements IDisposable } else { childrenToRefresh.push(asyncDataTreeNode); } + } else if (hasChildren && this.collapseByDefault && !this.collapseByDefault(element)) { + asyncDataTreeNode.collapsedByDefault = false; + childrenToRefresh.push(asyncDataTreeNode); } return asyncDataTreeNode; } - const childAsyncDataTreeNode = createAsyncDataTreeNode({ - element, - parent: node, - id, - hasChildren: !!this.dataSource.hasChildren(element) - }); + const childAsyncDataTreeNode = createAsyncDataTreeNode({ element, parent: node, id, hasChildren }); if (viewStateContext && viewStateContext.viewState.focus && viewStateContext.viewState.focus.indexOf(id) > -1) { viewStateContext.focus.push(childAsyncDataTreeNode); @@ -815,6 +820,9 @@ export class AsyncDataTree implements IDisposable if (viewStateContext && viewStateContext.viewState.expanded && viewStateContext.viewState.expanded.indexOf(id) > -1) { childrenToRefresh.push(childAsyncDataTreeNode); + } else if (hasChildren && this.collapseByDefault && !this.collapseByDefault(element)) { + childAsyncDataTreeNode.collapsedByDefault = false; + childrenToRefresh.push(childAsyncDataTreeNode); } return childAsyncDataTreeNode; diff --git a/src/vs/base/test/browser/ui/tree/asyncDataTree.test.ts b/src/vs/base/test/browser/ui/tree/asyncDataTree.test.ts index 3c934126df9..dce3f4b369a 100644 --- a/src/vs/base/test/browser/ui/tree/asyncDataTree.test.ts +++ b/src/vs/base/test/browser/ui/tree/asyncDataTree.test.ts @@ -326,4 +326,64 @@ suite('AsyncDataTree', function () { assert(!hasClass(twistie, 'collapsed')); assert(tree.getNode(_('a')).collapsed); }); + + test('support default collapse state per element', async () => { + const container = document.createElement('div'); + container.style.width = '200px'; + container.style.height = '200px'; + + const delegate = new class implements IListVirtualDelegate { + getHeight() { return 20; } + getTemplateId(element: Element): string { return 'default'; } + }; + + const renderer = new class implements ITreeRenderer { + readonly templateId = 'default'; + renderTemplate(container: HTMLElement): HTMLElement { + return container; + } + renderElement(element: ITreeNode, index: number, templateData: HTMLElement): void { + templateData.textContent = element.element.id; + } + disposeTemplate(templateData: HTMLElement): void { + // noop + } + }; + + const getChildrenCalls: string[] = []; + const dataSource = new class implements IAsyncDataSource { + hasChildren(element: Element): boolean { + return !!element.children && element.children.length > 0; + } + getChildren(element: Element): Promise { + getChildrenCalls.push(element.id); + return Promise.resolve(element.children || []); + } + }; + + const identityProvider = new class implements IIdentityProvider { + getId(element: Element) { + return element.id; + } + }; + + const root: Element = { + id: 'root', + children: [{ + id: 'a', children: [{ id: 'aa' }, { id: 'ab' }, { id: 'ac' }] + }] + }; + + const _: (id: string) => Element = find.bind(null, root.children); + + const tree = new AsyncDataTree(container, delegate, [renderer], dataSource, { + identityProvider, + collapseByDefault: el => el.id !== 'a' + }); + tree.layout(200); + + await tree.setInput(root); + assert(!tree.getNode(_('a')).collapsed); + assert.deepStrictEqual(getChildrenCalls, ['root', 'a']); + }); }); \ No newline at end of file diff --git a/src/vs/platform/list/browser/listService.ts b/src/vs/platform/list/browser/listService.ts index 383cff04a94..6261e15b41d 100644 --- a/src/vs/platform/list/browser/listService.ts +++ b/src/vs/platform/list/browser/listService.ts @@ -858,15 +858,15 @@ export class WorkbenchAsyncDataTree extends Async } } -function workbenchTreeDataPreamble( +function workbenchTreeDataPreamble | IAsyncDataTreeOptions>( container: HTMLElement, - options: IAbstractTreeOptions, + options: TOptions, contextKeyService: IContextKeyService, themeService: IThemeService, configurationService: IConfigurationService, keybindingService: IKeybindingService, accessibilityService: IAccessibilityService, -): { options: IAbstractTreeOptions, getAutomaticKeyboardNavigation: () => boolean | undefined, disposable: IDisposable } { +): { options: TOptions, getAutomaticKeyboardNavigation: () => boolean | undefined, disposable: IDisposable } { WorkbenchListSupportsKeyboardNavigation.bindTo(contextKeyService); if (!didBindWorkbenchListAutomaticKeyboardNavigation) { @@ -907,7 +907,7 @@ function workbenchTreeDataPreamble( horizontalScrolling, openOnSingleClick, keyboardNavigationEventFilter: createKeyboardNavigationEventFilter(container, keybindingService) - } + } as TOptions }; } @@ -922,7 +922,7 @@ class WorkbenchTreeInternals { constructor( tree: WorkbenchObjectTree | WorkbenchDataTree | WorkbenchAsyncDataTree, - options: IAbstractTreeOptions, + options: IAbstractTreeOptions | IAsyncDataTreeOptions, getAutomaticKeyboardNavigation: () => boolean | undefined, @IContextKeyService contextKeyService: IContextKeyService, @IListService listService: IListService, From 144e913e2347b767d10cb37dcdf005bcfa479673 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 9 Jul 2019 09:20:59 +0200 Subject: [PATCH 1254/1449] Synchronize only attached models to the TM worker --- src/vs/editor/common/model.ts | 6 +++ src/vs/editor/common/model/textModel.ts | 9 ++++ .../electron-browser/textMateService.ts | 44 +++++++++++++++---- 3 files changed, 51 insertions(+), 8 deletions(-) diff --git a/src/vs/editor/common/model.ts b/src/vs/editor/common/model.ts index d2fa60c5640..989e5bc94a5 100644 --- a/src/vs/editor/common/model.ts +++ b/src/vs/editor/common/model.ts @@ -1116,6 +1116,12 @@ export interface ITextModel { * @internal */ onDidChangeTokens(listener: (e: IModelTokensChangedEvent) => void): IDisposable; + /** + * An event emitted when the model has been attached to the first editor or detached from the last editor. + * @event + * @internal + */ + onDidChangeAttached(listener: () => void): IDisposable; /** * An event emitted right before disposing the model. * @event diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index 1fc21244598..8d4fd05f31a 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -233,6 +233,9 @@ export class TextModel extends Disposable implements model.ITextModel { private readonly _onDidChangeOptions: Emitter = this._register(new Emitter()); public readonly onDidChangeOptions: Event = this._onDidChangeOptions.event; + private readonly _onDidChangeAttached: Emitter = this._register(new Emitter()); + public readonly onDidChangeAttached: Event = this._onDidChangeAttached.event; + private readonly _eventEmitter: DidChangeContentEmitter = this._register(new DidChangeContentEmitter()); public onDidChangeRawContentFast(listener: (e: ModelRawContentChangedEvent) => void): IDisposable { return this._eventEmitter.fastEvent((e: InternalModelContentChangeEvent) => listener(e.rawContentChangedEvent)); @@ -555,10 +558,16 @@ export class TextModel extends Disposable implements model.ITextModel { this._attachedEditorCount++; // Warm up tokens for the editor this._warmUpTokens(); + if (this._attachedEditorCount === 1) { + this._onDidChangeAttached.fire(undefined); + } } public onBeforeDetached(): void { this._attachedEditorCount--; + if (this._attachedEditorCount === 0) { + this._onDidChangeAttached.fire(undefined); + } } private _shouldAutoTokenize(): boolean { diff --git a/src/vs/workbench/services/textMate/electron-browser/textMateService.ts b/src/vs/workbench/services/textMate/electron-browser/textMateService.ts index 0eb7be9c3dc..d541fd73e4b 100644 --- a/src/vs/workbench/services/textMate/electron-browser/textMateService.ts +++ b/src/vs/workbench/services/textMate/electron-browser/textMateService.ts @@ -26,12 +26,44 @@ class ModelWorkerTextMateTokenizer extends Disposable { private readonly _worker: TextMateWorker; private readonly _model: ITextModel; + private _isSynced: boolean; constructor(worker: TextMateWorker, model: ITextModel) { super(); this._worker = worker; this._model = model; + this._isSynced = false; + this._register(this._model.onDidChangeAttached(() => this._onDidChangeAttached())); + this._onDidChangeAttached(); + + this._register(this._model.onDidChangeContent((e) => { + if (this._isSynced) { + this._worker.acceptModelChanged(this._model.uri.toString(), e); + } + })); + + this._register(this._model.onDidChangeLanguage((e) => { + if (this._isSynced) { + this._worker.acceptModelLanguageChanged(this._model.uri.toString(), this._model.getLanguageIdentifier().id); + } + })); + } + + private _onDidChangeAttached(): void { + if (this._model.isAttachedToEditor()) { + if (!this._isSynced) { + this._beginSync(); + } + } else { + if (this._isSynced) { + this._endSync(); + } + } + } + + private _beginSync(): void { + this._isSynced = true; this._worker.acceptNewModel({ uri: this._model.uri, versionId: this._model.getVersionId(), @@ -39,19 +71,15 @@ class ModelWorkerTextMateTokenizer extends Disposable { EOL: this._model.getEOL(), languageId: this._model.getLanguageIdentifier().id, }); + } - this._register(this._model.onDidChangeContent((e) => { - this._worker.acceptModelChanged(this._model.uri.toString(), e); - })); - - this._register(this._model.onDidChangeLanguage((e) => { - this._worker.acceptModelLanguageChanged(this._model.uri.toString(), this._model.getLanguageIdentifier().id); - })); + private _endSync(): void { + this._worker.acceptRemovedModel(this._model.uri.toString()); } public dispose() { super.dispose(); - this._worker.acceptRemovedModel(this._model.uri.toString()); + this._endSync(); } } From 1f86c323f507d21b01454ba10f4a8ea9be3ffe72 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 9 Jul 2019 12:10:49 +0200 Subject: [PATCH 1255/1449] Add support for calling back from web workers --- src/vs/base/common/types.ts | 25 ++++ src/vs/base/common/worker/simpleWorker.ts | 115 +++++++-------- .../common/services/editorSimpleWorker.ts | 136 ++++++++---------- .../services/editorWorkerServiceImpl.ts | 51 ++++--- src/vs/editor/common/services/webWorker.ts | 23 ++- src/vs/editor/editor.worker.ts | 6 +- .../services/editorSimpleWorker.test.ts | 7 +- src/vs/monaco.d.ts | 10 +- 8 files changed, 217 insertions(+), 156 deletions(-) diff --git a/src/vs/base/common/types.ts b/src/vs/base/common/types.ts index c3e24cc0a45..093523af512 100644 --- a/src/vs/base/common/types.ts +++ b/src/vs/base/common/types.ts @@ -169,6 +169,31 @@ export function getAllPropertyNames(obj: object): string[] { return res; } +export function getAllMethodNames(obj: object): string[] { + let methods: string[] = []; + for (const prop of getAllPropertyNames(obj)) { + if (typeof obj[prop] === 'function') { + methods.push(prop); + } + } + return methods; +} + +export function createProxyObject(methodNames: string[], invoke: (method: string, args: any[]) => any): T { + const createProxyMethod = (method: string): () => any => { + return function () { + const args = Array.prototype.slice.call(arguments, 0); + return invoke(method, args); + }; + }; + + let result = {} as T; + for (const methodName of methodNames) { + (result)[methodName] = createProxyMethod(methodName); + } + return result; +} + /** * Converts null to undefined, passes all other values through. */ diff --git a/src/vs/base/common/worker/simpleWorker.ts b/src/vs/base/common/worker/simpleWorker.ts index a0191ea7807..3772c910f41 100644 --- a/src/vs/base/common/worker/simpleWorker.ts +++ b/src/vs/base/common/worker/simpleWorker.ts @@ -6,7 +6,7 @@ import { transformErrorForSerialization } from 'vs/base/common/errors'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { isWeb } from 'vs/base/common/platform'; -import { getAllPropertyNames } from 'vs/base/common/types'; +import * as types from 'vs/base/common/types'; const INITIALIZE = '$initialize'; @@ -173,17 +173,22 @@ class SimpleWorkerProtocol { } } +export interface IWorkerClient { + getProxyObject(): Promise; + dispose(): void; +} + /** * Main thread side */ -export class SimpleWorkerClient extends Disposable { +export class SimpleWorkerClient extends Disposable implements IWorkerClient { - private _worker: IWorker; - private _onModuleLoaded: Promise; - private _protocol: SimpleWorkerProtocol; - private _lazyProxy: Promise; + private readonly _worker: IWorker; + private readonly _onModuleLoaded: Promise; + private readonly _protocol: SimpleWorkerProtocol; + private readonly _lazyProxy: Promise; - constructor(workerFactory: IWorkerFactory, moduleId: string) { + constructor(workerFactory: IWorkerFactory, moduleId: string, host: H) { super(); let lazyProxyReject: ((err: any) => void) | null = null; @@ -207,8 +212,15 @@ export class SimpleWorkerClient extends Disposable { this._worker.postMessage(msg); }, handleMessage: (method: string, args: any[]): Promise => { - // Intentionally not supporting worker -> main requests - return Promise.resolve(null); + if (typeof host[method] !== 'function') { + return Promise.reject(new Error('Missing method ' + method + ' on main thread host.')); + } + + try { + return Promise.resolve(host[method].apply(host, args)); + } catch (e) { + return Promise.reject(e); + } } }); this._protocol.setWorkerId(this._worker.getId()); @@ -223,41 +235,33 @@ export class SimpleWorkerClient extends Disposable { loaderConfiguration = (self).requirejs.s.contexts._.config; } + const hostMethods = types.getAllMethodNames(host); + // Send initialize message this._onModuleLoaded = this._protocol.sendMessage(INITIALIZE, [ this._worker.getId(), + loaderConfiguration, moduleId, - loaderConfiguration + hostMethods, ]); - this._lazyProxy = new Promise((resolve, reject) => { - lazyProxyReject = reject; - this._onModuleLoaded.then((availableMethods: string[]) => { - let proxy = {}; - for (const methodName of availableMethods) { - (proxy as any)[methodName] = createProxyMethod(methodName, proxyMethodRequest); - } - resolve(proxy); - }, (e) => { - reject(e); - this._onError('Worker failed to load ' + moduleId, e); - }); - }); - // Create proxy to loaded code const proxyMethodRequest = (method: string, args: any[]): Promise => { return this._request(method, args); }; - const createProxyMethod = (method: string, proxyMethodRequest: (method: string, args: any[]) => Promise): () => Promise => { - return function () { - let args = Array.prototype.slice.call(arguments, 0); - return proxyMethodRequest(method, args); - }; - }; + this._lazyProxy = new Promise((resolve, reject) => { + lazyProxyReject = reject; + this._onModuleLoaded.then((availableMethods: string[]) => { + resolve(types.createProxyObject(availableMethods, proxyMethodRequest)); + }, (e) => { + reject(e); + this._onError('Worker failed to load ' + moduleId, e); + }); + }); } - public getProxyObject(): Promise { + public getProxyObject(): Promise { return this._lazyProxy; } @@ -280,16 +284,22 @@ export interface IRequestHandler { [prop: string]: any; } +export interface IRequestHandlerFactory { + (host: H): IRequestHandler; +} + /** * Worker side */ -export class SimpleWorkerServer { +export class SimpleWorkerServer { + private _requestHandlerFactory: IRequestHandlerFactory | null; private _requestHandler: IRequestHandler | null; private _protocol: SimpleWorkerProtocol; - constructor(postSerializedMessage: (msg: string) => void, requestHandler: IRequestHandler | null) { - this._requestHandler = requestHandler; + constructor(postSerializedMessage: (msg: string) => void, requestHandlerFactory: IRequestHandlerFactory | null) { + this._requestHandlerFactory = requestHandlerFactory; + this._requestHandler = null; this._protocol = new SimpleWorkerProtocol({ sendMessage: (msg: string): void => { postSerializedMessage(msg); @@ -304,7 +314,7 @@ export class SimpleWorkerServer { private _handleMessage(method: string, args: any[]): Promise { if (method === INITIALIZE) { - return this.initialize(args[0], args[1], args[2]); + return this.initialize(args[0], args[1], args[2], args[3]); } if (!this._requestHandler || typeof this._requestHandler[method] !== 'function') { @@ -318,18 +328,19 @@ export class SimpleWorkerServer { } } - private initialize(workerId: number, moduleId: string, loaderConfig: any): Promise { + private initialize(workerId: number, loaderConfig: any, moduleId: string, hostMethods: string[]): Promise { this._protocol.setWorkerId(workerId); - if (this._requestHandler) { + const proxyMethodRequest = (method: string, args: any[]): Promise => { + return this._protocol.sendMessage(method, args); + }; + + const hostProxy = types.createProxyObject(hostMethods, proxyMethodRequest); + + if (this._requestHandlerFactory) { // static request handler - let methods: string[] = []; - for (const prop of getAllPropertyNames(this._requestHandler)) { - if (typeof this._requestHandler[prop] === 'function') { - methods.push(prop); - } - } - return Promise.resolve(methods); + this._requestHandler = this._requestHandlerFactory(hostProxy); + return Promise.resolve(types.getAllMethodNames(this._requestHandler)); } if (loaderConfig) { @@ -350,23 +361,15 @@ export class SimpleWorkerServer { return new Promise((resolve, reject) => { // Use the global require to be sure to get the global config - (self).require([moduleId], (...result: any[]) => { - let handlerModule = result[0]; - this._requestHandler = handlerModule.create(); + (self).require([moduleId], (module: { create: IRequestHandlerFactory }) => { + this._requestHandler = module.create(hostProxy); if (!this._requestHandler) { reject(new Error(`No RequestHandler!`)); return; } - let methods: string[] = []; - for (const prop of getAllPropertyNames(this._requestHandler)) { - if (typeof this._requestHandler[prop] === 'function') { - methods.push(prop); - } - } - - resolve(methods); + resolve(types.getAllMethodNames(this._requestHandler)); }, reject); }); } @@ -375,6 +378,6 @@ export class SimpleWorkerServer { /** * Called on the worker side */ -export function create(postMessage: (msg: string) => void): SimpleWorkerServer { +export function create(postMessage: (msg: string) => void): SimpleWorkerServer { return new SimpleWorkerServer(postMessage, null); } diff --git a/src/vs/editor/common/services/editorSimpleWorker.ts b/src/vs/editor/common/services/editorSimpleWorker.ts index a4c9dd6e8fd..06c11b3303e 100644 --- a/src/vs/editor/common/services/editorSimpleWorker.ts +++ b/src/vs/editor/common/services/editorSimpleWorker.ts @@ -22,7 +22,8 @@ import { ILinkComputerTarget, computeLinks } from 'vs/editor/common/modes/linkCo import { BasicInplaceReplace } from 'vs/editor/common/modes/supports/inplaceReplaceSupport'; import { IDiffComputationResult } from 'vs/editor/common/services/editorWorkerService'; import { createMonacoBaseAPI } from 'vs/editor/common/standalone/standaloneBase'; -import { getAllPropertyNames } from 'vs/base/common/types'; +import * as types from 'vs/base/common/types'; +import { EditorWorkerHost } from 'vs/editor/common/services/editorWorkerServiceImpl'; export interface IMirrorModel { readonly uri: URI; @@ -30,7 +31,11 @@ export interface IMirrorModel { getValue(): string; } -export interface IWorkerContext { +export interface IWorkerContext { + /** + * A proxy to the main thread host object. + */ + host: H; /** * Get all available mirror models in this worker. */ @@ -322,17 +327,53 @@ declare var require: any; /** * @internal */ -export abstract class BaseEditorSimpleWorker { +export class EditorSimpleWorker implements IRequestHandler, IDisposable { + _requestHandlerBrand: any; + + private readonly _host: EditorWorkerHost; + private _models: { [uri: string]: MirrorModel; }; private readonly _foreignModuleFactory: IForeignModuleFactory | null; private _foreignModule: any; - constructor(foreignModuleFactory: IForeignModuleFactory | null) { + constructor(host: EditorWorkerHost, foreignModuleFactory: IForeignModuleFactory | null) { + this._host = host; + this._models = Object.create(null); this._foreignModuleFactory = foreignModuleFactory; this._foreignModule = null; } - protected abstract _getModel(uri: string): ICommonModel; - protected abstract _getModels(): ICommonModel[]; + public dispose(): void { + this._models = Object.create(null); + } + + protected _getModel(uri: string): ICommonModel { + return this._models[uri]; + } + + private _getModels(): ICommonModel[] { + let all: MirrorModel[] = []; + Object.keys(this._models).forEach((key) => all.push(this._models[key])); + return all; + } + + public acceptNewModel(data: IRawModelData): void { + this._models[data.url] = new MirrorModel(URI.parse(data.url), data.lines, data.EOL, data.versionId); + } + + public acceptModelChanged(strURL: string, e: IModelChangedEvent): void { + if (!this._models[strURL]) { + return; + } + let model = this._models[strURL]; + model.onEvents(e); + } + + public acceptRemovedModel(strURL: string): void { + if (!this._models[strURL]) { + return; + } + delete this._models[strURL]; + } // ---- BEGIN diff -------------------------------------------------------------------------- @@ -440,7 +481,7 @@ export abstract class BaseEditorSimpleWorker { } // make sure diff won't take too long - if (Math.max(text.length, original.length) > BaseEditorSimpleWorker._diffLimit) { + if (Math.max(text.length, original.length) > EditorSimpleWorker._diffLimit) { result.push({ range, text }); continue; } @@ -503,7 +544,7 @@ export abstract class BaseEditorSimpleWorker { for ( let iter = model.createWordIterator(wordDefRegExp), e = iter.next(); - !e.done && suggestions.length <= BaseEditorSimpleWorker._suggestionsLimit; + !e.done && suggestions.length <= EditorSimpleWorker._suggestionsLimit; e = iter.next() ) { const word = e.value; @@ -591,8 +632,15 @@ export abstract class BaseEditorSimpleWorker { // ---- BEGIN foreign module support -------------------------------------------------------------------------- - public loadForeignModule(moduleId: string, createData: any): Promise { - let ctx: IWorkerContext = { + public loadForeignModule(moduleId: string, createData: any, foreignHostMethods: string[]): Promise { + const proxyMethodRequest = (method: string, args: any[]): Promise => { + return this._host.fhr(method, args); + }; + + const foreignHost = types.createProxyObject(foreignHostMethods, proxyMethodRequest); + + let ctx: IWorkerContext = { + host: foreignHost, getMirrorModels: (): IMirrorModel[] => { return this._getModels(); } @@ -601,27 +649,14 @@ export abstract class BaseEditorSimpleWorker { if (this._foreignModuleFactory) { this._foreignModule = this._foreignModuleFactory(ctx, createData); // static foreing module - let methods: string[] = []; - for (const prop of getAllPropertyNames(this._foreignModule)) { - if (typeof this._foreignModule[prop] === 'function') { - methods.push(prop); - } - } - return Promise.resolve(methods); + return Promise.resolve(types.getAllMethodNames(this._foreignModule)); } // ESM-comment-begin return new Promise((resolve, reject) => { require([moduleId], (foreignModule: { create: IForeignModuleFactory }) => { this._foreignModule = foreignModule.create(ctx, createData); - let methods: string[] = []; - for (const prop of getAllPropertyNames(this._foreignModule)) { - if (typeof this._foreignModule[prop] === 'function') { - methods.push(prop); - } - } - - resolve(methods); + resolve(types.getAllMethodNames(this._foreignModule)); }, reject); }); @@ -648,59 +683,12 @@ export abstract class BaseEditorSimpleWorker { // ---- END foreign module support -------------------------------------------------------------------------- } -/** - * @internal - */ -export class EditorSimpleWorkerImpl extends BaseEditorSimpleWorker implements IRequestHandler, IDisposable { - _requestHandlerBrand: any; - - private _models: { [uri: string]: MirrorModel; }; - - constructor(foreignModuleFactory: IForeignModuleFactory | null) { - super(foreignModuleFactory); - this._models = Object.create(null); - } - - public dispose(): void { - this._models = Object.create(null); - } - - protected _getModel(uri: string): ICommonModel { - return this._models[uri]; - } - - protected _getModels(): ICommonModel[] { - let all: MirrorModel[] = []; - Object.keys(this._models).forEach((key) => all.push(this._models[key])); - return all; - } - - public acceptNewModel(data: IRawModelData): void { - this._models[data.url] = new MirrorModel(URI.parse(data.url), data.lines, data.EOL, data.versionId); - } - - public acceptModelChanged(strURL: string, e: IModelChangedEvent): void { - if (!this._models[strURL]) { - return; - } - let model = this._models[strURL]; - model.onEvents(e); - } - - public acceptRemovedModel(strURL: string): void { - if (!this._models[strURL]) { - return; - } - delete this._models[strURL]; - } -} - /** * Called on the worker side * @internal */ -export function create(): IRequestHandler { - return new EditorSimpleWorkerImpl(null); +export function create(host: EditorWorkerHost): IRequestHandler { + return new EditorSimpleWorker(host, null); } // This is only available in a Web Worker diff --git a/src/vs/editor/common/services/editorWorkerServiceImpl.ts b/src/vs/editor/common/services/editorWorkerServiceImpl.ts index 592258cffe2..1d46cc3a263 100644 --- a/src/vs/editor/common/services/editorWorkerServiceImpl.ts +++ b/src/vs/editor/common/services/editorWorkerServiceImpl.ts @@ -6,7 +6,7 @@ import { IntervalTimer } from 'vs/base/common/async'; import { Disposable, IDisposable, dispose, toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; -import { SimpleWorkerClient, logOnceWebWorkerWarning } from 'vs/base/common/worker/simpleWorker'; +import { SimpleWorkerClient, logOnceWebWorkerWarning, IWorkerClient } from 'vs/base/common/worker/simpleWorker'; import { DefaultWorkerFactory } from 'vs/base/worker/defaultWorkerFactory'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IPosition, Position } from 'vs/editor/common/core/position'; @@ -15,7 +15,7 @@ import * as editorCommon from 'vs/editor/common/editorCommon'; import { ITextModel } from 'vs/editor/common/model'; import * as modes from 'vs/editor/common/modes'; import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; -import { EditorSimpleWorkerImpl } from 'vs/editor/common/services/editorSimpleWorker'; +import { EditorSimpleWorker } from 'vs/editor/common/services/editorSimpleWorker'; import { IDiffComputationResult, IEditorWorkerService } from 'vs/editor/common/services/editorWorkerService'; import { IModelService } from 'vs/editor/common/services/modelService'; import { ITextResourceConfigurationService } from 'vs/editor/common/services/resourceConfiguration'; @@ -224,12 +224,12 @@ class WorkerManager extends Disposable { class EditorModelManager extends Disposable { - private readonly _proxy: EditorSimpleWorkerImpl; + private readonly _proxy: EditorSimpleWorker; private readonly _modelService: IModelService; private _syncedModels: { [modelUrl: string]: IDisposable; } = Object.create(null); private _syncedModelsLastUsedTime: { [modelUrl: string]: number; } = Object.create(null); - constructor(proxy: EditorSimpleWorkerImpl, modelService: IModelService, keepIdleModels: boolean) { + constructor(proxy: EditorSimpleWorker, modelService: IModelService, keepIdleModels: boolean) { super(); this._proxy = proxy; this._modelService = modelService; @@ -319,11 +319,6 @@ class EditorModelManager extends Disposable { } } -interface IWorkerClient { - getProxyObject(): Promise; - dispose(): void; -} - class SynchronousWorkerClient implements IWorkerClient { private readonly _instance: T; private readonly _proxyObj: Promise; @@ -342,10 +337,24 @@ class SynchronousWorkerClient implements IWorkerClient } } +export class EditorWorkerHost { + + private readonly _workerClient: EditorWorkerClient; + + constructor(workerClient: EditorWorkerClient) { + this._workerClient = workerClient; + } + + // foreign host request + public fhr(method: string, args: any[]): Promise { + return this._workerClient.fhr(method, args); + } +} + export class EditorWorkerClient extends Disposable { private readonly _modelService: IModelService; - private _worker: IWorkerClient | null; + private _worker: IWorkerClient | null; private readonly _workerFactory: DefaultWorkerFactory; private _modelManager: EditorModelManager | null; @@ -357,37 +366,43 @@ export class EditorWorkerClient extends Disposable { this._modelManager = null; } - private _getOrCreateWorker(): IWorkerClient { + // foreign host request + public fhr(method: string, args: any[]): Promise { + throw new Error(`Not implemented!`); + } + + private _getOrCreateWorker(): IWorkerClient { if (!this._worker) { try { - this._worker = this._register(new SimpleWorkerClient( + this._worker = this._register(new SimpleWorkerClient( this._workerFactory, - 'vs/editor/common/services/editorSimpleWorker' + 'vs/editor/common/services/editorSimpleWorker', + new EditorWorkerHost(this) )); } catch (err) { logOnceWebWorkerWarning(err); - this._worker = new SynchronousWorkerClient(new EditorSimpleWorkerImpl(null)); + this._worker = new SynchronousWorkerClient(new EditorSimpleWorker(new EditorWorkerHost(this), null)); } } return this._worker; } - protected _getProxy(): Promise { + protected _getProxy(): Promise { return this._getOrCreateWorker().getProxyObject().then(undefined, (err) => { logOnceWebWorkerWarning(err); - this._worker = new SynchronousWorkerClient(new EditorSimpleWorkerImpl(null)); + this._worker = new SynchronousWorkerClient(new EditorSimpleWorker(new EditorWorkerHost(this), null)); return this._getOrCreateWorker().getProxyObject(); }); } - private _getOrCreateModelManager(proxy: EditorSimpleWorkerImpl): EditorModelManager { + private _getOrCreateModelManager(proxy: EditorSimpleWorker): EditorModelManager { if (!this._modelManager) { this._modelManager = this._register(new EditorModelManager(proxy, this._modelService, false)); } return this._modelManager; } - protected _withSyncedResources(resources: URI[]): Promise { + protected _withSyncedResources(resources: URI[]): Promise { return this._getProxy().then((proxy) => { this._getOrCreateModelManager(proxy).ensureSyncedResources(resources); return proxy; diff --git a/src/vs/editor/common/services/webWorker.ts b/src/vs/editor/common/services/webWorker.ts index a75cd977352..944be578f8e 100644 --- a/src/vs/editor/common/services/webWorker.ts +++ b/src/vs/editor/common/services/webWorker.ts @@ -6,6 +6,7 @@ import { URI } from 'vs/base/common/uri'; import { EditorWorkerClient } from 'vs/editor/common/services/editorWorkerServiceImpl'; import { IModelService } from 'vs/editor/common/services/modelService'; +import * as types from 'vs/base/common/types'; /** * Create a new web worker that has model syncing capabilities built in. @@ -48,11 +49,16 @@ export interface IWebWorkerOptions { * A label to be used to identify the web worker for debugging purposes. */ label?: string; + /** + * An object that can be used by the web worker to make calls back to the main thread. + */ + host?: object; } class MonacoWebWorkerImpl extends EditorWorkerClient implements MonacoWebWorker { private readonly _foreignModuleId: string; + private readonly _foreignModuleHost: object | null; private _foreignModuleCreateData: any | null; private _foreignProxy: Promise | null; @@ -60,13 +66,28 @@ class MonacoWebWorkerImpl extends EditorWorkerClient implements MonacoWebWork super(modelService, opts.label); this._foreignModuleId = opts.moduleId; this._foreignModuleCreateData = opts.createData || null; + this._foreignModuleHost = opts.host || null; this._foreignProxy = null; } + // foreign host request + public fhr(method: string, args: any[]): Promise { + if (!this._foreignModuleHost || typeof this._foreignModuleHost[method] !== 'function') { + return Promise.reject(new Error('Missing method ' + method + ' or missing main thread foreign host.')); + } + + try { + return Promise.resolve(this._foreignModuleHost[method].apply(this._foreignModuleHost, args)); + } catch (e) { + return Promise.reject(e); + } + } + private _getForeignProxy(): Promise { if (!this._foreignProxy) { this._foreignProxy = this._getProxy().then((proxy) => { - return proxy.loadForeignModule(this._foreignModuleId, this._foreignModuleCreateData).then((foreignMethods) => { + const foreignHostMethods = this._foreignModuleHost ? types.getAllMethodNames(this._foreignModuleHost) : []; + return proxy.loadForeignModule(this._foreignModuleId, this._foreignModuleCreateData, foreignHostMethods).then((foreignMethods) => { this._foreignModuleCreateData = null; const proxyMethodRequest = (method: string, args: any[]): Promise => { diff --git a/src/vs/editor/editor.worker.ts b/src/vs/editor/editor.worker.ts index 41140026a47..4586cafab31 100644 --- a/src/vs/editor/editor.worker.ts +++ b/src/vs/editor/editor.worker.ts @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { SimpleWorkerServer } from 'vs/base/common/worker/simpleWorker'; -import { EditorSimpleWorkerImpl } from 'vs/editor/common/services/editorSimpleWorker'; +import { EditorSimpleWorker } from 'vs/editor/common/services/editorSimpleWorker'; +import { EditorWorkerHost } from 'vs/editor/common/services/editorWorkerServiceImpl'; let initialized = false; @@ -14,10 +15,9 @@ export function initialize(foreignModule: any) { } initialized = true; - const editorWorker = new EditorSimpleWorkerImpl(foreignModule); const simpleWorker = new SimpleWorkerServer((msg) => { (self).postMessage(msg); - }, editorWorker); + }, (host: EditorWorkerHost) => new EditorSimpleWorker(host, foreignModule)); self.onmessage = (e) => { simpleWorker.onmessage(e.data); diff --git a/src/vs/editor/test/common/services/editorSimpleWorker.test.ts b/src/vs/editor/test/common/services/editorSimpleWorker.test.ts index 43726f59e04..8ea09048b02 100644 --- a/src/vs/editor/test/common/services/editorSimpleWorker.test.ts +++ b/src/vs/editor/test/common/services/editorSimpleWorker.test.ts @@ -5,11 +5,12 @@ import * as assert from 'assert'; import { Range } from 'vs/editor/common/core/range'; -import { EditorSimpleWorkerImpl, ICommonModel } from 'vs/editor/common/services/editorSimpleWorker'; +import { EditorSimpleWorker, ICommonModel } from 'vs/editor/common/services/editorSimpleWorker'; +import { EditorWorkerHost } from 'vs/editor/common/services/editorWorkerServiceImpl'; suite('EditorSimpleWorker', () => { - class WorkerWithModels extends EditorSimpleWorkerImpl { + class WorkerWithModels extends EditorSimpleWorker { getModel(uri: string) { return this._getModel(uri); @@ -31,7 +32,7 @@ suite('EditorSimpleWorker', () => { let model: ICommonModel; setup(() => { - worker = new WorkerWithModels(null); + worker = new WorkerWithModels(null!, null); model = worker.addModel([ 'This is line one', //16 'and this is line number two', //27 diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index a1b4a10a6a4..0cedc1d3428 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -986,6 +986,10 @@ declare namespace monaco.editor { * A label to be used to identify the web worker for debugging purposes. */ label?: string; + /** + * An object that can be used by the web worker to make calls back to the main thread. + */ + host?: object; } /** @@ -5643,7 +5647,11 @@ declare namespace monaco.worker { getValue(): string; } - export interface IWorkerContext { + export interface IWorkerContext { + /** + * A proxy to the main thread host object. + */ + host: H; /** * Get all available mirror models in this worker. */ From 66dc7a11b709c9353d6bb2fd144c7e088ad35ecf Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 9 Jul 2019 12:23:26 +0200 Subject: [PATCH 1256/1449] Create TM grammars on the web worker --- .../browser/abstractTextMateService.ts | 2 +- .../electron-browser/textMateService.ts | 15 +++++++++++++++ .../electron-browser/textMateWorker.ts | 18 +++++++++--------- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts b/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts index db27997d72c..1259cec8914 100644 --- a/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts +++ b/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts @@ -47,7 +47,7 @@ export abstract class AbstractTextMateService extends Disposable implements ITex constructor( @IModeService private readonly _modeService: IModeService, @IWorkbenchThemeService private readonly _themeService: IWorkbenchThemeService, - @IFileService private readonly _fileService: IFileService, + @IFileService protected readonly _fileService: IFileService, @INotificationService private readonly _notificationService: INotificationService, @ILogService private readonly _logService: ILogService, @IConfigurationService private readonly _configurationService: IConfigurationService diff --git a/src/vs/workbench/services/textMate/electron-browser/textMateService.ts b/src/vs/workbench/services/textMate/electron-browser/textMateService.ts index d541fd73e4b..d86016f64ee 100644 --- a/src/vs/workbench/services/textMate/electron-browser/textMateService.ts +++ b/src/vs/workbench/services/textMate/electron-browser/textMateService.ts @@ -19,6 +19,7 @@ import { IValidGrammarDefinition } from 'vs/workbench/services/textMate/common/T import { TextMateWorker } from 'vs/workbench/services/textMate/electron-browser/textMateWorker'; import { ITextModel } from 'vs/editor/common/model'; import { Disposable } from 'vs/base/common/lifecycle'; +import { UriComponents, URI } from 'vs/base/common/uri'; const RUN_TEXTMATE_IN_WORKER = false; @@ -83,6 +84,18 @@ class ModelWorkerTextMateTokenizer extends Disposable { } } +export class TextMateWorkerHost { + + constructor(@IFileService private readonly _fileService: IFileService) { + } + + async readFile(_resource: UriComponents): Promise { + const resource = URI.revive(_resource); + const content = await this._fileService.readFile(resource); + return content.value.toString(); + } +} + export class TextMateService extends AbstractTextMateService { private _worker: MonacoWebWorker | null; @@ -139,12 +152,14 @@ export class TextMateService extends AbstractTextMateService { this._killWorker(); if (RUN_TEXTMATE_IN_WORKER) { + const workerHost = new TextMateWorkerHost(this._fileService); const worker = createWebWorker(this._modelService, { createData: { grammarDefinitions }, label: 'textMateWorker', moduleId: 'vs/workbench/services/textMate/electron-browser/textMateWorker', + host: workerHost }); this._worker = worker; diff --git a/src/vs/workbench/services/textMate/electron-browser/textMateWorker.ts b/src/vs/workbench/services/textMate/electron-browser/textMateWorker.ts index ac231c2bece..27361f4835e 100644 --- a/src/vs/workbench/services/textMate/electron-browser/textMateWorker.ts +++ b/src/vs/workbench/services/textMate/electron-browser/textMateWorker.ts @@ -9,6 +9,7 @@ import { LanguageId } from 'vs/editor/common/modes'; import { IValidEmbeddedLanguagesMap, IValidTokenTypeMap, IValidGrammarDefinition } from 'vs/workbench/services/textMate/common/TMScopeRegistry'; import { TMGrammarFactory, ICreateGrammarResult } from 'vs/workbench/services/textMate/common/TMGrammarFactory'; import { IModelChangedEvent, MirrorTextModel } from 'vs/editor/common/model/mirrorTextModel'; +import { TextMateWorkerHost } from 'vs/workbench/services/textMate/electron-browser/textMateService'; export interface IValidGrammarDefinitionDTO { location: UriComponents; @@ -49,20 +50,21 @@ class TextMateWorkerModel extends MirrorTextModel { } private _resetTokenization(): void { - console.log(this._worker, this._languageId); - // this._worker.getOrCreateGrammar(this._languageId).then((r) => { - // console.log(r); - // }); + this._worker.getOrCreateGrammar(this._languageId).then((r) => { + console.log(r); + }); } } export class TextMateWorker { + private readonly _host: TextMateWorkerHost; private readonly _models: { [uri: string]: TextMateWorkerModel; }; private readonly _grammarCache: Promise[]; private readonly _grammarFactory: TMGrammarFactory; - constructor(ctx: IWorkerContext, createData: ICreateData) { + constructor(ctx: IWorkerContext, createData: ICreateData) { + this._host = ctx.host; this._models = Object.create(null); this._grammarCache = []; const grammarDefinitions = createData.grammarDefinitions.map((def) => { @@ -91,9 +93,7 @@ export class TextMateWorker { this._grammarFactory = new TMGrammarFactory({ logTrace: (msg: string) => console.log(msg), logError: (msg: string, err: any) => console.error(msg, err), - readFile: async (resource: URI) => { - throw new Error(`Not implemented!`); - } + readFile: (resource: URI) => this._host.readFile(resource) }, grammarDefinitions, vscodeTextmate, undefined); } @@ -123,6 +123,6 @@ export class TextMateWorker { } } -export function create(ctx: IWorkerContext, createData: ICreateData): TextMateWorker { +export function create(ctx: IWorkerContext, createData: ICreateData): TextMateWorker { return new TextMateWorker(ctx, createData); } From 3b9d26ded95c87dc46baf1182dde7d655cf56134 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 9 Jul 2019 12:28:00 +0200 Subject: [PATCH 1257/1449] #76442 fix implicit any --- .../configuration/common/configuration.ts | 2 +- .../common/configurationModels.ts | 6 +- .../common/configurationRegistry.ts | 10 +-- .../environment/common/environment.ts | 1 + .../common/extensionManagement.ts | 2 +- .../node/extensionGalleryService.ts | 15 ++-- .../api/browser/mainThreadConfiguration.ts | 2 +- .../api/browser/mainThreadTreeViews.ts | 2 +- .../workbench/api/common/extHost.protocol.ts | 2 +- .../api/common/extHostConfiguration.ts | 12 ++- .../workbench/api/common/extHostTreeViews.ts | 6 +- .../browser/parts/views/viewsViewlet.ts | 8 +- .../electron-browser/extensionEditor.ts | 2 +- .../extensionsTipsService.test.ts | 6 +- .../extensionsWorkbenchService.test.ts | 6 +- .../browser/localizations.contribution.ts | 4 +- .../preferences/browser/keybindingsEditor.ts | 6 +- .../electron-browser/telemetryOptOut.ts | 2 +- .../keybinding/common/keybindingEditing.ts | 4 +- .../common/keybindingsEditorModel.ts | 6 +- .../common/keybindingsEditorModel.test.ts | 84 +++++++++---------- .../workspaceEditingService.ts | 2 +- .../api/extHostConfiguration.test.ts | 8 +- 23 files changed, 103 insertions(+), 95 deletions(-) diff --git a/src/vs/platform/configuration/common/configuration.ts b/src/vs/platform/configuration/common/configuration.ts index e9758098d43..22a97c872cd 100644 --- a/src/vs/platform/configuration/common/configuration.ts +++ b/src/vs/platform/configuration/common/configuration.ts @@ -148,7 +148,7 @@ export function toOverrides(raw: any, conflictReporter: (message: string) => voi const configurationProperties = Registry.as(Extensions.Configuration).getConfigurationProperties(); for (const key of Object.keys(raw)) { if (OVERRIDE_PROPERTY_PATTERN.test(key)) { - const overrideRaw = {}; + const overrideRaw: any = {}; for (const keyInOverrideRaw in raw[key]) { if (configurationProperties[keyInOverrideRaw] && configurationProperties[keyInOverrideRaw].overridable) { overrideRaw[keyInOverrideRaw] = raw[key][keyInOverrideRaw]; diff --git a/src/vs/platform/configuration/common/configurationModels.ts b/src/vs/platform/configuration/common/configurationModels.ts index fcbe019f5d0..1765a06822f 100644 --- a/src/vs/platform/configuration/common/configurationModels.ts +++ b/src/vs/platform/configuration/common/configurationModels.ts @@ -53,7 +53,7 @@ export class ConfigurationModel implements IConfigurationModel { return this; } - let contents = {}; + let contents: any = {}; for (const key of arrays.distinct([...Object.keys(this.contents), ...Object.keys(overrideContents)])) { let contentsForKey = this.contents[key]; @@ -296,8 +296,8 @@ export class ConfigurationModelParser { return { contents, keys, overrides }; } - private filterByScope(properties: {}, configurationProperties: { [qualifiedKey: string]: IConfigurationPropertySchema }, filterOverriddenProperties: boolean, scopes: ConfigurationScope[]): {} { - const result = {}; + private filterByScope(properties: any, configurationProperties: { [qualifiedKey: string]: IConfigurationPropertySchema }, filterOverriddenProperties: boolean, scopes: ConfigurationScope[]): {} { + const result: any = {}; for (let key in properties) { if (OVERRIDE_PROPERTY_PATTERN.test(key) && filterOverriddenProperties) { result[key] = this.filterByScope(properties[key], configurationProperties, false, scopes); diff --git a/src/vs/platform/configuration/common/configurationRegistry.ts b/src/vs/platform/configuration/common/configurationRegistry.ts index 1752c23aa2e..0d27f890edf 100644 --- a/src/vs/platform/configuration/common/configurationRegistry.ts +++ b/src/vs/platform/configuration/common/configurationRegistry.ts @@ -470,13 +470,13 @@ export function validateProperty(property: string): string | null { return null; } -export function getScopes(): { [key: string]: ConfigurationScope } { - const scopes = {}; +export function getScopes(): [string, ConfigurationScope | undefined][] { + const scopes: [string, ConfigurationScope | undefined][] = []; const configurationProperties = configurationRegistry.getConfigurationProperties(); for (const key of Object.keys(configurationProperties)) { - scopes[key] = configurationProperties[key].scope; + scopes.push([key, configurationProperties[key].scope]); } - scopes['launch'] = ConfigurationScope.RESOURCE; - scopes['task'] = ConfigurationScope.RESOURCE; + scopes.push(['launch', ConfigurationScope.RESOURCE]); + scopes.push(['task', ConfigurationScope.RESOURCE]); return scopes; } diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index 676b656049e..05f69e90208 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -25,6 +25,7 @@ export interface ParsedArgs { 'reuse-window'?: boolean; locale?: string; 'user-data-dir'?: string; + 'web-user-data-dir'?: string; 'prof-startup'?: string; 'prof-startup-prefix'?: string; 'prof-append-timers'?: string; diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index 833fedd1fcc..ad60965cfd1 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -35,7 +35,7 @@ export interface IGalleryExtensionAssets { repository: IGalleryExtensionAsset | null; download: IGalleryExtensionAsset; icon: IGalleryExtensionAsset; - coreTranslations: { [languageId: string]: IGalleryExtensionAsset }; + coreTranslations: [string, IGalleryExtensionAsset][]; } export function isIExtensionIdentifier(thing: any): thing is IExtensionIdentifier { diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts index 473b0af7e6b..77ed9973c5d 100644 --- a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts @@ -202,13 +202,16 @@ function getStatistic(statistics: IRawGalleryExtensionStatistics[], name: string return result ? result.value : 0; } -function getCoreTranslationAssets(version: IRawGalleryExtensionVersion): { [languageId: string]: IGalleryExtensionAsset } { +function getCoreTranslationAssets(version: IRawGalleryExtensionVersion): [string, IGalleryExtensionAsset][] { const coreTranslationAssetPrefix = 'Microsoft.VisualStudio.Code.Translation.'; const result = version.files.filter(f => f.assetType.indexOf(coreTranslationAssetPrefix) === 0); - return result.reduce((result, file) => { - result[file.assetType.substring(coreTranslationAssetPrefix.length)] = getVersionAsset(version, file.assetType); + return result.reduce<[string, IGalleryExtensionAsset][]>((result, file) => { + const asset = getVersionAsset(version, file.assetType); + if (asset) { + result.push([file.assetType.substring(coreTranslationAssetPrefix.length), asset]); + } return result; - }, {}); + }, []); } function getRepositoryAsset(version: IRawGalleryExtensionVersion): IGalleryExtensionAsset | null { @@ -576,9 +579,9 @@ export class ExtensionGalleryService implements IExtensionGalleryService { } getCoreTranslation(extension: IGalleryExtension, languageId: string): Promise { - const asset = extension.assets.coreTranslations[languageId.toUpperCase()]; + const asset = extension.assets.coreTranslations.filter(t => t[0] === languageId.toUpperCase())[0]; if (asset) { - return this.getAsset(asset) + return this.getAsset(asset[1]) .then(asText) .then(JSON.parse); } diff --git a/src/vs/workbench/api/browser/mainThreadConfiguration.ts b/src/vs/workbench/api/browser/mainThreadConfiguration.ts index c997310906b..526c57f2464 100644 --- a/src/vs/workbench/api/browser/mainThreadConfiguration.ts +++ b/src/vs/workbench/api/browser/mainThreadConfiguration.ts @@ -33,7 +33,7 @@ export class MainThreadConfiguration implements MainThreadConfigurationShape { } private _getConfigurationData(): IConfigurationInitData { - const configurationData: IConfigurationInitData = { ...(this.configurationService.getConfigurationData()!), configurationScopes: {} }; + const configurationData: IConfigurationInitData = { ...(this.configurationService.getConfigurationData()!), configurationScopes: [] }; // Send configurations scopes only in development mode. if (!this._environmentService.isBuilt || this._environmentService.isExtensionDevelopment) { configurationData.configurationScopes = getScopes(); diff --git a/src/vs/workbench/api/browser/mainThreadTreeViews.ts b/src/vs/workbench/api/browser/mainThreadTreeViews.ts index ba23ab500c8..7a18271ff58 100644 --- a/src/vs/workbench/api/browser/mainThreadTreeViews.ts +++ b/src/vs/workbench/api/browser/mainThreadTreeViews.ts @@ -205,7 +205,7 @@ class TreeViewDataProvider implements ITreeViewDataProvider { if (current) { const properties = distinct([...Object.keys(current), ...Object.keys(treeItem)]); for (const property of properties) { - current[property] = treeItem[property]; + (current)[property] = (treeItem)[property]; } } } diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 28af0f381b7..0bdb48ef1c2 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -91,7 +91,7 @@ export interface IInitData { } export interface IConfigurationInitData extends IConfigurationData { - configurationScopes: { [key: string]: ConfigurationScope }; + configurationScopes: [string, ConfigurationScope | undefined][]; } export interface IWorkspaceConfigurationChangeEventData { diff --git a/src/vs/workbench/api/common/extHostConfiguration.ts b/src/vs/workbench/api/common/extHostConfiguration.ts index a0a0f690c7e..4c8515502df 100644 --- a/src/vs/workbench/api/common/extHostConfiguration.ts +++ b/src/vs/workbench/api/common/extHostConfiguration.ts @@ -71,14 +71,14 @@ export class ExtHostConfigProvider { private readonly _onDidChangeConfiguration = new Emitter(); private readonly _proxy: MainThreadConfigurationShape; private readonly _extHostWorkspace: ExtHostWorkspace; - private _configurationScopes: { [key: string]: ConfigurationScope }; + private _configurationScopes: Map; private _configuration: Configuration; constructor(proxy: MainThreadConfigurationShape, extHostWorkspace: ExtHostWorkspace, data: IConfigurationInitData) { this._proxy = proxy; this._extHostWorkspace = extHostWorkspace; this._configuration = ExtHostConfigProvider.parse(data); - this._configurationScopes = data.configurationScopes; + this._configurationScopes = this._toMap(data.configurationScopes); } get onDidChangeConfiguration(): Event { @@ -87,7 +87,7 @@ export class ExtHostConfigProvider { $acceptConfigurationChanged(data: IConfigurationInitData, eventData: IWorkspaceConfigurationChangeEventData) { this._configuration = ExtHostConfigProvider.parse(data); - this._configurationScopes = data.configurationScopes; + this._configurationScopes = this._toMap(data.configurationScopes); this._onDidChangeConfiguration.fire(this._toConfigurationChangeEvent(eventData)); } @@ -225,7 +225,7 @@ export class ExtHostConfigProvider { } private _validateConfigurationAccess(key: string, resource: URI | undefined, extensionId?: ExtensionIdentifier): void { - const scope = OVERRIDE_PROPERTY_PATTERN.test(key) ? ConfigurationScope.RESOURCE : this._configurationScopes[key]; + const scope = OVERRIDE_PROPERTY_PATTERN.test(key) ? ConfigurationScope.RESOURCE : this._configurationScopes.get(key); const extensionIdText = extensionId ? `[${extensionId.value}] ` : ''; if (ConfigurationScope.RESOURCE === scope) { if (resource === undefined) { @@ -255,6 +255,10 @@ export class ExtHostConfigProvider { }); } + private _toMap(scopes: [string, ConfigurationScope | undefined][]): Map { + return scopes.reduce((result, scope) => { result.set(scope[0], scope[1]); return result; }, new Map()); + } + private static parse(data: IConfigurationData): Configuration { const defaultConfiguration = ExtHostConfigProvider.parseConfigurationModel(data.defaults); const userConfiguration = ExtHostConfigProvider.parseConfigurationModel(data.user); diff --git a/src/vs/workbench/api/common/extHostTreeViews.ts b/src/vs/workbench/api/common/extHostTreeViews.ts index 0524871953a..bd3b82994d5 100644 --- a/src/vs/workbench/api/common/extHostTreeViews.ts +++ b/src/vs/workbench/api/common/extHostTreeViews.ts @@ -502,14 +502,14 @@ class ExtHostTreeView extends Disposable { || extensionTreeItem.iconPath instanceof URI) { return this.getIconPath(extensionTreeItem.iconPath); } - return this.getIconPath(extensionTreeItem.iconPath['light']); + return this.getIconPath((<{ light: string | URI; dark: string | URI }>extensionTreeItem.iconPath).light); } return undefined; } private getDarkIconPath(extensionTreeItem: vscode.TreeItem): URI | undefined { - if (extensionTreeItem.iconPath && !(extensionTreeItem.iconPath instanceof ThemeIcon) && extensionTreeItem.iconPath['dark']) { - return this.getIconPath(extensionTreeItem.iconPath['dark']); + if (extensionTreeItem.iconPath && !(extensionTreeItem.iconPath instanceof ThemeIcon) && (<{ light: string | URI; dark: string | URI }>extensionTreeItem.iconPath).dark) { + return this.getIconPath((<{ light: string | URI; dark: string | URI }>extensionTreeItem.iconPath).dark); } return undefined; } diff --git a/src/vs/workbench/browser/parts/views/viewsViewlet.ts b/src/vs/workbench/browser/parts/views/viewsViewlet.ts index a9e156fdefc..711c98c4755 100644 --- a/src/vs/workbench/browser/parts/views/viewsViewlet.ts +++ b/src/vs/workbench/browser/parts/views/viewsViewlet.ts @@ -295,18 +295,18 @@ export abstract class ViewContainerViewlet extends PanelViewlet implements IView this.resizePanel(panel, size); } else { initialSizes = initialSizes ? initialSizes : this.computeInitialSizes(); - this.resizePanel(panel, initialSizes[panel.id] || 200); + this.resizePanel(panel, initialSizes.get(panel.id) || 200); } } } } - private computeInitialSizes(): { [id: string]: number } { - let sizes = {}; + private computeInitialSizes(): Map { + const sizes: Map = new Map(); if (this.dimension) { const totalWeight = this.viewsModel.visibleViewDescriptors.reduce((totalWeight, { weight }) => totalWeight + (weight || 20), 0); for (const viewDescriptor of this.viewsModel.visibleViewDescriptors) { - sizes[viewDescriptor.id] = this.dimension.height * (viewDescriptor.weight || 20) / totalWeight; + sizes.set(viewDescriptor.id, this.dimension.height * (viewDescriptor.weight || 20) / totalWeight); } } return sizes; diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts index e536b6d9376..08929e250d5 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts @@ -674,7 +674,7 @@ export class ExtensionEditor extends BaseEditor { private renderSettings(container: HTMLElement, manifest: IExtensionManifest, onDetailsToggle: Function): boolean { const contributes = manifest.contributes; const configuration = contributes && contributes.configuration; - let properties = {}; + let properties: any = {}; if (Array.isArray(configuration)) { configuration.forEach(config => { properties = { ...properties, ...config.properties }; 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 90b0616f421..a57f2f12f64 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 @@ -73,7 +73,7 @@ const mockExtensionGallery: IGalleryExtension[] = [ icon: { uri: 'uri:icon', fallbackUri: 'fallback:icon' }, license: { uri: 'uri:license', fallbackUri: 'fallback:license' }, repository: { uri: 'uri:repository', fallbackUri: 'fallback:repository' }, - coreTranslations: {} + coreTranslations: [] }), aGalleryExtension('MockExtension2', { displayName: 'Mock Extension 2', @@ -95,7 +95,7 @@ const mockExtensionGallery: IGalleryExtension[] = [ icon: { uri: 'uri:icon', fallbackUri: 'fallback:icon' }, license: { uri: 'uri:license', fallbackUri: 'fallback:license' }, repository: { uri: 'uri:repository', fallbackUri: 'fallback:repository' }, - coreTranslations: {} + coreTranslations: [] }) ]; @@ -154,7 +154,7 @@ const noAssets: IGalleryExtensionAssets = { manifest: null, readme: null, repository: null, - coreTranslations: null! + coreTranslations: [] }; function aGalleryExtension(name: string, properties: any = {}, galleryExtensionProperties: any = {}, assets: IGalleryExtensionAssets = noAssets): IGalleryExtension { 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 adfaf8b1aa8..783230407cc 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 @@ -129,7 +129,7 @@ suite('ExtensionsWorkbenchServiceTest', () => { icon: { uri: 'uri:icon', fallbackUri: 'fallback:icon' }, license: { uri: 'uri:license', fallbackUri: 'fallback:license' }, repository: { uri: 'uri:repository', fallbackUri: 'fallback:repository' }, - coreTranslations: {} + coreTranslations: [] }); testObject = await aWorkbenchService(); @@ -279,7 +279,7 @@ suite('ExtensionsWorkbenchServiceTest', () => { icon: { uri: 'uri:icon', fallbackUri: 'fallback:icon' }, license: { uri: 'uri:license', fallbackUri: 'fallback:license' }, repository: { uri: 'uri:repository', fallbackUri: 'fallback:repository' }, - coreTranslations: {} + coreTranslations: [] }); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local1, local2]); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery1)); @@ -968,7 +968,7 @@ suite('ExtensionsWorkbenchServiceTest', () => { manifest: null, readme: null, repository: null, - coreTranslations: null! + coreTranslations: [] }; function aGalleryExtension(name: string, properties: any = {}, galleryExtensionProperties: any = {}, assets: IGalleryExtensionAssets = noAssets): IGalleryExtension { diff --git a/src/vs/workbench/contrib/localizations/browser/localizations.contribution.ts b/src/vs/workbench/contrib/localizations/browser/localizations.contribution.ts index 14d37470b81..0ab7785ff31 100644 --- a/src/vs/workbench/contrib/localizations/browser/localizations.contribution.ts +++ b/src/vs/workbench/contrib/localizations/browser/localizations.contribution.ts @@ -132,11 +132,11 @@ export class LocalizationWorkbenchContribution extends Disposable implements IWo const loc = manifest && manifest.contributes && manifest.contributes.localizations && manifest.contributes.localizations.filter(x => x.languageId.toLowerCase() === locale)[0]; const languageName = loc ? (loc.languageName || locale) : locale; const languageDisplayName = loc ? (loc.localizedLanguageName || loc.languageName || locale) : locale; - const translationsFromPack = translation && translation.contents ? translation.contents['vs/workbench/contrib/localizations/browser/minimalTranslations'] : {}; + const translationsFromPack: any = translation && translation.contents ? translation.contents['vs/workbench/contrib/localizations/browser/minimalTranslations'] : {}; const promptMessageKey = extensionToInstall ? 'installAndRestartMessage' : 'showLanguagePackExtensions'; const useEnglish = !translationsFromPack[promptMessageKey]; - const translations = {}; + const translations: any = {}; Object.keys(minimumTranslatedStrings).forEach(key => { if (!translationsFromPack[key] || useEnglish) { translations[key] = minimumTranslatedStrings[key].replace('{0}', languageName); diff --git a/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts b/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts index 3813a7ff628..d060784e1fa 100644 --- a/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts +++ b/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts @@ -490,10 +490,10 @@ export class KeybindingsEditor extends BaseEditor implements IKeybindingsEditor if (this.input) { const input: KeybindingsEditorInput = this.input as KeybindingsEditorInput; this.keybindingsEditorModel = await input.resolve(); - const editorActionsLabels: { [id: string]: string; } = EditorExtensionsRegistry.getEditorActions().reduce((editorActions, editorAction) => { - editorActions[editorAction.id] = editorAction.label; + const editorActionsLabels: Map = EditorExtensionsRegistry.getEditorActions().reduce((editorActions, editorAction) => { + editorActions.set(editorAction.id, editorAction.label); return editorActions; - }, {}); + }, new Map()); await this.keybindingsEditorModel.resolve(editorActionsLabels); this.renderKeybindingsEntries(false, preserveFocus); if (input.searchOptions) { diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/electron-browser/telemetryOptOut.ts b/src/vs/workbench/contrib/welcome/gettingStarted/electron-browser/telemetryOptOut.ts index 0441799acfd..99693277ff1 100644 --- a/src/vs/workbench/contrib/welcome/gettingStarted/electron-browser/telemetryOptOut.ts +++ b/src/vs/workbench/contrib/welcome/gettingStarted/electron-browser/telemetryOptOut.ts @@ -90,7 +90,7 @@ export class TelemetryOptOut implements IWorkbenchContribution { return undefined; } const extensionToFetchTranslationsFrom = tagResult.firstPage.filter(e => e.publisher === 'MS-CEINTL' && e.name.indexOf('vscode-language-pack') === 0)[0] || tagResult.firstPage[0]; - if (!extensionToFetchTranslationsFrom.assets || !extensionToFetchTranslationsFrom.assets.coreTranslations) { + if (!extensionToFetchTranslationsFrom.assets || !extensionToFetchTranslationsFrom.assets.coreTranslations.length) { return undefined; } diff --git a/src/vs/workbench/services/keybinding/common/keybindingEditing.ts b/src/vs/workbench/services/keybinding/common/keybindingEditing.ts index 49b53c2d234..b3d4e77869f 100644 --- a/src/vs/workbench/services/keybinding/common/keybindingEditing.ts +++ b/src/vs/workbench/services/keybinding/common/keybindingEditing.ts @@ -186,7 +186,7 @@ export class KeybindingsEditingService extends Disposable implements IKeybinding } private asObject(key: string, command: string | null, when: string | undefined, negate: boolean): any { - const object = { key }; + const object: any = { key }; if (command) { object['command'] = negate ? `-${command}` : command; } @@ -210,7 +210,7 @@ export class KeybindingsEditingService extends Disposable implements IKeybinding private resolveModelReference(): Promise> { return this.fileService.exists(this.resource) .then(exists => { - const EOL = this.configurationService.getValue<{}>('files', { overrideIdentifier: 'json' })['eol']; + const EOL = this.configurationService.getValue<{ eol: string }>('files', { overrideIdentifier: 'json' })['eol']; const result: Promise = exists ? Promise.resolve(null) : this.textFileService.write(this.resource, this.getEmptyContent(EOL), { encoding: 'utf8' }); return result.then(() => this.textModelResolverService.createModelReference(this.resource)); }); diff --git a/src/vs/workbench/services/preferences/common/keybindingsEditorModel.ts b/src/vs/workbench/services/preferences/common/keybindingsEditorModel.ts index 5dde33ee560..01bf60c346a 100644 --- a/src/vs/workbench/services/preferences/common/keybindingsEditorModel.ts +++ b/src/vs/workbench/services/preferences/common/keybindingsEditorModel.ts @@ -160,7 +160,7 @@ export class KeybindingsEditorModel extends EditorModel { return result; } - resolve(editorActionsLabels: { [id: string]: string; }): Promise { + resolve(editorActionsLabels: Map): Promise { const workbenchActionsRegistry = Registry.as(ActionExtensions.WorkbenchActions); this._keybindingItemsSortedByPrecedence = []; @@ -209,9 +209,9 @@ export class KeybindingsEditorModel extends EditorModel { return a.command.localeCompare(b.command); } - private static toKeybindingEntry(command: string, keybindingItem: ResolvedKeybindingItem, workbenchActionsRegistry: IWorkbenchActionRegistry, editorActions: { [id: string]: string; }): IKeybindingItem { + private static toKeybindingEntry(command: string, keybindingItem: ResolvedKeybindingItem, workbenchActionsRegistry: IWorkbenchActionRegistry, editorActions: Map): IKeybindingItem { const menuCommand = MenuRegistry.getCommand(command)!; - const editorActionLabel = editorActions[command]; + const editorActionLabel = editorActions.get(command)!; return { keybinding: keybindingItem.resolvedKeybinding, keybindingItem, diff --git a/src/vs/workbench/services/preferences/test/common/keybindingsEditorModel.test.ts b/src/vs/workbench/services/preferences/test/common/keybindingsEditorModel.test.ts index c70d6d94927..675c17c8b95 100644 --- a/src/vs/workbench/services/preferences/test/common/keybindingsEditorModel.test.ts +++ b/src/vs/workbench/services/preferences/test/common/keybindingsEditorModel.test.ts @@ -56,7 +56,7 @@ suite('KeybindingsEditorModel test', () => { aResolvedKeybindingItem({ command: 'b' + uuid.generateUuid(), firstPart: { keyCode: KeyCode.Escape }, chordPart: { keyCode: KeyCode.Escape } }) ); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actuals = asResolvedKeybindingItems(testObject.fetch('')); assertKeybindingItems(actuals, expected); }); @@ -67,7 +67,7 @@ suite('KeybindingsEditorModel test', () => { aResolvedKeybindingItem({ command: 'b' + uuid.generateUuid(), firstPart: { keyCode: KeyCode.Escape }, chordPart: { keyCode: KeyCode.Escape } }) ); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actuals = asResolvedKeybindingItems(testObject.fetch('').slice(0, 2), true); assertKeybindingItems(actuals, expected); }); @@ -80,7 +80,7 @@ suite('KeybindingsEditorModel test', () => { ); const expected = [keybindings[2], keybindings[0], keybindings[1]]; - await testObject.resolve({}); + await testObject.resolve(new Map()); const actuals = asResolvedKeybindingItems(testObject.fetch('')); assertKeybindingItems(actuals, expected); }); @@ -93,7 +93,7 @@ suite('KeybindingsEditorModel test', () => { ); const expected = [keybindings[1], keybindings[0]]; - await testObject.resolve({}); + await testObject.resolve(new Map()); const actuals = asResolvedKeybindingItems(testObject.fetch('')); assertKeybindingItems(actuals, expected); }); @@ -113,7 +113,7 @@ suite('KeybindingsEditorModel test', () => { instantiationService.stub(IKeybindingService, 'getKeybindings', () => keybindings); instantiationService.stub(IKeybindingService, 'getDefaultKeybindings', () => keybindings); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actuals = asResolvedKeybindingItems(testObject.fetch('')); assertKeybindingItems(actuals, expected); }); @@ -131,7 +131,7 @@ suite('KeybindingsEditorModel test', () => { registerCommandWithTitle(keybindings[3].command!, 'Same Title'); const expected = [keybindings[3], keybindings[1], keybindings[0], keybindings[2]]; - await testObject.resolve({}); + await testObject.resolve(new Map()); const actuals = asResolvedKeybindingItems(testObject.fetch('')); assertKeybindingItems(actuals, expected); }); @@ -143,7 +143,7 @@ suite('KeybindingsEditorModel test', () => { aResolvedKeybindingItem({ command: 'a' + uuid.generateUuid(), firstPart: { keyCode: KeyCode.Backspace } }) ); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actuals = asResolvedKeybindingItems(testObject.fetch('', true)); assertKeybindingItems(actuals, expected); }); @@ -152,7 +152,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command: 'a' + uuid.generateUuid(), firstPart: { keyCode: KeyCode.Escape }, when: 'context1 && context2' }); prepareKeybindingService(expected); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('')[0]; assert.equal(actual.keybindingItem.command, expected.command); assert.equal(actual.keybindingItem.commandLabel, ''); @@ -166,7 +166,7 @@ suite('KeybindingsEditorModel test', () => { prepareKeybindingService(expected); registerCommandWithTitle(expected.command!, 'Some Title'); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('')[0]; assert.equal(actual.keybindingItem.command, expected.command); assert.equal(actual.keybindingItem.commandLabel, 'Some Title'); @@ -179,7 +179,7 @@ suite('KeybindingsEditorModel test', () => { CommandsRegistry.registerCommand('command_without_keybinding', () => { }); prepareKeybindingService(); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('').filter(element => element.keybindingItem.command === 'command_without_keybinding')[0]; assert.equal(actual.keybindingItem.command, 'command_without_keybinding'); assert.equal(actual.keybindingItem.commandLabel, ''); @@ -193,7 +193,7 @@ suite('KeybindingsEditorModel test', () => { registerCommandWithTitle(id, 'some title'); prepareKeybindingService(); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('').filter(element => element.keybindingItem.command === id)[0]; assert.equal(actual.keybindingItem.command, id); assert.equal(actual.keybindingItem.commandLabel, 'some title'); @@ -207,7 +207,7 @@ suite('KeybindingsEditorModel test', () => { registerCommandWithTitle(id, 'some title'); prepareKeybindingService(); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('workbench action view size').filter(element => element.keybindingItem.command === id)[0]; assert.ok(actual); }); @@ -217,7 +217,7 @@ suite('KeybindingsEditorModel test', () => { registerCommandWithTitle(id, 'Increase view size'); prepareKeybindingService(); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('increase size').filter(element => element.keybindingItem.command === id)[0]; assert.ok(actual); }); @@ -227,7 +227,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape }, when: 'context1 && context2' }); prepareKeybindingService(expected); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('default').filter(element => element.keybindingItem.command === command)[0]; assert.ok(actual); }); @@ -237,7 +237,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape }, when: 'context1 && context2', isDefault: false }); prepareKeybindingService(expected); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('user').filter(element => element.keybindingItem.command === command)[0]; assert.ok(actual); }); @@ -247,7 +247,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape }, when: 'context1 && context2', isDefault: true }); prepareKeybindingService(expected); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('@source: default').filter(element => element.keybindingItem.command === command)[0]; assert.ok(actual); }); @@ -257,7 +257,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape }, when: 'context1 && context2', isDefault: false }); prepareKeybindingService(expected); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('@source: user').filter(element => element.keybindingItem.command === command)[0]; assert.ok(actual); }); @@ -267,7 +267,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape }, when: 'whenContext1 && whenContext2', isDefault: false }); prepareKeybindingService(expected); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('when context').filter(element => element.keybindingItem.command === command)[0]; assert.ok(actual); }); @@ -279,7 +279,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { metaKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false }); prepareKeybindingService(expected); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('cmd').filter(element => element.keybindingItem.command === command); assert.equal(1, actual.length); assert.deepEqual(actual[0].keybindingMatches!.firstPart, { metaKey: true }); @@ -293,7 +293,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { metaKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false }); prepareKeybindingService(expected, aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { shiftKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false })); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('meta').filter(element => element.keybindingItem.command === command); assert.equal(1, actual.length); assert.deepEqual(actual[0].keybindingMatches!.firstPart, { metaKey: true }); @@ -307,7 +307,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { metaKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false }); prepareKeybindingService(expected, aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { altKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false })); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('command').filter(element => element.keybindingItem.command === command); assert.equal(1, actual.length); assert.deepEqual(actual[0].keybindingMatches!.firstPart, { metaKey: true }); @@ -321,7 +321,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { metaKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false }); prepareKeybindingService(expected, aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { ctrlKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false })); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('windows').filter(element => element.keybindingItem.command === command); assert.equal(1, actual.length); assert.deepEqual(actual[0].keybindingMatches!.firstPart, { metaKey: true }); @@ -333,7 +333,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { altKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false }); prepareKeybindingService(expected, aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { metaKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false })); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('alt').filter(element => element.keybindingItem.command === command); assert.equal(1, actual.length); assert.deepEqual(actual[0].keybindingMatches!.firstPart, { altKey: true }); @@ -345,7 +345,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { altKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false }); prepareKeybindingService(expected, aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { metaKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false })); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('option').filter(element => element.keybindingItem.command === command); assert.equal(1, actual.length); assert.deepEqual(actual[0].keybindingMatches!.firstPart, { altKey: true }); @@ -357,7 +357,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { ctrlKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false }); prepareKeybindingService(expected, aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { shiftKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false })); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('ctrl').filter(element => element.keybindingItem.command === command); assert.equal(1, actual.length); assert.deepEqual(actual[0].keybindingMatches!.firstPart, { ctrlKey: true }); @@ -369,7 +369,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { ctrlKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false }); prepareKeybindingService(expected, aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { metaKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false })); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('control').filter(element => element.keybindingItem.command === command); assert.equal(1, actual.length); assert.deepEqual(actual[0].keybindingMatches!.firstPart, { ctrlKey: true }); @@ -381,7 +381,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { shiftKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false }); prepareKeybindingService(expected, aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { metaKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false })); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('shift').filter(element => element.keybindingItem.command === command); assert.equal(1, actual.length); assert.deepEqual(actual[0].keybindingMatches!.firstPart, { shiftKey: true }); @@ -393,7 +393,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.RightArrow, modifiers: { shiftKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false }); prepareKeybindingService(expected, aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { metaKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false })); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('arrow').filter(element => element.keybindingItem.command === command); assert.equal(1, actual.length); assert.deepEqual(actual[0].keybindingMatches!.firstPart, { keyCode: true }); @@ -405,7 +405,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.RightArrow, modifiers: { altKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false }); prepareKeybindingService(expected, aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.RightArrow, modifiers: { metaKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false })); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('alt right').filter(element => element.keybindingItem.command === command); assert.equal(1, actual.length); assert.deepEqual(actual[0].keybindingMatches!.firstPart, { altKey: true, keyCode: true }); @@ -417,7 +417,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.RightArrow, modifiers: { altKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false }); prepareKeybindingService(expected, aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.RightArrow, modifiers: { metaKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false })); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('right alt').filter(element => element.keybindingItem.command === command); assert.equal(0, actual.length); }); @@ -428,7 +428,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { altKey: true, metaKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false }); prepareKeybindingService(expected, aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { metaKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false })); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('alt cmd esc').filter(element => element.keybindingItem.command === command); assert.equal(1, actual.length); assert.deepEqual(actual[0].keybindingMatches!.firstPart, { altKey: true, metaKey: true, keyCode: true }); @@ -441,7 +441,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { shiftKey: true, metaKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false }); prepareKeybindingService(expected, aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { metaKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false })); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('cmd shift esc').filter(element => element.keybindingItem.command === command); assert.equal(1, actual.length); assert.deepEqual(actual[0].keybindingMatches!.firstPart, { metaKey: true, shiftKey: true, keyCode: true }); @@ -454,7 +454,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { shiftKey: true, metaKey: true } }, chordPart: { keyCode: KeyCode.Delete }, when: 'whenContext1 && whenContext2', isDefault: false }); prepareKeybindingService(expected, aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { metaKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false })); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('cmd shift esc').filter(element => element.keybindingItem.command === command); assert.equal(1, actual.length); assert.deepEqual(actual[0].keybindingMatches!.firstPart, { metaKey: true, shiftKey: true, keyCode: true }); @@ -467,7 +467,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { shiftKey: true, metaKey: true } }, chordPart: { keyCode: KeyCode.Delete }, when: 'whenContext1 && whenContext2', isDefault: false }); prepareKeybindingService(expected, aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { metaKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false })); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('cmd del').filter(element => element.keybindingItem.command === command); assert.equal(1, actual.length); assert.deepEqual(actual[0].keybindingMatches!.firstPart, { metaKey: true }); @@ -480,7 +480,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { shiftKey: true, metaKey: true } }, chordPart: { keyCode: KeyCode.Delete }, when: 'whenContext1 && whenContext2', isDefault: false }); prepareKeybindingService(expected, aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { shiftKey: true, metaKey: true } }, chordPart: { keyCode: KeyCode.UpArrow }, when: 'whenContext1 && whenContext2', isDefault: false })); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('cmd shift esc del').filter(element => element.keybindingItem.command === command); assert.equal(1, actual.length); assert.deepEqual(actual[0].keybindingMatches!.firstPart, { shiftKey: true, metaKey: true, keyCode: true }); @@ -492,7 +492,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.KEY_C, modifiers: { ctrlKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false }); prepareKeybindingService(expected, aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { shiftKey: true, metaKey: true } }, chordPart: { keyCode: KeyCode.KEY_C, modifiers: { ctrlKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false })); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('"ctrl c"').filter(element => element.keybindingItem.command === command); assert.equal(1, actual.length); assert.deepEqual(actual[0].keybindingMatches!.firstPart, { ctrlKey: true, keyCode: true }); @@ -504,7 +504,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { shiftKey: true, metaKey: true } }, chordPart: { keyCode: KeyCode.KEY_C, modifiers: { ctrlKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false }); prepareKeybindingService(expected, aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.KEY_C, modifiers: { ctrlKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false })); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('"shift meta escape ctrl c"').filter(element => element.keybindingItem.command === command); assert.equal(1, actual.length); assert.deepEqual(actual[0].keybindingMatches!.firstPart, { shiftKey: true, metaKey: true, keyCode: true }); @@ -517,7 +517,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { shiftKey: true, metaKey: true } }, chordPart: { keyCode: KeyCode.Delete, modifiers: { metaKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false }); prepareKeybindingService(expected, aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { shiftKey: true, metaKey: true } }, chordPart: { keyCode: KeyCode.UpArrow }, when: 'whenContext1 && whenContext2', isDefault: false })); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('"cmd shift esc del"').filter(element => element.keybindingItem.command === command); assert.equal(0, actual.length); }); @@ -527,7 +527,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.KEY_C, modifiers: { ctrlKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false }); prepareKeybindingService(expected, aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { shiftKey: true, metaKey: true } }, chordPart: { keyCode: KeyCode.KEY_C, modifiers: { ctrlKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false })); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('"control+c"').filter(element => element.keybindingItem.command === command); assert.equal(1, actual.length); assert.deepEqual(actual[0].keybindingMatches!.firstPart, { ctrlKey: true, keyCode: true }); @@ -539,7 +539,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape, modifiers: { shiftKey: true, metaKey: true } }, chordPart: { keyCode: KeyCode.KEY_C, modifiers: { ctrlKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false }); prepareKeybindingService(expected, aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.KEY_C, modifiers: { ctrlKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false })); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('"shift+meta+escape ctrl+c"').filter(element => element.keybindingItem.command === command); assert.equal(1, actual.length); assert.deepEqual(actual[0].keybindingMatches!.firstPart, { shiftKey: true, metaKey: true, keyCode: true }); @@ -551,7 +551,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Space, modifiers: { ctrlKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false }); prepareKeybindingService(expected, aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Backspace, modifiers: { ctrlKey: true } }, when: 'whenContext1 && whenContext2', isDefault: false })); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('"ctrl+space"').filter(element => element.keybindingItem.command === command); assert.equal(1, actual.length); }); @@ -562,7 +562,7 @@ suite('KeybindingsEditorModel test', () => { const expected = aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.DownArrow } }); prepareKeybindingService(expected, aResolvedKeybindingItem({ command: 'down', firstPart: { keyCode: KeyCode.Escape } })); - await testObject.resolve({}); + await testObject.resolve(new Map()); const actual = testObject.fetch('"down"').filter(element => element.keybindingItem.command === command); assert.equal(1, actual.length); assert.deepEqual(actual[0].keybindingMatches!.firstPart, { keyCode: true }); diff --git a/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts b/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts index 870101c355d..6fa2c5489ed 100644 --- a/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts +++ b/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts @@ -424,7 +424,7 @@ export class WorkspaceEditingService implements IWorkspaceEditingService { private doCopyWorkspaceSettings(toWorkspace: IWorkspaceIdentifier, filter?: (config: IConfigurationPropertySchema) => boolean): Promise { const configurationProperties = Registry.as(ConfigurationExtensions.Configuration).getConfigurationProperties(); - const targetWorkspaceConfiguration = {}; + const targetWorkspaceConfiguration: any = {}; for (const key of this.configurationService.keys().workspace) { if (configurationProperties[key]) { if (filter && !filter(configurationProperties[key])) { diff --git a/src/vs/workbench/test/electron-browser/api/extHostConfiguration.test.ts b/src/vs/workbench/test/electron-browser/api/extHostConfiguration.test.ts index 2a963f3a3ab..db499917207 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostConfiguration.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostConfiguration.test.ts @@ -40,7 +40,7 @@ suite('ExtHostConfiguration', function () { user: new ConfigurationModel(contents), workspace: new ConfigurationModel(), folders: Object.create(null), - configurationScopes: {} + configurationScopes: [] }; } @@ -278,7 +278,7 @@ suite('ExtHostConfiguration', function () { }, ['editor.wordWrap']), workspace: new ConfigurationModel({}, []), folders: Object.create(null), - configurationScopes: {} + configurationScopes: [] } ); @@ -326,7 +326,7 @@ suite('ExtHostConfiguration', function () { }, ['editor.wordWrap']), workspace, folders, - configurationScopes: {} + configurationScopes: [] } ); @@ -402,7 +402,7 @@ suite('ExtHostConfiguration', function () { }, ['editor.wordWrap']), workspace, folders, - configurationScopes: {} + configurationScopes: [] } ); From fe21590bb8fe31e1729e94c9eeb65b7f88335ef1 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 9 Jul 2019 12:43:59 +0200 Subject: [PATCH 1258/1449] :lipstick: --- src/vs/platform/environment/common/environment.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index 05f69e90208..242f5d8f978 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -25,7 +25,6 @@ export interface ParsedArgs { 'reuse-window'?: boolean; locale?: string; 'user-data-dir'?: string; - 'web-user-data-dir'?: string; 'prof-startup'?: string; 'prof-startup-prefix'?: string; 'prof-append-timers'?: string; @@ -78,6 +77,11 @@ export interface ParsedArgs { 'js-flags'?: boolean; 'disable-gpu'?: boolean; 'nolazy'?: boolean; + + // Web flags + 'folder'?: string; + 'workspace'?: string; + 'web-user-data-dir'?: string; } export const IEnvironmentService = createDecorator('environmentService'); From 524d4139ae09cf55dd61bc0efd6c5b7af03a72a4 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 9 Jul 2019 12:49:35 +0200 Subject: [PATCH 1259/1449] remove web flags --- src/vs/platform/environment/common/environment.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index 242f5d8f978..2ec781dcfc2 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -79,8 +79,6 @@ export interface ParsedArgs { 'nolazy'?: boolean; // Web flags - 'folder'?: string; - 'workspace'?: string; 'web-user-data-dir'?: string; } From acacc45e736ebc3003a520e746700a13c1a68892 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 9 Jul 2019 12:34:22 +0200 Subject: [PATCH 1260/1449] use UUID to force service worker updates --- .../contrib/resources/browser/resourceServiceWorkerMain.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts b/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts index 3f57cf8824f..6da4d5302f1 100644 --- a/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts +++ b/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // trigger service worker updates -const VERSION = 2; +const _tag = 'e4d8e56a-394f-4541-b817-421b1e2feed1'; (function () { From 7fdb996f491b64b9e40ce11418214cc7d278b9fd Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 9 Jul 2019 14:13:44 +0200 Subject: [PATCH 1261/1449] not everyone supports preload, #75061 --- .../resources/browser/resourceServiceWorkerMain.ts | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts b/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts index 6da4d5302f1..8ddec567e09 100644 --- a/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts +++ b/src/vs/workbench/contrib/resources/browser/resourceServiceWorkerMain.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // trigger service worker updates -const _tag = 'e4d8e56a-394f-4541-b817-421b1e2feed1'; +const _tag = '586d4b79-f5c4-4aff-9a14-2139ddfbb486'; (function () { @@ -38,12 +38,7 @@ const _tag = 'e4d8e56a-394f-4541-b817-421b1e2feed1'; return value; } // try the network (prefetch or fetch) - const res = await event.preloadResponse; - if (res) { - return res; - } else { - return fetch(event.request); - } + return event.preloadResponse || fetch(event.request); })); }); self.addEventListener('install', (event: any) => { @@ -53,7 +48,9 @@ const _tag = 'e4d8e56a-394f-4541-b817-421b1e2feed1'; self.addEventListener('activate', (event: any) => { event.waitUntil((async () => { - await (self as any).registration.navigationPreload.enable(); // Enable navigation preloads! + if ((self as any).registration.navigationPreload) { + await (self as any).registration.navigationPreload.enable(); // Enable navigation preloads! + } await (self as any).clients.claim(); // Become available to all pages })()); }); From 680ce7a9610281ec78dead8a618154772deec85f Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Tue, 9 Jul 2019 14:41:56 +0200 Subject: [PATCH 1262/1449] Use collapseByDefault in custom view tree Part of #63566 --- src/vs/workbench/browser/parts/views/customView.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/views/customView.ts b/src/vs/workbench/browser/parts/views/customView.ts index 4eafe940c88..45375684d7f 100644 --- a/src/vs/workbench/browser/parts/views/customView.ts +++ b/src/vs/workbench/browser/parts/views/customView.ts @@ -380,7 +380,10 @@ export class CustomTreeView extends Disposable implements ITreeView { return item.label ? item.label.label : (item.resourceUri ? basename(URI.revive(item.resourceUri)) : undefined); } }, - expandOnlyOnTwistieClick: (e: ITreeItem) => !!e.command + expandOnlyOnTwistieClick: (e: ITreeItem) => !!e.command, + collapseByDefault: (e: ITreeItem): boolean => { + return e.collapsibleState !== TreeItemCollapsibleState.Expanded; + } }) as WorkbenchAsyncDataTree); aligner.tree = this.tree; From 2bcc197d6f81a5dcc526497efddc8a1bd82cccf8 Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 9 Jul 2019 14:57:38 +0200 Subject: [PATCH 1263/1449] folding: introduce foldingEnabled context --- src/vs/editor/contrib/folding/folding.ts | 32 +++++++++++++++--------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/vs/editor/contrib/folding/folding.ts b/src/vs/editor/contrib/folding/folding.ts index e5d922f71f6..9a9ea25c545 100644 --- a/src/vs/editor/contrib/folding/folding.ts +++ b/src/vs/editor/contrib/folding/folding.ts @@ -31,7 +31,9 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { InitializingRangeProvider, ID_INIT_PROVIDER } from 'vs/editor/contrib/folding/intializingRangeProvider'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { onUnexpectedError } from 'vs/base/common/errors'; +import { RawContextKey, IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +const CONTEXT_FOLDING_ENABLED = new RawContextKey('foldingEnabled', false); export const ID = 'editor.contrib.folding'; export interface RangeProvider { @@ -73,12 +75,15 @@ export class FoldingController extends Disposable implements IEditorContribution private foldingModelPromise: Promise | null; private updateScheduler: Delayer | null; - + private foldingEnabled: IContextKey; private cursorChangedScheduler: RunOnceScheduler | null; private readonly localToDispose = this._register(new DisposableStore()); - constructor(editor: ICodeEditor) { + constructor( + editor: ICodeEditor, + @IContextKeyService private readonly contextKeyService: IContextKeyService + ) { super(); this.editor = editor; this._isEnabled = this.editor.getConfiguration().contribInfo.folding; @@ -88,6 +93,8 @@ export class FoldingController extends Disposable implements IEditorContribution this.foldingDecorationProvider = new FoldingDecorationProvider(editor); this.foldingDecorationProvider.autoHideFoldingControls = this._autoHideFoldingControls; + this.foldingEnabled = CONTEXT_FOLDING_ENABLED.bindTo(this.contextKeyService); + this.foldingEnabled.set(this._isEnabled); this._register(this.editor.onDidChangeModel(() => this.onModelChanged())); @@ -95,6 +102,7 @@ export class FoldingController extends Disposable implements IEditorContribution if (e.contribInfo) { let oldIsEnabled = this._isEnabled; this._isEnabled = this.editor.getConfiguration().contribInfo.folding; + this.foldingEnabled.set(this._isEnabled); if (oldIsEnabled !== this._isEnabled) { this.onModelChanged(); } @@ -496,7 +504,7 @@ class UnfoldAction extends FoldingAction { id: 'editor.unfold', label: nls.localize('unfoldAction.label', "Unfold"), alias: 'Unfold', - precondition: undefined, + precondition: CONTEXT_FOLDING_ENABLED, kbOpts: { kbExpr: EditorContextKeys.editorTextFocus, primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.US_CLOSE_SQUARE_BRACKET, @@ -560,7 +568,7 @@ class UnFoldRecursivelyAction extends FoldingAction { id: 'editor.unfoldRecursively', label: nls.localize('unFoldRecursivelyAction.label', "Unfold Recursively"), alias: 'Unfold Recursively', - precondition: undefined, + precondition: CONTEXT_FOLDING_ENABLED, kbOpts: { kbExpr: EditorContextKeys.editorTextFocus, primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.US_CLOSE_SQUARE_BRACKET), @@ -581,7 +589,7 @@ class FoldAction extends FoldingAction { id: 'editor.fold', label: nls.localize('foldAction.label', "Fold"), alias: 'Fold', - precondition: undefined, + precondition: CONTEXT_FOLDING_ENABLED, kbOpts: { kbExpr: EditorContextKeys.editorTextFocus, primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.US_OPEN_SQUARE_BRACKET, @@ -645,7 +653,7 @@ class FoldRecursivelyAction extends FoldingAction { id: 'editor.foldRecursively', label: nls.localize('foldRecursivelyAction.label', "Fold Recursively"), alias: 'Fold Recursively', - precondition: undefined, + precondition: CONTEXT_FOLDING_ENABLED, kbOpts: { kbExpr: EditorContextKeys.editorTextFocus, primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.US_OPEN_SQUARE_BRACKET), @@ -667,7 +675,7 @@ class FoldAllBlockCommentsAction extends FoldingAction { id: 'editor.foldAllBlockComments', label: nls.localize('foldAllBlockComments.label', "Fold All Block Comments"), alias: 'Fold All Block Comments', - precondition: undefined, + precondition: CONTEXT_FOLDING_ENABLED, kbOpts: { kbExpr: EditorContextKeys.editorTextFocus, primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.US_SLASH), @@ -700,7 +708,7 @@ class FoldAllRegionsAction extends FoldingAction { id: 'editor.foldAllMarkerRegions', label: nls.localize('foldAllMarkerRegions.label', "Fold All Regions"), alias: 'Fold All Regions', - precondition: undefined, + precondition: CONTEXT_FOLDING_ENABLED, kbOpts: { kbExpr: EditorContextKeys.editorTextFocus, primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.KEY_8), @@ -733,7 +741,7 @@ class UnfoldAllRegionsAction extends FoldingAction { id: 'editor.unfoldAllMarkerRegions', label: nls.localize('unfoldAllMarkerRegions.label', "Unfold All Regions"), alias: 'Unfold All Regions', - precondition: undefined, + precondition: CONTEXT_FOLDING_ENABLED, kbOpts: { kbExpr: EditorContextKeys.editorTextFocus, primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.KEY_9), @@ -766,7 +774,7 @@ class FoldAllAction extends FoldingAction { id: 'editor.foldAll', label: nls.localize('foldAllAction.label', "Fold All"), alias: 'Fold All', - precondition: undefined, + precondition: CONTEXT_FOLDING_ENABLED, kbOpts: { kbExpr: EditorContextKeys.editorTextFocus, primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.KEY_0), @@ -787,7 +795,7 @@ class UnfoldAllAction extends FoldingAction { id: 'editor.unfoldAll', label: nls.localize('unfoldAllAction.label', "Unfold All"), alias: 'Unfold All', - precondition: undefined, + precondition: CONTEXT_FOLDING_ENABLED, kbOpts: { kbExpr: EditorContextKeys.editorTextFocus, primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.KEY_J), @@ -831,7 +839,7 @@ for (let i = 1; i <= 7; i++) { id: FoldLevelAction.ID(i), label: nls.localize('foldLevelAction.label', "Fold Level {0}", i), alias: `Fold Level ${i}`, - precondition: undefined, + precondition: CONTEXT_FOLDING_ENABLED, kbOpts: { kbExpr: EditorContextKeys.editorTextFocus, primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | (KeyCode.KEY_0 + i)), From 1566f05f104a2d55fd26a9abfb3c886cb2ad4423 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 9 Jul 2019 14:49:52 +0200 Subject: [PATCH 1264/1449] FileSystem docs, #48034 --- src/vs/vscode.proposed.d.ts | 68 +++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 707eba8b5db..e182ea0629c 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1594,19 +1594,87 @@ declare module 'vscode' { //#region Joh - read/write files of any scheme + /** + * The file system interface exposes the editor's built-in and contributed + * [file system providers](#FileSystemProvider). It allows extensions to work + * with files from the local disk as well as files from remote places, like the + * remote extension host or ftp-servers. + */ export interface FileSystem { + + /** + * Retrieve metadata about a file. + * + * @param uri The uri of the file to retrieve metadata about. + * @return The file metadata about the file. + */ stat(uri: Uri): Thenable; + + /** + * Retrieve all entries of a [directory](#FileType.Directory). + * + * @param uri The uri of the folder. + * @return An array of name/type-tuples or a thenable that resolves to such. + */ readDirectory(uri: Uri): Thenable<[string, FileType][]>; + + /** + * Create a new directory (Note, that new files are created via `write`-calls). + * + * @param uri The uri of the new folder. + */ createDirectory(uri: Uri): Thenable; + + /** + * Read the entire contents of a file. + * + * @param uri The uri of the file. + * @return An array of bytes or a thenable that resolves to such. + */ readFile(uri: Uri): Thenable; + + /** + * Write data to a file, replacing its entire contents. + * + * @param uri The uri of the file. + * @param content The new content of the file. + * @param options Defines if missing files should or must be created. + */ writeFile(uri: Uri, content: Uint8Array, options?: { create: boolean, overwrite: boolean }): Thenable; + + /** + * Delete a file. + * + * @param uri The resource that is to be deleted. + * @param options Defines if deletion of folders is recursive. + */ delete(uri: Uri, options?: { recursive: boolean }): Thenable; + + /** + * Rename a file or folder. + * + * @param oldUri The existing file. + * @param newUri The new location. + * @param options Defines if existing files should be overwritten. + */ rename(source: Uri, target: Uri, options?: { overwrite: boolean }): Thenable; + + /** + * Copy files or folders. Implementing this function is optional but it will speedup + * the copy operation. + * + * @param source The existing file. + * @param destination The destination location. + * @param options Defines if existing files should be overwritten. + */ copy(source: Uri, target: Uri, options?: { overwrite: boolean }): Thenable; } export namespace workspace { + /** + * File system that allows to interact with local and remote files. + */ export const fs: FileSystem; } From 51123cd1338858a4f27e93a737b018a2d57ec58c Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 9 Jul 2019 15:19:53 +0200 Subject: [PATCH 1265/1449] wrap error into FileSystemError, #48034 --- .../singlefolder-tests/workspace.fs.test.ts | 23 ++++++++++++++++ .../workbench/api/common/extHostFileSystem.ts | 26 ++++++++++++------- 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.fs.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.fs.test.ts index cd82f10c17d..497311c51fb 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.fs.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.fs.test.ts @@ -116,4 +116,27 @@ suite('workspace-fs', () => { assert.ok(true); } }); + + test('throws FileSystemError', async function () { + + try { + await vscode.workspace.fs.stat(vscode.Uri.file(`/c468bf16-acfd-4591-825e-2bcebba508a3/71b1f274-91cb-4c19-af00-8495eaab4b73/4b60cb48-a6f2-40ea-9085-0936f4a8f59a.tx6`)); + assert.ok(false); + } catch (e) { + assert.ok(e instanceof vscode.FileSystemError); + assert.ok(e.message); + } + }); + + test('throws FileSystemError', async function () { + + try { + await vscode.workspace.fs.stat(vscode.Uri.parse('foo:/bar')); + assert.ok(false); + } catch (e) { + assert.ok(e instanceof vscode.FileSystemError); + assert.ok(e.message); + assert.ok(e.name); + } + }); }); diff --git a/src/vs/workbench/api/common/extHostFileSystem.ts b/src/vs/workbench/api/common/extHostFileSystem.ts index fe97cae97ee..46d9301f191 100644 --- a/src/vs/workbench/api/common/extHostFileSystem.ts +++ b/src/vs/workbench/api/common/extHostFileSystem.ts @@ -8,7 +8,7 @@ import { MainContext, IMainContext, ExtHostFileSystemShape, MainThreadFileSystem import * as vscode from 'vscode'; import * as files from 'vs/platform/files/common/files'; import { IDisposable, toDisposable, dispose } from 'vs/base/common/lifecycle'; -import { FileChangeType } from 'vs/workbench/api/common/extHostTypes'; +import { FileChangeType, FileSystemError } from 'vs/workbench/api/common/extHostTypes'; import * as typeConverter from 'vs/workbench/api/common/extHostTypeConverters'; import { ExtHostLanguageFeatures } from 'vs/workbench/api/common/extHostLanguageFeatures'; import { Schemas } from 'vs/base/common/network'; @@ -108,28 +108,36 @@ class ConsumerFileSystem implements vscode.FileSystem { constructor(private _proxy: MainThreadFileSystemShape) { } stat(uri: vscode.Uri): Promise { - return this._proxy.$stat(uri); + return this._proxy.$stat(uri).catch(ConsumerFileSystem._handleError); } readDirectory(uri: vscode.Uri): Promise<[string, vscode.FileType][]> { - return this._proxy.$readdir(uri); + return this._proxy.$readdir(uri).catch(ConsumerFileSystem._handleError); } createDirectory(uri: vscode.Uri): Promise { - return this._proxy.$mkdir(uri); + return this._proxy.$mkdir(uri).catch(ConsumerFileSystem._handleError); } async readFile(uri: vscode.Uri): Promise { - return (await this._proxy.$readFile(uri)).buffer; + return this._proxy.$readFile(uri).then(buff => buff.buffer).catch(ConsumerFileSystem._handleError); } writeFile(uri: vscode.Uri, content: Uint8Array, options: { create: boolean; overwrite: boolean; } = { create: true, overwrite: true }): Promise { - return this._proxy.$writeFile(uri, VSBuffer.wrap(content), options); + return this._proxy.$writeFile(uri, VSBuffer.wrap(content), options).catch(ConsumerFileSystem._handleError); } delete(uri: vscode.Uri, options: { recursive: boolean; } = { recursive: false }): Promise { - return this._proxy.$delete(uri, { ...options, useTrash: false }); //todo@joh useTrash + return this._proxy.$delete(uri, { ...options, useTrash: false }).catch(ConsumerFileSystem._handleError); //todo@joh useTrash } rename(oldUri: vscode.Uri, newUri: vscode.Uri, options: { overwrite: boolean; } = { overwrite: false }): Promise { - return this._proxy.$rename(oldUri, newUri, options); + return this._proxy.$rename(oldUri, newUri, options).catch(ConsumerFileSystem._handleError); } copy(source: vscode.Uri, destination: vscode.Uri, options: { overwrite: boolean } = { overwrite: false }): Promise { - return this._proxy.$copy(source, destination, options); + return this._proxy.$copy(source, destination, options).catch(ConsumerFileSystem._handleError); + } + private static _handleError(err: any): never { + if (err instanceof Error && err.name === 'ENOPRO') { + throw FileSystemError.Unavailable(err.message); + } else { + // generic error + throw new FileSystemError(String(err)); + } } } From 66cdaa19f1e9a517eca528cf7255869190b0834a Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 9 Jul 2019 15:26:31 +0200 Subject: [PATCH 1266/1449] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5fdfe76f69a..72c98f8092d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.37.0", - "distro": "773234694260efe26c5781d4e011fdd1063a948a", + "distro": "45382792b71706984c4b5863b23bc19470507c2e", "author": { "name": "Microsoft Corporation" }, From eeb34e04f595e26c041348bf8d30116f9f3102b4 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 9 Jul 2019 15:37:24 +0200 Subject: [PATCH 1267/1449] web - only prevent unload if backups have not completed yet --- .../lifecycle/browser/lifecycleService.ts | 3 +- src/vs/platform/lifecycle/common/lifecycle.ts | 10 ++++-- .../common/editor/untitledEditorInput.ts | 8 +++++ .../common/editor/untitledEditorModel.ts | 4 +++ .../backup/common/backupModelTracker.ts | 2 -- .../services/backup/common/backup.ts | 10 ++++-- .../backup/common/backupFileService.ts | 27 +++++++++++--- .../test/node/backupFileService.test.ts | 22 ++++++++++++ .../textfile/browser/textFileService.ts | 36 ++++++++++++++----- .../textfile/common/textFileEditorModel.ts | 4 +++ .../textfile/common/textFileService.ts | 28 +++++++-------- .../services/textfile/common/textfiles.ts | 2 ++ .../untitled/common/untitledEditorService.ts | 30 ++++++++-------- .../workspaceEditingService.ts | 3 +- .../workbench/test/workbenchTestServices.ts | 4 +++ 15 files changed, 143 insertions(+), 50 deletions(-) diff --git a/src/vs/platform/lifecycle/browser/lifecycleService.ts b/src/vs/platform/lifecycle/browser/lifecycleService.ts index b0c3014986f..f5e4c4c3f3c 100644 --- a/src/vs/platform/lifecycle/browser/lifecycleService.ts +++ b/src/vs/platform/lifecycle/browser/lifecycleService.ts @@ -26,7 +26,7 @@ export class BrowserLifecycleService extends AbstractLifecycleService { } private beforeUnload(): string | null { - let veto: boolean = false; + let veto = false; // Before Shutdown this._onBeforeShutdown.fire({ @@ -35,6 +35,7 @@ export class BrowserLifecycleService extends AbstractLifecycleService { veto = true; } else if (value instanceof Promise && !veto) { console.warn(new Error('Long running onBeforeShutdown currently not supported')); + veto = true; } }, reason: ShutdownReason.QUIT diff --git a/src/vs/platform/lifecycle/common/lifecycle.ts b/src/vs/platform/lifecycle/common/lifecycle.ts index 0cc2199b349..afd461859d0 100644 --- a/src/vs/platform/lifecycle/common/lifecycle.ts +++ b/src/vs/platform/lifecycle/common/lifecycle.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Event } from 'vs/base/common/event'; -import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { createDecorator, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; import { isThenable } from 'vs/base/common/async'; export const ILifecycleService = createDecorator('lifecycleService'); @@ -123,7 +123,7 @@ export function LifecyclePhaseToString(phase: LifecyclePhase) { */ export interface ILifecycleService { - _serviceBrand: any; + _serviceBrand: ServiceIdentifier; /** * Value indicates how this window got loaded. @@ -166,12 +166,16 @@ export interface ILifecycleService { } export const NullLifecycleService: ILifecycleService = { - _serviceBrand: null, + + _serviceBrand: null as any, + onBeforeShutdown: Event.None, onWillShutdown: Event.None, onShutdown: Event.None, + phase: LifecyclePhase.Restored, startupKind: StartupKind.NewWindow, + when() { return Promise.resolve(); } }; diff --git a/src/vs/workbench/common/editor/untitledEditorInput.ts b/src/vs/workbench/common/editor/untitledEditorInput.ts index 585543b6560..16f96244129 100644 --- a/src/vs/workbench/common/editor/untitledEditorInput.ts +++ b/src/vs/workbench/common/editor/untitledEditorInput.ts @@ -139,6 +139,14 @@ export class UntitledEditorInput extends EditorInput implements IEncodingSupport return this.hasAssociatedFilePath; } + hasBackup(): boolean { + if (this.cachedModel) { + return this.cachedModel.hasBackup(); + } + + return false; + } + confirmSave(): Promise { return this.textFileService.confirmSave([this.resource]); } diff --git a/src/vs/workbench/common/editor/untitledEditorModel.ts b/src/vs/workbench/common/editor/untitledEditorModel.ts index dee5ab87281..8b2c38d28f6 100644 --- a/src/vs/workbench/common/editor/untitledEditorModel.ts +++ b/src/vs/workbench/common/editor/untitledEditorModel.ts @@ -133,6 +133,10 @@ export class UntitledEditorModel extends BaseTextEditorModel implements IEncodin return Promise.resolve(); } + hasBackup(): boolean { + return this.backupFileService.hasBackupSync(this.resource, this.versionId); + } + async load(): Promise { // Check for backups first diff --git a/src/vs/workbench/contrib/backup/common/backupModelTracker.ts b/src/vs/workbench/contrib/backup/common/backupModelTracker.ts index aa16c733036..854d26b935c 100644 --- a/src/vs/workbench/contrib/backup/common/backupModelTracker.ts +++ b/src/vs/workbench/contrib/backup/common/backupModelTracker.ts @@ -16,8 +16,6 @@ const AUTO_SAVE_AFTER_DELAY_DISABLED_TIME = CONTENT_CHANGE_EVENT_BUFFER_DELAY + export class BackupModelTracker extends Disposable implements IWorkbenchContribution { - _serviceBrand: any; - private configuredAutoSaveAfterDelay: boolean; constructor( diff --git a/src/vs/workbench/services/backup/common/backup.ts b/src/vs/workbench/services/backup/common/backup.ts index 9042a44dbdf..771cba84a18 100644 --- a/src/vs/workbench/services/backup/common/backup.ts +++ b/src/vs/workbench/services/backup/common/backup.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { URI } from 'vs/base/common/uri'; -import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { createDecorator, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; import { ITextBufferFactory, ITextSnapshot } from 'vs/editor/common/model'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { joinPath, relativePath } from 'vs/base/common/resources'; @@ -20,13 +20,19 @@ export interface IResolvedBackup { * A service that handles any I/O and state associated with the backup system. */ export interface IBackupFileService { - _serviceBrand: any; + + _serviceBrand: ServiceIdentifier; /** * Finds out if there are any backups stored. */ hasBackups(): Promise; + /** + * Finds out if the provided resource with the given version is backed up. + */ + hasBackupSync(resource: URI, versionId?: number): boolean; + /** * Loads the backup resource for a particular resource within the current workspace. * diff --git a/src/vs/workbench/services/backup/common/backupFileService.ts b/src/vs/workbench/services/backup/common/backupFileService.ts index 492d26b67f4..3193fee9594 100644 --- a/src/vs/workbench/services/backup/common/backupFileService.ts +++ b/src/vs/workbench/services/backup/common/backupFileService.ts @@ -124,6 +124,7 @@ export class BackupFileService implements IBackupFileService { protected hashPath(resource: URI): string { const str = resource.scheme === Schemas.file || resource.scheme === Schemas.untitled ? resource.fsPath : resource.toString(); + return hash(str).toString(16); } @@ -137,6 +138,10 @@ export class BackupFileService implements IBackupFileService { return this.impl.hasBackups(); } + hasBackupSync(resource: URI, versionId?: number): boolean { + return this.impl.hasBackupSync(resource, versionId); + } + loadBackupResource(resource: URI): Promise { return this.impl.loadBackupResource(resource); } @@ -172,14 +177,16 @@ class BackupFileServiceImpl implements IBackupFileService { private static readonly PREAMBLE_META_SEPARATOR = ' '; // using a character that is know to be escaped in a URI as separator private static readonly PREAMBLE_MAX_LENGTH = 10000; - _serviceBrand: any; + _serviceBrand: ServiceIdentifier; private backupWorkspacePath: URI; private isShuttingDown: boolean; - private ready: Promise; private ioOperationQueues: ResourceQueue; // queue IO operations to ensure write order + private ready: Promise; + private model: IBackupFilesModel; + constructor( backupWorkspaceResource: URI, private readonly hashPath: (resource: URI) => string, @@ -198,9 +205,9 @@ class BackupFileServiceImpl implements IBackupFileService { } private init(): Promise { - const model = new BackupFilesModel(this.fileService); + this.model = new BackupFilesModel(this.fileService); - return model.resolve(this.backupWorkspacePath); + return this.model.resolve(this.backupWorkspacePath); } async hasBackups(): Promise { @@ -209,6 +216,12 @@ class BackupFileServiceImpl implements IBackupFileService { return model.count() > 0; } + hasBackupSync(resource: URI, versionId?: number): boolean { + const backupResource = this.toBackupResource(resource); + + return this.model.has(backupResource, versionId); + } + async loadBackupResource(resource: URI): Promise { const model = await this.ready; @@ -377,6 +390,12 @@ export class InMemoryBackupFileService implements IBackupFileService { return Promise.resolve(this.backups.size > 0); } + hasBackupSync(resource: URI, versionId?: number): boolean { + const backupResource = this.toBackupResource(resource); + + return this.backups.has(backupResource.toString()); + } + loadBackupResource(resource: URI): Promise { const backupResource = this.toBackupResource(resource); if (this.backups.has(backupResource.toString())) { diff --git a/src/vs/workbench/services/backup/test/node/backupFileService.test.ts b/src/vs/workbench/services/backup/test/node/backupFileService.test.ts index 2407186c794..0bdbc59813e 100644 --- a/src/vs/workbench/services/backup/test/node/backupFileService.test.ts +++ b/src/vs/workbench/services/backup/test/node/backupFileService.test.ts @@ -155,6 +155,16 @@ suite('BackupFileService', () => { assert.equal(fs.readdirSync(path.join(workspaceBackupPath, 'file')).length, 1); assert.equal(fs.existsSync(fooBackupPath), true); assert.equal(fs.readFileSync(fooBackupPath), `${fooFile.toString()}\ntest`); + assert.ok(service.hasBackupSync(fooFile)); + }); + + test('text file (with version)', async () => { + await service.backupResource(fooFile, createTextBufferFactory('test').create(DefaultEndOfLine.LF).createSnapshot(false), 666); + assert.equal(fs.readdirSync(path.join(workspaceBackupPath, 'file')).length, 1); + assert.equal(fs.existsSync(fooBackupPath), true); + assert.equal(fs.readFileSync(fooBackupPath), `${fooFile.toString()}\ntest`); + assert.ok(!service.hasBackupSync(fooFile, 555)); + assert.ok(service.hasBackupSync(fooFile, 666)); }); test('text file (with meta)', async () => { @@ -162,6 +172,7 @@ suite('BackupFileService', () => { assert.equal(fs.readdirSync(path.join(workspaceBackupPath, 'file')).length, 1); assert.equal(fs.existsSync(fooBackupPath), true); assert.equal(fs.readFileSync(fooBackupPath).toString(), `${fooFile.toString()} {"etag":"678","orphaned":true}\ntest`); + assert.ok(service.hasBackupSync(fooFile)); }); test('untitled file', async () => { @@ -169,6 +180,7 @@ suite('BackupFileService', () => { assert.equal(fs.readdirSync(path.join(workspaceBackupPath, 'untitled')).length, 1); assert.equal(fs.existsSync(untitledBackupPath), true); assert.equal(fs.readFileSync(untitledBackupPath), `${untitledFile.toString()}\ntest`); + assert.ok(service.hasBackupSync(untitledFile)); }); test('text file (ITextSnapshot)', async () => { @@ -178,6 +190,8 @@ suite('BackupFileService', () => { assert.equal(fs.readdirSync(path.join(workspaceBackupPath, 'file')).length, 1); assert.equal(fs.existsSync(fooBackupPath), true); assert.equal(fs.readFileSync(fooBackupPath), `${fooFile.toString()}\ntest`); + assert.ok(service.hasBackupSync(fooFile)); + model.dispose(); }); @@ -188,6 +202,7 @@ suite('BackupFileService', () => { assert.equal(fs.readdirSync(path.join(workspaceBackupPath, 'untitled')).length, 1); assert.equal(fs.existsSync(untitledBackupPath), true); assert.equal(fs.readFileSync(untitledBackupPath), `${untitledFile.toString()}\ntest`); + model.dispose(); }); @@ -199,6 +214,8 @@ suite('BackupFileService', () => { assert.equal(fs.readdirSync(path.join(workspaceBackupPath, 'file')).length, 1); assert.equal(fs.existsSync(fooBackupPath), true); assert.equal(fs.readFileSync(fooBackupPath), `${fooFile.toString()}\n${largeString}`); + assert.ok(service.hasBackupSync(fooFile)); + model.dispose(); }); @@ -210,6 +227,8 @@ suite('BackupFileService', () => { assert.equal(fs.readdirSync(path.join(workspaceBackupPath, 'untitled')).length, 1); assert.equal(fs.existsSync(untitledBackupPath), true); assert.equal(fs.readFileSync(untitledBackupPath), `${untitledFile.toString()}\n${largeString}`); + assert.ok(service.hasBackupSync(untitledFile)); + model.dispose(); }); }); @@ -218,9 +237,12 @@ suite('BackupFileService', () => { test('text file', async () => { await service.backupResource(fooFile, createTextBufferFactory('test').create(DefaultEndOfLine.LF).createSnapshot(false)); assert.equal(fs.readdirSync(path.join(workspaceBackupPath, 'file')).length, 1); + assert.ok(service.hasBackupSync(fooFile)); + await service.discardResourceBackup(fooFile); assert.equal(fs.existsSync(fooBackupPath), false); assert.equal(fs.readdirSync(path.join(workspaceBackupPath, 'file')).length, 0); + assert.ok(!service.hasBackupSync(fooFile)); }); test('untitled file', async () => { diff --git a/src/vs/workbench/services/textfile/browser/textFileService.ts b/src/vs/workbench/services/textfile/browser/textFileService.ts index 8d653165119..0fbacb65bc1 100644 --- a/src/vs/workbench/services/textfile/browser/textFileService.ts +++ b/src/vs/workbench/services/textfile/browser/textFileService.ts @@ -7,6 +7,7 @@ import { TextFileService } from 'vs/workbench/services/textfile/common/textFileS import { ITextFileService, IResourceEncodings, IResourceEncoding } from 'vs/workbench/services/textfile/common/textfiles'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ShutdownReason } from 'vs/platform/lifecycle/common/lifecycle'; +import { Schemas } from 'vs/base/common/network'; export class BrowserTextFileService extends TextFileService { @@ -16,17 +17,36 @@ export class BrowserTextFileService extends TextFileService { } }; - protected beforeShutdown(reason: ShutdownReason): boolean | Promise { - const veto = super.beforeShutdown(reason); + protected beforeShutdown(reason: ShutdownReason): boolean { + return this.doBeforeShutdownSync(reason); + } - // Web: there is no support for long running unload handlers. As such - // we need to return a direct boolean veto when we detect that there - // are dirty files around. - if (veto instanceof Promise) { - return this.getDirty().length > 0; + private doBeforeShutdownSync(reason: ShutdownReason): boolean { + const dirtyResources = this.getDirty(); + if (!dirtyResources.length) { + return false; // no dirty: no veto } - return veto; + if (!this.isHotExitEnabled) { + return true; // dirty without backup: veto + } + + for (const dirtyResource of dirtyResources) { + let hasBackup = false; + + if (this.fileService.canHandleResource(dirtyResource)) { + const model = this.models.get(dirtyResource); + hasBackup = !!(model && model.hasBackup()); + } else if (dirtyResource.scheme === Schemas.untitled) { + hasBackup = this.untitledEditorService.hasBackup(dirtyResource); + } + + if (!hasBackup) { + return true; // dirty without backup: veto + } + } + + return false; // dirty with backups: no veto } } diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts index 511daf8d218..3d7eb88b09b 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts @@ -237,6 +237,10 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil } } + hasBackup(): boolean { + return this.backupFileService.hasBackupSync(this.resource, this.versionId); + } + async revert(soft?: boolean): Promise { if (!this.isResolved()) { return; diff --git a/src/vs/workbench/services/textfile/common/textFileService.ts b/src/vs/workbench/services/textfile/common/textFileService.ts index bb58fa2e153..14cdc03b5d2 100644 --- a/src/vs/workbench/services/textfile/common/textFileService.ts +++ b/src/vs/workbench/services/textfile/common/textFileService.ts @@ -73,7 +73,7 @@ export abstract class TextFileService extends Disposable implements ITextFileSer constructor( @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, @IFileService protected readonly fileService: IFileService, - @IUntitledEditorService private readonly untitledEditorService: IUntitledEditorService, + @IUntitledEditorService protected readonly untitledEditorService: IUntitledEditorService, @ILifecycleService private readonly lifecycleService: ILifecycleService, @IInstantiationService protected instantiationService: IInstantiationService, @IConfigurationService private readonly configurationService: IConfigurationService, @@ -152,7 +152,7 @@ export abstract class TextFileService extends Disposable implements ITextFileSer // If hot exit is enabled, backup dirty files and allow to exit without confirmation if (this.isHotExitEnabled) { - return this.backupBeforeShutdown(dirty, this.models, reason).then(didBackup => { + return this.backupBeforeShutdown(dirty, reason).then(didBackup => { if (didBackup) { return this.noVeto({ cleanUpBackups: false }); // no veto and no backup cleanup (since backup was successful) } @@ -171,7 +171,7 @@ export abstract class TextFileService extends Disposable implements ITextFileSer return this.confirmBeforeShutdown(); } - private async backupBeforeShutdown(dirtyToBackup: URI[], textFileEditorModelManager: ITextFileEditorModelManager, reason: ShutdownReason): Promise { + private async backupBeforeShutdown(dirtyToBackup: URI[], reason: ShutdownReason): Promise { const windowCount = await this.windowsService.getWindowCount(); // When quit is requested skip the confirm callback and attempt to backup all workspaces. @@ -212,24 +212,24 @@ export abstract class TextFileService extends Disposable implements ITextFileSer return false; } - await this.backupAll(dirtyToBackup, textFileEditorModelManager); + await this.backupAll(dirtyToBackup); return true; } - private backupAll(dirtyToBackup: URI[], textFileEditorModelManager: ITextFileEditorModelManager): Promise { + private backupAll(dirtyToBackup: URI[]): Promise { // split up between files and untitled const filesToBackup: ITextFileEditorModel[] = []; const untitledToBackup: URI[] = []; - dirtyToBackup.forEach(s => { - if (this.fileService.canHandleResource(s)) { - const model = textFileEditorModelManager.get(s); + dirtyToBackup.forEach(dirty => { + if (this.fileService.canHandleResource(dirty)) { + const model = this.models.get(dirty); if (model) { filesToBackup.push(model); } - } else if (s.scheme === Schemas.untitled) { - untitledToBackup.push(s); + } else if (dirty.scheme === Schemas.untitled) { + untitledToBackup.push(dirty); } }); @@ -593,11 +593,11 @@ export abstract class TextFileService extends Disposable implements ITextFileSer // split up between files and untitled const filesToSave: URI[] = []; const untitledToSave: URI[] = []; - toSave.forEach(s => { - if ((Array.isArray(arg1) || arg1 === true /* includeUntitled */) && s.scheme === Schemas.untitled) { - untitledToSave.push(s); + toSave.forEach(resourceToSave => { + if ((Array.isArray(arg1) || arg1 === true /* includeUntitled */) && resourceToSave.scheme === Schemas.untitled) { + untitledToSave.push(resourceToSave); } else { - filesToSave.push(s); + filesToSave.push(resourceToSave); } }); diff --git a/src/vs/workbench/services/textfile/common/textfiles.ts b/src/vs/workbench/services/textfile/common/textfiles.ts index a83474a5806..1cbf25a56ef 100644 --- a/src/vs/workbench/services/textfile/common/textfiles.ts +++ b/src/vs/workbench/services/textfile/common/textfiles.ts @@ -468,6 +468,8 @@ export interface ITextFileEditorModel extends ITextEditorModel, IEncodingSupport backup(target?: URI): Promise; + hasBackup(): boolean; + isDirty(): boolean; isResolved(): this is IResolvedTextFileEditorModel; diff --git a/src/vs/workbench/services/untitled/common/untitledEditorService.ts b/src/vs/workbench/services/untitled/common/untitledEditorService.ts index 35b571ec52b..5996ee18648 100644 --- a/src/vs/workbench/services/untitled/common/untitledEditorService.ts +++ b/src/vs/workbench/services/untitled/common/untitledEditorService.ts @@ -66,6 +66,11 @@ export interface IUntitledEditorService { */ isDirty(resource: URI): boolean; + /** + * Find out if a backup with the provided resource exists and has a backup on disk. + */ + hasBackup(resource: URI): boolean; + /** * Reverts the untitled resources if found. */ @@ -170,6 +175,12 @@ export class UntitledEditorService extends Disposable implements IUntitledEditor return input ? input.isDirty() : false; } + hasBackup(resource: URI): boolean { + const input = this.get(resource); + + return input ? input.hasBackup() : false; + } + getDirty(resources?: URI[]): URI[] { let inputs: UntitledEditorInput[]; if (resources) { @@ -234,21 +245,10 @@ export class UntitledEditorService extends Disposable implements IUntitledEditor const input = this.instantiationService.createInstance(UntitledEditorInput, untitledResource, hasAssociatedFilePath, mode, initialValue, encoding); - const contentListener = input.onDidModelChangeContent(() => { - this._onDidChangeContent.fire(untitledResource); - }); - - const dirtyListener = input.onDidChangeDirty(() => { - this._onDidChangeDirty.fire(untitledResource); - }); - - const encodingListener = input.onDidModelChangeEncoding(() => { - this._onDidChangeEncoding.fire(untitledResource); - }); - - const disposeListener = input.onDispose(() => { - this._onDidDisposeModel.fire(untitledResource); - }); + const contentListener = input.onDidModelChangeContent(() => this._onDidChangeContent.fire(untitledResource)); + const dirtyListener = input.onDidChangeDirty(() => this._onDidChangeDirty.fire(untitledResource)); + const encodingListener = input.onDidModelChangeEncoding(() => this._onDidChangeEncoding.fire(untitledResource)); + const disposeListener = input.onDispose(() => this._onDidDisposeModel.fire(untitledResource)); // Remove from cache on dispose const onceDispose = Event.once(input.onDispose); diff --git a/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts b/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts index 6fa2c5489ed..500f4761c45 100644 --- a/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts +++ b/src/vs/workbench/services/workspace/electron-browser/workspaceEditingService.ts @@ -32,10 +32,11 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ILabelService } from 'vs/platform/label/common/label'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; +import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; export class WorkspaceEditingService implements IWorkspaceEditingService { - _serviceBrand: any; + _serviceBrand: ServiceIdentifier; constructor( @IJSONEditingService private readonly jsonEditingService: IJSONEditingService, diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index 566e45c5680..9c44fd4c3af 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -1073,6 +1073,10 @@ export class TestBackupFileService implements IBackupFileService { return Promise.resolve(false); } + public hasBackupSync(resource: URI, versionId?: number): boolean { + return false; + } + public loadBackupResource(resource: URI): Promise { return this.hasBackup(resource).then(hasBackup => { if (hasBackup) { From f2ebd70821710b44d846545b818f26be8d1db383 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 9 Jul 2019 15:47:53 +0200 Subject: [PATCH 1268/1449] web - add comment --- src/vs/workbench/services/textfile/browser/textFileService.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/workbench/services/textfile/browser/textFileService.ts b/src/vs/workbench/services/textfile/browser/textFileService.ts index 0fbacb65bc1..9f0660e400c 100644 --- a/src/vs/workbench/services/textfile/browser/textFileService.ts +++ b/src/vs/workbench/services/textfile/browser/textFileService.ts @@ -18,6 +18,10 @@ export class BrowserTextFileService extends TextFileService { }; protected beforeShutdown(reason: ShutdownReason): boolean { + // Web: we cannot perform long running in the shutdown phase + // As such we need to check sync if there are any dirty files + // that have not been backed up yet and then prevent the shutdown + // if that is the case. return this.doBeforeShutdownSync(reason); } From 0289e09e921b1da5f68bc417399751aeb7fa96e1 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 9 Jul 2019 15:55:38 +0200 Subject: [PATCH 1269/1449] files - add a test for situations as #76861 --- .../files/test/node/diskFileService.test.ts | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/services/files/test/node/diskFileService.test.ts b/src/vs/workbench/services/files/test/node/diskFileService.test.ts index a5214b8292f..340475ad282 100644 --- a/src/vs/workbench/services/files/test/node/diskFileService.test.ts +++ b/src/vs/workbench/services/files/test/node/diskFileService.test.ts @@ -660,6 +660,23 @@ suite('Disk File Service', () => { assert.equal(event!.target!.resource.fsPath, renamed.resource.fsPath); }); + test('move - same file should throw', async () => { + let source = await service.resolve(URI.file(join(testDir, 'index.html')), { resolveMetadata: true }); + const originalSize = source.size; + + const targetParent = URI.file(dirname(source.resource.fsPath)); + const target = targetParent.with({ path: posix.join(targetParent.path, posix.basename(source.resource.path)) }); + + try { + await service.move(source.resource, target, true); + } catch (error) { + assert.ok(error); + } + + source = await service.resolve(source.resource, { resolveMetadata: true }); + assert.equal(originalSize, source.size); + }); + test('move - source parent of target', async () => { let event: FileOperationEvent; disposables.add(service.onAfterOperation(e => event = e)); @@ -822,7 +839,9 @@ suite('Disk File Service', () => { }); test('copy - same file should throw', async () => { - const source = await service.resolve(URI.file(join(testDir, 'index.html'))); + let source = await service.resolve(URI.file(join(testDir, 'index.html')), { resolveMetadata: true }); + const originalSize = source.size; + const targetParent = URI.file(dirname(source.resource.fsPath)); const target = targetParent.with({ path: posix.join(targetParent.path, posix.basename(source.resource.path)) }); @@ -831,6 +850,9 @@ suite('Disk File Service', () => { } catch (error) { assert.ok(error); } + + source = await service.resolve(source.resource, { resolveMetadata: true }); + assert.equal(originalSize, source.size); }); test('readFile - small file - buffered', () => { From a4fc9bb8c4cf7e2d0d09afb08bc46750c386cfbb Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 9 Jul 2019 16:16:51 +0200 Subject: [PATCH 1270/1449] improved error propagation, #48034 --- .../singlefolder-tests/workspace.fs.test.ts | 5 +- .../api/browser/mainThreadFileSystem.ts | 81 ++++++++++++------- .../workbench/api/common/extHostFileSystem.ts | 14 +++- 3 files changed, 65 insertions(+), 35 deletions(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.fs.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.fs.test.ts index 497311c51fb..d58bcc2bca9 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.fs.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.fs.test.ts @@ -124,7 +124,7 @@ suite('workspace-fs', () => { assert.ok(false); } catch (e) { assert.ok(e instanceof vscode.FileSystemError); - assert.ok(e.message); + assert.equal(e.name, vscode.FileSystemError.FileNotFound().name); } }); @@ -135,8 +135,7 @@ suite('workspace-fs', () => { assert.ok(false); } catch (e) { assert.ok(e instanceof vscode.FileSystemError); - assert.ok(e.message); - assert.ok(e.name); + assert.equal(e.name, vscode.FileSystemError.Unavailable().name); } }); }); diff --git a/src/vs/workbench/api/browser/mainThreadFileSystem.ts b/src/vs/workbench/api/browser/mainThreadFileSystem.ts index 331ba328297..4df264ea14e 100644 --- a/src/vs/workbench/api/browser/mainThreadFileSystem.ts +++ b/src/vs/workbench/api/browser/mainThreadFileSystem.ts @@ -6,7 +6,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import { IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; import { URI, UriComponents } from 'vs/base/common/uri'; -import { FileWriteOptions, FileSystemProviderCapabilities, IFileChange, IFileService, IFileSystemProvider, IStat, IWatchOptions, FileType, FileOverwriteOptions, FileDeleteOptions, FileOpenOptions, IFileStat } from 'vs/platform/files/common/files'; +import { FileWriteOptions, FileSystemProviderCapabilities, IFileChange, IFileService, IFileSystemProvider, IStat, IWatchOptions, FileType, FileOverwriteOptions, FileDeleteOptions, FileOpenOptions, IFileStat, FileOperationError, FileOperationResult, FileSystemProviderErrorCode } from 'vs/platform/files/common/files'; import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { ExtHostContext, ExtHostFileSystemShape, IExtHostContext, IFileChangeDto, MainContext, MainThreadFileSystemShape } from '../common/extHost.protocol'; import { VSBuffer } from 'vs/base/common/buffer'; @@ -47,53 +47,78 @@ export class MainThreadFileSystem implements MainThreadFileSystemShape { } - // --- + // --- consumer fs, vscode.workspace.fs - async $stat(uri: UriComponents): Promise { - const stat = await this._fileService.resolve(URI.revive(uri), { resolveMetadata: true }); - return { - ctime: 0, - mtime: stat.mtime, - size: stat.size, - type: MainThreadFileSystem._getFileType(stat) - }; + $stat(uri: UriComponents): Promise { + return this._fileService.resolve(URI.revive(uri), { resolveMetadata: true }).then(stat => { + return { + ctime: 0, + mtime: stat.mtime, + size: stat.size, + type: MainThreadFileSystem._getFileType(stat) + }; + }).catch(MainThreadFileSystem._handleError); } - async $readdir(uri: UriComponents): Promise<[string, FileType][]> { - const stat = await this._fileService.resolve(URI.revive(uri), { resolveMetadata: false }); - if (!stat.children) { - throw new Error('not a folder'); - } - return stat.children.map(child => [child.name, MainThreadFileSystem._getFileType(child)]); + $readdir(uri: UriComponents): Promise<[string, FileType][]> { + return this._fileService.resolve(URI.revive(uri), { resolveMetadata: false }).then(stat => { + if (!stat.isDirectory) { + const err = new Error(stat.name); + err.name = FileSystemProviderErrorCode.FileNotADirectory; + throw err; + } + return !stat.children ? [] : stat.children.map(child => [child.name, MainThreadFileSystem._getFileType(child)]); + }).catch(MainThreadFileSystem._handleError); } private static _getFileType(stat: IFileStat): FileType { return (stat.isDirectory ? FileType.Directory : FileType.File) + (stat.isSymbolicLink ? FileType.SymbolicLink : 0); } - async $readFile(uri: UriComponents): Promise { - return (await this._fileService.readFile(URI.revive(uri))).value; + $readFile(uri: UriComponents): Promise { + return this._fileService.readFile(URI.revive(uri)).then(file => file.value).catch(MainThreadFileSystem._handleError); } - async $writeFile(uri: UriComponents, content: VSBuffer, opts: FileWriteOptions): Promise { + $writeFile(uri: UriComponents, content: VSBuffer, opts: FileWriteOptions): Promise { //todo@joh honor opts - await this._fileService.writeFile(URI.revive(uri), content, {}); + return this._fileService.writeFile(URI.revive(uri), content, {}).catch(MainThreadFileSystem._handleError); } - async $rename(source: UriComponents, target: UriComponents, opts: FileOverwriteOptions): Promise { - await this._fileService.move(URI.revive(source), URI.revive(target), opts.overwrite); + $rename(source: UriComponents, target: UriComponents, opts: FileOverwriteOptions): Promise { + return this._fileService.move(URI.revive(source), URI.revive(target), opts.overwrite).catch(MainThreadFileSystem._handleError); } - async $copy(source: UriComponents, target: UriComponents, opts: FileOverwriteOptions): Promise { - await this._fileService.copy(URI.revive(source), URI.revive(target), opts.overwrite); + $copy(source: UriComponents, target: UriComponents, opts: FileOverwriteOptions): Promise { + return this._fileService.copy(URI.revive(source), URI.revive(target), opts.overwrite).catch(MainThreadFileSystem._handleError); } - async $mkdir(uri: UriComponents): Promise { - await this._fileService.createFolder(URI.revive(uri)); + $mkdir(uri: UriComponents): Promise { + return this._fileService.createFolder(URI.revive(uri)).catch(MainThreadFileSystem._handleError); } - async $delete(uri: UriComponents, opts: FileDeleteOptions): Promise { - await this._fileService.del(URI.revive(uri), opts); + $delete(uri: UriComponents, opts: FileDeleteOptions): Promise { + return this._fileService.del(URI.revive(uri), opts).catch(MainThreadFileSystem._handleError); + } + + private static _handleError(err: any): never { + if (err instanceof FileOperationError) { + switch (err.fileOperationResult) { + case FileOperationResult.FILE_NOT_FOUND: + err.name = FileSystemProviderErrorCode.FileNotFound; + break; + case FileOperationResult.FILE_IS_DIRECTORY: + err.name = FileSystemProviderErrorCode.FileIsADirectory; + break; + case FileOperationResult.FILE_PERMISSION_DENIED: + err.name = FileSystemProviderErrorCode.NoPermissions; + break; + case FileOperationResult.FILE_MOVE_CONFLICT: + err.name = FileSystemProviderErrorCode.FileExists; + break; + } + } + + throw err; } } diff --git a/src/vs/workbench/api/common/extHostFileSystem.ts b/src/vs/workbench/api/common/extHostFileSystem.ts index 46d9301f191..ddef167c307 100644 --- a/src/vs/workbench/api/common/extHostFileSystem.ts +++ b/src/vs/workbench/api/common/extHostFileSystem.ts @@ -132,12 +132,18 @@ class ConsumerFileSystem implements vscode.FileSystem { return this._proxy.$copy(source, destination, options).catch(ConsumerFileSystem._handleError); } private static _handleError(err: any): never { - if (err instanceof Error && err.name === 'ENOPRO') { - throw FileSystemError.Unavailable(err.message); - } else { - // generic error + // generic error + if (!(err instanceof Error)) { throw new FileSystemError(String(err)); } + + // no provider (unknown scheme) error + if (err.name === 'ENOPRO') { + throw FileSystemError.Unavailable(err.message); + } + + // file system error + throw new FileSystemError(err.message, err.name as files.FileSystemProviderErrorCode); } } From 65270230afb5c643979dde61e7182f5d0d8260d1 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 9 Jul 2019 16:22:56 +0200 Subject: [PATCH 1271/1449] tweak options for delete and write, #48034 --- .../src/singlefolder-tests/workspace.fs.test.ts | 4 ++-- src/vs/vscode.proposed.d.ts | 7 +++---- src/vs/workbench/api/browser/mainThreadFileSystem.ts | 5 ++--- src/vs/workbench/api/common/extHost.protocol.ts | 2 +- src/vs/workbench/api/common/extHostFileSystem.ts | 8 ++++---- 5 files changed, 12 insertions(+), 14 deletions(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.fs.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.fs.test.ts index d58bcc2bca9..06728e206d9 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.fs.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.fs.test.ts @@ -83,7 +83,7 @@ suite('workspace-fs', () => { // ensure non empty folder cannot be deleted try { - await vscode.workspace.fs.delete(folder, { recursive: false }); + await vscode.workspace.fs.delete(folder, { recursive: false, useTrash: false }); assert.ok(false); } catch { await vscode.workspace.fs.stat(folder); @@ -100,7 +100,7 @@ suite('workspace-fs', () => { } // delete non empty folder with recursive-flag - await vscode.workspace.fs.delete(folder, { recursive: true }); + await vscode.workspace.fs.delete(folder, { recursive: true, useTrash: false }); // esnure folder/file are gone try { diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index e182ea0629c..41a3463b7b6 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1638,17 +1638,16 @@ declare module 'vscode' { * * @param uri The uri of the file. * @param content The new content of the file. - * @param options Defines if missing files should or must be created. */ - writeFile(uri: Uri, content: Uint8Array, options?: { create: boolean, overwrite: boolean }): Thenable; + writeFile(uri: Uri, content: Uint8Array): Thenable; /** * Delete a file. * * @param uri The resource that is to be deleted. - * @param options Defines if deletion of folders is recursive. + * @param options Defines if trash can should be used and if deletion of folders is recursive */ - delete(uri: Uri, options?: { recursive: boolean }): Thenable; + delete(uri: Uri, options?: { recursive: boolean, useTrash: boolean }): Thenable; /** * Rename a file or folder. diff --git a/src/vs/workbench/api/browser/mainThreadFileSystem.ts b/src/vs/workbench/api/browser/mainThreadFileSystem.ts index 4df264ea14e..0d232f2870d 100644 --- a/src/vs/workbench/api/browser/mainThreadFileSystem.ts +++ b/src/vs/workbench/api/browser/mainThreadFileSystem.ts @@ -79,9 +79,8 @@ export class MainThreadFileSystem implements MainThreadFileSystemShape { return this._fileService.readFile(URI.revive(uri)).then(file => file.value).catch(MainThreadFileSystem._handleError); } - $writeFile(uri: UriComponents, content: VSBuffer, opts: FileWriteOptions): Promise { - //todo@joh honor opts - return this._fileService.writeFile(URI.revive(uri), content, {}).catch(MainThreadFileSystem._handleError); + $writeFile(uri: UriComponents, content: VSBuffer): Promise { + return this._fileService.writeFile(URI.revive(uri), content).catch(MainThreadFileSystem._handleError); } $rename(source: UriComponents, target: UriComponents, opts: FileOverwriteOptions): Promise { diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 0bdb48ef1c2..99b544184ca 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -612,7 +612,7 @@ export interface MainThreadFileSystemShape extends IDisposable { $stat(uri: UriComponents): Promise; $readdir(resource: UriComponents): Promise<[string, files.FileType][]>; $readFile(resource: UriComponents): Promise; - $writeFile(resource: UriComponents, content: VSBuffer, opts: files.FileWriteOptions): Promise; + $writeFile(resource: UriComponents, content: VSBuffer): Promise; $rename(resource: UriComponents, target: UriComponents, opts: files.FileOverwriteOptions): Promise; $copy(resource: UriComponents, target: UriComponents, opts: files.FileOverwriteOptions): Promise; $mkdir(resource: UriComponents): Promise; diff --git a/src/vs/workbench/api/common/extHostFileSystem.ts b/src/vs/workbench/api/common/extHostFileSystem.ts index ddef167c307..8eae35ee7d8 100644 --- a/src/vs/workbench/api/common/extHostFileSystem.ts +++ b/src/vs/workbench/api/common/extHostFileSystem.ts @@ -119,11 +119,11 @@ class ConsumerFileSystem implements vscode.FileSystem { async readFile(uri: vscode.Uri): Promise { return this._proxy.$readFile(uri).then(buff => buff.buffer).catch(ConsumerFileSystem._handleError); } - writeFile(uri: vscode.Uri, content: Uint8Array, options: { create: boolean; overwrite: boolean; } = { create: true, overwrite: true }): Promise { - return this._proxy.$writeFile(uri, VSBuffer.wrap(content), options).catch(ConsumerFileSystem._handleError); + writeFile(uri: vscode.Uri, content: Uint8Array): Promise { + return this._proxy.$writeFile(uri, VSBuffer.wrap(content)).catch(ConsumerFileSystem._handleError); } - delete(uri: vscode.Uri, options: { recursive: boolean; } = { recursive: false }): Promise { - return this._proxy.$delete(uri, { ...options, useTrash: false }).catch(ConsumerFileSystem._handleError); //todo@joh useTrash + delete(uri: vscode.Uri, options: { recursive: boolean; useTrash: boolean; } = { recursive: false, useTrash: false }): Promise { + return this._proxy.$delete(uri, options).catch(ConsumerFileSystem._handleError); } rename(oldUri: vscode.Uri, newUri: vscode.Uri, options: { overwrite: boolean; } = { overwrite: false }): Promise { return this._proxy.$rename(oldUri, newUri, options).catch(ConsumerFileSystem._handleError); From bc00e886a9531a376d38ed0586b3b0551bc8d0f6 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 9 Jul 2019 16:27:53 +0200 Subject: [PATCH 1272/1449] make it easier to use options, #48034 --- src/vs/vscode.proposed.d.ts | 6 +++--- src/vs/workbench/api/common/extHostFileSystem.ts | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 41a3463b7b6..20b1b8eaa99 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1647,7 +1647,7 @@ declare module 'vscode' { * @param uri The resource that is to be deleted. * @param options Defines if trash can should be used and if deletion of folders is recursive */ - delete(uri: Uri, options?: { recursive: boolean, useTrash: boolean }): Thenable; + delete(uri: Uri, options?: { recursive?: boolean, useTrash?: boolean }): Thenable; /** * Rename a file or folder. @@ -1656,7 +1656,7 @@ declare module 'vscode' { * @param newUri The new location. * @param options Defines if existing files should be overwritten. */ - rename(source: Uri, target: Uri, options?: { overwrite: boolean }): Thenable; + rename(source: Uri, target: Uri, options?: { overwrite?: boolean }): Thenable; /** * Copy files or folders. Implementing this function is optional but it will speedup @@ -1666,7 +1666,7 @@ declare module 'vscode' { * @param destination The destination location. * @param options Defines if existing files should be overwritten. */ - copy(source: Uri, target: Uri, options?: { overwrite: boolean }): Thenable; + copy(source: Uri, target: Uri, options?: { overwrite?: boolean }): Thenable; } export namespace workspace { diff --git a/src/vs/workbench/api/common/extHostFileSystem.ts b/src/vs/workbench/api/common/extHostFileSystem.ts index 8eae35ee7d8..7e22304c0fd 100644 --- a/src/vs/workbench/api/common/extHostFileSystem.ts +++ b/src/vs/workbench/api/common/extHostFileSystem.ts @@ -122,14 +122,14 @@ class ConsumerFileSystem implements vscode.FileSystem { writeFile(uri: vscode.Uri, content: Uint8Array): Promise { return this._proxy.$writeFile(uri, VSBuffer.wrap(content)).catch(ConsumerFileSystem._handleError); } - delete(uri: vscode.Uri, options: { recursive: boolean; useTrash: boolean; } = { recursive: false, useTrash: false }): Promise { - return this._proxy.$delete(uri, options).catch(ConsumerFileSystem._handleError); + delete(uri: vscode.Uri, options?: { recursive?: boolean; useTrash?: boolean; }): Promise { + return this._proxy.$delete(uri, { ...{ recursive: false, useTrash: false }, ...options }).catch(ConsumerFileSystem._handleError); } - rename(oldUri: vscode.Uri, newUri: vscode.Uri, options: { overwrite: boolean; } = { overwrite: false }): Promise { - return this._proxy.$rename(oldUri, newUri, options).catch(ConsumerFileSystem._handleError); + rename(oldUri: vscode.Uri, newUri: vscode.Uri, options?: { overwrite?: boolean; }): Promise { + return this._proxy.$rename(oldUri, newUri, { ...{ overwrite: false }, ...options }).catch(ConsumerFileSystem._handleError); } - copy(source: vscode.Uri, destination: vscode.Uri, options: { overwrite: boolean } = { overwrite: false }): Promise { - return this._proxy.$copy(source, destination, options).catch(ConsumerFileSystem._handleError); + copy(source: vscode.Uri, destination: vscode.Uri, options?: { overwrite?: boolean }): Promise { + return this._proxy.$copy(source, destination, { ...{ overwrite: false }, ...options }).catch(ConsumerFileSystem._handleError); } private static _handleError(err: any): never { // generic error From b5c5f589418c0c7b471678fe62abaee0e0bb5dc5 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 9 Jul 2019 12:56:44 +0200 Subject: [PATCH 1273/1449] Do not use ModelLineTokens objects --- src/vs/editor/common/model/textModelTokens.ts | 194 +++++++++--------- 1 file changed, 98 insertions(+), 96 deletions(-) diff --git a/src/vs/editor/common/model/textModelTokens.ts b/src/vs/editor/common/model/textModelTokens.ts index 2e7dab70df9..42792137d44 100644 --- a/src/vs/editor/common/model/textModelTokens.ts +++ b/src/vs/editor/common/model/textModelTokens.ts @@ -31,45 +31,35 @@ const enum Constants { } class ModelLineTokens { - public beginState: IState | null; - public lineTokens: ArrayBuffer | null; - public valid: boolean; - constructor() { - this.beginState = null; - this.lineTokens = null; - this.valid = false; + public static deleteBeginning(lineTokens: ArrayBuffer | null, toChIndex: number): ArrayBuffer | null { + if (lineTokens === null || lineTokens === EMPTY_LINE_TOKENS) { + return lineTokens; + } + return this.delete(lineTokens, 0, toChIndex); } - public deleteBeginning(toChIndex: number): void { - if (this.lineTokens === null || this.lineTokens === EMPTY_LINE_TOKENS) { - return; - } - this.delete(0, toChIndex); - } - - public deleteEnding(fromChIndex: number): void { - if (this.lineTokens === null || this.lineTokens === EMPTY_LINE_TOKENS) { - return; + public static deleteEnding(lineTokens: ArrayBuffer | null, fromChIndex: number): ArrayBuffer | null { + if (lineTokens === null || lineTokens === EMPTY_LINE_TOKENS) { + return lineTokens; } - const tokens = new Uint32Array(this.lineTokens); + const tokens = new Uint32Array(lineTokens); const lineTextLength = tokens[tokens.length - 2]; - this.delete(fromChIndex, lineTextLength); + return this.delete(lineTokens, fromChIndex, lineTextLength); } - public delete(fromChIndex: number, toChIndex: number): void { - if (this.lineTokens === null || this.lineTokens === EMPTY_LINE_TOKENS || fromChIndex === toChIndex) { - return; + public static delete(lineTokens: ArrayBuffer | null, fromChIndex: number, toChIndex: number): ArrayBuffer | null { + if (lineTokens === null || lineTokens === EMPTY_LINE_TOKENS || fromChIndex === toChIndex) { + return lineTokens; } - const tokens = new Uint32Array(this.lineTokens); + const tokens = new Uint32Array(lineTokens); const tokensCount = (tokens.length >>> 1); // special case: deleting everything if (fromChIndex === 0 && tokens[tokens.length - 2] === toChIndex) { - this.lineTokens = EMPTY_LINE_TOKENS; - return; + return EMPTY_LINE_TOKENS; } const fromTokenIndex = LineTokens.findIndexInTokensArray(tokens, fromChIndex); @@ -82,7 +72,7 @@ class ModelLineTokens { for (let i = fromTokenIndex; i < tokensCount; i++) { tokens[i << 1] -= delta; } - return; + return lineTokens; } let dest: number; @@ -108,31 +98,29 @@ class ModelLineTokens { if (dest === tokens.length) { // nothing to trim - return; + return lineTokens; } let tmp = new Uint32Array(dest); tmp.set(tokens.subarray(0, dest), 0); - this.lineTokens = tmp.buffer; + return tmp.buffer; } - public append(_otherTokens: ArrayBuffer | null): void { + public static append(lineTokens: ArrayBuffer | null, _otherTokens: ArrayBuffer | null): ArrayBuffer | null { if (_otherTokens === EMPTY_LINE_TOKENS) { - return; + return lineTokens; } - if (this.lineTokens === EMPTY_LINE_TOKENS) { - this.lineTokens = _otherTokens; - return; + if (lineTokens === EMPTY_LINE_TOKENS) { + return _otherTokens; } - if (this.lineTokens === null) { - return; + if (lineTokens === null) { + return lineTokens; } if (_otherTokens === null) { // cannot determine combined line length... - this.lineTokens = null; - return; + return null; } - const myTokens = new Uint32Array(this.lineTokens); + const myTokens = new Uint32Array(lineTokens); const otherTokens = new Uint32Array(_otherTokens); const otherTokensCount = (otherTokens.length >>> 1); @@ -144,16 +132,16 @@ class ModelLineTokens { result[dest++] = otherTokens[(i << 1)] + delta; result[dest++] = otherTokens[(i << 1) + 1]; } - this.lineTokens = result.buffer; + return result.buffer; } - public insert(chIndex: number, textLength: number): void { - if (!this.lineTokens) { + public static insert(lineTokens: ArrayBuffer | null, chIndex: number, textLength: number): ArrayBuffer | null { + if (lineTokens === null || lineTokens === EMPTY_LINE_TOKENS) { // nothing to do - return; + return lineTokens; } - const tokens = new Uint32Array(this.lineTokens); + const tokens = new Uint32Array(lineTokens); const tokensCount = (tokens.length >>> 1); let fromTokenIndex = LineTokens.findIndexInTokensArray(tokens, chIndex); @@ -166,19 +154,7 @@ class ModelLineTokens { for (let tokenIndex = fromTokenIndex; tokenIndex < tokensCount; tokenIndex++) { tokens[tokenIndex << 1] += textLength; } - } - - public setTokens(lineTokens: ArrayBuffer | null, valid: boolean): void { - this.lineTokens = lineTokens; - this.valid = valid; - } - - public setBeginState(beginState: IState | null): void { - this.beginState = beginState; - } - - public invalidate(): void { - this.valid = false; + return lineTokens; } } @@ -195,7 +171,10 @@ export interface ITokensStore { } export class TokensStore implements ITokensStore { - private _tokens: ModelLineTokens[]; + private _lineTokens: (ArrayBuffer | null)[]; + private _beginState: (IState | null)[]; + private _valid: boolean[]; + private _len: number; private _invalidLineStartIndex: number; constructor(initialState: IState | null) { @@ -203,7 +182,10 @@ export class TokensStore implements ITokensStore { } private _reset(initialState: IState | null): void { - this._tokens = []; + this._lineTokens = []; + this._beginState = []; + this._valid = []; + this._len = 0; this._invalidLineStartIndex = 0; if (initialState) { @@ -217,8 +199,8 @@ export class TokensStore implements ITokensStore { public getTokens(topLevelLanguageId: LanguageId, lineIndex: number, lineText: string): LineTokens { let rawLineTokens: ArrayBuffer | null = null; - if (lineIndex < this._tokens.length) { - rawLineTokens = this._tokens[lineIndex].lineTokens; + if (lineIndex < this._len) { + rawLineTokens = this._lineTokens[lineIndex]; } if (rawLineTokens !== null && rawLineTokens !== EMPTY_LINE_TOKENS) { @@ -232,8 +214,8 @@ export class TokensStore implements ITokensStore { } private _invalidateLine(lineIndex: number): void { - if (lineIndex < this._tokens.length) { - this._tokens[lineIndex].invalidate(); + if (lineIndex < this._len) { + this._valid[lineIndex] = false; } if (lineIndex < this._invalidLineStartIndex) { @@ -242,15 +224,15 @@ export class TokensStore implements ITokensStore { } private _isValid(lineIndex: number): boolean { - if (lineIndex < this._tokens.length) { - return this._tokens[lineIndex].valid; + if (lineIndex < this._len) { + return this._valid[lineIndex]; } return false; } public getBeginState(lineIndex: number): IState | null { - if (lineIndex < this._tokens.length) { - return this._tokens[lineIndex].beginState; + if (lineIndex < this._len) { + return this._beginState[lineIndex]; } return null; } @@ -278,24 +260,52 @@ export class TokensStore implements ITokensStore { return tokens.buffer; } - private _getOrCreate(lineIndex: number): ModelLineTokens { - if (lineIndex < this._tokens.length) { - return this._tokens[lineIndex]; + private _ensureLine(lineIndex: number): void { + while (lineIndex >= this._len) { + this._lineTokens[this._len] = null; + this._beginState[this._len] = null; + this._valid[this._len] = false; + this._len++; } - while (lineIndex > this._tokens.length) { - this._tokens[this._tokens.length] = new ModelLineTokens(); + } + + private _deleteLines(start: number, deleteCount: number): void { + if (deleteCount === 0) { + return; } - const result = new ModelLineTokens(); - this._tokens[lineIndex] = result; - return result; + this._lineTokens.splice(start, deleteCount); + this._beginState.splice(start, deleteCount); + this._valid.splice(start, deleteCount); + this._len -= deleteCount; + } + + private _insertLines(insertIndex: number, insertCount: number): void { + if (insertCount === 0) { + return; + } + let lineTokens: (ArrayBuffer | null)[] = []; + let beginState: (IState | null)[] = []; + let valid: boolean[] = []; + for (let i = 0; i < insertCount; i++) { + lineTokens[i] = null; + beginState[i] = null; + valid[i] = false; + } + this._lineTokens = arrays.arrayInsert(this._lineTokens, insertIndex, lineTokens); + this._beginState = arrays.arrayInsert(this._beginState, insertIndex, beginState); + this._valid = arrays.arrayInsert(this._valid, insertIndex, valid); + this._len += insertCount; } private _setTokens(lineIndex: number, tokens: ArrayBuffer | null, valid: boolean): void { - this._getOrCreate(lineIndex).setTokens(tokens, valid); + this._ensureLine(lineIndex); + this._lineTokens[lineIndex] = tokens; + this._valid[lineIndex] = valid; } private _setBeginState(lineIndex: number, beginState: IState | null): void { - this._getOrCreate(lineIndex).setBeginState(beginState); + this._ensureLine(lineIndex); + this._beginState[lineIndex] = beginState; } public setGoodTokens(topLevelLanguageId: LanguageId, linesLength: number, lineIndex: number, lineTextLength: number, r: TokenizationResult2): void { @@ -355,7 +365,7 @@ export class TokensStore implements ITokensStore { private _acceptDeleteRange(range: Range): void { const firstLineIndex = range.startLineNumber - 1; - if (firstLineIndex >= this._tokens.length) { + if (firstLineIndex >= this._len) { return; } @@ -365,26 +375,23 @@ export class TokensStore implements ITokensStore { return; } - this._tokens[firstLineIndex].delete(range.startColumn - 1, range.endColumn - 1); + this._lineTokens[firstLineIndex] = ModelLineTokens.delete(this._lineTokens[firstLineIndex], range.startColumn - 1, range.endColumn - 1); return; } - const firstLine = this._tokens[firstLineIndex]; - firstLine.deleteEnding(range.startColumn - 1); + this._lineTokens[firstLineIndex] = ModelLineTokens.deleteEnding(this._lineTokens[firstLineIndex], range.startColumn - 1); const lastLineIndex = range.endLineNumber - 1; let lastLineTokens: ArrayBuffer | null = null; - if (lastLineIndex < this._tokens.length) { - const lastLine = this._tokens[lastLineIndex]; - lastLine.deleteBeginning(range.endColumn - 1); - lastLineTokens = lastLine.lineTokens; + if (lastLineIndex < this._len) { + lastLineTokens = ModelLineTokens.deleteBeginning(this._lineTokens[lastLineIndex], range.endColumn - 1); } // Take remaining text on last line and append it to remaining text on first line - firstLine.append(lastLineTokens); + this._lineTokens[firstLineIndex] = ModelLineTokens.append(this._lineTokens[firstLineIndex], lastLineTokens); // Delete middle lines - this._tokens.splice(range.startLineNumber, range.endLineNumber - range.startLineNumber); + this._deleteLines(range.startLineNumber, range.endLineNumber - range.startLineNumber); } private _acceptInsertText(position: Position, eolCount: number, firstLineLength: number): void { @@ -395,25 +402,20 @@ export class TokensStore implements ITokensStore { } const lineIndex = position.lineNumber - 1; - if (lineIndex >= this._tokens.length) { + if (lineIndex >= this._len) { return; } if (eolCount === 0) { // Inserting text on one line - this._tokens[lineIndex].insert(position.column - 1, firstLineLength); + this._lineTokens[lineIndex] = ModelLineTokens.insert(this._lineTokens[lineIndex], position.column - 1, firstLineLength); return; } - const line = this._tokens[lineIndex]; - line.deleteEnding(position.column - 1); - line.insert(position.column - 1, firstLineLength); + this._lineTokens[lineIndex] = ModelLineTokens.deleteEnding(this._lineTokens[lineIndex], position.column - 1); + this._lineTokens[lineIndex] = ModelLineTokens.insert(this._lineTokens[lineIndex], position.column - 1, firstLineLength); - let insert: ModelLineTokens[] = new Array(eolCount); - for (let i = 0; i < eolCount; i++) { - insert[i] = new ModelLineTokens(); - } - this._tokens = arrays.arrayInsert(this._tokens, position.lineNumber, insert); + this._insertLines(position.lineNumber, eolCount); } //#endregion From 29b1fc900fc550f649619d32334f8bb8540d56c6 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 9 Jul 2019 13:52:27 +0200 Subject: [PATCH 1274/1449] Remove old way of warming tokens --- src/vs/editor/common/model/textModel.ts | 23 ++--------------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index 8d4fd05f31a..4851ca83d4e 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -345,10 +345,6 @@ export class TextModel extends Disposable implements model.ITextModel { toLineNumber: this.getLineCount() }] }); - - if (this._shouldAutoTokenize()) { - this._warmUpTokens(); - } }); this._revalidateTokensTimeout = -1; this._languageRegistryListener = LanguageConfigurationRegistry.onDidChange((e) => { @@ -556,8 +552,7 @@ export class TextModel extends Disposable implements model.ITextModel { public onBeforeAttached(): void { this._attachedEditorCount++; - // Warm up tokens for the editor - this._warmUpTokens(); + this._beginBackgroundTokenization(); if (this._attachedEditorCount === 1) { this._onDidChangeAttached.fire(undefined); } @@ -570,10 +565,6 @@ export class TextModel extends Disposable implements model.ITextModel { } } - private _shouldAutoTokenize(): boolean { - return this.isAttachedToEditor(); - } - public isAttachedToEditor(): boolean { return this._attachedEditorCount > 0; } @@ -1896,7 +1887,7 @@ export class TextModel extends Disposable implements model.ITextModel { } private _beginBackgroundTokenization(): void { - if (this._shouldAutoTokenize() && this._revalidateTokensTimeout === -1) { + if (this.isAttachedToEditor() && this._revalidateTokensTimeout === -1) { this._revalidateTokensTimeout = setTimeout(() => { this._revalidateTokensTimeout = -1; this._revalidateTokensNow(); @@ -1904,16 +1895,6 @@ export class TextModel extends Disposable implements model.ITextModel { } } - _warmUpTokens(): void { - // Warm up first 100 lines (if it takes less than 50ms) - const maxLineNumber = Math.min(100, this.getLineCount()); - this._revalidateTokensNow(maxLineNumber); - - if (this._tokenization.hasLinesToTokenize(this._tokens, this._buffer)) { - this._beginBackgroundTokenization(); - } - } - private _revalidateTokensNow(toLineNumber: number = this._buffer.getLineCount()): void { const MAX_ALLOWED_TIME = 20; const eventBuilder = new ModelTokensChangedEventBuilder(); From 757a6c1e88efff47ab204028f232f82587de45cf Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 9 Jul 2019 15:43:36 +0200 Subject: [PATCH 1275/1449] Extract TextModelTokenization --- src/vs/editor/common/model/textModel.ts | 197 ++------------ src/vs/editor/common/model/textModelTokens.ts | 254 ++++++++++++++++-- .../test/common/model/model.line.test.ts | 6 +- 3 files changed, 249 insertions(+), 208 deletions(-) diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index 4851ca83d4e..ee2191a93f2 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -8,7 +8,6 @@ import { onUnexpectedError } from 'vs/base/common/errors'; import { Emitter, Event } from 'vs/base/common/event'; import { IMarkdownString } from 'vs/base/common/htmlContent'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; -import { StopWatch } from 'vs/base/common/stopwatch'; import * as strings from 'vs/base/common/strings'; import { URI } from 'vs/base/common/uri'; import { EDITOR_MODEL_DEFAULTS } from 'vs/editor/common/config/editorOptions'; @@ -23,9 +22,9 @@ import { IntervalNode, IntervalTree, getNodeIsInOverviewRuler, recomputeMaxEnd } import { PieceTreeTextBufferBuilder } from 'vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder'; import { IModelContentChangedEvent, IModelDecorationsChangedEvent, IModelLanguageChangedEvent, IModelLanguageConfigurationChangedEvent, IModelOptionsChangedEvent, IModelTokensChangedEvent, InternalModelContentChangeEvent, ModelRawChange, ModelRawContentChangedEvent, ModelRawEOLChanged, ModelRawFlush, ModelRawLineChanged, ModelRawLinesDeleted, ModelRawLinesInserted } from 'vs/editor/common/model/textModelEvents'; import { SearchData, SearchParams, TextModelSearch } from 'vs/editor/common/model/textModelSearch'; -import { ModelLinesTokens, ModelTokensChangedEventBuilder, IModelLinesTokens, TokensStore, ITokensStore } from 'vs/editor/common/model/textModelTokens'; +import { TextModelTokenization, countEOL } from 'vs/editor/common/model/textModelTokens'; import { getWordAtText } from 'vs/editor/common/model/wordHelper'; -import { LanguageId, LanguageIdentifier, TokenizationRegistry, FormattingOptions, IState } from 'vs/editor/common/modes'; +import { LanguageId, LanguageIdentifier, FormattingOptions } from 'vs/editor/common/modes'; import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; import { NULL_LANGUAGE_IDENTIFIER } from 'vs/editor/common/modes/nullMode'; import { ignoreBracketsInToken } from 'vs/editor/common/modes/supports'; @@ -243,6 +242,9 @@ export class TextModel extends Disposable implements model.ITextModel { public onDidChangeRawContent(listener: (e: ModelRawContentChangedEvent) => void): IDisposable { return this._eventEmitter.slowEvent((e: InternalModelContentChangeEvent) => listener(e.rawContentChangedEvent)); } + public onDidChangeContentFast(listener: (e: IModelContentChangedEvent) => void): IDisposable { + return this._eventEmitter.fastEvent((e: InternalModelContentChangeEvent) => listener(e.contentChangedEvent)); + } public onDidChangeContent(listener: (e: IModelContentChangedEvent) => void): IDisposable { return this._eventEmitter.slowEvent((e: InternalModelContentChangeEvent) => listener(e.contentChangedEvent)); } @@ -285,11 +287,8 @@ export class TextModel extends Disposable implements model.ITextModel { //#region Tokenization private _languageIdentifier: LanguageIdentifier; - private readonly _tokenizationListener: IDisposable; private readonly _languageRegistryListener: IDisposable; - private _revalidateTokensTimeout: any; - private _tokenization: IModelLinesTokens; - /*private*/_tokens: ITokensStore; + _tokenization: TextModelTokenization; //#endregion constructor(source: string | model.ITextBufferFactory, creationOptions: model.ITextModelCreationOptions, languageIdentifier: LanguageIdentifier | null, associatedResource: URI | null = null) { @@ -332,27 +331,12 @@ export class TextModel extends Disposable implements model.ITextModel { this._isDisposing = false; this._languageIdentifier = languageIdentifier || NULL_LANGUAGE_IDENTIFIER; - this._tokenizationListener = TokenizationRegistry.onDidChange((e) => { - if (e.changedLanguages.indexOf(this._languageIdentifier.language) === -1) { - return; - } - this._resetTokenizationState(); - this.emitModelTokensChangedEvent({ - tokenizationSupportChanged: true, - ranges: [{ - fromLineNumber: 1, - toLineNumber: this.getLineCount() - }] - }); - }); - this._revalidateTokensTimeout = -1; this._languageRegistryListener = LanguageConfigurationRegistry.onDidChange((e) => { if (e.languageIdentifier.id === this._languageIdentifier.id) { this._onDidChangeLanguageConfiguration.fire({}); } }); - this._resetTokenizationState(); this._instanceId = singleLetter(MODEL_ID); this._lastDecorationId = 0; @@ -363,16 +347,16 @@ export class TextModel extends Disposable implements model.ITextModel { this._isUndoing = false; this._isRedoing = false; this._trimAutoWhitespaceLines = null; + + this._tokenization = new TextModelTokenization(this); } public dispose(): void { this._isDisposing = true; this._onWillDispose.fire(); - this._tokenizationListener.dispose(); this._languageRegistryListener.dispose(); - this._clearTimers(); + this._tokenization.dispose(); this._isDisposed = true; - // Null out members, such that any use of a disposed model will throw exceptions sooner rather than later super.dispose(); this._isDisposing = false; } @@ -437,9 +421,6 @@ export class TextModel extends Disposable implements model.ITextModel { this._buffer = textBuffer; this._increaseVersionId(); - // Cancel tokenization, clear all tokens and begin tokenizing - this._resetTokenizationState(); - // Destroy all my decorations this._decorations = Object.create(null); this._decorationsTree = new DecorationsTrees(); @@ -522,37 +503,8 @@ export class TextModel extends Disposable implements model.ITextModel { } } - private _resetTokenizationState(): void { - this._clearTimers(); - let tokenizationSupport = ( - this._isTooLargeForTokenization - ? null - : TokenizationRegistry.get(this._languageIdentifier.language) - ); - let initialState: IState | null = null; - if (tokenizationSupport) { - try { - initialState = tokenizationSupport.getInitialState(); - } catch (e) { - onUnexpectedError(e); - tokenizationSupport = null; - } - } - this._tokenization = new ModelLinesTokens(this._languageIdentifier, tokenizationSupport); - this._tokens = new TokensStore(initialState); - this._beginBackgroundTokenization(); - } - - private _clearTimers(): void { - if (this._revalidateTokensTimeout !== -1) { - clearTimeout(this._revalidateTokensTimeout); - this._revalidateTokensTimeout = -1; - } - } - public onBeforeAttached(): void { this._attachedEditorCount++; - this._beginBackgroundTokenization(); if (this._attachedEditorCount === 1) { this._onDidChangeAttached.fire(undefined); } @@ -1301,36 +1253,6 @@ export class TextModel extends Disposable implements model.ITextModel { } } - private static _eolCount(text: string): [number, number] { - let eolCount = 0; - let firstLineLength = 0; - for (let i = 0, len = text.length; i < len; i++) { - const chr = text.charCodeAt(i); - - if (chr === CharCode.CarriageReturn) { - if (eolCount === 0) { - firstLineLength = i; - } - eolCount++; - if (i + 1 < len && text.charCodeAt(i + 1) === CharCode.LineFeed) { - // \r\n... case - i++; // skip \n - } else { - // \r... case - } - } else if (chr === CharCode.LineFeed) { - if (eolCount === 0) { - firstLineLength = i; - } - eolCount++; - } - } - if (eolCount === 0) { - firstLineLength = text.length; - } - return [eolCount, firstLineLength]; - } - private _applyEdits(rawOperations: model.IIdentifiedSingleEditOperation[]): model.IIdentifiedSingleEditOperation[] { for (let i = 0, len = rawOperations.length; i < len; i++) { rawOperations[i].range = this.validateRange(rawOperations[i].range); @@ -1349,8 +1271,7 @@ export class TextModel extends Disposable implements model.ITextModel { let lineCount = oldLineCount; for (let i = 0, len = contentChanges.length; i < len; i++) { const change = contentChanges[i]; - const [eolCount, firstLineLength] = TextModel._eolCount(change.text); - this._tokens.applyEdits(change.range, eolCount, firstLineLength); + const [eolCount] = countEOL(change.text); this._onDidChangeDecorations.fire(); this._decorationsTree.acceptReplace(change.rangeOffset, change.rangeLength, change.text.length, change.forceMoveMarkers); @@ -1411,10 +1332,6 @@ export class TextModel extends Disposable implements model.ITextModel { ); } - if (this._tokenization.hasLinesToTokenize(this._tokens, this._buffer)) { - this._beginBackgroundTokenization(); - } - return result.reverseEdits; } @@ -1780,27 +1697,11 @@ export class TextModel extends Disposable implements model.ITextModel { //#region Tokenization public tokenizeViewport(startLineNumber: number, endLineNumber: number): void { - startLineNumber = Math.max(1, startLineNumber); - endLineNumber = Math.min(this.getLineCount(), endLineNumber); - - const eventBuilder = new ModelTokensChangedEventBuilder(); - this._tokenization.tokenizeViewport(this._tokens, this._buffer, eventBuilder, startLineNumber, endLineNumber); - - const e = eventBuilder.build(); - if (e) { - this._onDidChangeTokens.fire(e); - } + this._tokenization.tokenizeViewport(startLineNumber, endLineNumber); } public flushTokens(): void { - this._resetTokenizationState(); - this.emitModelTokensChangedEvent({ - tokenizationSupportChanged: false, - ranges: [{ - fromLineNumber: 1, - toLineNumber: this.getLineCount() - }] - }); + this._tokenization.flushTokens(); } public forceTokenization(lineNumber: number): void { @@ -1808,18 +1709,11 @@ export class TextModel extends Disposable implements model.ITextModel { throw new Error('Illegal value for lineNumber'); } - const eventBuilder = new ModelTokensChangedEventBuilder(); - - this._tokenization.updateTokensUntilLine(this._tokens, this._buffer, eventBuilder, lineNumber); - - const e = eventBuilder.build(); - if (e) { - this._onDidChangeTokens.fire(e); - } + this._tokenization.forceTokenization(lineNumber); } public isCheapToTokenize(lineNumber: number): boolean { - return this._tokenization.isCheapToTokenize(this._tokens, this._buffer, lineNumber); + return this._tokenization.isCheapToTokenize(lineNumber); } public tokenizeIfCheap(lineNumber: number): void { @@ -1837,8 +1731,7 @@ export class TextModel extends Disposable implements model.ITextModel { } private _getLineTokens(lineNumber: number): LineTokens { - const lineText = this._buffer.getLineContent(lineNumber); - return this._tokens.getTokens(this._languageIdentifier.id, lineNumber - 1, lineText); + return this._tokenization.getLineTokens(lineNumber); } public getLanguageIdentifier(): LanguageIdentifier { @@ -1862,68 +1755,16 @@ export class TextModel extends Disposable implements model.ITextModel { this._languageIdentifier = languageIdentifier; - // Cancel tokenization, clear all tokens and begin tokenizing - this._resetTokenizationState(); - - this.emitModelTokensChangedEvent({ - tokenizationSupportChanged: true, - ranges: [{ - fromLineNumber: 1, - toLineNumber: this.getLineCount() - }] - }); this._onDidChangeLanguage.fire(e); this._onDidChangeLanguageConfiguration.fire({}); } - public getLanguageIdAtPosition(_lineNumber: number, _column: number): LanguageId { - if (!this._tokenization.tokenizationSupport) { - return this._languageIdentifier.id; - } - let { lineNumber, column } = this.validatePosition({ lineNumber: _lineNumber, column: _column }); - - let lineTokens = this._getLineTokens(lineNumber); - return lineTokens.getLanguageId(lineTokens.findTokenIndexAtOffset(column - 1)); + public getLanguageIdAtPosition(lineNumber: number, column: number): LanguageId { + const position = this.validatePosition(new Position(lineNumber, column)); + return this._tokenization.getLanguageIdAtPosition(position); } - private _beginBackgroundTokenization(): void { - if (this.isAttachedToEditor() && this._revalidateTokensTimeout === -1) { - this._revalidateTokensTimeout = setTimeout(() => { - this._revalidateTokensTimeout = -1; - this._revalidateTokensNow(); - }, 0); - } - } - - private _revalidateTokensNow(toLineNumber: number = this._buffer.getLineCount()): void { - const MAX_ALLOWED_TIME = 20; - const eventBuilder = new ModelTokensChangedEventBuilder(); - const sw = StopWatch.create(false); - - while (this._tokenization.hasLinesToTokenize(this._tokens, this._buffer)) { - if (sw.elapsed() > MAX_ALLOWED_TIME) { - // Stop if MAX_ALLOWED_TIME is reached - break; - } - - const tokenizedLineNumber = this._tokenization.tokenizeOneInvalidLine(this._tokens, this._buffer, eventBuilder); - - if (tokenizedLineNumber >= toLineNumber) { - break; - } - } - - if (this._tokenization.hasLinesToTokenize(this._tokens, this._buffer)) { - this._beginBackgroundTokenization(); - } - - const e = eventBuilder.build(); - if (e) { - this._onDidChangeTokens.fire(e); - } - } - - private emitModelTokensChangedEvent(e: IModelTokensChangedEvent): void { + emitModelTokensChangedEvent(e: IModelTokensChangedEvent): void { if (!this._isDisposing) { this._onDidChangeTokens.fire(e); } diff --git a/src/vs/editor/common/model/textModelTokens.ts b/src/vs/editor/common/model/textModelTokens.ts index 42792137d44..95e5be4cc64 100644 --- a/src/vs/editor/common/model/textModelTokens.ts +++ b/src/vs/editor/common/model/textModelTokens.ts @@ -7,12 +7,45 @@ import * as arrays from 'vs/base/common/arrays'; import { onUnexpectedError } from 'vs/base/common/errors'; import { LineTokens } from 'vs/editor/common/core/lineTokens'; import { Position } from 'vs/editor/common/core/position'; -import { Range } from 'vs/editor/common/core/range'; +import { IRange } from 'vs/editor/common/core/range'; import { TokenizationResult2 } from 'vs/editor/common/core/token'; -import { ITextBuffer } from 'vs/editor/common/model'; -import { IModelTokensChangedEvent } from 'vs/editor/common/model/textModelEvents'; -import { ColorId, FontStyle, IState, ITokenizationSupport, LanguageId, LanguageIdentifier, MetadataConsts, StandardTokenType, TokenMetadata } from 'vs/editor/common/modes'; +import { IModelTokensChangedEvent, RawContentChangedType } from 'vs/editor/common/model/textModelEvents'; +import { ColorId, FontStyle, IState, ITokenizationSupport, LanguageId, LanguageIdentifier, MetadataConsts, StandardTokenType, TokenMetadata, TokenizationRegistry } from 'vs/editor/common/modes'; import { nullTokenize2 } from 'vs/editor/common/modes/nullMode'; +import { TextModel } from 'vs/editor/common/model/textModel'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { StopWatch } from 'vs/base/common/stopwatch'; +import { CharCode } from 'vs/base/common/charCode'; + +export function countEOL(text: string): [number, number] { + let eolCount = 0; + let firstLineLength = 0; + for (let i = 0, len = text.length; i < len; i++) { + const chr = text.charCodeAt(i); + + if (chr === CharCode.CarriageReturn) { + if (eolCount === 0) { + firstLineLength = i; + } + eolCount++; + if (i + 1 < len && text.charCodeAt(i + 1) === CharCode.LineFeed) { + // \r\n... case + i++; // skip \n + } else { + // \r... case + } + } else if (chr === CharCode.LineFeed) { + if (eolCount === 0) { + firstLineLength = i; + } + eolCount++; + } + } + if (eolCount === 0) { + firstLineLength = text.length; + } + return [eolCount, firstLineLength]; +} function getDefaultMetadata(topLevelLanguageId: LanguageId): number { return ( @@ -167,7 +200,7 @@ export interface ITokensStore { getTokens(topLevelLanguageId: LanguageId, lineIndex: number, lineText: string): LineTokens; getBeginState(lineIndex: number): IState | null; - applyEdits(range: Range, eolCount: number, firstLineLength: number): void; + applyEdits(range: IRange, eolCount: number, firstLineLength: number): void; } export class TokensStore implements ITokensStore { @@ -344,7 +377,7 @@ export class TokensStore implements ITokensStore { //#region Editing - public applyEdits(range: Range, eolCount: number, firstLineLength: number): void { + public applyEdits(range: IRange, eolCount: number, firstLineLength: number): void { try { const deletingLinesCnt = range.endLineNumber - range.startLineNumber; const insertingLinesCnt = eolCount; @@ -362,7 +395,7 @@ export class TokensStore implements ITokensStore { } } - private _acceptDeleteRange(range: Range): void { + private _acceptDeleteRange(range: IRange): void { const firstLineIndex = range.startLineNumber - 1; if (firstLineIndex >= this._len) { @@ -421,18 +454,7 @@ export class TokensStore implements ITokensStore { //#endregion } -export interface IModelLinesTokens { - readonly tokenizationSupport: ITokenizationSupport | null; - - isCheapToTokenize(store: ITokensStore, buffer: ITextBuffer, lineNumber: number): boolean; - hasLinesToTokenize(store: ITokensStore, buffer: ITextBuffer): boolean; - - tokenizeOneInvalidLine(store: ITokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder): number; - updateTokensUntilLine(store: ITokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, lineNumber: number): void; - tokenizeViewport(store: ITokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, startLineNumber: number, endLineNumber: number): void; -} - -export class ModelLinesTokens implements IModelLinesTokens { +export class ModelLinesTokens { private readonly _languageIdentifier: LanguageIdentifier; public readonly tokenizationSupport: ITokenizationSupport | null; @@ -442,7 +464,7 @@ export class ModelLinesTokens implements IModelLinesTokens { this.tokenizationSupport = tokenizationSupport; } - public isCheapToTokenize(store: ITokensStore, buffer: ITextBuffer, lineNumber: number): boolean { + public isCheapToTokenize(store: ITokensStore, buffer: TextModel, lineNumber: number): boolean { if (!this.tokenizationSupport) { return true; } @@ -463,7 +485,7 @@ export class ModelLinesTokens implements IModelLinesTokens { return false; } - public hasLinesToTokenize(store: ITokensStore, buffer: ITextBuffer): boolean { + public hasLinesToTokenize(store: ITokensStore, buffer: TextModel): boolean { if (!this.tokenizationSupport) { return false; } @@ -471,9 +493,7 @@ export class ModelLinesTokens implements IModelLinesTokens { return (store.invalidLineStartIndex < buffer.getLineCount()); } - //#region Tokenization - - public tokenizeOneInvalidLine(store: ITokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder): number { + public tokenizeOneInvalidLine(store: ITokensStore, buffer: TextModel, eventBuilder: ModelTokensChangedEventBuilder): number { if (!this.hasLinesToTokenize(store, buffer)) { return buffer.getLineCount() + 1; } @@ -482,7 +502,7 @@ export class ModelLinesTokens implements IModelLinesTokens { return lineNumber; } - public updateTokensUntilLine(store: ITokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, lineNumber: number): void { + public updateTokensUntilLine(store: ITokensStore, buffer: TextModel, eventBuilder: ModelTokensChangedEventBuilder, lineNumber: number): void { if (!this.tokenizationSupport) { return; } @@ -502,7 +522,7 @@ export class ModelLinesTokens implements IModelLinesTokens { } } - public tokenizeViewport(store: ITokensStore, buffer: ITextBuffer, eventBuilder: ModelTokensChangedEventBuilder, startLineNumber: number, endLineNumber: number): void { + public tokenizeViewport(store: ITokensStore, buffer: TextModel, eventBuilder: ModelTokensChangedEventBuilder, startLineNumber: number, endLineNumber: number): void { if (!this.tokenizationSupport) { // nothing to do return; @@ -557,8 +577,188 @@ export class ModelLinesTokens implements IModelLinesTokens { eventBuilder.registerChangedTokens(lineNumber); } } +} - // #endregion +export class TextModelTokenization extends Disposable { + + private readonly _textModel: TextModel; + private _revalidateTokensTimeout: any; + private _tokenization: ModelLinesTokens; + /*private*/_tokens: ITokensStore; + + constructor(textModel: TextModel) { + super(); + this._textModel = textModel; + this._register(TokenizationRegistry.onDidChange((e) => { + const languageIdentifier = this._textModel.getLanguageIdentifier(); + if (e.changedLanguages.indexOf(languageIdentifier.language) === -1) { + return; + } + + this._resetTokenizationState(); + this._textModel.emitModelTokensChangedEvent({ + tokenizationSupportChanged: true, + ranges: [{ + fromLineNumber: 1, + toLineNumber: this._textModel.getLineCount() + }] + }); + })); + this._revalidateTokensTimeout = -1; + this._register(this._textModel.onDidChangeRawContentFast((e) => { + if (e.containsEvent(RawContentChangedType.Flush)) { + this._resetTokenizationState(); + return; + } + })); + this._register(this._textModel.onDidChangeContentFast((e) => { + for (let i = 0, len = e.changes.length; i < len; i++) { + const change = e.changes[i]; + const [eolCount, firstLineLength] = countEOL(change.text); + this._tokens.applyEdits(change.range, eolCount, firstLineLength); + } + + this._beginBackgroundTokenization(); + })); + this._register(this._textModel.onDidChangeAttached(() => { + this._beginBackgroundTokenization(); + })); + this._register(this._textModel.onDidChangeLanguage(() => { + this._resetTokenizationState(); + + this._textModel.emitModelTokensChangedEvent({ + tokenizationSupportChanged: true, + ranges: [{ + fromLineNumber: 1, + toLineNumber: this._textModel.getLineCount() + }] + }); + })); + this._resetTokenizationState(); + } + + public dispose(): void { + this._clearTimers(); + super.dispose(); + } + + private _clearTimers(): void { + if (this._revalidateTokensTimeout !== -1) { + clearTimeout(this._revalidateTokensTimeout); + this._revalidateTokensTimeout = -1; + } + } + + private _resetTokenizationState(): void { + this._clearTimers(); + const languageIdentifier = this._textModel.getLanguageIdentifier(); + let tokenizationSupport = ( + this._textModel.isTooLargeForTokenization() + ? null + : TokenizationRegistry.get(languageIdentifier.language) + ); + let initialState: IState | null = null; + if (tokenizationSupport) { + try { + initialState = tokenizationSupport.getInitialState(); + } catch (e) { + onUnexpectedError(e); + tokenizationSupport = null; + } + } + this._tokenization = new ModelLinesTokens(languageIdentifier, tokenizationSupport); + this._tokens = new TokensStore(initialState); + this._beginBackgroundTokenization(); + } + + private _beginBackgroundTokenization(): void { + if (this._textModel.isAttachedToEditor() && this._tokenization.hasLinesToTokenize(this._tokens, this._textModel) && this._revalidateTokensTimeout === -1) { + this._revalidateTokensTimeout = setTimeout(() => { + this._revalidateTokensTimeout = -1; + this._revalidateTokensNow(); + }, 0); + } + } + + private _revalidateTokensNow(toLineNumber: number = this._textModel.getLineCount()): void { + const MAX_ALLOWED_TIME = 20; + const eventBuilder = new ModelTokensChangedEventBuilder(); + const sw = StopWatch.create(false); + + while (this._tokenization.hasLinesToTokenize(this._tokens, this._textModel)) { + if (sw.elapsed() > MAX_ALLOWED_TIME) { + // Stop if MAX_ALLOWED_TIME is reached + break; + } + + const tokenizedLineNumber = this._tokenization.tokenizeOneInvalidLine(this._tokens, this._textModel, eventBuilder); + + if (tokenizedLineNumber >= toLineNumber) { + break; + } + } + + this._beginBackgroundTokenization(); + + const e = eventBuilder.build(); + if (e) { + this._textModel.emitModelTokensChangedEvent(e); + } + } + + public tokenizeViewport(startLineNumber: number, endLineNumber: number): void { + startLineNumber = Math.max(1, startLineNumber); + endLineNumber = Math.min(this._textModel.getLineCount(), endLineNumber); + + const eventBuilder = new ModelTokensChangedEventBuilder(); + this._tokenization.tokenizeViewport(this._tokens, this._textModel, eventBuilder, startLineNumber, endLineNumber); + + const e = eventBuilder.build(); + if (e) { + this._textModel.emitModelTokensChangedEvent(e); + } + } + + public flushTokens(): void { + this._resetTokenizationState(); + this._textModel.emitModelTokensChangedEvent({ + tokenizationSupportChanged: false, + ranges: [{ + fromLineNumber: 1, + toLineNumber: this._textModel.getLineCount() + }] + }); + } + + public forceTokenization(lineNumber: number): void { + const eventBuilder = new ModelTokensChangedEventBuilder(); + + this._tokenization.updateTokensUntilLine(this._tokens, this._textModel, eventBuilder, lineNumber); + + const e = eventBuilder.build(); + if (e) { + this._textModel.emitModelTokensChangedEvent(e); + } + } + + public isCheapToTokenize(lineNumber: number): boolean { + return this._tokenization.isCheapToTokenize(this._tokens, this._textModel, lineNumber); + } + + public getLineTokens(lineNumber: number): LineTokens { + const lineText = this._textModel.getLineContent(lineNumber); + const languageIdentifier = this._textModel.getLanguageIdentifier(); + return this._tokens.getTokens(languageIdentifier.id, lineNumber - 1, lineText); + } + + public getLanguageIdAtPosition(position: Position): LanguageId { + if (!this._tokenization.tokenizationSupport) { + return this._textModel.getLanguageIdentifier().id; + } + + let lineTokens = this.getLineTokens(position.lineNumber); + return lineTokens.getLanguageId(lineTokens.findTokenIndexAtOffset(position.column - 1)); + } } function safeTokenize(languageIdentifier: LanguageIdentifier, tokenizationSupport: ITokenizationSupport | null, text: string, state: IState): TokenizationResult2 { diff --git a/src/vs/editor/test/common/model/model.line.test.ts b/src/vs/editor/test/common/model/model.line.test.ts index 8abea9a595f..a422e8776e0 100644 --- a/src/vs/editor/test/common/model/model.line.test.ts +++ b/src/vs/editor/test/common/model/model.line.test.ts @@ -116,7 +116,7 @@ suite('ModelLinesTokens', () => { for (let lineIndex = 0; lineIndex < initial.length; lineIndex++) { const lineTokens = initial[lineIndex].tokens; const lineTextLength = model.getLineMaxColumn(lineIndex + 1) - 1; - model._tokens.setFakeTokens(0, lineIndex, lineTextLength, toTokenizationResult2(TestToken.toTokens(lineTokens))); + model._tokenization._tokens.setFakeTokens(0, lineIndex, lineTextLength, toTokenizationResult2(TestToken.toTokens(lineTokens))); } model.applyEdits(edits.map((ed) => ({ @@ -447,14 +447,14 @@ suite('ModelLinesTokens', () => { test('insertion on empty line', () => { const model = new TextModel('some text', TextModel.DEFAULT_CREATION_OPTIONS, new LanguageIdentifier('test', 0)); - model._tokens.setFakeTokens(0, 0, model.getLineMaxColumn(1) - 1, toTokenizationResult2(TestToken.toTokens([new TestToken(0, 1)]))); + model._tokenization._tokens.setFakeTokens(0, 0, model.getLineMaxColumn(1) - 1, toTokenizationResult2(TestToken.toTokens([new TestToken(0, 1)]))); model.applyEdits([{ range: new Range(1, 1, 1, 10), text: '' }]); - model._tokens.setFakeTokens(0, 0, model.getLineMaxColumn(1) - 1, toTokenizationResult2(new Uint32Array(0))); + model._tokenization._tokens.setFakeTokens(0, 0, model.getLineMaxColumn(1) - 1, toTokenizationResult2(new Uint32Array(0))); model.applyEdits([{ range: new Range(1, 1, 1, 1), From c2c785e4b20615918e72f268ab30118c344cdea6 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 9 Jul 2019 16:21:04 +0200 Subject: [PATCH 1276/1449] Adopt latest loader --- src/vs/css.build.js | 4 +- src/vs/loader.js | 221 +++++++++++++++++++++++--------------------- src/vs/nls.build.js | 4 +- src/vs/nls.js | 4 +- 4 files changed, 121 insertions(+), 112 deletions(-) diff --git a/src/vs/css.build.js b/src/vs/css.build.js index 146ebe33277..69c6240891d 100644 --- a/src/vs/css.build.js +++ b/src/vs/css.build.js @@ -17,7 +17,7 @@ var _cssPluginGlobal = this; var CSSBuildLoaderPlugin; (function (CSSBuildLoaderPlugin) { - var global = _cssPluginGlobal || {}; + var global = (_cssPluginGlobal || {}); /** * Known issue: * - In IE there is no way to know if the CSS file loaded successfully or not. @@ -319,7 +319,7 @@ var CSSBuildLoaderPlugin; global.cssInlinedResources = global.cssInlinedResources || []; var normalizedFSPath = fsPath.replace(/\\/g, '/'); if (global.cssInlinedResources.indexOf(normalizedFSPath) >= 0) { - // console.warn('CSS INLINING IMAGE AT ' + fsPath + ' MORE THAN ONCE. CONSIDER CONSOLIDATING CSS RULES'); + console.warn('CSS INLINING IMAGE AT ' + fsPath + ' MORE THAN ONCE. CONSIDER CONSOLIDATING CSS RULES'); } global.cssInlinedResources.push(normalizedFSPath); var MIME = /\.svg$/.test(url) ? 'image/svg+xml' : 'image/png'; diff --git a/src/vs/loader.js b/src/vs/loader.js index 40b6d2aa327..e3bebe82544 100644 --- a/src/vs/loader.js +++ b/src/vs/loader.js @@ -23,7 +23,7 @@ var _commonjsGlobal = typeof global === 'object' ? global : {}; var AMDLoader; (function (AMDLoader) { AMDLoader.global = _amdLoaderGlobal; - var Environment = (function () { + var Environment = /** @class */ (function () { function Environment() { this._detected = false; this._isWindows = false; @@ -94,7 +94,7 @@ var AMDLoader; *--------------------------------------------------------------------------------------------*/ var AMDLoader; (function (AMDLoader) { - var LoaderEvent = (function () { + var LoaderEvent = /** @class */ (function () { function LoaderEvent(type, detail, timestamp) { this.type = type; this.detail = detail; @@ -103,7 +103,7 @@ var AMDLoader; return LoaderEvent; }()); AMDLoader.LoaderEvent = LoaderEvent; - var LoaderEventRecorder = (function () { + var LoaderEventRecorder = /** @class */ (function () { function LoaderEventRecorder(loaderAvailableTimestamp) { this._events = [new LoaderEvent(1 /* LoaderAvailable */, '', loaderAvailableTimestamp)]; } @@ -116,7 +116,7 @@ var AMDLoader; return LoaderEventRecorder; }()); AMDLoader.LoaderEventRecorder = LoaderEventRecorder; - var NullLoaderEventRecorder = (function () { + var NullLoaderEventRecorder = /** @class */ (function () { function NullLoaderEventRecorder() { } NullLoaderEventRecorder.prototype.record = function (type, detail) { @@ -125,9 +125,9 @@ var AMDLoader; NullLoaderEventRecorder.prototype.getEvents = function () { return []; }; + NullLoaderEventRecorder.INSTANCE = new NullLoaderEventRecorder(); return NullLoaderEventRecorder; }()); - NullLoaderEventRecorder.INSTANCE = new NullLoaderEventRecorder(); AMDLoader.NullLoaderEventRecorder = NullLoaderEventRecorder; })(AMDLoader || (AMDLoader = {})); /*--------------------------------------------------------------------------------------------- @@ -136,7 +136,7 @@ var AMDLoader; *--------------------------------------------------------------------------------------------*/ var AMDLoader; (function (AMDLoader) { - var Utilities = (function () { + var Utilities = /** @class */ (function () { function Utilities() { } /** @@ -222,11 +222,11 @@ var AMDLoader; } return (this.HAS_PERFORMANCE_NOW ? AMDLoader.global.performance.now() : Date.now()); }; + Utilities.NEXT_ANONYMOUS_ID = 1; + Utilities.PERFORMANCE_NOW_PROBED = false; + Utilities.HAS_PERFORMANCE_NOW = false; return Utilities; }()); - Utilities.NEXT_ANONYMOUS_ID = 1; - Utilities.PERFORMANCE_NOW_PROBED = false; - Utilities.HAS_PERFORMANCE_NOW = false; AMDLoader.Utilities = Utilities; })(AMDLoader || (AMDLoader = {})); /*--------------------------------------------------------------------------------------------- @@ -236,7 +236,7 @@ var AMDLoader; var AMDLoader; (function (AMDLoader) { ; - var ConfigurationOptionsUtil = (function () { + var ConfigurationOptionsUtil = /** @class */ (function () { function ConfigurationOptionsUtil() { } /** @@ -279,13 +279,16 @@ var AMDLoader; if (typeof options.catchError === 'undefined') { options.catchError = false; } + if (typeof options.recordStats === 'undefined') { + options.recordStats = false; + } if (typeof options.urlArgs !== 'string') { options.urlArgs = ''; } if (typeof options.onError !== 'function') { options.onError = defaultOnError; } - if (typeof options.ignoreDuplicateModules !== 'object' || !Array.isArray(options.ignoreDuplicateModules)) { + if (!Array.isArray(options.ignoreDuplicateModules)) { options.ignoreDuplicateModules = []; } if (options.baseUrl.length > 0) { @@ -337,7 +340,7 @@ var AMDLoader; return ConfigurationOptionsUtil; }()); AMDLoader.ConfigurationOptionsUtil = ConfigurationOptionsUtil; - var Configuration = (function () { + var Configuration = /** @class */ (function () { function Configuration(env, options) { this._env = env; this.options = ConfigurationOptionsUtil.mergeConfigurationOptions(options); @@ -548,7 +551,7 @@ var AMDLoader; /** * Load `scriptSrc` only once (avoid multiple