mirror of
https://github.com/Microsoft/vscode
synced 2024-10-06 03:17:00 +00:00
Merge remote-tracking branch 'origin' into electron-18.x.y
This commit is contained in:
commit
17aee6520d
|
@ -994,7 +994,7 @@
|
|||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"vscode-languageclient": "^8.0.1",
|
||||
"vscode-languageclient": "^8.0.2-next.4",
|
||||
"vscode-nls": "^5.0.0",
|
||||
"vscode-uri": "^3.0.3"
|
||||
},
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
"browser": "./dist/browser/cssServerMain",
|
||||
"dependencies": {
|
||||
"vscode-css-languageservice": "^6.0.1",
|
||||
"vscode-languageserver": "^8.0.1",
|
||||
"vscode-languageserver": "^8.0.2-next.4",
|
||||
"vscode-uri": "^3.0.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
|
|
@ -22,35 +22,40 @@ vscode-css-languageservice@^6.0.1:
|
|||
vscode-nls "^5.0.1"
|
||||
vscode-uri "^3.0.3"
|
||||
|
||||
vscode-jsonrpc@8.0.1:
|
||||
version "8.0.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.1.tgz#f30b0625ebafa0fb3bc53e934ca47b706445e57e"
|
||||
integrity sha512-N/WKvghIajmEvXpatSzvTvOIz61ZSmOSa4BRA4pTLi+1+jozquQKP/MkaylP9iB68k73Oua1feLQvH3xQuigiQ==
|
||||
vscode-jsonrpc@8.0.2-next.1:
|
||||
version "8.0.2-next.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2-next.1.tgz#6bdc39fd194782032e34047eeefce562941259c6"
|
||||
integrity sha512-sbbvGSWja7NVBLHPGawtgezc8DHYJaP4qfr/AaJiyDapWcSFtHyPtm18+LnYMLTmB7bhOUW/lf5PeeuLpP6bKA==
|
||||
|
||||
vscode-languageserver-protocol@3.17.1:
|
||||
version "3.17.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.1.tgz#e801762c304f740208b6c804a0cf21f2c87509ed"
|
||||
integrity sha512-BNlAYgQoYwlSgDLJhSG+DeA8G1JyECqRzM2YO6tMmMji3Ad9Mw6AW7vnZMti90qlAKb0LqAlJfSVGEdqMMNzKg==
|
||||
vscode-languageserver-protocol@3.17.2-next.5:
|
||||
version "3.17.2-next.5"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2-next.5.tgz#9bc747411c3ce9e1d73c2714bf6555e0199eec26"
|
||||
integrity sha512-UlH+QL4Q4lX94of/UPDDwwWIkd8w7dtMW4khzvEDUoykiG9tba0iG6V0bAiv8XVpnBIUYjL2FNFiL3zl+TY1Sw==
|
||||
dependencies:
|
||||
vscode-jsonrpc "8.0.1"
|
||||
vscode-languageserver-types "3.17.1"
|
||||
vscode-jsonrpc "8.0.2-next.1"
|
||||
vscode-languageserver-types "3.17.2-next.2"
|
||||
|
||||
vscode-languageserver-textdocument@^1.0.4:
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.4.tgz#3cd56dd14cec1d09e86c4bb04b09a246cb3df157"
|
||||
integrity sha512-/xhqXP/2A2RSs+J8JNXpiiNVvvNM0oTosNVmQnunlKvq9o4mupHOBAnnzH0lwIPKazXKvAKsVp1kr+H/K4lgoQ==
|
||||
|
||||
vscode-languageserver-types@3.17.1, vscode-languageserver-types@^3.17.1:
|
||||
vscode-languageserver-types@3.17.2-next.2:
|
||||
version "3.17.2-next.2"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2-next.2.tgz#af5d6978eee7682aab87c1419323f5b141ac6596"
|
||||
integrity sha512-TiAkLABgqkVWdAlC3XlOfdhdjIAdVU4YntPUm9kKGbXr+MGwpVnKz2KZMNBcvG0CFx8Hi8qliL0iq+ndPB720w==
|
||||
|
||||
vscode-languageserver-types@^3.17.1:
|
||||
version "3.17.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.1.tgz#c2d87fa7784f8cac389deb3ff1e2d9a7bef07e16"
|
||||
integrity sha512-K3HqVRPElLZVVPtMeKlsyL9aK0GxGQpvtAUTfX4k7+iJ4mc1M+JM+zQwkgGy2LzY0f0IAafe8MKqIkJrxfGGjQ==
|
||||
|
||||
vscode-languageserver@^8.0.1:
|
||||
version "8.0.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-8.0.1.tgz#56bd7a01f5c88af075a77f1d220edcb30fc4bdc7"
|
||||
integrity sha512-sn7SjBwWm3OlmLtgg7jbM0wBULppyL60rj8K5HF0ny/MzN+GzPBX1kCvYdybhl7UW63V5V5tRVnyB8iwC73lSQ==
|
||||
vscode-languageserver@^8.0.2-next.4:
|
||||
version "8.0.2-next.4"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-8.0.2-next.4.tgz#c10cc95be06325b56b7ec1d10271c9e4adf3ef07"
|
||||
integrity sha512-B3roWH4TmJiB6Zh5+r7zu0QdlLqJsPdGo0LeEi6OiLfrHYCDlcI7DNcQ7F17vWmxC3C82SrxMt/EuLBMpKQM0A==
|
||||
dependencies:
|
||||
vscode-languageserver-protocol "3.17.1"
|
||||
vscode-languageserver-protocol "3.17.2-next.5"
|
||||
|
||||
vscode-nls@^5.0.1:
|
||||
version "5.0.1"
|
||||
|
|
|
@ -46,32 +46,32 @@ semver@^7.3.5:
|
|||
dependencies:
|
||||
lru-cache "^6.0.0"
|
||||
|
||||
vscode-jsonrpc@8.0.1:
|
||||
version "8.0.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.1.tgz#f30b0625ebafa0fb3bc53e934ca47b706445e57e"
|
||||
integrity sha512-N/WKvghIajmEvXpatSzvTvOIz61ZSmOSa4BRA4pTLi+1+jozquQKP/MkaylP9iB68k73Oua1feLQvH3xQuigiQ==
|
||||
vscode-jsonrpc@8.0.2-next.1:
|
||||
version "8.0.2-next.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2-next.1.tgz#6bdc39fd194782032e34047eeefce562941259c6"
|
||||
integrity sha512-sbbvGSWja7NVBLHPGawtgezc8DHYJaP4qfr/AaJiyDapWcSFtHyPtm18+LnYMLTmB7bhOUW/lf5PeeuLpP6bKA==
|
||||
|
||||
vscode-languageclient@^8.0.1:
|
||||
version "8.0.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-8.0.1.tgz#bf5535c4463a78daeaca0bcb4f5868aec86bb301"
|
||||
integrity sha512-9XoE+HJfaWvu7Y75H3VmLo5WLCtsbxEgEhrLPqwt7eyoR49lUIyyrjb98Yfa50JCMqF2cePJAEVI6oe2o1sIhw==
|
||||
vscode-languageclient@^8.0.2-next.4:
|
||||
version "8.0.2-next.4"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-8.0.2-next.4.tgz#87dd364ffbd4356aff3af14e7b557d9fe34d2b67"
|
||||
integrity sha512-j9BEiCYMN9IoKwYdk9iickV6WNPVGPoVO11SMdoxFnWPIT3y5UAe3qf/WsfA9OdklAIaxxYasfgyKCpBjSPNuw==
|
||||
dependencies:
|
||||
minimatch "^3.0.4"
|
||||
semver "^7.3.5"
|
||||
vscode-languageserver-protocol "3.17.1"
|
||||
vscode-languageserver-protocol "3.17.2-next.5"
|
||||
|
||||
vscode-languageserver-protocol@3.17.1:
|
||||
version "3.17.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.1.tgz#e801762c304f740208b6c804a0cf21f2c87509ed"
|
||||
integrity sha512-BNlAYgQoYwlSgDLJhSG+DeA8G1JyECqRzM2YO6tMmMji3Ad9Mw6AW7vnZMti90qlAKb0LqAlJfSVGEdqMMNzKg==
|
||||
vscode-languageserver-protocol@3.17.2-next.5:
|
||||
version "3.17.2-next.5"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2-next.5.tgz#9bc747411c3ce9e1d73c2714bf6555e0199eec26"
|
||||
integrity sha512-UlH+QL4Q4lX94of/UPDDwwWIkd8w7dtMW4khzvEDUoykiG9tba0iG6V0bAiv8XVpnBIUYjL2FNFiL3zl+TY1Sw==
|
||||
dependencies:
|
||||
vscode-jsonrpc "8.0.1"
|
||||
vscode-languageserver-types "3.17.1"
|
||||
vscode-jsonrpc "8.0.2-next.1"
|
||||
vscode-languageserver-types "3.17.2-next.2"
|
||||
|
||||
vscode-languageserver-types@3.17.1:
|
||||
version "3.17.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.1.tgz#c2d87fa7784f8cac389deb3ff1e2d9a7bef07e16"
|
||||
integrity sha512-K3HqVRPElLZVVPtMeKlsyL9aK0GxGQpvtAUTfX4k7+iJ4mc1M+JM+zQwkgGy2LzY0f0IAafe8MKqIkJrxfGGjQ==
|
||||
vscode-languageserver-types@3.17.2-next.2:
|
||||
version "3.17.2-next.2"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2-next.2.tgz#af5d6978eee7682aab87c1419323f5b141ac6596"
|
||||
integrity sha512-TiAkLABgqkVWdAlC3XlOfdhdjIAdVU4YntPUm9kKGbXr+MGwpVnKz2KZMNBcvG0CFx8Hi8qliL0iq+ndPB720w==
|
||||
|
||||
vscode-nls@^5.0.0:
|
||||
version "5.0.0"
|
||||
|
|
|
@ -1249,17 +1249,17 @@
|
|||
},
|
||||
{
|
||||
"command": "git.revealFileInOS.linux",
|
||||
"when": "scmProvider == git && scmResourceGroup == merge && resourceScheme == file && isLinux",
|
||||
"when": "scmProvider == git && scmResourceGroup == merge && remoteName == '' && isLinux",
|
||||
"group": "2_view@2"
|
||||
},
|
||||
{
|
||||
"command": "git.revealFileInOS.mac",
|
||||
"when": "scmProvider == git && scmResourceGroup == merge && resourceScheme == file && isMac",
|
||||
"when": "scmProvider == git && scmResourceGroup == merge && remoteName == '' && isMac",
|
||||
"group": "2_view@2"
|
||||
},
|
||||
{
|
||||
"command": "git.revealFileInOS.windows",
|
||||
"when": "scmProvider == git && scmResourceGroup == merge && resourceScheme == file && isWindows",
|
||||
"when": "scmProvider == git && scmResourceGroup == merge && remoteName == '' && isWindows",
|
||||
"group": "2_view@2"
|
||||
},
|
||||
{
|
||||
|
@ -1304,17 +1304,17 @@
|
|||
},
|
||||
{
|
||||
"command": "git.revealFileInOS.linux",
|
||||
"when": "scmProvider == git && scmResourceGroup == index && resourceScheme == file && isLinux",
|
||||
"when": "scmProvider == git && scmResourceGroup == index && remoteName == '' && isLinux",
|
||||
"group": "2_view@2"
|
||||
},
|
||||
{
|
||||
"command": "git.revealFileInOS.mac",
|
||||
"when": "scmProvider == git && scmResourceGroup == index && resourceScheme == file && isMac",
|
||||
"when": "scmProvider == git && scmResourceGroup == index && remoteName == '' && isMac",
|
||||
"group": "2_view@2"
|
||||
},
|
||||
{
|
||||
"command": "git.revealFileInOS.windows",
|
||||
"when": "scmProvider == git && scmResourceGroup == index && resourceScheme == file && isWindows",
|
||||
"when": "scmProvider == git && scmResourceGroup == index && remoteName == '' && isWindows",
|
||||
"group": "2_view@2"
|
||||
},
|
||||
{
|
||||
|
@ -1384,17 +1384,17 @@
|
|||
},
|
||||
{
|
||||
"command": "git.revealFileInOS.linux",
|
||||
"when": "scmProvider == git && scmResourceGroup == workingTree && resourceScheme == file && isLinux",
|
||||
"when": "scmProvider == git && scmResourceGroup == workingTree && remoteName == '' && isLinux",
|
||||
"group": "2_view@2"
|
||||
},
|
||||
{
|
||||
"command": "git.revealFileInOS.mac",
|
||||
"when": "scmProvider == git && scmResourceGroup == workingTree && resourceScheme == file && isMac",
|
||||
"when": "scmProvider == git && scmResourceGroup == workingTree && remoteName == '' && isMac",
|
||||
"group": "2_view@2"
|
||||
},
|
||||
{
|
||||
"command": "git.revealFileInOS.windows",
|
||||
"when": "scmProvider == git && scmResourceGroup == workingTree && resourceScheme == file && isWindows",
|
||||
"when": "scmProvider == git && scmResourceGroup == workingTree && remoteName == '' && isWindows",
|
||||
"group": "2_view@2"
|
||||
},
|
||||
{
|
||||
|
@ -1913,8 +1913,22 @@
|
|||
"type": "array",
|
||||
"markdownDescription": "%config.branchRandomNameDictionary%",
|
||||
"items": {
|
||||
"type": "string"
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"adjectives",
|
||||
"animals",
|
||||
"colors",
|
||||
"numbers"
|
||||
],
|
||||
"enumDescriptions": [
|
||||
"%config.branchRandomNameDictionary.adjectives%",
|
||||
"%config.branchRandomNameDictionary.animals%",
|
||||
"%config.branchRandomNameDictionary.colors%",
|
||||
"%config.branchRandomNameDictionary.numbers%"
|
||||
]
|
||||
},
|
||||
"minItems": 1,
|
||||
"maxItems": 5,
|
||||
"default": [
|
||||
"adjectives",
|
||||
"animals"
|
||||
|
|
|
@ -126,7 +126,11 @@
|
|||
"config.branchProtectionPrompt.alwaysCommit": "Always commit changes to the protected branch.",
|
||||
"config.branchProtectionPrompt.alwaysCommitToNewBranch": "Always commit changes to a new branch.",
|
||||
"config.branchProtectionPrompt.alwaysPrompt": "Always prompt before changes are committed to a protected branch.",
|
||||
"config.branchRandomNameDictionary": "List of dictionaries used when the branch name that is randomly generated. Supported values: `adjectives`, `animals`, `colors`, `numbers`.",
|
||||
"config.branchRandomNameDictionary": "List of dictionaries used for the randomly generated branch name. Each value represents the dictionary used to generate the segment of the branch name. Supported dictionaries: `adjectives`, `animals`, `colors` and `numbers`.",
|
||||
"config.branchRandomNameDictionary.adjectives": "A random adjective",
|
||||
"config.branchRandomNameDictionary.animals": "A random animal name",
|
||||
"config.branchRandomNameDictionary.colors": "A random color name",
|
||||
"config.branchRandomNameDictionary.numbers": "A random number between 100 and 999",
|
||||
"config.branchRandomNameEnable": "Controls whether a random name is generated when creating a new branch.",
|
||||
"config.branchValidationRegex": "A regular expression to validate new branch names.",
|
||||
"config.branchWhitespaceChar": "The character to replace whitespace in new branch names, and to separate segments of a randomly generated branch name.",
|
||||
|
|
|
@ -368,7 +368,7 @@ export class CommandCenter {
|
|||
return;
|
||||
}
|
||||
|
||||
this.outputChannelLogger.setLogLevel(choice.logLevel);
|
||||
this.outputChannelLogger.currentLogLevel = choice.logLevel;
|
||||
}
|
||||
|
||||
@command('git.refresh', { repository: true })
|
||||
|
|
|
@ -30,12 +30,22 @@ export class OutputChannelLogger {
|
|||
private _onDidChangeLogLevel = new EventEmitter<LogLevel>();
|
||||
readonly onDidChangeLogLevel: Event<LogLevel> = this._onDidChangeLogLevel.event;
|
||||
|
||||
private _currentLogLevel: LogLevel;
|
||||
private _currentLogLevel!: LogLevel;
|
||||
get currentLogLevel(): LogLevel {
|
||||
return this._currentLogLevel;
|
||||
}
|
||||
set currentLogLevel(value: LogLevel) {
|
||||
if (this._currentLogLevel === value) {
|
||||
return;
|
||||
}
|
||||
|
||||
private _defaultLogLevel: LogLevel;
|
||||
this._currentLogLevel = value;
|
||||
this._onDidChangeLogLevel.fire(value);
|
||||
|
||||
this.log(localize('gitLogLevel', "Log level: {0}", LogLevel[value]));
|
||||
}
|
||||
|
||||
private _defaultLogLevel!: LogLevel;
|
||||
get defaultLogLevel(): LogLevel {
|
||||
return this._defaultLogLevel;
|
||||
}
|
||||
|
@ -49,20 +59,26 @@ export class OutputChannelLogger {
|
|||
commands.registerCommand('git.showOutput', () => this.showOutputChannel());
|
||||
this._disposables.push(this._outputChannel);
|
||||
|
||||
// Initialize log level
|
||||
const config = workspace.getConfiguration('git');
|
||||
const logLevel: keyof typeof LogLevel = config.get('logLevel', 'Info');
|
||||
this._currentLogLevel = this._defaultLogLevel = LogLevel[logLevel] ?? LogLevel.Info;
|
||||
|
||||
this.logInfo(localize('gitLogLevel', "Log level: {0}", LogLevel[this._currentLogLevel]));
|
||||
this._disposables.push(workspace.onDidChangeConfiguration(e => {
|
||||
if (e.affectsConfiguration('git.logLevel')) {
|
||||
this.onLogLevelChange();
|
||||
}
|
||||
}));
|
||||
this.onLogLevelChange();
|
||||
}
|
||||
|
||||
private log(message: string, logLevel: LogLevel): void {
|
||||
if (logLevel < this._currentLogLevel) {
|
||||
private onLogLevelChange(): void {
|
||||
const config = workspace.getConfiguration('git');
|
||||
const logLevel: keyof typeof LogLevel = config.get('logLevel', 'Info');
|
||||
this.currentLogLevel = this._defaultLogLevel = LogLevel[logLevel] ?? LogLevel.Info;
|
||||
}
|
||||
|
||||
log(message: string, logLevel?: LogLevel): void {
|
||||
if (logLevel && logLevel < this._currentLogLevel) {
|
||||
return;
|
||||
}
|
||||
|
||||
this._outputChannel.appendLine(`[${new Date().toISOString()}] [${LogLevel[logLevel].toLowerCase()}] ${message}`);
|
||||
this._outputChannel.appendLine(`[${new Date().toISOString()}]${logLevel ? ` [${LogLevel[logLevel].toLowerCase()}]` : ''} ${message}`);
|
||||
}
|
||||
|
||||
logCritical(message: string): void {
|
||||
|
@ -89,21 +105,6 @@ export class OutputChannelLogger {
|
|||
this.log(message, LogLevel.Warning);
|
||||
}
|
||||
|
||||
logGitCommand(command: string): void {
|
||||
this._outputChannel.appendLine(`[${new Date().toISOString()}] ${command}`);
|
||||
}
|
||||
|
||||
setLogLevel(logLevel: LogLevel): void {
|
||||
if (this._currentLogLevel === logLevel) {
|
||||
return;
|
||||
}
|
||||
|
||||
this._currentLogLevel = logLevel;
|
||||
this._onDidChangeLogLevel.fire(logLevel);
|
||||
|
||||
this.logInfo(localize('changed', "Log level changed to: {0}", LogLevel[logLevel]));
|
||||
}
|
||||
|
||||
showOutputChannel(): void {
|
||||
this._outputChannel.show();
|
||||
}
|
||||
|
|
|
@ -90,7 +90,7 @@ async function createModel(context: ExtensionContext, outputChannelLogger: Outpu
|
|||
lines.pop();
|
||||
}
|
||||
|
||||
outputChannelLogger.logGitCommand(lines.join('\n'));
|
||||
outputChannelLogger.log(lines.join('\n'));
|
||||
};
|
||||
git.onOutput.addListener('log', onOutput);
|
||||
disposables.push(toDisposable(() => git.onOutput.removeListener('log', onOutput)));
|
||||
|
|
|
@ -262,7 +262,7 @@
|
|||
},
|
||||
"dependencies": {
|
||||
"@vscode/extension-telemetry": "0.5.1",
|
||||
"vscode-languageclient": "^8.0.1",
|
||||
"vscode-languageclient": "^8.0.2-next.4",
|
||||
"vscode-nls": "^5.0.1",
|
||||
"vscode-uri": "^3.0.3"
|
||||
},
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
"dependencies": {
|
||||
"vscode-css-languageservice": "^6.0.1",
|
||||
"vscode-html-languageservice": "^5.0.0",
|
||||
"vscode-languageserver": "^8.0.1",
|
||||
"vscode-languageserver": "^8.0.2-next.4",
|
||||
"vscode-languageserver-textdocument": "^1.0.4",
|
||||
"vscode-nls": "^5.0.1",
|
||||
"vscode-uri": "^3.0.3"
|
||||
|
|
|
@ -32,35 +32,40 @@ vscode-html-languageservice@^5.0.0:
|
|||
vscode-nls "^5.0.1"
|
||||
vscode-uri "^3.0.3"
|
||||
|
||||
vscode-jsonrpc@8.0.1:
|
||||
version "8.0.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.1.tgz#f30b0625ebafa0fb3bc53e934ca47b706445e57e"
|
||||
integrity sha512-N/WKvghIajmEvXpatSzvTvOIz61ZSmOSa4BRA4pTLi+1+jozquQKP/MkaylP9iB68k73Oua1feLQvH3xQuigiQ==
|
||||
vscode-jsonrpc@8.0.2-next.1:
|
||||
version "8.0.2-next.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2-next.1.tgz#6bdc39fd194782032e34047eeefce562941259c6"
|
||||
integrity sha512-sbbvGSWja7NVBLHPGawtgezc8DHYJaP4qfr/AaJiyDapWcSFtHyPtm18+LnYMLTmB7bhOUW/lf5PeeuLpP6bKA==
|
||||
|
||||
vscode-languageserver-protocol@3.17.1:
|
||||
version "3.17.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.1.tgz#e801762c304f740208b6c804a0cf21f2c87509ed"
|
||||
integrity sha512-BNlAYgQoYwlSgDLJhSG+DeA8G1JyECqRzM2YO6tMmMji3Ad9Mw6AW7vnZMti90qlAKb0LqAlJfSVGEdqMMNzKg==
|
||||
vscode-languageserver-protocol@3.17.2-next.5:
|
||||
version "3.17.2-next.5"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2-next.5.tgz#9bc747411c3ce9e1d73c2714bf6555e0199eec26"
|
||||
integrity sha512-UlH+QL4Q4lX94of/UPDDwwWIkd8w7dtMW4khzvEDUoykiG9tba0iG6V0bAiv8XVpnBIUYjL2FNFiL3zl+TY1Sw==
|
||||
dependencies:
|
||||
vscode-jsonrpc "8.0.1"
|
||||
vscode-languageserver-types "3.17.1"
|
||||
vscode-jsonrpc "8.0.2-next.1"
|
||||
vscode-languageserver-types "3.17.2-next.2"
|
||||
|
||||
vscode-languageserver-textdocument@^1.0.4:
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.4.tgz#3cd56dd14cec1d09e86c4bb04b09a246cb3df157"
|
||||
integrity sha512-/xhqXP/2A2RSs+J8JNXpiiNVvvNM0oTosNVmQnunlKvq9o4mupHOBAnnzH0lwIPKazXKvAKsVp1kr+H/K4lgoQ==
|
||||
|
||||
vscode-languageserver-types@3.17.1, vscode-languageserver-types@^3.17.1:
|
||||
vscode-languageserver-types@3.17.2-next.2:
|
||||
version "3.17.2-next.2"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2-next.2.tgz#af5d6978eee7682aab87c1419323f5b141ac6596"
|
||||
integrity sha512-TiAkLABgqkVWdAlC3XlOfdhdjIAdVU4YntPUm9kKGbXr+MGwpVnKz2KZMNBcvG0CFx8Hi8qliL0iq+ndPB720w==
|
||||
|
||||
vscode-languageserver-types@^3.17.1:
|
||||
version "3.17.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.1.tgz#c2d87fa7784f8cac389deb3ff1e2d9a7bef07e16"
|
||||
integrity sha512-K3HqVRPElLZVVPtMeKlsyL9aK0GxGQpvtAUTfX4k7+iJ4mc1M+JM+zQwkgGy2LzY0f0IAafe8MKqIkJrxfGGjQ==
|
||||
|
||||
vscode-languageserver@^8.0.1:
|
||||
version "8.0.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-8.0.1.tgz#56bd7a01f5c88af075a77f1d220edcb30fc4bdc7"
|
||||
integrity sha512-sn7SjBwWm3OlmLtgg7jbM0wBULppyL60rj8K5HF0ny/MzN+GzPBX1kCvYdybhl7UW63V5V5tRVnyB8iwC73lSQ==
|
||||
vscode-languageserver@^8.0.2-next.4:
|
||||
version "8.0.2-next.4"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-8.0.2-next.4.tgz#c10cc95be06325b56b7ec1d10271c9e4adf3ef07"
|
||||
integrity sha512-B3roWH4TmJiB6Zh5+r7zu0QdlLqJsPdGo0LeEi6OiLfrHYCDlcI7DNcQ7F17vWmxC3C82SrxMt/EuLBMpKQM0A==
|
||||
dependencies:
|
||||
vscode-languageserver-protocol "3.17.1"
|
||||
vscode-languageserver-protocol "3.17.2-next.5"
|
||||
|
||||
vscode-nls@^5.0.1:
|
||||
version "5.0.1"
|
||||
|
|
|
@ -51,32 +51,32 @@ semver@^7.3.5:
|
|||
dependencies:
|
||||
lru-cache "^6.0.0"
|
||||
|
||||
vscode-jsonrpc@8.0.1:
|
||||
version "8.0.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.1.tgz#f30b0625ebafa0fb3bc53e934ca47b706445e57e"
|
||||
integrity sha512-N/WKvghIajmEvXpatSzvTvOIz61ZSmOSa4BRA4pTLi+1+jozquQKP/MkaylP9iB68k73Oua1feLQvH3xQuigiQ==
|
||||
vscode-jsonrpc@8.0.2-next.1:
|
||||
version "8.0.2-next.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2-next.1.tgz#6bdc39fd194782032e34047eeefce562941259c6"
|
||||
integrity sha512-sbbvGSWja7NVBLHPGawtgezc8DHYJaP4qfr/AaJiyDapWcSFtHyPtm18+LnYMLTmB7bhOUW/lf5PeeuLpP6bKA==
|
||||
|
||||
vscode-languageclient@^8.0.1:
|
||||
version "8.0.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-8.0.1.tgz#bf5535c4463a78daeaca0bcb4f5868aec86bb301"
|
||||
integrity sha512-9XoE+HJfaWvu7Y75H3VmLo5WLCtsbxEgEhrLPqwt7eyoR49lUIyyrjb98Yfa50JCMqF2cePJAEVI6oe2o1sIhw==
|
||||
vscode-languageclient@^8.0.2-next.4:
|
||||
version "8.0.2-next.4"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-8.0.2-next.4.tgz#87dd364ffbd4356aff3af14e7b557d9fe34d2b67"
|
||||
integrity sha512-j9BEiCYMN9IoKwYdk9iickV6WNPVGPoVO11SMdoxFnWPIT3y5UAe3qf/WsfA9OdklAIaxxYasfgyKCpBjSPNuw==
|
||||
dependencies:
|
||||
minimatch "^3.0.4"
|
||||
semver "^7.3.5"
|
||||
vscode-languageserver-protocol "3.17.1"
|
||||
vscode-languageserver-protocol "3.17.2-next.5"
|
||||
|
||||
vscode-languageserver-protocol@3.17.1:
|
||||
version "3.17.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.1.tgz#e801762c304f740208b6c804a0cf21f2c87509ed"
|
||||
integrity sha512-BNlAYgQoYwlSgDLJhSG+DeA8G1JyECqRzM2YO6tMmMji3Ad9Mw6AW7vnZMti90qlAKb0LqAlJfSVGEdqMMNzKg==
|
||||
vscode-languageserver-protocol@3.17.2-next.5:
|
||||
version "3.17.2-next.5"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2-next.5.tgz#9bc747411c3ce9e1d73c2714bf6555e0199eec26"
|
||||
integrity sha512-UlH+QL4Q4lX94of/UPDDwwWIkd8w7dtMW4khzvEDUoykiG9tba0iG6V0bAiv8XVpnBIUYjL2FNFiL3zl+TY1Sw==
|
||||
dependencies:
|
||||
vscode-jsonrpc "8.0.1"
|
||||
vscode-languageserver-types "3.17.1"
|
||||
vscode-jsonrpc "8.0.2-next.1"
|
||||
vscode-languageserver-types "3.17.2-next.2"
|
||||
|
||||
vscode-languageserver-types@3.17.1:
|
||||
version "3.17.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.1.tgz#c2d87fa7784f8cac389deb3ff1e2d9a7bef07e16"
|
||||
integrity sha512-K3HqVRPElLZVVPtMeKlsyL9aK0GxGQpvtAUTfX4k7+iJ4mc1M+JM+zQwkgGy2LzY0f0IAafe8MKqIkJrxfGGjQ==
|
||||
vscode-languageserver-types@3.17.2-next.2:
|
||||
version "3.17.2-next.2"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2-next.2.tgz#af5d6978eee7682aab87c1419323f5b141ac6596"
|
||||
integrity sha512-TiAkLABgqkVWdAlC3XlOfdhdjIAdVU4YntPUm9kKGbXr+MGwpVnKz2KZMNBcvG0CFx8Hi8qliL0iq+ndPB720w==
|
||||
|
||||
vscode-nls@^5.0.1:
|
||||
version "5.0.1"
|
||||
|
|
|
@ -149,7 +149,7 @@
|
|||
"dependencies": {
|
||||
"@vscode/extension-telemetry": "0.5.1",
|
||||
"request-light": "^0.5.8",
|
||||
"vscode-languageclient": "^8.0.1",
|
||||
"vscode-languageclient": "^8.0.2-next.4",
|
||||
"vscode-nls": "^5.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
"jsonc-parser": "^3.0.0",
|
||||
"request-light": "^0.5.8",
|
||||
"vscode-json-languageservice": "^5.0.0",
|
||||
"vscode-languageserver": "^8.0.1",
|
||||
"vscode-languageserver": "^8.0.2-next.4",
|
||||
"vscode-uri": "^3.0.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
|
|
@ -33,35 +33,40 @@ vscode-json-languageservice@^5.0.0:
|
|||
vscode-nls "^5.0.1"
|
||||
vscode-uri "^3.0.3"
|
||||
|
||||
vscode-jsonrpc@8.0.1:
|
||||
version "8.0.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.1.tgz#f30b0625ebafa0fb3bc53e934ca47b706445e57e"
|
||||
integrity sha512-N/WKvghIajmEvXpatSzvTvOIz61ZSmOSa4BRA4pTLi+1+jozquQKP/MkaylP9iB68k73Oua1feLQvH3xQuigiQ==
|
||||
vscode-jsonrpc@8.0.2-next.1:
|
||||
version "8.0.2-next.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2-next.1.tgz#6bdc39fd194782032e34047eeefce562941259c6"
|
||||
integrity sha512-sbbvGSWja7NVBLHPGawtgezc8DHYJaP4qfr/AaJiyDapWcSFtHyPtm18+LnYMLTmB7bhOUW/lf5PeeuLpP6bKA==
|
||||
|
||||
vscode-languageserver-protocol@3.17.1:
|
||||
version "3.17.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.1.tgz#e801762c304f740208b6c804a0cf21f2c87509ed"
|
||||
integrity sha512-BNlAYgQoYwlSgDLJhSG+DeA8G1JyECqRzM2YO6tMmMji3Ad9Mw6AW7vnZMti90qlAKb0LqAlJfSVGEdqMMNzKg==
|
||||
vscode-languageserver-protocol@3.17.2-next.5:
|
||||
version "3.17.2-next.5"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2-next.5.tgz#9bc747411c3ce9e1d73c2714bf6555e0199eec26"
|
||||
integrity sha512-UlH+QL4Q4lX94of/UPDDwwWIkd8w7dtMW4khzvEDUoykiG9tba0iG6V0bAiv8XVpnBIUYjL2FNFiL3zl+TY1Sw==
|
||||
dependencies:
|
||||
vscode-jsonrpc "8.0.1"
|
||||
vscode-languageserver-types "3.17.1"
|
||||
vscode-jsonrpc "8.0.2-next.1"
|
||||
vscode-languageserver-types "3.17.2-next.2"
|
||||
|
||||
vscode-languageserver-textdocument@^1.0.4:
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.4.tgz#3cd56dd14cec1d09e86c4bb04b09a246cb3df157"
|
||||
integrity sha512-/xhqXP/2A2RSs+J8JNXpiiNVvvNM0oTosNVmQnunlKvq9o4mupHOBAnnzH0lwIPKazXKvAKsVp1kr+H/K4lgoQ==
|
||||
|
||||
vscode-languageserver-types@3.17.1, vscode-languageserver-types@^3.17.1:
|
||||
vscode-languageserver-types@3.17.2-next.2:
|
||||
version "3.17.2-next.2"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2-next.2.tgz#af5d6978eee7682aab87c1419323f5b141ac6596"
|
||||
integrity sha512-TiAkLABgqkVWdAlC3XlOfdhdjIAdVU4YntPUm9kKGbXr+MGwpVnKz2KZMNBcvG0CFx8Hi8qliL0iq+ndPB720w==
|
||||
|
||||
vscode-languageserver-types@^3.17.1:
|
||||
version "3.17.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.1.tgz#c2d87fa7784f8cac389deb3ff1e2d9a7bef07e16"
|
||||
integrity sha512-K3HqVRPElLZVVPtMeKlsyL9aK0GxGQpvtAUTfX4k7+iJ4mc1M+JM+zQwkgGy2LzY0f0IAafe8MKqIkJrxfGGjQ==
|
||||
|
||||
vscode-languageserver@^8.0.1:
|
||||
version "8.0.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-8.0.1.tgz#56bd7a01f5c88af075a77f1d220edcb30fc4bdc7"
|
||||
integrity sha512-sn7SjBwWm3OlmLtgg7jbM0wBULppyL60rj8K5HF0ny/MzN+GzPBX1kCvYdybhl7UW63V5V5tRVnyB8iwC73lSQ==
|
||||
vscode-languageserver@^8.0.2-next.4:
|
||||
version "8.0.2-next.4"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-8.0.2-next.4.tgz#c10cc95be06325b56b7ec1d10271c9e4adf3ef07"
|
||||
integrity sha512-B3roWH4TmJiB6Zh5+r7zu0QdlLqJsPdGo0LeEi6OiLfrHYCDlcI7DNcQ7F17vWmxC3C82SrxMt/EuLBMpKQM0A==
|
||||
dependencies:
|
||||
vscode-languageserver-protocol "3.17.1"
|
||||
vscode-languageserver-protocol "3.17.2-next.5"
|
||||
|
||||
vscode-nls@^5.0.1:
|
||||
version "5.0.1"
|
||||
|
|
|
@ -56,32 +56,32 @@ semver@^7.3.5:
|
|||
dependencies:
|
||||
lru-cache "^6.0.0"
|
||||
|
||||
vscode-jsonrpc@8.0.1:
|
||||
version "8.0.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.1.tgz#f30b0625ebafa0fb3bc53e934ca47b706445e57e"
|
||||
integrity sha512-N/WKvghIajmEvXpatSzvTvOIz61ZSmOSa4BRA4pTLi+1+jozquQKP/MkaylP9iB68k73Oua1feLQvH3xQuigiQ==
|
||||
vscode-jsonrpc@8.0.2-next.1:
|
||||
version "8.0.2-next.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2-next.1.tgz#6bdc39fd194782032e34047eeefce562941259c6"
|
||||
integrity sha512-sbbvGSWja7NVBLHPGawtgezc8DHYJaP4qfr/AaJiyDapWcSFtHyPtm18+LnYMLTmB7bhOUW/lf5PeeuLpP6bKA==
|
||||
|
||||
vscode-languageclient@^8.0.1:
|
||||
version "8.0.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-8.0.1.tgz#bf5535c4463a78daeaca0bcb4f5868aec86bb301"
|
||||
integrity sha512-9XoE+HJfaWvu7Y75H3VmLo5WLCtsbxEgEhrLPqwt7eyoR49lUIyyrjb98Yfa50JCMqF2cePJAEVI6oe2o1sIhw==
|
||||
vscode-languageclient@^8.0.2-next.4:
|
||||
version "8.0.2-next.4"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-8.0.2-next.4.tgz#87dd364ffbd4356aff3af14e7b557d9fe34d2b67"
|
||||
integrity sha512-j9BEiCYMN9IoKwYdk9iickV6WNPVGPoVO11SMdoxFnWPIT3y5UAe3qf/WsfA9OdklAIaxxYasfgyKCpBjSPNuw==
|
||||
dependencies:
|
||||
minimatch "^3.0.4"
|
||||
semver "^7.3.5"
|
||||
vscode-languageserver-protocol "3.17.1"
|
||||
vscode-languageserver-protocol "3.17.2-next.5"
|
||||
|
||||
vscode-languageserver-protocol@3.17.1:
|
||||
version "3.17.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.1.tgz#e801762c304f740208b6c804a0cf21f2c87509ed"
|
||||
integrity sha512-BNlAYgQoYwlSgDLJhSG+DeA8G1JyECqRzM2YO6tMmMji3Ad9Mw6AW7vnZMti90qlAKb0LqAlJfSVGEdqMMNzKg==
|
||||
vscode-languageserver-protocol@3.17.2-next.5:
|
||||
version "3.17.2-next.5"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2-next.5.tgz#9bc747411c3ce9e1d73c2714bf6555e0199eec26"
|
||||
integrity sha512-UlH+QL4Q4lX94of/UPDDwwWIkd8w7dtMW4khzvEDUoykiG9tba0iG6V0bAiv8XVpnBIUYjL2FNFiL3zl+TY1Sw==
|
||||
dependencies:
|
||||
vscode-jsonrpc "8.0.1"
|
||||
vscode-languageserver-types "3.17.1"
|
||||
vscode-jsonrpc "8.0.2-next.1"
|
||||
vscode-languageserver-types "3.17.2-next.2"
|
||||
|
||||
vscode-languageserver-types@3.17.1:
|
||||
version "3.17.1"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.1.tgz#c2d87fa7784f8cac389deb3ff1e2d9a7bef07e16"
|
||||
integrity sha512-K3HqVRPElLZVVPtMeKlsyL9aK0GxGQpvtAUTfX4k7+iJ4mc1M+JM+zQwkgGy2LzY0f0IAafe8MKqIkJrxfGGjQ==
|
||||
vscode-languageserver-types@3.17.2-next.2:
|
||||
version "3.17.2-next.2"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2-next.2.tgz#af5d6978eee7682aab87c1419323f5b141ac6596"
|
||||
integrity sha512-TiAkLABgqkVWdAlC3XlOfdhdjIAdVU4YntPUm9kKGbXr+MGwpVnKz2KZMNBcvG0CFx8Hi8qliL0iq+ndPB720w==
|
||||
|
||||
vscode-nls@^5.0.1:
|
||||
version "5.0.1"
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
"configuration.markdown.links.openLocation.currentGroup": "Open links in the active editor group.",
|
||||
"configuration.markdown.links.openLocation.beside": "Open links beside the active editor.",
|
||||
"configuration.markdown.suggest.paths.enabled.description": "Enable/disable path suggestions for markdown links",
|
||||
"configuration.markdown.editor.drop.enabled": "Enable/disable dropping into the markdown editor to insert shift. Requires enabling `#workbenck.experimental.editor.dropIntoEditor.enabled#`.",
|
||||
"configuration.markdown.editor.drop.enabled": "Enable/disable dropping into the markdown editor to insert shift. Requires enabling `#workbench.experimental.editor.dropIntoEditor.enabled#`.",
|
||||
"configuration.markdown.editor.pasteLinks.enabled": "Enable/disable pasting files into a Markdown editor inserts Markdown links.",
|
||||
"configuration.markdown.experimental.validate.enabled.description": "Enable/disable all error reporting in Markdown files.",
|
||||
"configuration.markdown.experimental.validate.referenceLinks.enabled.description": "Validate reference links in Markdown files, e.g. `[link][ref]`. Requires enabling `#markdown.experimental.validate.enabled#`.",
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
"license": "MIT",
|
||||
"description": "Dependencies shared by all extensions",
|
||||
"dependencies": {
|
||||
"typescript": "4.7"
|
||||
"typescript": "4.7.3"
|
||||
},
|
||||
"scripts": {
|
||||
"postinstall": "node ./postinstall.mjs"
|
||||
|
|
|
@ -42,10 +42,10 @@ node-gyp-build@^4.3.0:
|
|||
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3"
|
||||
integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==
|
||||
|
||||
typescript@4.7:
|
||||
version "4.7.2"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.2.tgz#1f9aa2ceb9af87cca227813b4310fff0b51593c4"
|
||||
integrity sha512-Mamb1iX2FDUpcTRzltPxgWMKy3fhg0TN378ylbktPGPK/99KbDtMQ4W1hwgsbPAsG3a0xKa1vmw4VKZQbkvz5A==
|
||||
typescript@4.7.3:
|
||||
version "4.7.3"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.3.tgz#8364b502d5257b540f9de4c40be84c98e23a129d"
|
||||
integrity sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA==
|
||||
|
||||
vscode-grammar-updater@^1.1.0:
|
||||
version "1.1.0"
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "code-oss-dev",
|
||||
"version": "1.68.0",
|
||||
"distro": "1af1d9e4f6e2609bd0eb3dea3786ef1571338986",
|
||||
"distro": "2966cd72fc1a3a5fb89bf2d85a1a66e56206961a",
|
||||
"author": {
|
||||
"name": "Microsoft Corporation"
|
||||
},
|
||||
|
@ -85,12 +85,12 @@
|
|||
"vscode-proxy-agent": "^0.12.0",
|
||||
"vscode-regexpp": "^3.1.0",
|
||||
"vscode-textmate": "7.0.1",
|
||||
"xterm": "4.19.0-beta.56",
|
||||
"xterm": "4.19.0-beta.58",
|
||||
"xterm-addon-search": "0.9.0-beta.39",
|
||||
"xterm-addon-serialize": "0.7.0-beta.12",
|
||||
"xterm-addon-unicode11": "0.4.0-beta.3",
|
||||
"xterm-addon-webgl": "0.12.0-beta.36",
|
||||
"xterm-headless": "4.19.0-beta.56",
|
||||
"xterm-addon-webgl": "0.12.0-beta.37",
|
||||
"xterm-headless": "4.19.0-beta.58",
|
||||
"yauzl": "^2.9.2",
|
||||
"yazl": "^2.4.3"
|
||||
},
|
||||
|
|
|
@ -24,12 +24,12 @@
|
|||
"vscode-proxy-agent": "^0.12.0",
|
||||
"vscode-regexpp": "^3.1.0",
|
||||
"vscode-textmate": "7.0.1",
|
||||
"xterm": "4.19.0-beta.56",
|
||||
"xterm": "4.19.0-beta.58",
|
||||
"xterm-addon-search": "0.9.0-beta.39",
|
||||
"xterm-addon-serialize": "0.7.0-beta.12",
|
||||
"xterm-addon-unicode11": "0.4.0-beta.3",
|
||||
"xterm-addon-webgl": "0.12.0-beta.36",
|
||||
"xterm-headless": "4.19.0-beta.56",
|
||||
"xterm-addon-webgl": "0.12.0-beta.37",
|
||||
"xterm-headless": "4.19.0-beta.58",
|
||||
"yauzl": "^2.9.2",
|
||||
"yazl": "^2.4.3"
|
||||
},
|
||||
|
|
|
@ -10,9 +10,9 @@
|
|||
"tas-client-umd": "0.1.6",
|
||||
"vscode-oniguruma": "1.6.1",
|
||||
"vscode-textmate": "7.0.1",
|
||||
"xterm": "4.19.0-beta.56",
|
||||
"xterm": "4.19.0-beta.58",
|
||||
"xterm-addon-search": "0.9.0-beta.39",
|
||||
"xterm-addon-unicode11": "0.4.0-beta.3",
|
||||
"xterm-addon-webgl": "0.12.0-beta.36"
|
||||
"xterm-addon-webgl": "0.12.0-beta.37"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -123,12 +123,12 @@ xterm-addon-unicode11@0.4.0-beta.3:
|
|||
resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.4.0-beta.3.tgz#f350184155fafd5ad0d6fbf31d13e6ca7dea1efa"
|
||||
integrity sha512-FryZAVwbUjKTmwXnm1trch/2XO60F5JsDvOkZhzobV1hm10sFLVuZpFyHXiUx7TFeeFsvNP+S77LAtWoeT5z+Q==
|
||||
|
||||
xterm-addon-webgl@0.12.0-beta.36:
|
||||
version "0.12.0-beta.36"
|
||||
resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.36.tgz#460f80829a78c979a448d5b764699af3f0366ff1"
|
||||
integrity sha512-sgX7OHSGZQZE5b4xtPqd/5NEcll0Z+00tnTVxKZlXf5XEENcG0tnBF4I4f+k9K3cmjE1UIUVG2yYPrqWlYCdpA==
|
||||
xterm-addon-webgl@0.12.0-beta.37:
|
||||
version "0.12.0-beta.37"
|
||||
resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.37.tgz#e465100041a7e0b1d32b01cd0b0ba5a516ac13c2"
|
||||
integrity sha512-d4GfKlMrWZGzsMfMHd2siG+QiOvwikhwiu+JQlIhlnAShT/wU5BOGbNfDDA1tHmkW7G1UCFgucBuVxrs5wjuBQ==
|
||||
|
||||
xterm@4.19.0-beta.56:
|
||||
version "4.19.0-beta.56"
|
||||
resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.56.tgz#a3f1021b43ac04aa0c3f7b06f1b44ad34d487879"
|
||||
integrity sha512-kywKIK61oPjbloZI+jXY1zgjQm/ghOsFFMjb79IIMaWocUDDqdpo9MmGwziTVZYu4w/Air2Zfas9UWBu4/KEyA==
|
||||
xterm@4.19.0-beta.58:
|
||||
version "4.19.0-beta.58"
|
||||
resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.58.tgz#cbe535b0b85bc7f8ae3cc242df006bea04cdf541"
|
||||
integrity sha512-fr3QC2qS2NBab8X7kwA/3QZELzQqhAKsngvK8NkhsrFN1DAuyEETkzqXuKbO7OKpCB6VqGDN6GPkNlUB9VrIDA==
|
||||
|
|
|
@ -929,20 +929,20 @@ xterm-addon-unicode11@0.4.0-beta.3:
|
|||
resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.4.0-beta.3.tgz#f350184155fafd5ad0d6fbf31d13e6ca7dea1efa"
|
||||
integrity sha512-FryZAVwbUjKTmwXnm1trch/2XO60F5JsDvOkZhzobV1hm10sFLVuZpFyHXiUx7TFeeFsvNP+S77LAtWoeT5z+Q==
|
||||
|
||||
xterm-addon-webgl@0.12.0-beta.36:
|
||||
version "0.12.0-beta.36"
|
||||
resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.36.tgz#460f80829a78c979a448d5b764699af3f0366ff1"
|
||||
integrity sha512-sgX7OHSGZQZE5b4xtPqd/5NEcll0Z+00tnTVxKZlXf5XEENcG0tnBF4I4f+k9K3cmjE1UIUVG2yYPrqWlYCdpA==
|
||||
xterm-addon-webgl@0.12.0-beta.37:
|
||||
version "0.12.0-beta.37"
|
||||
resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.37.tgz#e465100041a7e0b1d32b01cd0b0ba5a516ac13c2"
|
||||
integrity sha512-d4GfKlMrWZGzsMfMHd2siG+QiOvwikhwiu+JQlIhlnAShT/wU5BOGbNfDDA1tHmkW7G1UCFgucBuVxrs5wjuBQ==
|
||||
|
||||
xterm-headless@4.19.0-beta.56:
|
||||
version "4.19.0-beta.56"
|
||||
resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-4.19.0-beta.56.tgz#7e6bdc8d647916bf5de64a73eee6bd508d25e344"
|
||||
integrity sha512-EZoR/HqZoernhFngFQp7gUPy+G0TpEJkbJ9HVZcINC3m8wuV1wZKfZ4xBhsRPfhSJ7rsPnqbC+qez5ZjxwYEIw==
|
||||
xterm-headless@4.19.0-beta.58:
|
||||
version "4.19.0-beta.58"
|
||||
resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-4.19.0-beta.58.tgz#3a38cf3b9cd2606fb342a5cf8f2a0cfb963a62e8"
|
||||
integrity sha512-wKQW8VzkFjyYDvcaM26gulo+YghyocfkZnKMH7gc/+/mFn3YXUPBPuOcX6e0M7NibyMlewpQpZjHQUPLBjkzfw==
|
||||
|
||||
xterm@4.19.0-beta.56:
|
||||
version "4.19.0-beta.56"
|
||||
resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.56.tgz#a3f1021b43ac04aa0c3f7b06f1b44ad34d487879"
|
||||
integrity sha512-kywKIK61oPjbloZI+jXY1zgjQm/ghOsFFMjb79IIMaWocUDDqdpo9MmGwziTVZYu4w/Air2Zfas9UWBu4/KEyA==
|
||||
xterm@4.19.0-beta.58:
|
||||
version "4.19.0-beta.58"
|
||||
resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.58.tgz#cbe535b0b85bc7f8ae3cc242df006bea04cdf541"
|
||||
integrity sha512-fr3QC2qS2NBab8X7kwA/3QZELzQqhAKsngvK8NkhsrFN1DAuyEETkzqXuKbO7OKpCB6VqGDN6GPkNlUB9VrIDA==
|
||||
|
||||
yallist@^4.0.0:
|
||||
version "4.0.0"
|
||||
|
|
|
@ -63,7 +63,7 @@ else
|
|||
export ELECTRON_ENABLE_LOGGING=1
|
||||
|
||||
# Running from a build, we need to enable the vscode-test-resolver extension
|
||||
EXTRA_INTEGRATION_TEST_ARGUMENTS="--extensions-dir=$EXT_PATH --enable-proposed-api=vscode.vscode-test-resolver --enable-proposed-api=vscode.vscode-api-tests"
|
||||
EXTRA_INTEGRATION_TEST_ARGUMENTS="--extensions-dir=$EXT_PATH --enable-proposed-api=vscode.vscode-test-resolver --enable-proposed-api=vscode.vscode-api-tests --enable-proposed-api=vscode.markdown-language-features --enable-proposed-api=vscode.git"
|
||||
|
||||
echo "Storing crash reports into '$VSCODECRASHDIR'."
|
||||
echo "Storing log files into '$VSCODELOGSDIR'."
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
.fullscreen .menubar:not(.compact) {
|
||||
margin: 0px;
|
||||
padding: 0px 5px;
|
||||
padding: 4px 5px;
|
||||
}
|
||||
|
||||
.menubar > .menubar-menu-button {
|
||||
|
|
|
@ -446,8 +446,8 @@ class FastRenderedViewLine implements IRenderedViewLine {
|
|||
}
|
||||
|
||||
private _getCharPosition(column: number): number {
|
||||
const charOffset = this._characterMapping.getAbsoluteOffset(column);
|
||||
return this._charWidth * charOffset;
|
||||
const horizontalOffset = this._characterMapping.getHorizontalOffset(column);
|
||||
return this._charWidth * horizontalOffset;
|
||||
}
|
||||
|
||||
public getColumnOfNodeOffset(lineNumber: number, spanNode: HTMLElement, offset: number): number {
|
||||
|
@ -625,8 +625,8 @@ class RenderedViewLine implements IRenderedViewLine {
|
|||
}
|
||||
const result = r[0].left;
|
||||
if (this.input.isBasicASCII) {
|
||||
const charOffset = this._characterMapping.getAbsoluteOffset(column);
|
||||
const expectedResult = Math.round(this.input.spaceWidth * charOffset);
|
||||
const horizontalOffset = this._characterMapping.getHorizontalOffset(column);
|
||||
const expectedResult = Math.round(this.input.spaceWidth * horizontalOffset);
|
||||
if (Math.abs(expectedResult - result) <= 1) {
|
||||
return expectedResult;
|
||||
}
|
||||
|
|
|
@ -2495,7 +2495,7 @@ class InlineViewZonesComputer extends ViewZonesComputer {
|
|||
marginDomNode.appendChild(marginElement);
|
||||
}
|
||||
|
||||
return output.characterMapping.getAbsoluteOffset(output.characterMapping.length);
|
||||
return output.characterMapping.getHorizontalOffset(output.characterMapping.length);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -160,7 +160,7 @@ function getClassifier(): CharacterClassifier<CharacterClass> {
|
|||
_classifier.set(FORCE_TERMINATION_CHARACTERS.charCodeAt(i), CharacterClass.ForceTermination);
|
||||
}
|
||||
|
||||
const CANNOT_END_WITH_CHARACTERS = '.,;';
|
||||
const CANNOT_END_WITH_CHARACTERS = '.,;:';
|
||||
for (let i = 0; i < CANNOT_END_WITH_CHARACTERS.length; i++) {
|
||||
_classifier.set(CANNOT_END_WITH_CHARACTERS.charCodeAt(i), CharacterClass.CannotEndIn);
|
||||
}
|
||||
|
|
|
@ -127,7 +127,11 @@ export class BracketPairsTextModelPart extends Disposable implements IBracketPai
|
|||
if (this.canBuildAST) {
|
||||
const closingBracketInfo = this.languageConfigurationService
|
||||
.getLanguageConfiguration(languageId)
|
||||
.bracketsNew.getClosingBracketInfo(_bracket)!;
|
||||
.bracketsNew.getClosingBracketInfo(_bracket);
|
||||
|
||||
if (!closingBracketInfo) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const bracketPair = findLast(this.getBracketPairsInRange(Range.fromPositions(_position, _position)) || [], (b) =>
|
||||
closingBracketInfo.closes(b.openingBracketInfo)
|
||||
|
|
|
@ -199,7 +199,7 @@ class NonPeekableTextBufferTokenizer {
|
|||
|
||||
const endOffset = lineTokens.getEndOffset(this.lineTokenOffset);
|
||||
// Is there a bracket token next? Only consume text.
|
||||
if (containsBracketType && isOther && endOffset !== this.lineCharOffset) {
|
||||
if (containsBracketType && isOther && this.lineCharOffset < endOffset) {
|
||||
const languageId = lineTokens.getLanguageId(this.lineTokenOffset);
|
||||
const text = this.line.substring(this.lineCharOffset, endOffset);
|
||||
|
||||
|
|
|
@ -205,29 +205,29 @@ export class CharacterMapping {
|
|||
|
||||
public readonly length: number;
|
||||
private readonly _data: Uint32Array;
|
||||
private readonly _absoluteOffsets: Uint32Array;
|
||||
private readonly _horizontalOffset: Uint32Array;
|
||||
|
||||
constructor(length: number, partCount: number) {
|
||||
this.length = length;
|
||||
this._data = new Uint32Array(this.length);
|
||||
this._absoluteOffsets = new Uint32Array(this.length);
|
||||
this._horizontalOffset = new Uint32Array(this.length);
|
||||
}
|
||||
|
||||
public setColumnInfo(column: number, partIndex: number, charIndex: number, partAbsoluteOffset: number): void {
|
||||
public setColumnInfo(column: number, partIndex: number, charIndex: number, horizontalOffset: number): void {
|
||||
const partData = (
|
||||
(partIndex << CharacterMappingConstants.PART_INDEX_OFFSET)
|
||||
| (charIndex << CharacterMappingConstants.CHAR_INDEX_OFFSET)
|
||||
) >>> 0;
|
||||
this._data[column - 1] = partData;
|
||||
this._absoluteOffsets[column - 1] = partAbsoluteOffset + charIndex;
|
||||
this._horizontalOffset[column - 1] = horizontalOffset;
|
||||
}
|
||||
|
||||
public getAbsoluteOffset(column: number): number {
|
||||
if (this._absoluteOffsets.length === 0) {
|
||||
public getHorizontalOffset(column: number): number {
|
||||
if (this._horizontalOffset.length === 0) {
|
||||
// No characters on this line
|
||||
return 0;
|
||||
}
|
||||
return this._absoluteOffsets[column - 1];
|
||||
return this._horizontalOffset[column - 1];
|
||||
}
|
||||
|
||||
private charOffsetToPartData(charOffset: number): number {
|
||||
|
@ -314,6 +314,18 @@ export class CharacterMapping {
|
|||
}
|
||||
return max;
|
||||
}
|
||||
|
||||
public inflate() {
|
||||
const result: [number, number, number][] = [];
|
||||
for (let i = 0; i < this.length; i++) {
|
||||
const partData = this._data[i];
|
||||
const partIndex = CharacterMapping.getPartIndex(partData);
|
||||
const charIndex = CharacterMapping.getCharIndex(partData);
|
||||
const visibleColumn = this._horizontalOffset[i];
|
||||
result.push([partIndex, charIndex, visibleColumn]);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
export const enum ForeignElementType {
|
||||
|
@ -914,11 +926,10 @@ function _renderLine(input: ResolvedRenderLineInput, sb: IStringBuilder): Render
|
|||
|
||||
let charIndex = 0;
|
||||
let visibleColumn = startVisibleColumn;
|
||||
let charOffsetInPart = 0;
|
||||
let charOffsetInPart = 0; // the character offset in the current part
|
||||
let charHorizontalOffset = 0; // the character horizontal position in terms of chars relative to line start
|
||||
|
||||
let partDisplacement = 0;
|
||||
let prevPartContentCnt = 0;
|
||||
let partAbsoluteOffset = 0;
|
||||
|
||||
if (containsRTL) {
|
||||
sb.appendASCIIString('<span dir="ltr">');
|
||||
|
@ -927,7 +938,6 @@ function _renderLine(input: ResolvedRenderLineInput, sb: IStringBuilder): Render
|
|||
}
|
||||
|
||||
for (let partIndex = 0, tokensLen = parts.length; partIndex < tokensLen; partIndex++) {
|
||||
partAbsoluteOffset += prevPartContentCnt;
|
||||
|
||||
const part = parts[partIndex];
|
||||
const partEndIndex = part.endIndex;
|
||||
|
@ -948,7 +958,7 @@ function _renderLine(input: ResolvedRenderLineInput, sb: IStringBuilder): Render
|
|||
|
||||
if (partRendersWhitespace) {
|
||||
|
||||
let partContentCnt = 0;
|
||||
let partWidth = 0;
|
||||
{
|
||||
let _charIndex = charIndex;
|
||||
let _visibleColumn = visibleColumn;
|
||||
|
@ -956,7 +966,7 @@ function _renderLine(input: ResolvedRenderLineInput, sb: IStringBuilder): Render
|
|||
for (; _charIndex < partEndIndex; _charIndex++) {
|
||||
const charCode = lineContent.charCodeAt(_charIndex);
|
||||
const charWidth = (charCode === CharCode.Tab ? (tabSize - (_visibleColumn % tabSize)) : 1) | 0;
|
||||
partContentCnt += charWidth;
|
||||
partWidth += charWidth;
|
||||
if (_charIndex >= fauxIndentLength) {
|
||||
_visibleColumn += charWidth;
|
||||
}
|
||||
|
@ -965,19 +975,22 @@ function _renderLine(input: ResolvedRenderLineInput, sb: IStringBuilder): Render
|
|||
|
||||
if (partRendersWhitespaceWithWidth) {
|
||||
sb.appendASCIIString(' style="width:');
|
||||
sb.appendASCIIString(String(spaceWidth * partContentCnt));
|
||||
sb.appendASCIIString(String(spaceWidth * partWidth));
|
||||
sb.appendASCIIString('px"');
|
||||
}
|
||||
sb.appendASCII(CharCode.GreaterThan);
|
||||
|
||||
for (; charIndex < partEndIndex; charIndex++) {
|
||||
characterMapping.setColumnInfo(charIndex + 1, partIndex - partDisplacement, charOffsetInPart, partAbsoluteOffset);
|
||||
characterMapping.setColumnInfo(charIndex + 1, partIndex - partDisplacement, charOffsetInPart, charHorizontalOffset);
|
||||
partDisplacement = 0;
|
||||
const charCode = lineContent.charCodeAt(charIndex);
|
||||
|
||||
let producedCharacters: number;
|
||||
let charWidth: number;
|
||||
|
||||
if (charCode === CharCode.Tab) {
|
||||
charWidth = (tabSize - (visibleColumn % tabSize)) | 0;
|
||||
producedCharacters = (tabSize - (visibleColumn % tabSize)) | 0;
|
||||
charWidth = producedCharacters;
|
||||
|
||||
if (!canUseHalfwidthRightwardsArrow || charWidth > 1) {
|
||||
sb.write1(0x2192); // RIGHTWARDS ARROW
|
||||
|
@ -989,29 +1002,26 @@ function _renderLine(input: ResolvedRenderLineInput, sb: IStringBuilder): Render
|
|||
}
|
||||
|
||||
} else { // must be CharCode.Space
|
||||
producedCharacters = 2;
|
||||
charWidth = 1;
|
||||
|
||||
sb.write1(0x200C); // ZERO WIDTH NON-JOINER
|
||||
sb.write1(renderSpaceCharCode); // · or word separator middle dot
|
||||
sb.write1(0x200C); // ZERO WIDTH NON-JOINER
|
||||
}
|
||||
|
||||
charOffsetInPart += charWidth;
|
||||
charOffsetInPart += producedCharacters;
|
||||
charHorizontalOffset += charWidth;
|
||||
if (charIndex >= fauxIndentLength) {
|
||||
visibleColumn += charWidth;
|
||||
}
|
||||
}
|
||||
|
||||
prevPartContentCnt = partContentCnt;
|
||||
|
||||
} else {
|
||||
|
||||
let partContentCnt = 0;
|
||||
|
||||
sb.appendASCII(CharCode.GreaterThan);
|
||||
|
||||
for (; charIndex < partEndIndex; charIndex++) {
|
||||
characterMapping.setColumnInfo(charIndex + 1, partIndex - partDisplacement, charOffsetInPart, partAbsoluteOffset);
|
||||
characterMapping.setColumnInfo(charIndex + 1, partIndex - partDisplacement, charOffsetInPart, charHorizontalOffset);
|
||||
partDisplacement = 0;
|
||||
const charCode = lineContent.charCodeAt(charIndex);
|
||||
|
||||
|
@ -1074,19 +1084,18 @@ function _renderLine(input: ResolvedRenderLineInput, sb: IStringBuilder): Render
|
|||
sb.appendASCIIString(to4CharHex(charCode));
|
||||
sb.appendASCIIString(']');
|
||||
producedCharacters = 8;
|
||||
charWidth = producedCharacters;
|
||||
} else {
|
||||
sb.write1(charCode);
|
||||
}
|
||||
}
|
||||
|
||||
charOffsetInPart += producedCharacters;
|
||||
partContentCnt += producedCharacters;
|
||||
charHorizontalOffset += charWidth;
|
||||
if (charIndex >= fauxIndentLength) {
|
||||
visibleColumn += charWidth;
|
||||
}
|
||||
}
|
||||
|
||||
prevPartContentCnt = partContentCnt;
|
||||
}
|
||||
|
||||
if (partIsEmptyAndHasPseudoAfter) {
|
||||
|
@ -1097,7 +1106,7 @@ function _renderLine(input: ResolvedRenderLineInput, sb: IStringBuilder): Render
|
|||
|
||||
if (charIndex >= len && !lastCharacterMappingDefined && part.isPseudoAfter()) {
|
||||
lastCharacterMappingDefined = true;
|
||||
characterMapping.setColumnInfo(charIndex + 1, partIndex, charOffsetInPart, partAbsoluteOffset);
|
||||
characterMapping.setColumnInfo(charIndex + 1, partIndex, charOffsetInPart, charHorizontalOffset);
|
||||
}
|
||||
|
||||
sb.appendASCIIString('</span>');
|
||||
|
@ -1107,7 +1116,7 @@ function _renderLine(input: ResolvedRenderLineInput, sb: IStringBuilder): Render
|
|||
if (!lastCharacterMappingDefined) {
|
||||
// When getting client rects for the last character, we will position the
|
||||
// text range at the end of the span, insteaf of at the beginning of next span
|
||||
characterMapping.setColumnInfo(len + 1, parts.length - 1, charOffsetInPart, partAbsoluteOffset);
|
||||
characterMapping.setColumnInfo(len + 1, parts.length - 1, charOffsetInPart, charHorizontalOffset);
|
||||
}
|
||||
|
||||
if (isOverflowing) {
|
||||
|
|
|
@ -251,4 +251,11 @@ suite('Editor Modes - Link Computer', () => {
|
|||
' https://zh.wikipedia.org/wiki/“常凯申”误译事件 '
|
||||
);
|
||||
});
|
||||
|
||||
test('issue #150905: Colon after bare hyperlink is treated as its part', () => {
|
||||
assertLink(
|
||||
'https://site.web/page.html: blah blah blah',
|
||||
'https://site.web/page.html '
|
||||
);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -131,4 +131,42 @@ suite('ModelService', () => {
|
|||
]));
|
||||
assert.deepStrictEqual(result.toString(), expected.toString());
|
||||
});
|
||||
|
||||
test('issue #149130: vscode freezes because of Bracket Pair Colorization', () => {
|
||||
const languageId = 'q';
|
||||
disposables.add(languageService.registerLanguage({ id: languageId }));
|
||||
const legend = {
|
||||
tokenTypes: ['st0', 'st1', 'st2', 'st3', 'st4', 'st5'],
|
||||
tokenModifiers: ['stm0', 'stm1', 'stm2']
|
||||
};
|
||||
instantiationService.stub(IThemeService, <Partial<IThemeService>>{
|
||||
getColorTheme() {
|
||||
return {
|
||||
getTokenStyleMetadata: (tokenType, tokenModifiers, languageId): ITokenStyle => {
|
||||
return {
|
||||
foreground: parseInt(tokenType.substr(2), 10),
|
||||
bold: undefined,
|
||||
underline: undefined,
|
||||
strikethrough: undefined,
|
||||
italic: undefined
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
});
|
||||
const styling = instantiationService.createInstance(SemanticTokensProviderStyling, legend);
|
||||
const badTokens = {
|
||||
data: new Uint32Array([
|
||||
0, 11, 1, 1, 0,
|
||||
0, 4, 1, 1, 0,
|
||||
0, 4294967289, 1, 1, 0
|
||||
])
|
||||
};
|
||||
const result = toMultilineTokens2(badTokens, styling, languageId);
|
||||
const expected = SparseMultilineTokens.create(1, new Uint32Array([
|
||||
0, 11, 12, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (1 << MetadataConsts.FOREGROUND_OFFSET)),
|
||||
0, 15, 16, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (1 << MetadataConsts.FOREGROUND_OFFSET)),
|
||||
]));
|
||||
assert.deepStrictEqual(result.toString(), expected.toString());
|
||||
});
|
||||
});
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -88,7 +88,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl
|
|||
if (!this.galleryService.isEnabled()) {
|
||||
throw new ExtensionManagementError(nls.localize('MarketPlaceDisabled', "Marketplace is not enabled"), ExtensionManagementErrorCode.Internal);
|
||||
}
|
||||
const compatible = await this.checkAndGetCompatibleVersion(extension, !options.installGivenVersion, !!options.installPreReleaseVersion);
|
||||
const compatible = await this.checkAndGetCompatibleVersion(extension, !!options.installGivenVersion, !!options.installPreReleaseVersion);
|
||||
return await this.installExtension(compatible.manifest, compatible.extension, options);
|
||||
} catch (error) {
|
||||
reportTelemetry(this.telemetryService, 'extensionGallery:install', { extensionData: getGalleryExtensionTelemetryData(extension), error });
|
||||
|
@ -336,7 +336,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl
|
|||
const isDependency = dependecies.some(id => areSameExtensions({ id }, galleryExtension.identifier));
|
||||
let compatible;
|
||||
try {
|
||||
compatible = await this.checkAndGetCompatibleVersion(galleryExtension, true, installPreRelease);
|
||||
compatible = await this.checkAndGetCompatibleVersion(galleryExtension, false, installPreRelease);
|
||||
} catch (error) {
|
||||
if (error instanceof ExtensionManagementError && error.code === ExtensionManagementErrorCode.IncompatibleTargetPlatform && !isDependency) {
|
||||
this.logService.info('Skipping the packed extension as it cannot be installed', galleryExtension.identifier.id);
|
||||
|
@ -357,7 +357,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl
|
|||
return allDependenciesAndPacks.filter(e => !installed.some(i => areSameExtensions(i.identifier, e.gallery.identifier)));
|
||||
}
|
||||
|
||||
private async checkAndGetCompatibleVersion(extension: IGalleryExtension, fetchCompatibleVersion: boolean, installPreRelease: boolean): Promise<{ extension: IGalleryExtension; manifest: IExtensionManifest }> {
|
||||
private async checkAndGetCompatibleVersion(extension: IGalleryExtension, sameVersion: boolean, installPreRelease: boolean): Promise<{ extension: IGalleryExtension; manifest: IExtensionManifest }> {
|
||||
const report = await this.getExtensionsControlManifest();
|
||||
if (getMaliciousExtensionsSet(report).has(extension.identifier.id)) {
|
||||
throw new ExtensionManagementError(nls.localize('malicious extension', "Can't install '{0}' extension since it was reported to be problematic.", extension.identifier.id), ExtensionManagementErrorCode.Malicious);
|
||||
|
@ -368,9 +368,9 @@ export abstract class AbstractExtensionManagementService extends Disposable impl
|
|||
throw new ExtensionManagementError(nls.localize('incompatible platform', "The '{0}' extension is not available in {1} for {2}.", extension.identifier.id, this.productService.nameLong, TargetPlatformToString(targetPlatform)), ExtensionManagementErrorCode.IncompatibleTargetPlatform);
|
||||
}
|
||||
|
||||
const compatibleExtension = await this.getCompatibleVersion(extension, fetchCompatibleVersion, installPreRelease);
|
||||
const compatibleExtension = await this.getCompatibleVersion(extension, sameVersion, installPreRelease);
|
||||
if (compatibleExtension) {
|
||||
if (installPreRelease && fetchCompatibleVersion && extension.hasPreReleaseVersion && !compatibleExtension.properties.isPreReleaseVersion) {
|
||||
if (installPreRelease && !sameVersion && extension.hasPreReleaseVersion && !compatibleExtension.properties.isPreReleaseVersion) {
|
||||
throw new ExtensionManagementError(nls.localize('notFoundCompatiblePrereleaseDependency', "Can't install pre-release version of '{0}' extension because it is not compatible with the current version of {1} (version {2}).", extension.identifier.id, this.productService.nameLong, this.productService.version), ExtensionManagementErrorCode.IncompatiblePreRelease);
|
||||
}
|
||||
} else {
|
||||
|
@ -394,11 +394,11 @@ export abstract class AbstractExtensionManagementService extends Disposable impl
|
|||
return { extension: compatibleExtension, manifest };
|
||||
}
|
||||
|
||||
protected async getCompatibleVersion(extension: IGalleryExtension, fetchCompatibleVersion: boolean, includePreRelease: boolean): Promise<IGalleryExtension | null> {
|
||||
protected async getCompatibleVersion(extension: IGalleryExtension, sameVersion: boolean, includePreRelease: boolean): Promise<IGalleryExtension | null> {
|
||||
const targetPlatform = await this.getTargetPlatform();
|
||||
let compatibleExtension: IGalleryExtension | null = null;
|
||||
|
||||
if (fetchCompatibleVersion && extension.hasPreReleaseVersion && extension.properties.isPreReleaseVersion !== includePreRelease) {
|
||||
if (!sameVersion && extension.hasPreReleaseVersion && extension.properties.isPreReleaseVersion !== includePreRelease) {
|
||||
compatibleExtension = (await this.galleryService.getExtensions([{ ...extension.identifier, preRelease: includePreRelease }], { targetPlatform, compatible: true }, CancellationToken.None))[0] || null;
|
||||
}
|
||||
|
||||
|
@ -406,8 +406,12 @@ export abstract class AbstractExtensionManagementService extends Disposable impl
|
|||
compatibleExtension = extension;
|
||||
}
|
||||
|
||||
if (!compatibleExtension && fetchCompatibleVersion) {
|
||||
compatibleExtension = await this.galleryService.getCompatibleExtension(extension, includePreRelease, targetPlatform);
|
||||
if (!compatibleExtension) {
|
||||
if (sameVersion) {
|
||||
compatibleExtension = (await this.galleryService.getExtensions([{ ...extension.identifier, version: extension.version }], { targetPlatform, compatible: true }, CancellationToken.None))[0] || null;
|
||||
} else {
|
||||
compatibleExtension = await this.galleryService.getCompatibleExtension(extension, includePreRelease, targetPlatform);
|
||||
}
|
||||
}
|
||||
|
||||
return compatibleExtension;
|
||||
|
|
|
@ -237,20 +237,21 @@ const DefaultQueryState: IQueryState = {
|
|||
|
||||
type GalleryServiceQueryClassification = {
|
||||
owner: 'sandy081';
|
||||
readonly filterTypes: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
|
||||
readonly flags: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
|
||||
readonly sortBy: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
|
||||
readonly sortOrder: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
|
||||
readonly pageNumber: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
|
||||
readonly duration: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; 'isMeasurement': true };
|
||||
readonly success: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
|
||||
readonly requestBodySize: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
|
||||
readonly responseBodySize?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
|
||||
readonly statusCode?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
|
||||
readonly errorCode?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
|
||||
readonly count?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
|
||||
readonly source?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
|
||||
readonly searchTextLength?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
|
||||
comment: 'Information about Marketplace query and its response';
|
||||
readonly filterTypes: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Filter types used in the query.' };
|
||||
readonly flags: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Flags passed in the query.' };
|
||||
readonly sortBy: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'sorted by option passed in the query' };
|
||||
readonly sortOrder: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'sort order option passed in the query' };
|
||||
readonly pageNumber: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'requested page number in the query' };
|
||||
readonly duration: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; 'isMeasurement': true; comment: 'amount of time taken by the query request' };
|
||||
readonly success: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'whether the query reques is success or not' };
|
||||
readonly requestBodySize: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'size of the request body' };
|
||||
readonly responseBodySize?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'size of the response body' };
|
||||
readonly statusCode?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'status code of the response' };
|
||||
readonly errorCode?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'error code of the response' };
|
||||
readonly count?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'total number of extensions matching the query' };
|
||||
readonly source?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'source that requested this query, eg., recommendations, viewlet' };
|
||||
readonly searchTextLength?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'length of the search text in the query' };
|
||||
};
|
||||
|
||||
type QueryTelemetryData = {
|
||||
|
@ -275,8 +276,9 @@ type GalleryServiceQueryEvent = QueryTelemetryData & {
|
|||
|
||||
type GalleryServiceAdditionalQueryClassification = {
|
||||
owner: 'sandy081';
|
||||
readonly duration: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; 'isMeasurement': true };
|
||||
readonly count: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
|
||||
comment: 'Response information about the additional query to the Marketplace for fetching all versions to get release version';
|
||||
readonly duration: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; 'isMeasurement': true; comment: 'Amount of time taken by the additional query' };
|
||||
readonly count: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Total number of extensions returned by this additional query' };
|
||||
};
|
||||
|
||||
type GalleryServiceAdditionalQueryEvent = {
|
||||
|
@ -1134,8 +1136,9 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi
|
|||
const message = getErrorMessage(err);
|
||||
type GalleryServiceCDNFallbackClassification = {
|
||||
owner: 'sandy081';
|
||||
url: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
|
||||
message: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
|
||||
comment: 'Fallback request information when the primary asset request to CDN fails';
|
||||
url: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'asset url that failed' };
|
||||
message: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'error message' };
|
||||
};
|
||||
type GalleryServiceCDNFallbackEvent = {
|
||||
url: string;
|
||||
|
|
|
@ -28,8 +28,9 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
|||
|
||||
type ExeExtensionRecommendationsClassification = {
|
||||
owner: 'sandy081';
|
||||
extensionId: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' };
|
||||
exeName: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' };
|
||||
comment: 'Information about executable based extension recommendation';
|
||||
extensionId: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight'; comment: 'id of the recommended extension' };
|
||||
exeName: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight'; comment: 'name of the executable for which extension is being recommended' };
|
||||
};
|
||||
|
||||
type IExeBasedExtensionTips = {
|
||||
|
|
|
@ -17,9 +17,10 @@ import { DBClosedError, IndexedDB } from 'vs/base/browser/indexedDB';
|
|||
|
||||
export type IndexedDBFileSystemProviderErrorDataClassification = {
|
||||
owner: 'sandy081';
|
||||
readonly scheme: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
|
||||
readonly operation: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
|
||||
readonly code: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' };
|
||||
comment: 'Information about errors that occur in the IndexedDB file system provider';
|
||||
readonly scheme: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'IndexedDB file system provider scheme for which this error occurred' };
|
||||
readonly operation: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'operation during which this error occurred' };
|
||||
readonly code: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; comment: 'error code' };
|
||||
};
|
||||
|
||||
export type IndexedDBFileSystemProviderErrorData = {
|
||||
|
|
|
@ -28,9 +28,10 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
|||
import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity';
|
||||
import { Change, getLastSyncResourceUri, IRemoteUserData, IResourcePreview as IBaseResourcePreview, ISyncData, ISyncResourceHandle, ISyncResourcePreview as IBaseSyncResourcePreview, IUserData, IUserDataInitializer, IUserDataManifest, IUserDataSyncBackupStoreService, IUserDataSyncConfiguration, IUserDataSynchroniser, IUserDataSyncLogService, IUserDataSyncEnablementService, IUserDataSyncStoreService, IUserDataSyncUtilService, MergeState, PREVIEW_DIR_NAME, SyncResource, SyncStatus, UserDataSyncError, UserDataSyncErrorCode, USER_DATA_SYNC_CONFIGURATION_SCOPE, USER_DATA_SYNC_SCHEME } from 'vs/platform/userDataSync/common/userDataSync';
|
||||
|
||||
type SyncSourceClassification = {
|
||||
type IncompatibleSyncSourceClassification = {
|
||||
owner: 'sandy081';
|
||||
source?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
|
||||
comment: 'Information about the sync resource that is incompatible';
|
||||
source: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'settings sync resource. eg., settings, keybindings...' };
|
||||
};
|
||||
|
||||
export function isSyncData(thing: any): thing is ISyncData {
|
||||
|
@ -168,15 +169,6 @@ export abstract class AbstractSynchroniser extends Disposable implements IUserDa
|
|||
|
||||
protected setStatus(status: SyncStatus): void {
|
||||
if (this._status !== status) {
|
||||
const oldStatus = this._status;
|
||||
if (status === SyncStatus.HasConflicts) {
|
||||
// Log to telemetry when there is a sync conflict
|
||||
this.telemetryService.publicLog2<{ source: string }, SyncSourceClassification>('sync/conflictsDetected', { source: this.resource });
|
||||
}
|
||||
if (oldStatus === SyncStatus.HasConflicts && status === SyncStatus.Idle) {
|
||||
// Log to telemetry when conflicts are resolved
|
||||
this.telemetryService.publicLog2<{ source: string }, SyncSourceClassification>('sync/conflictsResolved', { source: this.resource });
|
||||
}
|
||||
this._status = status;
|
||||
this._onDidChangStatus.fire(status);
|
||||
}
|
||||
|
@ -306,7 +298,7 @@ export abstract class AbstractSynchroniser extends Disposable implements IUserDa
|
|||
private async performSync(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, apply: boolean, userDataSyncConfiguration: IUserDataSyncConfiguration): Promise<SyncStatus> {
|
||||
if (remoteUserData.syncData && remoteUserData.syncData.version > this.version) {
|
||||
// current version is not compatible with cloud version
|
||||
this.telemetryService.publicLog2<{ source: string }, SyncSourceClassification>('sync/incompatible', { source: this.resource });
|
||||
this.telemetryService.publicLog2<{ source: string }, IncompatibleSyncSourceClassification>('sync/incompatible', { source: this.resource });
|
||||
throw new UserDataSyncError(localize({ key: 'incompatible', comment: ['This is an error while syncing a resource that its local version is not compatible with its remote version.'] }, "Cannot sync {0} as its local version {1} is not compatible with its remote version {2}", this.resource, this.version, remoteUserData.syncData.version), UserDataSyncErrorCode.IncompatibleLocalContent, this.resource);
|
||||
}
|
||||
|
||||
|
|
|
@ -23,13 +23,15 @@ import { IUserDataSyncMachinesService } from 'vs/platform/userDataSync/common/us
|
|||
|
||||
type AutoSyncClassification = {
|
||||
owner: 'sandy081';
|
||||
sources: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
|
||||
comment: 'Information about the sources triggering auto sync';
|
||||
sources: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Source that triggered auto sync' };
|
||||
};
|
||||
|
||||
type AutoSyncErrorClassification = {
|
||||
owner: 'sandy081';
|
||||
code: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
|
||||
service: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
|
||||
comment: 'Information about the error that causes auto sync to fail';
|
||||
code: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'error code' };
|
||||
service: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Settings sync service for which this error has occurred' };
|
||||
};
|
||||
|
||||
const disableMachineEventuallyKey = 'sync.disableMachineEventually';
|
||||
|
@ -196,7 +198,7 @@ export class UserDataAutoSyncService extends Disposable implements IUserDataAuto
|
|||
|
||||
// Reset
|
||||
if (everywhere) {
|
||||
this.telemetryService.publicLog2<{}, { owner: 'sandy081' }>('sync/turnOffEveryWhere');
|
||||
this.telemetryService.publicLog2<{}, { owner: 'sandy081'; comment: 'Reporting when settings sync is turned off in all devices' }>('sync/turnOffEveryWhere');
|
||||
await this.userDataSyncService.reset();
|
||||
} else {
|
||||
await this.userDataSyncService.resetLocal();
|
||||
|
|
|
@ -13,7 +13,8 @@ import { ALL_SYNC_RESOURCES, getEnablementKey, IUserDataSyncEnablementService, I
|
|||
|
||||
type SyncEnablementClassification = {
|
||||
owner: 'sandy081';
|
||||
enabled?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
|
||||
comment: 'Reporting when Settings Sync is turned on or off';
|
||||
enabled?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Flag indicating if settings sync is enabled or not' };
|
||||
};
|
||||
|
||||
const enablementKey = 'sync.enable';
|
||||
|
|
|
@ -29,12 +29,13 @@ import { ALL_SYNC_RESOURCES, Change, createSyncHeaders, IManualSyncTask, IResour
|
|||
|
||||
type SyncErrorClassification = {
|
||||
owner: 'sandy081';
|
||||
code: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
|
||||
service: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
|
||||
serverCode?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
|
||||
url?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
|
||||
resource?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
|
||||
executionId?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
|
||||
comment: 'Information about the error that occurred while syncing';
|
||||
code: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'error code' };
|
||||
service: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Settings Sync service for which this error has occurred' };
|
||||
serverCode?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Settings Sync service error code' };
|
||||
url?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Settings Sync resource URL for which this error has occurred' };
|
||||
resource?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Settings Sync resource for which this error has occurred' };
|
||||
executionId?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Settings Sync execution id for which this error has occurred' };
|
||||
};
|
||||
|
||||
const LAST_SYNC_TIME_KEY = 'sync.lastSyncTime';
|
||||
|
|
|
@ -11,7 +11,7 @@ import { join, delimiter } from 'vs/base/common/path';
|
|||
import { VSBuffer } from 'vs/base/common/buffer';
|
||||
import { IRemoteConsoleLog } from 'vs/base/common/console';
|
||||
import { Emitter, Event } from 'vs/base/common/event';
|
||||
import { NodeSocket, WebSocketNodeSocket } from 'vs/base/parts/ipc/node/ipc.net';
|
||||
import { createRandomIPCHandle, NodeSocket, WebSocketNodeSocket } from 'vs/base/parts/ipc/node/ipc.net';
|
||||
import { getResolvedShellEnv } from 'vs/platform/shell/node/shellEnv';
|
||||
import { ILogService } from 'vs/platform/log/common/log';
|
||||
import { IRemoteExtensionHostStartParams } from 'vs/platform/remote/common/remoteAgentConnection';
|
||||
|
@ -21,6 +21,7 @@ import { IProcessEnvironment, isWindows } from 'vs/base/common/platform';
|
|||
import { logRemoteEntry } from 'vs/workbench/services/extensions/common/remoteConsoleUtil';
|
||||
import { removeDangerousEnvVariables } from 'vs/base/common/processes';
|
||||
import { IExtensionHostStatusService } from 'vs/server/node/extensionHostStatusService';
|
||||
import { DisposableStore, toDisposable } from 'vs/base/common/lifecycle';
|
||||
|
||||
export async function buildUserEnvironment(startParamsEnv: { [key: string]: string | null } = {}, withUserShellEnvironment: boolean, language: string, isDebug: boolean, environmentService: IServerEnvironmentService, logService: ILogService): Promise<IProcessEnvironment> {
|
||||
const nlsConfig = await getNLSConfiguration(language, environmentService.userDataPath);
|
||||
|
@ -44,7 +45,6 @@ export async function buildUserEnvironment(startParamsEnv: { [key: string]: stri
|
|||
VSCODE_AMD_ENTRYPOINT: 'vs/workbench/api/node/extensionHostProcess',
|
||||
VSCODE_PIPE_LOGGING: 'true',
|
||||
VSCODE_VERBOSE_LOGGING: 'true',
|
||||
VSCODE_EXTHOST_WILL_SEND_SOCKET: 'true',
|
||||
VSCODE_HANDLES_UNCAUGHT_ERRORS: 'true',
|
||||
VSCODE_LOG_STACK: 'false',
|
||||
VSCODE_NLS_CONFIG: JSON.stringify(nlsConfig, undefined, 0)
|
||||
|
@ -73,21 +73,36 @@ export async function buildUserEnvironment(startParamsEnv: { [key: string]: stri
|
|||
|
||||
class ConnectionData {
|
||||
constructor(
|
||||
public readonly socket: net.Socket,
|
||||
public readonly socketDrain: Promise<void>,
|
||||
public readonly initialDataChunk: VSBuffer,
|
||||
public readonly skipWebSocketFrames: boolean,
|
||||
public readonly permessageDeflate: boolean,
|
||||
public readonly inflateBytes: VSBuffer,
|
||||
public readonly socket: NodeSocket | WebSocketNodeSocket,
|
||||
public readonly initialDataChunk: VSBuffer
|
||||
) { }
|
||||
|
||||
public socketDrain(): Promise<void> {
|
||||
return this.socket.drain();
|
||||
}
|
||||
|
||||
public toIExtHostSocketMessage(): IExtHostSocketMessage {
|
||||
|
||||
let skipWebSocketFrames: boolean;
|
||||
let permessageDeflate: boolean;
|
||||
let inflateBytes: VSBuffer;
|
||||
|
||||
if (this.socket instanceof NodeSocket) {
|
||||
skipWebSocketFrames = true;
|
||||
permessageDeflate = false;
|
||||
inflateBytes = VSBuffer.alloc(0);
|
||||
} else {
|
||||
skipWebSocketFrames = false;
|
||||
permessageDeflate = this.socket.permessageDeflate;
|
||||
inflateBytes = this.socket.recordedInflateBytes;
|
||||
}
|
||||
|
||||
return {
|
||||
type: 'VSCODE_EXTHOST_IPC_SOCKET',
|
||||
initialDataChunk: (<Buffer>this.initialDataChunk.buffer).toString('base64'),
|
||||
skipWebSocketFrames: this.skipWebSocketFrames,
|
||||
permessageDeflate: this.permessageDeflate,
|
||||
inflateBytes: (<Buffer>this.inflateBytes.buffer).toString('base64'),
|
||||
skipWebSocketFrames: skipWebSocketFrames,
|
||||
permessageDeflate: permessageDeflate,
|
||||
inflateBytes: (<Buffer>inflateBytes.buffer).toString('base64'),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -97,6 +112,7 @@ export class ExtensionHostConnection {
|
|||
private _onClose = new Emitter<void>();
|
||||
readonly onClose: Event<void> = this._onClose.event;
|
||||
|
||||
private readonly _canSendSocket: boolean;
|
||||
private _disposed: boolean;
|
||||
private _remoteAddress: string;
|
||||
private _extensionHostProcess: cp.ChildProcess | null;
|
||||
|
@ -111,10 +127,11 @@ export class ExtensionHostConnection {
|
|||
@ILogService private readonly _logService: ILogService,
|
||||
@IExtensionHostStatusService private readonly _extensionHostStatusService: IExtensionHostStatusService,
|
||||
) {
|
||||
this._canSendSocket = (!isWindows || !this._environmentService.args['socket-path']);
|
||||
this._disposed = false;
|
||||
this._remoteAddress = remoteAddress;
|
||||
this._extensionHostProcess = null;
|
||||
this._connectionData = ExtensionHostConnection._toConnectionData(socket, initialDataChunk);
|
||||
this._connectionData = new ConnectionData(socket, initialDataChunk);
|
||||
|
||||
this._log(`New connection established.`);
|
||||
}
|
||||
|
@ -131,19 +148,46 @@ export class ExtensionHostConnection {
|
|||
this._logService.error(`${this._logPrefix}${_str}`);
|
||||
}
|
||||
|
||||
private static _toConnectionData(socket: NodeSocket | WebSocketNodeSocket, initialDataChunk: VSBuffer): ConnectionData {
|
||||
if (socket instanceof NodeSocket) {
|
||||
return new ConnectionData(socket.socket, socket.drain(), initialDataChunk, true, false, VSBuffer.alloc(0));
|
||||
} else {
|
||||
return new ConnectionData(socket.socket.socket, socket.drain(), initialDataChunk, false, socket.permessageDeflate, socket.recordedInflateBytes);
|
||||
private async _pipeSockets(extHostSocket: net.Socket, connectionData: ConnectionData): Promise<void> {
|
||||
|
||||
const disposables = new DisposableStore();
|
||||
disposables.add(connectionData.socket);
|
||||
disposables.add(toDisposable(() => {
|
||||
extHostSocket.destroy();
|
||||
}));
|
||||
|
||||
const stopAndCleanup = () => {
|
||||
disposables.dispose();
|
||||
};
|
||||
|
||||
disposables.add(connectionData.socket.onEnd(stopAndCleanup));
|
||||
disposables.add(connectionData.socket.onClose(stopAndCleanup));
|
||||
|
||||
disposables.add(Event.fromNodeEventEmitter<void>(extHostSocket, 'end')(stopAndCleanup));
|
||||
disposables.add(Event.fromNodeEventEmitter<void>(extHostSocket, 'close')(stopAndCleanup));
|
||||
disposables.add(Event.fromNodeEventEmitter<void>(extHostSocket, 'error')(stopAndCleanup));
|
||||
|
||||
disposables.add(connectionData.socket.onData((e) => extHostSocket.write(e.buffer)));
|
||||
disposables.add(Event.fromNodeEventEmitter<Buffer>(extHostSocket, 'data')((e) => {
|
||||
connectionData.socket.write(VSBuffer.wrap(e));
|
||||
}));
|
||||
|
||||
if (connectionData.initialDataChunk.byteLength > 0) {
|
||||
extHostSocket.write(connectionData.initialDataChunk.buffer);
|
||||
}
|
||||
}
|
||||
|
||||
private async _sendSocketToExtensionHost(extensionHostProcess: cp.ChildProcess, connectionData: ConnectionData): Promise<void> {
|
||||
// Make sure all outstanding writes have been drained before sending the socket
|
||||
await connectionData.socketDrain;
|
||||
await connectionData.socketDrain();
|
||||
const msg = connectionData.toIExtHostSocketMessage();
|
||||
extensionHostProcess.send(msg, connectionData.socket);
|
||||
let socket: net.Socket;
|
||||
if (connectionData.socket instanceof NodeSocket) {
|
||||
socket = connectionData.socket.socket;
|
||||
} else {
|
||||
socket = connectionData.socket.socket.socket;
|
||||
}
|
||||
extensionHostProcess.send(msg, socket);
|
||||
}
|
||||
|
||||
public shortenReconnectionGraceTimeIfNecessary(): void {
|
||||
|
@ -159,7 +203,7 @@ export class ExtensionHostConnection {
|
|||
public acceptReconnection(remoteAddress: string, _socket: NodeSocket | WebSocketNodeSocket, initialDataChunk: VSBuffer): void {
|
||||
this._remoteAddress = remoteAddress;
|
||||
this._log(`The client has reconnected.`);
|
||||
const connectionData = ExtensionHostConnection._toConnectionData(_socket, initialDataChunk);
|
||||
const connectionData = new ConnectionData(_socket, initialDataChunk);
|
||||
|
||||
if (!this._extensionHostProcess) {
|
||||
// The extension host didn't even start up yet
|
||||
|
@ -197,6 +241,17 @@ export class ExtensionHostConnection {
|
|||
const env = await buildUserEnvironment(startParams.env, true, startParams.language, !!startParams.debugId, this._environmentService, this._logService);
|
||||
removeDangerousEnvVariables(env);
|
||||
|
||||
let extHostNamedPipeServer: net.Server | null;
|
||||
|
||||
if (this._canSendSocket) {
|
||||
env['VSCODE_EXTHOST_WILL_SEND_SOCKET'] = 'true';
|
||||
extHostNamedPipeServer = null;
|
||||
} else {
|
||||
const { namedPipeServer, pipeName } = await this._listenOnPipe();
|
||||
env['VSCODE_IPC_HOOK_EXTHOST'] = pipeName;
|
||||
extHostNamedPipeServer = namedPipeServer;
|
||||
}
|
||||
|
||||
const opts = {
|
||||
env,
|
||||
execArgv,
|
||||
|
@ -240,14 +295,21 @@ export class ExtensionHostConnection {
|
|||
this._cleanResources();
|
||||
});
|
||||
|
||||
const messageListener = (msg: IExtHostReadyMessage) => {
|
||||
if (msg.type === 'VSCODE_EXTHOST_IPC_READY') {
|
||||
this._extensionHostProcess!.removeListener('message', messageListener);
|
||||
this._sendSocketToExtensionHost(this._extensionHostProcess!, this._connectionData!);
|
||||
this._connectionData = null;
|
||||
}
|
||||
};
|
||||
this._extensionHostProcess.on('message', messageListener);
|
||||
if (extHostNamedPipeServer) {
|
||||
extHostNamedPipeServer.on('connection', (socket) => {
|
||||
extHostNamedPipeServer!.close();
|
||||
this._pipeSockets(socket, this._connectionData!);
|
||||
});
|
||||
} else {
|
||||
const messageListener = (msg: IExtHostReadyMessage) => {
|
||||
if (msg.type === 'VSCODE_EXTHOST_IPC_READY') {
|
||||
this._extensionHostProcess!.removeListener('message', messageListener);
|
||||
this._sendSocketToExtensionHost(this._extensionHostProcess!, this._connectionData!);
|
||||
this._connectionData = null;
|
||||
}
|
||||
};
|
||||
this._extensionHostProcess.on('message', messageListener);
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.error('ExtensionHostConnection errored');
|
||||
|
@ -256,6 +318,21 @@ export class ExtensionHostConnection {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
private _listenOnPipe(): Promise<{ pipeName: string; namedPipeServer: net.Server }> {
|
||||
return new Promise<{ pipeName: string; namedPipeServer: net.Server }>((resolve, reject) => {
|
||||
const pipeName = createRandomIPCHandle();
|
||||
|
||||
const namedPipeServer = net.createServer();
|
||||
namedPipeServer.on('error', reject);
|
||||
namedPipeServer.listen(pipeName, () => {
|
||||
if (namedPipeServer) {
|
||||
namedPipeServer.removeListener('error', reject);
|
||||
}
|
||||
resolve({ pipeName, namedPipeServer });
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function readCaseInsensitive(env: { [key: string]: string | undefined }, key: string): string | undefined {
|
||||
|
|
|
@ -210,7 +210,9 @@ function _createExtHostProtocol(): Promise<IMessagePassingProtocol> {
|
|||
|
||||
const socket = net.createConnection(pipeName, () => {
|
||||
socket.removeListener('error', reject);
|
||||
resolve(new PersistentProtocol(new NodeSocket(socket, 'extHost-renderer')));
|
||||
const protocol = new PersistentProtocol(new NodeSocket(socket, 'extHost-renderer'));
|
||||
protocol.sendResume();
|
||||
resolve(protocol);
|
||||
});
|
||||
socket.once('error', reject);
|
||||
|
||||
|
|
|
@ -152,7 +152,7 @@ export class FloatingClickWidget extends Widget implements IOverlayWidget {
|
|||
super();
|
||||
|
||||
this._domNode = $('.floating-click-widget');
|
||||
this._domNode.style.padding = '10px';
|
||||
this._domNode.style.padding = '6px 11px';
|
||||
this._domNode.style.cursor = 'pointer';
|
||||
|
||||
if (keyBindingAction) {
|
||||
|
|
|
@ -46,6 +46,13 @@
|
|||
justify-content: left;
|
||||
}
|
||||
|
||||
.monaco-workbench.web.safari .part.titlebar,
|
||||
.monaco-workbench.web.safari .part.titlebar>.titlebar-container {
|
||||
/* Must be scoped to safari due to #148851 */
|
||||
/* Is required in safari due to #149476 */
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
/* Draggable region */
|
||||
.monaco-workbench .part.titlebar>.titlebar-container>.titlebar-drag-region {
|
||||
top: 0;
|
||||
|
|
|
@ -1089,10 +1089,10 @@ class TreeRenderer extends Disposable implements ITreeRenderer<ITreeItem, FuzzyS
|
|||
return false;
|
||||
}
|
||||
|
||||
if (hasResource && (this.isFileKindThemeIcon(icon) || !this.shouldShowFileIcons())) {
|
||||
return false;
|
||||
} else if (hasResource && (this.isFolderThemeIcon(icon) || !this.shouldShowFolderIcons())) {
|
||||
return false;
|
||||
if (hasResource && this.isFileKindThemeIcon(icon)) {
|
||||
return !this.shouldShowFileIcons();
|
||||
} else if (hasResource && this.isFolderThemeIcon(icon)) {
|
||||
return !this.shouldShowFolderIcons();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -51,7 +51,7 @@ export interface IViewPaneOptions extends IPaneOptions {
|
|||
}
|
||||
|
||||
type WelcomeActionClassification = {
|
||||
owner: 'sandy081';
|
||||
owner: 'joaomoreno';
|
||||
viewId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
|
||||
uri: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
|
||||
};
|
||||
|
|
|
@ -820,12 +820,6 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer {
|
|||
// Check if view is active
|
||||
if (this.viewContainerModel.activeViewDescriptors.some(viewDescriptor => viewDescriptor.id === viewId)) {
|
||||
const visible = !this.viewContainerModel.isVisible(viewId);
|
||||
type ViewsToggleVisibilityClassification = {
|
||||
owner: 'sandy081';
|
||||
viewId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
|
||||
visible: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
|
||||
};
|
||||
this.telemetryService.publicLog2<{ viewId: String; visible: boolean }, ViewsToggleVisibilityClassification>('views.toggleVisibility', { viewId, visible });
|
||||
this.viewContainerModel.setVisible(viewId, visible);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,8 +17,9 @@ import { localize } from 'vs/nls';
|
|||
|
||||
type DynamicWorkspaceRecommendationsClassification = {
|
||||
owner: 'sandy081';
|
||||
count: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
|
||||
cache: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
|
||||
comment: 'Information about recommendations by scanning the workspace';
|
||||
count: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Total number of extensions those are recommended' };
|
||||
cache: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Flag if extensions are recommended from cache or not' };
|
||||
};
|
||||
|
||||
type IStoredDynamicWorkspaceRecommendations = { recommendations: string[]; timestamp: number };
|
||||
|
|
|
@ -28,14 +28,16 @@ import { IExtensionIgnoredRecommendationsService } from 'vs/workbench/services/e
|
|||
|
||||
type ExtensionRecommendationsNotificationClassification = {
|
||||
owner: 'sandy081';
|
||||
userReaction: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
|
||||
extensionId?: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' };
|
||||
source: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
|
||||
comment: 'Response information when an extension is recommended';
|
||||
userReaction: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'User reaction after showing the recommendation prompt. Eg., install, cancel, show, neverShowAgain' };
|
||||
extensionId?: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight'; comment: 'Id of the extension that is recommended' };
|
||||
source: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The source from which this recommendation is coming from. Eg., file, exe.,' };
|
||||
};
|
||||
|
||||
type ExtensionWorkspaceRecommendationsNotificationClassification = {
|
||||
owner: 'sandy081';
|
||||
userReaction: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
|
||||
comment: 'Response information when a recommendation from workspace is recommended';
|
||||
userReaction: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'User reaction after showing the recommendation prompt. Eg., install, cancel, show, neverShowAgain' };
|
||||
};
|
||||
|
||||
const ignoreImportantExtensionRecommendationStorageKey = 'extensionsAssistant/importantRecommendationsIgnore';
|
||||
|
|
|
@ -30,8 +30,9 @@ import { areSameExtensions } from 'vs/platform/extensionManagement/common/extens
|
|||
|
||||
type IgnoreRecommendationClassification = {
|
||||
owner: 'sandy081';
|
||||
recommendationReason: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
|
||||
extensionId: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' };
|
||||
comment: 'Report when a recommendation is ignored';
|
||||
recommendationReason: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Reason why extension is recommended' };
|
||||
extensionId: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight'; comment: 'Id of the extension recommendation that is being ignored' };
|
||||
};
|
||||
|
||||
export class ExtensionRecommendationsService extends Disposable implements IExtensionRecommendationsService {
|
||||
|
|
|
@ -282,7 +282,7 @@ export abstract class AbstractInstallAction extends ExtensionAction {
|
|||
}
|
||||
|
||||
if (this.extension.deprecationInfo) {
|
||||
let detail = localize('deprecated message', "This extension is deprecated as it is no longer being maintained");
|
||||
let detail = localize('deprecated message', "This extension is deprecated as it is no longer being maintained.");
|
||||
let action: () => Promise<any> = async () => undefined;
|
||||
const buttons = [
|
||||
localize('install anyway', "Install Anyway"),
|
||||
|
@ -2311,7 +2311,7 @@ export class ExtensionStatusAction extends ExtensionAction {
|
|||
const link = `[${localize('settings', "settings")}](${URI.parse(`command:workbench.action.openSettings?${encodeURIComponent(JSON.stringify([this.extension.deprecationInfo.settings.map(setting => `@id:${setting}`).join(' ')]))}`)})`;
|
||||
this.updateStatus({ icon: warningIcon, message: new MarkdownString(localize('deprecated with alternate settings tooltip', "This extension is deprecated as this functionality is now built-in to VS Code. Configure these {0} to use this functionality.", link)) }, true);
|
||||
} else {
|
||||
this.updateStatus({ icon: warningIcon, message: new MarkdownString(localize('deprecated tooltip', "This extension is deprecated as it is no longer being maintained")) }, true);
|
||||
this.updateStatus({ icon: warningIcon, message: new MarkdownString(localize('deprecated tooltip', "This extension is deprecated as it is no longer being maintained.")) }, true);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -214,8 +214,13 @@ export class Renderer implements IPagedRenderer<IExtension, ITemplateData> {
|
|||
|
||||
data.name.textContent = extension.displayName;
|
||||
data.description.textContent = extension.description;
|
||||
data.publisherDisplayName.textContent = extension.publisherDisplayName;
|
||||
data.verifiedPublisherIcon.style.display = extension.publisherDomain?.verified ? 'inherit' : 'none';
|
||||
|
||||
const updatePublisher = () => {
|
||||
data.publisherDisplayName.textContent = extension.publisherDisplayName;
|
||||
data.verifiedPublisherIcon.style.display = extension.publisherDomain?.verified ? 'inherit' : 'none';
|
||||
};
|
||||
updatePublisher();
|
||||
Event.filter(this.extensionsWorkbenchService.onChange, e => !!e && areSameExtensions(e.identifier, extension.identifier))(() => updatePublisher(), this, data.extensionDisposables);
|
||||
|
||||
data.installCount.style.display = '';
|
||||
data.ratings.style.display = '';
|
||||
|
|
|
@ -60,11 +60,6 @@ import { isOfflineError } from 'vs/base/parts/request/common/request';
|
|||
// Extensions that are automatically classified as Programming Language extensions, but should be Feature extensions
|
||||
const FORCE_FEATURE_EXTENSIONS = ['vscode.git', 'vscode.git-base', 'vscode.search-result'];
|
||||
|
||||
type WorkspaceRecommendationsClassification = {
|
||||
owner: 'sandy081';
|
||||
count: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; 'isMeasurement': true };
|
||||
};
|
||||
|
||||
class ExtensionsViewState extends Disposable implements IExtensionsViewState {
|
||||
|
||||
private readonly _onFocus: Emitter<IExtension> = this._register(new Emitter<IExtension>());
|
||||
|
@ -832,7 +827,6 @@ export class ExtensionsListView extends ViewPane {
|
|||
private async getWorkspaceRecommendationsModel(query: Query, options: IQueryOptions, token: CancellationToken): Promise<IPagedModel<IExtension>> {
|
||||
const recommendations = await this.getWorkspaceRecommendations();
|
||||
const installableRecommendations = (await this.getInstallableRecommendations(recommendations, { ...options, source: 'recommendations-workspace' }, token));
|
||||
this.telemetryService.publicLog2<{ count: number }, WorkspaceRecommendationsClassification>('extensionWorkspaceRecommendations:open', { count: installableRecommendations.length });
|
||||
const result: IExtension[] = coalesce(recommendations.map(id => installableRecommendations.find(i => areSameExtensions(i.identifier, { id }))));
|
||||
return new PagedModel(result);
|
||||
}
|
||||
|
|
|
@ -554,7 +554,7 @@ class Extensions extends Disposable {
|
|||
}
|
||||
}
|
||||
|
||||
private onDidInstallExtensions(results: readonly InstallExtensionResult[]): void {
|
||||
private async onDidInstallExtensions(results: readonly InstallExtensionResult[]): Promise<void> {
|
||||
for (const event of results) {
|
||||
const { local, source } = event;
|
||||
const gallery = source && !URI.isUri(source) ? source : undefined;
|
||||
|
@ -577,12 +577,13 @@ class Extensions extends Disposable {
|
|||
if (!extension.gallery) {
|
||||
extension.gallery = gallery;
|
||||
}
|
||||
Extensions.updateExtensionFromControlManifest(extension, await this.server.extensionManagementService.getExtensionsControlManifest());
|
||||
extension.enablementState = this.extensionEnablementService.getEnablementState(local);
|
||||
}
|
||||
}
|
||||
this._onChange.fire(!local || !extension ? undefined : { extension, operation: event.operation });
|
||||
if (extension && extension.local && !extension.gallery) {
|
||||
this.syncInstalledExtensionWithGallery(extension);
|
||||
await this.syncInstalledExtensionWithGallery(extension);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1087,8 +1088,8 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension
|
|||
// Skip if check updates only for builtin extensions and current extension is not builtin.
|
||||
continue;
|
||||
}
|
||||
if (installed.isBuiltin && (!installed.local?.identifier.uuid || this.productService.quality !== 'stable')) {
|
||||
// Skip if the builtin extension does not have Marketplace identifier or the current quality is not stable.
|
||||
if (installed.isBuiltin && (!installed.local?.identifier.uuid || (!isWeb && this.productService.quality === 'stable'))) {
|
||||
// Skip checking updates for a builtin extension if it does not has Marketplace identifier or the current product is VS Code Desktop stable.
|
||||
continue;
|
||||
}
|
||||
infos.push({ ...installed.identifier, preRelease: !!installed.local?.preRelease });
|
||||
|
@ -1246,7 +1247,8 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension
|
|||
throw new Error('Missing gallery');
|
||||
}
|
||||
|
||||
const [gallery] = await this.galleryService.getExtensions([{ id: extension.gallery.identifier.id, version }], CancellationToken.None);
|
||||
const targetPlatform = extension.server ? await extension.server.extensionManagementService.getTargetPlatform() : undefined;
|
||||
const [gallery] = await this.galleryService.getExtensions([{ id: extension.gallery.identifier.id, version }], { targetPlatform }, CancellationToken.None);
|
||||
if (!gallery) {
|
||||
throw new Error(nls.localize('not found', "Unable to install extension '{0}' because the requested version '{1}' is not found.", extension.gallery!.identifier.id, version));
|
||||
}
|
||||
|
|
|
@ -38,8 +38,9 @@ import { areSameExtensions } from 'vs/platform/extensionManagement/common/extens
|
|||
|
||||
type FileExtensionSuggestionClassification = {
|
||||
owner: 'sandy081';
|
||||
userReaction: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
|
||||
fileExtension: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' };
|
||||
comment: 'Response information when a file based reccommendation is suggested';
|
||||
userReaction: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'User reaction after showing the recommendation prompt. Eg., install, cancel, show, neverShowAgain' };
|
||||
fileExtension: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight'; comment: 'Extension of the file for which an extension is being recommended.' };
|
||||
};
|
||||
|
||||
const promptedRecommendationsStorageKey = 'fileBasedRecommendations/promptedRecommendations';
|
||||
|
|
|
@ -192,8 +192,8 @@ export class SaveExtensionHostProfileAction extends Action {
|
|||
|
||||
private async _asyncRun(): Promise<any> {
|
||||
let picked = await this._nativeHostService.showSaveDialog({
|
||||
title: 'Save Extension Host Profile',
|
||||
buttonLabel: 'Save',
|
||||
title: nls.localize('saveprofile.dialogTitle', "Save Extension Host Profile"),
|
||||
buttonLabel: nls.localize('saveprofile.saveButton', "Save"),
|
||||
defaultPath: `CPU-${new Date().toISOString().replace(/[\-:]/g, '')}.cpuprofile`,
|
||||
filters: [{
|
||||
name: 'CPU Profiles',
|
||||
|
|
|
@ -308,23 +308,23 @@ suite('ExtensionsActions', () => {
|
|||
});
|
||||
});
|
||||
|
||||
test('Test Uninstall action after extension is installed', () => {
|
||||
test('Test Uninstall action after extension is installed', async () => {
|
||||
const testObject: ExtensionsActions.UninstallAction = instantiationService.createInstance(ExtensionsActions.UninstallAction);
|
||||
instantiationService.createInstance(ExtensionContainers, [testObject]);
|
||||
const gallery = aGalleryExtension('a');
|
||||
instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));
|
||||
|
||||
return instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None)
|
||||
.then(paged => {
|
||||
testObject.extension = paged.firstPage[0];
|
||||
const paged = await instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None);
|
||||
testObject.extension = paged.firstPage[0];
|
||||
|
||||
installEvent.fire({ identifier: gallery.identifier, source: gallery });
|
||||
didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', gallery, gallery) }]);
|
||||
installEvent.fire({ identifier: gallery.identifier, source: gallery });
|
||||
const promise = Event.toPromise(testObject.onDidChange);
|
||||
didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', gallery, gallery) }]);
|
||||
|
||||
assert.ok(testObject.enabled);
|
||||
assert.strictEqual('Uninstall', testObject.label);
|
||||
assert.strictEqual('extension-action label uninstall', testObject.class);
|
||||
});
|
||||
await promise;
|
||||
assert.ok(testObject.enabled);
|
||||
assert.strictEqual('Uninstall', testObject.label);
|
||||
assert.strictEqual('extension-action label uninstall', testObject.class);
|
||||
});
|
||||
|
||||
test('Test UpdateAction when there is no extension', () => {
|
||||
|
@ -475,22 +475,22 @@ suite('ExtensionsActions', () => {
|
|||
});
|
||||
});
|
||||
|
||||
test('Test ManageExtensionAction when extension is queried from gallery and installed', () => {
|
||||
test('Test ManageExtensionAction when extension is queried from gallery and installed', async () => {
|
||||
const testObject: ExtensionsActions.ManageExtensionAction = instantiationService.createInstance(ExtensionsActions.ManageExtensionAction);
|
||||
instantiationService.createInstance(ExtensionContainers, [testObject]);
|
||||
const gallery = aGalleryExtension('a');
|
||||
instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));
|
||||
|
||||
return instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None)
|
||||
.then(page => {
|
||||
testObject.extension = page.firstPage[0];
|
||||
installEvent.fire({ identifier: gallery.identifier, source: gallery });
|
||||
didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', gallery, gallery) }]);
|
||||
const paged = await instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None);
|
||||
testObject.extension = paged.firstPage[0];
|
||||
installEvent.fire({ identifier: gallery.identifier, source: gallery });
|
||||
const promise = Event.toPromise(testObject.onDidChange);
|
||||
didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', gallery, gallery) }]);
|
||||
|
||||
assert.ok(testObject.enabled);
|
||||
assert.strictEqual('extension-action icon manage codicon codicon-extensions-manage', testObject.class);
|
||||
assert.strictEqual('', testObject.tooltip);
|
||||
});
|
||||
await promise;
|
||||
assert.ok(testObject.enabled);
|
||||
assert.strictEqual('extension-action icon manage codicon codicon-extensions-manage', testObject.class);
|
||||
assert.strictEqual('', testObject.tooltip);
|
||||
});
|
||||
|
||||
test('Test ManageExtensionAction when extension is system extension', () => {
|
||||
|
@ -961,7 +961,9 @@ suite('ReloadAction', () => {
|
|||
assert.ok(!testObject.enabled);
|
||||
|
||||
installEvent.fire({ identifier: gallery.identifier, source: gallery });
|
||||
const promise = Event.toPromise(testObject.onDidChange);
|
||||
didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', gallery, gallery) }]);
|
||||
await promise;
|
||||
assert.ok(testObject.enabled);
|
||||
assert.strictEqual(testObject.tooltip, 'Please reload Visual Studio Code to enable this extension.');
|
||||
});
|
||||
|
@ -1311,8 +1313,10 @@ suite('ReloadAction', () => {
|
|||
assert.ok(!testObject.enabled);
|
||||
|
||||
const remoteExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeRemote }) });
|
||||
const promise = Event.toPromise(testObject.onDidChange);
|
||||
onDidInstallEvent.fire([{ identifier: remoteExtension.identifier, local: remoteExtension, operation: InstallOperation.Install }]);
|
||||
|
||||
await promise;
|
||||
assert.ok(testObject.enabled);
|
||||
assert.strictEqual(testObject.tooltip, 'Please reload Visual Studio Code to enable this extension.');
|
||||
});
|
||||
|
@ -1347,8 +1351,10 @@ suite('ReloadAction', () => {
|
|||
assert.ok(!testObject.enabled);
|
||||
|
||||
const localExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file('pub.a') });
|
||||
const promise = Event.toPromise(Event.filter(testObject.onDidChange, () => testObject.enabled));
|
||||
onDidInstallEvent.fire([{ identifier: localExtension.identifier, local: localExtension, operation: InstallOperation.Install }]);
|
||||
|
||||
await promise;
|
||||
assert.ok(testObject.enabled);
|
||||
assert.strictEqual(testObject.tooltip, 'Please reload Visual Studio Code to enable this extension.');
|
||||
});
|
||||
|
@ -1599,7 +1605,9 @@ suite('RemoteInstallAction', () => {
|
|||
assert.strictEqual('extension-action label install installing', testObject.class);
|
||||
|
||||
const installedExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
|
||||
const promise = Event.toPromise(testObject.onDidChange);
|
||||
onDidInstallEvent.fire([{ identifier: installedExtension.identifier, local: installedExtension, operation: InstallOperation.Install }]);
|
||||
await promise;
|
||||
assert.ok(!testObject.enabled);
|
||||
});
|
||||
|
||||
|
@ -2048,7 +2056,9 @@ suite('LocalInstallAction', () => {
|
|||
assert.strictEqual('extension-action label install installing', testObject.class);
|
||||
|
||||
const installedExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });
|
||||
const promise = Event.toPromise(testObject.onDidChange);
|
||||
onDidInstallEvent.fire([{ identifier: installedExtension.identifier, local: installedExtension, operation: InstallOperation.Install }]);
|
||||
await promise;
|
||||
assert.ok(!testObject.enabled);
|
||||
});
|
||||
|
||||
|
|
|
@ -446,21 +446,19 @@ suite('ExtensionsWorkbenchServiceTest', () => {
|
|||
const gallery = aGalleryExtension('gallery1');
|
||||
testObject = await aWorkbenchService();
|
||||
instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));
|
||||
const target = sinon.spy();
|
||||
|
||||
return testObject.queryGallery(CancellationToken.None).then(page => {
|
||||
const extension = page.firstPage[0];
|
||||
assert.strictEqual(ExtensionState.Uninstalled, extension.state);
|
||||
const page = await testObject.queryGallery(CancellationToken.None);
|
||||
const extension = page.firstPage[0];
|
||||
assert.strictEqual(ExtensionState.Uninstalled, extension.state);
|
||||
|
||||
testObject.install(extension);
|
||||
installEvent.fire({ identifier: gallery.identifier, source: gallery });
|
||||
testObject.onChange(target);
|
||||
testObject.install(extension);
|
||||
installEvent.fire({ identifier: gallery.identifier, source: gallery });
|
||||
const promise = Event.toPromise(testObject.onChange);
|
||||
|
||||
// Installed
|
||||
didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension(gallery.name, gallery, gallery) }]);
|
||||
// Installed
|
||||
didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension(gallery.name, gallery, gallery) }]);
|
||||
|
||||
assert.ok(target.calledOnce);
|
||||
});
|
||||
await promise;
|
||||
});
|
||||
|
||||
test('test onchange event is triggered when installation is finished', async () => {
|
||||
|
|
|
@ -56,7 +56,7 @@
|
|||
}
|
||||
|
||||
.merge-accept-gutter-marker.multi-line .background {
|
||||
border: 2px solid var(--vscode-checkbox-border);
|
||||
border: 1px solid var(--vscode-checkbox-border);
|
||||
border-right: 0;
|
||||
left: 8px;
|
||||
width: 10px;
|
||||
|
|
|
@ -17,6 +17,13 @@ import { MergeEditorInput, MergeEditorInputData } from 'vs/workbench/contrib/mer
|
|||
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
|
||||
import { MergeEditorSerializer } from './mergeEditorSerializer';
|
||||
import { Codicon } from 'vs/base/common/codicons';
|
||||
import { IWorkbenchFileService } from 'vs/workbench/services/files/common/files';
|
||||
import { InMemoryFileSystemProvider } from 'vs/platform/files/common/inMemoryFilesystemProvider';
|
||||
import { VSBuffer } from 'vs/base/common/buffer';
|
||||
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
|
||||
import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput';
|
||||
import { INotificationService } from 'vs/platform/notification/common/notification';
|
||||
import { ITextModelService } from 'vs/editor/common/services/resolverService';
|
||||
|
||||
Registry.as<IEditorPaneRegistry>(EditorExtensions.EditorPane).registerEditorPane(
|
||||
EditorPaneDescriptor.create(
|
||||
|
@ -152,3 +159,132 @@ interface IOpenEditorArgs {
|
|||
input2: MergeEditorInputData;
|
||||
output: URI;
|
||||
}
|
||||
|
||||
registerAction2(class extends Action2 {
|
||||
|
||||
constructor() {
|
||||
super({
|
||||
id: 'merge.dev.copyContents',
|
||||
title: localize('merge.dev.copyContents', "Developer Merge Editor: Copy Contents of Inputs, Base and Result as JSON"),
|
||||
icon: Codicon.layoutCentered,
|
||||
f1: true,
|
||||
});
|
||||
}
|
||||
|
||||
run(accessor: ServicesAccessor): void {
|
||||
const { activeEditorPane } = accessor.get(IEditorService);
|
||||
const clipboardService = accessor.get(IClipboardService);
|
||||
const notificationService = accessor.get(INotificationService);
|
||||
|
||||
if (!(activeEditorPane instanceof MergeEditor)) {
|
||||
notificationService.info({
|
||||
name: localize('mergeEditor.name', 'Merge Editor'),
|
||||
message: localize('mergeEditor.noActiveMergeEditor', "No active merge editor")
|
||||
});
|
||||
return;
|
||||
}
|
||||
const model = activeEditorPane.model;
|
||||
if (!model) {
|
||||
return;
|
||||
}
|
||||
const contents: MergeEditorContents = {
|
||||
languageId: model.result.getLanguageId(),
|
||||
base: model.base.getValue(),
|
||||
input1: model.input1.getValue(),
|
||||
input2: model.input2.getValue(),
|
||||
result: model.result.getValue(),
|
||||
};
|
||||
const jsonStr = JSON.stringify(contents, undefined, 4);
|
||||
clipboardService.writeText(jsonStr);
|
||||
|
||||
notificationService.info({
|
||||
name: localize('mergeEditor.name', 'Merge Editor'),
|
||||
message: localize('mergeEditor.successfullyCopiedMergeEditorContents', "Successfully copied merge editor contents"),
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
registerAction2(class extends Action2 {
|
||||
|
||||
constructor() {
|
||||
super({
|
||||
id: 'merge.dev.openContents',
|
||||
title: localize('merge.dev.openContents', "Developer Merge Editor: Open Contents of Inputs, Base and Result from JSON"),
|
||||
icon: Codicon.layoutCentered,
|
||||
f1: true,
|
||||
});
|
||||
}
|
||||
|
||||
async run(accessor: ServicesAccessor): Promise<void> {
|
||||
const service = accessor.get(IWorkbenchFileService);
|
||||
const instaService = accessor.get(IInstantiationService);
|
||||
const editorService = accessor.get(IEditorService);
|
||||
const inputService = accessor.get(IQuickInputService);
|
||||
const clipboardService = accessor.get(IClipboardService);
|
||||
const textModelService = accessor.get(ITextModelService);
|
||||
|
||||
const result = await inputService.input({
|
||||
prompt: localize('mergeEditor.enterJSON', 'Enter JSON'),
|
||||
value: await clipboardService.readText(),
|
||||
});
|
||||
if (!result) {
|
||||
return;
|
||||
}
|
||||
|
||||
const content: MergeEditorContents = JSON.parse(result);
|
||||
|
||||
const scheme = 'merge-editor-dev';
|
||||
|
||||
let provider = service.getProvider(scheme) as InMemoryFileSystemProvider | undefined;
|
||||
if (!provider) {
|
||||
provider = new InMemoryFileSystemProvider();
|
||||
service.registerProvider(scheme, provider);
|
||||
}
|
||||
|
||||
const baseUri = URI.from({ scheme, path: '/ancestor' });
|
||||
const input1Uri = URI.from({ scheme, path: '/input1' });
|
||||
const input2Uri = URI.from({ scheme, path: '/input2' });
|
||||
const resultUri = URI.from({ scheme, path: '/result' });
|
||||
|
||||
function writeFile(uri: URI, content: string): Promise<void> {
|
||||
return provider!.writeFile(uri, VSBuffer.fromString(content).buffer, { create: true, overwrite: true, unlock: true });
|
||||
}
|
||||
|
||||
await Promise.all([
|
||||
writeFile(baseUri, content.base),
|
||||
writeFile(input1Uri, content.input1),
|
||||
writeFile(input2Uri, content.input2),
|
||||
writeFile(resultUri, content.result),
|
||||
]);
|
||||
|
||||
async function setLanguageId(uri: URI, languageId: string): Promise<void> {
|
||||
const ref = await textModelService.createModelReference(uri);
|
||||
ref.object.textEditorModel.setMode(languageId);
|
||||
ref.dispose();
|
||||
}
|
||||
|
||||
await Promise.all([
|
||||
setLanguageId(baseUri, content.languageId),
|
||||
setLanguageId(input1Uri, content.languageId),
|
||||
setLanguageId(input2Uri, content.languageId),
|
||||
setLanguageId(resultUri, content.languageId),
|
||||
]);
|
||||
|
||||
const input = instaService.createInstance(
|
||||
MergeEditorInput,
|
||||
baseUri,
|
||||
{ uri: input1Uri, description: 'Input 1', detail: '(from JSON)' },
|
||||
{ uri: input2Uri, description: 'Input 2', detail: '(from JSON)' },
|
||||
resultUri,
|
||||
);
|
||||
editorService.openEditor(input);
|
||||
}
|
||||
});
|
||||
|
||||
interface MergeEditorContents {
|
||||
languageId: string;
|
||||
base: string;
|
||||
input1: string;
|
||||
input2: string;
|
||||
result: string;
|
||||
}
|
||||
|
|
|
@ -67,6 +67,9 @@ export class MergeEditor extends EditorPane {
|
|||
private readonly _ctxIsMergeEditor: IContextKey<boolean>;
|
||||
private readonly _ctxUsesColumnLayout: IContextKey<boolean>;
|
||||
|
||||
private _model: MergeEditorModel | undefined;
|
||||
public get model(): MergeEditorModel | undefined { return this._model; }
|
||||
|
||||
constructor(
|
||||
@IInstantiationService private readonly instantiation: IInstantiationService,
|
||||
@ILabelService private readonly _labelService: ILabelService,
|
||||
|
@ -216,6 +219,7 @@ export class MergeEditor extends EditorPane {
|
|||
|
||||
this._sessionDisposables.clear();
|
||||
const model = await input.resolve();
|
||||
this._model = model;
|
||||
|
||||
this.input1View.setModel(model, model.input1, localize('yours', 'Yours'), model.input1Detail, model.input1Description);
|
||||
this.input2View.setModel(model, model.input2, localize('theirs', 'Theirs',), model.input2Detail, model.input2Description);
|
||||
|
|
|
@ -50,12 +50,6 @@ import { KeybindingsEditorInput } from 'vs/workbench/services/preferences/browse
|
|||
import { IEditorOptions } from 'vs/platform/editor/common/editor';
|
||||
import { ToolBar } from 'vs/base/browser/ui/toolbar/toolbar';
|
||||
|
||||
type KeybindingEditorActionClassification = {
|
||||
owner: 'sandy081';
|
||||
action: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
|
||||
command: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
|
||||
};
|
||||
|
||||
const $ = DOM.$;
|
||||
|
||||
class ThemableToggleActionViewItem extends ToggleActionViewItem {
|
||||
|
@ -189,7 +183,6 @@ export class KeybindingsEditor extends EditorPane implements IKeybindingsEditorP
|
|||
try {
|
||||
const key = await this.defineKeybindingWidget.define();
|
||||
if (key) {
|
||||
this.reportKeybindingAction(KEYBINDINGS_EDITOR_COMMAND_DEFINE, keybindingEntry.keybindingItem.command);
|
||||
await this.updateKeybinding(keybindingEntry, key, keybindingEntry.keybindingItem.when, add);
|
||||
}
|
||||
} catch (error) {
|
||||
|
@ -224,7 +217,6 @@ export class KeybindingsEditor extends EditorPane implements IKeybindingsEditorP
|
|||
async removeKeybinding(keybindingEntry: IKeybindingItemEntry): Promise<void> {
|
||||
this.selectEntry(keybindingEntry);
|
||||
if (keybindingEntry.keybindingItem.keybinding) { // This should be a pre-condition
|
||||
this.reportKeybindingAction(KEYBINDINGS_EDITOR_COMMAND_REMOVE, keybindingEntry.keybindingItem.command);
|
||||
try {
|
||||
await this.keybindingEditingService.removeKeybinding(keybindingEntry.keybindingItem.keybindingItem);
|
||||
this.focus();
|
||||
|
@ -237,7 +229,6 @@ export class KeybindingsEditor extends EditorPane implements IKeybindingsEditorP
|
|||
|
||||
async resetKeybinding(keybindingEntry: IKeybindingItemEntry): Promise<void> {
|
||||
this.selectEntry(keybindingEntry);
|
||||
this.reportKeybindingAction(KEYBINDINGS_EDITOR_COMMAND_RESET, keybindingEntry.keybindingItem.command);
|
||||
try {
|
||||
await this.keybindingEditingService.resetKeybinding(keybindingEntry.keybindingItem.keybindingItem);
|
||||
if (!keybindingEntry.keybindingItem.keybinding) { // reveal only if keybinding was added to unassinged. Because the entry will be placed in different position after rendering
|
||||
|
@ -252,7 +243,6 @@ export class KeybindingsEditor extends EditorPane implements IKeybindingsEditorP
|
|||
|
||||
async copyKeybinding(keybinding: IKeybindingItemEntry): Promise<void> {
|
||||
this.selectEntry(keybinding);
|
||||
this.reportKeybindingAction(KEYBINDINGS_EDITOR_COMMAND_COPY, keybinding.keybindingItem.command);
|
||||
const userFriendlyKeybinding: IUserFriendlyKeybinding = {
|
||||
key: keybinding.keybindingItem.keybinding ? keybinding.keybindingItem.keybinding.getUserSettingsLabel() || '' : '',
|
||||
command: keybinding.keybindingItem.command
|
||||
|
@ -265,13 +255,11 @@ export class KeybindingsEditor extends EditorPane implements IKeybindingsEditorP
|
|||
|
||||
async copyKeybindingCommand(keybinding: IKeybindingItemEntry): Promise<void> {
|
||||
this.selectEntry(keybinding);
|
||||
this.reportKeybindingAction(KEYBINDINGS_EDITOR_COMMAND_COPY_COMMAND, keybinding.keybindingItem.command);
|
||||
await this.clipboardService.writeText(keybinding.keybindingItem.command);
|
||||
}
|
||||
|
||||
async copyKeybindingCommandTitle(keybinding: IKeybindingItemEntry): Promise<void> {
|
||||
this.selectEntry(keybinding);
|
||||
this.reportKeybindingAction(KEYBINDINGS_EDITOR_COMMAND_COPY_COMMAND_TITLE, keybinding.keybindingItem.command);
|
||||
await this.clipboardService.writeText(keybinding.keybindingItem.commandLabel);
|
||||
}
|
||||
|
||||
|
@ -305,7 +293,7 @@ export class KeybindingsEditor extends EditorPane implements IKeybindingsEditorP
|
|||
private createOverlayContainer(parent: HTMLElement): void {
|
||||
this.overlayContainer = DOM.append(parent, $('.overlay-container'));
|
||||
this.overlayContainer.style.position = 'absolute';
|
||||
this.overlayContainer.style.zIndex = '10';
|
||||
this.overlayContainer.style.zIndex = '40'; // has to greater than sash z-index which is 35
|
||||
this.defineKeybindingWidget = this._register(this.instantiationService.createInstance(DefineKeybindingWidget, this.overlayContainer));
|
||||
this._register(this.defineKeybindingWidget.onDidChange(keybindingStr => this.defineKeybindingWidget.printExisting(this.keybindingsEditorModel!.fetch(`"${keybindingStr}"`).length)));
|
||||
this._register(this.defineKeybindingWidget.onShowExistingKeybidings(keybindingStr => this.searchWidget.setValue(`"${keybindingStr}"`)));
|
||||
|
@ -502,6 +490,10 @@ export class KeybindingsEditor extends EditorPane implements IKeybindingsEditorP
|
|||
this.keybindingFocusContextKey.reset();
|
||||
}));
|
||||
this._register(this.keybindingsTable.onDidOpen((e) => {
|
||||
// stop double click action on the input #148493
|
||||
if (e.browserEvent?.defaultPrevented) {
|
||||
return;
|
||||
}
|
||||
const activeKeybindingEntry = this.activeKeybindingEntry;
|
||||
if (activeKeybindingEntry) {
|
||||
this.defineKeybinding(activeKeybindingEntry, false);
|
||||
|
@ -775,10 +767,6 @@ export class KeybindingsEditor extends EditorPane implements IKeybindingsEditorP
|
|||
};
|
||||
}
|
||||
|
||||
private reportKeybindingAction(action: string, command: string): void {
|
||||
this.telemetryService.publicLog2<{ action: string; command: string }, KeybindingEditorActionClassification>('keybindingsEditor.action', { command, action });
|
||||
}
|
||||
|
||||
private onKeybindingEditingError(error: any): void {
|
||||
this.notificationService.error(typeof error === 'string' ? error : localize('error', "Error '{0}' while editing the keybinding. Please open 'keybindings.json' file and check for errors.", `${error}`));
|
||||
}
|
||||
|
@ -1073,6 +1061,9 @@ class WhenColumnRenderer implements ITableRenderer<IKeybindingItemEntry, IWhenCo
|
|||
_onDidReject.fire();
|
||||
})));
|
||||
|
||||
// stop double click action on the input #148493
|
||||
disposables.add((DOM.addDisposableListener(whenInput.inputElement, DOM.EventType.DBLCLICK, e => DOM.EventHelper.stop(e))));
|
||||
|
||||
const renderDisposables = disposables.add(new DisposableStore());
|
||||
|
||||
return {
|
||||
|
|
|
@ -1121,7 +1121,7 @@ export class SearchModel extends Disposable {
|
|||
|
||||
/* __GDPR__
|
||||
"searchResultsShown" : {
|
||||
owner": "roblourens",
|
||||
"owner": "roblourens",
|
||||
"count" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true },
|
||||
"fileCount": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true },
|
||||
"options": { "${inline}": [ "${IPatternInfo}" ] },
|
||||
|
|
|
@ -33,6 +33,11 @@ if [ -z "$VSCODE_SHELL_INTEGRATION" ]; then
|
|||
builtin return
|
||||
fi
|
||||
|
||||
__vsc_initialized=0
|
||||
__vsc_original_PS1="$PS1"
|
||||
__vsc_original_PS2="$PS2"
|
||||
__vsc_custom_PS1=""
|
||||
__vsc_custom_PS2=""
|
||||
__vsc_in_command_execution="1"
|
||||
__vsc_last_history_id=$(history 1 | awk '{print $1;}')
|
||||
|
||||
|
@ -72,42 +77,50 @@ __vsc_command_complete() {
|
|||
}
|
||||
|
||||
__vsc_update_prompt() {
|
||||
__vsc_prior_prompt="$PS1"
|
||||
__vsc_in_command_execution=""
|
||||
PS1="\[$(__vsc_prompt_start)\]$PREFIX$PS1\[$(__vsc_prompt_end)\]"
|
||||
PS2="\[$(__vsc_continuation_start)\]$PS2\[$(__vsc_continuation_end)\]"
|
||||
# in command execution
|
||||
if [ "$__vsc_in_command_execution" = "1" ]; then
|
||||
# Wrap the prompt if it is not yet wrapped, if the PS1 changed this this was last set it
|
||||
# means the user re-exported the PS1 so we should re-wrap it
|
||||
if [[ "$__vsc_custom_PS1" == "" || "$__vsc_custom_PS1" != "$PS1" ]]; then
|
||||
__vsc_original_PS1=$PS1
|
||||
__vsc_custom_PS1="\[$(__vsc_prompt_start)\]$PREFIX$__vsc_original_PS1\[$(__vsc_prompt_end)\]"
|
||||
PS1="$__vsc_custom_PS1"
|
||||
fi
|
||||
if [[ "$__vsc_custom_PS2" == "" || "$__vsc_custom_PS2" != "$PS2" ]]; then
|
||||
__vsc_original_PS2=$PS2
|
||||
__vsc_custom_PS2="\[$(__vsc_continuation_start)\]$__vsc_original_PS2\[$(__vsc_continuation_end)\]"
|
||||
PS2="$__vsc_custom_PS2"
|
||||
fi
|
||||
__vsc_in_command_execution="0"
|
||||
fi
|
||||
}
|
||||
|
||||
__vsc_precmd() {
|
||||
__vsc_command_complete "$__vsc_status"
|
||||
|
||||
# in command execution
|
||||
if [ -n "$__vsc_in_command_execution" ]; then
|
||||
# non null
|
||||
__vsc_update_prompt
|
||||
fi
|
||||
__vsc_update_prompt
|
||||
}
|
||||
|
||||
__vsc_preexec() {
|
||||
PS1="$__vsc_prior_prompt"
|
||||
if [ -z "${__vsc_in_command_execution-}" ]; then
|
||||
if [ "$__vsc_in_command_execution" = "0" ]; then
|
||||
__vsc_initialized=1
|
||||
__vsc_in_command_execution="1"
|
||||
__vsc_command_output_start
|
||||
fi
|
||||
}
|
||||
|
||||
# Debug trapping/preexec inspired by starship (ISC)
|
||||
dbg_trap="$(trap -p DEBUG | cut -d' ' -f3 | tr -d \')"
|
||||
if [[ -z "$dbg_trap" ]]; then
|
||||
__vsc_dbg_trap="$(trap -p DEBUG | cut -d' ' -f3 | tr -d \')"
|
||||
if [[ -z "$__vsc_dbg_trap" ]]; then
|
||||
__vsc_preexec_only() {
|
||||
__vsc_status="$?"
|
||||
__vsc_preexec
|
||||
}
|
||||
trap '__vsc_preexec_only "$_"' DEBUG
|
||||
elif [[ "$dbg_trap" != '__vsc_preexec "$_"' && "$dbg_trap" != '__vsc_preexec_all "$_"' ]]; then
|
||||
elif [[ "$__vsc_dbg_trap" != '__vsc_preexec "$_"' && "$__vsc_dbg_trap" != '__vsc_preexec_all "$_"' ]]; then
|
||||
__vsc_preexec_all() {
|
||||
__vsc_status="$?"
|
||||
local PREV_LAST_ARG=$1 ; $dbg_trap; __vsc_preexec; : "$PREV_LAST_ARG";
|
||||
builtin eval ${__vsc_dbg_trap}
|
||||
__vsc_preexec
|
||||
}
|
||||
trap '__vsc_preexec_all "$_"' DEBUG
|
||||
fi
|
||||
|
|
|
@ -21,6 +21,7 @@ if [ -z "$VSCODE_SHELL_INTEGRATION" ]; then
|
|||
builtin return
|
||||
fi
|
||||
|
||||
__vsc_initialized="0"
|
||||
__vsc_in_command_execution="1"
|
||||
__vsc_last_history_id=0
|
||||
|
||||
|
@ -58,11 +59,14 @@ __vsc_right_prompt_end() {
|
|||
|
||||
__vsc_command_complete() {
|
||||
builtin local __vsc_history_id=$(builtin history | tail -n1 | awk '{print $1;}')
|
||||
if [[ "$__vsc_history_id" == "$__vsc_last_history_id" ]]; then
|
||||
builtin printf "\033]633;D\007"
|
||||
else
|
||||
builtin printf "\033]633;D;%s\007" "$__vsc_status"
|
||||
__vsc_last_history_id=$__vsc_history_id
|
||||
# Don't write the command complete sequence for the first prompt without an associated command
|
||||
if [[ "$__vsc_initialized" == "1" ]]; then
|
||||
if [[ "$__vsc_history_id" == "$__vsc_last_history_id" ]]; then
|
||||
builtin printf "\033]633;D\007"
|
||||
else
|
||||
builtin printf "\033]633;D;%s\007" "$__vsc_status"
|
||||
__vsc_last_history_id=$__vsc_history_id
|
||||
fi
|
||||
fi
|
||||
__vsc_update_cwd
|
||||
}
|
||||
|
@ -99,6 +103,7 @@ __vsc_preexec() {
|
|||
if [ -n "$RPROMPT" ]; then
|
||||
RPROMPT="$__vsc_prior_rprompt"
|
||||
fi
|
||||
__vsc_initialized="1"
|
||||
__vsc_in_command_execution="1"
|
||||
__vsc_command_output_start
|
||||
}
|
||||
|
|
|
@ -458,8 +458,14 @@
|
|||
outline-style: dotted !important;
|
||||
}
|
||||
|
||||
.hc-black .xterm-find-active-result-decoration,
|
||||
.hc-light .xterm-find-active-result-decoration {
|
||||
.hc-black .xterm-find-result-decoration,
|
||||
.hc-light .xterm-find-result-decoration {
|
||||
outline-style: solid !important;
|
||||
}
|
||||
|
||||
.xterm-find-active-result-decoration {
|
||||
outline-style: solid !important;
|
||||
outline-width: 2px !important;
|
||||
/* Ensure the active decoration is above the regular decoration */
|
||||
z-index: 7 !important;
|
||||
}
|
||||
|
|
|
@ -458,6 +458,11 @@ export interface ITerminalInstance {
|
|||
*/
|
||||
target?: TerminalLocation;
|
||||
|
||||
/**
|
||||
* Whether or not shell integration telemetry / warnings should be reported for this terminal.
|
||||
*/
|
||||
disableShellIntegrationReporting: boolean;
|
||||
|
||||
/**
|
||||
* The id of a persistent process. This is defined if this is a terminal created by a pty host
|
||||
* that supports reconnection.
|
||||
|
|
|
@ -206,6 +206,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
|
|||
private _userHome?: string;
|
||||
private _hasScrollBar?: boolean;
|
||||
private _target?: TerminalLocation | undefined;
|
||||
private _disableShellIntegrationReporting: boolean | undefined;
|
||||
|
||||
readonly capabilities = new TerminalCapabilityStoreMultiplexer();
|
||||
readonly statusList: ITerminalStatusList;
|
||||
|
@ -220,7 +221,12 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
|
|||
}
|
||||
this._target = value;
|
||||
}
|
||||
|
||||
get disableShellIntegrationReporting(): boolean {
|
||||
if (this._disableShellIntegrationReporting === undefined) {
|
||||
this._disableShellIntegrationReporting = this.shellLaunchConfig.isFeatureTerminal || this.shellLaunchConfig.hideFromUser || this.shellLaunchConfig.executable === undefined;
|
||||
}
|
||||
return this._disableShellIntegrationReporting;
|
||||
}
|
||||
get instanceId(): number { return this._instanceId; }
|
||||
get resource(): URI { return this._resource; }
|
||||
get cols(): number {
|
||||
|
@ -658,8 +664,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
|
|||
throw new ErrorNoTelemetry('Terminal disposed of during xterm.js creation');
|
||||
}
|
||||
|
||||
const disableShellIntegrationTelemetry = this.shellLaunchConfig.isFeatureTerminal || this.shellLaunchConfig.hideFromUser || this.shellLaunchConfig.executable === undefined;
|
||||
const xterm = this._instantiationService.createInstance(XtermTerminal, Terminal, this._configHelper, this._cols, this._rows, this.target || TerminalLocation.Panel, this.capabilities, disableShellIntegrationTelemetry);
|
||||
const xterm = this._instantiationService.createInstance(XtermTerminal, Terminal, this._configHelper, this._cols, this._rows, this.target || TerminalLocation.Panel, this.capabilities, this.disableShellIntegrationReporting);
|
||||
this.xterm = xterm;
|
||||
const lineDataEventAddon = new LineDataEventAddon();
|
||||
this.xterm.raw.loadAddon(lineDataEventAddon);
|
||||
|
|
|
@ -10,7 +10,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur
|
|||
import { TerminalSettingId } from 'vs/platform/terminal/common/terminal';
|
||||
|
||||
export function getShellIntegrationTooltip(instance: ITerminalInstance, markdown: boolean, configurationService: IConfigurationService): string {
|
||||
if (!configurationService.getValue(TerminalSettingId.ShellIntegrationEnabled)) {
|
||||
if (!configurationService.getValue(TerminalSettingId.ShellIntegrationEnabled) || instance.disableShellIntegrationReporting) {
|
||||
return '';
|
||||
}
|
||||
const shellIntegrationCapabilities: TerminalCapability[] = [];
|
||||
|
|
|
@ -114,6 +114,10 @@ export class DecorationAddon extends Disposable implements ITerminalAddon {
|
|||
if (this._commandDetectionListeners) {
|
||||
dispose(this._commandDetectionListeners);
|
||||
}
|
||||
this.clearDecorations();
|
||||
}
|
||||
|
||||
public clearDecorations(): void {
|
||||
this._placeholderDecoration?.dispose();
|
||||
this._placeholderDecoration?.marker.dispose();
|
||||
for (const value of this._decorations.values()) {
|
||||
|
|
|
@ -32,7 +32,7 @@ import { Color } from 'vs/base/common/color';
|
|||
import { ShellIntegrationAddon } from 'vs/platform/terminal/common/xterm/shellIntegrationAddon';
|
||||
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||
import { DecorationAddon } from 'vs/workbench/contrib/terminal/browser/xterm/decorationAddon';
|
||||
import { ITerminalCapabilityStore, ITerminalCommand } from 'vs/platform/terminal/common/capabilities/capabilities';
|
||||
import { ITerminalCapabilityStore, ITerminalCommand, TerminalCapability } from 'vs/platform/terminal/common/capabilities/capabilities';
|
||||
import { Emitter } from 'vs/base/common/event';
|
||||
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
||||
|
||||
|
@ -99,7 +99,7 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal {
|
|||
rows: number,
|
||||
location: TerminalLocation,
|
||||
private readonly _capabilities: ITerminalCapabilityStore,
|
||||
disableShellIntegrationTelemetry: boolean,
|
||||
disableShellIntegrationReporting: boolean,
|
||||
@IConfigurationService private readonly _configurationService: IConfigurationService,
|
||||
@IInstantiationService private readonly _instantiationService: IInstantiationService,
|
||||
@ILogService private readonly _logService: ILogService,
|
||||
|
@ -176,7 +176,7 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal {
|
|||
this._updateUnicodeVersion();
|
||||
this._commandNavigationAddon = this._instantiationService.createInstance(CommandNavigationAddon, _capabilities);
|
||||
this.raw.loadAddon(this._commandNavigationAddon);
|
||||
this._shellIntegrationAddon = this._instantiationService.createInstance(ShellIntegrationAddon, disableShellIntegrationTelemetry, this._telemetryService);
|
||||
this._shellIntegrationAddon = this._instantiationService.createInstance(ShellIntegrationAddon, disableShellIntegrationReporting, this._telemetryService);
|
||||
this.raw.loadAddon(this._shellIntegrationAddon);
|
||||
this._updateShellIntegrationAddons();
|
||||
}
|
||||
|
@ -258,8 +258,7 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal {
|
|||
}
|
||||
|
||||
clearDecorations(): void {
|
||||
this._decorationAddon?.dispose();
|
||||
this._decorationAddon = undefined;
|
||||
this._decorationAddon?.clearDecorations();
|
||||
}
|
||||
|
||||
forceRefresh() {
|
||||
|
@ -397,8 +396,10 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal {
|
|||
|
||||
clearBuffer(): void {
|
||||
this.raw.clear();
|
||||
// hack so that the next placeholder shows
|
||||
this._decorationAddon?.registerCommandDecoration({ marker: this.raw.registerMarker(0), hasOutput: false, timestamp: Date.now(), getOutput: () => { return undefined; }, command: '' }, true);
|
||||
// xterm.js does not clear the first prompt, so trigger these to simulate
|
||||
// the prompt being written
|
||||
this._capabilities.get(TerminalCapability.CommandDetection)?.handlePromptStart();
|
||||
this._capabilities.get(TerminalCapability.CommandDetection)?.handleCommandStart();
|
||||
}
|
||||
|
||||
private _setCursorBlink(blink: boolean): void {
|
||||
|
|
|
@ -67,8 +67,9 @@ type ConfigureSyncQuickPickItem = { id: SyncResource; label: string; description
|
|||
|
||||
type SyncConflictsClassification = {
|
||||
owner: 'sandy081';
|
||||
source: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
|
||||
action?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
|
||||
comment: 'Response information when conflict happens during settings sync';
|
||||
source: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'settings sync resource. eg., settings, keybindings...' };
|
||||
action?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'action taken while resolving conflicts. Eg: acceptLocal, acceptRemote' };
|
||||
};
|
||||
|
||||
const turnOnSyncCommand = { id: 'workbench.userDataSync.actions.turnOn', title: localize('turn on sync with category', "{0}: Turn On...", SYNC_TITLE) };
|
||||
|
|
|
@ -67,8 +67,8 @@ export class WebExtensionManagementService extends AbstractExtensionManagementSe
|
|||
return this.installExtension(manifest, location, options);
|
||||
}
|
||||
|
||||
protected override async getCompatibleVersion(extension: IGalleryExtension, fetchCompatibleVersion: boolean, includePreRelease: boolean): Promise<IGalleryExtension | null> {
|
||||
const compatibleExtension = await super.getCompatibleVersion(extension, fetchCompatibleVersion, includePreRelease);
|
||||
protected override async getCompatibleVersion(extension: IGalleryExtension, sameVersion: boolean, includePreRelease: boolean): Promise<IGalleryExtension | null> {
|
||||
const compatibleExtension = await super.getCompatibleVersion(extension, sameVersion, includePreRelease);
|
||||
if (compatibleExtension) {
|
||||
return compatibleExtension;
|
||||
}
|
||||
|
@ -105,7 +105,7 @@ function toLocalExtension(extension: IExtension): ILocalExtension {
|
|||
const metadata = getMetadata(undefined, extension);
|
||||
return {
|
||||
...extension,
|
||||
identifier: { id: extension.identifier.id, uuid: metadata.id },
|
||||
identifier: { id: extension.identifier.id, uuid: metadata.id ?? extension.identifier.uuid },
|
||||
isMachineScoped: !!metadata.isMachineScoped,
|
||||
publisherId: metadata.publisherId || null,
|
||||
publisherDisplayName: metadata.publisherDisplayName || null,
|
||||
|
|
|
@ -38,7 +38,11 @@ export class HoverService implements IHoverService {
|
|||
const hoverDisposables = new DisposableStore();
|
||||
const hover = this._instantiationService.createInstance(HoverWidget, options);
|
||||
hover.onDispose(() => {
|
||||
this._currentHoverOptions = undefined;
|
||||
// Only clear the current options if it's the current hover, the current options help
|
||||
// reduce flickering when the same hover is shown multiple times
|
||||
if (this._currentHoverOptions === options) {
|
||||
this._currentHoverOptions = undefined;
|
||||
}
|
||||
hoverDisposables.dispose();
|
||||
});
|
||||
const provider = this._contextViewService as IContextViewProvider;
|
||||
|
|
|
@ -507,7 +507,7 @@ export class HoverWidget extends Widget {
|
|||
}
|
||||
|
||||
class CompositeMouseTracker extends Widget {
|
||||
private _isMouseIn: boolean = false;
|
||||
private _isMouseIn: boolean = true;
|
||||
private _mouseTimeout: number | undefined;
|
||||
|
||||
private readonly _onMouseOut = this._register(new Emitter<void>());
|
||||
|
|
|
@ -142,8 +142,8 @@ export class LabelService extends Disposable implements ILabelService {
|
|||
this.os = OS;
|
||||
this.userHome = pathService.defaultUriScheme === Schemas.file ? this.pathService.userHome({ preferLocal: true }) : undefined;
|
||||
|
||||
const memento = this.storedFormattersMemento = new Memento('cachedResourceFormatters', storageService);
|
||||
this.storedFormatters = memento.getMemento(StorageScope.GLOBAL, StorageTarget.USER);
|
||||
const memento = this.storedFormattersMemento = new Memento('cachedResourceLabelFormatters', storageService);
|
||||
this.storedFormatters = memento.getMemento(StorageScope.GLOBAL, StorageTarget.MACHINE);
|
||||
this.formatters = this.storedFormatters?.formatters || [];
|
||||
|
||||
// Remote environment is potentially long running
|
||||
|
|
|
@ -166,7 +166,7 @@ suite('URI Label', () => {
|
|||
|
||||
|
||||
test('label caching', () => {
|
||||
const m = new Memento('cachedResourceFormatters', storageService).getMemento(StorageScope.GLOBAL, StorageTarget.MACHINE);
|
||||
const m = new Memento('cachedResourceLabelFormatters', storageService).getMemento(StorageScope.GLOBAL, StorageTarget.MACHINE);
|
||||
const makeFormatter = (scheme: string): ResourceLabelFormatter => ({ formatting: { label: `\${path} (${scheme})`, separator: '/' }, scheme });
|
||||
assert.deepStrictEqual(m, {});
|
||||
|
||||
|
|
|
@ -28,7 +28,6 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
|
|||
import { ILabelService } from 'vs/platform/label/common/label';
|
||||
import { INotificationService } from 'vs/platform/notification/common/notification';
|
||||
import { Registry } from 'vs/platform/registry/common/platform';
|
||||
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
||||
import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace';
|
||||
import { IEditorPane } from 'vs/workbench/common/editor';
|
||||
import { EditorInput } from 'vs/workbench/common/editor/editorInput';
|
||||
|
@ -68,7 +67,6 @@ export class PreferencesService extends Disposable implements IPreferencesServic
|
|||
@IWorkspaceContextService private readonly contextService: IWorkspaceContextService,
|
||||
@IInstantiationService private readonly instantiationService: IInstantiationService,
|
||||
@IEnvironmentService private readonly environmentService: IEnvironmentService,
|
||||
@ITelemetryService private readonly telemetryService: ITelemetryService,
|
||||
@ITextModelService private readonly textModelResolverService: ITextModelService,
|
||||
@IKeybindingService keybindingService: IKeybindingService,
|
||||
@IModelService private readonly modelService: IModelService,
|
||||
|
@ -303,12 +301,6 @@ export class PreferencesService extends Disposable implements IPreferencesServic
|
|||
}
|
||||
|
||||
async openGlobalKeybindingSettings(textual: boolean, options?: IKeybindingsEditorOptions): Promise<void> {
|
||||
type OpenKeybindingsClassification = {
|
||||
owner: 'sandy081';
|
||||
textual: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
|
||||
};
|
||||
this.telemetryService.publicLog2<{ textual: boolean }, OpenKeybindingsClassification>('openKeybindings', { textual });
|
||||
|
||||
options = { pinned: true, revealIfOpened: true, ...options };
|
||||
if (textual) {
|
||||
const emptyContents = '// ' + nls.localize('emptyKeybindingsHeader', "Place your key bindings in this file to override the defaults") + '\n[\n]';
|
||||
|
|
|
@ -36,20 +36,10 @@ import { UserDataSyncStoreTypeSynchronizer } from 'vs/platform/userDataSync/comm
|
|||
import { ICredentialsService } from 'vs/platform/credentials/common/credentials';
|
||||
import { CancellationError } from 'vs/base/common/errors';
|
||||
|
||||
type UserAccountClassification = {
|
||||
owner: 'sandy081';
|
||||
id: { classification: 'EndUserPseudonymizedInformation'; purpose: 'BusinessInsight' };
|
||||
providerId: { classification: 'EndUserPseudonymizedInformation'; purpose: 'BusinessInsight' };
|
||||
};
|
||||
|
||||
type FirstTimeSyncClassification = {
|
||||
owner: 'sandy081';
|
||||
action: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
|
||||
};
|
||||
|
||||
type UserAccountEvent = {
|
||||
id: string;
|
||||
providerId: string;
|
||||
comment: 'Action taken when there are merges while turning on settins sync';
|
||||
action: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'action taken turning on sync. Eg: merge, pull, manual or cancel' };
|
||||
};
|
||||
|
||||
type FirstTimeSyncAction = 'pull' | 'push' | 'merge' | 'manual';
|
||||
|
@ -614,12 +604,11 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat
|
|||
// accounts are switched while sync is enabled.
|
||||
}
|
||||
this.currentSessionId = sessionId;
|
||||
this.telemetryService.publicLog2<UserAccountEvent, UserAccountClassification>('sync.userAccount', { id: accountId, providerId: authenticationProviderId });
|
||||
await this.update();
|
||||
}
|
||||
|
||||
private async onDidSuccessiveAuthFailures(): Promise<void> {
|
||||
this.telemetryService.publicLog2<{}, { owner: 'sandy081' }>('sync/successiveAuthFailures');
|
||||
this.telemetryService.publicLog2<{}, { owner: 'sandy081'; comment: 'Report when there are successive auth failures during settings sync' }>('sync/successiveAuthFailures');
|
||||
this.currentSessionId = undefined;
|
||||
await this.update();
|
||||
|
||||
|
|
24
yarn.lock
24
yarn.lock
|
@ -12213,20 +12213,20 @@ xterm-addon-unicode11@0.4.0-beta.3:
|
|||
resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.4.0-beta.3.tgz#f350184155fafd5ad0d6fbf31d13e6ca7dea1efa"
|
||||
integrity sha512-FryZAVwbUjKTmwXnm1trch/2XO60F5JsDvOkZhzobV1hm10sFLVuZpFyHXiUx7TFeeFsvNP+S77LAtWoeT5z+Q==
|
||||
|
||||
xterm-addon-webgl@0.12.0-beta.36:
|
||||
version "0.12.0-beta.36"
|
||||
resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.36.tgz#460f80829a78c979a448d5b764699af3f0366ff1"
|
||||
integrity sha512-sgX7OHSGZQZE5b4xtPqd/5NEcll0Z+00tnTVxKZlXf5XEENcG0tnBF4I4f+k9K3cmjE1UIUVG2yYPrqWlYCdpA==
|
||||
xterm-addon-webgl@0.12.0-beta.37:
|
||||
version "0.12.0-beta.37"
|
||||
resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.37.tgz#e465100041a7e0b1d32b01cd0b0ba5a516ac13c2"
|
||||
integrity sha512-d4GfKlMrWZGzsMfMHd2siG+QiOvwikhwiu+JQlIhlnAShT/wU5BOGbNfDDA1tHmkW7G1UCFgucBuVxrs5wjuBQ==
|
||||
|
||||
xterm-headless@4.19.0-beta.56:
|
||||
version "4.19.0-beta.56"
|
||||
resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-4.19.0-beta.56.tgz#7e6bdc8d647916bf5de64a73eee6bd508d25e344"
|
||||
integrity sha512-EZoR/HqZoernhFngFQp7gUPy+G0TpEJkbJ9HVZcINC3m8wuV1wZKfZ4xBhsRPfhSJ7rsPnqbC+qez5ZjxwYEIw==
|
||||
xterm-headless@4.19.0-beta.58:
|
||||
version "4.19.0-beta.58"
|
||||
resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-4.19.0-beta.58.tgz#3a38cf3b9cd2606fb342a5cf8f2a0cfb963a62e8"
|
||||
integrity sha512-wKQW8VzkFjyYDvcaM26gulo+YghyocfkZnKMH7gc/+/mFn3YXUPBPuOcX6e0M7NibyMlewpQpZjHQUPLBjkzfw==
|
||||
|
||||
xterm@4.19.0-beta.56:
|
||||
version "4.19.0-beta.56"
|
||||
resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.56.tgz#a3f1021b43ac04aa0c3f7b06f1b44ad34d487879"
|
||||
integrity sha512-kywKIK61oPjbloZI+jXY1zgjQm/ghOsFFMjb79IIMaWocUDDqdpo9MmGwziTVZYu4w/Air2Zfas9UWBu4/KEyA==
|
||||
xterm@4.19.0-beta.58:
|
||||
version "4.19.0-beta.58"
|
||||
resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.58.tgz#cbe535b0b85bc7f8ae3cc242df006bea04cdf541"
|
||||
integrity sha512-fr3QC2qS2NBab8X7kwA/3QZELzQqhAKsngvK8NkhsrFN1DAuyEETkzqXuKbO7OKpCB6VqGDN6GPkNlUB9VrIDA==
|
||||
|
||||
y18n@^3.2.1:
|
||||
version "3.2.2"
|
||||
|
|
Loading…
Reference in a new issue