From 027d7caec56090c7a91f01083a880ad1c83be3e5 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 2 Jan 2020 08:41:08 -0800 Subject: [PATCH 01/21] Flush all buffered data events on terminal close Fixes #85257 --- .../workspace.tasks.test.ts | 59 ++++++- .../api/browser/mainThreadTerminalService.ts | 4 +- .../api/common/extHostTerminalService.ts | 5 +- .../terminal/common/terminalDataBuffering.ts | 20 ++- .../test/common/terminalDataBuffering.test.ts | 156 +++++++----------- 5 files changed, 136 insertions(+), 108 deletions(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts index edb404b8653..1f7a9c93197 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts @@ -69,7 +69,64 @@ suite('workspace-namespace', () => { }, resolveTask(_task: Task): Task | undefined { try { - assert.fail('resolveTask should not trigger during the test'); + assert.fail('resolveTask should not trigger during the test'); + } catch (e) { + done(e); + } + return undefined; + } + })); + commands.executeCommand('workbench.action.tasks.runTask', `${taskType}: ${taskName}`); + }); + + test('sync CustomExecution task should flush all data on close', (done) => { + interface CustomTestingTaskDefinition extends TaskDefinition { + /** + * One of the task properties. This can be used to customize the task in the tasks.json + */ + customProp1: string; + } + const taskType: string = 'customTesting'; + const taskName = 'First custom task'; + disposables.push(window.onDidOpenTerminal(term => { + disposables.push(window.onDidWriteTerminalData(e => { + try { + assert.equal(e.data, 'exiting'); + } catch (e) { + done(e); + } + disposables.push(window.onDidCloseTerminal(() => done())); + term.dispose(); + })); + })); + disposables.push(tasks.registerTaskProvider(taskType, { + provideTasks: () => { + const result: Task[] = []; + const kind: CustomTestingTaskDefinition = { + type: taskType, + customProp1: 'testing task one' + }; + const writeEmitter = new EventEmitter(); + const closeEmitter = new EventEmitter(); + const execution = new CustomExecution((): Thenable => { + const pty: Pseudoterminal = { + onDidWrite: writeEmitter.event, + onDidClose: closeEmitter.event, + open: () => { + writeEmitter.fire('exiting'); + closeEmitter.fire(); + }, + close: () => {} + }; + return Promise.resolve(pty); + }); + const task = new Task2(kind, TaskScope.Workspace, taskName, taskType, execution); + result.push(task); + return result; + }, + resolveTask(_task: Task): Task | undefined { + try { + assert.fail('resolveTask should not trigger during the test'); } catch (e) { done(e); } diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index c3a20304172..9d7b6dff46a 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -343,7 +343,7 @@ class TerminalDataEventTracker extends Disposable { ) { super(); - this._register(this._bufferer = new TerminalDataBufferer()); + this._register(this._bufferer = new TerminalDataBufferer(this._callback)); this._terminalService.terminalInstances.forEach(instance => this._registerInstance(instance)); this._register(this._terminalService.onInstanceCreated(instance => this._registerInstance(instance))); @@ -352,6 +352,6 @@ class TerminalDataEventTracker extends Disposable { private _registerInstance(instance: ITerminalInstance): void { // Buffer data events to reduce the amount of messages going to the extension host - this._register(this._bufferer.startBuffering(instance.id, instance.onData, this._callback)); + this._register(this._bufferer.startBuffering(instance.id, instance.onData)); } } diff --git a/src/vs/workbench/api/common/extHostTerminalService.ts b/src/vs/workbench/api/common/extHostTerminalService.ts index 50d9901b68d..e08d1f50b85 100644 --- a/src/vs/workbench/api/common/extHostTerminalService.ts +++ b/src/vs/workbench/api/common/extHostTerminalService.ts @@ -310,9 +310,8 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ constructor( @IExtHostRpcService extHostRpc: IExtHostRpcService ) { - this._bufferer = new TerminalDataBufferer(); - this._proxy = extHostRpc.getProxy(MainContext.MainThreadTerminalService); + this._bufferer = new TerminalDataBufferer(this._proxy.$sendProcessData); this._onDidWriteTerminalData = new Emitter({ onFirstListenerAdd: () => this._proxy.$startSendingDataEvents(), onLastListenerRemove: () => this._proxy.$stopSendingDataEvents() @@ -477,7 +476,7 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ p.onProcessTitleChanged(title => this._proxy.$sendProcessTitle(id, title)); // Buffer data events to reduce the amount of messages going to the renderer - this._bufferer.startBuffering(id, p.onProcessData, this._proxy.$sendProcessData); + this._bufferer.startBuffering(id, p.onProcessData); p.onProcessExit(exitCode => this._onProcessExit(id, exitCode)); if (p.onProcessOverrideDimensions) { diff --git a/src/vs/workbench/contrib/terminal/common/terminalDataBuffering.ts b/src/vs/workbench/contrib/terminal/common/terminalDataBuffering.ts index 8b2008bf29b..82f3fe6f1d0 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalDataBuffering.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalDataBuffering.ts @@ -14,13 +14,16 @@ interface TerminalDataBuffer extends IDisposable { export class TerminalDataBufferer implements IDisposable { private readonly _terminalBufferMap = new Map(); + constructor(private readonly _callback: (id: number, data: string) => void) { + } + dispose() { for (const buffer of this._terminalBufferMap.values()) { buffer.dispose(); } } - startBuffering(id: number, event: Event, callback: (id: number, data: string) => void, throttleBy: number = 5): IDisposable { + startBuffering(id: number, event: Event, throttleBy: number = 5): IDisposable { let disposable: IDisposable; disposable = event((e: string) => { let buffer = this._terminalBufferMap.get(id); @@ -30,16 +33,13 @@ export class TerminalDataBufferer implements IDisposable { return; } - const timeoutId = setTimeout(() => { - this._terminalBufferMap.delete(id); - callback(id, buffer!.data.join('')); - }, throttleBy); + const timeoutId = setTimeout(() => this._flushBuffer(id), throttleBy); buffer = { data: [e], timeoutId: timeoutId, dispose: () => { clearTimeout(timeoutId); - this._terminalBufferMap.delete(id); + this._flushBuffer(id); disposable.dispose(); } }; @@ -54,4 +54,12 @@ export class TerminalDataBufferer implements IDisposable { buffer.dispose(); } } + + private _flushBuffer(id: number): void { + const buffer = this._terminalBufferMap.get(id); + if (buffer) { + this._terminalBufferMap.delete(id); + this._callback(id, buffer.data.join('')); + } + } } diff --git a/src/vs/workbench/contrib/terminal/test/common/terminalDataBuffering.test.ts b/src/vs/workbench/contrib/terminal/test/common/terminalDataBuffering.test.ts index 54a2e4be0ab..6a2e3b93b21 100644 --- a/src/vs/workbench/contrib/terminal/test/common/terminalDataBuffering.test.ts +++ b/src/vs/workbench/contrib/terminal/test/common/terminalDataBuffering.test.ts @@ -11,20 +11,28 @@ const wait = (ms: number) => new Promise(resolve => setTimeout(resolve, ms)); suite('Workbench - TerminalDataBufferer', () => { let bufferer: TerminalDataBufferer; + let counter: { [id: number]: number }; + let data: { [id: number]: string }; setup(async () => { - bufferer = new TerminalDataBufferer(); + counter = {}; + data = {}; + bufferer = new TerminalDataBufferer((id, e) => { + if (!(id in counter)) { + counter[id] = 0; + } + counter[id]++; + if (!(id in data)) { + data[id] = ''; + } + data[id] = e; + }); }); test('start', async () => { - let terminalOnData = new Emitter(); - let counter = 0; - let data: string | undefined; + const terminalOnData = new Emitter(); - bufferer.startBuffering(1, terminalOnData.event, (id, e) => { - counter++; - data = e; - }, 0); + bufferer.startBuffering(1, terminalOnData.event, 0); terminalOnData.fire('1'); terminalOnData.fire('2'); @@ -34,33 +42,21 @@ suite('Workbench - TerminalDataBufferer', () => { terminalOnData.fire('4'); - assert.equal(counter, 1); - assert.equal(data, '123'); + assert.equal(counter[1], 1); + assert.equal(data[1], '123'); await wait(0); - assert.equal(counter, 2); - assert.equal(data, '4'); + assert.equal(counter[1], 2); + assert.equal(data[1], '4'); }); test('start 2', async () => { - let terminal1OnData = new Emitter(); - let terminal1Counter = 0; - let terminal1Data: string | undefined; + const terminal1OnData = new Emitter(); + const terminal2OnData = new Emitter(); - bufferer.startBuffering(1, terminal1OnData.event, (id, e) => { - terminal1Counter++; - terminal1Data = e; - }, 0); - - let terminal2OnData = new Emitter(); - let terminal2Counter = 0; - let terminal2Data: string | undefined; - - bufferer.startBuffering(2, terminal2OnData.event, (id, e) => { - terminal2Counter++; - terminal2Data = e; - }, 0); + bufferer.startBuffering(1, terminal1OnData.event, 0); + bufferer.startBuffering(2, terminal2OnData.event, 0); terminal1OnData.fire('1'); terminal2OnData.fire('4'); @@ -70,60 +66,41 @@ suite('Workbench - TerminalDataBufferer', () => { terminal2OnData.fire('6'); terminal2OnData.fire('7'); - assert.equal(terminal1Counter, 0); - assert.equal(terminal1Data, undefined); - assert.equal(terminal2Counter, 0); - assert.equal(terminal2Data, undefined); + assert.equal(counter[1], undefined); + assert.equal(data[1], undefined); + assert.equal(counter[2], undefined); + assert.equal(data[2], undefined); await wait(0); - assert.equal(terminal1Counter, 1); - assert.equal(terminal1Data, '123'); - assert.equal(terminal2Counter, 1); - assert.equal(terminal2Data, '4567'); + assert.equal(counter[1], 1); + assert.equal(data[1], '123'); + assert.equal(counter[2], 1); + assert.equal(data[2], '4567'); }); test('stop', async () => { let terminalOnData = new Emitter(); - let counter = 0; - let data: string | undefined; - bufferer.startBuffering(1, terminalOnData.event, (id, e) => { - counter++; - data = e; - }, 0); + bufferer.startBuffering(1, terminalOnData.event, 0); terminalOnData.fire('1'); terminalOnData.fire('2'); terminalOnData.fire('3'); bufferer.stopBuffering(1); - await wait(0); - assert.equal(counter, 0); - assert.equal(data, undefined); + assert.equal(counter[1], 1); + assert.equal(data[1], '123'); }); test('start 2 stop 1', async () => { - let terminal1OnData = new Emitter(); - let terminal1Counter = 0; - let terminal1Data: string | undefined; - - bufferer.startBuffering(1, terminal1OnData.event, (id, e) => { - terminal1Counter++; - terminal1Data = e; - }, 0); - - let terminal2OnData = new Emitter(); - let terminal2Counter = 0; - let terminal2Data: string | undefined; - - bufferer.startBuffering(2, terminal2OnData.event, (id, e) => { - terminal2Counter++; - terminal2Data = e; - }, 0); + const terminal1OnData = new Emitter(); + const terminal2OnData = new Emitter(); + bufferer.startBuffering(1, terminal1OnData.event, 0); + bufferer.startBuffering(2, terminal2OnData.event, 0); terminal1OnData.fire('1'); terminal2OnData.fire('4'); @@ -133,39 +110,26 @@ suite('Workbench - TerminalDataBufferer', () => { terminal2OnData.fire('6'); terminal2OnData.fire('7'); - assert.equal(terminal1Counter, 0); - assert.equal(terminal1Data, undefined); - assert.equal(terminal2Counter, 0); - assert.equal(terminal2Data, undefined); + assert.equal(counter[1], undefined); + assert.equal(data[1], undefined); + assert.equal(counter[2], undefined); + assert.equal(data[2], undefined); bufferer.stopBuffering(1); await wait(0); - assert.equal(terminal1Counter, 0); - assert.equal(terminal1Data, undefined); - assert.equal(terminal2Counter, 1); - assert.equal(terminal2Data, '4567'); + assert.equal(counter[1], 1); + assert.equal(data[1], '123'); + assert.equal(counter[2], 1); + assert.equal(data[2], '4567'); }); - test('dispose', async () => { - let terminal1OnData = new Emitter(); - let terminal1Counter = 0; - let terminal1Data: string | undefined; - - bufferer.startBuffering(1, terminal1OnData.event, (id, e) => { - terminal1Counter++; - terminal1Data = e; - }, 0); - - let terminal2OnData = new Emitter(); - let terminal2Counter = 0; - let terminal2Data: string | undefined; - - bufferer.startBuffering(2, terminal2OnData.event, (id, e) => { - terminal2Counter++; - terminal2Data = e; - }, 0); + test('dispose should flush remaining data events', async () => { + const terminal1OnData = new Emitter(); + const terminal2OnData = new Emitter(); + bufferer.startBuffering(1, terminal1OnData.event, 0); + bufferer.startBuffering(2, terminal2OnData.event, 0); terminal1OnData.fire('1'); terminal2OnData.fire('4'); @@ -175,17 +139,17 @@ suite('Workbench - TerminalDataBufferer', () => { terminal2OnData.fire('6'); terminal2OnData.fire('7'); - assert.equal(terminal1Counter, 0); - assert.equal(terminal1Data, undefined); - assert.equal(terminal2Counter, 0); - assert.equal(terminal2Data, undefined); + assert.equal(counter[1], undefined); + assert.equal(data[1], undefined); + assert.equal(counter[2], undefined); + assert.equal(data[2], undefined); bufferer.dispose(); await wait(0); - assert.equal(terminal1Counter, 0); - assert.equal(terminal1Data, undefined); - assert.equal(terminal2Counter, 0); - assert.equal(terminal2Data, undefined); + assert.equal(counter[1], 1); + assert.equal(data[1], '123'); + assert.equal(counter[2], 1); + assert.equal(data[2], '4567'); }); }); From f99bc0c47f0fd4086dc7687e6c812aaf1aa9721c Mon Sep 17 00:00:00 2001 From: jeanp413 Date: Fri, 3 Jan 2020 23:07:38 -0500 Subject: [PATCH 02/21] Fixes #87596 --- .../browser/parts/activitybar/media/activityaction.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/workbench/browser/parts/activitybar/media/activityaction.css b/src/vs/workbench/browser/parts/activitybar/media/activityaction.css index b15991bd888..5d5cf2b498a 100644 --- a/src/vs/workbench/browser/parts/activitybar/media/activityaction.css +++ b/src/vs/workbench/browser/parts/activitybar/media/activityaction.css @@ -91,6 +91,10 @@ height: 100%; } +.monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .active-item-indicator { + pointer-events: none; +} + .monaco-workbench.border .activitybar.right > .content :not(.monaco-menu) > .monaco-action-bar .active-item-indicator { left: -2px; } From 81d8e4f49de894cc4e8b5eec7fd16fdd888b5f88 Mon Sep 17 00:00:00 2001 From: Micah Date: Sun, 5 Jan 2020 00:43:23 -0500 Subject: [PATCH 03/21] Fix #84145 when toggling terminal pane --- src/vs/workbench/contrib/terminal/browser/terminalPanel.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalPanel.ts b/src/vs/workbench/contrib/terminal/browser/terminalPanel.ts index 6f347935926..0cec6b4b0c6 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalPanel.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalPanel.ts @@ -100,6 +100,7 @@ export class TerminalPanel extends Panel { if (this._terminalService.terminalInstances.length > 0) { this._updateFont(); this._updateTheme(); + this._terminalService.getActiveTab()?.setVisible(visible); } else { // Check if instances were already restored as part of workbench restore if (this._terminalService.terminalInstances.length === 0) { From f24a908d4e9418f4d04f01a02da824e253b16e7b Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 6 Jan 2020 16:54:11 +0100 Subject: [PATCH 04/21] callstack view: use dom.toggleClass --- .../workbench/contrib/debug/browser/callStackView.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/debug/browser/callStackView.ts b/src/vs/workbench/contrib/debug/browser/callStackView.ts index 990db3c9a84..4ae48c7e38c 100644 --- a/src/vs/workbench/contrib/debug/browser/callStackView.ts +++ b/src/vs/workbench/contrib/debug/browser/callStackView.ts @@ -93,7 +93,7 @@ export class CallStackView extends ViewPane { if (thread && thread.stoppedDetails) { this.pauseMessageLabel.textContent = thread.stoppedDetails.description || nls.localize('debugStopped', "Paused on {0}", thread.stoppedDetails.reason || ''); this.pauseMessageLabel.title = thread.stoppedDetails.text || ''; - this.pauseMessageLabel.toggleAttribute('exception', thread.stoppedDetails.reason === 'exception'); + dom.toggleClass(this.pauseMessageLabel, 'exception', thread.stoppedDetails.reason === 'exception'); this.pauseMessage.hidden = false; if (this.toolbar) { this.toolbar.setActions([])(); @@ -511,11 +511,11 @@ class StackFramesRenderer implements ITreeRenderer, index: number, data: IStackFrameTemplateData): void { const stackFrame = element.element; - data.stackFrame.toggleAttribute('disabled', !stackFrame.source || !stackFrame.source.available || isDeemphasized(stackFrame)); - data.stackFrame.toggleAttribute('label', stackFrame.presentationHint === 'label'); - data.stackFrame.toggleAttribute('subtle', stackFrame.presentationHint === 'subtle'); + dom.toggleClass(data.stackFrame, 'disabled', !stackFrame.source || !stackFrame.source.available || isDeemphasized(stackFrame)); + dom.toggleClass(data.stackFrame, 'label', stackFrame.presentationHint === 'label'); + dom.toggleClass(data.stackFrame, 'subtle', stackFrame.presentationHint === 'subtle'); const hasActions = !!stackFrame.thread.session.capabilities.supportsRestartFrame && stackFrame.presentationHint !== 'label' && stackFrame.presentationHint !== 'subtle'; - data.stackFrame.toggleAttribute('has-actions', hasActions); + dom.toggleClass(data.stackFrame, 'has-actions', hasActions); data.file.title = stackFrame.source.inMemory ? stackFrame.source.uri.path : this.labelService.getUriLabel(stackFrame.source.uri); if (stackFrame.source.raw.origin) { From 67acfd62e1f28e19ae5027f31e864e8ead103bc3 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 6 Jan 2020 16:55:26 +0100 Subject: [PATCH 05/21] Feedback: beak is off now with new icon it seems (fix #88138) --- .../workbench/browser/parts/statusbar/media/statusbarpart.css | 2 +- .../workbench/contrib/feedback/browser/feedbackStatusbarItem.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/statusbar/media/statusbarpart.css b/src/vs/workbench/browser/parts/statusbar/media/statusbarpart.css index a0c9f9e0eb8..48e69fc36b1 100644 --- a/src/vs/workbench/browser/parts/statusbar/media/statusbarpart.css +++ b/src/vs/workbench/browser/parts/statusbar/media/statusbarpart.css @@ -54,7 +54,7 @@ .monaco-workbench .part.statusbar > .items-container > .statusbar-item.has-beak:before { content: ''; position: absolute; - left: calc(50% - 9px); /* 3px (margin) + 5px (padding) + 1px (icon) = 9px */ + left: 10px; top: -5px; border-bottom-width: 5px; border-bottom-style: solid; diff --git a/src/vs/workbench/contrib/feedback/browser/feedbackStatusbarItem.ts b/src/vs/workbench/contrib/feedback/browser/feedbackStatusbarItem.ts index 64300fb2d11..b05d7d2d13a 100644 --- a/src/vs/workbench/contrib/feedback/browser/feedbackStatusbarItem.ts +++ b/src/vs/workbench/contrib/feedback/browser/feedbackStatusbarItem.ts @@ -95,6 +95,7 @@ export class FeedbackStatusbarConribution extends Disposable implements IWorkben private getStatusEntry(showBeak?: boolean): IStatusbarEntry { return { text: '$(feedback)', + tooltip: localize('status.feedback', "Tweet Feedback"), command: '_feedback.open', showBeak }; From d3147a5ac69431308f50acfc3f1de7bf13d1130b Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 6 Jan 2020 17:55:13 +0100 Subject: [PATCH 06/21] debt - fix some compile issues --- src/vs/base/common/async.ts | 2 +- .../common/modes/languageConfigurationRegistry.ts | 2 +- .../workbench/contrib/search/browser/searchEditor.ts | 10 +++++++--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/vs/base/common/async.ts b/src/vs/base/common/async.ts index a2b6766b209..84b8acb7081 100644 --- a/src/vs/base/common/async.ts +++ b/src/vs/base/common/async.ts @@ -668,7 +668,7 @@ export class RunOnceWorker extends RunOnceScheduler { export interface IdleDeadline { readonly didTimeout: boolean; - timeRemaining(): DOMHighResTimeStamp; + timeRemaining(): number; } /** * Execute the callback the next time the browser is idle diff --git a/src/vs/editor/common/modes/languageConfigurationRegistry.ts b/src/vs/editor/common/modes/languageConfigurationRegistry.ts index cb357ff5ff6..eacb7ed17b9 100644 --- a/src/vs/editor/common/modes/languageConfigurationRegistry.ts +++ b/src/vs/editor/common/modes/languageConfigurationRegistry.ts @@ -153,7 +153,7 @@ export class LanguageConfigurationChangeEvent { export class LanguageConfigurationRegistryImpl { - private readonly _entries = new Map(); + private readonly _entries = new Map(); private readonly _onDidChange = new Emitter(); public readonly onDidChange: Event = this._onDidChange.event; diff --git a/src/vs/workbench/contrib/search/browser/searchEditor.ts b/src/vs/workbench/contrib/search/browser/searchEditor.ts index 4eee6a2d7fb..fda96298247 100644 --- a/src/vs/workbench/contrib/search/browser/searchEditor.ts +++ b/src/vs/workbench/contrib/search/browser/searchEditor.ts @@ -22,6 +22,7 @@ import { registerThemingParticipant } from 'vs/platform/theme/common/themeServic import { searchEditorFindMatch, searchEditorFindMatchBorder } from 'vs/platform/theme/common/colorRegistry'; import { UntitledTextEditorInput } from 'vs/workbench/common/editor/untitledTextEditorInput'; import { localize } from 'vs/nls'; +import { isCodeEditor } from 'vs/editor/browser/editorBrowser'; // Using \r\n on Windows inserts an extra newline between results. const lineDelimiter = '\n'; @@ -234,10 +235,13 @@ const serializeSearchResultForEditor = (searchResult: SearchResult, rawIncludePa export const refreshActiveEditorSearch = async (contextLines: number | undefined, editorService: IEditorService, instantiationService: IInstantiationService, contextService: IWorkspaceContextService, labelService: ILabelService, configurationService: IConfigurationService) => { - const model = editorService.activeTextEditorWidget?.getModel(); - if (!model) { return; } + const editorWidget = editorService.activeTextEditorWidget; + if (!isCodeEditor(editorWidget)) { + return; + } - const textModel = model as ITextModel; + const textModel = editorWidget.getModel(); + if (!textModel) { return; } const header = textModel.getValueInRange(new Range(1, 1, 5, 1), EndOfLinePreference.LF) .split(lineDelimiter) From 18bbf28f2c35ab147bd1ec5a43dd32f5f52003a1 Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 6 Jan 2020 18:05:28 +0100 Subject: [PATCH 07/21] fixes #88146 --- src/vs/workbench/contrib/files/browser/views/explorerView.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/files/browser/views/explorerView.ts b/src/vs/workbench/contrib/files/browser/views/explorerView.ts index 52008b759ec..08a6a6eba05 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerView.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerView.ts @@ -700,7 +700,7 @@ export class ExplorerView extends ViewPane { if (Array.isArray(treeInput)) { if (hasExpandedRootChild(this.tree, treeInput)) { treeInput.forEach(folder => { - folder.children.forEach(child => this.tree.hasNode(child) && this.tree.collapse(child)); + folder.children.forEach(child => this.tree.hasNode(child) && this.tree.collapse(child, true)); }); return; From 3f029e3cf3a3221d44e569f8f8f7e1475f0072bb Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 6 Jan 2020 18:54:47 +0100 Subject: [PATCH 08/21] debt - cleanup tsconfig.json --- src/tsconfig.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/tsconfig.json b/src/tsconfig.json index 7e1e6c6d108..b8cc1caf2cd 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -24,10 +24,6 @@ "./vs" ], "exclude": [ - "./typings/es6-promise.d.ts", - "./typings/require-monaco.d.ts", - "./typings/xterm.d.ts", - "./typings/xterm-addon-search.d.ts", - "./typings/xterm-addon-web-links.d.ts" + "./typings/es6-promise.d.ts" ] } From 942753b77756362831cfd534d6d51ce3fefb0e89 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 6 Jan 2020 10:07:48 -0800 Subject: [PATCH 09/21] Fix TS 3.8 dom.d.ts changes `.color` is no longer nullable. Use an empty string instead of null --- src/vs/base/browser/ui/button/button.ts | 2 +- src/vs/base/browser/ui/checkbox/checkbox.ts | 2 +- src/vs/base/browser/ui/inputbox/inputBox.ts | 2 +- src/vs/base/browser/ui/menu/menu.ts | 6 +++--- src/vs/base/browser/ui/splitview/paneview.ts | 2 +- src/vs/base/parts/quickopen/browser/quickOpenWidget.ts | 2 +- src/vs/editor/contrib/rename/renameInputField.ts | 2 +- src/vs/workbench/browser/parts/compositeBarActions.ts | 4 ++-- src/vs/workbench/browser/parts/compositePart.ts | 2 +- src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts | 4 ++-- src/vs/workbench/browser/parts/editor/tabsTitleControl.ts | 4 ++-- .../browser/parts/notifications/notificationsCenter.ts | 2 +- .../browser/parts/notifications/notificationsList.ts | 2 +- .../browser/parts/notifications/notificationsToasts.ts | 2 +- src/vs/workbench/browser/parts/quickinput/quickInput.ts | 2 +- src/vs/workbench/browser/parts/sidebar/sidebarPart.ts | 2 +- src/vs/workbench/browser/parts/statusbar/statusbarPart.ts | 4 ++-- src/vs/workbench/browser/parts/titlebar/titlebarPart.ts | 2 +- .../browser/suggestEnabledInput/suggestEnabledInput.ts | 4 ++-- src/vs/workbench/contrib/debug/browser/debugHover.ts | 2 +- .../contrib/debug/browser/statusbarColorProvider.ts | 2 +- src/vs/workbench/contrib/feedback/browser/feedback.ts | 4 ++-- .../contrib/preferences/browser/keybindingWidgets.ts | 2 +- .../contrib/preferences/browser/keybindingsEditor.ts | 2 +- .../contrib/preferences/browser/preferencesWidgets.ts | 2 +- .../contrib/preferences/browser/settingsEditor2.ts | 2 +- 26 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/vs/base/browser/ui/button/button.ts b/src/vs/base/browser/ui/button/button.ts index de4d35ef320..6e436669cba 100644 --- a/src/vs/base/browser/ui/button/button.ts +++ b/src/vs/base/browser/ui/button/button.ts @@ -129,7 +129,7 @@ export class Button extends Disposable { private applyStyles(): void { if (this._element) { const background = this.buttonBackground ? this.buttonBackground.toString() : ''; - const foreground = this.buttonForeground ? this.buttonForeground.toString() : null; + const foreground = this.buttonForeground ? this.buttonForeground.toString() : ''; const border = this.buttonBorder ? this.buttonBorder.toString() : ''; this._element.style.color = foreground; diff --git a/src/vs/base/browser/ui/checkbox/checkbox.ts b/src/vs/base/browser/ui/checkbox/checkbox.ts index e7c16234f63..372119cfa19 100644 --- a/src/vs/base/browser/ui/checkbox/checkbox.ts +++ b/src/vs/base/browser/ui/checkbox/checkbox.ts @@ -220,7 +220,7 @@ export class SimpleCheckbox extends Widget { } protected applyStyles(): void { - this.domNode.style.color = this.styles.checkboxForeground ? this.styles.checkboxForeground.toString() : null; + this.domNode.style.color = this.styles.checkboxForeground ? this.styles.checkboxForeground.toString() : ''; this.domNode.style.backgroundColor = this.styles.checkboxBackground ? this.styles.checkboxBackground.toString() : ''; this.domNode.style.borderColor = this.styles.checkboxBorder ? this.styles.checkboxBorder.toString() : ''; } diff --git a/src/vs/base/browser/ui/inputbox/inputBox.ts b/src/vs/base/browser/ui/inputbox/inputBox.ts index dd00990ac06..cd57d7f772f 100644 --- a/src/vs/base/browser/ui/inputbox/inputBox.ts +++ b/src/vs/base/browser/ui/inputbox/inputBox.ts @@ -477,7 +477,7 @@ export class InputBox extends Widget { const styles = this.stylesForType(this.message.type); spanElement.style.backgroundColor = styles.background ? styles.background.toString() : ''; - spanElement.style.color = styles.foreground ? styles.foreground.toString() : null; + spanElement.style.color = styles.foreground ? styles.foreground.toString() : ''; spanElement.style.border = styles.border ? `1px solid ${styles.border}` : ''; dom.append(div, spanElement); diff --git a/src/vs/base/browser/ui/menu/menu.ts b/src/vs/base/browser/ui/menu/menu.ts index 0eb32b5c133..dfac50ca823 100644 --- a/src/vs/base/browser/ui/menu/menu.ts +++ b/src/vs/base/browser/ui/menu/menu.ts @@ -597,12 +597,12 @@ class BaseMenuActionViewItem extends BaseActionViewItem { const border = isSelected && this.menuStyle.selectionBorderColor ? `thin solid ${this.menuStyle.selectionBorderColor}` : ''; if (this.item) { - this.item.style.color = fgColor ? `${fgColor}` : null; - this.item.style.backgroundColor = bgColor ? `${bgColor}` : ''; + this.item.style.color = fgColor ? fgColor.toString() : ''; + this.item.style.backgroundColor = bgColor ? bgColor.toString() : ''; } if (this.check) { - this.check.style.color = fgColor ? `${fgColor}` : ''; + this.check.style.color = fgColor ? fgColor.toString() : ''; } if (this.container) { diff --git a/src/vs/base/browser/ui/splitview/paneview.ts b/src/vs/base/browser/ui/splitview/paneview.ts index e97fab25404..037ffdce27b 100644 --- a/src/vs/base/browser/ui/splitview/paneview.ts +++ b/src/vs/base/browser/ui/splitview/paneview.ts @@ -230,7 +230,7 @@ export abstract class Pane extends Disposable implements IView { toggleClass(this.header, 'expanded', expanded); this.header.setAttribute('aria-expanded', String(expanded)); - this.header.style.color = this.styles.headerForeground ? this.styles.headerForeground.toString() : null; + this.header.style.color = this.styles.headerForeground ? this.styles.headerForeground.toString() : ''; this.header.style.backgroundColor = this.styles.headerBackground ? this.styles.headerBackground.toString() : ''; this.header.style.borderTop = this.styles.headerBorder ? `1px solid ${this.styles.headerBorder}` : ''; this._dropBackground = this.styles.dropBackground; diff --git a/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts b/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts index 965e3033213..7f2761f808a 100644 --- a/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts +++ b/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts @@ -406,7 +406,7 @@ export class QuickOpenWidget extends Disposable implements IModelProvider, IThem protected applyStyles(): void { if (this.element) { - const foreground = this.styles.foreground ? this.styles.foreground.toString() : null; + const foreground = this.styles.foreground ? this.styles.foreground.toString() : ''; const background = this.styles.background ? this.styles.background.toString() : ''; const borderColor = this.styles.borderColor ? this.styles.borderColor.toString() : ''; const widgetShadow = this.styles.widgetShadow ? this.styles.widgetShadow.toString() : ''; diff --git a/src/vs/editor/contrib/rename/renameInputField.ts b/src/vs/editor/contrib/rename/renameInputField.ts index a87899a71a1..5f36cd8ae21 100644 --- a/src/vs/editor/contrib/rename/renameInputField.ts +++ b/src/vs/editor/contrib/rename/renameInputField.ts @@ -90,7 +90,7 @@ export class RenameInputField implements IContentWidget, IDisposable { const border = theme.getColor(inputBorder); this._inputField.style.backgroundColor = background ? background.toString() : ''; - this._inputField.style.color = foreground ? foreground.toString() : null; + this._inputField.style.color = foreground ? foreground.toString() : ''; this._inputField.style.borderWidth = border ? '1px' : '0px'; this._inputField.style.borderStyle = border ? 'solid' : 'none'; diff --git a/src/vs/workbench/browser/parts/compositeBarActions.ts b/src/vs/workbench/browser/parts/compositeBarActions.ts index 0f86e922cc3..2ea7354cb47 100644 --- a/src/vs/workbench/browser/parts/compositeBarActions.ts +++ b/src/vs/workbench/browser/parts/compositeBarActions.ts @@ -168,7 +168,7 @@ export class ActivityActionViewItem extends BaseActionViewItem { } else { const foreground = this._action.checked ? colors.activeForegroundColor : colors.inactiveForegroundColor; const borderBottomColor = this._action.checked ? colors.activeBorderBottomColor : null; - this.label.style.color = foreground ? foreground.toString() : null; + this.label.style.color = foreground ? foreground.toString() : ''; this.label.style.borderBottomColor = borderBottomColor ? borderBottomColor.toString() : ''; } } @@ -179,7 +179,7 @@ export class ActivityActionViewItem extends BaseActionViewItem { const badgeBackground = colors.badgeBackground; const contrastBorderColor = theme.getColor(contrastBorder); - this.badgeContent.style.color = badgeForeground ? badgeForeground.toString() : null; + this.badgeContent.style.color = badgeForeground ? badgeForeground.toString() : ''; this.badgeContent.style.backgroundColor = badgeBackground ? badgeBackground.toString() : ''; this.badgeContent.style.borderStyle = contrastBorderColor ? 'solid' : ''; diff --git a/src/vs/workbench/browser/parts/compositePart.ts b/src/vs/workbench/browser/parts/compositePart.ts index 9001551e9c4..b46b49c60ff 100644 --- a/src/vs/workbench/browser/parts/compositePart.ts +++ b/src/vs/workbench/browser/parts/compositePart.ts @@ -411,7 +411,7 @@ export abstract class CompositePart extends Part { }, updateStyles: () => { - titleLabel.style.color = $this.titleForegroundColor ? $this.getColor($this.titleForegroundColor) : null; + titleLabel.style.color = $this.titleForegroundColor ? $this.getColor($this.titleForegroundColor) || '' : ''; } }; } diff --git a/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts index 115bfb381ce..dd709b9e85c 100644 --- a/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts +++ b/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts @@ -275,9 +275,9 @@ export class NoTabsTitleControl extends TitleControl { editorLabel.setResource({ name, description, resource }, { title: typeof title === 'string' ? title : undefined, italic: !isEditorPinned, extraClasses: ['no-tabs', 'title-label'] }); if (isGroupActive) { - editorLabel.element.style.color = this.getColor(TAB_ACTIVE_FOREGROUND); + editorLabel.element.style.color = this.getColor(TAB_ACTIVE_FOREGROUND) || ''; } else { - editorLabel.element.style.color = this.getColor(TAB_UNFOCUSED_ACTIVE_FOREGROUND); + editorLabel.element.style.color = this.getColor(TAB_UNFOCUSED_ACTIVE_FOREGROUND) || ''; } // Update Editor Actions Toolbar diff --git a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts index eb3e326f378..f459d1ed60d 100644 --- a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts +++ b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts @@ -981,7 +981,7 @@ export class TabsTitleControl extends TitleControl { } // Label - tabLabelWidget.element.style.color = this.getColor(isGroupActive ? TAB_ACTIVE_FOREGROUND : TAB_UNFOCUSED_ACTIVE_FOREGROUND); + tabLabelWidget.element.style.color = this.getColor(isGroupActive ? TAB_ACTIVE_FOREGROUND : TAB_UNFOCUSED_ACTIVE_FOREGROUND) || ''; } // Tab is inactive @@ -994,7 +994,7 @@ export class TabsTitleControl extends TitleControl { tabContainer.style.boxShadow = ''; // Label - tabLabelWidget.element.style.color = this.getColor(isGroupActive ? TAB_INACTIVE_FOREGROUND : TAB_UNFOCUSED_INACTIVE_FOREGROUND); + tabLabelWidget.element.style.color = this.getColor(isGroupActive ? TAB_INACTIVE_FOREGROUND : TAB_UNFOCUSED_INACTIVE_FOREGROUND) || ''; } } diff --git a/src/vs/workbench/browser/parts/notifications/notificationsCenter.ts b/src/vs/workbench/browser/parts/notifications/notificationsCenter.ts index b3444fa21e7..c39a483799d 100644 --- a/src/vs/workbench/browser/parts/notifications/notificationsCenter.ts +++ b/src/vs/workbench/browser/parts/notifications/notificationsCenter.ts @@ -236,7 +236,7 @@ export class NotificationsCenter extends Themable { this.notificationsCenterContainer.style.border = borderColor ? `1px solid ${borderColor}` : ''; const headerForeground = this.getColor(NOTIFICATIONS_CENTER_HEADER_FOREGROUND); - this.notificationsCenterHeader.style.color = headerForeground ? headerForeground.toString() : null; + this.notificationsCenterHeader.style.color = headerForeground ? headerForeground.toString() : ''; const headerBackground = this.getColor(NOTIFICATIONS_CENTER_HEADER_BACKGROUND); this.notificationsCenterHeader.style.background = headerBackground ? headerBackground.toString() : ''; diff --git a/src/vs/workbench/browser/parts/notifications/notificationsList.ts b/src/vs/workbench/browser/parts/notifications/notificationsList.ts index 0b0942a5df7..a994bde8290 100644 --- a/src/vs/workbench/browser/parts/notifications/notificationsList.ts +++ b/src/vs/workbench/browser/parts/notifications/notificationsList.ts @@ -221,7 +221,7 @@ export class NotificationsList extends Themable { protected updateStyles(): void { if (this.listContainer) { const foreground = this.getColor(NOTIFICATIONS_FOREGROUND); - this.listContainer.style.color = foreground ? foreground : null; + this.listContainer.style.color = foreground ? foreground : ''; const background = this.getColor(NOTIFICATIONS_BACKGROUND); this.listContainer.style.background = background ? background : ''; diff --git a/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts b/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts index 18946126666..ee6bbffc283 100644 --- a/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts +++ b/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts @@ -525,7 +525,7 @@ export class NotificationsToasts extends Themable { // Hide or show toast based on context this.setVisibility(toast, makeVisible); - toast.container.style.opacity = null; + toast.container.style.opacity = ''; if (makeVisible) { visibleToasts++; diff --git a/src/vs/workbench/browser/parts/quickinput/quickInput.ts b/src/vs/workbench/browser/parts/quickinput/quickInput.ts index 4a30cf8ca8c..c4c5273352b 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInput.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInput.ts @@ -1542,7 +1542,7 @@ export class QuickInputService extends Component implements IQuickInputService { const quickInputBackground = theme.getColor(QUICK_INPUT_BACKGROUND); this.ui.container.style.backgroundColor = quickInputBackground ? quickInputBackground.toString() : ''; const quickInputForeground = theme.getColor(QUICK_INPUT_FOREGROUND); - this.ui.container.style.color = quickInputForeground ? quickInputForeground.toString() : null; + this.ui.container.style.color = quickInputForeground ? quickInputForeground.toString() : ''; const contrastBorderColor = theme.getColor(contrastBorder); this.ui.container.style.border = contrastBorderColor ? `1px solid ${contrastBorderColor}` : ''; const widgetShadowColor = theme.getColor(widgetShadow); diff --git a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts index d9667ca6335..9eea034d1d3 100644 --- a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts +++ b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts @@ -173,7 +173,7 @@ export class SidebarPart extends CompositePart implements IViewletServi const container = assertIsDefined(this.getContainer()); container.style.backgroundColor = this.getColor(SIDE_BAR_BACKGROUND) || ''; - container.style.color = this.getColor(SIDE_BAR_FOREGROUND); + container.style.color = this.getColor(SIDE_BAR_FOREGROUND) || ''; const borderColor = this.getColor(SIDE_BAR_BORDER) || this.getColor(contrastBorder); const isPositionLeft = this.layoutService.getSideBarPosition() === SideBarPosition.LEFT; diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts index 425e82cf37b..9ec20f5c9c0 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts @@ -589,7 +589,7 @@ export class StatusbarPart extends Part implements IStatusbarService { // Background colors const backgroundColor = this.getColor(this.contextService.getWorkbenchState() !== WorkbenchState.EMPTY ? STATUS_BAR_BACKGROUND : STATUS_BAR_NO_FOLDER_BACKGROUND) || ''; container.style.backgroundColor = backgroundColor; - container.style.color = this.getColor(this.contextService.getWorkbenchState() !== WorkbenchState.EMPTY ? STATUS_BAR_FOREGROUND : STATUS_BAR_NO_FOLDER_FOREGROUND); + container.style.color = this.getColor(this.contextService.getWorkbenchState() !== WorkbenchState.EMPTY ? STATUS_BAR_FOREGROUND : STATUS_BAR_NO_FOLDER_FOREGROUND) || ''; // Border color const borderColor = this.getColor(this.contextService.getWorkbenchState() !== WorkbenchState.EMPTY ? STATUS_BAR_BORDER : STATUS_BAR_NO_FOLDER_BORDER) || this.getColor(contrastBorder); @@ -795,7 +795,7 @@ class StatusbarEntryItem extends Disposable { if (isBackground) { container.style.backgroundColor = colorResult || ''; } else { - container.style.color = colorResult; + container.style.color = colorResult || ''; } } diff --git a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts index 09a3338ddcc..670a91764ac 100644 --- a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts +++ b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts @@ -517,7 +517,7 @@ export class TitlebarPart extends Part implements ITitleService { } const titleForeground = this.getColor(this.isInactive ? TITLE_BAR_INACTIVE_FOREGROUND : TITLE_BAR_ACTIVE_FOREGROUND); - this.element.style.color = titleForeground; + this.element.style.color = titleForeground || ''; const titleBorder = this.getColor(TITLE_BAR_BORDER); this.element.style.borderBottom = titleBorder ? `1px solid ${titleBorder}` : ''; diff --git a/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput.ts b/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput.ts index b9731888148..8300818b619 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput.ts @@ -226,8 +226,8 @@ export class SuggestEnabledInput extends Widget implements IThemable { public style(colors: ISuggestEnabledInputStyles): void { this.placeholderText.style.backgroundColor = this.stylingContainer.style.backgroundColor = colors.inputBackground ? colors.inputBackground.toString() : ''; - this.stylingContainer.style.color = colors.inputForeground ? colors.inputForeground.toString() : null; - this.placeholderText.style.color = colors.inputPlaceholderForeground ? colors.inputPlaceholderForeground.toString() : null; + this.stylingContainer.style.color = colors.inputForeground ? colors.inputForeground.toString() : ''; + this.placeholderText.style.color = colors.inputPlaceholderForeground ? colors.inputPlaceholderForeground.toString() : ''; this.stylingContainer.style.borderWidth = '1px'; this.stylingContainer.style.borderStyle = 'solid'; diff --git a/src/vs/workbench/contrib/debug/browser/debugHover.ts b/src/vs/workbench/contrib/debug/browser/debugHover.ts index 9efb9d69461..8e6e499016c 100644 --- a/src/vs/workbench/contrib/debug/browser/debugHover.ts +++ b/src/vs/workbench/contrib/debug/browser/debugHover.ts @@ -107,7 +107,7 @@ export class DebugHoverWidget implements IContentWidget { if (colors.editorHoverForeground) { this.domNode.style.color = colors.editorHoverForeground.toString(); } else { - this.domNode.style.color = null; + this.domNode.style.color = ''; } })); this.toDispose.push(this.tree.onDidChangeContentHeight(() => this.layoutTreeAndContainer())); diff --git a/src/vs/workbench/contrib/debug/browser/statusbarColorProvider.ts b/src/vs/workbench/contrib/debug/browser/statusbarColorProvider.ts index b2700599f82..85fa645461f 100644 --- a/src/vs/workbench/contrib/debug/browser/statusbarColorProvider.ts +++ b/src/vs/workbench/contrib/debug/browser/statusbarColorProvider.ts @@ -67,7 +67,7 @@ export class StatusBarColorProvider extends Themable implements IWorkbenchContri // Container Colors const backgroundColor = this.getColor(this.getColorKey(STATUS_BAR_NO_FOLDER_BACKGROUND, STATUS_BAR_DEBUGGING_BACKGROUND, STATUS_BAR_BACKGROUND)); container.style.backgroundColor = backgroundColor || ''; - container.style.color = this.getColor(this.getColorKey(STATUS_BAR_NO_FOLDER_FOREGROUND, STATUS_BAR_DEBUGGING_FOREGROUND, STATUS_BAR_FOREGROUND)); + container.style.color = this.getColor(this.getColorKey(STATUS_BAR_NO_FOLDER_FOREGROUND, STATUS_BAR_DEBUGGING_FOREGROUND, STATUS_BAR_FOREGROUND)) || ''; // Border Color const borderColor = this.getColor(this.getColorKey(STATUS_BAR_NO_FOLDER_BORDER, STATUS_BAR_DEBUGGING_BORDER, STATUS_BAR_BORDER)) || this.getColor(contrastBorder); diff --git a/src/vs/workbench/contrib/feedback/browser/feedback.ts b/src/vs/workbench/contrib/feedback/browser/feedback.ts index 8e1c9cf3615..60831f00f29 100644 --- a/src/vs/workbench/contrib/feedback/browser/feedback.ts +++ b/src/vs/workbench/contrib/feedback/browser/feedback.ts @@ -277,12 +277,12 @@ export class FeedbackDropdown extends Dropdown { 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() : ''; - this.feedbackForm.style.color = colors.editorWidgetForeground ? colors.editorWidgetForeground.toString() : null; + this.feedbackForm.style.color = colors.editorWidgetForeground ? colors.editorWidgetForeground.toString() : ''; this.feedbackForm.style.boxShadow = colors.widgetShadow ? `0 0 8px ${colors.widgetShadow}` : ''; } if (this.feedbackDescriptionInput) { this.feedbackDescriptionInput.style.backgroundColor = colors.inputBackground ? colors.inputBackground.toString() : ''; - this.feedbackDescriptionInput.style.color = colors.inputForeground ? colors.inputForeground.toString() : null; + this.feedbackDescriptionInput.style.color = colors.inputForeground ? colors.inputForeground.toString() : ''; this.feedbackDescriptionInput.style.border = `1px solid ${colors.inputBorder || 'transparent'}`; } diff --git a/src/vs/workbench/contrib/preferences/browser/keybindingWidgets.ts b/src/vs/workbench/contrib/preferences/browser/keybindingWidgets.ts index 0bfccbd8aca..cfb8224507f 100644 --- a/src/vs/workbench/contrib/preferences/browser/keybindingWidgets.ts +++ b/src/vs/workbench/contrib/preferences/browser/keybindingWidgets.ts @@ -188,7 +188,7 @@ export class DefineKeybindingWidget extends Widget { if (colors.editorWidgetForeground) { this._domNode.domNode.style.color = colors.editorWidgetForeground.toString(); } else { - this._domNode.domNode.style.color = null; + this._domNode.domNode.style.color = ''; } if (colors.widgetShadow) { diff --git a/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts b/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts index c2139783628..873a8bacd1e 100644 --- a/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts +++ b/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts @@ -410,7 +410,7 @@ export class KeybindingsEditor extends BaseEditor implements IKeybindingsEditor recordingBadge.style.borderWidth = border ? '1px' : ''; recordingBadge.style.borderStyle = border ? 'solid' : ''; recordingBadge.style.borderColor = border; - recordingBadge.style.color = color ? color.toString() : null; + recordingBadge.style.color = color ? color.toString() : ''; })); return recordingBadge; } diff --git a/src/vs/workbench/contrib/preferences/browser/preferencesWidgets.ts b/src/vs/workbench/contrib/preferences/browser/preferencesWidgets.ts index 048b1ae6004..2252aa92c46 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferencesWidgets.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferencesWidgets.ts @@ -643,7 +643,7 @@ export class SearchWidget extends Widget { this.countElement.style.borderColor = border; const color = this.themeService.getTheme().getColor(badgeForeground); - this.countElement.style.color = color ? color.toString() : null; + this.countElement.style.color = color ? color.toString() : ''; })); } diff --git a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts index e8562ee5c05..a993ed4d168 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts @@ -533,7 +533,7 @@ export class SettingsEditor2 extends BaseEditor { DOM.append(this.noResultsMessage, this.clearFilterLinkContainer); this._register(attachStylerCallback(this.themeService, { editorForeground }, colors => { - this.noResultsMessage.style.color = colors.editorForeground ? colors.editorForeground.toString() : null; + this.noResultsMessage.style.color = colors.editorForeground ? colors.editorForeground.toString() : ''; })); this.createTOC(bodyContainer); From 464ee368dfdea7c23448598144059831c19834b4 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 6 Jan 2020 10:15:38 -0800 Subject: [PATCH 10/21] Update build to use latest TS 3.8 nightly We want more testing of the TS nightly bits --- build/package.json | 2 +- build/yarn.lock | 10 +++++----- package.json | 2 +- yarn.lock | 10 +++++----- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/build/package.json b/build/package.json index 08640afd50d..69b98df35e4 100644 --- a/build/package.json +++ b/build/package.json @@ -43,7 +43,7 @@ "minimist": "^1.2.0", "request": "^2.85.0", "terser": "4.3.8", - "typescript": "3.7.3", + "typescript": "^3.8.0-dev.20200104", "vsce": "1.48.0", "vscode-telemetry-extractor": "^1.5.4", "xml2js": "^0.4.17" diff --git a/build/yarn.lock b/build/yarn.lock index 73cc6e0eb4f..2e66b691a45 100644 --- a/build/yarn.lock +++ b/build/yarn.lock @@ -2453,16 +2453,16 @@ typed-rest-client@^0.9.0: tunnel "0.0.4" underscore "1.8.3" -typescript@3.7.3: - version "3.7.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.3.tgz#b36840668a16458a7025b9eabfad11b66ab85c69" - integrity sha512-Mcr/Qk7hXqFBXMN7p7Lusj1ktCBydylfQM/FZCk5glCNQJrCUKPkMHdo9R0MTFWsC/4kPFvDS0fDPvukfCkFsw== - typescript@^3.0.1: version "3.5.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977" integrity sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g== +typescript@^3.8.0-dev.20200104: + version "3.8.0-dev.20200104" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.0-dev.20200104.tgz#521b2f0b5a288b6e3f8a095525f64712330cc649" + integrity sha512-Zdb8X1uzvUPrRvRBqega83NxqCuN/kyxuXG1u8BV10mGOqfwQb0SreSDoDDM1zUgrqFZ93neVh3DVyWTvx6XlA== + typical@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" diff --git a/package.json b/package.json index 6b7f397e8bd..5a5d54ce626 100644 --- a/package.json +++ b/package.json @@ -144,7 +144,7 @@ "sinon": "^1.17.2", "source-map": "^0.4.4", "ts-loader": "^4.4.2", - "typescript": "3.7.3", + "typescript": "^3.8.0-dev.20200104", "typescript-formatter": "7.1.0", "underscore": "^1.8.2", "vinyl": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index 12071935831..aa4c370f2b0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9180,16 +9180,16 @@ typescript-formatter@7.1.0: commandpost "^1.0.0" editorconfig "^0.15.0" -typescript@3.7.3: - version "3.7.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.3.tgz#b36840668a16458a7025b9eabfad11b66ab85c69" - integrity sha512-Mcr/Qk7hXqFBXMN7p7Lusj1ktCBydylfQM/FZCk5glCNQJrCUKPkMHdo9R0MTFWsC/4kPFvDS0fDPvukfCkFsw== - typescript@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.6.2.tgz#3c5b6fd7f6de0914269027f03c0946758f7673a4" integrity sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q= +typescript@^3.8.0-dev.20200104: + version "3.8.0-dev.20200104" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.0-dev.20200104.tgz#521b2f0b5a288b6e3f8a095525f64712330cc649" + integrity sha512-Zdb8X1uzvUPrRvRBqega83NxqCuN/kyxuXG1u8BV10mGOqfwQb0SreSDoDDM1zUgrqFZ93neVh3DVyWTvx6XlA== + uc.micro@^1.0.1, uc.micro@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.3.tgz#7ed50d5e0f9a9fb0a573379259f2a77458d50192" From 21dc66054203ab742d36be9f0ef6ecb774ae62f2 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 6 Jan 2020 10:56:15 -0800 Subject: [PATCH 11/21] Fix TS 3.8 formatting --- src/vs/base/common/filters.ts | 4 ++-- src/vs/editor/common/commands/shiftCommand.ts | 2 +- src/vs/editor/contrib/folding/indentRangeProvider.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/base/common/filters.ts b/src/vs/base/common/filters.ts index 8e8fd433fb2..3740a128f1a 100644 --- a/src/vs/base/common/filters.ts +++ b/src/vs/base/common/filters.ts @@ -560,9 +560,9 @@ export function fuzzyScore(pattern: string, patternLow: string, patternStart: nu let wordPos = wordStart; // There will be a match, fill in tables - for (row = 1, patternPos = patternStart; patternPos < patternLen; row++ , patternPos++) { + for (row = 1, patternPos = patternStart; patternPos < patternLen; row++, patternPos++) { - for (column = 1, wordPos = wordStart; wordPos < wordLen; column++ , wordPos++) { + for (column = 1, wordPos = wordStart; wordPos < wordLen; column++, wordPos++) { const score = _doScore(pattern, patternLow, patternPos, patternStart, word, wordLow, wordPos); diff --git a/src/vs/editor/common/commands/shiftCommand.ts b/src/vs/editor/common/commands/shiftCommand.ts index fa21fe33907..742ad42fa9c 100644 --- a/src/vs/editor/common/commands/shiftCommand.ts +++ b/src/vs/editor/common/commands/shiftCommand.ts @@ -113,7 +113,7 @@ export class ShiftCommand implements ICommand { if (this._opts.useTabStops) { // keep track of previous line's "miss-alignment" let previousLineExtraSpaces = 0, extraSpaces = 0; - for (let lineNumber = startLine; lineNumber <= endLine; lineNumber++ , previousLineExtraSpaces = extraSpaces) { + for (let lineNumber = startLine; lineNumber <= endLine; lineNumber++, previousLineExtraSpaces = extraSpaces) { extraSpaces = 0; let lineText = model.getLineContent(lineNumber); let indentationEndIndex = strings.firstNonWhitespaceIndex(lineText); diff --git a/src/vs/editor/contrib/folding/indentRangeProvider.ts b/src/vs/editor/contrib/folding/indentRangeProvider.ts index 68a3a366faa..da1c2bc7b4c 100644 --- a/src/vs/editor/contrib/folding/indentRangeProvider.ts +++ b/src/vs/editor/contrib/folding/indentRangeProvider.ts @@ -66,7 +66,7 @@ export class RangesCollector { // reverse and create arrays of the exact length let startIndexes = new Uint32Array(this._length); let endIndexes = new Uint32Array(this._length); - for (let i = this._length - 1, k = 0; i >= 0; i-- , k++) { + for (let i = this._length - 1, k = 0; i >= 0; i--, k++) { startIndexes[k] = this._startIndexes[i]; endIndexes[k] = this._endIndexes[i]; } From ab75933a8b9285d46919cc52928730401a463549 Mon Sep 17 00:00:00 2001 From: Jackson Kearl Date: Mon, 6 Jan 2020 11:31:33 -0800 Subject: [PATCH 12/21] Only start search on Ctrl+Shift+F if searchOnType is enabled. Fixes #88159. --- 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 2a834ed343e..527fd051a1e 100644 --- a/src/vs/workbench/contrib/search/browser/searchView.ts +++ b/src/vs/workbench/contrib/search/browser/searchView.ts @@ -879,7 +879,7 @@ export class SearchView extends ViewPane { } this.searchWidget.setValue(selectedText, true); updatedText = true; - this.onQueryChanged(false); + if (this.searchConfig.searchOnType) { this.onQueryChanged(false); } } } From af9dddd0fcd65f310cc795e0c7c5370b4ca17086 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 6 Jan 2020 11:41:33 -0800 Subject: [PATCH 13/21] Require second parameter for Map.set Converts cover the was relying on the old signature to either use delete or have the correct types --- src/typings/lib.ie11_safe_es6.d.ts | 2 +- src/vs/base/parts/storage/test/node/storage.test.ts | 4 ++-- src/vs/editor/contrib/snippet/snippetParser.ts | 2 +- src/vs/platform/storage/node/storageIpc.ts | 7 ++++++- src/vs/workbench/api/browser/mainThreadTask.ts | 5 ++++- src/vs/workbench/api/common/extHostDocumentData.ts | 7 ++++++- 6 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/typings/lib.ie11_safe_es6.d.ts b/src/typings/lib.ie11_safe_es6.d.ts index 547ba246917..4d54d3c08ef 100644 --- a/src/typings/lib.ie11_safe_es6.d.ts +++ b/src/typings/lib.ie11_safe_es6.d.ts @@ -12,7 +12,7 @@ interface Map { forEach(callbackfn: (value: V, index: K, map: Map) => void, thisArg?: any): void; get(key: K): V | undefined; has(key: K): boolean; - set(key: K, value?: V): Map; + set(key: K, value: V): Map; readonly size: number; // not supported on IE11: diff --git a/src/vs/base/parts/storage/test/node/storage.test.ts b/src/vs/base/parts/storage/test/node/storage.test.ts index 83e99a94551..4995d64b0e5 100644 --- a/src/vs/base/parts/storage/test/node/storage.test.ts +++ b/src/vs/base/parts/storage/test/node/storage.test.ts @@ -137,14 +137,14 @@ suite('Storage Library', () => { changes.clear(); // Delete is accepted - change.set('foo', undefined); + change.set('foo', undefined!); database.fireDidChangeItemsExternal({ items: change }); ok(changes.has('foo')); equal(storage.get('foo', null!), null); changes.clear(); // Nothing happens if changing to same value - change.set('foo', undefined); + change.set('foo', undefined!); database.fireDidChangeItemsExternal({ items: change }); equal(changes.size, 0); diff --git a/src/vs/editor/contrib/snippet/snippetParser.ts b/src/vs/editor/contrib/snippet/snippetParser.ts index 7823405f14e..c82aebf6181 100644 --- a/src/vs/editor/contrib/snippet/snippetParser.ts +++ b/src/vs/editor/contrib/snippet/snippetParser.ts @@ -605,7 +605,7 @@ export class SnippetParser { // fill in values for placeholders. the first placeholder of an index // that has a value defines the value for all placeholders with that index - const placeholderDefaultValues = new Map(); + const placeholderDefaultValues = new Map(); const incompletePlaceholders: Placeholder[] = []; let placeholderCount = 0; snippet.walk(marker => { diff --git a/src/vs/platform/storage/node/storageIpc.ts b/src/vs/platform/storage/node/storageIpc.ts index 2d04f0a77f7..e2bbca21641 100644 --- a/src/vs/platform/storage/node/storageIpc.ts +++ b/src/vs/platform/storage/node/storageIpc.ts @@ -100,7 +100,12 @@ export class GlobalStorageDatabaseChannel extends Disposable implements IServerC private serializeEvents(events: IStorageChangeEvent[]): ISerializableItemsChangeEvent { const items = new Map(); - events.forEach(event => items.set(event.key, this.storageMainService.get(event.key))); + events.forEach(event => { + const existing = this.storageMainService.get(event.key); + if (typeof existing === 'string') { + items.set(event.key, existing); + } + }); return { items: mapToSerializable(items) }; } diff --git a/src/vs/workbench/api/browser/mainThreadTask.ts b/src/vs/workbench/api/browser/mainThreadTask.ts index 79ae97c0082..f78dc6ca963 100644 --- a/src/vs/workbench/api/browser/mainThreadTask.ts +++ b/src/vs/workbench/api/browser/mainThreadTask.ts @@ -621,7 +621,10 @@ export class MainThreadTask implements MainThreadTaskShape { for (let i = 0; i < partiallyResolvedVars.length; i++) { const variableName = vars[i].substring(2, vars[i].length - 1); if (resolvedVars && values.variables[vars[i]] === vars[i]) { - result.variables.set(variableName, resolvedVars.get(variableName)); + const resolved = resolvedVars.get(variableName); + if (typeof resolved === 'string') { + result.variables.set(variableName, resolved); + } } else { result.variables.set(variableName, partiallyResolvedVars[i]); } diff --git a/src/vs/workbench/api/common/extHostDocumentData.ts b/src/vs/workbench/api/common/extHostDocumentData.ts index 28e76f2a267..1ff19e1998c 100644 --- a/src/vs/workbench/api/common/extHostDocumentData.ts +++ b/src/vs/workbench/api/common/extHostDocumentData.ts @@ -16,8 +16,13 @@ import { equals } from 'vs/base/common/arrays'; const _modeId2WordDefinition = new Map(); export function setWordDefinitionFor(modeId: string, wordDefinition: RegExp | undefined): void { - _modeId2WordDefinition.set(modeId, wordDefinition); + if (!wordDefinition) { + _modeId2WordDefinition.delete(modeId); + } else { + _modeId2WordDefinition.set(modeId, wordDefinition); + } } + export function getWordDefinitionFor(modeId: string): RegExp | undefined { return _modeId2WordDefinition.get(modeId); } From 9536692355c26be0709ae50340fd6e0ced0024ed Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 6 Jan 2020 11:44:57 -0800 Subject: [PATCH 14/21] Update js/ts grammars --- .../syntaxes/JavaScript.tmLanguage.json | 37 ++++++++++++++++++- .../syntaxes/JavaScriptReact.tmLanguage.json | 37 ++++++++++++++++++- extensions/typescript-basics/cgmanifest.json | 2 +- .../syntaxes/TypeScript.tmLanguage.json | 37 ++++++++++++++++++- .../syntaxes/TypeScriptReact.tmLanguage.json | 37 ++++++++++++++++++- 5 files changed, 141 insertions(+), 9 deletions(-) diff --git a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json index db94d219f4f..54169e925da 100644 --- a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json +++ b/extensions/javascript/syntaxes/JavaScript.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/TypeScript-TmLanguage/commit/c9c955af17ed0c86ebce32e0f26c72f0a2925937", + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/b7ef0941e38d56292d19ee7706a558dbff6c3a35", "name": "JavaScript (with React support)", "scopeName": "source.js", "patterns": [ @@ -1825,7 +1825,7 @@ }, "access-modifier": { "name": "storage.modifier.js", - "match": "(?)", + "patterns": [ + { + "include": "#type-parameters" + } + ] + }, + { + "begin": "(?<=\\>)\\s*(\\()(?=\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))", + "beginCaptures": { + "1": { + "name": "meta.brace.round.js" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "meta.brace.round.js" + } + }, + "patterns": [ + { + "include": "#expression-inside-possibly-arrow-parens" + } + ] + }, { "include": "#possibly-arrow-return-type" }, diff --git a/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json b/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json index 8703a62331d..9c5e4e15474 100644 --- a/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json +++ b/extensions/javascript/syntaxes/JavaScriptReact.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/TypeScript-TmLanguage/commit/c9c955af17ed0c86ebce32e0f26c72f0a2925937", + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/b7ef0941e38d56292d19ee7706a558dbff6c3a35", "name": "JavaScript (with React support)", "scopeName": "source.js.jsx", "patterns": [ @@ -1825,7 +1825,7 @@ }, "access-modifier": { "name": "storage.modifier.js.jsx", - "match": "(?)", + "patterns": [ + { + "include": "#type-parameters" + } + ] + }, + { + "begin": "(?<=\\>)\\s*(\\()(?=\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))", + "beginCaptures": { + "1": { + "name": "meta.brace.round.js.jsx" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "meta.brace.round.js.jsx" + } + }, + "patterns": [ + { + "include": "#expression-inside-possibly-arrow-parens" + } + ] + }, { "include": "#possibly-arrow-return-type" }, diff --git a/extensions/typescript-basics/cgmanifest.json b/extensions/typescript-basics/cgmanifest.json index f75427c65b2..31f2e0c545a 100644 --- a/extensions/typescript-basics/cgmanifest.json +++ b/extensions/typescript-basics/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "TypeScript-TmLanguage", "repositoryUrl": "https://github.com/Microsoft/TypeScript-TmLanguage", - "commitHash": "c9c955af17ed0c86ebce32e0f26c72f0a2925937" + "commitHash": "b7ef0941e38d56292d19ee7706a558dbff6c3a35" } }, "license": "MIT", diff --git a/extensions/typescript-basics/syntaxes/TypeScript.tmLanguage.json b/extensions/typescript-basics/syntaxes/TypeScript.tmLanguage.json index b858d4758e9..437e205163f 100644 --- a/extensions/typescript-basics/syntaxes/TypeScript.tmLanguage.json +++ b/extensions/typescript-basics/syntaxes/TypeScript.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/TypeScript-TmLanguage/commit/c9c955af17ed0c86ebce32e0f26c72f0a2925937", + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/b7ef0941e38d56292d19ee7706a558dbff6c3a35", "name": "TypeScript", "scopeName": "source.ts", "patterns": [ @@ -1822,7 +1822,7 @@ }, "access-modifier": { "name": "storage.modifier.ts", - "match": "(?)", + "patterns": [ + { + "include": "#type-parameters" + } + ] + }, + { + "begin": "(?<=\\>)\\s*(\\()(?=\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))", + "beginCaptures": { + "1": { + "name": "meta.brace.round.ts" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "meta.brace.round.ts" + } + }, + "patterns": [ + { + "include": "#expression-inside-possibly-arrow-parens" + } + ] + }, { "include": "#possibly-arrow-return-type" }, diff --git a/extensions/typescript-basics/syntaxes/TypeScriptReact.tmLanguage.json b/extensions/typescript-basics/syntaxes/TypeScriptReact.tmLanguage.json index 32071749fc1..c2c6c09a5a2 100644 --- a/extensions/typescript-basics/syntaxes/TypeScriptReact.tmLanguage.json +++ b/extensions/typescript-basics/syntaxes/TypeScriptReact.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/TypeScript-TmLanguage/commit/c9c955af17ed0c86ebce32e0f26c72f0a2925937", + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/b7ef0941e38d56292d19ee7706a558dbff6c3a35", "name": "TypeScriptReact", "scopeName": "source.tsx", "patterns": [ @@ -1825,7 +1825,7 @@ }, "access-modifier": { "name": "storage.modifier.tsx", - "match": "(?)", + "patterns": [ + { + "include": "#type-parameters" + } + ] + }, + { + "begin": "(?<=\\>)\\s*(\\()(?=\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))", + "beginCaptures": { + "1": { + "name": "meta.brace.round.tsx" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "meta.brace.round.tsx" + } + }, + "patterns": [ + { + "include": "#expression-inside-possibly-arrow-parens" + } + ] + }, { "include": "#possibly-arrow-return-type" }, From 81fb34c445098d43d0f25b4e1868ca421022d4de Mon Sep 17 00:00:00 2001 From: Andrew Liu Date: Mon, 6 Jan 2020 11:53:13 -0800 Subject: [PATCH 15/21] fix parsed JSDoc author tag (#80898) * fix parsed JSDoc author tag * fix author tag --- .../typescript-language-features/src/utils/previewer.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/extensions/typescript-language-features/src/utils/previewer.ts b/extensions/typescript-language-features/src/utils/previewer.ts index 5ad230d662e..ca1da7b6e94 100644 --- a/extensions/typescript-language-features/src/utils/previewer.ts +++ b/extensions/typescript-language-features/src/utils/previewer.ts @@ -28,7 +28,15 @@ function getTagBodyText(tag: Proto.JSDocTagInfo): string | undefined { } else { return makeCodeblock(tag.text); } + case 'author': + // fix obsucated email address, #80898 + const emailMatch = tag.text.match(/(.+)\s<([-.\w]+@[-.\w]+)>/); + if (emailMatch === null) { + return tag.text; + } else { + return `${emailMatch[1]} ${emailMatch[2]}`; + } case 'default': return makeCodeblock(tag.text); } From 23d9f6bd376073f0d66a474fe71238a88604f99d Mon Sep 17 00:00:00 2001 From: Robert Jin Date: Mon, 6 Jan 2020 21:27:31 +0000 Subject: [PATCH 16/21] #88125 Reverse action order in goToErrorWidget --- src/vs/editor/contrib/gotoError/gotoError.ts | 4 ++-- src/vs/editor/contrib/gotoError/gotoErrorWidget.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/editor/contrib/gotoError/gotoError.ts b/src/vs/editor/contrib/gotoError/gotoError.ts index f9ac8b712e8..02dec404cb4 100644 --- a/src/vs/editor/contrib/gotoError/gotoError.ts +++ b/src/vs/editor/contrib/gotoError/gotoError.ts @@ -240,8 +240,8 @@ export class MarkerController implements editorCommon.IEditorContribution { const prevMarkerKeybinding = this._keybindingService.lookupKeybinding(PrevMarkerAction.ID); const nextMarkerKeybinding = this._keybindingService.lookupKeybinding(NextMarkerAction.ID); const actions = [ - new Action(PrevMarkerAction.ID, PrevMarkerAction.LABEL + (prevMarkerKeybinding ? ` (${prevMarkerKeybinding.getLabel()})` : ''), 'show-previous-problem codicon-chevron-up', this._model.canNavigate(), async () => { if (this._model) { this._model.move(false, true); } }), - new Action(NextMarkerAction.ID, NextMarkerAction.LABEL + (nextMarkerKeybinding ? ` (${nextMarkerKeybinding.getLabel()})` : ''), 'show-next-problem codicon-chevron-down', this._model.canNavigate(), async () => { if (this._model) { this._model.move(true, true); } }) + new Action(NextMarkerAction.ID, NextMarkerAction.LABEL + (nextMarkerKeybinding ? ` (${nextMarkerKeybinding.getLabel()})` : ''), 'show-next-problem codicon-chevron-down', this._model.canNavigate(), async () => { if (this._model) { this._model.move(true, true); } }), + new Action(PrevMarkerAction.ID, PrevMarkerAction.LABEL + (prevMarkerKeybinding ? ` (${prevMarkerKeybinding.getLabel()})` : ''), 'show-previous-problem codicon-chevron-up', this._model.canNavigate(), async () => { if (this._model) { this._model.move(false, true); } }) ]; this._widget = new MarkerNavigationWidget(this._editor, actions, this._themeService); this._widgetVisible.set(true); diff --git a/src/vs/editor/contrib/gotoError/gotoErrorWidget.ts b/src/vs/editor/contrib/gotoError/gotoErrorWidget.ts index 224b24b56e9..0926872fc13 100644 --- a/src/vs/editor/contrib/gotoError/gotoErrorWidget.ts +++ b/src/vs/editor/contrib/gotoError/gotoErrorWidget.ts @@ -228,7 +228,7 @@ export class MarkerNavigationWidget extends PeekViewWidget { protected _fillHead(container: HTMLElement): void { super._fillHead(container); - this._actionbarWidget!.push(this.actions, { label: false, icon: true }); + this._actionbarWidget!.push(this.actions, { label: false, icon: true, index: 0 }); } protected _fillTitleIcon(container: HTMLElement): void { @@ -237,7 +237,7 @@ export class MarkerNavigationWidget extends PeekViewWidget { protected _getActionBarOptions(): IActionBarOptions { return { - orientation: ActionsOrientation.HORIZONTAL_REVERSE + orientation: ActionsOrientation.HORIZONTAL }; } From f105af60074e7e6609d95cdd9ccc6353fb224628 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 6 Jan 2020 15:34:37 -0800 Subject: [PATCH 17/21] Set sourceMap: true in default tsconfig For #87972 --- .../src/typescriptServiceClient.ts | 4 ++-- .../src/utils/tsconfig.ts | 14 ++++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/extensions/typescript-language-features/src/typescriptServiceClient.ts b/extensions/typescript-language-features/src/typescriptServiceClient.ts index 4433f18e97d..e487ac835a7 100644 --- a/extensions/typescript-language-features/src/typescriptServiceClient.ts +++ b/extensions/typescript-language-features/src/typescriptServiceClient.ts @@ -24,7 +24,7 @@ import { TypeScriptPluginPathsProvider } from './utils/pluginPathsProvider'; import { PluginManager } from './utils/plugins'; import TelemetryReporter, { VSCodeTelemetryReporter } from './utils/telemetry'; import Tracer from './utils/tracer'; -import { inferredProjectConfig } from './utils/tsconfig'; +import { inferredProjectCompilerOptions } from './utils/tsconfig'; import { TypeScriptVersionPicker } from './utils/versionPicker'; import { TypeScriptVersion, TypeScriptVersionProvider } from './utils/versionProvider'; @@ -498,7 +498,7 @@ export default class TypeScriptServiceClient extends Disposable implements IType private getCompilerOptionsForInferredProjects(configuration: TypeScriptServiceConfiguration): Proto.ExternalProjectCompilerOptions { return { - ...inferredProjectConfig(configuration), + ...inferredProjectCompilerOptions(true, configuration), allowJs: true, allowSyntheticDefaultImports: true, allowNonTsExtensions: true, diff --git a/extensions/typescript-language-features/src/utils/tsconfig.ts b/extensions/typescript-language-features/src/utils/tsconfig.ts index 55057d9d1b7..8f58f2e4f10 100644 --- a/extensions/typescript-language-features/src/utils/tsconfig.ts +++ b/extensions/typescript-language-features/src/utils/tsconfig.ts @@ -12,7 +12,8 @@ export function isImplicitProjectConfigFile(configFileName: string) { return configFileName.startsWith('/dev/null/'); } -export function inferredProjectConfig( +export function inferredProjectCompilerOptions( + isTypeScriptProject: boolean, serviceConfig: TypeScriptServiceConfiguration, ): Proto.ExternalProjectCompilerOptions { const projectConfig: Proto.ExternalProjectCompilerOptions = { @@ -29,13 +30,18 @@ export function inferredProjectConfig( projectConfig.experimentalDecorators = true; } + if (isTypeScriptProject) { + projectConfig.sourceMap = true; + } + return projectConfig; } function inferredProjectConfigSnippet( + isTypeScriptProject: boolean, config: TypeScriptServiceConfiguration ) { - const baseConfig = inferredProjectConfig(config); + const baseConfig = inferredProjectCompilerOptions(isTypeScriptProject, config); const compilerOptions = Object.keys(baseConfig).map(key => `"${key}": ${JSON.stringify(baseConfig[key])}`); return new vscode.SnippetString(`{ "compilerOptions": { @@ -62,8 +68,8 @@ export async function openOrCreateConfigFile( const doc = await vscode.workspace.openTextDocument(configFile.with({ scheme: 'untitled' })); const editor = await vscode.window.showTextDocument(doc, col); if (editor.document.getText().length === 0) { - await editor.insertSnippet(inferredProjectConfigSnippet(config)); + await editor.insertSnippet(inferredProjectConfigSnippet(isTypeScriptProject, config)); } return editor; } -} \ No newline at end of file +} From 629a08ed6231d7af269ae61a5cc610490d1f7f5d Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 6 Jan 2020 15:35:12 -0800 Subject: [PATCH 18/21] When generating a tsconfig with checkJs, make sure we also set allowJs For #87972 --- extensions/typescript-language-features/src/utils/tsconfig.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/extensions/typescript-language-features/src/utils/tsconfig.ts b/extensions/typescript-language-features/src/utils/tsconfig.ts index 8f58f2e4f10..df29267c79c 100644 --- a/extensions/typescript-language-features/src/utils/tsconfig.ts +++ b/extensions/typescript-language-features/src/utils/tsconfig.ts @@ -24,6 +24,9 @@ export function inferredProjectCompilerOptions( if (serviceConfig.checkJs) { projectConfig.checkJs = true; + if (isTypeScriptProject) { + projectConfig.allowJs = true; + } } if (serviceConfig.experimentalDecorators) { From db0c41c1dac362fa1509f3c5a947a7b7f38f9a3e Mon Sep 17 00:00:00 2001 From: Siberian Cat Date: Tue, 7 Jan 2020 10:55:37 +0200 Subject: [PATCH 19/21] Roblox XML file syntax highlight support (#87755) Co-authored-by: Alex Ross --- extensions/xml/package.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/extensions/xml/package.json b/extensions/xml/package.json index d76a632b10c..77e36951b7c 100644 --- a/extensions/xml/package.json +++ b/extensions/xml/package.json @@ -43,6 +43,8 @@ ".publishsettings", ".pubxml", ".pubxml.user", + ".rbxlx", + ".rbxmx", ".rdf", ".rng", ".rss", From a4fbcf42674b9108f364e499a1ac54c3c5b46de7 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 7 Jan 2020 10:48:43 +0100 Subject: [PATCH 20/21] Fix #88133 --- src/vs/editor/contrib/gotoError/gotoError.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/contrib/gotoError/gotoError.ts b/src/vs/editor/contrib/gotoError/gotoError.ts index 02dec404cb4..11e2b470510 100644 --- a/src/vs/editor/contrib/gotoError/gotoError.ts +++ b/src/vs/editor/contrib/gotoError/gotoError.ts @@ -424,7 +424,7 @@ export class NextMarkerAction extends MarkerNavigationAction { label: NextMarkerAction.LABEL, alias: 'Go to Next Problem (Error, Warning, Info)', precondition: EditorContextKeys.writable, - kbOpts: { kbExpr: EditorContextKeys.editorTextFocus, primary: KeyMod.Alt | KeyCode.F8, weight: KeybindingWeight.EditorContrib } + kbOpts: { kbExpr: EditorContextKeys.focus, primary: KeyMod.Alt | KeyCode.F8, weight: KeybindingWeight.EditorContrib } }); } } @@ -438,7 +438,7 @@ class PrevMarkerAction extends MarkerNavigationAction { label: PrevMarkerAction.LABEL, alias: 'Go to Previous Problem (Error, Warning, Info)', precondition: EditorContextKeys.writable, - kbOpts: { kbExpr: EditorContextKeys.editorTextFocus, primary: KeyMod.Shift | KeyMod.Alt | KeyCode.F8, weight: KeybindingWeight.EditorContrib } + kbOpts: { kbExpr: EditorContextKeys.focus, primary: KeyMod.Shift | KeyMod.Alt | KeyCode.F8, weight: KeybindingWeight.EditorContrib } }); } } From ee19568ac426f3afceead48f2381ddf81095c87c Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Tue, 7 Jan 2020 10:53:38 +0100 Subject: [PATCH 21/21] honor cancellationToken; fixes #88173 --- .../contrib/debug/browser/debugService.ts | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/contrib/debug/browser/debugService.ts b/src/vs/workbench/contrib/debug/browser/debugService.ts index 215e33e08a5..30098061097 100644 --- a/src/vs/workbench/contrib/debug/browser/debugService.ts +++ b/src/vs/workbench/contrib/debug/browser/debugService.ts @@ -380,16 +380,20 @@ export class DebugService implements IDebugService { if (configByProviders && configByProviders.type) { try { let resolvedConfig = await this.substituteVariables(launch, configByProviders); - if (!resolvedConfig) { - // User canceled resolving of interactive variables, silently return + // User cancelled resolving of interactive variables, silently return + return false; + } + + if (!this.initCancellationToken) { + // User cancelled, silently return return false; } const cfg = await this.configurationManager.resolveDebugConfigurationWithSubstitutedVariables(launch && launch.workspace ? launch.workspace.uri : undefined, type, resolvedConfig, this.initCancellationToken.token); if (!cfg) { - if (launch && type && cfg === null) { // show launch.json only for "config" being "null". - await launch.openConfigFile(false, true, type, this.initCancellationToken ? this.initCancellationToken.token : undefined); + if (launch && type && cfg === null && this.initCancellationToken) { // show launch.json only for "config" being "null". + await launch.openConfigFile(false, true, type, this.initCancellationToken.token); } return false; } @@ -422,16 +426,16 @@ export class DebugService implements IDebugService { } else if (this.contextService.getWorkbenchState() === WorkbenchState.EMPTY) { await this.showError(nls.localize('noFolderWorkspaceDebugError', "The active file can not be debugged. Make sure it is saved and that you have a debug extension installed for that file type.")); } - if (launch) { - await launch.openConfigFile(false, true, undefined, this.initCancellationToken ? this.initCancellationToken.token : undefined); + if (launch && this.initCancellationToken) { + await launch.openConfigFile(false, true, undefined, this.initCancellationToken.token); } return false; } } - if (launch && type && configByProviders === null) { // show launch.json only for "config" being "null". - await launch.openConfigFile(false, true, type, this.initCancellationToken ? this.initCancellationToken.token : undefined); + if (launch && type && configByProviders === null && this.initCancellationToken) { // show launch.json only for "config" being "null". + await launch.openConfigFile(false, true, type, this.initCancellationToken.token); } return false; @@ -648,7 +652,7 @@ export class DebugService implements IDebugService { const resolvedByProviders = await this.configurationManager.resolveConfigurationByProviders(launch.workspace ? launch.workspace.uri : undefined, unresolved.type, unresolved, this.initCancellationToken.token); if (resolvedByProviders) { resolved = await this.substituteVariables(launch, resolvedByProviders); - if (resolved) { + if (resolved && this.initCancellationToken) { resolved = await this.configurationManager.resolveDebugConfigurationWithSubstitutedVariables(launch && launch.workspace ? launch.workspace.uri : undefined, unresolved.type, resolved, this.initCancellationToken.token); } } else {