Merge branch 'main' into tyriar/a11y_contrib_cleanup__contrib_cleanup

This commit is contained in:
Daniel Imms
2024-10-03 06:55:23 -07:00
committed by GitHub
43 changed files with 353 additions and 227 deletions
+1 -1
View File
@@ -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 => {
+1 -1
View File
@@ -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;
}
@@ -4,7 +4,8 @@
"outDir": "./out",
"lib": [
"webworker"
]
],
"module": "Node16",
},
"include": [
"src/**/*",
+17 -17
View File
@@ -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",
@@ -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": {
+16 -16
View File
@@ -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",
@@ -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": {
@@ -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;
@@ -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();
@@ -5,7 +5,8 @@
"lib": [
"ES2020",
"WebWorker"
]
],
"module": "Node16",
},
"include": [
"src/**/*"
+51 -1
View File
@@ -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+(?<file1>.*?)(?:\s+->\s+(?<file2>.*))*$/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;
}
}
+5 -2
View File
@@ -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);
@@ -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<void>;
readonly documentSelector: DocumentSelector;
readonly documentSelector: string[];
hasLanguage(languageId: string): boolean;
useAutoInsert(languageId: string): boolean;
dispose(): void;
@@ -4,7 +4,8 @@
"outDir": "./out",
"lib": [
"webworker"
]
],
"module": "Node16",
},
"include": [
"src/**/*",
+17 -17
View File
@@ -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",
@@ -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": {
@@ -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'),
+16 -16
View File
@@ -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",
@@ -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"
},
@@ -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;
@@ -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'],
@@ -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();
@@ -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);
}
@@ -5,7 +5,8 @@
"lib": [
"ES2020",
"WebWorker"
]
],
"module": "Node16",
},
"include": [
"src/**/*"
@@ -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<void>;
readonly documentSelector: DocumentSelector;
readonly documentSelector: string[];
hasLanguage(languageId: string): boolean;
useComments(languageId: string): boolean;
dispose(): void;
@@ -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[];
@@ -4,7 +4,8 @@
"outDir": "./out",
"lib": [
"webworker"
]
],
"module": "Node16",
},
"include": [
"src/**/*",
+17 -17
View File
@@ -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",
@@ -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"
+16 -16
View File
@@ -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",
@@ -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": {
@@ -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;
@@ -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();
@@ -7,7 +7,8 @@
"lib": [
"ES2020",
"WebWorker"
]
],
"module": "Node16",
},
"include": [
"src/**/*"
+11 -3
View File
@@ -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 }),
}
},
{
+15 -5
View File
@@ -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",
+1 -1
View File
@@ -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",
@@ -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 {
@@ -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<boolean>();
readonly onDidChangeState: Event<boolean> = this._onDidChangeState.event;
constructor(
container: HTMLElement,
private checkboxStateHandler: CheckboxStateHandler,
private readonly checkboxStateHandler: CheckboxStateHandler,
private readonly hoverDelegate: IHoverDelegate,
private readonly hoverService: IHoverService
) {
@@ -971,7 +971,11 @@ abstract class AbstractTreeView extends Disposable implements ITreeView {
return 0;
}
async refresh(elements?: readonly ITreeItem[]): Promise<void> {
private updateCheckboxes(elements: readonly ITreeItem[]): ITreeItem[] {
return setCascadingCheckboxUpdates(elements);
}
async refresh(elements?: readonly ITreeItem[], checkboxes?: readonly ITreeItem[]): Promise<void> {
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<string> = new Set<string>();
@@ -1383,8 +1388,7 @@ class TreeRenderer extends Disposable implements ITreeRenderer<ITreeItem, FuzzyS
templateData.checkbox = checkbox;
}
templateData.checkbox.render(node);
}
else if (templateData.checkbox) {
} else if (templateData.checkbox) {
templateData.checkbox.dispose();
templateData.checkbox = undefined;
}
@@ -1449,69 +1453,19 @@ class TreeRenderer extends Disposable implements ITreeRenderer<ITreeItem, FuzzyS
}
private updateCheckboxes(items: ITreeItem[]) {
const additionalItems: ITreeItem[] = [];
let allItems: ITreeItem[] = [];
if (!this.manuallyManageCheckboxes()) {
for (const item of items) {
if (item.checkbox !== undefined) {
function 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<ITreeItem> = 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<ITreeItem, FuzzyScore>, index: number, templateData: ITreeExplorerTemplateData): void {
@@ -1995,3 +1949,61 @@ export class CustomTreeViewDragAndDrop implements ITreeDragAndDrop<ITreeItem> {
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<ITreeItem> = 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);
}
+2 -1
View File
@@ -657,7 +657,8 @@ export interface ITreeView extends IDisposable {
readonly container: any | undefined;
refresh(treeItems?: readonly ITreeItem[]): Promise<void>;
// checkboxesChanged is a subset of treeItems
refresh(treeItems?: readonly ITreeItem[], checkboxesChanged?: readonly ITreeItem[]): Promise<void>;
setVisibility(visible: boolean): void;
@@ -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<string, ITerminalContribution> = new Map();
private readonly _resource: URI;
private _xtermReadyPromise: Promise<XtermTerminal>;
/**
* 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<XtermTerminal | undefined>;
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<string>({
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<XtermTerminal> {
protected async _createXterm(): Promise<XtermTerminal | undefined> {
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);
@@ -905,7 +914,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);
}
/**
@@ -937,7 +951,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 +1360,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 +1555,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 +1818,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);
}
@@ -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<string> {
return _clipboardService.readText(type === 'p' ? 'selection' : 'clipboard');
@@ -470,6 +473,9 @@ export class XtermTerminal extends Disposable implements IXtermTerminal, IDetach
private _getSearchAddon(): Promise<SearchAddonType> {
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 }) => {