From 52b181c2ce256f3e2817e2963d5afd9ea405bd3e Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Thu, 3 Oct 2024 13:10:04 +0200 Subject: [PATCH 1/5] Changing checkbox state on tree item (rather than UI checkbox) doesn't propagate (#230376) Fixesmicrosoft/vscode-pull-request-github#6248 --- .../api/browser/mainThreadTreeViews.ts | 24 ++-- .../workbench/browser/parts/views/checkbox.ts | 10 +- .../workbench/browser/parts/views/treeView.ts | 130 ++++++++++-------- src/vs/workbench/common/views.ts | 3 +- 4 files changed, 90 insertions(+), 77 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadTreeViews.ts b/src/vs/workbench/api/browser/mainThreadTreeViews.ts index 2671f5b3880f..74089f182b0f 100644 --- a/src/vs/workbench/api/browser/mainThreadTreeViews.ts +++ b/src/vs/workbench/api/browser/mainThreadTreeViews.ts @@ -88,7 +88,7 @@ export class MainThreadTreeViews extends Disposable implements MainThreadTreeVie const dataProvider = this._dataProviders.get(treeViewId); if (viewer && dataProvider) { const itemsToRefresh = dataProvider.dataProvider.getItemsToRefresh(itemsToRefreshByHandle); - return viewer.refresh(itemsToRefresh.length ? itemsToRefresh : undefined); + return viewer.refresh(itemsToRefresh.items.length ? itemsToRefresh.items : undefined, itemsToRefresh.checkboxes.length ? itemsToRefresh.checkboxes : undefined); } return Promise.resolve(); } @@ -287,22 +287,26 @@ class TreeViewDataProvider implements ITreeViewDataProvider { }); } - getItemsToRefresh(itemsToRefreshByHandle: { [treeItemHandle: string]: ITreeItem }): ITreeItem[] { + getItemsToRefresh(itemsToRefreshByHandle: { [treeItemHandle: string]: ITreeItem }): { items: ITreeItem[]; checkboxes: ITreeItem[] } { const itemsToRefresh: ITreeItem[] = []; + const checkboxesToRefresh: ITreeItem[] = []; if (itemsToRefreshByHandle) { - for (const treeItemHandle of Object.keys(itemsToRefreshByHandle)) { - const currentTreeItem = this.getItem(treeItemHandle); + for (const newTreeItemHandle of Object.keys(itemsToRefreshByHandle)) { + const currentTreeItem = this.getItem(newTreeItemHandle); if (currentTreeItem) { // Refresh only if the item exists - const treeItem = itemsToRefreshByHandle[treeItemHandle]; + const newTreeItem = itemsToRefreshByHandle[newTreeItemHandle]; + if (currentTreeItem.checkbox?.isChecked !== newTreeItem.checkbox?.isChecked) { + checkboxesToRefresh.push(currentTreeItem); + } // Update the current item with refreshed item - this.updateTreeItem(currentTreeItem, treeItem); - if (treeItemHandle === treeItem.handle) { + this.updateTreeItem(currentTreeItem, newTreeItem); + if (newTreeItemHandle === newTreeItem.handle) { itemsToRefresh.push(currentTreeItem); } else { // Update maps when handle is changed and refresh parent - this.itemsMap.delete(treeItemHandle); + this.itemsMap.delete(newTreeItemHandle); this.itemsMap.set(currentTreeItem.handle, currentTreeItem); - const parent = treeItem.parentHandle ? this.itemsMap.get(treeItem.parentHandle) : null; + const parent = newTreeItem.parentHandle ? this.itemsMap.get(newTreeItem.parentHandle) : null; if (parent) { itemsToRefresh.push(parent); } @@ -310,7 +314,7 @@ class TreeViewDataProvider implements ITreeViewDataProvider { } } } - return itemsToRefresh; + return { items: itemsToRefresh, checkboxes: checkboxesToRefresh }; } getItem(treeItemHandle: string): ITreeItem | undefined { diff --git a/src/vs/workbench/browser/parts/views/checkbox.ts b/src/vs/workbench/browser/parts/views/checkbox.ts index 2907220d0465..116e33342a91 100644 --- a/src/vs/workbench/browser/parts/views/checkbox.ts +++ b/src/vs/workbench/browser/parts/views/checkbox.ts @@ -25,19 +25,15 @@ export class CheckboxStateHandler extends Disposable { } export class TreeItemCheckbox extends Disposable { - public toggle: Toggle | undefined; - private checkboxContainer: HTMLDivElement; - public isDisposed = false; + private toggle: Toggle | undefined; + private readonly checkboxContainer: HTMLDivElement; private hover: IManagedHover | undefined; public static readonly checkboxClass = 'custom-view-tree-node-item-checkbox'; - private readonly _onDidChangeState = new Emitter(); - readonly onDidChangeState: Event = this._onDidChangeState.event; - constructor( container: HTMLElement, - private checkboxStateHandler: CheckboxStateHandler, + private readonly checkboxStateHandler: CheckboxStateHandler, private readonly hoverDelegate: IHoverDelegate, private readonly hoverService: IHoverService ) { diff --git a/src/vs/workbench/browser/parts/views/treeView.ts b/src/vs/workbench/browser/parts/views/treeView.ts index 5e32b6e436ec..1d5392aed5d2 100644 --- a/src/vs/workbench/browser/parts/views/treeView.ts +++ b/src/vs/workbench/browser/parts/views/treeView.ts @@ -971,7 +971,11 @@ abstract class AbstractTreeView extends Disposable implements ITreeView { return 0; } - async refresh(elements?: readonly ITreeItem[]): Promise { + private updateCheckboxes(elements: readonly ITreeItem[]): ITreeItem[] { + return setCascadingCheckboxUpdates(elements); + } + + async refresh(elements?: readonly ITreeItem[], checkboxes?: readonly ITreeItem[]): Promise { if (this.dataProvider && this.tree) { if (this.refreshing) { await Event.toPromise(this._onDidCompleteRefresh.event); @@ -985,7 +989,8 @@ abstract class AbstractTreeView extends Disposable implements ITreeView { element.children = undefined; // reset children } if (this.isVisible) { - return this.doRefresh(elements); + const affectedElements = this.updateCheckboxes(checkboxes ?? []); + return this.doRefresh(elements.concat(affectedElements)); } else { if (this.elementsToRefresh.length) { const seen: Set = new Set(); @@ -1383,8 +1388,7 @@ class TreeRenderer extends Disposable implements ITreeRenderer = new Set(); - function checkParents(currentItem: ITreeItem) { - if (currentItem.parent && (currentItem.parent.checkbox !== undefined) && currentItem.parent.children) { - if (visitedParents.has(currentItem.parent)) { - return; - } else { - visitedParents.add(currentItem.parent); - } - - let someUnchecked = false; - let someChecked = false; - for (const child of currentItem.parent.children) { - if (someUnchecked && someChecked) { - break; - } - if (child.checkbox !== undefined) { - if (child.checkbox.isChecked) { - someChecked = true; - } else { - someUnchecked = true; - } - } - } - if (someChecked && !someUnchecked && (currentItem.parent.checkbox.isChecked !== true)) { - currentItem.parent.checkbox.isChecked = true; - additionalItems.push(currentItem.parent); - checkParents(currentItem.parent); - } else if (someUnchecked && (currentItem.parent.checkbox.isChecked !== false)) { - currentItem.parent.checkbox.isChecked = false; - additionalItems.push(currentItem.parent); - checkParents(currentItem.parent); - } - } - } - checkParents(item); - } - } + allItems = setCascadingCheckboxUpdates(items); } - items = items.concat(additionalItems); - items.forEach(item => { + + allItems.forEach(item => { const renderedItems = this._renderedElements.get(item.handle); if (renderedItems) { renderedItems.forEach(renderedItems => renderedItems.rendered.checkbox?.render(item)); } }); - this._onDidChangeCheckboxState.fire(items); + this._onDidChangeCheckboxState.fire(allItems); } disposeElement(resource: ITreeNode, index: number, templateData: ITreeExplorerTemplateData): void { @@ -1995,3 +1949,61 @@ export class CustomTreeViewDragAndDrop implements ITreeDragAndDrop { dispose(): void { } } + +function setCascadingCheckboxUpdates(items: readonly ITreeItem[]) { + const additionalItems: ITreeItem[] = []; + + for (const item of items) { + if (item.checkbox !== undefined) { + + const checkChildren = (currentItem: ITreeItem) => { + for (const child of (currentItem.children ?? [])) { + if ((child.checkbox !== undefined) && (currentItem.checkbox !== undefined) && (child.checkbox.isChecked !== currentItem.checkbox.isChecked)) { + child.checkbox.isChecked = currentItem.checkbox.isChecked; + additionalItems.push(child); + checkChildren(child); + } + } + }; + checkChildren(item); + + const visitedParents: Set = new Set(); + const checkParents = (currentItem: ITreeItem) => { + if (currentItem.parent && (currentItem.parent.checkbox !== undefined) && currentItem.parent.children) { + if (visitedParents.has(currentItem.parent)) { + return; + } else { + visitedParents.add(currentItem.parent); + } + + let someUnchecked = false; + let someChecked = false; + for (const child of currentItem.parent.children) { + if (someUnchecked && someChecked) { + break; + } + if (child.checkbox !== undefined) { + if (child.checkbox.isChecked) { + someChecked = true; + } else { + someUnchecked = true; + } + } + } + if (someChecked && !someUnchecked && (currentItem.parent.checkbox.isChecked !== true)) { + currentItem.parent.checkbox.isChecked = true; + additionalItems.push(currentItem.parent); + checkParents(currentItem.parent); + } else if (someUnchecked && (currentItem.parent.checkbox.isChecked !== false)) { + currentItem.parent.checkbox.isChecked = false; + additionalItems.push(currentItem.parent); + checkParents(currentItem.parent); + } + } + }; + checkParents(item); + } + } + + return items.concat(additionalItems); +} diff --git a/src/vs/workbench/common/views.ts b/src/vs/workbench/common/views.ts index 15937afa708c..ab1d7838167c 100644 --- a/src/vs/workbench/common/views.ts +++ b/src/vs/workbench/common/views.ts @@ -657,7 +657,8 @@ export interface ITreeView extends IDisposable { readonly container: any | undefined; - refresh(treeItems?: readonly ITreeItem[]): Promise; + // checkboxesChanged is a subset of treeItems + refresh(treeItems?: readonly ITreeItem[], checkboxesChanged?: readonly ITreeItem[]): Promise; setVisibility(visible: boolean): void; From fc6d94b8062a04f953ffe6842753309d3fcfb025 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 3 Oct 2024 13:49:56 +0200 Subject: [PATCH 2/5] [css/json/html] adopt latest lsp, update to `module: node16` (#230371) * adopt latest language-server/client * update package-locks * transpiler to support Node16 --- build/lib/tsb/transpiler.js | 2 +- build/lib/tsb/transpiler.ts | 2 +- .../client/tsconfig.json | 3 +- .../css-language-features/package-lock.json | 34 +++++++++---------- extensions/css-language-features/package.json | 2 +- .../server/package-lock.json | 32 ++++++++--------- .../css-language-features/server/package.json | 2 +- .../server/src/browser/cssServerWorkerMain.ts | 2 +- .../server/src/node/cssServerNodeMain.ts | 2 +- .../server/tsconfig.json | 3 +- .../client/src/languageParticipants.ts | 3 +- .../client/tsconfig.json | 3 +- .../html-language-features/package-lock.json | 34 +++++++++---------- .../html-language-features/package.json | 2 +- .../extension-browser.webpack.config.js | 6 ++++ .../server/package-lock.json | 32 ++++++++--------- .../server/package.json | 2 +- .../src/browser/htmlServerWorkerMain.ts | 2 +- .../server/src/modes/javascriptMode.ts | 2 +- .../server/src/node/htmlServerNodeMain.ts | 2 +- .../server/src/test/words.test.ts | 4 +-- .../server/tsconfig.json | 3 +- .../client/src/languageParticipants.ts | 3 +- .../client/src/languageStatus.ts | 3 +- .../client/tsconfig.json | 3 +- .../json-language-features/package-lock.json | 34 +++++++++---------- .../json-language-features/package.json | 2 +- .../server/package-lock.json | 32 ++++++++--------- .../server/package.json | 2 +- .../src/browser/jsonServerWorkerMain.ts | 2 +- .../server/src/node/jsonServerNodeMain.ts | 2 +- .../server/tsconfig.json | 3 +- extensions/shared.webpack.config.js | 14 ++++++-- package-lock.json | 20 ++++++++--- package.json | 2 +- 35 files changed, 164 insertions(+), 137 deletions(-) diff --git a/build/lib/tsb/transpiler.js b/build/lib/tsb/transpiler.js index 100b1bac972a..085c9e2b1034 100644 --- a/build/lib/tsb/transpiler.js +++ b/build/lib/tsb/transpiler.js @@ -263,7 +263,7 @@ class SwcTranspiler { options = SwcTranspiler._swcrcAmd; } } - else if (this._cmdLine.options.module === ts.ModuleKind.CommonJS) { + else if (this._cmdLine.options.module === ts.ModuleKind.CommonJS || this._cmdLine.options.module === ts.ModuleKind.Node16) { options = SwcTranspiler._swcrcCommonJS; } this._jobs.push(swc.transform(tsSrc, options).then(output => { diff --git a/build/lib/tsb/transpiler.ts b/build/lib/tsb/transpiler.ts index b6a9deeb3c76..e30bfe9d0544 100644 --- a/build/lib/tsb/transpiler.ts +++ b/build/lib/tsb/transpiler.ts @@ -337,7 +337,7 @@ export class SwcTranspiler implements ITranspiler { if (isAmd) { options = SwcTranspiler._swcrcAmd; } - } else if (this._cmdLine.options.module === ts.ModuleKind.CommonJS) { + } else if (this._cmdLine.options.module === ts.ModuleKind.CommonJS || this._cmdLine.options.module === ts.ModuleKind.Node16) { options = SwcTranspiler._swcrcCommonJS; } diff --git a/extensions/css-language-features/client/tsconfig.json b/extensions/css-language-features/client/tsconfig.json index 17bf7e962a85..5cf131d0677c 100644 --- a/extensions/css-language-features/client/tsconfig.json +++ b/extensions/css-language-features/client/tsconfig.json @@ -4,7 +4,8 @@ "outDir": "./out", "lib": [ "webworker" - ] + ], + "module": "Node16", }, "include": [ "src/**/*", diff --git a/extensions/css-language-features/package-lock.json b/extensions/css-language-features/package-lock.json index e13184cae570..289e29e2abbe 100644 --- a/extensions/css-language-features/package-lock.json +++ b/extensions/css-language-features/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "vscode-languageclient": "10.0.0-next.8", + "vscode-languageclient": "^10.0.0-next.13", "vscode-uri": "^3.0.8" }, "devDependencies": { @@ -87,39 +87,39 @@ "dev": true }, "node_modules/vscode-jsonrpc": { - "version": "9.0.0-next.4", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.4.tgz", - "integrity": "sha512-zSVIr58lJSMYKIsZ5P7GtBbv1eEx25eNyOf0NmEzxmn1GhUNJAVAb5hkA1poKUwj1FRMwN6CeyWxZypmr8SsQQ==", + "version": "9.0.0-next.6", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.6.tgz", + "integrity": "sha512-KCSvUNsFiVciG9iqjJKBZOd66CN3ZKohDlYRmoOi+pd8l15MFLZ8wRG4c+wuzePGba/8WcCG2TM+C/GVlvuaeA==", "engines": { "node": ">=14.0.0" } }, "node_modules/vscode-languageclient": { - "version": "10.0.0-next.8", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-10.0.0-next.8.tgz", - "integrity": "sha512-D9inIHgqKayO9Tv0MeLb3XIL76yTuWmKdHqcGZKzjtQrMGJgASJDYWTapu+yAjEpDp0gmVOaCYyIlLB86ncDoQ==", + "version": "10.0.0-next.13", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-10.0.0-next.13.tgz", + "integrity": "sha512-KLsOMJoYpkk36PIgcOjyZ4AekOfzp4kdWdRRbVKeVvSIrwrn/4RSZr0NlD6EvUBBJSsJW4WDrYY7Y3znkqa6+w==", "dependencies": { "minimatch": "^9.0.3", "semver": "^7.6.0", - "vscode-languageserver-protocol": "3.17.6-next.6" + "vscode-languageserver-protocol": "3.17.6-next.11" }, "engines": { - "vscode": "^1.89.0" + "vscode": "^1.91.0" } }, "node_modules/vscode-languageserver-protocol": { - "version": "3.17.6-next.6", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.6.tgz", - "integrity": "sha512-naxM9kc/phpl0kAFNVPejMUWUtzFXdPYY/BtQTYtfbBbHf8sceHOrKkmf6yynZRu1A4oFtRZNqV3wyFRTWqUHw==", + "version": "3.17.6-next.11", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.11.tgz", + "integrity": "sha512-GeJxEp1TiLsp79f8WG5n10wLViXfgFKb99hU9K8m7KDWM95/QFEqWkm79f9LVm54tUK74I91a9EeiQLCS/FABQ==", "dependencies": { - "vscode-jsonrpc": "9.0.0-next.4", - "vscode-languageserver-types": "3.17.6-next.4" + "vscode-jsonrpc": "9.0.0-next.6", + "vscode-languageserver-types": "3.17.6-next.5" } }, "node_modules/vscode-languageserver-types": { - "version": "3.17.6-next.4", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.4.tgz", - "integrity": "sha512-SeJTpH/S14EbxOAVaOUoGVqPToqpRTld5QO5Ghig3AlbFJTFF9Wu7srHMfa85L0SX1RYAuuCSFKJVVCxDIk1/Q==" + "version": "3.17.6-next.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.5.tgz", + "integrity": "sha512-QFmf3Yl1tCgUQfA77N9Me/LXldJXkIVypQbty2rJ1DNHQkC+iwvm4Z2tXg9czSwlhvv0pD4pbF5mT7WhAglolw==" }, "node_modules/vscode-uri": { "version": "3.0.8", diff --git a/extensions/css-language-features/package.json b/extensions/css-language-features/package.json index 802e2fbf1132..af75de5386b6 100644 --- a/extensions/css-language-features/package.json +++ b/extensions/css-language-features/package.json @@ -997,7 +997,7 @@ ] }, "dependencies": { - "vscode-languageclient": "10.0.0-next.8", + "vscode-languageclient": "^10.0.0-next.13", "vscode-uri": "^3.0.8" }, "devDependencies": { diff --git a/extensions/css-language-features/server/package-lock.json b/extensions/css-language-features/server/package-lock.json index 2f7cb932b0c0..5fa5546e0adb 100644 --- a/extensions/css-language-features/server/package-lock.json +++ b/extensions/css-language-features/server/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@vscode/l10n": "^0.0.18", "vscode-css-languageservice": "^6.3.1", - "vscode-languageserver": "10.0.0-next.6", + "vscode-languageserver": "^10.0.0-next.11", "vscode-uri": "^3.0.8" }, "devDependencies": { @@ -60,37 +60,37 @@ } }, "node_modules/vscode-jsonrpc": { - "version": "9.0.0-next.4", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.4.tgz", - "integrity": "sha512-zSVIr58lJSMYKIsZ5P7GtBbv1eEx25eNyOf0NmEzxmn1GhUNJAVAb5hkA1poKUwj1FRMwN6CeyWxZypmr8SsQQ==", + "version": "9.0.0-next.6", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.6.tgz", + "integrity": "sha512-KCSvUNsFiVciG9iqjJKBZOd66CN3ZKohDlYRmoOi+pd8l15MFLZ8wRG4c+wuzePGba/8WcCG2TM+C/GVlvuaeA==", "engines": { "node": ">=14.0.0" } }, "node_modules/vscode-languageserver": { - "version": "10.0.0-next.6", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-10.0.0-next.6.tgz", - "integrity": "sha512-0Lh1nhQfSxo5Ob+ayYO1QTIsDix2/Lc72Urm1KZrCFxK5zIFYaEh3QFeM9oZih4Rzs0ZkQPXXnoHtpvs5GT+Zw==", + "version": "10.0.0-next.11", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-10.0.0-next.11.tgz", + "integrity": "sha512-cmobSrVDYhlh/t02vz/bV8nNpds8mus5HnILULae2iAvOjoaJPnTAp0jJWoYdUqTpIVzT9JV6JMKqLEvdqpeqg==", "dependencies": { - "vscode-languageserver-protocol": "3.17.6-next.6" + "vscode-languageserver-protocol": "3.17.6-next.11" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "node_modules/vscode-languageserver-protocol": { - "version": "3.17.6-next.6", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.6.tgz", - "integrity": "sha512-naxM9kc/phpl0kAFNVPejMUWUtzFXdPYY/BtQTYtfbBbHf8sceHOrKkmf6yynZRu1A4oFtRZNqV3wyFRTWqUHw==", + "version": "3.17.6-next.11", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.11.tgz", + "integrity": "sha512-GeJxEp1TiLsp79f8WG5n10wLViXfgFKb99hU9K8m7KDWM95/QFEqWkm79f9LVm54tUK74I91a9EeiQLCS/FABQ==", "dependencies": { - "vscode-jsonrpc": "9.0.0-next.4", - "vscode-languageserver-types": "3.17.6-next.4" + "vscode-jsonrpc": "9.0.0-next.6", + "vscode-languageserver-types": "3.17.6-next.5" } }, "node_modules/vscode-languageserver-protocol/node_modules/vscode-languageserver-types": { - "version": "3.17.6-next.4", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.4.tgz", - "integrity": "sha512-SeJTpH/S14EbxOAVaOUoGVqPToqpRTld5QO5Ghig3AlbFJTFF9Wu7srHMfa85L0SX1RYAuuCSFKJVVCxDIk1/Q==" + "version": "3.17.6-next.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.5.tgz", + "integrity": "sha512-QFmf3Yl1tCgUQfA77N9Me/LXldJXkIVypQbty2rJ1DNHQkC+iwvm4Z2tXg9czSwlhvv0pD4pbF5mT7WhAglolw==" }, "node_modules/vscode-languageserver-textdocument": { "version": "1.0.12", diff --git a/extensions/css-language-features/server/package.json b/extensions/css-language-features/server/package.json index 4d8b9bd41acb..33153ad03cf2 100644 --- a/extensions/css-language-features/server/package.json +++ b/extensions/css-language-features/server/package.json @@ -12,7 +12,7 @@ "dependencies": { "@vscode/l10n": "^0.0.18", "vscode-css-languageservice": "^6.3.1", - "vscode-languageserver": "10.0.0-next.6", + "vscode-languageserver": "^10.0.0-next.11", "vscode-uri": "^3.0.8" }, "devDependencies": { diff --git a/extensions/css-language-features/server/src/browser/cssServerWorkerMain.ts b/extensions/css-language-features/server/src/browser/cssServerWorkerMain.ts index bc645de8170e..4f2ae207c168 100644 --- a/extensions/css-language-features/server/src/browser/cssServerWorkerMain.ts +++ b/extensions/css-language-features/server/src/browser/cssServerWorkerMain.ts @@ -22,7 +22,7 @@ const messageHandler = async (e: any) => { } else { l10nLog.push(`l10n: No bundle configured.`); } - await import('./cssServerMain'); + await import('./cssServerMain.js'); if (self.onmessage !== messageHandler) { pendingMessages.forEach(msg => self.onmessage?.(msg)); pendingMessages.length = 0; diff --git a/extensions/css-language-features/server/src/node/cssServerNodeMain.ts b/extensions/css-language-features/server/src/node/cssServerNodeMain.ts index 3d566c754edf..67d8439fd9bd 100644 --- a/extensions/css-language-features/server/src/node/cssServerNodeMain.ts +++ b/extensions/css-language-features/server/src/node/cssServerNodeMain.ts @@ -15,7 +15,7 @@ async function setupMain() { l10nLog.push(`l10n: Problems loading ${i10lLocation.toString()} : ${e}`); } } - await import('./cssServerMain'); + await import('./cssServerMain.js'); l10nLog.forEach(console.log); } setupMain(); diff --git a/extensions/css-language-features/server/tsconfig.json b/extensions/css-language-features/server/tsconfig.json index ae02026a740f..e21408bda972 100644 --- a/extensions/css-language-features/server/tsconfig.json +++ b/extensions/css-language-features/server/tsconfig.json @@ -5,7 +5,8 @@ "lib": [ "ES2020", "WebWorker" - ] + ], + "module": "Node16", }, "include": [ "src/**/*" diff --git a/extensions/html-language-features/client/src/languageParticipants.ts b/extensions/html-language-features/client/src/languageParticipants.ts index e3d5612b9b32..32b0bb5122db 100644 --- a/extensions/html-language-features/client/src/languageParticipants.ts +++ b/extensions/html-language-features/client/src/languageParticipants.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { DocumentSelector } from 'vscode-languageclient'; import { Event, EventEmitter, extensions } from 'vscode'; /** @@ -22,7 +21,7 @@ interface LanguageParticipantContribution { export interface LanguageParticipants { readonly onDidChange: Event; - readonly documentSelector: DocumentSelector; + readonly documentSelector: string[]; hasLanguage(languageId: string): boolean; useAutoInsert(languageId: string): boolean; dispose(): void; diff --git a/extensions/html-language-features/client/tsconfig.json b/extensions/html-language-features/client/tsconfig.json index 349af163eea5..615adaeea046 100644 --- a/extensions/html-language-features/client/tsconfig.json +++ b/extensions/html-language-features/client/tsconfig.json @@ -4,7 +4,8 @@ "outDir": "./out", "lib": [ "webworker" - ] + ], + "module": "Node16", }, "include": [ "src/**/*", diff --git a/extensions/html-language-features/package-lock.json b/extensions/html-language-features/package-lock.json index a7c6d22b3955..52fbd6326671 100644 --- a/extensions/html-language-features/package-lock.json +++ b/extensions/html-language-features/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@vscode/extension-telemetry": "^0.9.0", - "vscode-languageclient": "10.0.0-next.8", + "vscode-languageclient": "^10.0.0-next.13", "vscode-uri": "^3.0.8" }, "devDependencies": { @@ -215,39 +215,39 @@ "dev": true }, "node_modules/vscode-jsonrpc": { - "version": "9.0.0-next.4", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.4.tgz", - "integrity": "sha512-zSVIr58lJSMYKIsZ5P7GtBbv1eEx25eNyOf0NmEzxmn1GhUNJAVAb5hkA1poKUwj1FRMwN6CeyWxZypmr8SsQQ==", + "version": "9.0.0-next.6", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.6.tgz", + "integrity": "sha512-KCSvUNsFiVciG9iqjJKBZOd66CN3ZKohDlYRmoOi+pd8l15MFLZ8wRG4c+wuzePGba/8WcCG2TM+C/GVlvuaeA==", "engines": { "node": ">=14.0.0" } }, "node_modules/vscode-languageclient": { - "version": "10.0.0-next.8", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-10.0.0-next.8.tgz", - "integrity": "sha512-D9inIHgqKayO9Tv0MeLb3XIL76yTuWmKdHqcGZKzjtQrMGJgASJDYWTapu+yAjEpDp0gmVOaCYyIlLB86ncDoQ==", + "version": "10.0.0-next.13", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-10.0.0-next.13.tgz", + "integrity": "sha512-KLsOMJoYpkk36PIgcOjyZ4AekOfzp4kdWdRRbVKeVvSIrwrn/4RSZr0NlD6EvUBBJSsJW4WDrYY7Y3znkqa6+w==", "dependencies": { "minimatch": "^9.0.3", "semver": "^7.6.0", - "vscode-languageserver-protocol": "3.17.6-next.6" + "vscode-languageserver-protocol": "3.17.6-next.11" }, "engines": { - "vscode": "^1.89.0" + "vscode": "^1.91.0" } }, "node_modules/vscode-languageserver-protocol": { - "version": "3.17.6-next.6", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.6.tgz", - "integrity": "sha512-naxM9kc/phpl0kAFNVPejMUWUtzFXdPYY/BtQTYtfbBbHf8sceHOrKkmf6yynZRu1A4oFtRZNqV3wyFRTWqUHw==", + "version": "3.17.6-next.11", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.11.tgz", + "integrity": "sha512-GeJxEp1TiLsp79f8WG5n10wLViXfgFKb99hU9K8m7KDWM95/QFEqWkm79f9LVm54tUK74I91a9EeiQLCS/FABQ==", "dependencies": { - "vscode-jsonrpc": "9.0.0-next.4", - "vscode-languageserver-types": "3.17.6-next.4" + "vscode-jsonrpc": "9.0.0-next.6", + "vscode-languageserver-types": "3.17.6-next.5" } }, "node_modules/vscode-languageserver-types": { - "version": "3.17.6-next.4", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.4.tgz", - "integrity": "sha512-SeJTpH/S14EbxOAVaOUoGVqPToqpRTld5QO5Ghig3AlbFJTFF9Wu7srHMfa85L0SX1RYAuuCSFKJVVCxDIk1/Q==" + "version": "3.17.6-next.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.5.tgz", + "integrity": "sha512-QFmf3Yl1tCgUQfA77N9Me/LXldJXkIVypQbty2rJ1DNHQkC+iwvm4Z2tXg9czSwlhvv0pD4pbF5mT7WhAglolw==" }, "node_modules/vscode-uri": { "version": "3.0.8", diff --git a/extensions/html-language-features/package.json b/extensions/html-language-features/package.json index 5246391caf0e..60b9718e6c38 100644 --- a/extensions/html-language-features/package.json +++ b/extensions/html-language-features/package.json @@ -259,7 +259,7 @@ }, "dependencies": { "@vscode/extension-telemetry": "^0.9.0", - "vscode-languageclient": "10.0.0-next.8", + "vscode-languageclient": "^10.0.0-next.13", "vscode-uri": "^3.0.8" }, "devDependencies": { diff --git a/extensions/html-language-features/server/extension-browser.webpack.config.js b/extensions/html-language-features/server/extension-browser.webpack.config.js index 7e6256b4a45f..07848486cbd9 100644 --- a/extensions/html-language-features/server/extension-browser.webpack.config.js +++ b/extensions/html-language-features/server/extension-browser.webpack.config.js @@ -15,6 +15,12 @@ const serverConfig = withBrowserDefaults({ entry: { extension: './src/browser/htmlServerWorkerMain.ts', }, + resolve: { + extensionAlias: { + // this is needed to resolve dynamic imports that now require the .js extension + '.js': ['.js', '.ts'], + }, + }, output: { filename: 'htmlServerMain.js', path: path.join(__dirname, 'dist', 'browser'), diff --git a/extensions/html-language-features/server/package-lock.json b/extensions/html-language-features/server/package-lock.json index a6e67b1ef6bc..c0b4c6bd8e84 100644 --- a/extensions/html-language-features/server/package-lock.json +++ b/extensions/html-language-features/server/package-lock.json @@ -12,7 +12,7 @@ "@vscode/l10n": "^0.0.18", "vscode-css-languageservice": "^6.3.1", "vscode-html-languageservice": "^5.3.1", - "vscode-languageserver": "10.0.0-next.6", + "vscode-languageserver": "^10.0.0-next.11", "vscode-languageserver-textdocument": "^1.0.12", "vscode-uri": "^3.0.8" }, @@ -73,37 +73,37 @@ } }, "node_modules/vscode-jsonrpc": { - "version": "9.0.0-next.4", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.4.tgz", - "integrity": "sha512-zSVIr58lJSMYKIsZ5P7GtBbv1eEx25eNyOf0NmEzxmn1GhUNJAVAb5hkA1poKUwj1FRMwN6CeyWxZypmr8SsQQ==", + "version": "9.0.0-next.6", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.6.tgz", + "integrity": "sha512-KCSvUNsFiVciG9iqjJKBZOd66CN3ZKohDlYRmoOi+pd8l15MFLZ8wRG4c+wuzePGba/8WcCG2TM+C/GVlvuaeA==", "engines": { "node": ">=14.0.0" } }, "node_modules/vscode-languageserver": { - "version": "10.0.0-next.6", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-10.0.0-next.6.tgz", - "integrity": "sha512-0Lh1nhQfSxo5Ob+ayYO1QTIsDix2/Lc72Urm1KZrCFxK5zIFYaEh3QFeM9oZih4Rzs0ZkQPXXnoHtpvs5GT+Zw==", + "version": "10.0.0-next.11", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-10.0.0-next.11.tgz", + "integrity": "sha512-cmobSrVDYhlh/t02vz/bV8nNpds8mus5HnILULae2iAvOjoaJPnTAp0jJWoYdUqTpIVzT9JV6JMKqLEvdqpeqg==", "dependencies": { - "vscode-languageserver-protocol": "3.17.6-next.6" + "vscode-languageserver-protocol": "3.17.6-next.11" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "node_modules/vscode-languageserver-protocol": { - "version": "3.17.6-next.6", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.6.tgz", - "integrity": "sha512-naxM9kc/phpl0kAFNVPejMUWUtzFXdPYY/BtQTYtfbBbHf8sceHOrKkmf6yynZRu1A4oFtRZNqV3wyFRTWqUHw==", + "version": "3.17.6-next.11", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.11.tgz", + "integrity": "sha512-GeJxEp1TiLsp79f8WG5n10wLViXfgFKb99hU9K8m7KDWM95/QFEqWkm79f9LVm54tUK74I91a9EeiQLCS/FABQ==", "dependencies": { - "vscode-jsonrpc": "9.0.0-next.4", - "vscode-languageserver-types": "3.17.6-next.4" + "vscode-jsonrpc": "9.0.0-next.6", + "vscode-languageserver-types": "3.17.6-next.5" } }, "node_modules/vscode-languageserver-protocol/node_modules/vscode-languageserver-types": { - "version": "3.17.6-next.4", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.4.tgz", - "integrity": "sha512-SeJTpH/S14EbxOAVaOUoGVqPToqpRTld5QO5Ghig3AlbFJTFF9Wu7srHMfa85L0SX1RYAuuCSFKJVVCxDIk1/Q==" + "version": "3.17.6-next.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.5.tgz", + "integrity": "sha512-QFmf3Yl1tCgUQfA77N9Me/LXldJXkIVypQbty2rJ1DNHQkC+iwvm4Z2tXg9czSwlhvv0pD4pbF5mT7WhAglolw==" }, "node_modules/vscode-languageserver-textdocument": { "version": "1.0.12", diff --git a/extensions/html-language-features/server/package.json b/extensions/html-language-features/server/package.json index 652340f49d7c..cbf778a2c4cf 100644 --- a/extensions/html-language-features/server/package.json +++ b/extensions/html-language-features/server/package.json @@ -12,7 +12,7 @@ "@vscode/l10n": "^0.0.18", "vscode-css-languageservice": "^6.3.1", "vscode-html-languageservice": "^5.3.1", - "vscode-languageserver": "10.0.0-next.6", + "vscode-languageserver": "^10.0.0-next.11", "vscode-languageserver-textdocument": "^1.0.12", "vscode-uri": "^3.0.8" }, diff --git a/extensions/html-language-features/server/src/browser/htmlServerWorkerMain.ts b/extensions/html-language-features/server/src/browser/htmlServerWorkerMain.ts index 600ae1ba8c5c..f7c0de01bdd3 100644 --- a/extensions/html-language-features/server/src/browser/htmlServerWorkerMain.ts +++ b/extensions/html-language-features/server/src/browser/htmlServerWorkerMain.ts @@ -22,7 +22,7 @@ const messageHandler = async (e: any) => { } else { l10nLog.push(`l10n: No bundle configured.`); } - await import('./htmlServerMain'); + await import('./htmlServerMain.js'); if (self.onmessage !== messageHandler) { pendingMessages.forEach(msg => self.onmessage?.(msg)); pendingMessages.length = 0; diff --git a/extensions/html-language-features/server/src/modes/javascriptMode.ts b/extensions/html-language-features/server/src/modes/javascriptMode.ts index a540745428c5..d820810c9203 100644 --- a/extensions/html-language-features/server/src/modes/javascriptMode.ts +++ b/extensions/html-language-features/server/src/modes/javascriptMode.ts @@ -22,7 +22,7 @@ function getLanguageServiceHost(scriptKind: ts.ScriptKind) { const compilerOptions: ts.CompilerOptions = { allowNonTsExtensions: true, allowJs: true, lib: ['lib.es2020.full.d.ts'], target: ts.ScriptTarget.Latest, moduleResolution: ts.ModuleResolutionKind.Classic, experimentalDecorators: false }; let currentTextDocument = TextDocument.create('init', 'javascript', 1, ''); - const jsLanguageService = import(/* webpackChunkName: "javascriptLibs" */ './javascriptLibs').then(libs => { + const jsLanguageService = import(/* webpackChunkName: "javascriptLibs" */ './javascriptLibs.js').then(libs => { const host: ts.LanguageServiceHost = { getCompilationSettings: () => compilerOptions, getScriptFileNames: () => [currentTextDocument.uri, 'jquery'], diff --git a/extensions/html-language-features/server/src/node/htmlServerNodeMain.ts b/extensions/html-language-features/server/src/node/htmlServerNodeMain.ts index c3262f1e0b05..664596ac0be1 100644 --- a/extensions/html-language-features/server/src/node/htmlServerNodeMain.ts +++ b/extensions/html-language-features/server/src/node/htmlServerNodeMain.ts @@ -16,7 +16,7 @@ async function setupMain() { l10nLog.push(`l10n: Problems loading ${i10lLocation.toString()} : ${e}`); } } - await import('./htmlServerMain'); + await import('./htmlServerMain.js'); l10nLog.forEach(console.log); } setupMain(); diff --git a/extensions/html-language-features/server/src/test/words.test.ts b/extensions/html-language-features/server/src/test/words.test.ts index 7316204db920..ea66e4d6ed82 100644 --- a/extensions/html-language-features/server/src/test/words.test.ts +++ b/extensions/html-language-features/server/src/test/words.test.ts @@ -24,8 +24,8 @@ suite('HTML Language Configuration', () => { value = value.substr(0, offset) + value.substring(offset + 1); const actualRange = words.getWordAtText(value, offset, wordRegex); - assert(actualRange.start <= offset); - assert(actualRange.start + actualRange.length >= offset); + assert.ok(actualRange.start <= offset); + assert.ok(actualRange.start + actualRange.length >= offset); assert.strictEqual(value.substr(actualRange.start, actualRange.length), expected); } diff --git a/extensions/html-language-features/server/tsconfig.json b/extensions/html-language-features/server/tsconfig.json index ae02026a740f..e21408bda972 100644 --- a/extensions/html-language-features/server/tsconfig.json +++ b/extensions/html-language-features/server/tsconfig.json @@ -5,7 +5,8 @@ "lib": [ "ES2020", "WebWorker" - ] + ], + "module": "Node16", }, "include": [ "src/**/*" diff --git a/extensions/json-language-features/client/src/languageParticipants.ts b/extensions/json-language-features/client/src/languageParticipants.ts index 7748d42589bb..e0eb5262985f 100644 --- a/extensions/json-language-features/client/src/languageParticipants.ts +++ b/extensions/json-language-features/client/src/languageParticipants.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { DocumentSelector } from 'vscode-languageclient'; import { Event, EventEmitter, extensions } from 'vscode'; /** @@ -23,7 +22,7 @@ interface LanguageParticipantContribution { export interface LanguageParticipants { readonly onDidChange: Event; - readonly documentSelector: DocumentSelector; + readonly documentSelector: string[]; hasLanguage(languageId: string): boolean; useComments(languageId: string): boolean; dispose(): void; diff --git a/extensions/json-language-features/client/src/languageStatus.ts b/extensions/json-language-features/client/src/languageStatus.ts index e295d72b1170..6f3d7468b2ef 100644 --- a/extensions/json-language-features/client/src/languageStatus.ts +++ b/extensions/json-language-features/client/src/languageStatus.ts @@ -6,10 +6,9 @@ import { window, languages, Uri, Disposable, commands, QuickPickItem, extensions, workspace, Extension, WorkspaceFolder, QuickPickItemKind, - ThemeIcon, TextDocument, LanguageStatusSeverity, l10n + ThemeIcon, TextDocument, LanguageStatusSeverity, l10n, DocumentSelector } from 'vscode'; import { JSONLanguageStatus, JSONSchemaSettings } from './jsonClient'; -import { DocumentSelector } from 'vscode-languageclient'; type ShowSchemasInput = { schemas: string[]; diff --git a/extensions/json-language-features/client/tsconfig.json b/extensions/json-language-features/client/tsconfig.json index 89e6a6c12b7e..cf91914c8743 100644 --- a/extensions/json-language-features/client/tsconfig.json +++ b/extensions/json-language-features/client/tsconfig.json @@ -4,7 +4,8 @@ "outDir": "./out", "lib": [ "webworker" - ] + ], + "module": "Node16", }, "include": [ "src/**/*", diff --git a/extensions/json-language-features/package-lock.json b/extensions/json-language-features/package-lock.json index f3b999cc2234..e3ff4b95de67 100644 --- a/extensions/json-language-features/package-lock.json +++ b/extensions/json-language-features/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@vscode/extension-telemetry": "^0.9.0", "request-light": "^0.8.0", - "vscode-languageclient": "10.0.0-next.8" + "vscode-languageclient": "^10.0.0-next.13" }, "devDependencies": { "@types/node": "20.x" @@ -220,39 +220,39 @@ "dev": true }, "node_modules/vscode-jsonrpc": { - "version": "9.0.0-next.4", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.4.tgz", - "integrity": "sha512-zSVIr58lJSMYKIsZ5P7GtBbv1eEx25eNyOf0NmEzxmn1GhUNJAVAb5hkA1poKUwj1FRMwN6CeyWxZypmr8SsQQ==", + "version": "9.0.0-next.6", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.6.tgz", + "integrity": "sha512-KCSvUNsFiVciG9iqjJKBZOd66CN3ZKohDlYRmoOi+pd8l15MFLZ8wRG4c+wuzePGba/8WcCG2TM+C/GVlvuaeA==", "engines": { "node": ">=14.0.0" } }, "node_modules/vscode-languageclient": { - "version": "10.0.0-next.8", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-10.0.0-next.8.tgz", - "integrity": "sha512-D9inIHgqKayO9Tv0MeLb3XIL76yTuWmKdHqcGZKzjtQrMGJgASJDYWTapu+yAjEpDp0gmVOaCYyIlLB86ncDoQ==", + "version": "10.0.0-next.13", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-10.0.0-next.13.tgz", + "integrity": "sha512-KLsOMJoYpkk36PIgcOjyZ4AekOfzp4kdWdRRbVKeVvSIrwrn/4RSZr0NlD6EvUBBJSsJW4WDrYY7Y3znkqa6+w==", "dependencies": { "minimatch": "^9.0.3", "semver": "^7.6.0", - "vscode-languageserver-protocol": "3.17.6-next.6" + "vscode-languageserver-protocol": "3.17.6-next.11" }, "engines": { - "vscode": "^1.89.0" + "vscode": "^1.91.0" } }, "node_modules/vscode-languageserver-protocol": { - "version": "3.17.6-next.6", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.6.tgz", - "integrity": "sha512-naxM9kc/phpl0kAFNVPejMUWUtzFXdPYY/BtQTYtfbBbHf8sceHOrKkmf6yynZRu1A4oFtRZNqV3wyFRTWqUHw==", + "version": "3.17.6-next.11", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.11.tgz", + "integrity": "sha512-GeJxEp1TiLsp79f8WG5n10wLViXfgFKb99hU9K8m7KDWM95/QFEqWkm79f9LVm54tUK74I91a9EeiQLCS/FABQ==", "dependencies": { - "vscode-jsonrpc": "9.0.0-next.4", - "vscode-languageserver-types": "3.17.6-next.4" + "vscode-jsonrpc": "9.0.0-next.6", + "vscode-languageserver-types": "3.17.6-next.5" } }, "node_modules/vscode-languageserver-types": { - "version": "3.17.6-next.4", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.4.tgz", - "integrity": "sha512-SeJTpH/S14EbxOAVaOUoGVqPToqpRTld5QO5Ghig3AlbFJTFF9Wu7srHMfa85L0SX1RYAuuCSFKJVVCxDIk1/Q==" + "version": "3.17.6-next.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.5.tgz", + "integrity": "sha512-QFmf3Yl1tCgUQfA77N9Me/LXldJXkIVypQbty2rJ1DNHQkC+iwvm4Z2tXg9czSwlhvv0pD4pbF5mT7WhAglolw==" }, "node_modules/yallist": { "version": "4.0.0", diff --git a/extensions/json-language-features/package.json b/extensions/json-language-features/package.json index e19541b76318..cb6bc601e1d9 100644 --- a/extensions/json-language-features/package.json +++ b/extensions/json-language-features/package.json @@ -163,7 +163,7 @@ "dependencies": { "@vscode/extension-telemetry": "^0.9.0", "request-light": "^0.8.0", - "vscode-languageclient": "10.0.0-next.8" + "vscode-languageclient": "^10.0.0-next.13" }, "devDependencies": { "@types/node": "20.x" diff --git a/extensions/json-language-features/server/package-lock.json b/extensions/json-language-features/server/package-lock.json index 1a5e567c9b8f..b4a35d28149c 100644 --- a/extensions/json-language-features/server/package-lock.json +++ b/extensions/json-language-features/server/package-lock.json @@ -13,7 +13,7 @@ "jsonc-parser": "^3.3.1", "request-light": "^0.8.0", "vscode-json-languageservice": "^5.4.1", - "vscode-languageserver": "10.0.0-next.6", + "vscode-languageserver": "^10.0.0-next.11", "vscode-uri": "^3.0.8" }, "bin": { @@ -76,37 +76,37 @@ } }, "node_modules/vscode-jsonrpc": { - "version": "9.0.0-next.4", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.4.tgz", - "integrity": "sha512-zSVIr58lJSMYKIsZ5P7GtBbv1eEx25eNyOf0NmEzxmn1GhUNJAVAb5hkA1poKUwj1FRMwN6CeyWxZypmr8SsQQ==", + "version": "9.0.0-next.6", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.6.tgz", + "integrity": "sha512-KCSvUNsFiVciG9iqjJKBZOd66CN3ZKohDlYRmoOi+pd8l15MFLZ8wRG4c+wuzePGba/8WcCG2TM+C/GVlvuaeA==", "engines": { "node": ">=14.0.0" } }, "node_modules/vscode-languageserver": { - "version": "10.0.0-next.6", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-10.0.0-next.6.tgz", - "integrity": "sha512-0Lh1nhQfSxo5Ob+ayYO1QTIsDix2/Lc72Urm1KZrCFxK5zIFYaEh3QFeM9oZih4Rzs0ZkQPXXnoHtpvs5GT+Zw==", + "version": "10.0.0-next.11", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-10.0.0-next.11.tgz", + "integrity": "sha512-cmobSrVDYhlh/t02vz/bV8nNpds8mus5HnILULae2iAvOjoaJPnTAp0jJWoYdUqTpIVzT9JV6JMKqLEvdqpeqg==", "dependencies": { - "vscode-languageserver-protocol": "3.17.6-next.6" + "vscode-languageserver-protocol": "3.17.6-next.11" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "node_modules/vscode-languageserver-protocol": { - "version": "3.17.6-next.6", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.6.tgz", - "integrity": "sha512-naxM9kc/phpl0kAFNVPejMUWUtzFXdPYY/BtQTYtfbBbHf8sceHOrKkmf6yynZRu1A4oFtRZNqV3wyFRTWqUHw==", + "version": "3.17.6-next.11", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.11.tgz", + "integrity": "sha512-GeJxEp1TiLsp79f8WG5n10wLViXfgFKb99hU9K8m7KDWM95/QFEqWkm79f9LVm54tUK74I91a9EeiQLCS/FABQ==", "dependencies": { - "vscode-jsonrpc": "9.0.0-next.4", - "vscode-languageserver-types": "3.17.6-next.4" + "vscode-jsonrpc": "9.0.0-next.6", + "vscode-languageserver-types": "3.17.6-next.5" } }, "node_modules/vscode-languageserver-protocol/node_modules/vscode-languageserver-types": { - "version": "3.17.6-next.4", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.4.tgz", - "integrity": "sha512-SeJTpH/S14EbxOAVaOUoGVqPToqpRTld5QO5Ghig3AlbFJTFF9Wu7srHMfa85L0SX1RYAuuCSFKJVVCxDIk1/Q==" + "version": "3.17.6-next.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.5.tgz", + "integrity": "sha512-QFmf3Yl1tCgUQfA77N9Me/LXldJXkIVypQbty2rJ1DNHQkC+iwvm4Z2tXg9czSwlhvv0pD4pbF5mT7WhAglolw==" }, "node_modules/vscode-languageserver-textdocument": { "version": "1.0.12", diff --git a/extensions/json-language-features/server/package.json b/extensions/json-language-features/server/package.json index 48a6547f1d4d..5560cf7c660b 100644 --- a/extensions/json-language-features/server/package.json +++ b/extensions/json-language-features/server/package.json @@ -16,7 +16,7 @@ "jsonc-parser": "^3.3.1", "request-light": "^0.8.0", "vscode-json-languageservice": "^5.4.1", - "vscode-languageserver": "10.0.0-next.6", + "vscode-languageserver": "^10.0.0-next.11", "vscode-uri": "^3.0.8" }, "devDependencies": { diff --git a/extensions/json-language-features/server/src/browser/jsonServerWorkerMain.ts b/extensions/json-language-features/server/src/browser/jsonServerWorkerMain.ts index bf1687d672ea..dd991a3c1569 100644 --- a/extensions/json-language-features/server/src/browser/jsonServerWorkerMain.ts +++ b/extensions/json-language-features/server/src/browser/jsonServerWorkerMain.ts @@ -22,7 +22,7 @@ const messageHandler = async (e: any) => { } else { l10nLog.push(`l10n: No bundle configured.`); } - await import('./jsonServerMain'); + await import('./jsonServerMain.js'); if (self.onmessage !== messageHandler) { pendingMessages.forEach(msg => self.onmessage?.(msg)); pendingMessages.length = 0; diff --git a/extensions/json-language-features/server/src/node/jsonServerNodeMain.ts b/extensions/json-language-features/server/src/node/jsonServerNodeMain.ts index 52f048b63406..c30873e5b0e1 100644 --- a/extensions/json-language-features/server/src/node/jsonServerNodeMain.ts +++ b/extensions/json-language-features/server/src/node/jsonServerNodeMain.ts @@ -16,7 +16,7 @@ async function setupMain() { l10nLog.push(`l10n: Problems loading ${i10lLocation.toString()} : ${e}`); } } - await import('./jsonServerMain'); + await import('./jsonServerMain.js'); l10nLog.forEach(console.log); } setupMain(); diff --git a/extensions/json-language-features/server/tsconfig.json b/extensions/json-language-features/server/tsconfig.json index 2e8a6e0e3540..7526099651f8 100644 --- a/extensions/json-language-features/server/tsconfig.json +++ b/extensions/json-language-features/server/tsconfig.json @@ -7,7 +7,8 @@ "lib": [ "ES2020", "WebWorker" - ] + ], + "module": "Node16", }, "include": [ "src/**/*" diff --git a/extensions/shared.webpack.config.js b/extensions/shared.webpack.config.js index 6e5b9fd95acc..279bc199bc4a 100644 --- a/extensions/shared.webpack.config.js +++ b/extensions/shared.webpack.config.js @@ -32,7 +32,11 @@ function withNodeDefaults(/**@type WebpackConfig & { context: string }*/extConfi resolve: { conditionNames: ['import', 'require', 'node-addons', 'node'], mainFields: ['module', 'main'], - extensions: ['.ts', '.js'] // support ts-files and js-files + extensions: ['.ts', '.js'], // support ts-files and js-files + extensionAlias: { + // this is needed to resolve dynamic imports that now require the .js extension + '.js': ['.js', '.ts'], + } }, module: { rules: [{ @@ -110,7 +114,11 @@ function withBrowserDefaults(/**@type WebpackConfig & { context: string }*/extCo 'path': require.resolve('path-browserify'), 'os': require.resolve('os-browserify'), 'util': require.resolve('util') - } + }, + extensionAlias: { + // this is needed to resolve dynamic imports that now require the .js extension + '.js': ['.js', '.ts'], + }, }, module: { rules: [{ @@ -123,7 +131,7 @@ function withBrowserDefaults(/**@type WebpackConfig & { context: string }*/extCo loader: 'ts-loader', options: { ...tsLoaderOptions, - ...(additionalOptions ? {} : { configFile: additionalOptions.configFile }), + // ...(additionalOptions ? {} : { configFile: additionalOptions.configFile }), } }, { diff --git a/package-lock.json b/package-lock.json index a02da2958b1f..0770fcbad181 100644 --- a/package-lock.json +++ b/package-lock.json @@ -150,7 +150,7 @@ "source-map": "0.6.1", "source-map-support": "^0.3.2", "style-loader": "^3.3.2", - "ts-loader": "^9.4.2", + "ts-loader": "^9.5.1", "ts-node": "^10.9.1", "tsec": "0.2.7", "tslib": "^2.6.3", @@ -17412,15 +17412,16 @@ } }, "node_modules/ts-loader": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", - "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", "dev": true, "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", "micromatch": "^4.0.0", - "semver": "^7.3.4" + "semver": "^7.3.4", + "source-map": "^0.7.4" }, "engines": { "node": ">=12.0.0" @@ -17430,6 +17431,15 @@ "webpack": "^5.0.0" } }, + "node_modules/ts-loader/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/ts-morph": { "version": "19.0.0", "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-19.0.0.tgz", diff --git a/package.json b/package.json index c3924ca14417..b9d34543ce2e 100644 --- a/package.json +++ b/package.json @@ -208,7 +208,7 @@ "source-map": "0.6.1", "source-map-support": "^0.3.2", "style-loader": "^3.3.2", - "ts-loader": "^9.4.2", + "ts-loader": "^9.5.1", "ts-node": "^10.9.1", "tsec": "0.2.7", "tslib": "^2.6.3", From 289056d9765ba233e6cf7698a13f231d850fe631 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Thu, 3 Oct 2024 13:58:27 +0200 Subject: [PATCH 3/5] Git Editor - create document link provider (#230389) --- extensions/git/src/gitEditor.ts | 52 ++++++++++++++++++++++++++++++++- extensions/git/src/main.ts | 7 +++-- 2 files changed, 56 insertions(+), 3 deletions(-) diff --git a/extensions/git/src/gitEditor.ts b/extensions/git/src/gitEditor.ts index f5701642084a..6291e5152a72 100644 --- a/extensions/git/src/gitEditor.ts +++ b/extensions/git/src/gitEditor.ts @@ -3,10 +3,12 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as path from 'path'; -import { TabInputText, Uri, window, workspace } from 'vscode'; +import { CancellationToken, DocumentLink, DocumentLinkProvider, l10n, Range, TabInputText, TextDocument, Uri, window, workspace } from 'vscode'; import { IIPCHandler, IIPCServer } from './ipc/ipcServer'; import { ITerminalEnvironmentProvider } from './terminal'; import { EmptyDisposable, IDisposable } from './util'; +import { Model } from './model'; +import { Repository } from './repository'; interface GitEditorRequest { commitMessagePath?: string; @@ -63,3 +65,51 @@ export class GitEditor implements IIPCHandler, ITerminalEnvironmentProvider { this.disposable.dispose(); } } + +export class GitEditorDocumentLinkProvider implements DocumentLinkProvider { + private readonly _regex = /^#\s+(modified|new file|deleted|renamed|copied|type change):\s+(?.*?)(?:\s+->\s+(?.*))*$/gm; + + constructor(private readonly _model: Model) { } + + provideDocumentLinks(document: TextDocument, token: CancellationToken): DocumentLink[] { + if (token.isCancellationRequested) { + return []; + } + + const repository = this._model.getRepository(document.uri); + if (!repository) { + return []; + } + + const links: DocumentLink[] = []; + for (const match of document.getText().matchAll(this._regex)) { + if (!match.groups) { + continue; + } + + const { file1, file2 } = match.groups; + + if (file1) { + links.push(this._createDocumentLink(repository, document, match, file1)); + } + if (file2) { + links.push(this._createDocumentLink(repository, document, match, file2)); + } + } + + return links; + } + + private _createDocumentLink(repository: Repository, document: TextDocument, match: RegExpExecArray, file: string): DocumentLink { + const startIndex = match[0].indexOf(file); + const startPosition = document.positionAt(match.index + startIndex); + const endPosition = document.positionAt(match.index + startIndex + file.length); + + const documentLink = new DocumentLink( + new Range(startPosition, endPosition), + Uri.file(path.join(repository.root, file))); + documentLink.tooltip = l10n.t('Open File'); + + return documentLink; + } +} diff --git a/extensions/git/src/main.ts b/extensions/git/src/main.ts index aa4d98adc8b9..25772be7ea75 100644 --- a/extensions/git/src/main.ts +++ b/extensions/git/src/main.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { env, ExtensionContext, workspace, window, Disposable, commands, Uri, version as vscodeVersion, WorkspaceFolder, LogOutputChannel, l10n, LogLevel } from 'vscode'; +import { env, ExtensionContext, workspace, window, Disposable, commands, Uri, version as vscodeVersion, WorkspaceFolder, LogOutputChannel, l10n, LogLevel, languages } from 'vscode'; import { findGit, Git, IGit } from './git'; import { Model } from './model'; import { CommandCenter } from './commands'; @@ -22,7 +22,7 @@ import { GitTimelineProvider } from './timelineProvider'; import { registerAPICommands } from './api/api1'; import { TerminalEnvironmentManager, TerminalShellExecutionManager } from './terminal'; import { createIPCServer, IPCServer } from './ipc/ipcServer'; -import { GitEditor } from './gitEditor'; +import { GitEditor, GitEditorDocumentLinkProvider } from './gitEditor'; import { GitPostCommitCommandsProvider } from './postCommitCommands'; import { GitEditSessionIdentityProvider } from './editSessionIdentityProvider'; import { GitCommitInputBoxCodeActionsProvider, GitCommitInputBoxDiagnosticsManager } from './diagnostics'; @@ -126,6 +126,9 @@ async function createModel(context: ExtensionContext, logger: LogOutputChannel, const codeActionsProvider = new GitCommitInputBoxCodeActionsProvider(diagnosticsManager); disposables.push(codeActionsProvider); + const gitEditorDocumentLinkProvider = languages.registerDocumentLinkProvider('git-commit', new GitEditorDocumentLinkProvider(model)); + disposables.push(gitEditorDocumentLinkProvider); + checkGitVersion(info); commands.executeCommand('setContext', 'gitVersion2.35', git.compareGitVersionTo('2.35') >= 0); From 5bbf4919cd444d3519c7b7f0e3dff61a5d9fe54f Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 3 Oct 2024 05:13:44 -0700 Subject: [PATCH 4/5] Don't throw when terminal is disposed before xterm is created Fixes #230237 --- .../terminal/browser/terminalInstance.ts | 40 ++++++++++++++----- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index 6b5872811f74..c8604bed74ba 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -13,7 +13,7 @@ import { DomScrollableElement } from '../../../../base/browser/ui/scrollbar/scro import { AutoOpenBarrier, Barrier, Promises, disposableTimeout, timeout } from '../../../../base/common/async.js'; import { Codicon } from '../../../../base/common/codicons.js'; import { debounce } from '../../../../base/common/decorators.js'; -import { ErrorNoTelemetry, onUnexpectedError } from '../../../../base/common/errors.js'; +import { onUnexpectedError } from '../../../../base/common/errors.js'; import { Emitter, Event } from '../../../../base/common/event.js'; import { KeyCode } from '../../../../base/common/keyCodes.js'; import { ISeparator, template } from '../../../../base/common/labels.js'; @@ -133,7 +133,13 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { private readonly _processManager: ITerminalProcessManager; private readonly _contributions: Map = new Map(); private readonly _resource: URI; - private _xtermReadyPromise: Promise; + + /** + * Resolves when xterm.js is ready, this will be undefined if the terminal instance is disposed + * before xterm.js could be created. + */ + private _xtermReadyPromise: Promise; + private _pressAnyKeyToCloseListener: IDisposable | undefined; private _instanceId: number; private _latestXtermWriteData: number = 0; @@ -347,7 +353,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { readonly onDidChangeVisibility = this._onDidChangeVisibility.event; private readonly _onLineData = this._register(new Emitter({ - onDidAddFirstListener: async () => (this.xterm ?? await this._xtermReadyPromise).raw.loadAddon(this._lineDataEventAddon!) + onDidAddFirstListener: async () => (this.xterm ?? await this._xtermReadyPromise)?.raw.loadAddon(this._lineDataEventAddon!) })); readonly onLineData = this._onLineData.event; @@ -584,7 +590,9 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { onUnexpectedError(err); } this._xtermReadyPromise.then(xterm => { - contribution.xtermReady?.(xterm); + if (xterm) { + contribution.xtermReady?.(xterm); + } }); this._register(this.onDisposed(() => { contribution.dispose(); @@ -620,6 +628,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { if (this.shellLaunchConfig?.attachPersistentProcess?.color) { return this.shellLaunchConfig.attachPersistentProcess.color; } + if (this._processManager.processState >= ProcessState.Launching) { return undefined; } @@ -729,10 +738,10 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { /** * Create xterm.js instance and attach data listeners. */ - protected async _createXterm(): Promise { + protected async _createXterm(): Promise { const Terminal = await TerminalInstance.getXtermConstructor(this._keybindingService, this._contextKeyService); if (this.isDisposed) { - throw new ErrorNoTelemetry('Terminal disposed of during xterm.js creation'); + return undefined; } const disableShellIntegrationReporting = (this.shellLaunchConfig.executable === undefined || this.shellType === undefined) || !shellIntegrationSupportedShellTypes.includes(this.shellType); @@ -937,7 +946,11 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { // Fire xtermOpen on all contributions for (const contribution of this._contributions.values()) { if (!this.xterm) { - this._xtermReadyPromise.then(xterm => contribution.xtermOpen?.(xterm)); + this._xtermReadyPromise.then(xterm => { + if (xterm) { + contribution.xtermOpen?.(xterm); + } + }); } else { contribution.xtermOpen?.(this.xterm); } @@ -1342,7 +1355,9 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { // _xtermReadyPromise is ready constructed since this is called from the ctor setTimeout(() => { this._xtermReadyPromise.then(xterm => { - this._messageTitleDisposable.value = xterm.raw.onTitleChange(e => this._onTitleChange(e)); + if (xterm) { + this._messageTitleDisposable.value = xterm.raw.onTitleChange(e => this._onTitleChange(e)); + } }); }); this._setTitle(this._shellLaunchConfig.executable, TitleEventSource.Process); @@ -1535,6 +1550,9 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { const waitOnExit = this.waitOnExit; if (waitOnExit && this._processManager.processState !== ProcessState.KilledByUser) { this._xtermReadyPromise.then(xterm => { + if (!xterm) { + return; + } if (exitMessage) { xterm.raw.write(formatMessageForTerminal(exitMessage)); } @@ -1795,7 +1813,11 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { // Layout all contributions for (const contribution of this._contributions.values()) { if (!this.xterm) { - this._xtermReadyPromise.then(xterm => contribution.layout?.(xterm, dimension)); + this._xtermReadyPromise.then(xterm => { + if (xterm) { + contribution.layout?.(xterm, dimension); + } + }); } else { contribution.layout?.(this.xterm, dimension); } From 62bd82385e2c658db15fac6bc04b9edfa54526d1 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 3 Oct 2024 05:20:50 -0700 Subject: [PATCH 5/5] Don't instantiate addons if terminal is disposed Fixes #230246 --- .../workbench/contrib/terminal/browser/terminalInstance.ts | 7 ++++++- .../contrib/terminal/browser/xterm/xtermTerminal.ts | 6 ++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index 6b5872811f74..64593ae1249b 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -905,7 +905,12 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { this.xterm?.refresh(); - setTimeout(() => this._initDragAndDrop(container)); + setTimeout(() => { + if (this._store.isDisposed) { + return; + } + this._initDragAndDrop(container); + }, 0); } /** diff --git a/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts b/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts index c7415250eb58..3b5a8c644df1 100644 --- a/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts @@ -266,6 +266,9 @@ export class XtermTerminal extends Disposable implements IXtermTerminal, IDetach this._shellIntegrationAddon = new ShellIntegrationAddon(options.shellIntegrationNonce ?? '', options.disableShellIntegrationReporting, this._telemetryService, this._logService); this.raw.loadAddon(this._shellIntegrationAddon); this._xtermAddonLoader.importAddon('clipboard').then(ClipboardAddon => { + if (this._store.isDisposed) { + return; + } this._clipboardAddon = this._instantiationService.createInstance(ClipboardAddon, undefined, { async readText(type: ClipboardSelectionType): Promise { return _clipboardService.readText(type === 'p' ? 'selection' : 'clipboard'); @@ -470,6 +473,9 @@ export class XtermTerminal extends Disposable implements IXtermTerminal, IDetach private _getSearchAddon(): Promise { if (!this._searchAddonPromise) { this._searchAddonPromise = this._xtermAddonLoader.importAddon('search').then((AddonCtor) => { + if (this._store.isDisposed) { + return Promise.reject('Could not create search addon, terminal is disposed'); + } this._searchAddon = new AddonCtor({ highlightLimit: XtermTerminalConstants.SearchHighlightLimit }); this.raw.loadAddon(this._searchAddon); this._searchAddon.onDidChangeResults((results: { resultIndex: number; resultCount: number }) => {